diff --git a/.gitignore b/.gitignore
index 52260df..699c68b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -43,3 +43,7 @@
 
 # merge tooling
 *.orig
+
+# test generated content
+*/src/test/*/WEB-INF/lib/test*.jar
+
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..84534fe
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,55 @@
+Contributing to Jetty
+=====================
+Thanks for your interest in this project.
+
+Project description
+--------------------
+Jetty is a lightweight highly scalable java based web server and servlet engine.
+Our goal is to support web protocols like HTTP, HTTP/2, and WebSocket in a high
+volume low latency way that provides maximum performance while retaining the ease
+of use and compatibility with years of servlet development.
+Jetty is a modern fully async web server that has a long history as a component
+oriented technology easily embedded into applications while still offering a solid
+traditional distribution for webapp deployment.
+
+- [https://projects.eclipse.org/projects/rt.jetty](https://projects.eclipse.org/projects/rt.jetty)
+
+Developer resources
+--------------------
+Information regarding source code management, builds, coding standards, and more.
+
+- [https://www.eclipse.org/jetty/documentation/current/advanced-contributing.html](https://www.eclipse.org/jetty/documentation/current/advanced-contributing.html)
+
+The canonical Jetty git repository is located at git.eclipse.org and we are unable
+to directly merge pull requests into the GitHub mirrored repository.
+Providing you have completed the contributors agreement mentioned below we will
+endeavor to pull your commit into Jetty proper.
+
+Contributor License Agreement
+------------------------------
+Before your contribution can be accepted by the project, you need to create and electronically sign the
+Eclipse Foundation [Contributor License Agreement](https://www.eclipse.org/legal/CLA.php) (CLA):
+
+1. Log in to the [Eclipse projects forge](https://projects.eclipse.org/user/login/sso). You will need to
+   create an account with the Eclipse Foundation if you have not already done so.
+2. Click on "Contributor License Agreement", and complete the form.
+
+Be sure to use the same email address in your Eclipse account that you intend to use when you commit to Git.
+
+Contact
+--------
+Contact the project developers via the project's "dev" list.
+
+- [https://dev.eclipse.org/mailman/listinfo/jetty-dev](https://dev.eclipse.org/mailman/listinfo/jetty-dev)
+
+Search for bugs
+----------------
+This project uses Bugzilla to track ongoing development and issues.
+
+- [https://bugs.eclipse.org/bugs/buglist.cgi?product=Jetty](https://bugs.eclipse.org/bugs/buglist.cgi?product=Jetty)
+
+Create a new bug
+-----------------
+Be sure to search for existing bugs before you create another one. Remember that contributions are always welcome!
+
+- [https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Jetty](https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Jetty)
diff --git a/NOTICE.txt b/NOTICE.txt
index 454c3d4..2374687 100644
--- a/NOTICE.txt
+++ b/NOTICE.txt
@@ -18,20 +18,54 @@
 
 Jetty may be distributed under either license.
 
+------
+Eclipse
+
+The following artifacts are EPL.
+ * org.eclipse.jetty.orbit:org.eclipse.jdt.core
+
+The following artifacts are EPL and ASL2.
+ * org.eclipse.jetty.orbit:javax.security.auth.message
+
+
+The following artifacts are EPL and CDDL 1.0.
+ * org.eclipse.jetty.orbit:javax.mail.glassfish
+
 
 ------
 Oracle
 
 The following artifacts are CDDL + GPLv2 with classpath exception.
-
 https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html
 
-javax.servlet:javax.servlet-api
-javax.servlet.jsp:javax.servlet.jsp-api
-org.glassfish.web:javax.servlet.jsp
-org.glassfish.web:javax.servlet.jsp
-org.glassfish.web:javax.servlet.jsp.jstl
-org.eclipse.jetty.orbit.javax.servlet.jsp.jstl
+ * javax.servlet:javax.servlet-api
+ * javax.annotation:javax.annotation-api
+ * javax.transaction:javax.transaction-api
+ * javax.websocket:javax.websocket-api
+
+------
+Oracle OpenJDK
+
+If ALPN is used to negotiate HTTP/2 connections, then the following
+artifacts may be included in the distribution or downloaded when ALPN 
+module is selected. 
+
+ * java.sun.security.ssl
+
+These artifacts replace/modify OpenJDK classes.  The modififications
+are hosted at github and both modified and original are under GPL v2 with 
+classpath exceptions.
+http://openjdk.java.net/legal/gplv2+ce.html
+
+
+------
+OW2
+
+The following artifacts are licensed by the OW2 Foundation according to the
+terms of http://asm.ow2.org/license.html
+
+org.ow2.asm:asm-commons
+org.ow2.asm:asm
 
 
 ------
diff --git a/README.TXT b/README.TXT
index 9157b3e..f54c476 100644
--- a/README.TXT
+++ b/README.TXT
@@ -1,4 +1,4 @@
-This is a source checkout of the Jetty webserver.
+This is a source checkout of the Eclipse Jetty webserver.
 
 To build, use:
 
@@ -18,4 +18,3 @@
 Bypass tests by building with -Dmaven.test.skip=true but note
 that this will not produce some test jars that are leveraged
 in other places in the build.
-
diff --git a/README.md b/README.md
index 2e9bf5c..9b53ea8 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 ============
 
 Jetty is a lightweight highly scalable java based web server and servlet engine.
-Our goal is to support web protocols like HTTP, SPDY and WebSocket in a high
+Our goal is to support web protocols like HTTP, HTTP/2 and WebSocket in a high
 volume low latency way that provides maximum performance while retaining the ease
 of use and compatibility with years of servlet development. Jetty is a modern
 fully async web server that has a long history as a component oriented technology
diff --git a/VERSION.txt b/VERSION.txt
index bb7e494..eea9c93 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -1,4 +1,113 @@
-jetty-9.2.14-SNAPSHOT
+jetty-9.3.6-SNAPSHOT
+
+jetty-9.3.5.v20151012 - 12 October 2015
+ + 479343 calls to MetaData#orderFragments() with relative ordering adds
+   duplicate jars
+ + 479537 Server preface sent after client preface reply.
+ + 479584 WS Session does not contain UpgradeRequest information in
+   WebSocketAdapter.onWebSocketConnect callback
+
+jetty-9.3.4.v20151007 - 07 October 2015
+ + 428474 Expose batch mode in the Jetty WebSocket API
+ + 472082 isOpen returns true on CLOSING Connection
+ + 474936 WebSocketSessions are not always cleaned out from openSessions
+ + 475209 WebSocketServerFactory should not hand null object to
+   DecoratedObjectFactory
+ + 476023 Incorrect trimming of WebSocket close reason
+ + 476049 When using WebSocket Session.close() there should be no status code
+   or reason sent
+ + 476170 Support servers that close connections without sending Connection:
+   close header.
+ + 476720 getTrustStoreResource fixed
+ + 477087 Enforce that the preface contains a SETTINGS frame.
+ + 477123 AsyncListener callbacks need context scope
+ + 477270 Add ability to send a single PRIORITY frame.
+ + 477278 Refactored DefaultServlet for cached Gzip & Etags
+ + 477385 Make jetty osgi manifests only resolve jetty packages against a
+   single distro version
+ + 477641 ALPN classes exposed to webapps - fixed typo
+ + 477680 Encode merged query parameters
+ + 477737 Improve handling of etags with dynamic and static gzip
+ + 477757 Null args in TypeUtil .call & .construct result in confusing
+   exceptions
+ + 477817 Fixed memory leak in QueuedThreadPool
+ + 477878 HttpClient over HTTP/2 doesn't close upload stream.
+ + 477885 Jetty HTTP2 client fails to connect with Netty server - HTTP2 client
+   preface missing or corrupt.
+ + 477890 Overwhelmed HTTP/2 server discards data.
+ + 477895 Prevent leak of handles to deleted files after redeploy
+ + 477900 Increase client authentication default max content size
+ + 478008 Do not reset current value of CounterStatistics
+ + 478021 Client sending Connection: close does not shutdown output.
+ + 478105 prependFilterMapping check for null FilterHolder
+ + 478239 Remove pointless synchronize in infinispan scavenging
+ + 478247 WebappClassLoader pinned after redeploy
+ + 478275 Priority information in HEADERS frame is not sent.
+ + 478280 property file in temp directory
+ + 478372 JavaUtilLog setSourceClass and setSourceMethod
+ + 478434 Priority weights should be between 1 and 256 inclusive.
+ + 478752 Clarify support for HttpServletRequest.upgrade()
+ + 478757 DebugHandler thread name is mangled
+ + 478829 WebsocketSession not cleaned up / memory leak
+ + 478862 Update to jstl 1.2.5
+ + 478923 threads stuck at SharedBlockingCallback$Blocker.block
+ + 479026 Wrong CONNECT request idle timeout.
+ + 479277 HttpClient with HTTP/2 transport does not work for "https" URLs.
+
+jetty-9.3.3.v20150827 - 27 August 2015
+ + 470311 Introduce a proxy-protocol module.
+ + 471055 Restore legacy/experimental WebSocket extensions (deflate-frame)
+ + 472411 PathResource.checkAliasPath() typo
+ + 473321 Overriding SSL context KeyStoreType requires explicit override of
+   TrustStoreType
+ + 474025 SslContextFactory does not work with JCEKS Keystore
+ + 474068 Update WebSocket Extension for permessage-deflate draft-22
+ + 474319 Reintroduce blocking connect().
+ + 474321 Allow synchronous address resolution.
+ + 474344 apache-jstl includes test dependencies
+ + 474358 DefaultServlet bad Content-Type on compressed content
+ + 474361 Handle JVM version extensions like -internal
+ + 474453 Tiny buffers (under 7 bytes) fail to compress in permessage-deflate
+ + 474454 Backport permessage-deflate from Jetty 9.3.x to 9.2.x
+ + 474455 Enable permessage-deflate WebSocket extension
+ + 474558 Debug log ServletContainerInitializer @HandlesTypes contents
+ + 474617 AsyncListener.onError not called for errors
+ + 474618 AsyncListener.onComplete not called when error occurs
+ + 474634 AsyncListener.onError() handling.
+ + 474685 GzipHandler configuration supports csv paths and mimetypes.
+ + 474888 HttpClient JMX support.
+ + 474936 WebSocketSessions are not always cleaned out from openSessions
+ + 474961 Close input stream for classes in AnnotationParser after scanning
+ + 475195 SNI matching fails when keystore does not contain wild certificates.
+ + 475483 Starting Jetty with [exec] should use properties file.
+ + 475546 ClosedChannelException when connecting to HTTPS over HTTP proxy with
+   CONNECT.
+ + 475605 Add support for multi-homed destinations.
+ + 475927 SecureRequestCustomizer fails to match host.
+
+jetty-9.3.2.v20150730 - 30 July 2015
+ + 470351 Fixed SNI matching of wildcard certificates
+ + 470727 Thread Starvation of selector wakeups.
+ + 472601 org.eclipse.jetty.util.log.Log.setLog() does not work as before
+ + 472621 Unjustified timeout when serving static content
+ + 472781 GzipHandler isMimeTypeGzipable() bad logic
+ + 472859 ConcatServlet may expose protected resources.
+ + 472931 HttpConfiguration copy constructor incomplete
+ + 472974 Improved StatisticsHandler 503 generation
+ + 473006 Encode addPath in URLResource
+ + 473118 HTTP/2 server does not retrieve Host header from client.
+ + 473243 Delay resource close for async default content
+ + 473266 Better handling of MultiException
+ + 473294 Fixed include cipher suites support for wildcards
+ + 473307 Add 301 Moved Permanently Rules to jetty-rewrite
+ + 473309 Add special (non-replacement) Terminating rules to jetty-rewrite
+ + 473319 Parameterize status code on Redirect Rules for alternate use
+ + 473321 Overriding SSL context KeyStoreType requires explicit override of
+   TrustStoreType
+ + 473322 GatherWrite limit handling
+ + 473624 ProxyServlet.Transparent / TransparentDelegate add trailing slash
+   before query when using prefix.
+ + 473832 SslConnection flips back buffers on handshake exception
 
 jetty-9.2.13.v20150730 - 30 July 2015
  + 472859 ConcatServlet may expose protected resources.
@@ -10,6 +119,225 @@
    before query when using prefix.
  + 473832 SslConnection flips back buffers on handshake exception
 
+jetty-9.3.1.v20150714 - 14 July 2015
+ + 441020 Support HEADERS followed by CONTINUATION+.
+ + 460671 Rationalize property names (fix for jetty.sh)
+ + 462346 Change classesPattern to scanClassesPattern and testClassesPattern to
+   scanTestClassesPattern to clarify purpose
+ + 464294 AsyncNCSARequestLog blocks JVM exit after failure
+ + 464741 HttpFields declares IllegalArgumentException as checked exception
+ + 464745 Remove @org.apache.xbean.XBean references
+ + 469384 Improved javadoc for ClasspathPattern
+ + 470184 Send the proxy-to-server request more lazily.
+ + 470327 Problem with scope provided dependencies with jspc plugin
+ + 470505 jetty-maven-plugin JettyWebAppContext#setQuickStartWebDescriptor
+   should accept a Maven-friendly type
+ + 470664 Handle multiple RequestLogHandler in chain
+ + 470727 Thread Starvation of selector wakeups.
+ + 470803 If a webapp is not fully started do not fully stop it
+ + 470855 Only log warning for duplicate path mappings to same servlet in same
+   descriptor
+ + 470963 Update jetty-maven-plugin mojo annotations for maven 3
+ + 471071 jetty-infinispan.xml incorrect syntax for remote named cache
+ + 471076 Apache jspc ignores empty list of files to precompile and scans
+   anyway
+ + 471251 Improved debugging on async timeout
+ + 471272 ArrayIndexOutOfBoundsException in
+   org.eclipse.jetty.quickstart.PreconfigureQuickStartWar
+ + 471388 StringIndexOutOfBoundsException when using <c:url> with parameters
+ + 471464 Parsing issues with HttpURI
+ + 471604 Extend CrossOriginFilter to provide a Timing-Allow-Origin header
+ + 471623 Update to apache jsp 8.0.23 Use 8.0.23.M1 for jetty version of apache
+   jsp 8.0.23
+ + 471985 NPE in HttpFields.putField
+ + 472310 Improved logging when no supported included ciphers
+ + 472411 PathResource.checkAliasPath typo
+ + 472422 Custom status codes result in a NumberFormatException while using
+   http2.
+
+jetty-9.3.0.v20150612 - 12 June 2015
+ + 414479 Add WebSocketPingPongListener for those that want PING/PONG payload
+   data
+ + 420678 Add WebSocketPartialListener to support receiving partial WebSocket
+   TEXT/BINARY messages
+ + 420944 Hot Deployment of WAR when Context XML exists doesn't trigger
+   redeploy
+ + 423974 Optimize flow control.
+ + 424368 Add CONTRIBUTING.md
+ + 430951 Support SNI with ExtendedSslContextFactory
+ + 436345 Refactor AbstractSession to minimize burden on subclasses to
+   implement behaviour
+ + 437303 Serving of static filenames with "unwise" characters causes 404 error
+ + 437395 Start / Properties in template sections should be default applied for
+   enabled modules
+ + 438204 getServerName returns IPv6 addresses wrapped in []
+ + 439369 Remove unused class CrossContextPsuedoSession
+ + 439374 Use utf-8 as default charset for html
+ + 439375 preferred rfc7231 format is mime;charset=lowercase-9
+ + 440106 Improve ProtocolHandler APIs.
+ + 440506 Jetty OSGi boot bundle does not support OSGi framework Eclipse
+   Concierge
+ + 442083 Client resets stream, pending server data is failed, connection
+   closed.
+ + 442086 Review HttpOutput blocking writes.
+ + 442477 Allow Symlink aliases by default
+ + 442495 Bad Context ClassLoader in JSR356 WebSocket onOpen
+ + 442950 Embedded Jetty client requests to localhost hangs with high cpu usage
+   (NIO OP_CONNECT Solaris/Sparc).
+ + 443652 Remove dependency on java.lang.management classes
+ + 443661 Rename manifest and service constants for jetty osgi resource
+   fragment code
+ + 443662 Consume buffer in write(ByteBuffer)
+ + 443713 Reduce number of SelectionKey.setInterestOps() calls.
+ + 443893 Make a module for weld
+ + 444124 JSP include with <servlet><jsp-file> can cause infinite recursion
+ + 444214 Socks4Proxy fails when reading less than 8 bytes.
+ + 444222 replace CRLF in header values with whitespace rather than ?
+ + 444416 AsyncProxyServlet recursion.
+ + 444485 Client resets stream, pending server data is failed, write hangs.
+ + 444517 Ensure WebSocketUpgradeFilter is always first in filter chain
+ + 444547 Format exception in ResourceCache.Content.toString()
+ + 444617 Expose local and remote socket address to applications
+ + 444721 PushCacheFilter cleanup/improvements.
+ + 444748 WebSocketClient.stop() does not unregister from ShutdownThread
+ + 444764 HttpClient notifies callbacks for last chunk of content twice.
+ + 444771 JSR356 / EndPointConfig.userProperties are not unique per endpoint
+   upgrade
+ + 445167 Allow configuration of dispatch after select.
+ + 445823 Moved RequestLog calling to HttpChannel
+ + 446559 Avoid spin consuming extra data
+ + 446564 Refactored RequestLog Mechanism
+ + 446944 ServletTester and HttpTester should be in
+   <classifier>tests</classifier>
+ + 447216 putAll Properties in XmlConfiguration
+ + 447515 Remove GzipFilter
+ + 448156 Fixed INACTIVE race in IteratingCallback
+ + 448675 Impossible to set own Threadpool when using jetty-maven-plugin
+ + 449003 WARNING: Cannot enable requested module [protonego-impl]: not a valid
+   module name
+ + 449811 handle unquoted etags when gzipping
+ + 450467 Integer overflow in Session expiry calculation in MongoSessionManager
+ + 451973 Ambiguous module init location when mixing --add-to-start &
+   --add-to-startd in the same exec
+ + 451974 Combine multiple start license acknowledgement into one
+ + 452188 Delay dispatch until content optimisation
+ + 452322 Restore progress messages for --add-to-start(d) use
+ + 452323 Start --list-config makes no hint on transitive enabled modules
+ + 452329 Transitive modules in start.jar --add-to-start(d) are not added if
+   enabled already in tree
+ + 452465 100% CPU spin on page reload.
+ + 452503 Start.jar --add-to-start=jstl results in GraphException: Unable to
+   expand property in name: jsp-impl/${jsp-impl}-jstl
+ + 453487 Recycle HttpChannelOverHTTP2
+ + 453627 Fixed FileSystem test for nanosecond filesystems
+ + 453636 Improved spin detection on test
+ + 453829 Added HeaderRegexRule
+ + 453834 CDI Support for WebSocket
+ + 454152 Remove mux remnants from WebSocketClient
+ + 454934 WebSocketClient / connectToServer can block indefinitely during
+   upgrade failure
+ + 454952 Allow Jetty to run in Java 8 compact 3 profile
+ + 456209 Bad ContextClassLoader in WebSocket onMessage
+ + 456956 Reduce ThreadLocal.remove() weak reference garbage
+ + 457130 HTTPS request with IP host and HTTP proxy throws
+   IllegalArgumentException.
+ + 457309 Add test to ensure GET and HEAD response headers same for gzip
+ + 457508 Add flag to scan exploded jars in jetty-jspc-maven-plugin
+ + 457788 Powered By in o.e.j.util.Jetty conditional on sendServerVersion
+ + 458478 JarFileResource improve performance of exist method
+ + 458527 Implement an async proxy servlet that can perform content
+   transformations.
+ + 458663 Handle null header values
+ + 459081 http2 push failures.
+ + 459542 AsyncMiddleManServlet race condition on first download content.
+ + 459655 Remove SPDY and NPN
+ + 459681 Remove dead code after removal of glassfish jasper support
+ + 459731 Update for drafts hpack-11 and http2-17
+ + 459734 Update to apache jsp 8.0.20
+ + 459845 Support upgrade from http1 to http2.
+ + 460187 infinite recursion in sending error.
+ + 460210 ExecutionStragegy producer for SelectManager calls onOpen from
+   produce method
+ + 460211 Fixed Idle race in ExecuteProduceRun
+ + 460297 Parameterize infinispan.mod
+ + 460670 Support multiple names in <Property> elements.
+ + 460671 Rationalize property names.
+ + 460746 HttpConfiguration#setPersistentConnectionsEnabled(boolean)
+ + 461052 Local streams created after INITIAL_WINDOW_SIZE setting have wrong
+   send window.
+ + 461350 Update HttpParser IllegalCharacter handling to RFC7230
+ + 461415 Maven Jetty Plugin ignores ZIP overlays
+ + 462040 reverted and deprecated getStringField methods
+ + 462098 Support setting ThreadGroup in ScheduledExecutorScheduler
+ + 462162 StackOverflowException when response commit fails.
+ + 462193 Asynchronous HttpOutput.close()
+ + 463036 system properties to set ssl password and keypasword
+ + 463144 modules do not see pre-downloaded ALPN libs
+ + 464419 Removed xinetd support
+ + 464438 ClassFileTransformer support in
+   org.eclipse.jetty.webapp.WebAppClassLoader broken
+ + 464442 Enable parallel class loading
+ + 464528 NPE protection in getIncludedCipher suites
+ + 464537 Updated setuid dependency to 1.0.3.
+ + 464555 ALPN module download attempts to download jar before dir exists
+ + 464556 Restrict start module downloads to ${jetty.base} paths only
+ + 464564 NoSql sessions created inside a forward not persisted correctly
+ + 464606 Support property expansion in "default" attribute of Property.
+ + 464629 JDK8 Socket customization
+ + 464630 Cannot configure Configuration classlist in osgi
+ + 464633 Change Selection.how to Selection.criteria
+ + 464706 HTTP/2 and async I/O: onDataAvailable() not called.
+ + 464708 Support HttpConfiguration.delayDispatchUntilContent in HTTP/2.
+ + 464724 MultiPartInputStreamParser.parse ServletException never thrown
+ + 464727 Update Javadoc for Java 8 DocLint
+ + 464744 PathMap.match() never throws IllegalArgumentException
+ + 464837 Large META-INF/resources/ jars can significantly impact startup speed
+ + 464839 Add limit to MongoSessionIdManager purge queries
+ + 464869 org.eclipse.jetty.util.resource.PathResource do not work
+ + 465118 Fixed GzipHandler handling of multiple closes
+ + 465606 IteratingCallback.close() does not fail pending callback.
+ + 465754 Unchecked PrintWriter errors
+ + 465854 Provide java.nio.file.WatchService alternative for Scanner
+ + 465857 Support HTTP/2 clear-text server-side upgrade.
+ + 465867 Implement --skip-file-validation=<module>
+ + 466005 Use Files.move(src,trgt) instead of File.rename for
+   Part.write(filename)
+ + 466283 Support specifying ALPN protocols in HTTP2Client.
+ + 466618 Partial WebSocket Text delivery does not like incomplete UTF8
+   sequences
+ + 466619 Add WebSocketFrameListener for receiving WebSocket Frame information
+ + 466628 Improve IllegalStateException on ServletInputStream.setReadListener()
+ + 466645 Allow XmlConfiguration Properties to use Elements or Attributes
+ + 466647 Add ${jetty.tag.version} property and expand URL properties
+ + 466648 jetty-ssl download of keystore should be from tags, not master
+ + 466669 Add nosql.mod into jetty distro
+ + 466678 Make a .mod file for jdbc session management
+ + 466774 Update jetty-all module for Jetty 9.3
+ + 467036 WebSocketClient fails to process immediate frames from server
+ + 467043 WebSocketClient close codes on protocol violation reported as policy
+   violation
+ + 467055 Mongodb session scavenging can result in very slow query
+ + 467165 Add --skip-file-validation to start.jar --help output
+ + 467281 Remove Java 1.7 support from Jetty 9.3
+ + 467289 Not possible to specify jmxrmi port value
+ + 467702 SslContextFactory not backward compatible
+ + 467730 HTTP2 requires enabled ciphers to be sorted by blacklist
+ + 467790 Update default etc files inside jetty-osgi-boot bundle
+ + 468313 PushCacheFilter wrongly associates primary resources to themselves.
+ + 468347 Fix modules/debuglog.mod.
+ + 469241 Use null WatchService as loop terminator for PathWatcher.
+ + 469341 Not possible to use old/deprecated start properties
+ + 469414 Proxied redirects expose upstream server name.
+ + 469633 Make SpinLock behavior pluggable.
+ + 469799 Transitive module dependencies without ini templates are still added
+   to ini
+ + 469860 Add module metadata versioning to support backwards compat
+ + 469863 fixed setNeedClientAuth/setWantClientAuth
+ + 469936 Remove usages of SpinLock.
+ + 469982 Produce warning for dynamic modules with ini-templates seen during
+   --add-to-start
+ + 469991 Fix logging levels in websocket client UpgradeConnection
+
 jetty-9.2.12.v20150709 - 09 July 2015
  + 469414 Proxied redirects expose upstream server name.
  + 469936 Remove usages of SpinLock.
@@ -45,6 +373,118 @@
  + 468714 SelectorManager updateKey race without submit
  + 468747 XSS vulnerability in HttpSpiContextHandler
 
+jetty-9.3.0.RC1 - 22 May 2015
+ + 464839 Add limit to MongoSessionIdManager purge queries
+ + 465053 Prevent gzip buffer overflow on complete
+ + 466774 Update jetty-all module for Jetty 9.3
+ + 467055 Mongodb session scavenging can result in very slow query
+ + 467165 Add --skip-file-validation to start.jar --help output
+ + 467276 NPE protection in SslContextFactory
+ + 467281 Remove Java 1.7 support from Jetty 9.3
+ + 467289 Not possible to specify jmxrmi port value
+ + 467603 Response 401 from server hangs client.
+ + 467702 SslContextFactory not backward compatible
+ + 467730 HTTP2 requires enabled ciphers to be sorted by blacklist
+ + 467790 Update default etc files inside jetty-osgi-boot bundle
+ + 467936 w Check HttpOutput aggregateSize is < bufferSize
+
+jetty-9.3.0.RC0 - 12 May 2015
+ + 414479 Add WebSocketPingPongListener for those that want PING/PONG payload
+   data
+ + 420678 Add WebSocketPartialListener to support receiving partial WebSocket
+   TEXT/BINARY messages
+ + 423974 Optimize flow control.
+ + 430951 Support SNI with ExtendedSslContextFactory
+ + 436345 Refactor AbstractSession to minimize burden on subclasses to
+   implement behaviour
+ + 440106 Improve ProtocolHandler APIs.
+ + 444721 PushCacheFilter cleanup/improvements.
+ + 446564 Refactored RequestLog Mechanism
+ + 451973 Ambiguous module init location when mixing --add-to-start &
+   --add-to-startd in the same exec
+ + 453834 CDI Support for WebSocket
+ + 454934 WebSocketClient / connectToServer can block indefinitely during
+   upgrade failure
+ + 457309 Add test to ensure GET and HEAD response headers same for gzip
+ + 457508 Add flag to scan exploded jars in jetty-jspc-maven-plugin
+ + 457788 Powered By in o.e.j.util.Jetty conditional on sendServerVersion
+ + 458478 JarFileResource improve performance of exist method
+ + 459273 Redundant license notices
+ + 459734 Update to apache jsp 8.0.20
+ + 459845 Support upgrade from http1 to http2.
+ + 460187 infinite recursion in sending error.
+ + 460297 Parameterize infinispan.mod
+ + 460671 Rationalize property names.
+ + 460746 HttpConfiguration#setPersistentConnectionsEnabled(boolean)
+ + 461415 Maven Jetty Plugin ignores ZIP overlays
+ + 461499 ConnectionPool may leak connections.
+ + 461919 Use osgi-friendly serviceloader mechanism for WebSocketServletFactory
+ + 461941 JMX Remote host:port set from start properties
+ + 462040 reverted and deprecated getStringField methods
+ + 462098 Support setting ThreadGroup in ScheduledExecutorScheduler
+ + 462162 StackOverflowException when response commit fails.
+ + 462193 Asynchronous HttpOutput.close()
+ + 462546 ShutdownMonitor should bind to jetty.host
+ + 462616 Race between finishing a connect and timing it out.
+ + 463036 system properties to set ssl password and keypasword
+ + 463144 modules do not see pre-downloaded ALPN libs
+ + 463579 Add support for 308 status code.
+ + 464292 Implement stream-based transformer for AsyncMiddleManServlet.
+ + 464419 Removed xinetd support
+ + 464438 ClassFileTransformer support in
+   org.eclipse.jetty.webapp.WebAppClassLoader broken
+ + 464442 Enable parallel class loading
+ + 464528 NPE protection in getIncludedCipher suites
+ + 464537 Updated setuid dependency to 1.0.3.
+ + 464555 ALPN module download attempts to download jar before dir exists
+ + 464556 Restrict start module downloads to ${jetty.base} paths only
+ + 464564 NoSql sessions created inside a forward not persisted correctly
+ + 464606 Support property expansion in "default" attribute of Property.
+ + 464629 JDK8 Socket customization
+ + 464630 Cannot configure Configuration classlist in osgi
+ + 464633 Change Selection.how to Selection.criteria
+ + 464706 HTTP/2 and async I/O: onDataAvailable() not called.
+ + 464708 Support HttpConfiguration.delayDispatchUntilContent in HTTP/2.
+ + 464724 MultiPartInputStreamParser.parse ServletException never thrown
+ + 464727 Update Javadoc for Java 8 DocLint
+ + 464740 DosFilter whiteList check improvement
+ + 464744 PathMap.match() never throws IllegalArgumentException
+ + 464837 Large META-INF/resources/ jars can significantly impact startup speed
+ + 464869 org.eclipse.jetty.util.resource.PathResource do not work
+ + 464989 AbstractSessionManager.removeEventListener() should remove
+   HttpSessionIdListener
+ + 465181 HttpParser parse full end chunk.
+ + 465202 Forked Mojo does not extract war overlays/dependencies
+ + 465359 Resource.newResource(String res, boolean useCache) does not use
+   useCache argument
+ + 465360 URLResource.addPath should use _useCaches setting to create new
+   Resource
+ + 465606 IteratingCallback.close() does not fail pending callback.
+ + 465700 NullPointerException in ResourceHandler with welcome files
+ + 465734 DosFilter whitelist bit pattern fix
+ + 465747 Jetty is failing to process all HTTP OPTIONS requests.
+ + 465754 Unchecked PrintWriter errors
+ + 465854 Provide java.nio.file.WatchService alternative for Scanner
+ + 465857 Support HTTP/2 clear-text server-side upgrade.
+ + 465867 Implement --skip-file-validation=<module>
+ + 466005 Use Files.move(src,trgt) instead of File.rename for
+   Part.write(filename)
+ + 466283 Support specifying ALPN protocols in HTTP2Client.
+ + 466329 Fixed local only TestFilter
+ + 466618 Partial WebSocket Text delivery does not like incomplete UTF8
+   sequences
+ + 466619 Add WebSocketFrameListener for receiving WebSocket Frame information
+ + 466628 Improve IllegalStateException on ServletInputStream.setReadListener()
+ + 466645 Allow XmlConfiguration Properties to use Elements or Attributes
+ + 466647 Add ${jetty.tag.version} property and expand URL properties
+ + 466648 jetty-ssl download of keystore should be from tags, not master
+ + 466669 Add nosql.mod into jetty distro
+ + 466678 Make a .mod file for jdbc session management
+ + 466774 Update jetty-all module for Jetty 9.3
+ + 467036 WebSocketClient fails to process immediate frames from server
+ + 467043 WebSocketClient close codes on protocol violation reported as policy
+   violation
+
 jetty-9.2.11.M0 - 25 March 2015
  + 454934 WebSocketClient / connectToServer can block indefinitely during
    upgrade failure
@@ -55,6 +495,148 @@
  + 462546 ShutdownMonitor should bind to jetty.host
  + 462616 Race between finishing a connect and timing it out.
 
+jetty-9.3.0.M2 - 11 March 2015
+ + 383207 Use BundleFileLocatorHelperFactory to obtain BundleFileLocatorHelper
+ + 420944 Hot Deployment of WAR when Context XML exists doesn't trigger
+   redeploy
+ + 423974 Optimize flow control.
+ + 424368 Add CONTRIBUTING.md
+ + 430951 Improved ordering of SSL ciphers
+ + 439374 Use utf-8 as default charset for html
+ + 440506 Jetty OSGi boot bundle does not support OSGi framework Eclipse
+   Concierge
+ + 443652 Remove dependency on java.lang.management classes
+ + 445518 Provide different error callbacks to ProxyServlet.
+ + 446564 Refactored RequestLog Mechanism
+ + 447472 Clear async context timeout on async static content
+ + 448446 org.eclipse.jetty.start.Main create classloader duplicate
+ + 448944 Provide m2e lifecycle mapping metadata for jetty-jspc-maven-plugin
+ + 449594 Handle ArrayTrie overflow with false return
+ + 449811 handle unquoted etags when gzipping
+ + 450467 Integer overflow in Session expiry calculation in MongoSessionManager
+ + 450483 Missing parameterization of etc/jetty-deploy.xml.
+ + 450484 Missing parameterization of etc/jetty-http[s].xml.
+ + 450855 GzipFilter MIGHT_COMPRESS exception
+ + 450873 Disable tests that downcaste wrapped GzipFilterResponses
+ + 450894 jetty.sh does not delete JETTY_STATE at start
+ + 451092 Connector will fail if HeaderListener return false.
+ + 451529 Change sentinel class for finding jstl on classpath to
+   org.apache.taglibs.standard.tag.rt.core.WhenTag
+ + 451634 DefaultServlet: useFileMappedBuffer javadoc is misleading
+ + 451973 Ambiguous module init location when mixing --add-to-start &
+   --add-to-startd in the same exec
+ + 451974 Combine multiple start license acknowledgement into one
+ + 452188 Delay dispatch until content optimisation
+ + 452201 Set the container classloader for osgi during webbundle undeploy
+ + 452246 Fixed SSL hang on last chunk
+ + 452261 Ensure <jsp-file> works with new JettyJspServlet
+ + 452322 Restore progress messages for --add-to-start(d) use
+ + 452323 Start --list-config makes no hint on transitive enabled modules
+ + 452329 Transitive modules in start.jar --add-to-start(d) are not added if
+   enabled already in tree
+ + 452424 Do not add Date header if already set
+ + 452465 100% CPU spin on page reload.
+ + 452503 Start.jar --add-to-start=jstl results in GraphException: Unable to
+   expand property in name: jsp-impl/${jsp-impl}-jstl
+ + 452516 Make HttpOutput aggregation size configurable.
+ + 453386 Jetty not working when configuring QueuedThreadPool with
+   minThreads=0.
+ + 453487 Recycle HttpChannelOverHTTP2
+ + 453627 Fixed FileSystem test for nanosecond filesystems
+ + 453629 Fixed big write test
+ + 453636 Improved spin detection on test
+ + 453793 _maxHeaderBytes>0 is not verified in parseNext() when in
+   State.CLOSED.
+ + 453801 Jetty does not check for already registered services when
+   bootstrapping
+ + 453829 removed code with yahoo copyright
+ + 454152 Remove mux remnants from WebSocketClient
+ + 454157 HttpInput.consumeAll spins if input is in async mode.
+ + 454291 Added busy threads JMX attribute to QueuedThreadPool
+ + 454773 SSLConnection use on Android client results in loop
+ + 454952 Allow Jetty to run in Java 8 compact 3 profile
+ + 454954 Jetty osgi should skip fragment and required bundles that are in the
+   uninstalled state
+ + 454955 OSGi AnnotationParser should skip resources that are not in the
+   classpath and close the class inputstream when done scanning it
+ + 454983 Source bundles should not be singleton
+ + 455047 Update JASPI
+ + 455174 jetty-plus JNDI tests should use unique JNDI paths
+ + 455330 Multiple Jetty-ContextFilePath entries separated by commas doesn't
+   work
+ + 455436 ProxyServlet sends two User-Agent values.
+ + 455476 Persist updated session expiry time for MongoSessionManager
+ + 455655 ensure multipart form-data parsing exception thrown to servlet
+ + 455863 Fixed jetty.sh handling of multiple JETTY_ARGS
+ + 456209 Bad ContextClassLoader in WebSocket onMessage
+ + 456426 Exception on context undeploy from EnvConfiguration
+ + 456486 Jar containing ServiceContainerInitializer impl not found in TCCL in
+   osgi
+ + 456521 ShutdownHandler should shut down more gracefully
+ + 456956 Reduce ThreadLocal.remove() weak reference garbage
+ + 457017 Reflective call to websocket methods that fail have ambiguous
+   exceptions
+ + 457032 Request sent from a failed CompleteListener due to connect timeout is
+   failed immediately.
+ + 457130 HTTPS request with IP host and HTTP proxy throws
+   IllegalArgumentException.
+ + 457696 JMX implementation should not be overridden by WebApp classes
+ + 457893 Close temp jar resource
+ + 458101 added test for maxFormContentSize
+ + 458140 Added DispatcherType support to RewriteHandler
+ + 458174 Example Jar Server
+ + 458175 multipart annotation on lazily loaded servlet does not work
+ + 458209 Length check for HttpMethod MOVE lookahead
+ + 458354 ALPNServerConnection.select negotiation.
+ + 458495 CompletableCallback may not notify failures.
+ + 458527 Implement an async proxy servlet that can perform content
+   transformations.
+ + 458568 JDBCLoginService javadoc incorrectly references HashLoginService
+ + 458663 Handle null header values
+ + 458849 org.eclipse.jetty.util.Uptime.DefaultImpl() not available on GAE
+ + 459006 master branch does not build on norwegian locale
+ + 459081 http2 push failures.
+ + 459125 GzipHandler default mimeType behavior incorrect
+ + 459273 Redundant license notices
+ + 459352 AsyncMiddleManServlet should set "Host:" header correctly in proxy to
+   remote request headers.
+ + 459490 Defining a duplicate error page in webdefault.xml and web.xml results
+   in an error
+ + 459542 AsyncMiddleManServlet race condition on first download content.
+ + 459560 jetty.sh handles start.d and no start.ini
+ + 459655 Remove SPDY and NPN
+ + 459681 Remove dead code after removal of glassfish jasper support
+ + 459731 Update for drafts hpack-11 and http2-17
+ + 459769 AsyncMiddleManServlet race condition on last download content.
+ + 459845 Support upgrade from http1 to http2/websocket
+ + 459963 Failure writing content of a committed request leaks connections.
+ + 460176 When checking for precompiled jsp, ensure classname is present
+ + 460180 Jaas demo has wrong doco in html
+ + 460210 ExecutionStragegy producer for SelectManager calls onOpen from
+   produce method
+ + 460211 Fixed Idle race in ExecuteProduceRun
+ + 460291 AsyncGzipFilter Mappings
+ + 460371 AsyncMiddleManServlet.GZipContentTransformer fails if last transform
+   has no output
+ + 460372 if web.xml does not contain jspc maven plugin insertionMarker
+   behavior is wrong
+ + 460443 Race condition releasing the response buffer.
+ + 460642 HttpParser error 400 can expose previous buffer contents in HTTP
+   status reason message
+ + 460670 Support multiple names in <Property> elements.
+ + 460769 ClientUpgradeRequest sends cookies in the wrong format
+ + 460905 Make sure TimeoutCompleteListener is cancelled if the request cannot
+   be sent.
+ + 461052 Local streams created after INITIAL_WINDOW_SIZE setting have wrong
+   send window.
+ + 461070 Handle setReadListener on request with no content
+ + 461133 allow stop port to reuse address
+ + 461350 Update HttpParser IllegalCharacter handling to RFC7230
+ + 461452 Double release of buffer by HttpReceiverOverHTTP
+ + 461499 ConnectionPool may leak connections.
+ + 461623 BufferUtil.writeTo does not update position consistently
+ + 461643 HttpContent.advance() race.
+
 jetty-9.2.10.v20150310 - 10 March 2015
  + 445518 Provide different error callbacks to ProxyServlet.
  + 456521 ShutdownHandler should shut down more gracefully
@@ -172,6 +754,82 @@
  + 450873 Disable tests that downcaste wrapped GzipFilterResponses
  + 450894 jetty.sh does not delete JETTY_STATE at start
 
+jetty-9.3.0.M1 - 03 November 2014
+ + 376365 "jetty.sh start" returns 0 on failure
+ + 396569 'bin/jetty.sh stop' reports 'OK' even when jetty was not running
+ + 396572 Starting jetty from cygwin is not working properly
+ + 437303 Serving of static filenames with "unwise" characters causes 404 error
+ + 440729 SSL requests often fail with EOFException or IllegalStateException.
+ + 440925 NPE when using relative paths for --start-log-file
+ + 442419 CrossOriginFilter javadoc says "exposeHeaders", but should be
+   "exposedHeaders"
+ + 442942 Content sent with status 204 (No Content)
+ + 443529 CrossOriginFilter does not accept wildcard for allowedHeaders
+ + 443530 CrossOriginFilter does not set the Vary header
+ + 443550 improved FileResource encoded alias checking
+ + 444031 Ensure exceptions do not reduce threadpool below minimum
+ + 444595 nosql/mongodb - Cleanup process/Refreshing does not respect encoding
+   of attribute keys
+ + 444676 Goal jetty:deploy-war produces errors with version 9.2.3
+ + 444722 Fixed order of setReuseAddress call
+ + 444896 Overriding of web-default servlet mapping in web.xml not working with
+   quickstart
+ + 445157 First redeployed servlet leaks WebAppContext
+ + 445167 Allow configuration of dispatch after select.
+ + 445239 Rename weld.mod to cdi.mod to be consistent with past module namings
+ + 445258 STOP.WAIT is not really respected
+ + 445374 Reevaluate org.eclipse.jetty.websocket.jsr356 enablement concepts
+ + 445495 Improve Exception message when no jndi resource to bind for a name in
+   web.xml
+ + 445542 Add SecuredRedirectHandler for embedded jetty use to redirect to
+   secure port/scheme
+ + 445821 Error 400 should be logged with RequestLog
+ + 445823 Moved RequestLog calling to HttpChannel
+ + 445830 Support setting environment variables on forked jetty with
+   jetty:run-forked
+ + 445979 jetty.sh fails to start when start-stop-daemon does not exist and the
+   user is not root
+ + 446033 org.eclipse.jetty.websocket.server.WebSocketServerFactory not
+   available in OSGi
+ + 446063 ALPN Fail SSL Handshake if no supported Application Protocols.
+ + 446107 NullPointerException in ProxyServlet when extended by Servlet without
+   a package
+ + 446425 Oracle Sql error on JettySessions table when this table do not exist
+   already
+ + 446506 getAsyncContext ISE before startAsync on async dispatches
+ + 446559 Avoid spin consuming extra data
+ + 446563 Null HttpChannel.getCurrentHttpChannel() in
+   ServletHandler.doFilter().
+ + 446564 Refactored RequestLog Mechanism
+ + 446672 NPN Specification issue in the case no protocols are selected.
+ + 446923 SharedBlockingCallback does not handle connector max idle time of
+   Long.MAX_VALUE; BlockerTimeoutException not serializable
+ + 446944 ServletTester and HttpTester should be in
+   <classifier>tests</classifier>
+ + 447216 putAll Properties in XmlConfiguration
+ + 447381 Disable SSLv3 by default.
+ + 447472 test harness for slow large writes
+ + 447515 Remove GzipFilter
+ + 447627 MultiPart file always created when "filename" set in
+   Content-Disposition
+ + 447629 getPart()/getParts() fails on Multipart request if getParameter is
+   called in a filter first
+ + 447746 HttpClient is always going to send User-Agent header even though I do
+   not want it to.
+ + 447979 Refactor to make MetaData responsible for progressively ordering
+   web-inf jars
+ + 448156 Fixed INACTIVE race in IteratingCallback
+ + 448225 Removed unnecessary synchronize on initParser
+ + 448675 Impossible to set own Threadpool when using jetty-maven-plugin
+ + 448841 Clarified selectors==0 javadoc 448840 Clarified ServerConnector
+   javadoc 448839 Fixed javadoc typo in ServerConnector
+ + 449001 Remove start.d directory from JETTY_HOME
+ + 449003 WARNING: Cannot enable requested module [protonego-impl]: not a valid
+   module name
+ + 449038 WebSocketUpgradeFilter must support async.
+ + 449175 Removed extra space in NCSA log
+ + 449372 Make jvmArgs of jetty:run-forked configurable from command line
+
 jetty-9.2.4.v20141103 - 03 November 2014
  + 376365 "jetty.sh start" returns 0 on failure
  + 396569 'bin/jetty.sh stop' reports 'OK' even when jetty was not running
@@ -208,6 +866,7 @@
  + 444896 Overriding of web-default servlet mapping in web.xml not working with
    quickstart
  + 445157 First redeployed servlet leaks WebAppContext
+ + 445167 Allow configuration of dispatch after select.
  + 445239 Rename weld.mod to cdi.mod to be consistent with past module namings
  + 445258 STOP.WAIT is not really respected
  + 445374 Reevaluate org.eclipse.jetty.websocket.jsr356 enablement concepts
@@ -229,13 +888,19 @@
  + 446425 Oracle Sql error on JettySessions table when this table do not exist
    already
  + 446506 getAsyncContext ISE before startAsync on async dispatches
+ + 446559 Avoid spin consuming extra data
  + 446563 Null HttpChannel.getCurrentHttpChannel() in
    ServletHandler.doFilter().
+ + 446564 Refactored RequestLog Mechanism
  + 446672 NPN Specification issue in the case no protocols are selected.
  + 446923 SharedBlockingCallback does not handle connector max idle time of
    Long.MAX_VALUE; BlockerTimeoutException not serializable
+ + 446944 ServletTester and HttpTester should be in
+   <classifier>tests</classifier>
+ + 447216 putAll Properties in XmlConfiguration
  + 447381 Disable SSLv3 by default.
  + 447472 test harness for slow large writes
+ + 447515 Remove GzipFilter
  + 447627 MultiPart file always created when "filename" set in
    Content-Disposition
  + 447629 getPart()/getParts() fails on Multipart request if getParameter is
@@ -246,6 +911,7 @@
    web-inf jars
  + 448156 Fixed INACTIVE race in IteratingCallback
  + 448225 Removed unnecessary synchronize on initParser
+ + 448675 Impossible to set own Threadpool when using jetty-maven-plugin
  + 448841 Clarified selectors==0 javadoc 448840 Clarified ServerConnector
    javadoc 448839 Fixed javadoc typo in ServerConnector
  + 449001 Remove start.d directory from JETTY_HOME
@@ -257,6 +923,42 @@
  + 449372 Make jvmArgs of jetty:run-forked configurable from command line
  + 449603 OutputStreamContentProvider hangs when host is not available.
 
+jetty-9.3.0.M0 - 24 September 2014
+ + 437395 Start / Properties in template sections should be default applied for
+   enabled modules
+ + 438204 getServerName returns IPv6 addresses wrapped in []
+ + 438387 NullPointerException after ServletUpgradeResponse.sendForbidden is
+   called during WebSocketCreator.createWebSocket
+ + 439369 Remove unused class CrossContextPsuedoSession
+ + 439375 preferred rfc7231 format is mime;charset=lowercase-9
+ + 442083 Client resets stream, pending server data is failed, connection
+   closed.
+ + 442086 Review HttpOutput blocking writes.
+ + 442477 Allow Symlink aliases by default
+ + 442495 Bad Context ClassLoader in JSR356 WebSocket onOpen
+ + 442950 Embedded Jetty client requests to localhost hangs with high cpu usage
+   (NIO OP_CONNECT Solaris/Sparc).
+ + 443652 Remove dependency on java.lang.management classes
+ + 443661 Rename manifest and service constants for jetty osgi resource
+   fragment code
+ + 443662 Consume buffer in write(ByteBuffer)
+ + 443713 Reduce number of SelectionKey.setInterestOps() calls.
+ + 443893 Make a module for weld
+ + 444124 JSP include with <servlet><jsp-file> can cause infinite recursion
+ + 444214 Socks4Proxy fails when reading less than 8 bytes.
+ + 444222 replace CRLF in header values with whitespace rather than ?
+ + 444415 iterative WriteFlusher
+ + 444416 AsyncProxyServlet recursion.
+ + 444485 Client resets stream, pending server data is failed, write hangs.
+ + 444517 Ensure WebSocketUpgradeFilter is always first in filter chain
+ + 444547 Format exception in ResourceCache.Content.toString()
+ + 444617 Expose local and remote socket address to applications
+ + 444748 WebSocketClient.stop() does not unregister from ShutdownThread
+ + 444764 HttpClient notifies callbacks for last chunk of content twice.
+ + 444771 JSR356 / EndPointConfig.userProperties are not unique per endpoint
+   upgrade
+ + 444863 ProxyServlet does not filter headers listed by the Connection header.
+
 jetty-9.2.3.v20140905 - 05 September 2014
  + 347110 renamed class transformer methods
  + 411163 Add embedded jetty code example with JSP enabled
@@ -1030,8 +1732,8 @@
  + 412940 minor threadsafe fixes
  + 413018 ServletContext.addListener() should throw IllegalArgumentException if
    arg is not correct type of listener
- + 413020 Second call to HttpSession.invalidate() should throw exception 413019
-   HttpSession.getCreateTime() should throw exception after session is
+ + 413020 Second call to HttpSession.invalidate() should throw exception
+ + 413019 HttpSession.getCreateTime() should throw exception after session is
    invalidated
  + 413291 Avoid SPDY double dispatch
  + 413387 onResponseHeaders is not called multiple times when multiple
diff --git a/aggregates/jetty-all-compact3/pom.xml b/aggregates/jetty-all-compact3/pom.xml
new file mode 100644
index 0000000..14fd2c7
--- /dev/null
+++ b/aggregates/jetty-all-compact3/pom.xml
@@ -0,0 +1,247 @@
+<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>
+    <groupId>org.eclipse.jetty</groupId>
+    <artifactId>jetty-project</artifactId>
+    <version>9.3.6-SNAPSHOT</version>
+    <relativePath>../../pom.xml</relativePath>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.eclipse.jetty.aggregate</groupId>
+  <artifactId>jetty-all-compact3</artifactId>
+  <name>Jetty :: Aggregate :: All core Jetty suitable for Java 8 compact 3 profile</name>
+  <url>http://www.eclipse.org/jetty</url>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.all.compact3</bundle-symbolic-name>
+  </properties>
+  <build>
+    <sourceDirectory>${project.build.directory}/sources</sourceDirectory>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>8</source>
+          <target>8</target>
+          <compilerArgs>
+            <arg>-profile</arg>
+            <arg>compact3</arg>
+          </compilerArgs>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>unpack-dependencies</id>
+            <goals>
+              <goal>unpack-dependencies</goal>
+            </goals>
+            <configuration>
+              <excludes>**/MANIFEST.MF,javax/**</excludes>
+              <excludeArtifactIds>javax</excludeArtifactIds>
+              <excludeGroupIds>javax,org.eclipse.jetty.orbit,org.slf4j,org.ow2.asm</excludeGroupIds>
+              <outputDirectory>${project.build.directory}/classes</outputDirectory>
+              <overWriteReleases>false</overWriteReleases>
+              <overWriteSnapshots>true</overWriteSnapshots>
+            </configuration>
+          </execution>
+          <execution>
+            <id>unpack-source</id>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>unpack-dependencies</goal>
+            </goals>
+            <configuration>
+              <classifier>sources</classifier>
+              <includes>**/*</includes>
+              <excludes>
+                META-INF/**
+                **/Servlet3Continuation*
+                **/Jetty6Continuation*
+                **/AppContextLeakPreventer*.java
+                **/AWTLeakPreventer*.java
+                **/IntrospectorCleaner*.java
+                **/PostConstructAnnotationHandler*.java
+                **/PreDestroyAnnotationHandler*.java
+                **/ResourceAnnotationHandler*.java
+                **/ResourcesAnnotationHandler*.java
+              </excludes>
+              <includeGroupIds>org.eclipse.jetty,org.eclipse.jetty.websocket</includeGroupIds>
+              <excludeArtifactIds>javax</excludeArtifactIds>
+              <excludeGroupIds>javax,org.eclipse.jetty.orbit,org.slf4j,org.ow2.asm</excludeGroupIds>
+              <outputDirectory>${project.build.directory}/sources</outputDirectory>
+              <overWriteReleases>true</overWriteReleases>
+              <overWriteSnapshots>true</overWriteSnapshots>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins
+        </groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>package</id>
+            <phase>package</phase>
+            <goals>
+              <goal>jar</goal>
+            </goals>
+            <configuration>
+              <archive>
+                <manifest>
+                </manifest>
+                <manifestEntries>
+                  <mode>development</mode>
+                  <url>http://eclipse.org/jetty</url>
+                  <Built-By>${user.name}</Built-By>
+                  <package>org.eclipse.jetty</package>
+                  <Bundle-License>http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/NOTICE.txt</Bundle-License>
+                  <Bundle-Name>Jetty</Bundle-Name>
+                </manifestEntries>
+              </archive>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-javadoc-plugin</artifactId>
+        <configuration>
+          <additionalparam>-Xdoclint:none</additionalparam>
+        </configuration>
+        <executions>
+          <execution>
+            <id>javadoc-jar</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>jar</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-pmd-plugin</artifactId>
+          <configuration>
+            <skip>true</skip>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-client</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-deploy</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>websocket-servlet</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>javax-websocket-server-impl</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>websocket-client</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-plus</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-annotations</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-util</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-jaspi</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-jndi</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-rewrite</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-servlets</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-quickstart</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <!-- dependencies that jetty-all needs (some optional) -->
+    <dependency>
+      <groupId>javax.websocket</groupId>
+      <artifactId>javax.websocket-api</artifactId>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>javax.servlet-api</artifactId>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>javax.transaction</groupId>
+      <artifactId>javax.transaction-api</artifactId>
+      <scope>compile</scope>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.orbit</groupId>
+      <artifactId>javax.mail.glassfish</artifactId>
+      <scope>compile</scope>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <scope>compile</scope>
+      <optional>true</optional>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/aggregates/jetty-all/pom.xml b/aggregates/jetty-all/pom.xml
index 7a80ca4..1a884f7 100644
--- a/aggregates/jetty-all/pom.xml
+++ b/aggregates/jetty-all/pom.xml
@@ -2,108 +2,124 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.eclipse.jetty.aggregate</groupId>
   <artifactId>jetty-all</artifactId>
   <name>Jetty :: Aggregate :: All core Jetty</name>
+  <description>UberJar for Core Jetty features</description>
+  <packaging>pom</packaging>
   <url>http://www.eclipse.org/jetty</url>
+  <properties>
+    <uber-jar>${project.build.directory}/${project.artifactId}-${project.version}-uber.jar</uber-jar>
+    <gen-resources-dir>${project.build.directory}/gen-resources</gen-resources-dir>
+  </properties>
   <build>
-    <sourceDirectory>${project.build.directory}/sources</sourceDirectory>
     <plugins>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
+        <artifactId>maven-resources-plugin</artifactId>
+        <version>2.7</version>
         <executions>
           <execution>
-            <id>unpack-dependencies</id>
+            <id>massage-manifest</id>
+            <phase>generate-resources</phase>
             <goals>
-              <goal>unpack-dependencies</goal>
+              <goal>copy-resources</goal>
             </goals>
             <configuration>
-              <excludes>**/MANIFEST.MF,javax/**</excludes>
-              <excludeArtifactIds>javax</excludeArtifactIds>
-              <excludeGroupIds>javax,org.eclipse.jetty.orbit,org.mortbay.jetty.npn,org.slf4j,org.ow2.asm</excludeGroupIds>
-              <outputDirectory>${project.build.directory}/classes</outputDirectory>
-              <overWriteReleases>false</overWriteReleases>
-              <overWriteSnapshots>true</overWriteSnapshots>
-            </configuration>
-          </execution>
-          <execution>
-            <id>unpack-source</id>
-            <phase>generate-sources</phase>
-            <goals>
-              <goal>unpack-dependencies</goal>
-            </goals>
-            <configuration>
-              <classifier>sources</classifier>
-              <includes>**/*</includes>
-              <excludes>META-INF/**,**/Servlet3Continuation*,**/Jetty6Continuation*</excludes>
-              <includeGroupIds>org.eclipse.jetty,org.eclipse.jetty.websocket</includeGroupIds>
-              <excludeArtifactIds>javax</excludeArtifactIds>
-              <excludeGroupIds>javax,org.eclipse.jetty.orbit,org.mortbay.jetty.npn,org.slf4j,org.ow2.asm</excludeGroupIds>
-              <outputDirectory>${project.build.directory}/sources</outputDirectory>
-              <overWriteReleases>true</overWriteReleases>
-              <overWriteSnapshots>true</overWriteSnapshots>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins
-        </groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>package</id>
-            <phase>package</phase>
-            <goals>
-              <goal>jar</goal>
-            </goals>
-            <configuration>
-              <archive>
-                <manifest>
-                </manifest>
-                <manifestEntries>
-                  <mode>development</mode>
-                  <url>http://eclipse.org/jetty</url>
-                  <Built-By>${user.name}</Built-By>
-                  <package>org.eclipse.jetty</package>
-                  <Bundle-License>http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/NOTICE.txt</Bundle-License>
-                  <Bundle-Name>Jetty</Bundle-Name>
-                </manifestEntries>
-              </archive>
+              <outputDirectory>${gen-resources-dir}</outputDirectory>
+              <resources>
+                <resource>
+                  <directory>src/main/resources</directory>
+                  <filtering>true</filtering>
+                </resource>
+              </resources>
             </configuration>
           </execution>
         </executions>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-javadoc-plugin</artifactId>
+        <artifactId>maven-shade-plugin</artifactId>
+        <version>2.3</version>
+        <dependencies>
+          <dependency>
+            <groupId>org.eclipse.jetty.toolchain</groupId>
+            <artifactId>jetty-build-support</artifactId>
+            <version>1.3</version>
+          </dependency>
+        </dependencies>
         <executions>
           <execution>
-            <id>javadoc-jar</id>
-            <phase>compile</phase>
+            <id>uberjar</id>
+            <phase>package</phase>
             <goals>
-              <goal>jar</goal>
+              <goal>shade</goal>
             </goals>
+            <configuration>
+              <shadedArtifactAttached>true</shadedArtifactAttached>
+              <shadedClassifierName>uber</shadedClassifierName>
+              <outputFile>${uber-jar}</outputFile>
+              <transformers>
+                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
+                <transformer implementation="org.eclipse.jetty.toolchain.shade.IncludeDirectoryTransformer">
+                  <directory>${gen-resources-dir}</directory>
+                </transformer>
+              </transformers>
+              <filters>
+                <filter>
+                  <artifact>*:*</artifact>
+                  <excludes>
+                    <exclude>META-INF/LICENSE.txt</exclude>
+                    <exclude>META-INF/*.MF</exclude>
+                    <exclude>META-INF/*.SF</exclude>
+                    <exclude>META-INF/*.DSA</exclude>
+                    <exclude>META-INF/*.RSA</exclude>
+                  </excludes>
+                </filter>
+              </filters>
+              <artifactSet>
+                <excludes>
+                  <exclude>javax:*</exclude>
+                  <exclude>org.eclipse.jetty.orbit:*</exclude>
+                  <exclude>org.mortbay.jetty:*</exclude>
+                  <exclude>org.mortbay.jetty.alpn:*</exclude>
+                  <exclude>org.slf4j:*</exclude>
+                  <exclude>org.ow2.asm:*</exclude>
+                  <exclude>*:javax</exclude>
+                </excludes>
+              </artifactSet>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <version>1.9.1</version>
+        <executions>
+          <execution>
+            <id>attach-artifacts</id>
+            <phase>package</phase>
+            <goals>
+              <goal>attach-artifact</goal>
+            </goals>
+            <configuration>
+              <artifacts>
+                <artifact>
+                  <file>${uber-jar}</file>
+                  <type>jar</type>
+                  <classifier>uber</classifier>
+                </artifact>
+              </artifacts>
+            </configuration>
           </execution>
         </executions>
       </plugin>
     </plugins>
-    <pluginManagement>
-      <plugins>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-pmd-plugin</artifactId>
-          <configuration>
-            <skip>true</skip>
-          </configuration>
-        </plugin>
-      </plugins>
-    </pluginManagement>
   </build>
 
   <dependencies>
@@ -111,120 +127,109 @@
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-client</artifactId>
       <version>${project.version}</version>
-      <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-deploy</artifactId>
       <version>${project.version}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty.websocket</groupId>
-      <artifactId>websocket-servlet</artifactId>
-      <version>${project.version}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty.websocket</groupId>
-      <artifactId>javax-websocket-server-impl</artifactId>
-      <version>${project.version}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty.websocket</groupId>
-      <artifactId>websocket-client</artifactId>
-      <version>${project.version}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty.spdy</groupId>
-      <artifactId>spdy-http-server</artifactId>
-      <version>${project.version}</version>
-      <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-jmx</artifactId>
       <version>${project.version}</version>
-      <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-plus</artifactId>
       <version>${project.version}</version>
-      <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-annotations</artifactId>
       <version>${project.version}</version>
-      <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-util</artifactId>
       <version>${project.version}</version>
-      <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-jaspi</artifactId>
       <version>${project.version}</version>
-      <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-jndi</artifactId>
       <version>${project.version}</version>
-      <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-rewrite</artifactId>
       <version>${project.version}</version>
-      <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-servlets</artifactId>
       <version>${project.version}</version>
-      <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-quickstart</artifactId>
       <version>${project.version}</version>
-      <scope>provided</scope>
+    </dependency>
+    <!-- websocket support -->
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>websocket-servlet</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>javax-websocket-server-impl</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>websocket-client</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <!-- http/2 support -->
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-alpn-client</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.http2</groupId>
+      <artifactId>http2-server</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.http2</groupId>
+      <artifactId>http2-client</artifactId>
+      <version>${project.version}</version>
     </dependency>
     <!-- dependencies that jetty-all needs (some optional) -->
     <dependency>
       <groupId>javax.websocket</groupId>
       <artifactId>javax.websocket-api</artifactId>
-      <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>javax.servlet-api</artifactId>
-      <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>javax.transaction</groupId>
       <artifactId>javax.transaction-api</artifactId>
-      <scope>compile</scope>
-      <optional>true</optional>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jetty.orbit</groupId>
       <artifactId>javax.mail.glassfish</artifactId>
-      <scope>compile</scope>
-      <optional>true</optional>
     </dependency>
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
-      <scope>compile</scope>
-      <optional>true</optional>
     </dependency>
   </dependencies>
 </project>
diff --git a/aggregates/jetty-all/src/main/resources/META-INF/MANIFEST.MF b/aggregates/jetty-all/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..6ffd7d5
--- /dev/null
+++ b/aggregates/jetty-all/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+mode: development
+Implementation-Title: Jetty Uber All
+Implementation-Vendor: Eclipse Jetty Project
+Implementation-Vendor-Id: org.eclipse.jetty
+Implementation-Version: @project.version@
+X-License: https://www.eclipse.org/jetty/licenses.php
+
diff --git a/aggregates/jetty-all/src/main/resources/META-INF/javax.annotation-api-LICENSE.txt b/aggregates/jetty-all/src/main/resources/META-INF/javax.annotation-api-LICENSE.txt
new file mode 100644
index 0000000..a0ccc93
--- /dev/null
+++ b/aggregates/jetty-all/src/main/resources/META-INF/javax.annotation-api-LICENSE.txt
@@ -0,0 +1,263 @@
+COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
+
+1. Definitions.
+
+   1.1. Contributor. means each individual or entity that creates or contributes to the creation of Modifications.
+
+   1.2. Contributor Version. means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor.
+
+   1.3. Covered Software. means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof.
+
+   1.4. Executable. means the Covered Software in any form other than Source Code.
+
+   1.5. Initial Developer. means the individual or entity that first makes Original Software available under this License.
+
+   1.6. Larger Work. means a work which combines Covered Software or portions thereof with code not governed by the terms of this License.
+
+   1.7. License. means this document.
+
+   1.8. Licensable. means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.
+
+   1.9. Modifications. means the Source Code and Executable form of any of the following:
+
+        A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications;
+
+        B. Any new file that contains any part of the Original Software or previous Modification; or
+
+        C. Any new file that is contributed or otherwise made available under the terms of this License.
+
+   1.10. Original Software. means the Source Code and Executable form of computer software code that is originally released under this License.
+
+   1.11. Patent Claims. means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
+
+   1.12. Source Code. means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code.
+
+   1.13. You. (or .Your.) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, .You. includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, .control. means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.
+
+2. License Grants.
+
+      2.1. The Initial Developer Grant.
+
+      Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license:
+
+         (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and
+
+         (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof).
+
+        (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License.
+
+        (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices.
+
+    2.2. Contributor Grant.
+
+    Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:
+
+        (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and
+
+        (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
+
+        (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party.
+
+        (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor.
+
+3. Distribution Obligations.
+
+      3.1. Availability of Source Code.
+      Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange.
+
+      3.2. Modifications.
+      The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License.
+
+      3.3. Required Notices.
+      You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer.
+
+      3.4. Application of Additional Terms.
+      You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients. rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
+
+      3.5. Distribution of Executable Versions.
+      You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient.s rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.
+
+      3.6. Larger Works.
+      You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software.
+
+4. Versions of the License.
+
+      4.1. New Versions.
+      Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License.
+
+      4.2. Effect of New Versions.
+      You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward.
+
+      4.3. Modified Versions.
+      When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License.
+
+5. DISCLAIMER OF WARRANTY.
+
+   COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN .AS IS. BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+6. TERMINATION.
+
+      6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
+
+      6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as .Participant.) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant.
+
+      6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination.
+
+7. LIMITATION OF LIABILITY.
+
+   UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY.S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+8. U.S. GOVERNMENT END USERS.
+
+   The Covered Software is a .commercial item,. as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of .commercial computer software. (as that term is defined at 48 C.F.R. ? 252.227-7014(a)(1)) and .commercial computer software documentation. as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License.
+
+9. MISCELLANEOUS.
+
+   This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction.s conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys. fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software.
+
+10. RESPONSIBILITY FOR CLAIMS.
+
+   As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
+
+   NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)
+
+   The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California.
+
+
+The GNU General Public License (GPL) Version 2, June 1991
+
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification follow.
+
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+
+   a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
+
+   b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
+
+   c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+
+3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
+
+   a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+
+   b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+
+   c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
+
+   One line to give the program's name and a brief idea of what it does.
+
+   Copyright (C)
+
+   This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
+
+   Gnomovision version 69, Copyright (C) year name of author
+   Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
+
+   Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+   signature of Ty Coon, 1 April 1989
+   Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
+
+
+"CLASSPATH" EXCEPTION TO THE GPL VERSION 2
+
+Certain source files distributed by Sun Microsystems, Inc. are subject to the following clarification and special exception to the GPL Version 2, but only where Sun has expressly included in the particular source file's header the words
+
+"Sun designates this particular file as subject to the "Classpath" exception as provided by Sun in the License file that accompanied this code."
+
+Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License Version 2 cover the whole combination.
+
+As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module.? An independent module is a module which is not derived from or based on this library.? If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so.? If you do not wish to do so, delete this exception statement from your version.
diff --git a/aggregates/jetty-all/src/main/resources/META-INF/javax.servlet-api-LICENSE.txt b/aggregates/jetty-all/src/main/resources/META-INF/javax.servlet-api-LICENSE.txt
new file mode 100644
index 0000000..a0ccc93
--- /dev/null
+++ b/aggregates/jetty-all/src/main/resources/META-INF/javax.servlet-api-LICENSE.txt
@@ -0,0 +1,263 @@
+COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
+
+1. Definitions.
+
+   1.1. Contributor. means each individual or entity that creates or contributes to the creation of Modifications.
+
+   1.2. Contributor Version. means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor.
+
+   1.3. Covered Software. means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof.
+
+   1.4. Executable. means the Covered Software in any form other than Source Code.
+
+   1.5. Initial Developer. means the individual or entity that first makes Original Software available under this License.
+
+   1.6. Larger Work. means a work which combines Covered Software or portions thereof with code not governed by the terms of this License.
+
+   1.7. License. means this document.
+
+   1.8. Licensable. means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.
+
+   1.9. Modifications. means the Source Code and Executable form of any of the following:
+
+        A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications;
+
+        B. Any new file that contains any part of the Original Software or previous Modification; or
+
+        C. Any new file that is contributed or otherwise made available under the terms of this License.
+
+   1.10. Original Software. means the Source Code and Executable form of computer software code that is originally released under this License.
+
+   1.11. Patent Claims. means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
+
+   1.12. Source Code. means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code.
+
+   1.13. You. (or .Your.) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, .You. includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, .control. means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.
+
+2. License Grants.
+
+      2.1. The Initial Developer Grant.
+
+      Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license:
+
+         (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and
+
+         (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof).
+
+        (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License.
+
+        (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices.
+
+    2.2. Contributor Grant.
+
+    Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:
+
+        (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and
+
+        (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
+
+        (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party.
+
+        (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor.
+
+3. Distribution Obligations.
+
+      3.1. Availability of Source Code.
+      Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange.
+
+      3.2. Modifications.
+      The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License.
+
+      3.3. Required Notices.
+      You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer.
+
+      3.4. Application of Additional Terms.
+      You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients. rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
+
+      3.5. Distribution of Executable Versions.
+      You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient.s rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.
+
+      3.6. Larger Works.
+      You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software.
+
+4. Versions of the License.
+
+      4.1. New Versions.
+      Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License.
+
+      4.2. Effect of New Versions.
+      You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward.
+
+      4.3. Modified Versions.
+      When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License.
+
+5. DISCLAIMER OF WARRANTY.
+
+   COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN .AS IS. BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+6. TERMINATION.
+
+      6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
+
+      6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as .Participant.) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant.
+
+      6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination.
+
+7. LIMITATION OF LIABILITY.
+
+   UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY.S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+8. U.S. GOVERNMENT END USERS.
+
+   The Covered Software is a .commercial item,. as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of .commercial computer software. (as that term is defined at 48 C.F.R. ? 252.227-7014(a)(1)) and .commercial computer software documentation. as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License.
+
+9. MISCELLANEOUS.
+
+   This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction.s conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys. fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software.
+
+10. RESPONSIBILITY FOR CLAIMS.
+
+   As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
+
+   NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)
+
+   The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California.
+
+
+The GNU General Public License (GPL) Version 2, June 1991
+
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification follow.
+
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+
+   a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
+
+   b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
+
+   c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+
+3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
+
+   a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+
+   b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+
+   c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
+
+   One line to give the program's name and a brief idea of what it does.
+
+   Copyright (C)
+
+   This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
+
+   Gnomovision version 69, Copyright (C) year name of author
+   Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
+
+   Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+   signature of Ty Coon, 1 April 1989
+   Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
+
+
+"CLASSPATH" EXCEPTION TO THE GPL VERSION 2
+
+Certain source files distributed by Sun Microsystems, Inc. are subject to the following clarification and special exception to the GPL Version 2, but only where Sun has expressly included in the particular source file's header the words
+
+"Sun designates this particular file as subject to the "Classpath" exception as provided by Sun in the License file that accompanied this code."
+
+Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License Version 2 cover the whole combination.
+
+As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module.? An independent module is a module which is not derived from or based on this library.? If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so.? If you do not wish to do so, delete this exception statement from your version.
diff --git a/aggregates/jetty-all/src/main/resources/META-INF/javax.transaction-api-LICENSE.txt b/aggregates/jetty-all/src/main/resources/META-INF/javax.transaction-api-LICENSE.txt
new file mode 100644
index 0000000..a0ccc93
--- /dev/null
+++ b/aggregates/jetty-all/src/main/resources/META-INF/javax.transaction-api-LICENSE.txt
@@ -0,0 +1,263 @@
+COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
+
+1. Definitions.
+
+   1.1. Contributor. means each individual or entity that creates or contributes to the creation of Modifications.
+
+   1.2. Contributor Version. means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor.
+
+   1.3. Covered Software. means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof.
+
+   1.4. Executable. means the Covered Software in any form other than Source Code.
+
+   1.5. Initial Developer. means the individual or entity that first makes Original Software available under this License.
+
+   1.6. Larger Work. means a work which combines Covered Software or portions thereof with code not governed by the terms of this License.
+
+   1.7. License. means this document.
+
+   1.8. Licensable. means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.
+
+   1.9. Modifications. means the Source Code and Executable form of any of the following:
+
+        A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications;
+
+        B. Any new file that contains any part of the Original Software or previous Modification; or
+
+        C. Any new file that is contributed or otherwise made available under the terms of this License.
+
+   1.10. Original Software. means the Source Code and Executable form of computer software code that is originally released under this License.
+
+   1.11. Patent Claims. means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
+
+   1.12. Source Code. means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code.
+
+   1.13. You. (or .Your.) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, .You. includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, .control. means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.
+
+2. License Grants.
+
+      2.1. The Initial Developer Grant.
+
+      Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license:
+
+         (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and
+
+         (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof).
+
+        (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License.
+
+        (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices.
+
+    2.2. Contributor Grant.
+
+    Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:
+
+        (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and
+
+        (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
+
+        (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party.
+
+        (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor.
+
+3. Distribution Obligations.
+
+      3.1. Availability of Source Code.
+      Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange.
+
+      3.2. Modifications.
+      The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License.
+
+      3.3. Required Notices.
+      You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer.
+
+      3.4. Application of Additional Terms.
+      You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients. rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
+
+      3.5. Distribution of Executable Versions.
+      You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient.s rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.
+
+      3.6. Larger Works.
+      You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software.
+
+4. Versions of the License.
+
+      4.1. New Versions.
+      Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License.
+
+      4.2. Effect of New Versions.
+      You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward.
+
+      4.3. Modified Versions.
+      When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License.
+
+5. DISCLAIMER OF WARRANTY.
+
+   COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN .AS IS. BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+6. TERMINATION.
+
+      6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
+
+      6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as .Participant.) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant.
+
+      6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination.
+
+7. LIMITATION OF LIABILITY.
+
+   UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY.S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+8. U.S. GOVERNMENT END USERS.
+
+   The Covered Software is a .commercial item,. as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of .commercial computer software. (as that term is defined at 48 C.F.R. ? 252.227-7014(a)(1)) and .commercial computer software documentation. as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License.
+
+9. MISCELLANEOUS.
+
+   This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction.s conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys. fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software.
+
+10. RESPONSIBILITY FOR CLAIMS.
+
+   As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
+
+   NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)
+
+   The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California.
+
+
+The GNU General Public License (GPL) Version 2, June 1991
+
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification follow.
+
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+
+   a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
+
+   b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
+
+   c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+
+3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
+
+   a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+
+   b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+
+   c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
+
+   One line to give the program's name and a brief idea of what it does.
+
+   Copyright (C)
+
+   This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
+
+   Gnomovision version 69, Copyright (C) year name of author
+   Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
+
+   Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+   signature of Ty Coon, 1 April 1989
+   Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
+
+
+"CLASSPATH" EXCEPTION TO THE GPL VERSION 2
+
+Certain source files distributed by Sun Microsystems, Inc. are subject to the following clarification and special exception to the GPL Version 2, but only where Sun has expressly included in the particular source file's header the words
+
+"Sun designates this particular file as subject to the "Classpath" exception as provided by Sun in the License file that accompanied this code."
+
+Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License Version 2 cover the whole combination.
+
+As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module.? An independent module is a module which is not derived from or based on this library.? If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so.? If you do not wish to do so, delete this exception statement from your version.
diff --git a/aggregates/jetty-websocket-all/pom.xml b/aggregates/jetty-websocket-all/pom.xml
index 26138ee..3c9c268 100644
--- a/aggregates/jetty-websocket-all/pom.xml
+++ b/aggregates/jetty-websocket-all/pom.xml
@@ -24,7 +24,7 @@
             </goals>
             <configuration>
               <excludes>**/MANIFEST.MF</excludes>
-              <excludeGroupIds>org.slf4j,org.eclipse.jetty.orbit,org.mortbay.jetty.npn</excludeGroupIds>
+              <excludeGroupIds>org.slf4j,org.eclipse.jetty.orbit,org.mortbay.jetty.alpn</excludeGroupIds>
               <outputDirectory>${project.build.directory}/classes</outputDirectory>
               <overWriteReleases>false</overWriteReleases>
               <overWriteSnapshots>true</overWriteSnapshots>
@@ -42,7 +42,7 @@
               <excludes>META-INF/**,**/Servlet3Continuation*,**/Jetty6Continuation*</excludes>
               <includeGroupIds>org.eclipse.jetty,org.eclipse.jetty.websocket</includeGroupIds>
               <excludeArtifactIds>javax</excludeArtifactIds>
-              <excludeGroupIds>javax,org.eclipse.jetty.orbit,org.mortbay.jetty.npn</excludeGroupIds>
+              <excludeGroupIds>javax,org.eclipse.jetty.orbit,org.mortbay.jetty.alpn</excludeGroupIds>
               <outputDirectory>${project.build.directory}/sources</outputDirectory>
               <overWriteReleases>true</overWriteReleases>
               <overWriteSnapshots>true</overWriteSnapshots>
diff --git a/apache-jsp/pom.xml b/apache-jsp/pom.xml
index 073700b..6b519c1 100644
--- a/apache-jsp/pom.xml
+++ b/apache-jsp/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>apache-jsp</artifactId>
@@ -18,12 +18,6 @@
         <groupId>org.apache.felix</groupId>
         <artifactId>maven-bundle-plugin</artifactId>
         <extensions>true</extensions>
-        <executions>
-          <execution>
-            <id>generate-manifest</id>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
             <configuration>
               <instructions>
                 <Bundle-Description>Jetty-specific ServletContainerInitializer for Jasper</Bundle-Description>
@@ -35,8 +29,6 @@
                 <_nouses>true</_nouses>
               </instructions>
             </configuration>
-          </execution>
-        </executions>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
@@ -61,23 +53,6 @@
           </archive>
         </configuration>
       </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
     </plugins>
   </build>
 
@@ -113,8 +88,8 @@
 
     <!-- Eclipse Java Compiler (for JSP Compilation) -->
     <dependency>
-      <groupId>org.eclipse.jetty.orbit</groupId>
-      <artifactId>org.eclipse.jdt.core</artifactId>
+      <groupId>org.eclipse.jdt.core.compiler</groupId>
+      <artifactId>ecj</artifactId>
     </dependency>
   </dependencies>
 </project>
diff --git a/apache-jsp/src/main/config/modules/apache-jsp.mod b/apache-jsp/src/main/config/modules/apache-jsp.mod
new file mode 100644
index 0000000..5123670
--- /dev/null
+++ b/apache-jsp/src/main/config/modules/apache-jsp.mod
@@ -0,0 +1,10 @@
+#
+# Apache JSP Module
+#
+
+[name]
+apache-jsp
+
+[lib]
+lib/apache-jsp/*.jar
+
diff --git a/apache-jsp/src/main/config/modules/jsp-impl/apache-jsp.mod b/apache-jsp/src/main/config/modules/jsp-impl/apache-jsp.mod
deleted file mode 100644
index aed547c..0000000
--- a/apache-jsp/src/main/config/modules/jsp-impl/apache-jsp.mod
+++ /dev/null
@@ -1,10 +0,0 @@
-#
-# Apache JSP Module
-#
-
-[name]
-jsp-impl
-
-[lib]
-lib/apache-jsp/*.jar
-
diff --git a/apache-jsp/src/main/java/org/eclipse/jetty/apache/jsp/JettyJasperInitializer.java b/apache-jsp/src/main/java/org/eclipse/jetty/apache/jsp/JettyJasperInitializer.java
index 500cd35..2541845 100644
--- a/apache-jsp/src/main/java/org/eclipse/jetty/apache/jsp/JettyJasperInitializer.java
+++ b/apache-jsp/src/main/java/org/eclipse/jetty/apache/jsp/JettyJasperInitializer.java
@@ -35,7 +35,6 @@
 
 /**
  * JettyJasperInitializer
- *
  */
 public class JettyJasperInitializer extends JasperInitializer
 {
@@ -91,8 +90,6 @@
     /**
      * Make a TldScanner, and prefeed it the tlds that have already been discovered in jar files
      * by the MetaInfConfiguration.
-     * 
-     * @see org.apache.jasper.servlet.JasperInitializer#prepareScanner(javax.servlet.ServletContext, boolean, boolean, boolean)
      */
     @Override
     public TldScanner newTldScanner(ServletContext context, boolean namespaceAware, boolean validate, boolean blockExternal)
diff --git a/apache-jstl/pom.xml b/apache-jstl/pom.xml
index 61902c3..33ccb43 100644
--- a/apache-jstl/pom.xml
+++ b/apache-jstl/pom.xml
@@ -2,33 +2,27 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>apache-jstl</artifactId>
   <name>Apache :: JSTL module</name>
   <url>http://tomcat.apache.org/taglibs/standard/</url>
   <packaging>jar</packaging>
+  <properties>
+   <bundle-symbolic-name>${project.groupId}.apache.jstl</bundle-symbolic-name>
+  </properties>
 
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-surefire-plugin</artifactId>
+          <configuration>
+             <useSystemClassLoader>false</useSystemClassLoader>
+          </configuration>
       </plugin>
+
     </plugins>
   </build>
 
@@ -44,6 +38,34 @@
        <groupId>org.apache.taglibs</groupId>
        <artifactId>taglibs-standard-impl</artifactId>
     </dependency>
+    
+    <dependency>
+      <groupId>org.eclipse.jetty.toolchain</groupId>
+      <artifactId>jetty-test-helper</artifactId>
+       <scope>test</scope>
+    </dependency>
+    
+    <dependency>
+       <groupId>org.eclipse.jetty</groupId>
+       <artifactId>apache-jsp</artifactId>
+       <version>${project.version}</version>
+       <scope>test</scope>
+    </dependency>
+
+    <dependency>
+       <groupId>org.eclipse.jetty</groupId>
+       <artifactId>jetty-annotations</artifactId>
+       <version>${project.version}</version>
+       <scope>test</scope>
+    </dependency>
+    
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-webapp</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+
   </dependencies>
 
 </project>
diff --git a/apache-jstl/src/main/config/modules/apache-jstl.mod b/apache-jstl/src/main/config/modules/apache-jstl.mod
new file mode 100644
index 0000000..e4a9001
--- /dev/null
+++ b/apache-jstl/src/main/config/modules/apache-jstl.mod
@@ -0,0 +1,9 @@
+#
+# Apache JSTL 
+#
+
+[name]
+apache-jstl
+
+[lib]
+lib/apache-jstl/*.jar
diff --git a/apache-jstl/src/main/config/modules/jsp-impl/apache-jstl.mod b/apache-jstl/src/main/config/modules/jsp-impl/apache-jstl.mod
deleted file mode 100644
index 804b191..0000000
--- a/apache-jstl/src/main/config/modules/jsp-impl/apache-jstl.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Apache JSTL 
-#
-[name]
-jstl-impl
-
-[lib]
-lib/apache-jstl/*.jar
diff --git a/apache-jstl/src/test/java/org/eclipse/jetty/jstl/JspConfig.java b/apache-jstl/src/test/java/org/eclipse/jetty/jstl/JspConfig.java
new file mode 100644
index 0000000..df145af
--- /dev/null
+++ b/apache-jstl/src/test/java/org/eclipse/jetty/jstl/JspConfig.java
@@ -0,0 +1,40 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.jstl;
+
+import java.io.File;
+import java.net.URI;
+
+import org.eclipse.jetty.webapp.WebAppContext;
+
+/**
+ * Attempt at collecting up all of the JSP specific configuration bits and pieces into a single place
+ * for WebAppContext users to utilize.
+ */
+public class JspConfig
+{
+    public static void init(WebAppContext context, URI baseUri, File scratchDir)
+    {
+        context.setAttribute("javax.servlet.context.tempdir", scratchDir);
+        context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
+ ".*/javax.servlet-[^/]*\\.jar$|.*/servlet-api-[^/]*\\.jar$|.*javax.servlet.jsp.jstl-[^/]*\\.jar|.*taglibs-standard-impl-.*\\.jar");
+        context.setWar(baseUri.toASCIIString());
+        context.setResourceBase(baseUri.toASCIIString());
+    }
+}
diff --git a/apache-jstl/src/test/java/org/eclipse/jetty/jstl/JstlTest.java b/apache-jstl/src/test/java/org/eclipse/jetty/jstl/JstlTest.java
new file mode 100644
index 0000000..1f39e8a
--- /dev/null
+++ b/apache-jstl/src/test/java/org/eclipse/jetty/jstl/JstlTest.java
@@ -0,0 +1,134 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.jstl;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+
+import javax.servlet.jsp.JspException;
+
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.toolchain.test.FS;
+import org.eclipse.jetty.toolchain.test.JAR;
+import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+import org.eclipse.jetty.toolchain.test.SimpleRequest;
+import org.eclipse.jetty.webapp.Configuration;
+import org.eclipse.jetty.webapp.WebAppContext;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class JstlTest
+{
+    private static Server server;
+    private static URI baseUri;
+    
+    @BeforeClass
+    public static void startServer() throws Exception
+    {
+        // Setup Server
+        server = new Server();
+        ServerConnector connector = new ServerConnector(server);
+        connector.setPort(0);
+        server.addConnector(connector);
+        
+        // Setup WebAppContext
+        File testWebAppDir = MavenTestingUtils.getProjectDir("src/test/webapp");
+        
+        // Prepare WebApp libs
+        File libDir = new File(testWebAppDir, "WEB-INF/lib");
+        FS.ensureDirExists(libDir);
+        File testTagLibDir = MavenTestingUtils.getProjectDir("src/test/taglibjar");
+        JAR.create(testTagLibDir,new File(libDir, "testtaglib.jar"));
+        
+        // Configure WebAppContext
+ 
+        Configuration.ClassList classlist = Configuration.ClassList
+                .setServerDefault(server);
+
+        classlist.addBefore(
+                "org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
+                "org.eclipse.jetty.annotations.AnnotationConfiguration");
+        
+        WebAppContext context = new WebAppContext();
+        context.setContextPath("/");
+        
+        File scratchDir = MavenTestingUtils.getTargetFile("tests/" + JstlTest.class.getSimpleName() + "-scratch");
+        FS.ensureEmpty(scratchDir);
+        JspConfig.init(context,testWebAppDir.toURI(),scratchDir);
+        
+        server.setHandler(context);
+        
+        // Start Server
+        server.start();
+        
+        // Figure out Base URI
+        String host = connector.getHost();
+        if (host == null)
+        {
+            host = "localhost";
+        }
+        int port = connector.getLocalPort();
+        baseUri = new URI(String.format("http://%s:%d/",host,port));
+    }
+    
+    @AfterClass
+    public static void stopServer() throws Exception
+    {
+        server.stop();
+    }
+    
+    @Test
+    public void testUrlsBasic() throws IOException
+    {
+        SimpleRequest req = new SimpleRequest(baseUri);
+        String resp = req.getString("/urls.jsp");
+        assertThat("Response should be JSP processed", resp, not(containsString("<c:url")));
+        assertThat("Response", resp, containsString("[c:url value] = /ref.jsp;jsessionid="));
+        assertThat("Response", resp, containsString("[c:url param] = ref.jsp;key=value;jsessionid="));
+    }
+    
+    @Test
+    public void testCatchBasic() throws IOException
+    {
+        SimpleRequest req = new SimpleRequest(baseUri);
+        String resp = req.getString("/catch-basic.jsp");
+        assertThat("Response should be JSP processed", resp, not(containsString("<c:catch")));
+        assertThat("Response", resp, containsString("[c:catch] exception : " + JspException.class.getName()));
+        assertThat("Response", resp, containsString("[c:catch] exception.message : In &lt;parseNumber&gt;"));
+    }
+    
+    @Test
+    @Ignore
+    public void testCatchTaglib() throws IOException
+    {
+        SimpleRequest req = new SimpleRequest(baseUri);
+        String resp = req.getString("/catch-taglib.jsp");
+        System.out.println("resp = " + resp);
+        assertThat("Response should be JSP processed", resp, not(containsString("<c:catch>")));
+        assertThat("Response should be JSP processed", resp, not(containsString("<jtest:errorhandler>")));
+        assertThat("Response", resp, not(containsString("[jtest:errorhandler] exception is null")));
+    }
+}
diff --git a/apache-jstl/src/test/taglibjar/META-INF/etag.tld b/apache-jstl/src/test/taglibjar/META-INF/etag.tld
new file mode 100644
index 0000000..de59ff0
--- /dev/null
+++ b/apache-jstl/src/test/taglibjar/META-INF/etag.tld
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
+  version="2.0">
+
+  <description>eclipse jetty test taglib</description>
+  <tlib-version>1.0</tlib-version>
+
+  <short-name>jtest</short-name>
+  <uri>org.eclipse.jetty.jstl.jtest</uri>
+
+  <tag-file>
+    <name>errorhandler</name>
+    <path>/META-INF/tags/errorhandler.tag</path>
+  </tag-file>
+</taglib>
\ No newline at end of file
diff --git a/apache-jstl/src/test/taglibjar/META-INF/tags/errorhandler.tag b/apache-jstl/src/test/taglibjar/META-INF/tags/errorhandler.tag
new file mode 100644
index 0000000..ddd44dd
--- /dev/null
+++ b/apache-jstl/src/test/taglibjar/META-INF/tags/errorhandler.tag
@@ -0,0 +1,12 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+
+<c:catch var="tossable">
+  <jsp:doBody />
+</c:catch>
+<c:if test="${tossable != null}">
+[jtest:errorhandler] exception : ${tossable}
+[jtest:errorhandler] exception.message : ${tossable.message}
+</c:if>
+<c:if test="${tossable == null}">
+[jtest:errorhandler] exception is null
+</c:if>
diff --git a/apache-jstl/src/test/webapp/WEB-INF/web.xml b/apache-jstl/src/test/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..b05e490
--- /dev/null
+++ b/apache-jstl/src/test/webapp/WEB-INF/web.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+         version="3.1">
+  <description>Test webapp for JSTL</description>
+</web-app>
\ No newline at end of file
diff --git a/apache-jstl/src/test/webapp/catch-basic.jsp b/apache-jstl/src/test/webapp/catch-basic.jsp
new file mode 100644
index 0000000..06e2bcf
--- /dev/null
+++ b/apache-jstl/src/test/webapp/catch-basic.jsp
@@ -0,0 +1,16 @@
+<%@ page contentType="text/plain; charset=UTF-8" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
+Title: JSTL c:catch test
+
+<c:catch var ="catchException">
+  <fmt:parseNumber var="parsedNum" value="aaa" />
+</c:catch>
+
+<c:if test = "${catchException != null}">
+[c:catch] exception : ${catchException}
+[c:catch] exception.message : ${catchException.message}
+</c:if>
+<c:if test = "${catchException == null}">
+[c:catch] exception is null
+</c:if>
diff --git a/apache-jstl/src/test/webapp/catch-taglib.jsp b/apache-jstl/src/test/webapp/catch-taglib.jsp
new file mode 100644
index 0000000..28f7488
--- /dev/null
+++ b/apache-jstl/src/test/webapp/catch-taglib.jsp
@@ -0,0 +1,11 @@
+<%@ page contentType="text/plain; charset=UTF-8" %>
+<%@ taglib uri="org.eclipse.jetty.jstl.jtest" prefix="jtest" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
+Title: JSTL c:catch test
+
+<jtest:errorhandler>
+  <fmt:parseNumber var="parsedNum" value="aaa" />
+</jtest:errorhandler>
+
+parsedNum = <c:out value="${parsedNum}"/>
\ No newline at end of file
diff --git a/apache-jstl/src/test/webapp/ref.jsp b/apache-jstl/src/test/webapp/ref.jsp
new file mode 100644
index 0000000..0debf75
--- /dev/null
+++ b/apache-jstl/src/test/webapp/ref.jsp
@@ -0,0 +1,2 @@
+<%@ page contentType="text/plain; charset=UTF-8" %>
+Reference Page: No useful content here, just used for other tests
\ No newline at end of file
diff --git a/apache-jstl/src/test/webapp/urls.jsp b/apache-jstl/src/test/webapp/urls.jsp
new file mode 100644
index 0000000..bc18e9a
--- /dev/null
+++ b/apache-jstl/src/test/webapp/urls.jsp
@@ -0,0 +1,6 @@
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ page contentType="text/plain; charset=UTF-8" %>
+Title: JSTL c:url Tests
+[c:url value] = <c:url value="/ref.jsp" />
+<c:set var="foo" value="ref.jsp;key=value"/>
+[c:url param] = <c:url value="${foo}"><c:param name="noframe" value="true"/></c:url>
diff --git a/dists/jetty-deb/pom.xml b/dists/jetty-deb/pom.xml
deleted file mode 100644
index 9ce00e1..0000000
--- a/dists/jetty-deb/pom.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-<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.eclipse.jetty.dist</groupId>
-    <artifactId>dist-parent</artifactId>
-    <version>9.0.0-SNAPSHOT</version>
-  </parent>
-  <artifactId>jetty-deb</artifactId>
-  <name>Jetty :: Unix Distributions :: Debian</name>
-  <packaging>deb</packaging>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.mortbay.jetty.toolchain</groupId>
-        <artifactId>unix-maven-plugin</artifactId>
-        <version>1.0-alpha-6.1</version>
-        <extensions>true</extensions>
-        <configuration>
-          <contact>Jetty Project</contact>
-          <contactEmail>jetty-dev@eclipse.org</contactEmail>
-          <name>Core Jetty ${project.version} Distribution</name>
-          <description>Jetty provides an Web server and javax.servlet
-            container, plus support for Web Sockets, OSGi, JMX, JNDI,
-            JASPI, AJP and many other integrations. These components are
-            open source and available for commercial use and
-            distribution.</description>
-          <deb>
-            <useFakeroot>false</useFakeroot>
-            <priority>optional</priority>
-            <section>java</section>
-          </deb>
-           <packages>
-            <package>
-              <id>jetty-server</id>
-              <assembly>
-                <extractArtifact>
-                  <artifact>org.eclipse.jetty:jetty-distribution:zip</artifact>
-                  <to>/usr/share/jetty9</to>
-                  <pattern>/jetty-distribution-${project.version}(.*)</pattern>
-                  <replacement>$1</replacement>
-                  <excludes>
-                    <exclude>jetty-distribution-*/javadoc</exclude>
-                    <exclude>jetty-distribution-*/javadoc/**</exclude>
-                    <exclude>jetty-distribution-*/logs/**</exclude>
-                    <exclude>jetty-distribution-*/bin/**</exclude>
-                    <exclude>jetty-distribution-*/etc/**</exclude>
-                    <exclude>jetty-distribution-*/webapps/**</exclude>                  
-                    <exclude>jetty-distribution-*/*.html</exclude>
-                    <exclude>jetty-distribution-*/*.txt</exclude>             
-                  </excludes>
-                 </extractArtifact>
-                 <extractArtifact>
-                  <artifact>org.eclipse.jetty:jetty-distribution:zip</artifact>
-                  <to>/usr/share/doc/jetty9</to>
-                  <pattern>/jetty-distribution-${project.version}(.*)</pattern>
-                  <replacement>$1</replacement>
-                  <excludes>
-                    <include>jetty-distribution-*/*.html</include>
-                    <include>jetty-distribution-*/*.txt</include> 
-                    <exclude>jetty-distribution-*/**</exclude>           
-                  </excludes>
-                 </extractArtifact>
-                 <extractArtifact>
-                  <artifact>org.eclipse.jetty:jetty-distribution:zip</artifact>
-                  <to>/etc/jetty9</to>
-                  <pattern>/jetty-distribution-${project.version}(.*)</pattern>
-                  <replacement>$1</replacement>
-                  <excludes>
-                    <include>jetty-distribution-*/etc/**</include>
-                    <!-- exclude>jetty-distribution-*/**</exclude-->           
-                  </excludes>
-                 </extractArtifact>
-              </assembly>
-            </package>
-            <package>
-              <id>jetty-test-webapp</id>
-              <classifier>test-webapp</classifier>
-              <assembly>
-                <extractArtifact>
-                  <artifact>org.eclipse.jetty:jetty-distribution:zip</artifact>
-                  <to>/var/lib/jetty9/webapps</to>
-                  <pattern>/jetty-distribution-${project.version}(.*)</pattern>
-                  <replacement>$1</replacement>
-                  <includes>
-                    <include>jetty-distribution-*/webapps/**</include>
-                  </includes>
-                </extractArtifact>
-              </assembly>
-            </package>
-          </packages>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-  <dependencies>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-distribution</artifactId>
-      <version>${project.version}</version>
-      <type>zip</type>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/dists/jetty-deb/src/main/unix/scripts/postinst b/dists/jetty-deb/src/main/unix/scripts/postinst
deleted file mode 100644
index f6d7813..0000000
--- a/dists/jetty-deb/src/main/unix/scripts/postinst
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-
-LOG_DIR=/var/lib/jetty9/logs
-WEBAPP_DIR=/var/lib/jetty9/webapps
-
-# copy the jetty start script into place
-cp /usr/share/jetty9/bin/jetty.sh /etc/init.d/jetty
-
-# make it generally executable
-chmod 755 /etc/init.d/jetty
-
-# ensure we have a logging directory
-if [ ! -d "$LOG_DIR" ]; then
-  mkdir $LOG_DIR
-fi
-
-# ensure we have a webapps directory
-if [ ! -d "$WEBAPP_DIR" ]; then
-  mkdir $WEBAPP_DIR
-fi
diff --git a/dists/jetty-deb/src/main/unix/scripts/postrm b/dists/jetty-deb/src/main/unix/scripts/postrm
deleted file mode 100644
index 1f7f3e3..0000000
--- a/dists/jetty-deb/src/main/unix/scripts/postrm
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/bin/bash
-
-#rm -f /etc/init.d/jetty
-
- case "$1" in
-  purge)
- [...]
-    # find first and last SYSTEM_UID numbers
-    for LINE in `grep SYSTEM_UID /etc/adduser.conf | grep -v "^#"`; do
-       case $LINE in
-          FIRST_SYSTEM_UID*)
-            FIST_SYSTEM_UID=`echo $LINE | cut -f2 -d '='`
-            ;;
-          LAST_SYSTEM_UID*)
-            LAST_SYSTEM_UID=`echo $LINE | cut -f2 -d '='`
-            ;;
-          *)
-            ;;
-          esac
-    done
-    # Remove system account if necessary
-    CREATEDUSER="jetty"
-    if [ -n "$FIST_SYSTEM_UID" ] && [ -n "$LAST_SYSTEM_UID" ]; then
-     if USERID=`getent passwd $CREATEDUSER | cut -f 3 -d ':'`; then
-       if [ -n "$USERID" ]; then
-         if [ "$FIST_SYSTEM_UID" -le "$USERID" ] && \
-            [ "$USERID" -le "$LAST_SYSTEM_UID" ]; then
-               echo -n "Removing $CREATEDUSER system user.."
-               deluser --quiet $CREATEDUSER || true
-               echo "..done"
-         fi
-       fi
-     fi
-   fi
-   # Remove system group if necessary
-   CREATEDGROUP="jetty"
-   FIRST_USER_GID=`grep ^USERS_GID /etc/adduser.conf | cut -f2 -d '='`
-   if [ -n "$FIST_USER_GID" ] then
-     if GROUPGID=`getent group $CREATEDGROUP | cut -f 3 -d ':'`; then
-       if [ -n "$GROUPGID" ]; then
-         if [ "$FIST_USER_GID" -gt "$GROUPGID" ]; then
-           echo -n "Removing $CREATEDGROUP group.."
-           delgroup --only-if-empty $CREATEDGROUP || true
-           echo "..done"
-         fi
-       fi
-     fi
-   fi
\ No newline at end of file
diff --git a/dists/jetty-deb/src/main/unix/scripts/preinst b/dists/jetty-deb/src/main/unix/scripts/preinst
deleted file mode 100644
index 423b675..0000000
--- a/dists/jetty-deb/src/main/unix/scripts/preinst
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/bin/bash
-
- case "$1" in
-   install|upgrade)
- 
-   # If the package has default file it could be sourced, so that
-   # the local admin can overwrite the defaults
- 
-   [ -f "/etc/default/jetty9" ] && . /etc/default/jetty9
- 
-   # Sane defaults:
- 
-   [ -z "$SERVER_HOME" ] && SERVER_HOME=/usr/share/jetty9
-   [ -z "$SERVER_USER" ] && SERVER_USER=jetty
-   [ -z "$SERVER_NAME" ] && SERVER_NAME="Jetty-9 Http and Servlet Engine"
-   [ -z "$SERVER_GROUP" ] && SERVER_GROUP=jetty
- 
-   # Groups that the user will be added to, if undefined, then none.
-   ADDGROUP=""
- 
-   # create user to avoid running server as root
-   # 1. create group if not existing
-   if ! getent group | grep -q "^$SERVER_GROUP:" ; then
-      echo -n "Adding group $SERVER_GROUP.."
-      addgroup --quiet --system $SERVER_GROUP 2>/dev/null ||true
-      echo "..done"
-   fi
-   # 2. create homedir if not existing
-   test -d $SERVER_HOME || mkdir $SERVER_HOME
-   # 3. create user if not existing
-   if ! getent passwd | grep -q "^$SERVER_USER:"; then
-     echo -n "Adding system user $SERVER_USER.."
-     adduser --quiet \
-             --system \
-             --ingroup $SERVER_GROUP \
-             --no-create-home \
-             --disabled-password \
-             $SERVER_USER 2>/dev/null || true
-     echo "..done"
-   fi
-   # 4. adjust passwd entry
-   usermod -c "$SERVER_NAME" \
-           -d $SERVER_HOME   \
-           -g $SERVER_GROUP  \
-              $SERVER_USER
-   # 5. adjust file and directory permissions
-   if ! dpkg-statoverride --list $SERVER_HOME >/dev/null
-   then
-       chown -R $SERVER_USER:$SERVER_GROUP $SERVER_HOME
-       chmod u=rwx,g=rxs,o= $SERVER_HOME
-   fi
-   # 6. Add the user to the ADDGROUP group
-   if test -n $ADDGROUP
-   then
-       if ! groups $SERVER_USER | cut -d: -f2 | \
-          grep -qw $ADDGROUP; then
-            adduser $SERVER_USER $ADDGROUP
-       fi
-   fi
-   ;;
-   configure)
\ No newline at end of file
diff --git a/dists/pom.xml b/dists/pom.xml
deleted file mode 100644
index c6ad38dc..0000000
--- a/dists/pom.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<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/xsd/maven-4.0.0.xsd">
-	<parent>
-		<artifactId>jetty-project</artifactId>
-		<groupId>org.eclipse.jetty</groupId>
-		<version>9.0.0-SNAPSHOT</version>
-	</parent>
-	<modelVersion>4.0.0</modelVersion>
-	<groupId>org.eclipse.jetty.dist</groupId>
-	<artifactId>dist-parent</artifactId>
-	<packaging>pom</packaging>
-	<name>Jetty :: Distribution :: Parent</name>
-	<profiles>
-	  <profile>
-	    <id>linux-packaging</id>
-	    <!-- activation>
-	      <os>
-	        <name>Linux</name>
-	      </os>
-	    </activation-->
-	    <modules>
-	      <module>jetty-deb</module>
-	      <!--module>jetty-rpm</module-->
-	    </modules>
-	   </profile>
-	</profiles>
-</project>
diff --git a/examples/async-rest/async-rest-jar/pom.xml b/examples/async-rest/async-rest-jar/pom.xml
index 545442a..f48e874 100644
--- a/examples/async-rest/async-rest-jar/pom.xml
+++ b/examples/async-rest/async-rest-jar/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>example-async-rest</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+       <version>9.3.6-SNAPSHOT</version>
   </parent>  
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.eclipse.jetty.example-async-rest</groupId>
@@ -10,6 +10,9 @@
   <packaging>jar</packaging>
   <name>Example Async Rest :: Jar</name>
   <url>http://www.eclipse.org/jetty</url>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.examples.asyc.rest</bundle-symbolic-name>
+  </properties>
   <dependencies>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
diff --git a/examples/async-rest/async-rest-webapp/pom.xml b/examples/async-rest/async-rest-webapp/pom.xml
index e94b85c..bb87735 100644
--- a/examples/async-rest/async-rest-webapp/pom.xml
+++ b/examples/async-rest/async-rest-webapp/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>example-async-rest</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>  
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.eclipse.jetty.example-async-rest</groupId>
diff --git a/examples/async-rest/async-rest-webapp/src/main/webapp/WEB-INF/jetty-web.xml b/examples/async-rest/async-rest-webapp/src/main/webapp/WEB-INF/jetty-web.xml
index 9376677..c15dc38 100644
--- a/examples/async-rest/async-rest-webapp/src/main/webapp/WEB-INF/jetty-web.xml
+++ b/examples/async-rest/async-rest-webapp/src/main/webapp/WEB-INF/jetty-web.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!--
 This is the jetty specific web application configuration file.  When starting
diff --git a/examples/async-rest/async-rest-webapp/src/test/java/org/eclipse/jetty/example/asyncrest/DemoServer.java b/examples/async-rest/async-rest-webapp/src/test/java/org/eclipse/jetty/example/asyncrest/DemoServer.java
index c6172da..91b08bf 100644
--- a/examples/async-rest/async-rest-webapp/src/test/java/org/eclipse/jetty/example/asyncrest/DemoServer.java
+++ b/examples/async-rest/async-rest-webapp/src/test/java/org/eclipse/jetty/example/asyncrest/DemoServer.java
@@ -28,7 +28,7 @@
     {
         String jetty_home = System.getProperty("jetty.home",".");
 
-        Server server = new Server(Integer.getInteger("jetty.port",8080).intValue());
+        Server server = new Server(Integer.getInteger("jetty.http.port",8080).intValue());
                 
         WebAppContext webapp = new WebAppContext();
         webapp.setContextPath("/");
diff --git a/examples/async-rest/pom.xml b/examples/async-rest/pom.xml
index 104b004..82376f1 100644
--- a/examples/async-rest/pom.xml
+++ b/examples/async-rest/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty.examples</groupId>
     <artifactId>examples-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>  
   <modelVersion>4.0.0</modelVersion>
diff --git a/examples/embedded/pom.xml b/examples/embedded/pom.xml
index d912417..acec58f 100644
--- a/examples/embedded/pom.xml
+++ b/examples/embedded/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty.examples</groupId>
     <artifactId>examples-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
@@ -11,6 +11,9 @@
   <name>Example :: Jetty Embedded</name>
   <description>Jetty Embedded Examples</description>
   <url>http://www.eclipse.org/jetty</url>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.embedded</bundle-symbolic-name>
+  </properties>
   <dependencies>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
@@ -53,8 +56,18 @@
       <version>${project.version}</version>
     </dependency>
     <dependency>
-      <groupId>org.eclipse.jetty.spdy</groupId>
-      <artifactId>spdy-http-server</artifactId>
+      <groupId>org.eclipse.jetty.http2</groupId>
+      <artifactId>http2-server</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.alpn</groupId>
+      <artifactId>alpn-api</artifactId>
+      <version>${alpn.api.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-alpn-server</artifactId>
       <version>${project.version}</version>
     </dependency>
     <dependency>
@@ -105,5 +118,12 @@
       <artifactId>jetty-test-helper</artifactId>
       <!-- scope>test</scope-->
     </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-http</artifactId>
+      <version>${project.version}</version>
+      <classifier>tests</classifier>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 </project>
diff --git a/examples/embedded/src/main/java/HelloWorld.java b/examples/embedded/src/main/java/HelloWorld.java
deleted file mode 100644
index 8b1c231..0000000
--- a/examples/embedded/src/main/java/HelloWorld.java
+++ /dev/null
@@ -1,59 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-
-public class HelloWorld extends AbstractHandler
-{
-    @Override
-    public void handle( String target,
-                        Request baseRequest,
-                        HttpServletRequest request,
-                        HttpServletResponse response ) throws IOException,
-                                                      ServletException
-    {
-        // Declare response encoding and types
-        response.setContentType("text/html; charset=utf-8");
-
-        // Declare response status code
-        response.setStatus(HttpServletResponse.SC_OK);
-
-        // Write back response
-        response.getWriter().println("<h1>Hello World</h1>");
-
-        // Inform jetty that this request has now been handled
-        baseRequest.setHandled(true);
-    }
-
-    public static void main( String[] args ) throws Exception
-    {
-        Server server = new Server(8080);
-        server.setHandler(new HelloWorld());
-
-        server.start();
-        server.join();
-    }
-}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FastFileServer.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FastFileServer.java
index 998ca40..730ded6 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FastFileServer.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FastFileServer.java
@@ -39,6 +39,8 @@
 import org.eclipse.jetty.server.handler.AbstractHandler;
 import org.eclipse.jetty.server.handler.DefaultHandler;
 import org.eclipse.jetty.server.handler.HandlerList;
+import org.eclipse.jetty.server.handler.ResourceHandler;
+import org.eclipse.jetty.servlet.DefaultServlet;
 import org.eclipse.jetty.util.Callback;
 import org.eclipse.jetty.util.URIUtil;
 import org.eclipse.jetty.util.resource.Resource;
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FileServer.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FileServer.java
index 18a90bf..fc0b03a 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FileServer.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/FileServer.java
@@ -23,6 +23,7 @@
 import org.eclipse.jetty.server.handler.DefaultHandler;
 import org.eclipse.jetty.server.handler.HandlerList;
 import org.eclipse.jetty.server.handler.ResourceHandler;
+import org.eclipse.jetty.server.handler.gzip.GzipHandler;
 
 /** 
  * Simple Jetty FileServer.
@@ -47,9 +48,11 @@
         resource_handler.setResourceBase(".");
 
         // Add the ResourceHandler to the server.
+        GzipHandler gzip = new GzipHandler();
+        server.setHandler(gzip);
         HandlerList handlers = new HandlerList();
         handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() });
-        server.setHandler(handlers);
+        gzip.setHandler(handlers);
 
         // Start things up! By using the server.join() the server thread will join with the current thread.
         // See "http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#join()" for more details.
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/HelloWorld.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/HelloWorld.java
new file mode 100644
index 0000000..0a6042d
--- /dev/null
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/HelloWorld.java
@@ -0,0 +1,61 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.embedded;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+
+public class HelloWorld extends AbstractHandler
+{
+    @Override
+    public void handle( String target,
+                        Request baseRequest,
+                        HttpServletRequest request,
+                        HttpServletResponse response ) throws IOException,
+                                                      ServletException
+    {
+        // Declare response encoding and types
+        response.setContentType("text/html; charset=utf-8");
+
+        // Declare response status code
+        response.setStatus(HttpServletResponse.SC_OK);
+
+        // Write back response
+        response.getWriter().println("<h1>Hello World</h1>");
+
+        // Inform jetty that this request has now been handled
+        baseRequest.setHandled(true);
+    }
+
+    public static void main( String[] args ) throws Exception
+    {
+        Server server = new Server(8080);
+        server.setHandler(new HelloWorld());
+
+        server.start();
+        server.join();
+    }
+}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/Http2Server.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/Http2Server.java
new file mode 100644
index 0000000..8d984bf
--- /dev/null
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/Http2Server.java
@@ -0,0 +1,187 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.embedded;
+
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.util.Date;
+import java.util.EnumSet;
+
+import javax.servlet.DispatcherType;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.eclipse.jetty.alpn.ALPN;
+import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
+import org.eclipse.jetty.http2.HTTP2Cipher;
+import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory;
+import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
+import org.eclipse.jetty.jmx.MBeanContainer;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.NegotiatingServerConnectionFactory;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.SecureRequestCustomizer;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.SslConnectionFactory;
+import org.eclipse.jetty.servlet.DefaultServlet;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.servlets.PushSessionCacheFilter;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+
+
+/* ------------------------------------------------------------ */
+/**
+ */
+public class Http2Server
+{
+    public static void main(String... args) throws Exception
+    {
+        Server server = new Server();
+
+        MBeanContainer mbContainer = new MBeanContainer(
+                ManagementFactory.getPlatformMBeanServer());
+        server.addBean(mbContainer);
+
+        ServletContextHandler context = new ServletContextHandler(server, "/",ServletContextHandler.SESSIONS);
+        context.setResourceBase("src/main/resources/docroot");
+        context.addFilter(PushSessionCacheFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST));
+        context.addFilter(PushedTilesFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST));
+        context.addServlet(new ServletHolder(servlet), "/test/*");
+        context.addServlet(DefaultServlet.class, "/").setInitParameter("maxCacheSize","81920");
+        server.setHandler(context);
+
+        // HTTP Configuration
+        HttpConfiguration http_config = new HttpConfiguration();
+        http_config.setSecureScheme("https");
+        http_config.setSecurePort(8443);
+        http_config.setSendXPoweredBy(true);
+        http_config.setSendServerVersion(true);
+
+        // HTTP Connector
+        ServerConnector http = new ServerConnector(server,new HttpConnectionFactory(http_config), new HTTP2CServerConnectionFactory(http_config));
+        http.setPort(8080);
+        server.addConnector(http);
+
+        // SSL Context Factory for HTTPS and HTTP/2
+        String jetty_distro = System.getProperty("jetty.distro","../../jetty-distribution/target/distribution");
+        SslContextFactory sslContextFactory = new SslContextFactory();
+        sslContextFactory.setKeyStorePath(jetty_distro + "/demo-base/etc/keystore");
+        sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
+        sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
+        sslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR);
+
+        // HTTPS Configuration
+        HttpConfiguration https_config = new HttpConfiguration(http_config);
+        https_config.addCustomizer(new SecureRequestCustomizer());
+
+        // HTTP/2 Connection Factory
+        HTTP2ServerConnectionFactory h2 = new HTTP2ServerConnectionFactory(https_config);
+
+        NegotiatingServerConnectionFactory.checkProtocolNegotiationAvailable();
+        ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory();
+        alpn.setDefaultProtocol(http.getDefaultProtocol());
+
+        // SSL Connection Factory
+        SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory,alpn.getProtocol());
+
+        // HTTP/2 Connector
+        ServerConnector http2Connector =
+            new ServerConnector(server,ssl,alpn,h2,new HttpConnectionFactory(https_config));
+        http2Connector.setPort(8443);
+        server.addConnector(http2Connector);
+
+        ALPN.debug=false;
+
+        server.start();
+        //server.dumpStdErr();
+        server.join();
+    }
+
+    public static class PushedTilesFilter implements Filter
+    {
+        @Override
+        public void init(FilterConfig filterConfig) throws ServletException
+        {
+        }
+
+        @Override
+        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
+        {
+            Request baseRequest = Request.getBaseRequest(request);
+
+            if (baseRequest.isPush() && baseRequest.getRequestURI().contains("tiles") )
+            {
+                String uri = baseRequest.getRequestURI().replace("tiles","pushed").substring(baseRequest.getContextPath().length());
+                request.getRequestDispatcher(uri).forward(request,response);
+                return;
+            }
+
+            chain.doFilter(request,response);
+        }
+
+        @Override
+        public void destroy()
+        {
+        }
+    };
+
+    static Servlet servlet = new HttpServlet()
+    {
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+        {
+            String code=request.getParameter("code");
+            if (code!=null)
+                response.setStatus(Integer.parseInt(code));
+
+            HttpSession session = request.getSession(true);
+            if (session.isNew())
+                response.addCookie(new Cookie("bigcookie",
+                "This is a test cookies that was created on "+new Date()+" and is used by the jetty http/2 test servlet."));
+            response.setHeader("Custom","Value");
+            response.setContentType("text/plain");
+            String content = "Hello from Jetty using "+request.getProtocol() +"\n";
+            content+="uri="+request.getRequestURI()+"\n";
+            content+="session="+session.getId()+(session.isNew()?"(New)\n":"\n");
+            content+="date="+new Date()+"\n";
+            
+            for (Cookie c : request.getCookies())
+                content+="cookie "+c.getName()+"="+c.getValue()+"\n";
+            
+            response.setContentLength(content.length());
+            response.getOutputStream().print(content);
+        }
+    };
+}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java
index efaef9d..3853444 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java
@@ -24,9 +24,12 @@
 
 import org.eclipse.jetty.deploy.DeploymentManager;
 import org.eclipse.jetty.deploy.PropertiesConfigurationManager;
+import org.eclipse.jetty.deploy.bindings.DebugListenerBinding;
 import org.eclipse.jetty.deploy.providers.WebAppProvider;
+import org.eclipse.jetty.http.HttpVersion;
 import org.eclipse.jetty.jmx.MBeanContainer;
 import org.eclipse.jetty.security.HashLoginService;
+import org.eclipse.jetty.server.DebugListener;
 import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.HttpConfiguration;
 import org.eclipse.jetty.server.HttpConnectionFactory;
@@ -128,10 +131,10 @@
         // === jetty-https.xml ===
         // SSL Context Factory
         SslContextFactory sslContextFactory = new SslContextFactory();
-        sslContextFactory.setKeyStorePath(jetty_home + "/etc/keystore");
+        sslContextFactory.setKeyStorePath(jetty_home + "/../../../jetty-server/src/test/config/etc/keystore");
         sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
         sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
-        sslContextFactory.setTrustStorePath(jetty_home + "/etc/keystore");
+        sslContextFactory.setTrustStorePath(jetty_home + "/../../../jetty-server/src/test/config/etc/keystore");
         sslContextFactory.setTrustStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
         sslContextFactory.setExcludeCipherSuites("SSL_RSA_WITH_DES_CBC_SHA",
                 "SSL_DHE_RSA_WITH_DES_CBC_SHA", "SSL_DHE_DSS_WITH_DES_CBC_SHA",
@@ -146,7 +149,7 @@
 
         // SSL Connector
         ServerConnector sslConnector = new ServerConnector(server,
-            new SslConnectionFactory(sslContextFactory,"http/1.1"),
+            new SslConnectionFactory(sslContextFactory,HttpVersion.HTTP_1_1.asString()),
             new HttpConnectionFactory(https_config));
         sslConnector.setPort(8443);
         server.addConnector(sslConnector);
@@ -154,6 +157,9 @@
 
         // === jetty-deploy.xml ===
         DeploymentManager deployer = new DeploymentManager();
+        DebugListener debug = new DebugListener(System.out,true,true,true);
+        server.addBean(debug);        
+        deployer.addLifeCycleBinding(new DebugListenerBinding(debug));
         deployer.setContexts(contexts);
         deployer.setContextAttribute(
                 "org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
@@ -210,9 +216,8 @@
         HashLoginService login = new HashLoginService();
         login.setName("Test Realm");
         login.setConfig(jetty_base + "/etc/realm.properties");
-        login.setRefreshInterval(0);
+        login.setHotReload(false);
         server.addBean(login);
-
         
         // Start the server
         server.start();
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyConnectors.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyConnectors.java
index e4bbf5e..34a12c0 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyConnectors.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyConnectors.java
@@ -21,6 +21,7 @@
 import java.io.File;
 import java.io.FileNotFoundException;
 
+import org.eclipse.jetty.http.HttpVersion;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.HttpConfiguration;
 import org.eclipse.jetty.server.HttpConnectionFactory;
@@ -42,7 +43,7 @@
         // to get access to a keystore that we use in many unit tests and should
         // probably be a direct path to your own keystore.
 
-        String jettyDistKeystore = "../../jetty-distribution/target/distribution/etc/keystore";
+        String jettyDistKeystore = "../../jetty-distribution/target/distribution/demo-base/etc/keystore";
         String keystorePath = System.getProperty(
                 "example.keystore", jettyDistKeystore);
         File keystoreFile = new File(keystorePath);
@@ -77,7 +78,7 @@
         http.setPort(8080);
         http.setIdleTimeout(30000);
 
-        // SSL Context Factory for HTTPS and SPDY
+        // SSL Context Factory for HTTPS
         // SSL requires a certificate so we configure a factory for ssl contents
         // with information pointing to what keystore the ssl connection needs
         // to know about. Much more configuration is available the ssl context,
@@ -103,7 +104,7 @@
         // we just made along with the previously created ssl context factory.
         // Next we set the port and a longer idle timeout.
         ServerConnector https = new ServerConnector(server,
-                new SslConnectionFactory(sslContextFactory, "http/1.1"),
+            new SslConnectionFactory(sslContextFactory,HttpVersion.HTTP_1_1.asString()),
                 new HttpConnectionFactory(https_config));
         https.setPort(8443);
         https.setIdleTimeout(500000);
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyHandlers.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyHandlers.java
index 2bc37cb..76061f9 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyHandlers.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyHandlers.java
@@ -36,6 +36,7 @@
 import org.eclipse.jetty.server.handler.HandlerList;
 import org.eclipse.jetty.server.handler.HandlerWrapper;
 import org.eclipse.jetty.server.handler.RequestLogHandler;
+import org.eclipse.jetty.server.handler.gzip.GzipHandler;
 import org.eclipse.jetty.util.ajax.JSON;
 
 /**
@@ -127,7 +128,7 @@
 
         // link them all together
         wrapper.setHandler(hello);
-        list.setHandlers(new Handler[] { param, wrapper, dft });
+        list.setHandlers(new Handler[] { param, new GzipHandler(), dft });
         handlers.setHandlers(new Handler[] { list, requestLog });
 
         // Handler tree looks like the following
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneWebApp.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneWebApp.java
index 7c9a17b..e688255 100644
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneWebApp.java
+++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/OneWebApp.java
@@ -24,6 +24,7 @@
 import org.eclipse.jetty.jmx.MBeanContainer;
 import org.eclipse.jetty.security.HashLoginService;
 import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.AllowSymLinkAliasChecker;
 import org.eclipse.jetty.webapp.WebAppContext;
 
 public class OneWebApp
@@ -51,26 +52,14 @@
         WebAppContext webapp = new WebAppContext();
         webapp.setContextPath("/");
         File warFile = new File(
-                "../../jetty-distribution/target/distribution/demo-base/webapps/test.war");
+                "../../jetty-distribution/target/distribution/test/webapps/test/");
         webapp.setWar(warFile.getAbsolutePath());
+        webapp.addAliasCheck(new AllowSymLinkAliasChecker());
 
         // A WebAppContext is a ContextHandler as well so it needs to be set to
         // the server so it is aware of where to send the appropriate requests.
         server.setHandler(webapp);
 
-        // Configure a LoginService
-        // Since this example is for our test webapp, we need to setup a
-        // LoginService so this shows how to create a very simple hashmap based
-        // one. The name of the LoginService needs to correspond to what is
-        // configured in the webapp's web.xml and since it has a lifecycle of
-        // its own we register it as a bean with the Jetty server object so it
-        // can be started and stopped according to the lifecycle of the server
-        // itself.
-        HashLoginService loginService = new HashLoginService();
-        loginService.setName("Test Realm");
-        loginService.setConfig("src/test/resources/realm.properties");
-        server.addBean(loginService);
-
         // Start things up! 
         server.start();
 
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SpdyConnector.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SpdyConnector.java
deleted file mode 100644
index eed17c2..0000000
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SpdyConnector.java
+++ /dev/null
@@ -1,114 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.embedded;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.HttpConnectionFactory;
-import org.eclipse.jetty.server.SecureRequestCustomizer;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.server.SslConnectionFactory;
-import org.eclipse.jetty.spdy.server.NPNServerConnectionFactory;
-import org.eclipse.jetty.spdy.server.SPDYServerConnectionFactory;
-import org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnectionFactory;
-import org.eclipse.jetty.spdy.server.http.ReferrerPushStrategy;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-
-/**
- * A Jetty server with HTTP and SPDY connectors.
- */
-public class SpdyConnector
-{
-    public static void main(String[] args) throws Exception
-    {
-        // Path to as-built jetty-distribution directory
-        String jettyHomeBuild = "../../jetty-distribution/target/distribution";
-        
-        // Find jetty home directories
-        String homePath = System.getProperty("jetty.home", jettyHomeBuild);
-        File homeDir = new File(homePath);
-        if (!homeDir.exists())
-        {
-            throw new FileNotFoundException(homeDir.getAbsolutePath());
-        }
-        String jetty_home = homeDir.getAbsolutePath();
-        System.setProperty("jetty.home", jetty_home);
-
-        // The Server
-        Server server = new Server();
-
-        // HTTP Configuration
-        HttpConfiguration http_config = new HttpConfiguration();
-        http_config.setSecureScheme("https");
-        http_config.setSecurePort(8443);
-
-        // HTTP connector
-        ServerConnector http = new ServerConnector(server,
-                new HttpConnectionFactory(http_config));        
-        http.setPort(8080);
-        server.addConnector(http);
- 
-        // SSL Context Factory for HTTPS and SPDY
-        SslContextFactory sslContextFactory = new SslContextFactory();
-        sslContextFactory.setKeyStorePath(jetty_home + "/etc/keystore");
-        sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
-        sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
-
-        // HTTPS Configuration
-        HttpConfiguration https_config = new HttpConfiguration(http_config);
-        https_config.addCustomizer(new SecureRequestCustomizer());
-        
-        // SPDY versions
-        HTTPSPDYServerConnectionFactory spdy2 = 
-                new HTTPSPDYServerConnectionFactory(2, https_config);
-
-        HTTPSPDYServerConnectionFactory spdy3 = 
-                new HTTPSPDYServerConnectionFactory(3, https_config, 
-                        new ReferrerPushStrategy());
-
-        // NPN Factory
-        SPDYServerConnectionFactory.checkProtocolNegotiationAvailable();
-        NPNServerConnectionFactory npn = new NPNServerConnectionFactory(
-                spdy3.getProtocol(), 
-                spdy2.getProtocol(),
-                http.getDefaultProtocol());
-        npn.setDefaultProtocol(http.getDefaultProtocol());
-
-        // SSL Factory
-        SslConnectionFactory ssl = new SslConnectionFactory(
-                sslContextFactory, npn.getProtocol());
-
-        // SPDY Connector
-        ServerConnector spdyConnector = new ServerConnector(server, ssl, 
-                npn, spdy3, spdy2, 
-                new HttpConnectionFactory(https_config));
-        spdyConnector.setPort(8443);
-        server.addConnector(spdyConnector);
-        
-        // Set a handler
-        server.setHandler(new HelloHandler());
-
-        // Start the server
-        server.start();
-        server.join();
-    }
-}
diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SpdyServer.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SpdyServer.java
deleted file mode 100644
index 5e8c92a..0000000
--- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/SpdyServer.java
+++ /dev/null
@@ -1,210 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.embedded;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.lang.management.ManagementFactory;
-
-import org.eclipse.jetty.deploy.DeploymentManager;
-import org.eclipse.jetty.deploy.providers.WebAppProvider;
-import org.eclipse.jetty.jmx.MBeanContainer;
-import org.eclipse.jetty.security.HashLoginService;
-import org.eclipse.jetty.server.AsyncNCSARequestLog;
-import org.eclipse.jetty.server.ForwardedRequestCustomizer;
-import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.HttpConnectionFactory;
-import org.eclipse.jetty.server.NCSARequestLog;
-import org.eclipse.jetty.server.SecureRequestCustomizer;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.server.SslConnectionFactory;
-import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.server.handler.DefaultHandler;
-import org.eclipse.jetty.server.handler.HandlerCollection;
-import org.eclipse.jetty.server.handler.RequestLogHandler;
-import org.eclipse.jetty.server.handler.StatisticsHandler;
-import org.eclipse.jetty.spdy.server.NPNServerConnectionFactory;
-import org.eclipse.jetty.spdy.server.SPDYServerConnectionFactory;
-import org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnectionFactory;
-import org.eclipse.jetty.spdy.server.http.PushStrategy;
-import org.eclipse.jetty.spdy.server.http.ReferrerPushStrategy;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-
-public class SpdyServer
-{
-    public static void main( String[] args ) throws Exception
-    {
-        // Path to as-built jetty-distribution directory
-        String jettyHomeBuild = "../../jetty-distribution/target/distribution";
-
-        // Find jetty home directories
-        String homePath = System.getProperty("jetty.home", jettyHomeBuild);
-        File homeDir = new File(homePath);
-        if (!homeDir.exists())
-        {
-            throw new FileNotFoundException(homeDir.getAbsolutePath());
-        }
-        String jetty_home = homeDir.getAbsolutePath();
-        System.setProperty("jetty.home", jetty_home);
-
-        // Setup Threadpool
-        QueuedThreadPool threadPool = new QueuedThreadPool(512);
-
-        // Setup Jetty Server instance
-        Server server = new Server(threadPool);
-        server.manage(threadPool);
-        server.setDumpAfterStart(false);
-        server.setDumpBeforeStop(false);
-
-        // Setup JMX
-        MBeanContainer mbContainer = new MBeanContainer(
-                ManagementFactory.getPlatformMBeanServer());
-        server.addBean(mbContainer);
-
-        // Common HTTP configuration
-        HttpConfiguration config = new HttpConfiguration();
-        config.setSecurePort(8443);
-        config.addCustomizer(new ForwardedRequestCustomizer());
-        config.addCustomizer(new SecureRequestCustomizer());
-        config.setSendServerVersion(true);
-
-        // Http Connector Setup
-
-        // A plain HTTP connector listening on port 8080. Note that it's also
-        // possible to have port 8080 configured as a non SSL SPDY connector.
-        // But the specification and most browsers do not allow to use SPDY
-        // without SSL encryption. However some browsers allow it to be
-        // configured.
-        HttpConnectionFactory http = new HttpConnectionFactory(config);
-        ServerConnector httpConnector = new ServerConnector(server, http);
-        httpConnector.setPort(8080);
-        httpConnector.setIdleTimeout(10000);
-        server.addConnector(httpConnector);
-
-        // SSL configurations
-
-        // We need a SSLContextFactory for the SSL encryption. That
-        // SSLContextFactory will be used by the SPDY
-        // connector.
-        SslContextFactory sslContextFactory = new SslContextFactory();
-        sslContextFactory.setKeyStorePath(jetty_home + "/etc/keystore");
-        sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
-        sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
-        sslContextFactory.setTrustStorePath(jetty_home + "/etc/keystore");
-        sslContextFactory.setTrustStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
-        sslContextFactory.setExcludeCipherSuites(
-                "SSL_RSA_WITH_DES_CBC_SHA",
-                "SSL_DHE_RSA_WITH_DES_CBC_SHA", 
-                "SSL_DHE_DSS_WITH_DES_CBC_SHA",
-                "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
-                "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
-                "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
-                "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA");
-
-        // Spdy Connector
-
-        // Make sure that the required NPN implementations are available.
-        SPDYServerConnectionFactory.checkProtocolNegotiationAvailable();
-
-        // A ReferrerPushStrategy is being initialized.
-        // See:
-        // http://www.eclipse.org/jetty/documentation/current/spdy-configuring-push.html
-        // for more details.
-        PushStrategy push = new ReferrerPushStrategy();
-        HTTPSPDYServerConnectionFactory spdy2 = 
-                new HTTPSPDYServerConnectionFactory(2, config, push);
-        spdy2.setInputBufferSize(8192);
-        spdy2.setInitialWindowSize(32768);
-
-        // We need a connection factory per protocol that our server is supposed
-        // to support on the NPN port. We then
-        // create a ServerConnector and pass in the supported factories. NPN
-        // will then be used to negotiate the
-        // protocol with the client.
-        HTTPSPDYServerConnectionFactory spdy3 = 
-                new HTTPSPDYServerConnectionFactory(3, config, push);
-        spdy3.setInputBufferSize(8192);
-
-        NPNServerConnectionFactory npn = new NPNServerConnectionFactory(
-                spdy3.getProtocol(), spdy2.getProtocol(), http.getProtocol());
-        npn.setDefaultProtocol(http.getProtocol());
-        npn.setInputBufferSize(1024);
-
-        SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory,
-                npn.getProtocol());
-
-        // Setup the npn connector on port 8443
-        ServerConnector spdyConnector = new ServerConnector(server, ssl, 
-                npn, spdy3, spdy2, http);
-        spdyConnector.setPort(8443);
-
-        server.addConnector(spdyConnector);
-
-        // The following section adds some handlers, deployers and webapp
-        // providers. See
-        // http://www.eclipse.org/jetty/documentation/current/advanced-embedding.html
-        // for details.
-
-        // Setup handlers
-        HandlerCollection handlers = new HandlerCollection();
-        ContextHandlerCollection contexts = new ContextHandlerCollection();
-        RequestLogHandler requestLogHandler = new RequestLogHandler();
-
-        handlers.setHandlers(new Handler[] { contexts, new DefaultHandler(),
-                requestLogHandler });
-
-        StatisticsHandler stats = new StatisticsHandler();
-        stats.setHandler(handlers);
-
-        server.setHandler(stats);
-
-        // Setup deployers
-        DeploymentManager deployer = new DeploymentManager();
-        deployer.setContexts(contexts);
-        server.addBean(deployer);
-
-        WebAppProvider webapp_provider = new WebAppProvider();
-        webapp_provider.setMonitoredDirName(jetty_home + "/webapps");
-        webapp_provider.setParentLoaderPriority(false);
-        webapp_provider.setExtractWars(true);
-        webapp_provider.setScanInterval(2);
-        webapp_provider.setDefaultsDescriptor(jetty_home
-                + "/etc/webdefault.xml");
-        deployer.addAppProvider(webapp_provider);
-
-        HashLoginService login = new HashLoginService();
-        login.setName("Test Realm");
-        login.setConfig(jetty_home + "/etc/realm.properties");
-        server.addBean(login);
-
-        NCSARequestLog requestLog = new AsyncNCSARequestLog();
-        requestLog.setFilename(jetty_home + "/logs/jetty-yyyy_mm_dd.log");
-        requestLog.setExtended(false);
-        requestLogHandler.setRequestLog(requestLog);
-
-        server.setStopAtShutdown(true);
-
-        server.start();
-        server.dumpStdErr();
-        server.join();
-    }
-}
diff --git a/examples/embedded/src/main/resources/docroot/push.html b/examples/embedded/src/main/resources/docroot/push.html
new file mode 100644
index 0000000..f6807e7
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/push.html
@@ -0,0 +1,100 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<head>
+<style>
+img {
+  width: 80px;
+  height: 80px;
+  border: 0;
+  display: block;
+}
+
+td {
+  width: 80px;
+  height: 80px;
+}
+
+tr {
+  height: 80px;
+}
+
+table {
+  border-collapse: collapse;
+}
+
+table, th, td {
+   border: 0 solid black;
+   margin: 0;
+   padding: 0;
+}
+</style>
+
+<body>
+<div id="pushtiles">
+<table>
+<tbody>
+<tr>
+<td><img src="tiles/tile00.jpg" alt="" /></td>
+<td><img src="tiles/tile01.jpg" alt="" /></td>
+<td><img src="tiles/tile02.jpg" alt="" /></td>
+<td><img src="tiles/tile03.jpg" alt="" /></td>
+<td><img src="tiles/tile04.jpg" alt="" /></td>
+<td><img src="tiles/tile05.jpg" alt="" /></td>
+<td><img src="tiles/tile06.jpg" alt="" /></td>
+<td><img src="tiles/tile07.jpg" alt="" /></td>
+<td><img src="tiles/tile08.jpg" alt="" /></td>
+<td><img src="tiles/tile09.jpg" alt="" /></td>
+</tr>
+<tr>
+<td><img src="tiles/tile10.jpg" alt="" /></td>
+<td><img src="tiles/tile11.jpg" alt="" /></td>
+<td><img src="tiles/tile12.jpg" alt="" /></td>
+<td><img src="tiles/tile13.jpg" alt="" /></td>
+<td><img src="tiles/tile14.jpg" alt="" /></td>
+<td><img src="tiles/tile15.jpg" alt="" /></td>
+<td><img src="tiles/tile16.jpg" alt="" /></td>
+<td><img src="tiles/tile17.jpg" alt="" /></td>
+<td><img src="tiles/tile18.jpg" alt="" /></td>
+<td><img src="tiles/tile19.jpg" alt="" /></td>
+</tr>
+<tr>
+<td><img src="tiles/tile20.jpg" alt="" /></td>
+<td><img src="tiles/tile21.jpg" alt="" /></td>
+<td><img src="tiles/tile22.jpg" alt="" /></td>
+<td><img src="tiles/tile23.jpg" alt="" /></td>
+<td><img src="tiles/tile24.jpg" alt="" /></td>
+<td><img src="tiles/tile25.jpg" alt="" /></td>
+<td><img src="tiles/tile26.jpg" alt="" /></td>
+<td><img src="tiles/tile27.jpg" alt="" /></td>
+<td><img src="tiles/tile28.jpg" alt="" /></td>
+<td><img src="tiles/tile29.jpg" alt="" /></td>
+</tr>
+<tr>
+<td><img src="tiles/tile30.jpg" alt="" /></td>
+<td><img src="tiles/tile31.jpg" alt="" /></td>
+<td><img src="tiles/tile32.jpg" alt="" /></td>
+<td><img src="tiles/tile33.jpg" alt="" /></td>
+<td><img src="tiles/tile34.jpg" alt="" /></td>
+<td><img src="tiles/tile35.jpg" alt="" /></td>
+<td><img src="tiles/tile36.jpg" alt="" /></td>
+<td><img src="tiles/tile37.jpg" alt="" /></td>
+<td><img src="tiles/tile38.jpg" alt="" /></td>
+<td><img src="tiles/tile39.jpg" alt="" /></td>
+</tr>
+<tr>
+<td><img src="tiles/tile40.jpg" alt="" /></td>
+<td><img src="tiles/tile41.jpg" alt="" /></td>
+<td><img src="tiles/tile42.jpg" alt="" /></td>
+<td><img src="tiles/tile43.jpg" alt="" /></td>
+<td><img src="tiles/tile44.jpg" alt="" /></td>
+<td><img src="tiles/tile45.jpg" alt="" /></td>
+<td><img src="tiles/tile46.jpg" alt="" /></td>
+<td><img src="tiles/tile47.jpg" alt="" /></td>
+<td><img src="tiles/tile48.jpg" alt="" /></td>
+<td><img src="tiles/tile49.jpg" alt="" /></td>
+</tr>
+</tbody>
+</table>
+</div>
+</body>
+</html>
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile00.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile00.jpg
new file mode 100644
index 0000000..dc30307
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile00.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile01.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile01.jpg
new file mode 100644
index 0000000..66c2e25
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile01.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile02.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile02.jpg
new file mode 100644
index 0000000..f281dfd
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile02.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile03.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile03.jpg
new file mode 100644
index 0000000..4787e69
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile03.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile04.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile04.jpg
new file mode 100644
index 0000000..64e6d10
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile04.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile05.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile05.jpg
new file mode 100644
index 0000000..1530c76
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile05.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile06.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile06.jpg
new file mode 100644
index 0000000..cd59c5f
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile06.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile07.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile07.jpg
new file mode 100644
index 0000000..7f85287
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile07.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile08.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile08.jpg
new file mode 100644
index 0000000..31ebcb0
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile08.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile09.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile09.jpg
new file mode 100644
index 0000000..b9cfb1a
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile09.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile10.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile10.jpg
new file mode 100644
index 0000000..11c6fae
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile10.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile11.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile11.jpg
new file mode 100644
index 0000000..fee6760
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile11.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile12.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile12.jpg
new file mode 100644
index 0000000..a503246
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile12.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile13.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile13.jpg
new file mode 100644
index 0000000..4227207
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile13.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile14.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile14.jpg
new file mode 100644
index 0000000..6071c0f
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile14.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile15.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile15.jpg
new file mode 100644
index 0000000..64a0bf9
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile15.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile16.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile16.jpg
new file mode 100644
index 0000000..f599516
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile16.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile17.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile17.jpg
new file mode 100644
index 0000000..b4183b3
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile17.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile18.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile18.jpg
new file mode 100644
index 0000000..5a568e2
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile18.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile19.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile19.jpg
new file mode 100644
index 0000000..126c3c6
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile19.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile20.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile20.jpg
new file mode 100644
index 0000000..5423ac1
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile20.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile21.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile21.jpg
new file mode 100644
index 0000000..0b6edb0
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile21.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile22.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile22.jpg
new file mode 100644
index 0000000..f788a48
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile22.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile23.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile23.jpg
new file mode 100644
index 0000000..1fbc64d
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile23.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile24.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile24.jpg
new file mode 100644
index 0000000..f565b8f
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile24.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile25.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile25.jpg
new file mode 100644
index 0000000..18a4d06
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile25.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile26.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile26.jpg
new file mode 100644
index 0000000..dde86ec
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile26.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile27.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile27.jpg
new file mode 100644
index 0000000..eaf0ce8
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile27.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile28.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile28.jpg
new file mode 100644
index 0000000..7e59630
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile28.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile29.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile29.jpg
new file mode 100644
index 0000000..1eb25b7
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile29.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile30.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile30.jpg
new file mode 100644
index 0000000..ea68292
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile30.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile31.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile31.jpg
new file mode 100644
index 0000000..31455ca
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile31.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile32.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile32.jpg
new file mode 100644
index 0000000..f6a2a29
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile32.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile33.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile33.jpg
new file mode 100644
index 0000000..8362cf4
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile33.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile34.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile34.jpg
new file mode 100644
index 0000000..2b856a0
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile34.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile35.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile35.jpg
new file mode 100644
index 0000000..4e59e21
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile35.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile36.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile36.jpg
new file mode 100644
index 0000000..7df53fd
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile36.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile37.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile37.jpg
new file mode 100644
index 0000000..3184411
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile37.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile38.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile38.jpg
new file mode 100644
index 0000000..52b44b8
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile38.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile39.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile39.jpg
new file mode 100644
index 0000000..2f7a636
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile39.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile40.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile40.jpg
new file mode 100644
index 0000000..61cfdfa
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile40.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile41.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile41.jpg
new file mode 100644
index 0000000..d25a4e4
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile41.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile42.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile42.jpg
new file mode 100644
index 0000000..029e0f6
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile42.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile43.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile43.jpg
new file mode 100644
index 0000000..5ea4f55
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile43.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile44.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile44.jpg
new file mode 100644
index 0000000..ba18b30
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile44.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile45.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile45.jpg
new file mode 100644
index 0000000..b856d66
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile45.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile46.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile46.jpg
new file mode 100644
index 0000000..f474cc2
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile46.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile47.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile47.jpg
new file mode 100644
index 0000000..6b2f58e
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile47.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile48.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile48.jpg
new file mode 100644
index 0000000..e5d1426
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile48.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/pushed/tile49.jpg b/examples/embedded/src/main/resources/docroot/pushed/tile49.jpg
new file mode 100644
index 0000000..6a33cf3
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/pushed/tile49.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/readme.txt b/examples/embedded/src/main/resources/docroot/readme.txt
new file mode 100644
index 0000000..e0df187
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/readme.txt
@@ -0,0 +1 @@
+This is a test resouce for the Http2Server example
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile00.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile00.jpg
new file mode 100644
index 0000000..b2e52fb
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile00.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile01.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile01.jpg
new file mode 100644
index 0000000..4d98637
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile01.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile02.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile02.jpg
new file mode 100644
index 0000000..06b289b
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile02.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile03.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile03.jpg
new file mode 100644
index 0000000..fcb7b19
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile03.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile04.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile04.jpg
new file mode 100644
index 0000000..0cc4933
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile04.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile05.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile05.jpg
new file mode 100644
index 0000000..6a6d66f
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile05.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile06.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile06.jpg
new file mode 100644
index 0000000..89ddd64
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile06.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile07.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile07.jpg
new file mode 100644
index 0000000..9679317
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile07.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile08.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile08.jpg
new file mode 100644
index 0000000..aa895c4
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile08.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile09.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile09.jpg
new file mode 100644
index 0000000..9c234ca
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile09.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile10.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile10.jpg
new file mode 100644
index 0000000..8bc306c
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile10.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile11.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile11.jpg
new file mode 100644
index 0000000..85b62b6
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile11.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile12.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile12.jpg
new file mode 100644
index 0000000..448faa2
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile12.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile13.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile13.jpg
new file mode 100644
index 0000000..4f4f901
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile13.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile14.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile14.jpg
new file mode 100644
index 0000000..e03120b
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile14.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile15.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile15.jpg
new file mode 100644
index 0000000..64bc238
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile15.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile16.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile16.jpg
new file mode 100644
index 0000000..5e858b9
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile16.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile17.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile17.jpg
new file mode 100644
index 0000000..2da3aa8
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile17.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile18.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile18.jpg
new file mode 100644
index 0000000..e934ce5
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile18.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile19.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile19.jpg
new file mode 100644
index 0000000..15707bc
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile19.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile20.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile20.jpg
new file mode 100644
index 0000000..4b940f1
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile20.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile21.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile21.jpg
new file mode 100644
index 0000000..b340585
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile21.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile22.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile22.jpg
new file mode 100644
index 0000000..39b0824
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile22.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile23.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile23.jpg
new file mode 100644
index 0000000..42adae1
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile23.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile24.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile24.jpg
new file mode 100644
index 0000000..a8281dd
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile24.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile25.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile25.jpg
new file mode 100644
index 0000000..43692f0
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile25.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile26.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile26.jpg
new file mode 100644
index 0000000..f8de0f7
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile26.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile27.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile27.jpg
new file mode 100644
index 0000000..f6c210a
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile27.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile28.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile28.jpg
new file mode 100644
index 0000000..39f2622
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile28.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile29.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile29.jpg
new file mode 100644
index 0000000..952ce0b
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile29.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile30.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile30.jpg
new file mode 100644
index 0000000..e699a53
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile30.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile31.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile31.jpg
new file mode 100644
index 0000000..d6256fe
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile31.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile32.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile32.jpg
new file mode 100644
index 0000000..fde5e8b
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile32.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile33.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile33.jpg
new file mode 100644
index 0000000..2ba66aa
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile33.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile34.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile34.jpg
new file mode 100644
index 0000000..37e24f0
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile34.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile35.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile35.jpg
new file mode 100644
index 0000000..b147697
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile35.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile36.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile36.jpg
new file mode 100644
index 0000000..6501650
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile36.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile37.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile37.jpg
new file mode 100644
index 0000000..e2d40ee
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile37.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile38.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile38.jpg
new file mode 100644
index 0000000..1363781
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile38.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile39.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile39.jpg
new file mode 100644
index 0000000..790cfd2
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile39.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile40.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile40.jpg
new file mode 100644
index 0000000..3027238
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile40.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile41.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile41.jpg
new file mode 100644
index 0000000..d085e38
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile41.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile42.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile42.jpg
new file mode 100644
index 0000000..b7ec60f
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile42.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile43.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile43.jpg
new file mode 100644
index 0000000..6230abd
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile43.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile44.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile44.jpg
new file mode 100644
index 0000000..46ad6a1
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile44.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile45.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile45.jpg
new file mode 100644
index 0000000..89d2d32
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile45.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile46.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile46.jpg
new file mode 100644
index 0000000..9f3451f
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile46.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile47.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile47.jpg
new file mode 100644
index 0000000..b702178
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile47.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile48.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile48.jpg
new file mode 100644
index 0000000..9defd9a
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile48.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/docroot/tiles/tile49.jpg b/examples/embedded/src/main/resources/docroot/tiles/tile49.jpg
new file mode 100644
index 0000000..26f2a44
--- /dev/null
+++ b/examples/embedded/src/main/resources/docroot/tiles/tile49.jpg
Binary files differ
diff --git a/examples/embedded/src/main/resources/exampleserver.xml b/examples/embedded/src/main/resources/exampleserver.xml
index a0fc811..deae1dd 100644
--- a/examples/embedded/src/main/resources/exampleserver.xml
+++ b/examples/embedded/src/main/resources/exampleserver.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="ExampleServer" class="org.eclipse.jetty.server.Server">
 
diff --git a/examples/embedded/src/main/resources/fileserver.xml b/examples/embedded/src/main/resources/fileserver.xml
index 0b4daa3..126f098 100644
--- a/examples/embedded/src/main/resources/fileserver.xml
+++ b/examples/embedded/src/main/resources/fileserver.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="FileServer" class="org.eclipse.jetty.server.Server">
 
diff --git a/examples/embedded/src/main/resources/java-util-logging.properties b/examples/embedded/src/main/resources/java-util-logging.properties
new file mode 100644
index 0000000..4aaa236
--- /dev/null
+++ b/examples/embedded/src/main/resources/java-util-logging.properties
@@ -0,0 +1,9 @@
+
+# Logging
+handlers = java.util.logging.ConsoleHandler
+.level = INFO
+
+java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$-6s %2$s %5$s%6$s%n
+
+# Console Logging
+java.util.logging.ConsoleHandler.level = ALL
\ No newline at end of file
diff --git a/examples/embedded/src/main/resources/jetty-logging.properties b/examples/embedded/src/main/resources/jetty-logging.properties
index d353093..62624e2 100644
--- a/examples/embedded/src/main/resources/jetty-logging.properties
+++ b/examples/embedded/src/main/resources/jetty-logging.properties
@@ -1,12 +1,10 @@
-org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
+#org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.JavaUtilLog
+#org.eclipse.jetty.util.log.javautil.PROPERTIES=java-util-logging.properties
+#org.eclipse.jetty.util.log.SOURCE=true
 org.eclipse.jetty.LEVEL=INFO
 org.eclipse.jetty.STACKS=true
-org.eclipse.jetty.SOURCE=false
 #org.eclipse.jetty.STACKS=false
-#org.eclipse.jetty.spdy.LEVEL=DEBUG
-#org.eclipse.jetty.server.LEVEL=DEBUG
 #org.eclipse.jetty.io.LEVEL=DEBUG
 #org.eclipse.jetty.io.ssl.LEVEL=DEBUG
-#org.eclipse.jetty.spdy.server.LEVEL=DEBUG
 #org.eclipse.jetty.server.LEVEL=DEBUG
 #org.eclipse.jetty.servlets.LEVEL=DEBUG
diff --git a/examples/embedded/src/main/resources/jetty-otherserver.xml b/examples/embedded/src/main/resources/jetty-otherserver.xml
index 4c8a5cd..21272bb 100644
--- a/examples/embedded/src/main/resources/jetty-otherserver.xml
+++ b/examples/embedded/src/main/resources/jetty-otherserver.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="OtherServer" class="org.eclipse.jetty.server.Server">
     <Set name="handler">
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/GzipHandlerTest.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/GzipHandlerTest.java
index 65a68df..c75586e 100644
--- a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/GzipHandlerTest.java
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/GzipHandlerTest.java
@@ -32,18 +32,25 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.eclipse.jetty.http.GzipHttpContent;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpStatus;
 import org.eclipse.jetty.http.HttpTester;
 import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.LocalConnector;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.handler.AbstractHandler;
-import org.eclipse.jetty.servlets.gzip.GzipHandler;
+import org.eclipse.jetty.server.handler.gzip.GzipHandler;
+import org.eclipse.jetty.toolchain.test.AdvancedRunner;
 import org.eclipse.jetty.util.IO;
 import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 
+@RunWith(AdvancedRunner.class)
 public class GzipHandlerTest
 {
     private static String __content =
@@ -72,13 +79,25 @@
 
         Handler testHandler = new AbstractHandler()
         {
+            
             public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException,
                     ServletException
             {
-                PrintWriter writer = response.getWriter();
-                writer.write(__content);
-                writer.close();
-
+                String etag="W/\"foobar\"";
+                response.setHeader(HttpHeader.ETAG.asString(),etag);
+                
+                String inm = request.getHeader(HttpHeader.IF_NONE_MATCH.asString());
+                if (inm!=null && inm.contains(etag))
+                {
+                    response.setStatus(HttpStatus.NOT_MODIFIED_304);
+                }
+                else
+                {
+                    PrintWriter writer = response.getWriter();
+                    writer.write(__content);
+                    writer.close();
+                }
+                
                 baseRequest.setHandled(true);
             }
         };
@@ -97,20 +116,56 @@
         _server.join();
     }
 
+    HttpTester.Request newRequest()
+    {
+        HttpTester.Request request = HttpTester.newRequest();
+        request.setMethod("GET");
+        request.setVersion("HTTP/1.0");
+        request.setHeader("Host","tester");
+        request.setURI("/");
+        return request;
+    }
+
+    @Test
+    public void testNoGzipHandler() throws Exception
+    {
+        // generated and parsed test
+        HttpTester.Request request = newRequest();
+        request.setHeader("accept-encoding","deflate");
+
+        HttpTester.Response response = HttpTester.parseResponse(_connector.getResponses(request.generate()));
+
+        assertEquals(HttpServletResponse.SC_OK,response.getStatus());
+        Assert.assertNull(response.get("Content-Encoding"));
+        assertEquals(__content, response.getContent());
+    }
+    
     @Test
     public void testGzipHandler() throws Exception
     {
         // generated and parsed test
-        HttpTester.Request request = HttpTester.newRequest();
-        HttpTester.Response response;
-
-        request.setMethod("GET");
-        request.setVersion("HTTP/1.0");
-        request.setHeader("Host","tester");
+        HttpTester.Request request = newRequest();
         request.setHeader("accept-encoding","gzip");
-        request.setURI("/");
 
-        response = HttpTester.parseResponse(_connector.getResponses(request.generate()));
+        HttpTester.Response response = HttpTester.parseResponse(_connector.getResponses(request.generate()));
+
+        assertEquals(HttpServletResponse.SC_OK,response.getStatus());
+        assertTrue(response.get("Content-Encoding").equalsIgnoreCase("gzip"));
+        InputStream testIn = new GZIPInputStream(new ByteArrayInputStream(response.getContentBytes()));
+        ByteArrayOutputStream testOut = new ByteArrayOutputStream();
+        IO.copy(testIn,testOut);
+        assertEquals(__content, testOut.toString("UTF8"));
+
+    }
+    
+    @Test
+    public void testDeflateGzipHandler() throws Exception
+    {
+        // generated and parsed test
+        HttpTester.Request request = newRequest();
+        request.setHeader("accept-encoding","deflate;q=0.1,gzip;q=0.5");
+
+        HttpTester.Response response = HttpTester.parseResponse(_connector.getResponses(request.generate()));
 
         assertTrue(response.get("Content-Encoding").equalsIgnoreCase("gzip"));
         assertEquals(HttpServletResponse.SC_OK,response.getStatus());
@@ -120,6 +175,59 @@
         IO.copy(testIn,testOut);
 
         assertEquals(__content, testOut.toString("UTF8"));
+    }
+    
+    
 
+    @Test
+    public void testEtagGzipHandler() throws Exception
+    {
+        // generated and parsed test
+        HttpTester.Request request = newRequest();
+        HttpTester.Response response = HttpTester.parseResponse(_connector.getResponses(request.generate()));
+        assertEquals(HttpServletResponse.SC_OK,response.getStatus());
+        Assert.assertNull(response.get("Content-Encoding"));
+        assertEquals(__content, response.getContent());
+        String etag = response.get(HttpHeader.ETAG.asString());
+        String etag_gzip=etag.substring(0,etag.length()-1)+GzipHttpContent.ETAG_GZIP_QUOTE;
+        
+        request = newRequest();
+        request.add(HttpHeader.IF_NONE_MATCH,"xxxx");
+        response = HttpTester.parseResponse(_connector.getResponses(request.generate()));
+        assertEquals(HttpServletResponse.SC_OK,response.getStatus());
+        Assert.assertNull(response.get("Content-Encoding"));
+        assertEquals(__content, response.getContent());
+
+        request = newRequest();
+        request.add(HttpHeader.IF_NONE_MATCH,etag);
+        response = HttpTester.parseResponse(_connector.getResponses(request.generate()));
+        assertEquals(HttpServletResponse.SC_NOT_MODIFIED,response.getStatus());
+        assertEquals(etag,response.get(HttpHeader.ETAG.asString()));
+        
+        request = newRequest();
+        request.setHeader("accept-encoding","gzip");
+        request.add(HttpHeader.IF_NONE_MATCH,etag);
+        response = HttpTester.parseResponse(_connector.getResponses(request.generate()));
+        assertEquals(HttpServletResponse.SC_NOT_MODIFIED,response.getStatus());
+        assertEquals(etag,response.get(HttpHeader.ETAG.asString()));
+        
+        request = newRequest();
+        request.setHeader("accept-encoding","gzip");
+        response = HttpTester.parseResponse(_connector.getResponses(request.generate()));
+        assertEquals(HttpServletResponse.SC_OK,response.getStatus());
+        assertTrue(response.get("Content-Encoding").equalsIgnoreCase("gzip"));
+        InputStream testIn = new GZIPInputStream(new ByteArrayInputStream(response.getContentBytes()));
+        ByteArrayOutputStream testOut = new ByteArrayOutputStream();
+        IO.copy(testIn,testOut);
+        assertEquals(__content, testOut.toString("UTF8"));
+        assertEquals(etag_gzip,response.get(HttpHeader.ETAG.asString()));
+        
+        request = newRequest();
+        request.setHeader("accept-encoding","gzip");
+        request.add(HttpHeader.IF_NONE_MATCH,etag_gzip);
+        response = HttpTester.parseResponse(_connector.getResponses(request.generate()));
+        assertEquals(HttpServletResponse.SC_NOT_MODIFIED,response.getStatus());
+        assertEquals(etag,response.get(HttpHeader.ETAG.asString()));
+        
     }
 }
diff --git a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/TestXml.java b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/TestXml.java
index 7bfe1b8..0bdd86d 100644
--- a/examples/embedded/src/test/java/org/eclipse/jetty/embedded/TestXml.java
+++ b/examples/embedded/src/test/java/org/eclipse/jetty/embedded/TestXml.java
@@ -25,12 +25,7 @@
     public static void main(String[] args) throws Exception
     {
         System.setProperty("jetty.home","../jetty-distribution/target/distribution");
-        XmlConfiguration.main(new String[]
-            {
-            "../jetty-jmx/src/main/config/etc/jetty-jmx.xml",
-            "../jetty-server/src/main/config/etc/jetty.xml",
-            "../jetty-spdy/spdy-jetty-http-webapp/src/main/config/etc/jetty-spdy.xml"
-            }
-        );
+        XmlConfiguration.main("../jetty-jmx/src/main/config/etc/jetty-jmx.xml",
+                "../jetty-server/src/main/config/etc/jetty.xml");
     }
 }
diff --git a/examples/pom.xml b/examples/pom.xml
index 1758ee7..2580eae 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <groupId>org.eclipse.jetty.examples</groupId>
diff --git a/jetty-alpn/jetty-alpn-client/pom.xml b/jetty-alpn/jetty-alpn-client/pom.xml
index 26af2c6..1d776fc 100644
--- a/jetty-alpn/jetty-alpn-client/pom.xml
+++ b/jetty-alpn/jetty-alpn-client/pom.xml
@@ -2,13 +2,11 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-alpn-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-alpn-client</artifactId>
-  <name>Jetty :: ALPN Client</name>
-  <description>Jetty ALPN client services</description>
-  <url>http://www.eclipse.org/jetty</url>
+  <name>Jetty :: ALPN :: Client</name>
   <properties>
     <bundle-symbolic-name>${project.groupId}.alpn.client</bundle-symbolic-name>
   </properties>
@@ -31,15 +29,6 @@
           </execution>
         </executions>
       </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
       <!-- always include the sources to be able to prepare the eclipse-jetty-SDK feature
       with a snapshot. -->
       <plugin>
diff --git a/jetty-alpn/jetty-alpn-client/src/main/java/org/eclipse/jetty/alpn/client/ALPNClientConnection.java b/jetty-alpn/jetty-alpn-client/src/main/java/org/eclipse/jetty/alpn/client/ALPNClientConnection.java
index 7f82a28..220d7b2 100644
--- a/jetty-alpn/jetty-alpn-client/src/main/java/org/eclipse/jetty/alpn/client/ALPNClientConnection.java
+++ b/jetty-alpn/jetty-alpn-client/src/main/java/org/eclipse/jetty/alpn/client/ALPNClientConnection.java
@@ -18,10 +18,10 @@
 
 package org.eclipse.jetty.alpn.client;
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Executor;
+
 import javax.net.ssl.SSLEngine;
 
 import org.eclipse.jetty.alpn.ALPN;
@@ -35,12 +35,12 @@
 {
     private static final Logger LOG = Log.getLogger(ALPNClientConnection.class);
 
-    private final String protocol;
+    private final List<String> protocols;
 
-    public ALPNClientConnection(EndPoint endPoint, Executor executor, ClientConnectionFactory connectionFactory, SSLEngine sslEngine, Map<String, Object> context, String protocol)
+    public ALPNClientConnection(EndPoint endPoint, Executor executor, ClientConnectionFactory connectionFactory, SSLEngine sslEngine, Map<String, Object> context, List<String> protocols)
     {
         super(endPoint, executor, sslEngine, connectionFactory, context);
-        this.protocol = protocol;
+        this.protocols = protocols;
         ALPN.put(sslEngine, this);
     }
 
@@ -54,20 +54,20 @@
     @Override
     public List<String> protocols()
     {
-        return Arrays.asList(protocol);
+        return protocols;
     }
 
     @Override
     public void selected(String protocol)
     {
-        if (this.protocol.equals(protocol))
+        if (protocols.contains(protocol))
         {
             ALPN.remove(getSSLEngine());
             completed();
         }
         else
         {
-            LOG.info("Could not negotiate protocol: server {} - client {}", protocol, this.protocol);
+            LOG.info("Could not negotiate protocol: server [{}] - client {}", protocol, protocols);
             close();
         }
     }
diff --git a/jetty-alpn/jetty-alpn-client/src/main/java/org/eclipse/jetty/alpn/client/ALPNClientConnectionFactory.java b/jetty-alpn/jetty-alpn-client/src/main/java/org/eclipse/jetty/alpn/client/ALPNClientConnectionFactory.java
index 26bf4ba..16b6e02 100644
--- a/jetty-alpn/jetty-alpn-client/src/main/java/org/eclipse/jetty/alpn/client/ALPNClientConnectionFactory.java
+++ b/jetty-alpn/jetty-alpn-client/src/main/java/org/eclipse/jetty/alpn/client/ALPNClientConnectionFactory.java
@@ -19,6 +19,7 @@
 package org.eclipse.jetty.alpn.client;
 
 import java.io.IOException;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Executor;
 
@@ -33,19 +34,21 @@
 public class ALPNClientConnectionFactory extends NegotiatingClientConnectionFactory
 {
     private final Executor executor;
-    private final String protocol;
+    private final List<String> protocols;
 
-    public ALPNClientConnectionFactory(Executor executor, ClientConnectionFactory connectionFactory, String protocol)
+    public ALPNClientConnectionFactory(Executor executor, ClientConnectionFactory connectionFactory, List<String> protocols)
     {
         super(connectionFactory);
         this.executor = executor;
-        this.protocol = protocol;
+        this.protocols = protocols;
+        if (protocols.isEmpty())
+            throw new IllegalArgumentException("ALPN protocol list cannot be empty");
     }
 
     @Override
     public Connection newConnection(EndPoint endPoint, Map<String, Object> context) throws IOException
     {
         return new ALPNClientConnection(endPoint, executor, getClientConnectionFactory(),
-                (SSLEngine)context.get(SslClientConnectionFactory.SSL_ENGINE_CONTEXT_KEY), context, protocol);
+                (SSLEngine)context.get(SslClientConnectionFactory.SSL_ENGINE_CONTEXT_KEY), context, protocols);
     }
 }
diff --git a/jetty-alpn/jetty-alpn-server/pom.xml b/jetty-alpn/jetty-alpn-server/pom.xml
index 5791632..c4aebca 100644
--- a/jetty-alpn/jetty-alpn-server/pom.xml
+++ b/jetty-alpn/jetty-alpn-server/pom.xml
@@ -2,62 +2,16 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-alpn-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-alpn-server</artifactId>
-  <name>Jetty :: ALPN Server</name>
-  <description>Jetty ALPN server services</description>
-  <url>http://www.eclipse.org/jetty</url>
+  <name>Jetty :: ALPN :: Server</name>
   <properties>
     <bundle-symbolic-name>${project.groupId}.alpn.server</bundle-symbolic-name>
   </properties>
   <build>
     <plugins>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-               <Import-Package>org.eclipse.jetty.alpn,*</Import-Package>
-               <_nouses>true</_nouses>
-              </instructions>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
       <!-- always include the sources to be able to prepare the eclipse-jetty-SDK feature
       with a snapshot. -->
       <plugin>
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/etc/jetty-alpn.xml b/jetty-alpn/jetty-alpn-server/src/main/config/etc/jetty-alpn.xml
new file mode 100644
index 0000000..a8b0e35
--- /dev/null
+++ b/jetty-alpn/jetty-alpn-server/src/main/config/etc/jetty-alpn.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<Configure id="sslConnector" class="org.eclipse.jetty.server.ServerConnector">
+
+  <Call name="addConnectionFactory">
+    <Arg>
+      <New class="org.eclipse.jetty.server.SslConnectionFactory">
+        <Arg name="next">alpn</Arg>
+        <Arg name="sslContextFactory"><Ref refid="sslContextFactory"/></Arg>
+      </New>
+    </Arg>
+  </Call>
+  
+  <Call name="addConnectionFactory">
+    <Arg>
+      <New id="alpn" class="org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory">
+        <Arg type="String">
+          <Property name="jetty.alpn.protocols" deprecated="alpn.protocols" default="" />
+        </Arg>
+        <Set name="defaultProtocol">
+          <Property name="jetty.alpn.defaultProtocol" deprecated="alpn.defaultProtocol" />
+        </Set>
+      </New>
+    </Arg>
+  </Call>
+
+  <!-- ALPN debugging on System.err -->
+  <Set class="org.eclipse.jetty.alpn.ALPN" name="debug" type="boolean"><Property name="jetty.alpn.debug" default="false" /></Set>
+
+</Configure>
+
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/etc/protonego-alpn.xml b/jetty-alpn/jetty-alpn-server/src/main/config/etc/protonego-alpn.xml
deleted file mode 100644
index 5d2ac7a..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/etc/protonego-alpn.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
-<Configure id="protonego" class="org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory">
-    <Arg name="protocols">
-        <Array type="String">
-            <Item>spdy/3</Item>
-            <Item>spdy/2</Item>
-            <Item>http/1.1</Item>
-        </Array>
-    </Arg>
-
-    <Set name="defaultProtocol">http/1.1</Set>
-
-    <!-- Enables NPN debugging on System.err -->
-    <!--<Set class="org.eclipse.jetty.alpn.ALPN" name="debug" type="boolean">true</Set>-->
-
-</Configure>
-
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0.mod
new file mode 100644
index 0000000..cb91b4c
--- /dev/null
+++ b/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0.mod
@@ -0,0 +1,8 @@
+[name]
+alpn-boot
+
+[files]
+maven://org.mortbay.jetty.alpn/alpn-boot/8.1.0.v20141016|lib/alpn/alpn-boot-8.1.0.v20141016.jar
+
+[exec]
+-Xbootclasspath/p:lib/alpn/alpn-boot-8.1.0.v20141016.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_05.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_05.mod
new file mode 100644
index 0000000..cb91b4c
--- /dev/null
+++ b/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_05.mod
@@ -0,0 +1,8 @@
+[name]
+alpn-boot
+
+[files]
+maven://org.mortbay.jetty.alpn/alpn-boot/8.1.0.v20141016|lib/alpn/alpn-boot-8.1.0.v20141016.jar
+
+[exec]
+-Xbootclasspath/p:lib/alpn/alpn-boot-8.1.0.v20141016.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_11.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_11.mod
new file mode 100644
index 0000000..cb91b4c
--- /dev/null
+++ b/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_11.mod
@@ -0,0 +1,8 @@
+[name]
+alpn-boot
+
+[files]
+maven://org.mortbay.jetty.alpn/alpn-boot/8.1.0.v20141016|lib/alpn/alpn-boot-8.1.0.v20141016.jar
+
+[exec]
+-Xbootclasspath/p:lib/alpn/alpn-boot-8.1.0.v20141016.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_20.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_20.mod
new file mode 100644
index 0000000..cb91b4c
--- /dev/null
+++ b/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_20.mod
@@ -0,0 +1,8 @@
+[name]
+alpn-boot
+
+[files]
+maven://org.mortbay.jetty.alpn/alpn-boot/8.1.0.v20141016|lib/alpn/alpn-boot-8.1.0.v20141016.jar
+
+[exec]
+-Xbootclasspath/p:lib/alpn/alpn-boot-8.1.0.v20141016.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_25.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_25.mod
new file mode 100644
index 0000000..6d6d75e
--- /dev/null
+++ b/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_25.mod
@@ -0,0 +1,8 @@
+[name]
+alpn-boot
+
+[files]
+maven://org.mortbay.jetty.alpn/alpn-boot/8.1.2.v20141202|lib/alpn/alpn-boot-8.1.2.v20141202.jar
+
+[exec]
+-Xbootclasspath/p:lib/alpn/alpn-boot-8.1.2.v20141202.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_31.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_31.mod
new file mode 100644
index 0000000..e52bd23
--- /dev/null
+++ b/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_31.mod
@@ -0,0 +1,8 @@
+[name]
+alpn-boot
+
+[files]
+maven://org.mortbay.jetty.alpn/alpn-boot/8.1.3.v20150130|lib/alpn/alpn-boot-8.1.3.v20150130.jar
+
+[exec]
+-Xbootclasspath/p:lib/alpn/alpn-boot-8.1.3.v20150130.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_40.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_40.mod
similarity index 100%
rename from jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_40.mod
rename to jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_40.mod
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_45.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_45.mod
similarity index 100%
rename from jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_45.mod
rename to jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_45.mod
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_51.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_51.mod
similarity index 100%
rename from jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_51.mod
rename to jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_51.mod
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_60.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_60.mod
similarity index 100%
rename from jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_60.mod
rename to jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn-impl/alpn-1.8.0_60.mod
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn.mod
new file mode 100644
index 0000000..7928e64
--- /dev/null
+++ b/jetty-alpn/jetty-alpn-server/src/main/config/modules/alpn.mod
@@ -0,0 +1,53 @@
+# ALPN is provided via a -Xbootclasspath that modifies the secure connections
+# in java to support the ALPN layer needed for HTTP/2.
+#
+# This modification has a tight dependency on specific recent updates of
+# Java 1.7 and Java 1.8 (Java versions prior to 1.7u40 are not supported).
+#
+# The alpn module will use an appropriate alpn-boot jar for your
+# specific version of Java.
+#
+# IMPORTANT: Versions of Java that exist after this module was created are
+#            not guaranteed to work with existing alpn-boot jars, and might
+#            need a new alpn-boot to be created / tested / deployed by the
+#            Jetty project in order to provide support for these future
+#            Java versions.
+#
+# All versions of alpn-boot can be found at
+# http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/
+
+[name]
+alpn
+
+[depend]
+ssl
+alpn-impl/alpn-${java.version}
+
+[lib]
+lib/jetty-alpn-client-${jetty.version}.jar
+lib/jetty-alpn-server-${jetty.version}.jar
+
+[xml]
+etc/jetty-alpn.xml
+
+[files]
+lib/
+lib/alpn/
+
+[ini-template]
+## Overrides the order protocols are chosen by the server.
+## The default order is that specified by the order of the
+## modules declared in start.ini.
+# jetty.alpn.protocols=h2-16,http/1.1
+
+## Specifies what protocol to use when negotiation fails.
+# jetty.alpn.defaultProtocol=http/1.1
+
+## ALPN debug logging on System.err
+# jetty.alpn.debug=false
+
+[license]
+ALPN is a hosted at github under the GPL v2 with ClassPath Exception.
+ALPN replaces/modifies OpenJDK classes in the java.sun.security.ssl package.
+http://github.com/jetty-project/jetty-alpn
+http://openjdk.java.net/legal/gplv2+ce.html
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_40.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_40.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_40.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_45.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_45.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_45.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_51.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_51.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_51.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_55.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_55.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_55.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_60.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_60.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_60.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_65.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_65.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_65.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_67.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_67.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_67.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_71.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_71.mod
deleted file mode 100644
index e9b4e2a..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_71.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.2.v20141202/alpn-boot-7.1.2.v20141202.jar|lib/alpn/alpn-boot-7.1.2.v20141202.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.2.v20141202.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_72.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_72.mod
deleted file mode 100644
index e9b4e2a..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_72.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.2.v20141202/alpn-boot-7.1.2.v20141202.jar|lib/alpn/alpn-boot-7.1.2.v20141202.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.2.v20141202.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_75.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_75.mod
deleted file mode 100644
index ac315d6..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_75.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.3.v20150130/alpn-boot-7.1.3.v20150130.jar|lib/alpn/alpn-boot-7.1.3.v20150130.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.3.v20150130.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_76.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_76.mod
deleted file mode 100644
index ac315d6..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_76.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.3.v20150130/alpn-boot-7.1.3.v20150130.jar|lib/alpn/alpn-boot-7.1.3.v20150130.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.3.v20150130.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_79.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_79.mod
deleted file mode 100644
index ac315d6..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_79.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.3.v20150130/alpn-boot-7.1.3.v20150130.jar|lib/alpn/alpn-boot-7.1.3.v20150130.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.3.v20150130.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_80.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_80.mod
deleted file mode 100644
index ac315d6..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.7.0_80.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.3.v20150130/alpn-boot-7.1.3.v20150130.jar|lib/alpn/alpn-boot-7.1.3.v20150130.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.3.v20150130.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0.mod
deleted file mode 100644
index a81732c..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.0.v20141016/alpn-boot-8.1.0.v20141016.jar|lib/alpn/alpn-boot-8.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-8.1.0.v20141016.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_05.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_05.mod
deleted file mode 100644
index a81732c..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_05.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.0.v20141016/alpn-boot-8.1.0.v20141016.jar|lib/alpn/alpn-boot-8.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-8.1.0.v20141016.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_11.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_11.mod
deleted file mode 100644
index a81732c..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_11.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.0.v20141016/alpn-boot-8.1.0.v20141016.jar|lib/alpn/alpn-boot-8.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-8.1.0.v20141016.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_20.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_20.mod
deleted file mode 100644
index a81732c..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_20.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.0.v20141016/alpn-boot-8.1.0.v20141016.jar|lib/alpn/alpn-boot-8.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-8.1.0.v20141016.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_25.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_25.mod
deleted file mode 100644
index 8d13261..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_25.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.2.v20141202/alpn-boot-8.1.2.v20141202.jar|lib/alpn/alpn-boot-8.1.2.v20141202.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-8.1.2.v20141202.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_31.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_31.mod
deleted file mode 100644
index 4114979..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn-1.8.0_31.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.3.v20150130/alpn-boot-8.1.3.v20150130.jar|lib/alpn/alpn-boot-8.1.3.v20150130.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-8.1.3.v20150130.jar
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn.mod
deleted file mode 100644
index d3e4118..0000000
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn.mod
+++ /dev/null
@@ -1,42 +0,0 @@
-# ALPN is provided via a -Xbootclasspath that modifies the secure connections
-# in java to support the ALPN layer needed for SPDY (and eventually HTTP/2)
-#
-# This modification has a tight dependency on specific recent updates of
-# Java 1.7 and Java 1.8
-# (Java versions prior to 1.7u40 are not supported)
-#
-# The alpn protonego module will use an appropriate alpn-boot jar for your
-# specific version of Java.
-#
-# IMPORTANT: Versions of Java that exist after this module was created are
-#            not guaranteed to work with existing alpn-boot jars, and might
-#            need a new alpn-boot to be created / tested / deployed by the
-#            Jetty project in order to provide support for these future
-#            Java versions.
-#
-# All versions of alpn-boot can be found at
-# http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/
-
-[name]
-protonego-impl
-
-[depend]
-protonego-impl/alpn-${java.version}
-
-[lib]
-lib/jetty-alpn-client-${jetty.version}.jar
-lib/jetty-alpn-server-${jetty.version}.jar
-
-[xml]
-etc/protonego-alpn.xml
-
-[files]
-lib/
-lib/alpn/
-
-[license]
-ALPN is a hosted at github under the GPL v2 with ClassPath Exception.
-ALPN replaces/modifies OpenJDK classes in the java.sun.security.ssl package.
-http://github.com/jetty-project/jetty-alpn
-http://openjdk.java.net/legal/gplv2+ce.html
-
diff --git a/jetty-alpn/jetty-alpn-server/src/main/java/org/eclipse/jetty/alpn/server/ALPNServerConnection.java b/jetty-alpn/jetty-alpn-server/src/main/java/org/eclipse/jetty/alpn/server/ALPNServerConnection.java
index 88abfd3..aab10ad 100644
--- a/jetty-alpn/jetty-alpn-server/src/main/java/org/eclipse/jetty/alpn/server/ALPNServerConnection.java
+++ b/jetty-alpn/jetty-alpn-server/src/main/java/org/eclipse/jetty/alpn/server/ALPNServerConnection.java
@@ -20,10 +20,12 @@
 
 import java.util.Collections;
 import java.util.List;
+
 import javax.net.ssl.SSLEngine;
 
 import org.eclipse.jetty.alpn.ALPN;
 import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.server.ConnectionFactory;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.NegotiatingServerConnection;
 import org.eclipse.jetty.util.log.Log;
@@ -48,7 +50,10 @@
     @Override
     public String select(List<String> clientProtocols)
     {
+        SSLEngine sslEngine = getSSLEngine();
         List<String> serverProtocols = getProtocols();
+        String tlsProtocol = sslEngine.getHandshakeSession().getProtocol();
+        String tlsCipher = sslEngine.getHandshakeSession().getCipherSuite();
         String negotiated = null;
 
         // RFC 7301 states that the server picks the protocol
@@ -57,19 +62,35 @@
         {
             if (clientProtocols.contains(serverProtocol))
             {
+                ConnectionFactory factory = getConnector().getConnectionFactory(serverProtocol);
+                if (factory instanceof CipherDiscriminator && !((CipherDiscriminator)factory).isAcceptable(serverProtocol, tlsProtocol, tlsCipher))
+                {
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("{} protocol {} not acceptable to {} for {}/{}", this, serverProtocol, factory, tlsProtocol, tlsCipher);
+                    continue;
+                }
+
                 negotiated = serverProtocol;
                 break;
             }
         }
-
         if (negotiated == null)
         {
-            negotiated = getDefaultProtocol();
+            if (clientProtocols.isEmpty())
+            {
+                negotiated = getDefaultProtocol();
+            }
+            else
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("{} could not negotiate protocol: C{} | S{}", this, clientProtocols, serverProtocols);
+                throw new IllegalStateException();
+            }
         }
         if (LOG.isDebugEnabled())
             LOG.debug("{} protocol selected {}", this, negotiated);
         setProtocol(negotiated);
-        ALPN.remove(getSSLEngine());
+        ALPN.remove(sslEngine);
         return negotiated;
     }
 
diff --git a/jetty-alpn/jetty-alpn-server/src/main/java/org/eclipse/jetty/alpn/server/ALPNServerConnectionFactory.java b/jetty-alpn/jetty-alpn-server/src/main/java/org/eclipse/jetty/alpn/server/ALPNServerConnectionFactory.java
index 6fdda2b..b0098b3 100644
--- a/jetty-alpn/jetty-alpn-server/src/main/java/org/eclipse/jetty/alpn/server/ALPNServerConnectionFactory.java
+++ b/jetty-alpn/jetty-alpn-server/src/main/java/org/eclipse/jetty/alpn/server/ALPNServerConnectionFactory.java
@@ -19,6 +19,7 @@
 package org.eclipse.jetty.alpn.server;
 
 import java.util.List;
+
 import javax.net.ssl.SSLEngine;
 
 import org.eclipse.jetty.alpn.ALPN;
@@ -34,6 +35,11 @@
 {
     private static final Logger LOG = Log.getLogger(ALPNServerConnectionFactory.class);
 
+    public ALPNServerConnectionFactory(String protocols)
+    {
+        this(protocols.trim().split(",", 0));
+    }
+
     public ALPNServerConnectionFactory(@Name("protocols") String... protocols)
     {
         super("alpn", protocols);
diff --git a/jetty-alpn/pom.xml b/jetty-alpn/pom.xml
index fb19f54..e116c4d 100644
--- a/jetty-alpn/pom.xml
+++ b/jetty-alpn/pom.xml
@@ -2,14 +2,12 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-alpn-parent</artifactId>
   <packaging>pom</packaging>
   <name>Jetty :: ALPN :: Parent</name>
-  <description>Jetty ALPN services parent</description>
-  <url>http://www.eclipse.org/jetty</url>
   <modules>
     <module>jetty-alpn-server</module>
     <module>jetty-alpn-client</module>
diff --git a/jetty-annotations/pom.xml b/jetty-annotations/pom.xml
index d47628e..26c0fe0 100644
--- a/jetty-annotations/pom.xml
+++ b/jetty-annotations/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-annotations</artifactId>
@@ -15,52 +15,14 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
         <groupId>org.apache.felix</groupId>
         <artifactId>maven-bundle-plugin</artifactId>
         <extensions>true</extensions>
-        <executions>
-          <execution>
-            <id>generate-manifest</id>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
             <configuration>
               <instructions>
-                <Import-Package>javax.servlet.*;version="[2.6.0,3.2)",org.objectweb.asm.*;version=5,*</Import-Package>
                 <Require-Capability>osgi.serviceloader; filter:="(osgi.serviceloader=javax.servlet.ServletContainerInitializer)";resolution:=optional;cardinality:=multiple, osgi.extender; filter:="(osgi.extender=osgi.serviceloader.processor)"</Require-Capability>
               </instructions>
             </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <!--
-        Required for OSGI
-        -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
       </plugin>
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
diff --git a/jetty-annotations/src/main/config/etc/jetty-annotations.xml b/jetty-annotations/src/main/config/etc/jetty-annotations.xml
index 637b511..3eb3f6b 100644
--- a/jetty-annotations/src/main/config/etc/jetty-annotations.xml
+++ b/jetty-annotations/src/main/config/etc/jetty-annotations.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
   <!-- =========================================================== -->
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationConfiguration.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationConfiguration.java
index 4f1daa6..48d5b93 100644
--- a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationConfiguration.java
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationConfiguration.java
@@ -23,6 +23,7 @@
 import java.net.URI;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -46,6 +47,7 @@
 import org.eclipse.jetty.plus.annotation.ContainerInitializer;
 import org.eclipse.jetty.util.ConcurrentHashSet;
 import org.eclipse.jetty.util.MultiException;
+import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.resource.Resource;
@@ -58,8 +60,6 @@
 
 /**
  * Configuration for Annotations
- *
- *
  */
 public class AnnotationConfiguration extends AbstractConfiguration
 {
@@ -88,7 +88,7 @@
     protected CounterStatistic _webInfLibStats;
     protected CounterStatistic _webInfClassesStats;
     protected Pattern _sciExcludePattern;
-  
+    protected ServiceLoader<ServletContainerInitializer> _loadedInitializers = null;
     /**
      * TimeStatistic
      *
@@ -274,7 +274,7 @@
             {
                 _ordering = ordering;
                 
-                String[] tmp = ordering.split(",");
+                String[] tmp = StringUtil.csvSplit(ordering);
                 
                 for (int i=0; i<tmp.length; i++)
                 {
@@ -292,8 +292,7 @@
         }
         
         /**
-         * True if "*" is one of the values.
-         * @return
+         * @return true if "*" is one of the values.
          */
         public boolean hasWildcard()
         {
@@ -301,8 +300,7 @@
         }
         
         /**
-         * Get the index of the "*" element, if it is specified. -1 otherwise.
-         * @return
+         * @return the index of the "*" element, if it is specified. -1 otherwise.
          */
         public int getWildcardIndex()
         {
@@ -312,8 +310,7 @@
         }
         
         /**
-         * True if the ordering contains a single value of "*"
-         * @return
+         * @return true if the ordering contains a single value of "*"
          */
         public boolean isDefaultOrder ()
         {
@@ -322,8 +319,8 @@
         
         /**
          * Get the order index of the given classname
-         * @param name
-         * @return
+         * @param name the classname to look up
+         * @return the index of the class name (or -1 if not found)
          */
         public int getIndexOf (String name)
         {
@@ -335,7 +332,7 @@
         
         /**
          * Get the number of elements of the ordering
-         * @return
+         * @return the size of the index
          */
         public int getSize()
         {
@@ -416,6 +413,9 @@
             context.removeBean(starter);
             context.removeAttribute(CONTAINER_INITIALIZER_STARTER);
         }
+        
+        if (_loadedInitializers != null)
+            _loadedInitializers.reload();
     }
     
     /** 
@@ -424,7 +424,7 @@
     @Override
     public void configure(WebAppContext context) throws Exception
     {
-       context.addDecorator(new AnnotationDecorator(context));
+       context.getObjectFactory().addDecorator(new AnnotationDecorator(context));
 
        //Even if metadata is complete, we still need to scan for ServletContainerInitializers - if there are any
       
@@ -498,8 +498,8 @@
     /**
      * Perform scanning of classes for annotations
      * 
-     * @param context
-     * @throws Exception
+     * @param context the context for the scan
+     * @throws Exception if unable to scan
      */
     protected void scanForAnnotations (WebAppContext context)
     throws Exception
@@ -591,8 +591,9 @@
     
     /**
      * Check if we should use multiple threads to scan for annotations or not
-     * @param context
-     * @return
+     * @param context the context of the multi threaded setting
+     * @return true if multi threading is enabled on the context, server, or via a System property.
+     * @see #MULTI_THREADED
      */
     protected boolean isUseMultiThreading(WebAppContext context)
     {
@@ -617,8 +618,9 @@
     /**
      * Work out how long we should wait for the async scanning to occur.
      * 
-     * @param context
-     * @return
+     * @param context the context of the max scan wait setting
+     * @return the max scan wait setting on the context, or server, or via a System property.
+     * @see #MAX_SCAN_WAIT
      */
     protected int getMaxScanWait (WebAppContext context)
     {
@@ -638,24 +640,15 @@
         return Integer.getInteger(MAX_SCAN_WAIT, DEFAULT_MAX_SCAN_WAIT).intValue();
     }
     
-    
-    
     /** 
      * @see org.eclipse.jetty.webapp.AbstractConfiguration#cloneConfigure(org.eclipse.jetty.webapp.WebAppContext, org.eclipse.jetty.webapp.WebAppContext)
      */
     @Override
     public void cloneConfigure(WebAppContext template, WebAppContext context) throws Exception
     {
-        context.addDecorator(new AnnotationDecorator(context));
+        context.getObjectFactory().addDecorator(new AnnotationDecorator(context));
     }
 
-
-    
-    /**
-     * @param context
-     * @param scis
-     * @throws Exception
-     */
     public void createServletContainerInitializerAnnotationHandlers (WebAppContext context, List<ServletContainerInitializer> scis)
     throws Exception
     {
@@ -675,6 +668,9 @@
                 Class<?>[] classes = annotation.value();
                 if (classes != null)
                 {
+
+                    if (LOG.isDebugEnabled()){LOG.debug("HandlesTypes {} on initializer {}",Arrays.asList(classes),service.getClass());}
+                    
                     initializer = new ContainerInitializer(service, classes);
 
                     //If we haven't already done so, we need to register a handler that will
@@ -707,7 +703,7 @@
             else
             {
                 initializer = new ContainerInitializer(service, null);
-                if (LOG.isDebugEnabled()) LOG.debug("No annotation on initializer "+service.getClass());
+                if (LOG.isDebugEnabled()) LOG.debug("No HandlesTypes annotation on initializer "+service.getClass());
             }
             
             initializers.add(initializer);
@@ -723,7 +719,6 @@
         context.addBean(starter, true);
     }
 
-    
     public Resource getJarFor (ServletContainerInitializer service) 
     throws MalformedURLException, IOException
     {
@@ -746,13 +741,15 @@
         return Resource.newResource(loadingJarName);
     }
     
-
     /**
      * Check to see if the ServletContainerIntializer loaded via the ServiceLoader came
      * from a jar that is excluded by the fragment ordering. See ServletSpec 3.0 p.85.
-     * @param context
-     * @param sci
+     * 
+     * @param context the context for the jars
+     * @param sci the servlet container initializer
+     * @param sciResource  the resource for the servlet container initializer
      * @return true if excluded
+     * @throws Exception if unable to determine exclusion
      */
     public boolean isFromExcludedJar (WebAppContext context, ServletContainerInitializer sci, Resource sciResource)
     throws Exception
@@ -799,9 +796,9 @@
     /**
      * Test if the ServletContainerIntializer is excluded by the 
      * o.e.j.containerInitializerExclusionPattern
-     * @param context
-     * @param sci
-     * @return
+     * 
+     * @param sci the ServletContainerIntializer
+     * @return true if the ServletContainerIntializer is excluded
      */
     public boolean matchesExclusionPattern(ServletContainerInitializer sci)
     {
@@ -818,9 +815,9 @@
     /**
      * Test if the ServletContainerInitializer is from the container classpath
      * 
-     * @param context
-     * @param sci
-     * @return
+     * @param context the context for the webapp classpath
+     * @param sci the ServletContainerIntializer
+     * @return true if ServletContainerIntializer is from container classpath
      */
     public boolean isFromContainerClassPath (WebAppContext context, ServletContainerInitializer sci)
     {
@@ -830,26 +827,27 @@
     }
 
     /**
-     * @param context
-     * @return list of non-excluded {@link ServletContainerInitializer}s
-     * @throws Exception
+     * Get SCIs that are not excluded from consideration
+     * @param context the web app context 
+     * @return the list of non-excluded servlet container initializers
+     * @throws Exception if unable to get list 
      */
     public List<ServletContainerInitializer> getNonExcludedInitializers (WebAppContext context)
     throws Exception
     {
         ArrayList<ServletContainerInitializer> nonExcludedInitializers = new ArrayList<ServletContainerInitializer>();
-
+      
         //We use the ServiceLoader mechanism to find the ServletContainerInitializer classes to inspect
         long start = 0;
 
         ClassLoader old = Thread.currentThread().getContextClassLoader();
-        ServiceLoader<ServletContainerInitializer> loadedInitializers = null;
+       
         try
         {        
             if (LOG.isDebugEnabled())
                 start = System.nanoTime();
             Thread.currentThread().setContextClassLoader(context.getClassLoader());
-            loadedInitializers = ServiceLoader.load(ServletContainerInitializer.class);
+            _loadedInitializers = ServiceLoader.load(ServletContainerInitializer.class);
         }
         finally
         {
@@ -858,21 +856,22 @@
         
         if (LOG.isDebugEnabled())
             LOG.debug("Service loaders found in {}ms", (TimeUnit.MILLISECONDS.convert((System.nanoTime()-start), TimeUnit.NANOSECONDS)));
-        
+     
         
         Map<ServletContainerInitializer,Resource> sciResourceMap = new HashMap<ServletContainerInitializer,Resource>();
         ServletContainerInitializerOrdering initializerOrdering = getInitializerOrdering(context);
 
         //Get initial set of SCIs that aren't from excluded jars or excluded by the containerExclusionPattern, or excluded
         //because containerInitializerOrdering omits it
-        for (ServletContainerInitializer sci:loadedInitializers)
-        {       
+        for (ServletContainerInitializer sci:_loadedInitializers)
+        { 
+            
             if (matchesExclusionPattern(sci)) 
             {
                 if (LOG.isDebugEnabled()) LOG.debug("{} excluded by pattern", sci);
                 continue;
             }
-            
+
             Resource sciResource = getJarFor(sci);
             if (isFromExcludedJar(context, sci, sciResource)) 
             { 
@@ -932,7 +931,7 @@
                 {
                     for (Map.Entry<ServletContainerInitializer, Resource> entry:sciResourceMap.entrySet())
                     {
-                        if (webInfJar.equals(entry.getValue()))
+                      if (webInfJar.equals(entry.getValue()))
                             nonExcludedInitializers.add(entry.getKey());
                     }
                 }
@@ -943,8 +942,9 @@
         {
             int i=0;
             for (ServletContainerInitializer sci:nonExcludedInitializers)
-                LOG.debug("ServletContainerInitializer: {} {}",(++i), sci.getClass().getName());
-        }
+                LOG.debug("ServletContainerInitializer: {} {} from {}",(++i), sci.getClass().getName(), sciResourceMap.get(sci));
+        }    
+        
         return nonExcludedInitializers;
     }
 
@@ -952,7 +952,8 @@
     /**
      * Jetty-specific extension that allows an ordering to be applied across ALL ServletContainerInitializers.
      * 
-     * @return
+     * @param context the context for the initializer ordering configuration 
+     * @return the ordering of the ServletContainerIntializer's
      */
     public ServletContainerInitializerOrdering getInitializerOrdering (WebAppContext context)
     {
@@ -970,9 +971,9 @@
     /**
      * Scan jars on container path.
      * 
-     * @param context
-     * @param parser
-     * @throws Exception
+     * @param context the context for the scan
+     * @param parser the parser to scan with
+     * @throws Exception if unable to scan
      */
     public void parseContainerPath (final WebAppContext context, final AnnotationParser parser) throws Exception
     {
@@ -1003,9 +1004,9 @@
     /**
      * Scan jars in WEB-INF/lib
      * 
-     * @param context
-     * @param parser
-     * @throws Exception
+     * @param context the context for the scan
+     * @param parser the annotation parser to use
+     * @throws Exception if unable to scan and/or parse
      */
     public void parseWebInfLib (final WebAppContext context, final AnnotationParser parser) throws Exception
     {   
@@ -1066,9 +1067,9 @@
     /**
      * Scan classes in WEB-INF/classes
      * 
-     * @param context
-     * @param parser
-     * @throws Exception
+     * @param context the context for the scan
+     * @param parser the annotation parser to use
+     * @throws Exception if unable to scan and/or parse
      */
     public void parseWebInfClasses (final WebAppContext context, final AnnotationParser parser)
     throws Exception
@@ -1099,10 +1100,10 @@
     /**
      * Get the web-fragment.xml from a jar
      * 
-     * @param jar
-     * @param frags
-     * @return the fragment if found, or null of not found
-     * @throws Exception
+     * @param jar the jar to look in for a fragment
+     * @param frags the fragments previously found
+     * @return true if the fragment if found, or null of not found
+     * @throws Exception if unable to determine the the fragment contains
      */
     public FragmentDescriptor getFragmentFromJar (Resource jar,  List<FragmentDescriptor> frags)
     throws Exception
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationDecorator.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationDecorator.java
index 3f07ebc..613485d 100644
--- a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationDecorator.java
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationDecorator.java
@@ -18,21 +18,16 @@
 
 package org.eclipse.jetty.annotations;
 
-import org.eclipse.jetty.servlet.ServletContextHandler.Decorator;
+import org.eclipse.jetty.util.Decorator;
 import org.eclipse.jetty.webapp.WebAppContext;
 
 /**
  * AnnotationDecorator
- *
- *
  */
 public class AnnotationDecorator implements Decorator
 {
     protected AnnotationIntrospector _introspector = new AnnotationIntrospector();
 
-    /**
-     * @param context
-     */
     public AnnotationDecorator(WebAppContext context)
     {
        registerHandlers(context);
@@ -53,13 +48,13 @@
     /**
      * Look for annotations that can be discovered with introspection:
      * <ul>
-     * <li> Resource
-     * <li> Resources
-     * <li> PostConstruct
-     * <li> PreDestroy
-     * <li> ServletSecurity?
+     * <li> Resource </li>
+     * <li> Resources </li>
+     * <li> PostConstruct </li>
+     * <li> PreDestroy </li>
+     * <li> ServletSecurity? </li>
      * </ul>
-     * @param o
+     * @param o the object ot introspect
      */
     protected void introspect (Object o)
     {
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationParser.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationParser.java
index 0c55a52..05bebef 100644
--- a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationParser.java
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationParser.java
@@ -48,18 +48,18 @@
 
 /**
  * AnnotationParser
- *
+ * <p>
  * Use asm to scan classes for annotations. A SAX-style parsing is done.
  * Handlers are registered which will be called back when various types of
  * entity are encountered, eg a class, a method, a field. 
- * 
+ * <p> 
  * Handlers are not called back in any particular order and are assumed
  * to be order-independent.
- * 
+ * <p>
  * As a registered Handler will be called back for each annotation discovered
  * on a class, a method, a field, the Handler should test to see if the annotation
  * is one that it is interested in.
- * 
+ * <p>
  * For the servlet spec, we are only interested in annotations on classes, methods and fields,
  * so the callbacks for handling finding a class, a method a field are themselves
  * not fully implemented.
@@ -76,8 +76,8 @@
     /**
      * Convert internal name to simple name
      * 
-     * @param name
-     * @return
+     * @param name the internal name
+     * @return the simple name
      */
     public static String normalize (String name)
     {
@@ -96,8 +96,8 @@
     /**
      * Convert internal names to simple names.
      * 
-     * @param list
-     * @return
+     * @param list the list of internal names
+     * @return the list of simple names
      */
     public static String[] normalize (String[] list)
     {
@@ -291,7 +291,6 @@
         }
     }
     
-    
     /**
      * Handler
      *
@@ -307,13 +306,10 @@
         public void handle (FieldInfo info, String annotationName);
     }
     
-    
-    
     /**
      * AbstractHandler
      *
      * Convenience base class to provide no-ops for all Handler methods.
-     * 
      */
     public static abstract class AbstractHandler implements Handler
     {
@@ -533,7 +529,8 @@
 
     /**
      * True if the class has already been processed, false otherwise
-     * @param className
+     * @param className the classname
+     * @return true if class was parsed, false if not
      */
     public boolean isParsed (String className)
     {
@@ -545,9 +542,10 @@
     /**
      * Parse a given class
      * 
-     * @param className
-     * @param resolver
-     * @throws Exception
+     * @param handlers the set of handlers to find class
+     * @param className the class name to parse
+     * @param resolver the class name resolver to use 
+     * @throws Exception if unable to parse
      */
     public void parse (Set<? extends Handler> handlers, String className, ClassNameResolver resolver)
     throws Exception
@@ -564,7 +562,10 @@
                 if (resource!= null)
                 {
                     Resource r = Resource.newResource(resource);
-                    scanClass(handlers, null, r.getInputStream());
+                    try (InputStream is = r.getInputStream())
+                    {
+                        scanClass(handlers, null, is);
+                    }
                 }
             }
         }
@@ -575,10 +576,11 @@
     /**
      * Parse the given class, optionally walking its inheritance hierarchy
      * 
-     * @param clazz
-     * @param resolver
-     * @param visitSuperClasses
-     * @throws Exception
+     * @param handlers the handlers to look for class in 
+     * @param clazz the class to look for
+     * @param resolver the resolver to look up class with
+     * @param visitSuperClasses if true, also visit super classes for parse 
+     * @throws Exception if unable to parse class
      */
     public void parse (Set<? extends Handler> handlers, Class<?> clazz, ClassNameResolver resolver, boolean visitSuperClasses)
     throws Exception
@@ -595,7 +597,10 @@
                     if (resource!= null)
                     {
                         Resource r = Resource.newResource(resource);
-                        scanClass(handlers, null, r.getInputStream());
+                        try (InputStream is =  r.getInputStream())
+                        {
+                            scanClass(handlers, null, is);
+                        }
                     }
                 }
             }
@@ -612,9 +617,10 @@
     /**
      * Parse the given classes
      * 
-     * @param classNames
-     * @param resolver
-     * @throws Exception
+     * @param handlers the set of handlers to look for class in 
+     * @param classNames the class name
+     * @param resolver the class name resolver
+     * @throws Exception if unable to parse
      */
     public void parse (Set<? extends Handler> handlers, String[] classNames, ClassNameResolver resolver)
     throws Exception
@@ -629,9 +635,10 @@
     /**
      * Parse the given classes
      * 
-     * @param classNames
-     * @param resolver
-     * @throws Exception
+     * @param handlers the set of handlers to look for class in 
+     * @param classNames the class names
+     * @param resolver the class name resolver
+     * @throws Exception if unable to parse
      */
     public void parse (Set<? extends Handler> handlers, List<String> classNames, ClassNameResolver resolver)
     throws Exception
@@ -649,7 +656,10 @@
                     if (resource!= null)
                     {
                         Resource r = Resource.newResource(resource);
-                        scanClass(handlers, null, r.getInputStream());
+                        try (InputStream is = r.getInputStream())
+                        {
+                            scanClass(handlers, null, is);
+                        }
                     }
                 }
             }
@@ -665,14 +675,15 @@
     /**
      * Parse all classes in a directory
      * 
-     * @param dir
-     * @param resolver
-     * @throws Exception
+     * @param handlers the set of handlers to look for classes in 
+     * @param dir the resource directory to look for classes
+     * @param resolver the class name resolver
+     * @throws Exception if unable to parse
      */
     protected void parseDir (Set<? extends Handler> handlers, Resource dir, ClassNameResolver resolver)
     throws Exception
     {
-        //skip dirs whose name start with . (ie hidden)
+        // skip dirs whose name start with . (ie hidden)
         if (!dir.isDirectory() || !dir.exists() || dir.getName().startsWith("."))
             return;
 
@@ -699,7 +710,10 @@
                         {
                             Resource r = Resource.newResource(res.getURL());
                             if (LOG.isDebugEnabled()) {LOG.debug("Scanning class {}", r);};
-                            scanClass(handlers, dir, r.getInputStream());
+                            try (InputStream is=r.getInputStream())
+                            {
+                                scanClass(handlers, dir, is);
+                            }
                         }
                     }                  
                     catch (Exception ex)
@@ -723,11 +737,12 @@
      * Parse classes in the supplied classloader. 
      * Only class files in jar files will be scanned.
      * 
-     * @param loader
-     * @param visitParents
-     * @param nullInclusive
-     * @param resolver
-     * @throws Exception
+     * @param handlers the handlers to look for classes in 
+     * @param loader the classloader for the classes
+     * @param visitParents if true, visit parent classloaders too
+     * @param nullInclusive if true, an empty pattern means all names match, if false, none match
+     * @param resolver the class name resolver
+     * @throws Exception if unable to parse
      */
     public void parse (final Set<? extends Handler> handlers, ClassLoader loader, boolean visitParents, boolean nullInclusive, final ClassNameResolver resolver)
     throws Exception
@@ -765,9 +780,10 @@
     /**
      * Parse classes in the supplied uris.
      * 
-     * @param uris
-     * @param resolver
-     * @throws Exception
+     * @param handlers the handlers to look for classes in  
+     * @param uris the uris for the jars
+     * @param resolver the class name resolver
+     * @throws Exception if unable to parse
      */
     public void parse (final Set<? extends Handler> handlers, final URI[] uris, final ClassNameResolver resolver)
     throws Exception
@@ -793,9 +809,11 @@
 
     /**
      * Parse a particular uri
-     * @param uri
-     * @param resolver
-     * @throws Exception
+     * 
+     * @param handlers the handlers to look for classes in 
+     * @param uri the uri for the jar 
+     * @param resolver the class name resolver
+     * @throws Exception if unable to parse
      */
     public void parse (final Set<? extends Handler> handlers, URI uri, final ClassNameResolver resolver)
     throws Exception
@@ -809,9 +827,11 @@
     
     /**
      * Parse a resource
-     * @param r
-     * @param resolver
-     * @throws Exception
+     * 
+     * @param handlers the handlers to look for classes in  
+     * @param r the resource to parse
+     * @param resolver the class name resolver
+     * @throws Exception if unable to parse
      */
     public void parse (final Set<? extends Handler> handlers, Resource r, final ClassNameResolver resolver)
     throws Exception
@@ -834,8 +854,11 @@
 
         if (fullname.endsWith(".class"))
         {
-            scanClass(handlers, null, r.getInputStream());
-            return;
+            try (InputStream is=r.getInputStream())
+            {
+                scanClass(handlers, null, is);
+                return;
+            }
         }
         
         if (LOG.isDebugEnabled()) LOG.warn("Resource not scannable for classes: {}", r);
@@ -847,9 +870,10 @@
     /**
      * Parse a resource that is a jar file.
      * 
-     * @param jarResource
-     * @param resolver
-     * @throws Exception
+     * @param handlers the handlers to look for classes in  
+     * @param jarResource the jar resource to parse
+     * @param resolver the class name resolver
+     * @throws Exception if unable to parse
      */
     protected void parseJar (Set<? extends Handler> handlers, Resource jarResource,  final ClassNameResolver resolver)
     throws Exception
@@ -925,10 +949,12 @@
 
     /**
      * Parse a single entry in a jar file
-     * @param jar
-     * @param entry
-     * @param resolver
-     * @throws Exception
+     * 
+     * @param handlers the handlers to look for classes in  
+     * @param jar the jar resource to parse
+     * @param entry the entry in the jar resource to parse
+     * @param resolver the class name resolver
+     * @throws Exception if unable to parse
      */
     protected void parseJarEntry (Set<? extends Handler> handlers, Resource jar, JarEntry entry, final ClassNameResolver resolver)
     throws Exception
@@ -949,11 +975,14 @@
 
             if ((resolver == null)
                     ||
-                (!resolver.isExcluded(shortName) && (!isParsed(shortName) || resolver.shouldOverride(shortName))))
+               (!resolver.isExcluded(shortName) && (!isParsed(shortName) || resolver.shouldOverride(shortName))))
             {
                 Resource clazz = Resource.newResource("jar:"+jar.getURI()+"!/"+name);
                 if (LOG.isDebugEnabled()) {LOG.debug("Scanning class from jar {}", clazz);};
-                scanClass(handlers, jar, clazz.getInputStream());
+                try (InputStream is = clazz.getInputStream())
+                {
+                    scanClass(handlers, jar, is);
+                }
             }
         }
     }
@@ -963,9 +992,10 @@
     /**
      * Use ASM on a class
      * 
+     * @param handlers the handlers to look for classes in  
      * @param containingResource the dir or jar that the class is contained within, can be null if not known
-     * @param is
-     * @throws IOException
+     * @param is the input stream to parse
+     * @throws IOException if unable to parse
      */
     protected void scanClass (Set<? extends Handler> handlers, Resource containingResource, InputStream is)
     throws IOException
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ClassNameResolver.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ClassNameResolver.java
index 6edd2ce..d8eeefd 100644
--- a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ClassNameResolver.java
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ClassNameResolver.java
@@ -25,7 +25,7 @@
     /**
      * Based on the execution context, should the class represented
      * by "name" be excluded from consideration?
-     * @param name
+     * @param name the name to test
      * @return true if classname is excluded
      */
     public boolean isExcluded (String name);
@@ -35,7 +35,7 @@
      * Based on the execution context, if a duplicate class 
      * represented by "name" is detected, should the existing
      * one be overridden or not?
-     * @param name
+     * @param name the name to test
      * @return true if name should be overridden
      */
     public boolean shouldOverride (String name);
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ContainerInitializerAnnotationHandler.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ContainerInitializerAnnotationHandler.java
index c710960..d3e9f1f 100644
--- a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ContainerInitializerAnnotationHandler.java
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ContainerInitializerAnnotationHandler.java
@@ -28,15 +28,11 @@
 
 /**
  * ContainerInitializerAnnotationHandler
- *
+ * <p>
  *  Discovers classes that contain the specified annotation, either at class or
- *  method level. The specified annotation is derived from an @HandlesTypes on
+ *  method level. The specified annotation is derived from an <code>&#064;HandlesTypes</code> on
  *  a ServletContainerInitializer class.
  */
-/**
- * @author janb
- *
- */
 public class ContainerInitializerAnnotationHandler extends AbstractHandler
 {
     final ContainerInitializer _initializer;
@@ -51,7 +47,7 @@
     /**
      * Handle finding a class that is annotated with the annotation we were constructed with.
      * 
-     * @see org.eclipse.jetty.annotations.AnnotationParser.Handler#handle(ClassInfo, String)
+     * @see org.eclipse.jetty.annotations.AnnotationParser.Handler#handle(org.eclipse.jetty.annotations.AnnotationParser.ClassInfo, String)
      */
     public void handle(ClassInfo info, String annotationName)
     {
@@ -64,7 +60,7 @@
     /**
      * Handle finding a field that is annotated with the annotation we were constructed with.
      * 
-     * @see org.eclipse.jetty.annotations.AnnotationParser.Handler#handle(FieldInfo, String)
+     * @see org.eclipse.jetty.annotations.AnnotationParser.Handler#handle(org.eclipse.jetty.annotations.AnnotationParser.FieldInfo, String)
      */
     public void handle(FieldInfo info, String annotationName)
     {        
@@ -76,7 +72,7 @@
     /**
      * Handle finding a method that is annotated with the annotation we were constructed with. 
      * 
-     * @see org.eclipse.jetty.annotations.AnnotationParser.Handler#handle(MethodInfo, String)
+     * @see org.eclipse.jetty.annotations.AnnotationParser.Handler#handle(org.eclipse.jetty.annotations.AnnotationParser.MethodInfo, String)
      */
     public void handle(MethodInfo info, String annotationName)
     {
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/DeclareRolesAnnotationHandler.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/DeclareRolesAnnotationHandler.java
index 6231ef1..2629418 100644
--- a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/DeclareRolesAnnotationHandler.java
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/DeclareRolesAnnotationHandler.java
@@ -27,17 +27,12 @@
 
 /**
  * DeclaresRolesAnnotationHandler
- *
- *
  */
 public class DeclareRolesAnnotationHandler extends AbstractIntrospectableAnnotationHandler
 {
 
     protected WebAppContext _context;
 
-    /**
-     * @param context
-     */
     public DeclareRolesAnnotationHandler(WebAppContext context)
     {
         super(false);
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ResourceAnnotationHandler.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ResourceAnnotationHandler.java
index 3b46e8d..a6fbd37 100644
--- a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ResourceAnnotationHandler.java
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ResourceAnnotationHandler.java
@@ -206,9 +206,12 @@
 
     /**
      * Process a Resource annotation on a Method.
-     *
+     * <p>
      * This will generate a JNDI entry, and an Injection to be
      * processed when an instance of the class is created.
+     * 
+     * @param clazz the class to process 
+     * @param method the method to process
      */
     public void handleMethod(Class<?> clazz, Method method)
     {
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ServletContainerInitializersStarter.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ServletContainerInitializersStarter.java
index 2cf40fd..3c7c01e 100644
--- a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ServletContainerInitializersStarter.java
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ServletContainerInitializersStarter.java
@@ -19,6 +19,7 @@
 package org.eclipse.jetty.annotations;
 
 import java.util.List;
+
 import org.eclipse.jetty.plus.annotation.ContainerInitializer;
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.util.component.AbstractLifeCycle;
@@ -38,9 +39,6 @@
     private static final Logger LOG = Log.getLogger(ServletContainerInitializersStarter.class);
     WebAppContext _context;
     
-    /**
-     * @param context
-     */
     public ServletContainerInitializersStarter(WebAppContext context)
     {
         _context = context;
@@ -71,6 +69,4 @@
             }
         }
     }
-    
-    
 }
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ServletSecurityAnnotationHandler.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ServletSecurityAnnotationHandler.java
index c5b700e..6b74e4c 100644
--- a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ServletSecurityAnnotationHandler.java
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ServletSecurityAnnotationHandler.java
@@ -40,15 +40,15 @@
 /**
  * ServletSecurityAnnotationHandler
  *
- * Inspect a class to see if it has an @ServletSecurity annotation on it,
- * setting up the <security-constraint>s.
+ * Inspect a class to see if it has an <code>&#064;ServletSecurity</code> annotation on it,
+ * setting up the <code>&lt;security-constraint&gt;s</code>.
  *
  * A servlet can be defined in:
  * <ul>
- * <li>web.xml
- * <li>web-fragment.xml
- * <li>@WebServlet annotation discovered
- * <li>ServletContext.createServlet
+ * <li>web.xml</li>
+ * <li>web-fragment.xml</li>
+ * <li>@WebServlet annotation discovered</li>
+ * <li>ServletContext.createServlet</li>
  * </ul>
  *
  * The ServletSecurity annotation for a servlet should only be processed
@@ -119,12 +119,14 @@
 
 
     /**
-     * Make a jetty Constraint object, which represents the <auth-constraint> and
-     * <user-data-constraint> elements, based on the security annotation.
-     * @param servlet
-     * @param rolesAllowed
-     * @param permitOrDeny
-     * @param transport
+     * Make a jetty Constraint object, which represents the <code>&lt;auth-constraint&gt;</code> and
+     * <code>&lt;user-data-constraint&gt;</code> elements, based on the security annotation.
+     * 
+     * @param servlet the servlet
+     * @param rolesAllowed the roles allowed
+     * @param permitOrDeny the role / permission semantic
+     * @param transport the transport guarantee
+     * @return the constraint
      */
     protected Constraint makeConstraint (Class servlet, String[] rolesAllowed, EmptyRoleSemantic permitOrDeny, TransportGuarantee transport)
     {
@@ -135,7 +137,8 @@
 
     /**
      * Get the ServletMappings for the servlet's class.
-     * @param className
+     * @param className the class name
+     * @return the servlet mappings for the class
      */
     protected List<ServletMapping> getServletMappings(String className)
     {
@@ -154,9 +157,12 @@
 
 
     /**
-     * Check if there are already <security-constraint> elements defined that match the url-patterns for
+     * Check if there are already <code>&lt;security-constraint&gt;</code> elements defined that match the url-patterns for
      * the servlet.
-     * @param servletMappings
+     * 
+     * @param servletMappings the servlet mappings
+     * @param constraintMappings the constraint mappings
+     * @return true if constraint exists
      */
     protected boolean constraintsExist (List<ServletMapping> servletMappings, List<ConstraintMapping> constraintMappings)
     {
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/Util.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/Util.java
index a2ed1c5..6faa959 100644
--- a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/Util.java
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/Util.java
@@ -25,7 +25,7 @@
 import org.objectweb.asm.Type;
 
 /**
- * Util
+ * Annotation Processing Utilities
  */
 public class Util
 { 
@@ -40,7 +40,7 @@
     /**
      * Check if the presented method belongs to a class that is one
      * of the classes with which a servlet container should be concerned.
-     * @param c
+     * @param c the class
      * @return true if class is a type of one of the following: 
      *          ({@link javax.servlet.Servlet}, 
      *           {@link javax.servlet.Filter}, 
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebFilterAnnotation.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebFilterAnnotation.java
index 8226758..b7605f1 100644
--- a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebFilterAnnotation.java
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebFilterAnnotation.java
@@ -39,17 +39,11 @@
 
 /**
  * WebFilterAnnotation
- *
- *
  */
 public class WebFilterAnnotation extends DiscoveredAnnotation
 {
     private static final Logger LOG = Log.getLogger(WebFilterAnnotation.class);
 
-    /**
-     * @param context
-     * @param className
-     */
     public WebFilterAnnotation(WebAppContext context, String className)
     {
         super(context, className);
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebListenerAnnotation.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebListenerAnnotation.java
index 963b14b..421a1ed 100644
--- a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebListenerAnnotation.java
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebListenerAnnotation.java
@@ -40,17 +40,11 @@
 
 /**
  * WebListenerAnnotation
- *
- *
  */
 public class WebListenerAnnotation extends DiscoveredAnnotation
 {
     private static final Logger LOG = Log.getLogger(WebListenerAnnotation.class);
 
-    /**
-     * @param context
-     * @param className
-     */
     public WebListenerAnnotation(WebAppContext context, String className)
     {
         super(context, className);
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebListenerAnnotationHandler.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebListenerAnnotationHandler.java
index 739285a..51c92dc 100644
--- a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebListenerAnnotationHandler.java
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebListenerAnnotationHandler.java
@@ -34,10 +34,6 @@
        super(context);
     }
     
-  
-    /** 
-     * @see org.eclipse.jetty.annotations.AnnotationParser.Handler#handle(ClassInfo, String)
-     */
     public void handle(ClassInfo info, String annotationName)
     {
         if (annotationName == null || !"javax.servlet.annotation.WebListener".equals(annotationName))
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebServletAnnotationHandler.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebServletAnnotationHandler.java
index 35510d2..1d9f548 100644
--- a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebServletAnnotationHandler.java
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebServletAnnotationHandler.java
@@ -29,7 +29,6 @@
  * WebServletAnnotationHandler
  *
  * Process a WebServlet annotation on a class.
- *
  */
 public class WebServletAnnotationHandler extends AbstractDiscoverableAnnotationHandler
 {
@@ -43,8 +42,6 @@
 
     /**
      * Handle discovering a WebServlet annotation.
-     *
-     * @see org.eclipse.jetty.annotations.AnnotationParser.Handler#handle(ClassInfo, String)
      */
     @Override
     public void handle(ClassInfo info, String annotationName)
diff --git a/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestServletAnnotations.java b/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestServletAnnotations.java
index 5885419..f4af95d 100644
--- a/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestServletAnnotations.java
+++ b/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestServletAnnotations.java
@@ -18,8 +18,11 @@
 
 package org.eclipse.jetty.annotations;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
 import java.util.Arrays;
diff --git a/jetty-ant/pom.xml b/jetty-ant/pom.xml
index f1703b6..dcc5162 100644
--- a/jetty-ant/pom.xml
+++ b/jetty-ant/pom.xml
@@ -2,13 +2,16 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-ant</artifactId>
   <packaging>jar</packaging>
   <name>Jetty :: Ant Plugin</name>
  
+  <properties>
+    <bundle-symbolic-name>org.eclipse.jetty.ant</bundle-symbolic-name>
+  </properties>
   <build>
     <plugins>
       <plugin>
@@ -22,8 +25,8 @@
             </goals>
             <configuration>
               <includeGroupIds>org.eclipse.jetty</includeGroupIds>
-              <excludeGroupIds>org.eclipse.jetty.orbit,org.eclipse.jetty.spdy,org.eclipse.jetty.websocket,org.eclipse.jetty.drafts</excludeGroupIds>
-              <excludeArtifactIds>jetty-all,jetty-start,jetty-monitor,jetty-jsp</excludeArtifactIds>
+              <excludeGroupIds>org.eclipse.jetty.orbit,org.eclipse.jetty.websocket,org.eclipse.jetty.drafts</excludeGroupIds>
+              <excludeArtifactIds>jetty-all,jetty-start,jetty-monitor</excludeArtifactIds>
               <includeTypes>jar</includeTypes>
               <outputDirectory>${project.build.directory}/test-lib</outputDirectory>
             </configuration>
diff --git a/jetty-ant/src/main/java/org/eclipse/jetty/ant/AntWebAppContext.java b/jetty-ant/src/main/java/org/eclipse/jetty/ant/AntWebAppContext.java
index a8752b3..7512581 100644
--- a/jetty-ant/src/main/java/org/eclipse/jetty/ant/AntWebAppContext.java
+++ b/jetty-ant/src/main/java/org/eclipse/jetty/ant/AntWebAppContext.java
@@ -16,7 +16,6 @@
 //  ========================================================================
 //
 
-
 package org.eclipse.jetty.ant;
 
 import java.io.File;
@@ -67,13 +66,8 @@
 import org.eclipse.jetty.webapp.WebXmlConfiguration;
 import org.eclipse.jetty.xml.XmlConfiguration;
 
-
-
 /**
- * AntWebAppContext
- * 
  * Extension of WebAppContext to allow configuration via Ant environment.
- *
  */
 public class AntWebAppContext extends WebAppContext
 {
@@ -432,6 +426,7 @@
      * Default constructor. Takes project as an argument
      *
      * @param project the project.
+     * @throws Exception if unable to create webapp context
      */
     public AntWebAppContext(Project project) throws Exception
     {
@@ -445,6 +440,7 @@
 
     /**
      * Adds a new Ant's attributes tag object if it have not been created yet.
+     * @param atts the attributes
      */
     public void addAttributes(Attributes atts)
     {
diff --git a/jetty-ant/src/main/java/org/eclipse/jetty/ant/JettyRunTask.java b/jetty-ant/src/main/java/org/eclipse/jetty/ant/JettyRunTask.java
index 626ea4d..cc2cb49 100644
--- a/jetty-ant/src/main/java/org/eclipse/jetty/ant/JettyRunTask.java
+++ b/jetty-ant/src/main/java/org/eclipse/jetty/ant/JettyRunTask.java
@@ -41,10 +41,8 @@
  */
 public class JettyRunTask extends Task
 {
-
     private int scanIntervalSeconds; 
     
-    
     /** Temporary files directory. */
     private File tempDirectory;
 
@@ -79,9 +77,6 @@
 
     private boolean daemon;
     
-  
-
-
     public JettyRunTask()
     {
         TaskLog.setTask(this);
@@ -89,17 +84,16 @@
 
     /**
      * Creates a new <code>WebApp</code> Ant object.
-     *
+     * @param webapp the webapp context 
      */
     public void addWebApp(AntWebAppContext webapp)
     {
        webapps.add(webapp);
     }
-    
-    
 
     /**
      * Adds a new Ant's connector tag object if it have not been created yet.
+     * @param connectors the connectors 
      */
     public void addConnectors(Connectors connectors)
     {
@@ -108,10 +102,6 @@
         this.connectors = connectors;
     }
 
-
-    /**
-     * @param services
-     */
     public void addLoginServices(LoginServices services)
     {        
         if (this.loginServices != null )
@@ -126,9 +116,6 @@
         this.systemProperties = systemProperties;
     }
     
-    /**
-     * @param handlers
-     */
     public void addContextHandlers (ContextHandlers handlers)
     {
         if (this.contextHandlers != null)
@@ -141,9 +128,6 @@
         return tempDirectory;
     }
 
-    /**
-     * @param tempDirectory
-     */
     public void setTempDirectory(File tempDirectory)
     {
         this.tempDirectory = tempDirectory;
@@ -154,17 +138,11 @@
         return jettyXml;
     }
 
-    /**
-     * @param jettyXml
-     */
     public void setJettyXml(File jettyXml)
     {
         this.jettyXml = jettyXml;
     }
 
-    /**
-     * @param className
-     */
     public void setRequestLog(String className)
     {
         try
@@ -209,7 +187,7 @@
      * Executes this Ant task. The build flow is being stopped until Jetty
      * server stops.
      *
-     * @throws BuildException
+     * @throws BuildException if unable to build
      */
     public void execute() throws BuildException
     {
@@ -297,17 +275,12 @@
         return scanIntervalSeconds;
     }
 
-    /**
-     * @param secs
-     */
     public void setScanIntervalSeconds(int secs)
     {
         scanIntervalSeconds = secs;
         TaskLog.log("scanIntervalSecs="+secs);
     }
     
-
-    
     /**
      * Sets the system properties.
      */
diff --git a/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/Connectors.java b/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/Connectors.java
index 9c425e1..6b25db1 100644
--- a/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/Connectors.java
+++ b/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/Connectors.java
@@ -23,11 +23,7 @@
 import java.util.List;
 
 /**
- * 
- * Connectors
- * 
- * Specifies a jetty configuration <connectors/> element for Ant build file.
- *
+ * Specifies a jetty configuration <code>&lt;connectors/&gt;</code> element for Ant build file.
  */
 public class Connectors
 {
diff --git a/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/ContextHandlers.java b/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/ContextHandlers.java
index bfbf49d..0c25058 100644
--- a/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/ContextHandlers.java
+++ b/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/ContextHandlers.java
@@ -25,8 +25,7 @@
 import org.eclipse.jetty.server.handler.ContextHandler;
 
 /**
- * Specifies <contextHandlers/> element in web app configuration.
- * 
+ * Specifies <code>&lt;contextHandlers/&gt;</code> element in web app configuration.
  */
 public class ContextHandlers
 {
diff --git a/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/FileMatchingConfiguration.java b/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/FileMatchingConfiguration.java
index 5576780..73749f9 100644
--- a/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/FileMatchingConfiguration.java
+++ b/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/FileMatchingConfiguration.java
@@ -27,10 +27,9 @@
 import org.apache.tools.ant.DirectoryScanner;
 
 /**
- * Describes set of files matched by <fileset/> elements in ant configuration
+ * Describes set of files matched by <code>&lt;fileset/&gt;</code> elements in ant configuration
  * file. It is used to group application classes, libraries, and scannedTargets
  * elements.
- * 
  */
 public class FileMatchingConfiguration
 {
@@ -44,7 +43,7 @@
 
     /**
      * @param directoryScanner new directory scanner retrieved from the
-     *            <fileset/> element.
+     *            <code>&lt;fileset/&gt;</code> element.
      */
     public void addDirectoryScanner(DirectoryScanner directoryScanner)
     {
diff --git a/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/LoginServices.java b/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/LoginServices.java
index f83a1d7..867f99b 100644
--- a/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/LoginServices.java
+++ b/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/LoginServices.java
@@ -25,14 +25,10 @@
 import org.eclipse.jetty.security.LoginService;
 
 /**
- * LoginServices
- * 
- * Specifies a jetty configuration <loginServices/> element for Ant build file.
- *
+ * Specifies a jetty configuration &lt;loginServices/&gt; element for Ant build file.
  */
 public class LoginServices
 {
-
     private List<LoginService> loginServices = new ArrayList<LoginService>();
 
     public void add(LoginService service)
diff --git a/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/SystemProperties.java b/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/SystemProperties.java
index 72bed64..3e2b38b 100644
--- a/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/SystemProperties.java
+++ b/jetty-ant/src/main/java/org/eclipse/jetty/ant/types/SystemProperties.java
@@ -27,9 +27,8 @@
 
 /**
  * SystemProperties
- * 
- * Ant <systemProperties/> tag definition.
- * 
+ * <p> 
+ * Ant &lt;systemProperties/&gt; tag definition.
  */
 public class SystemProperties
 {
@@ -48,8 +47,8 @@
 
     /**
      * Set a System.property with this value if it is not already set.
-     * 
-     * @returns true if property has been set
+     * @param property the property to test 
+     * @return true if property has been set
      */
     public static boolean setIfNotSetAlready(Property property)
     {
diff --git a/jetty-cdi/cdi-core/pom.xml b/jetty-cdi/cdi-core/pom.xml
new file mode 100644
index 0000000..bff595f
--- /dev/null
+++ b/jetty-cdi/cdi-core/pom.xml
@@ -0,0 +1,71 @@
+<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>
+    <groupId>org.eclipse.jetty.cdi</groupId>
+    <artifactId>jetty-cdi-parent</artifactId>
+    <version>9.3.6-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>cdi-core</artifactId>
+  <name>Jetty :: CDI :: Core</name>
+  <description>
+    Core CDI routines for Jetty (Also useful for CDI/SE applications that dont need a server)
+  </description>
+  <url>http://www.eclipse.org/jetty</url>
+  <packaging>jar</packaging>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.core</bundle-symbolic-name>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-util</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+       <groupId>javax.enterprise</groupId>
+       <artifactId>cdi-api</artifactId>
+       <version>1.2</version>
+       <exclusions>
+         <exclusion>
+           <groupId>javax.el</groupId>
+           <artifactId>javax.el-api</artifactId>
+         </exclusion>
+       </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.weld</groupId>
+      <artifactId>weld-core</artifactId>
+      <version>${weld.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.weld.se</groupId>
+      <artifactId>weld-se-core</artifactId>
+      <version>${weld.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.toolchain</groupId>
+      <artifactId>jetty-test-helper</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>tests-jar</id>
+            <goals>
+              <goal>test-jar</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/jetty-cdi/cdi-core/src/main/java/org/eclipse/jetty/cdi/core/AnyLiteral.java b/jetty-cdi/cdi-core/src/main/java/org/eclipse/jetty/cdi/core/AnyLiteral.java
new file mode 100644
index 0000000..9f28671
--- /dev/null
+++ b/jetty-cdi/cdi-core/src/main/java/org/eclipse/jetty/cdi/core/AnyLiteral.java
@@ -0,0 +1,28 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.core;
+
+import javax.enterprise.inject.Any;
+import javax.enterprise.util.AnnotationLiteral;
+
+@SuppressWarnings("serial")
+public class AnyLiteral extends AnnotationLiteral<Any>
+{
+    public static final AnyLiteral INSTANCE = new AnyLiteral();
+}
diff --git a/jetty-cdi/cdi-core/src/main/java/org/eclipse/jetty/cdi/core/JettyLogFactory.java b/jetty-cdi/cdi-core/src/main/java/org/eclipse/jetty/cdi/core/JettyLogFactory.java
new file mode 100644
index 0000000..8366bbc
--- /dev/null
+++ b/jetty-cdi/cdi-core/src/main/java/org/eclipse/jetty/cdi/core/JettyLogFactory.java
@@ -0,0 +1,37 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.core;
+
+import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.spi.InjectionPoint;
+
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+/**
+ * CDI Producer of Jetty Logging instances.
+ */
+public class JettyLogFactory
+{
+    @Produces
+    public Logger createLogger(InjectionPoint injectionPoint)
+    {
+        return Log.getLogger(injectionPoint.getMember().getDeclaringClass());
+    }
+}
diff --git a/jetty-cdi/cdi-core/src/main/java/org/eclipse/jetty/cdi/core/NamedLiteral.java b/jetty-cdi/cdi-core/src/main/java/org/eclipse/jetty/cdi/core/NamedLiteral.java
new file mode 100644
index 0000000..fdb3b3e
--- /dev/null
+++ b/jetty-cdi/cdi-core/src/main/java/org/eclipse/jetty/cdi/core/NamedLiteral.java
@@ -0,0 +1,45 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.core;
+
+import javax.enterprise.util.AnnotationLiteral;
+import javax.inject.Named;
+
+@SuppressWarnings("serial")
+public class NamedLiteral extends AnnotationLiteral<Named> implements Named
+{
+    private final String value;
+
+    public String value()
+    {
+        return value;
+    }
+
+    public NamedLiteral(String name)
+    {
+        if (name == null)
+        {
+            this.value = "";
+        }
+        else
+        {
+            this.value = name;
+        }
+    }
+}
\ No newline at end of file
diff --git a/jetty-cdi/cdi-core/src/main/java/org/eclipse/jetty/cdi/core/ScopedInstance.java b/jetty-cdi/cdi-core/src/main/java/org/eclipse/jetty/cdi/core/ScopedInstance.java
new file mode 100644
index 0000000..c68322e
--- /dev/null
+++ b/jetty-cdi/cdi-core/src/main/java/org/eclipse/jetty/cdi/core/ScopedInstance.java
@@ -0,0 +1,45 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.core;
+
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.Bean;
+
+public class ScopedInstance<T>
+{
+    public Bean<T> bean;
+    public CreationalContext<T> creationalContext;
+    public T instance;
+
+    public void destroy()
+    {
+        bean.destroy(instance,creationalContext);
+    }
+    
+    @Override
+    public String toString()
+    {
+        StringBuilder s = new StringBuilder();
+        s.append("ScopedInstance[");
+        s.append(bean);
+        s.append(',').append(creationalContext);
+        s.append(']');
+        return s.toString();
+    }
+}
diff --git a/jetty-cdi/cdi-core/src/main/java/org/eclipse/jetty/cdi/core/SimpleBeanStore.java b/jetty-cdi/cdi-core/src/main/java/org/eclipse/jetty/cdi/core/SimpleBeanStore.java
new file mode 100644
index 0000000..76d6865
--- /dev/null
+++ b/jetty-cdi/cdi-core/src/main/java/org/eclipse/jetty/cdi/core/SimpleBeanStore.java
@@ -0,0 +1,94 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.core;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.enterprise.context.spi.Contextual;
+
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+public class SimpleBeanStore
+{
+    private static final Logger LOG = Log.getLogger(SimpleBeanStore.class);
+
+    public Map<Contextual<?>, List<ScopedInstance<?>>> beans = new HashMap<>();
+
+    public void addBean(ScopedInstance<?> instance)
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("addBean({})",instance);
+        }
+        List<ScopedInstance<?>> instances = getBeans(instance.bean);
+        if (instances == null)
+        {
+            instances = new ArrayList<>();
+            beans.put(instance.bean,instances);
+        }
+        instances.add(instance);
+    }
+
+    public void clear()
+    {
+        beans.clear();
+    }
+
+    public void destroy()
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("destroy() - {} beans",beans.size());
+        }
+        for (List<ScopedInstance<?>> instances : beans.values())
+        {
+            if (LOG.isDebugEnabled())
+            {
+                LOG.debug("destroying - {} instance(s)",instances.size());
+            }
+            for (ScopedInstance<?> instance : instances)
+            {
+                if (LOG.isDebugEnabled())
+                {
+                    LOG.debug("destroying instance {}",instance);
+                }
+                instance.destroy();
+            }
+        }
+    }
+
+    public List<ScopedInstance<?>> getBeans(Contextual<?> contextual)
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("getBeans({})",contextual);
+        }
+        return beans.get(contextual);
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("%s@%X[size=%d]",this.getClass().getSimpleName(),hashCode(),beans.size());
+    }
+}
\ No newline at end of file
diff --git a/jetty-cdi/cdi-core/src/main/resources/META-INF/beans.xml b/jetty-cdi/cdi-core/src/main/resources/META-INF/beans.xml
new file mode 100644
index 0000000..f158a71
--- /dev/null
+++ b/jetty-cdi/cdi-core/src/main/resources/META-INF/beans.xml
@@ -0,0 +1,6 @@
+<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
+        http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
+       bean-discovery-mode="all">
+</beans>
\ No newline at end of file
diff --git a/jetty-cdi/cdi-core/src/test/java/org/eclipse/jetty/cdi/core/AbstractWeldTest.java b/jetty-cdi/cdi-core/src/test/java/org/eclipse/jetty/cdi/core/AbstractWeldTest.java
new file mode 100644
index 0000000..6e56797
--- /dev/null
+++ b/jetty-cdi/cdi-core/src/test/java/org/eclipse/jetty/cdi/core/AbstractWeldTest.java
@@ -0,0 +1,78 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.core;
+
+import java.util.Set;
+
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.Bean;
+
+import org.jboss.weld.environment.se.Weld;
+import org.jboss.weld.environment.se.WeldContainer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+public abstract class AbstractWeldTest
+{
+    public static class TestBean<T>
+    {
+        public Bean<T> bean;
+        public CreationalContext<T> cCtx;
+        public T instance;
+
+        public void destroy()
+        {
+            bean.destroy(instance,cCtx);
+        }
+    }
+
+    @BeforeClass
+    public static void initWeld()
+    {
+        weld = new Weld();
+        container = weld.initialize();
+    }
+
+    @AfterClass
+    public static void shutdownWeld()
+    {
+        weld.shutdown();
+    }
+
+    private static WeldContainer container;
+    private static Weld weld;
+
+    @SuppressWarnings("unchecked")
+    public <T> TestBean<T> newInstance(Class<T> clazz) throws Exception
+    {
+        TestBean<T> testBean = new TestBean<>();
+        Set<Bean<?>> beans = container.getBeanManager().getBeans(clazz,AnyLiteral.INSTANCE);
+        if (beans.size() > 0)
+        {
+            testBean.bean = (Bean<T>)beans.iterator().next();
+            testBean.cCtx = container.getBeanManager().createCreationalContext(testBean.bean);
+            testBean.instance = (T)container.getBeanManager().getReference(testBean.bean,clazz,testBean.cCtx);
+            return testBean;
+        }
+        else
+        {
+            throw new Exception(String.format("Can't find class %s",clazz));
+        }
+    }
+}
diff --git a/jetty-cdi/cdi-core/src/test/java/org/eclipse/jetty/cdi/core/logging/LeanConsoleHandler.java b/jetty-cdi/cdi-core/src/test/java/org/eclipse/jetty/cdi/core/logging/LeanConsoleHandler.java
new file mode 100644
index 0000000..b77f2e3
--- /dev/null
+++ b/jetty-cdi/cdi-core/src/test/java/org/eclipse/jetty/cdi/core/logging/LeanConsoleHandler.java
@@ -0,0 +1,112 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.core.logging;
+
+import java.text.MessageFormat;
+import java.util.ResourceBundle;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.regex.Pattern;
+
+public class LeanConsoleHandler extends Handler
+{
+    public static Handler createWithLevel(Level level)
+    {
+        LeanConsoleHandler handler = new LeanConsoleHandler();
+        handler.setLevel(level);
+        return handler;
+    }
+
+    @Override
+    public void close() throws SecurityException
+    {
+        /* nothing to do here */
+    }
+
+    @Override
+    public void flush()
+    {
+        /* nothing to do here */
+    }
+
+    public synchronized String formatMessage(LogRecord record)
+    {
+        String msg = getMessage(record);
+
+        try
+        {
+            Object params[] = record.getParameters();
+            if ((params == null) || (params.length == 0))
+            {
+                return msg;
+            }
+
+            if (Pattern.compile("\\{\\d+\\}").matcher(msg).find())
+            {
+                return MessageFormat.format(msg,params);
+            }
+
+            return msg;
+        }
+        catch (Exception ex)
+        {
+            return msg;
+        }
+    }
+
+    private String getMessage(LogRecord record)
+    {
+        ResourceBundle bundle = record.getResourceBundle();
+        if (bundle != null)
+        {
+            try
+            {
+                return bundle.getString(record.getMessage());
+            }
+            catch (java.util.MissingResourceException ex)
+            {
+            }
+        }
+
+        return record.getMessage();
+    }
+
+    @Override
+    public void publish(LogRecord record)
+    {
+        StringBuilder buf = new StringBuilder();
+        buf.append("[").append(record.getLevel().getName()).append("] ");
+        String logname = record.getLoggerName();
+        int idx = logname.lastIndexOf('.');
+        if (idx > 0)
+        {
+            logname = logname.substring(idx + 1);
+        }
+        buf.append(logname);
+        buf.append(": ");
+        buf.append(formatMessage(record));
+
+        System.out.println(buf.toString());
+        if (record.getThrown() != null)
+        {
+            record.getThrown().printStackTrace(System.out);
+        }
+    }
+}
diff --git a/jetty-cdi/cdi-core/src/test/java/org/eclipse/jetty/cdi/core/logging/LogFactory.java b/jetty-cdi/cdi-core/src/test/java/org/eclipse/jetty/cdi/core/logging/LogFactory.java
new file mode 100644
index 0000000..9918914
--- /dev/null
+++ b/jetty-cdi/cdi-core/src/test/java/org/eclipse/jetty/cdi/core/logging/LogFactory.java
@@ -0,0 +1,33 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.core.logging;
+
+import java.util.logging.Logger;
+
+import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.spi.InjectionPoint;
+
+public class LogFactory
+{
+    @Produces
+    public Logger createLogger(InjectionPoint injectionPoint)
+    {
+        return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
+    }
+}
diff --git a/jetty-cdi/cdi-core/src/test/java/org/eclipse/jetty/cdi/core/logging/Logging.java b/jetty-cdi/cdi-core/src/test/java/org/eclipse/jetty/cdi/core/logging/Logging.java
new file mode 100644
index 0000000..8e3bfcf
--- /dev/null
+++ b/jetty-cdi/cdi-core/src/test/java/org/eclipse/jetty/cdi/core/logging/Logging.java
@@ -0,0 +1,46 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.core.logging;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.logging.LogManager;
+
+public class Logging
+{
+    public static void config()
+    {
+        ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        URL url = cl.getResource("logging.properties");
+        if (url != null)
+        {
+            try (InputStream in = url.openStream())
+            {
+                LogManager.getLogManager().readConfiguration(in);
+            }
+            catch (IOException e)
+            {
+                e.printStackTrace(System.err);
+            }
+        }
+
+        System.setProperty("org.apache.commons.logging.Log","org.apache.commons.logging.impl.Jdk14Logger");
+    }
+}
diff --git a/jetty-cdi/cdi-core/src/test/resources/logging.properties b/jetty-cdi/cdi-core/src/test/resources/logging.properties
new file mode 100644
index 0000000..c0ff63e
--- /dev/null
+++ b/jetty-cdi/cdi-core/src/test/resources/logging.properties
@@ -0,0 +1,2 @@
+handlers = org.eclipse.jetty.cdi.core.logging.LeanConsoleHandler
+.level=INFO
diff --git a/jetty-cdi/cdi-full-servlet/pom.xml b/jetty-cdi/cdi-full-servlet/pom.xml
new file mode 100644
index 0000000..9956539
--- /dev/null
+++ b/jetty-cdi/cdi-full-servlet/pom.xml
@@ -0,0 +1,53 @@
+<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>
+    <groupId>org.eclipse.jetty.cdi</groupId>
+    <artifactId>jetty-cdi-parent</artifactId>
+    <version>9.3.6-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>cdi-full-servlet</artifactId>
+  <name>Jetty :: CDI :: Dependencies</name>
+  <url>http://www.eclipse.org/jetty</url>
+  <packaging>pom</packaging>
+  <properties>
+    <weld.version>2.2.9.Final</weld.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.eclipse.jetty.cdi</groupId>
+      <artifactId>cdi-servlet</artifactId>
+      <version>${project.version}</version>
+<!--
+      <exclusions>
+        <exclusion>
+          <groupId>javax.el</groupId>
+          <artifactId>javax.el-api</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.jboss.spec.javax.el</groupId>
+          <artifactId>jboss-el-api_3.0_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.jboss.spec.javax.annotation</groupId>
+          <artifactId>jboss-annotations-api_1.2_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.jboss.spec.javax.interceptor</groupId>
+          <artifactId>jboss-interceptors-api_1.2_spec</artifactId>
+        </exclusion>
+      </exclusions>
+-->
+    </dependency>
+    <dependency>
+       <groupId>javax.annotation</groupId>
+       <artifactId>javax.annotation-api</artifactId>
+       <version>1.2</version>
+    </dependency>
+    <dependency>
+       <groupId>org.mortbay.jasper</groupId>
+       <artifactId>apache-jsp</artifactId>
+       <version>${jsp.version}</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/jetty-cdi/cdi-servlet/pom.xml b/jetty-cdi/cdi-servlet/pom.xml
new file mode 100644
index 0000000..4ad6854
--- /dev/null
+++ b/jetty-cdi/cdi-servlet/pom.xml
@@ -0,0 +1,90 @@
+<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>
+    <groupId>org.eclipse.jetty.cdi</groupId>
+    <artifactId>jetty-cdi-parent</artifactId>
+    <version>9.3.6-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>cdi-servlet</artifactId>
+  <name>Jetty :: CDI :: Servlet</name>
+  <url>http://www.eclipse.org/jetty</url>
+  <packaging>jar</packaging>
+  <properties>
+    <weld.version>2.2.9.Final</weld.version>
+    <bundle-symbolic-name>${project.groupId}.servlet</bundle-symbolic-name>
+  </properties>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+            <configuration>
+              <descriptorRefs>
+                <descriptorRef>config</descriptorRef>
+              </descriptorRefs>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.eclipse.jetty.cdi</groupId>
+      <artifactId>cdi-core</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-plus</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-deploy</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.weld.servlet</groupId>
+      <artifactId>weld-servlet-core</artifactId>
+      <version>${weld.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>javax.el</groupId>
+          <artifactId>javax.el-api</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.jboss.spec.javax.el</groupId>
+          <artifactId>jboss-el-api_3.0_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.jboss.spec.javax.annotation</groupId>
+          <artifactId>jboss-annotations-api_1.2_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.jboss.spec.javax.interceptor</groupId>
+          <artifactId>jboss-interceptors-api_1.2_spec</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <!-- below here lie testing dragons -->
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>apache-jsp</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.toolchain</groupId>
+      <artifactId>jetty-test-helper</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/jetty-cdi/cdi-servlet/src/main/config/etc/jetty-cdi.xml b/jetty-cdi/cdi-servlet/src/main/config/etc/jetty-cdi.xml
new file mode 100644
index 0000000..79ebdae
--- /dev/null
+++ b/jetty-cdi/cdi-servlet/src/main/config/etc/jetty-cdi.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<!-- =============================================================== -->
+<!-- Mixin the Weld / CDI classes to the class loader                -->
+<!-- =============================================================== -->
+
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+  <Ref refid="DeploymentManager">
+    <Call name="addLifeCycleBinding">
+      <Arg>
+        <New
+          class="org.eclipse.jetty.cdi.servlet.WeldDeploymentBinding">
+        </New>
+      </Arg>
+    </Call>
+  </Ref>
+</Configure>
+
diff --git a/jetty-cdi/cdi-servlet/src/main/config/modules/cdi.mod b/jetty-cdi/cdi-servlet/src/main/config/modules/cdi.mod
new file mode 100644
index 0000000..ebffb55
--- /dev/null
+++ b/jetty-cdi/cdi-servlet/src/main/config/modules/cdi.mod
@@ -0,0 +1,38 @@
+#
+# [EXPERIMENTAL] CDI / Weld Jetty module
+#
+
+[depend]
+deploy
+annotations
+plus
+# JSP (and EL) are requirements for CDI and Weld
+jsp
+
+[files]
+lib/cdi/
+maven://javax.enterprise/cdi-api/1.2|lib/cdi/javax.enterprise.cdi-api-1.2.jar
+maven://javax.interceptor/javax.interceptor-api/1.2|lib/cdi/javax.interceptor-api-1.2.jar
+maven://javax.inject/javax.inject/1|lib/cdi/javax.inject-1.0.jar
+maven://org.jboss.weld.servlet/weld-servlet-core/2.2.9.Final|lib/cdi/weld-servlet-core-2.2.9.Final.jar
+maven://org.jboss.weld.environment/weld-environment-common/2.2.9.Final|lib/cdi/weld-environment-common-2.2.9.Final.jar
+maven://org.jboss.weld/weld-core-impl/2.2.9.Final|lib/cdi/weld-core-impl-2.2.9.Final.jar
+maven://org.jboss.classfilewriter/jboss-classfilewriter/1.0.5.Final|lib/cdi/jboss-classfilewriter-1.0.5.Final.jar
+maven://com.google.guava/guava/13.0.1|lib/cdi/com.google.guava.guava-13.0.1.jar
+maven://org.jboss.weld/weld-spi/2.2.SP3|lib/cdi/weld-spi-2.2.SP3.jar
+maven://org.jboss.weld/weld-api/2.2.SP3|lib/cdi/weld-api-2.2.SP3.jar
+maven://org.jboss.logging/jboss-logging/3.1.3.GA|lib/cdi/jboss-logging-3.1.3.GA.jar
+
+
+[lib]
+lib/cdi/*.jar
+lib/cdi-core-${jetty.version}.jar
+lib/cdi-servlet-${jetty.version}.jar
+
+[xml]
+etc/jetty-cdi.xml
+
+[license]
+Weld is an open source project hosted on Github and released under the Apache 2.0 license.
+http://weld.cdi-spec.org/
+http://www.apache.org/licenses/LICENSE-2.0.html
diff --git a/jetty-cdi/cdi-servlet/src/main/java/org/eclipse/jetty/cdi/servlet/EmbeddedCdiHandler.java b/jetty-cdi/cdi-servlet/src/main/java/org/eclipse/jetty/cdi/servlet/EmbeddedCdiHandler.java
new file mode 100644
index 0000000..8c1c5d2
--- /dev/null
+++ b/jetty-cdi/cdi-servlet/src/main/java/org/eclipse/jetty/cdi/servlet/EmbeddedCdiHandler.java
@@ -0,0 +1,131 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.servlet;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Set;
+
+import javax.servlet.ServletContext;
+
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.resource.Resource;
+import org.jboss.weld.environment.servlet.EnhancedListener;
+
+/**
+ * Handy {@link ServletContextHandler} implementation that hooks up
+ * all of the various CDI related components and listeners from Weld.
+ */
+public class EmbeddedCdiHandler extends ServletContextHandler
+{
+    private static final Logger LOG = Log.getLogger(EmbeddedCdiHandler.class);
+    
+    private static final String[] REQUIRED_BEANS_XML_PATHS = new String[] { 
+        "/WEB-INF/beans.xml", 
+        "/META-INF/beans.xml", 
+        "/WEB-INF/classes/META-INF/beans.xml" 
+    };
+
+    public EmbeddedCdiHandler()
+    {
+        super();
+    }
+
+    public EmbeddedCdiHandler(int options)
+    {
+        super(options);
+    }
+
+    @Override
+    protected void doStart() throws Exception
+    {
+        // Required of CDI
+        Resource baseResource = getBaseResource();
+        if (baseResource == null)
+        {
+            throw new NullPointerException("baseResource must be set (to so it can find the beans.xml)");
+        }
+        
+        boolean foundBeansXml = false;
+
+        // Verify that beans.xml is present, otherwise weld will fail silently.
+        for(String beansXmlPath: REQUIRED_BEANS_XML_PATHS) {
+            Resource res = baseResource.addPath(beansXmlPath);
+            if (res == null)
+            {
+                // not found, skip it
+                continue;
+            }
+            
+            if (res.exists())
+            {
+                foundBeansXml = true;
+            }
+
+            if (res.isDirectory())
+            {
+                throw new IOException("Directory conflicts with expected file: " + res.getURI().toASCIIString());
+            }
+        }
+        
+        if (!foundBeansXml)
+        {
+            StringBuilder err = new StringBuilder();
+            err.append("Unable to find required beans.xml from the baseResource: ");
+            err.append(baseResource.getURI().toASCIIString()).append(System.lineSeparator());
+            err.append("Searched for: ");
+            for (String beansXmlPath : REQUIRED_BEANS_XML_PATHS)
+            {
+                err.append(System.lineSeparator());
+                err.append("  ").append(beansXmlPath);
+            }
+            LOG.warn("ERROR: {}",err.toString());
+            throw new IOException(err.toString());
+        }
+
+        // Initialize Weld
+        JettyWeldInitializer.initContext(this);
+
+        // Wire up Weld (what's usually done via the ServletContainerInitializer)
+        ServletContext ctx = getServletContext();
+        
+        // Fake the call to ServletContainerInitializer
+        ClassLoader orig = Thread.currentThread().getContextClassLoader();
+        try
+        {
+            Thread.currentThread().setContextClassLoader(ctx.getClassLoader());
+            
+            EnhancedListener weldListener = new EnhancedListener();
+            Set<Class<?>> classes = Collections.emptySet();
+            weldListener.onStartup(classes,ctx);
+            
+            // add the rest of the Weld Listeners
+            ctx.addListener(weldListener);
+        }
+        finally
+        {
+            Thread.currentThread().setContextClassLoader(orig);
+        }
+
+        // Let normal ServletContextHandler startup continue its merry way
+        super.doStart();
+    }
+}
diff --git a/jetty-cdi/cdi-servlet/src/main/java/org/eclipse/jetty/cdi/servlet/JettyWeldInitializer.java b/jetty-cdi/cdi-servlet/src/main/java/org/eclipse/jetty/cdi/servlet/JettyWeldInitializer.java
new file mode 100644
index 0000000..ff4ecd2
--- /dev/null
+++ b/jetty-cdi/cdi-servlet/src/main/java/org/eclipse/jetty/cdi/servlet/JettyWeldInitializer.java
@@ -0,0 +1,77 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.servlet;
+
+import javax.naming.NamingException;
+import javax.naming.Reference;
+
+import org.eclipse.jetty.plus.jndi.Resource;
+import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.webapp.WebAppContext;
+
+/**
+ * Utility class suitable for initializing CDI/Weld on Embedded Jetty
+ */
+public class JettyWeldInitializer
+{
+    /**
+     * Initialize WebAppContext to support CDI/Weld.
+     * <p>
+     * Initializes Context, then sets up WebAppContext system and server classes to allow Weld to operate from Server
+     * level.
+     * <p>
+     * Includes {@link #initContext(ContextHandler)} behavior as well.
+     * @param webapp the webapp
+     * @throws NamingException if unable to bind BeanManager context
+     */
+    public static void initWebApp(WebAppContext webapp) throws NamingException
+    {
+        initContext(webapp);
+
+        // webapp cannot change / replace weld classes
+        webapp.addSystemClass("org.jboss.weld.");
+        webapp.addSystemClass("org.jboss.classfilewriter.");
+        webapp.addSystemClass("org.jboss.logging.");
+        webapp.addSystemClass("com.google.common.");
+        webapp.addSystemClass("org.eclipse.jetty.cdi.websocket.annotation.");
+        
+
+        // don't hide weld classes from webapps (allow webapp to use ones from system classloader)
+        webapp.prependServerClass("-org.eclipse.jetty.cdi.websocket.annotation.");
+        webapp.prependServerClass("-org.eclipse.jetty.cdi.core.");
+        webapp.prependServerClass("-org.eclipse.jetty.cdi.servlet.");
+        webapp.addServerClass("-org.jboss.weld.");
+        webapp.addServerClass("-org.jboss.classfilewriter.");
+        webapp.addServerClass("-org.jboss.logging.");
+        webapp.addServerClass("-com.google.common.");
+    
+    }
+
+    public static void initContext(ContextHandler handler) throws NamingException
+    {
+        // Add context specific weld container reference.
+        // See https://issues.jboss.org/browse/WELD-1710
+        // and https://github.com/weld/core/blob/2.2.5.Final/environments/servlet/core/src/main/java/org/jboss/weld/environment/servlet/WeldServletLifecycle.java#L244-L253
+        handler.setInitParameter("org.jboss.weld.environment.container.class","org.jboss.weld.environment.jetty.JettyContainer");
+
+        // Setup Weld BeanManager reference
+        Reference ref = new Reference("javax.enterprise.inject.spi.BeanManager","org.jboss.weld.resources.ManagerObjectFactory",null);
+        new Resource(handler,"BeanManager",ref);
+    }
+}
diff --git a/jetty-cdi/cdi-servlet/src/main/java/org/eclipse/jetty/cdi/servlet/WeldDeploymentBinding.java b/jetty-cdi/cdi-servlet/src/main/java/org/eclipse/jetty/cdi/servlet/WeldDeploymentBinding.java
new file mode 100644
index 0000000..cd365ff
--- /dev/null
+++ b/jetty-cdi/cdi-servlet/src/main/java/org/eclipse/jetty/cdi/servlet/WeldDeploymentBinding.java
@@ -0,0 +1,57 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.servlet;
+
+import org.eclipse.jetty.deploy.App;
+import org.eclipse.jetty.deploy.AppLifeCycle;
+import org.eclipse.jetty.deploy.graph.Node;
+import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.webapp.WebAppContext;
+
+/**
+ * Perform some basic weld configuration of WebAppContext
+ */
+public class WeldDeploymentBinding implements AppLifeCycle.Binding
+{
+    public String[] getBindingTargets()
+    {
+        return new String[] { "deploying" };
+    }
+
+    public void processBinding(Node node, App app) throws Exception
+    {
+        ContextHandler handler = app.getContextHandler();
+        if (handler == null)
+        {
+            throw new NullPointerException("No Handler created for App: " + app);
+        }
+
+        if (handler instanceof WebAppContext)
+        {
+            // Do webapp specific init
+            WebAppContext webapp = (WebAppContext)handler;
+            JettyWeldInitializer.initWebApp(webapp);
+        }
+        else
+        {
+            // Do general init
+            JettyWeldInitializer.initContext(handler);
+        }
+    }
+}
diff --git a/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/Dumper.java b/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/Dumper.java
new file mode 100644
index 0000000..a7ff5c8
--- /dev/null
+++ b/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/Dumper.java
@@ -0,0 +1,27 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.servlet;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+public interface Dumper
+{
+    public void dump(PrintWriter out) throws IOException;
+}
diff --git a/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/IsoTimeFormatter.java b/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/IsoTimeFormatter.java
new file mode 100644
index 0000000..2ff054e
--- /dev/null
+++ b/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/IsoTimeFormatter.java
@@ -0,0 +1,39 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.servlet;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Locale;
+import java.util.TimeZone;
+
+import javax.inject.Named;
+
+@Named("iso")
+public class IsoTimeFormatter implements TimeFormatter
+{
+    @Override
+    public String format(Calendar cal)
+    {
+        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'",Locale.US);
+        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+        return dateFormat.format(cal.getTime());
+    }
+}
diff --git a/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/LocaleTimeFormatter.java b/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/LocaleTimeFormatter.java
new file mode 100644
index 0000000..9e74d76
--- /dev/null
+++ b/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/LocaleTimeFormatter.java
@@ -0,0 +1,38 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.servlet;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+
+import javax.enterprise.inject.Default;
+import javax.inject.Named;
+
+@Named("locale")
+@Default
+public class LocaleTimeFormatter implements TimeFormatter
+{
+    public static final TimeFormatter INSTANCE = new LocaleTimeFormatter();
+
+    @Override
+    public String format(Calendar cal)
+    {
+        return new SimpleDateFormat().format(cal.getTime());
+    }
+}
diff --git a/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/RequestInfoServlet.java b/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/RequestInfoServlet.java
new file mode 100644
index 0000000..20b4cf9
--- /dev/null
+++ b/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/RequestInfoServlet.java
@@ -0,0 +1,69 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.servlet;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import javax.enterprise.inject.Any;
+import javax.enterprise.inject.Instance;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.cdi.core.NamedLiteral;
+
+@SuppressWarnings("serial")
+@WebServlet("/req-info")
+public class RequestInfoServlet extends HttpServlet
+{
+    @Inject
+    @Any
+    private Instance<Dumper> dumpers;
+    
+    @Inject
+    @Named("params")
+    private Dumper defaultDumper;
+
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+    {
+        resp.setContentType("text/plain");
+        PrintWriter out = resp.getWriter();
+        
+        Dumper dumper = defaultDumper;
+        
+        String dumperId = req.getParameter("dumperId");
+        
+        if (dumperId != null)
+        {
+            Instance<Dumper> inst = dumpers.select(new NamedLiteral(dumperId));
+            if (!inst.isAmbiguous() && !inst.isUnsatisfied())
+            {
+                dumper = inst.get();
+            }
+        }
+        
+        dumper.dump(out);
+    }
+}
diff --git a/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/RequestParamsDumper.java b/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/RequestParamsDumper.java
new file mode 100644
index 0000000..53291ef
--- /dev/null
+++ b/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/RequestParamsDumper.java
@@ -0,0 +1,71 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.servlet;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.servlet.http.HttpServletRequest;
+
+@Named("params")
+@RequestScoped
+public class RequestParamsDumper implements Dumper
+{
+    @Inject
+    private HttpServletRequest request;
+
+    @Override
+    public void dump(PrintWriter out) throws IOException
+    {
+        out.printf("request is %s%n",request == null ? "NULL" : "PRESENT");
+
+        if (request != null)
+        {
+            Map<String, String[]> params = request.getParameterMap();
+            List<String> paramNames = new ArrayList<>();
+            paramNames.addAll(params.keySet());
+            Collections.sort(paramNames);
+
+            out.printf("parameters.size = [%d]%n",params.size());
+
+            for (String name : paramNames)
+            {
+                out.printf(" param[%s] = [",name);
+                boolean delim = false;
+                for (String val : params.get(name))
+                {
+                    if (delim)
+                    {
+                        out.print(", ");
+                    }
+                    out.print(val);
+                    delim = true;
+                }
+                out.println("]");
+            }
+        }
+    }
+}
diff --git a/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/TimeFormatter.java b/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/TimeFormatter.java
new file mode 100644
index 0000000..0bd5b75
--- /dev/null
+++ b/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/TimeFormatter.java
@@ -0,0 +1,26 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.servlet;
+
+import java.util.Calendar;
+
+public interface TimeFormatter
+{
+    public String format(Calendar cal);
+}
diff --git a/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/TimeServlet.java b/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/TimeServlet.java
new file mode 100644
index 0000000..db82609
--- /dev/null
+++ b/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/TimeServlet.java
@@ -0,0 +1,59 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.servlet;
+
+import java.io.IOException;
+import java.util.Calendar;
+
+import javax.enterprise.inject.Any;
+import javax.enterprise.inject.Instance;
+import javax.inject.Inject;
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.cdi.core.NamedLiteral;
+
+@SuppressWarnings("serial")
+@WebServlet(urlPatterns = "/time")
+public class TimeServlet extends HttpServlet
+{
+    @Inject
+    @Any
+    Instance<TimeFormatter> formatters;
+
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+    {
+        resp.setContentType("text/plain");
+
+        String timeType = req.getParameter("type");
+        TimeFormatter time = LocaleTimeFormatter.INSTANCE;
+
+        Instance<TimeFormatter> inst = formatters.select(new NamedLiteral(timeType));
+        if (!inst.isAmbiguous() && !inst.isUnsatisfied())
+        {
+            time = inst.get();
+        }
+
+        resp.getWriter().println(time.format(Calendar.getInstance()));
+    }
+}
diff --git a/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/WeldInitializationTest.java b/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/WeldInitializationTest.java
new file mode 100644
index 0000000..03df272
--- /dev/null
+++ b/jetty-cdi/cdi-servlet/src/test/java/org/eclipse/jetty/cdi/servlet/WeldInitializationTest.java
@@ -0,0 +1,115 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.servlet;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.Assert.assertThat;
+
+import java.io.File;
+import java.net.URI;
+
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+import org.eclipse.jetty.toolchain.test.SimpleRequest;
+import org.eclipse.jetty.util.log.JettyLogHandler;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.resource.Resource;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class WeldInitializationTest
+{
+    private static final Logger LOG = Log.getLogger(WeldInitializationTest.class);
+    private static Server server;
+    private static URI serverHttpURI;
+
+    @BeforeClass
+    public static void startServer() throws Exception
+    {
+        JettyLogHandler.config();
+
+        server = new Server();
+        ServerConnector connector = new ServerConnector(server);
+        connector.setPort(0);
+        server.addConnector(connector);
+
+        EmbeddedCdiHandler context = new EmbeddedCdiHandler();
+
+        File baseDir = MavenTestingUtils.getTestResourcesDir();
+
+        context.setBaseResource(Resource.newResource(baseDir));
+        context.setContextPath("/");
+        server.setHandler(context);
+
+        // Add some servlets
+        context.addServlet(TimeServlet.class,"/time");
+        context.addServlet(RequestInfoServlet.class,"/req-info");
+
+        server.start();
+
+        String host = connector.getHost();
+        if (host == null)
+        {
+            host = "localhost";
+        }
+        int port = connector.getLocalPort();
+        serverHttpURI = new URI(String.format("http://%s:%d/",host,port));
+    }
+
+    @AfterClass
+    public static void stopServer()
+    {
+        try
+        {
+            server.stop();
+        }
+        catch (Exception e)
+        {
+            LOG.warn(e);
+        }
+    }
+
+    @Test
+    public void testRequestParamServletDefault() throws Exception
+    {
+        SimpleRequest req = new SimpleRequest(serverHttpURI);
+        String resp = req.getString("req-info");
+
+        System.out.println(resp);
+
+        assertThat("Response",resp,containsString("request is PRESENT"));
+        assertThat("Response",resp,containsString("parameters.size = [0]"));
+    }
+
+    @Test
+    public void testRequestParamServletAbc() throws Exception
+    {
+        SimpleRequest req = new SimpleRequest(serverHttpURI);
+        String resp = req.getString("req-info?abc=123");
+
+        System.out.println(resp);
+
+        assertThat("Response",resp,containsString("request is PRESENT"));
+        assertThat("Response",resp,containsString("parameters.size = [1]"));
+        assertThat("Response",resp,containsString(" param[abc] = [123]"));
+    }
+}
diff --git a/jetty-cdi/cdi-servlet/src/test/resources/META-INF/beans.xml b/jetty-cdi/cdi-servlet/src/test/resources/META-INF/beans.xml
new file mode 100644
index 0000000..f158a71
--- /dev/null
+++ b/jetty-cdi/cdi-servlet/src/test/resources/META-INF/beans.xml
@@ -0,0 +1,6 @@
+<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
+        http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
+       bean-discovery-mode="all">
+</beans>
\ No newline at end of file
diff --git a/jetty-cdi/cdi-servlet/src/test/resources/jetty-logging.properties b/jetty-cdi/cdi-servlet/src/test/resources/jetty-logging.properties
new file mode 100644
index 0000000..f69b351
--- /dev/null
+++ b/jetty-cdi/cdi-servlet/src/test/resources/jetty-logging.properties
@@ -0,0 +1,11 @@
+org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
+org.jboss.LEVEL=DEBUG
+org.eclipse.jetty.LEVEL=INFO
+
+org.eclipse.jetty.util.DecoratedObjectFactory.LEVEL=DEBUG
+org.eclipse.jetty.cdi.LEVEL=DEBUG
+
+# org.eclipse.jetty.LEVEL=DEBUG
+# org.eclipse.jetty.websocket.LEVEL=DEBUG
+# org.eclipse.jetty.websocket.client.LEVEL=DEBUG
+
diff --git a/jetty-cdi/cdi-servlet/src/test/resources/logging.properties b/jetty-cdi/cdi-servlet/src/test/resources/logging.properties
new file mode 100644
index 0000000..cfec8c7
--- /dev/null
+++ b/jetty-cdi/cdi-servlet/src/test/resources/logging.properties
@@ -0,0 +1,2 @@
+handlers = org.eclipse.jetty.util.log.JettyLogHandler
+.level=FINE
diff --git a/jetty-cdi/cdi-websocket/pom.xml b/jetty-cdi/cdi-websocket/pom.xml
new file mode 100644
index 0000000..105fda5
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/pom.xml
@@ -0,0 +1,71 @@
+<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>
+    <groupId>org.eclipse.jetty.cdi</groupId>
+    <artifactId>jetty-cdi-parent</artifactId>
+    <version>9.3.6-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>cdi-websocket</artifactId>
+  <name>Jetty :: CDI :: WebSocket</name>
+  <url>http://www.eclipse.org/jetty</url>
+  <packaging>jar</packaging>
+  <properties>
+    <weld.version>2.2.9.Final</weld.version>
+    <bundle-symbolic-name>${project.groupId}.websocket</bundle-symbolic-name>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.eclipse.jetty.cdi</groupId>
+      <artifactId>cdi-core</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>websocket-common</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <!-- below here lie testing dragons -->
+    <dependency>
+       <groupId>org.eclipse.jetty</groupId>
+       <artifactId>apache-jsp</artifactId>
+       <version>${project.version}</version>
+       <scope>test</scope>
+     </dependency>
+    <dependency>
+      <groupId>org.jboss.weld</groupId>
+      <artifactId>weld-core</artifactId>
+      <version>${weld.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.weld.se</groupId>
+      <artifactId>weld-se-core</artifactId>
+      <version>${weld.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.cdi</groupId>
+      <artifactId>cdi-core</artifactId>
+      <version>${project.version}</version>
+      <classifier>tests</classifier>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.cdi</groupId>
+      <artifactId>cdi-servlet</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>javax-websocket-server-impl</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.toolchain</groupId>
+      <artifactId>jetty-test-helper</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/AbstractContainerListener.java b/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/AbstractContainerListener.java
new file mode 100644
index 0000000..e3452ae
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/AbstractContainerListener.java
@@ -0,0 +1,73 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket;
+
+import org.eclipse.jetty.util.component.Container;
+import org.eclipse.jetty.util.component.LifeCycle;
+
+/**
+ * Abstract implementation of listener that needs both Container events and LifeCycle events
+ */
+public abstract class AbstractContainerListener implements LifeCycle.Listener, Container.InheritedListener
+{
+    @Override
+    public void beanAdded(Container parent, Object child)
+    {
+        if (child instanceof LifeCycle)
+        {
+            ((LifeCycle)child).addLifeCycleListener(this);
+        }
+    }
+
+    @Override
+    public void beanRemoved(Container parent, Object child)
+    {
+        if (child instanceof LifeCycle)
+        {
+            ((LifeCycle)child).removeLifeCycleListener(this);
+        }
+    }
+
+    @Override
+    public void lifeCycleFailure(LifeCycle event, Throwable cause)
+    {
+    }
+
+    @Override
+    public void lifeCycleStarted(LifeCycle event)
+    {
+    }
+
+    @Override
+    public void lifeCycleStarting(LifeCycle event)
+    {
+    }
+
+    @Override
+    public void lifeCycleStopped(LifeCycle event)
+    {
+
+    }
+
+    @Override
+    public void lifeCycleStopping(LifeCycle event)
+    {
+    }
+
+}
diff --git a/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/JavaWebSocketSessionProducer.java b/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/JavaWebSocketSessionProducer.java
new file mode 100644
index 0000000..dd7728d
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/JavaWebSocketSessionProducer.java
@@ -0,0 +1,56 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket;
+
+import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.websocket.Session;
+
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+/**
+ * Producer of {@link javax.websocket.Session} instances
+ */
+public class JavaWebSocketSessionProducer
+{
+    private static final Logger LOG = Log.getLogger(JavaWebSocketSessionProducer.class);
+
+    @Produces
+    public Session getSession(InjectionPoint injectionPoint)
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("getSession({})",injectionPoint);
+        }
+        org.eclipse.jetty.websocket.api.Session sess = WebSocketScopeContext.current().getSession();
+        if (sess == null)
+        {
+            throw new IllegalStateException("No Session Available");
+        }
+
+        if (sess instanceof javax.websocket.Session)
+        {
+            return (Session)sess;
+        }
+
+        throw new IllegalStateException("Incompatible Session, expected <" + javax.websocket.Session.class.getName() + ">, but got <"
+                + sess.getClass().getName() + "> instead");
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/JettyWebSocketSessionProducer.java b/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/JettyWebSocketSessionProducer.java
new file mode 100644
index 0000000..cf55822
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/JettyWebSocketSessionProducer.java
@@ -0,0 +1,55 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket;
+
+import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.spi.InjectionPoint;
+
+import org.eclipse.jetty.cdi.websocket.annotation.WebSocketScope;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.websocket.api.Session;
+
+/**
+ * Producer of {@link org.eclipse.jetty.websocket.api.Session} instances
+ */
+public class JettyWebSocketSessionProducer
+{
+    private static final Logger LOG = Log.getLogger(JettyWebSocketSessionProducer.class);
+
+    @Produces
+    public Session getSession(InjectionPoint injectionPoint)
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("getSession({})",injectionPoint);
+        }
+        WebSocketScopeContext ctx = WebSocketScopeContext.current();
+        if (ctx == null)
+        {
+            throw new IllegalStateException("Not in a " + WebSocketScope.class.getName());
+        }
+        org.eclipse.jetty.websocket.api.Session sess = ctx.getSession();
+        if (sess == null)
+        {
+            throw new IllegalStateException("No Session Available");
+        }
+        return sess;
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/WebSocketCdiInitializer.java b/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/WebSocketCdiInitializer.java
new file mode 100644
index 0000000..f558e7a
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/WebSocketCdiInitializer.java
@@ -0,0 +1,70 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket;
+
+import java.util.Set;
+
+import javax.servlet.ServletContainerInitializer;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+
+import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.util.component.ContainerLifeCycle;
+import org.eclipse.jetty.util.thread.ThreadClassLoaderScope;
+
+public class WebSocketCdiInitializer implements ServletContainerInitializer
+{
+    public static void configureContext(ServletContextHandler context) throws ServletException
+    {
+        try (ThreadClassLoaderScope scope = new ThreadClassLoaderScope(context.getClassLoader()))
+        {
+            addListeners(context);
+        }
+    }
+
+    @Override
+    public void onStartup(Set<Class<?>> c, ServletContext context) throws ServletException
+    {
+        ContextHandler handler = ContextHandler.getContextHandler(context);
+
+        if (handler == null)
+        {
+            throw new ServletException("Not running on Jetty, WebSocket+CDI support unavailable");
+        }
+
+        if (!(handler instanceof ServletContextHandler))
+        {
+            throw new ServletException("Not running in Jetty ServletContextHandler, WebSocket+CDI support unavailable");
+        }
+
+        ServletContextHandler jettyContext = (ServletContextHandler)handler;
+        try (ThreadClassLoaderScope scope = new ThreadClassLoaderScope(context.getClassLoader()))
+        {
+            addListeners(jettyContext);
+        }
+    }
+    
+    private static void addListeners(ContainerLifeCycle container)
+    {
+        WebSocketCdiListener listener = new WebSocketCdiListener();
+        container.addLifeCycleListener(listener);
+        container.addEventListener(listener);
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/WebSocketCdiListener.java b/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/WebSocketCdiListener.java
new file mode 100644
index 0000000..536ee48
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/WebSocketCdiListener.java
@@ -0,0 +1,137 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket;
+
+import java.util.Set;
+
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.CDI;
+
+import org.eclipse.jetty.cdi.core.AnyLiteral;
+import org.eclipse.jetty.cdi.core.ScopedInstance;
+import org.eclipse.jetty.util.component.ContainerLifeCycle;
+import org.eclipse.jetty.util.component.LifeCycle;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketSessionScope;
+
+public class WebSocketCdiListener extends AbstractContainerListener
+{
+    static final Logger LOG = Log.getLogger(WebSocketCdiListener.class);
+
+    @SuppressWarnings(
+    { "rawtypes", "unchecked" })
+    public static <T> ScopedInstance<T> newInstance(Class<T> clazz)
+    {
+        BeanManager bm = CDI.current().getBeanManager();
+
+        ScopedInstance sbean = new ScopedInstance();
+        Set<Bean<?>> beans = bm.getBeans(clazz,AnyLiteral.INSTANCE);
+        if (beans.size() > 0)
+        {
+            sbean.bean = beans.iterator().next();
+            sbean.creationalContext = bm.createCreationalContext(sbean.bean);
+            sbean.instance = bm.getReference(sbean.bean,clazz,sbean.creationalContext);
+            return sbean;
+        }
+        else
+        {
+            throw new RuntimeException(String.format("Can't find class %s",clazz));
+        }
+    }
+
+    public static class ContainerListener extends AbstractContainerListener
+    {
+        private static final Logger LOG = Log.getLogger(WebSocketCdiListener.ContainerListener.class);
+        private final WebSocketContainerScope container;
+        private final ScopedInstance<WebSocketScopeContext> wsScope;
+
+        public ContainerListener(WebSocketContainerScope container)
+        {
+            this.container = container;
+            this.wsScope = newInstance(WebSocketScopeContext.class);
+            this.wsScope.instance.create();
+        }
+
+        @Override
+        public void lifeCycleStarted(LifeCycle event)
+        {
+            if (event == container)
+            {
+                if (LOG.isDebugEnabled())
+                {
+                    LOG.debug("starting websocket container [{}]",event);
+                }
+                wsScope.instance.begin();
+                return;
+            }
+            
+            if (event instanceof WebSocketSessionScope)
+            {
+                if (LOG.isDebugEnabled())
+                {
+                    LOG.debug("starting websocket session [{}]",event);
+                }
+                wsScope.instance.setSession((Session)event);
+                return;
+            }
+        }
+
+        @Override
+        public void lifeCycleStopped(LifeCycle event)
+        {
+            if (event == container)
+            {
+                if (LOG.isDebugEnabled())
+                {
+                    LOG.debug("stopped websocket container [{}]",event);
+                }
+                this.wsScope.instance.end();
+                this.wsScope.instance.destroy();
+                this.wsScope.destroy();
+            }
+        }
+    }
+    
+    @Override
+    public void lifeCycleStarting(LifeCycle event)
+    {
+        if (event instanceof WebSocketContainerScope)
+        {
+            if (LOG.isDebugEnabled())
+            {
+                LOG.debug("started websocket container [{}]",event);
+            }
+            ContainerListener listener = new ContainerListener((WebSocketContainerScope)event);
+            if (event instanceof ContainerLifeCycle)
+            {
+                ContainerLifeCycle container = (ContainerLifeCycle)event;
+                container.addLifeCycleListener(listener);
+                container.addEventListener(listener);
+            }
+            else
+            {
+                throw new RuntimeException("Unable to setup CDI against non-container: " + event.getClass().getName());
+            }
+        }
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/WebSocketScopeContext.java b/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/WebSocketScopeContext.java
new file mode 100644
index 0000000..566667a
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/WebSocketScopeContext.java
@@ -0,0 +1,230 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket;
+
+import java.lang.annotation.Annotation;
+import java.util.List;
+import java.util.Set;
+
+import javax.enterprise.context.spi.Context;
+import javax.enterprise.context.spi.Contextual;
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.inject.Inject;
+
+import org.eclipse.jetty.cdi.core.AnyLiteral;
+import org.eclipse.jetty.cdi.core.ScopedInstance;
+import org.eclipse.jetty.cdi.core.SimpleBeanStore;
+import org.eclipse.jetty.cdi.websocket.annotation.WebSocketScope;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.websocket.api.Session;
+
+/**
+ * WebSocket Scope Context.
+ * <p>
+ * A CDI Context definition for how CDI will use objects defined to belong to the WebSocketScope
+ */
+public class WebSocketScopeContext implements Context
+{
+    private static final Logger LOG = Log.getLogger(WebSocketScopeContext.class);
+
+    private static ThreadLocal<WebSocketScopeContext> current = new ThreadLocal<>();
+
+    public static WebSocketScopeContext current()
+    {
+        return current.get();
+    }
+
+    private SimpleBeanStore beanStore;
+
+    @Inject
+    private BeanManager beanManager;
+
+    private ThreadLocal<org.eclipse.jetty.websocket.api.Session> session = new ThreadLocal<>();
+
+    public void begin()
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("{} begin()",this);
+        }
+        current.set(this);
+    }
+
+    public void create()
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("{} create()",this);
+        }
+        current.set(this);
+        beanStore = new SimpleBeanStore();
+    }
+
+    public void destroy()
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("{} destroy()",this);
+        }
+
+        beanStore.destroy();
+    }
+
+    public void end()
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("{} end()",this);
+        }
+        beanStore.clear();
+    }
+
+    @SuppressWarnings({ "unchecked" })
+    @Override
+    public <T> T get(Contextual<T> contextual)
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("{} get({})",this,contextual);
+        }
+
+        Bean<T> bean = (Bean<T>)contextual;
+
+        if (bean.getBeanClass().isAssignableFrom(Session.class))
+        {
+            return (T)this.session;
+        }
+        
+        if (beanStore == null)
+        {
+            return null;
+        }
+
+        List<ScopedInstance<?>> beans = beanStore.getBeans(contextual);
+
+        if ((beans != null) && (!beans.isEmpty()))
+        {
+            return (T)beans.get(0).instance;
+        }
+
+        return null;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T> T get(Contextual<T> contextual, CreationalContext<T> creationalContext)
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("{} get({},{})",this,contextual,creationalContext);
+        }
+
+        Bean<T> bean = (Bean<T>)contextual;
+
+        if (bean.getBeanClass().isAssignableFrom(Session.class))
+        {
+            return (T)this.session;
+        }
+
+        if (beanStore == null)
+        {
+            beanStore = new SimpleBeanStore();
+        }
+
+        List<ScopedInstance<?>> beans = beanStore.getBeans(contextual);
+
+        if ((beans != null) && (!beans.isEmpty()))
+        {
+            for (ScopedInstance<?> instance : beans)
+            {
+                if (instance.bean.equals(bean))
+                {
+                    return (T)instance.instance;
+                }
+            }
+        }
+
+        // no bean found, create it
+        T t = bean.create(creationalContext);
+        ScopedInstance<T> customInstance = new ScopedInstance<>();
+        customInstance.bean = bean;
+        customInstance.creationalContext = creationalContext;
+        customInstance.instance = t;
+        beanStore.addBean(customInstance);
+        return t;
+    }
+
+    @Override
+    public Class<? extends Annotation> getScope()
+    {
+        return WebSocketScope.class;
+    }
+
+    @Override
+    public boolean isActive()
+    {
+        return true;
+    }
+
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    public <T> T newInstance(Class<T> clazz)
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("newInstance({})",clazz);
+        }
+        Set<Bean<?>> beans = beanManager.getBeans(clazz,AnyLiteral.INSTANCE);
+        if (beans.isEmpty())
+        {
+            return null;
+        }
+
+        Bean bean = beans.iterator().next();
+        CreationalContext cc = beanManager.createCreationalContext(bean);
+        return (T)beanManager.getReference(bean,clazz,cc);
+    }
+
+    public void setSession(org.eclipse.jetty.websocket.api.Session sess)
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("{} setSession({})",this,sess);
+        }
+        current.set(this);
+        this.session.set(sess);
+    }
+
+    public org.eclipse.jetty.websocket.api.Session getSession()
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("{} getSession()",this);
+        }
+        return this.session.get();
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("%s@%X[%s]",this.getClass().getSimpleName(),hashCode(),beanStore);
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/WebSocketScopeExtension.java b/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/WebSocketScopeExtension.java
new file mode 100644
index 0000000..bfac413
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/WebSocketScopeExtension.java
@@ -0,0 +1,74 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket;
+
+import javax.enterprise.context.Destroyed;
+import javax.enterprise.context.Initialized;
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.spi.AfterBeanDiscovery;
+import javax.enterprise.inject.spi.BeforeBeanDiscovery;
+import javax.enterprise.inject.spi.Extension;
+
+import org.eclipse.jetty.cdi.websocket.annotation.WebSocketScope;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+/**
+ * Register the various WebSocket specific components for CDI
+ */
+public class WebSocketScopeExtension implements Extension
+{
+    private static final Logger LOG = Log.getLogger(WebSocketScopeExtension.class);
+
+    public void addScope(@Observes final BeforeBeanDiscovery event)
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("addScope()");
+        }
+        // Add our scope
+        event.addScope(WebSocketScope.class,true,false);
+    }
+
+    public void registerContext(@Observes final AfterBeanDiscovery event)
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("registerContext()");
+        }
+        // Register our context
+        event.addContext(new WebSocketScopeContext());
+    }
+
+    public void logWsScopeInit(@Observes @Initialized(WebSocketScope.class) org.eclipse.jetty.websocket.api.Session sess)
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("Initialized @WebSocketScope - {}",sess);
+        }
+    }
+
+    public void logWsScopeDestroyed(@Observes @Destroyed(WebSocketScope.class) org.eclipse.jetty.websocket.api.Session sess)
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("Destroyed @WebSocketScope - {}",sess);
+        }
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/annotation/WebSocketScope.java b/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/annotation/WebSocketScope.java
new file mode 100644
index 0000000..cc6783e
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/main/java/org/eclipse/jetty/cdi/websocket/annotation/WebSocketScope.java
@@ -0,0 +1,45 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import javax.inject.Scope;
+
+/**
+ * A CDI Context Scope for a WebSocket Session / Endpoint
+ * <p>
+ * <em>CAUTION: This is a highly speculative scope defined by Jetty.  One that will likely be replaced by a formal spec later</em>
+ * <p>
+ * At the time of implementation (of this scope), no standard scope exists for websocket session lifecycle.
+ */
+@Scope
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD })
+@Inherited
+@Documented
+public @interface WebSocketScope
+{
+
+}
diff --git a/jetty-cdi/cdi-websocket/src/main/resources/META-INF/beans.xml b/jetty-cdi/cdi-websocket/src/main/resources/META-INF/beans.xml
new file mode 100644
index 0000000..aeeef53
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/main/resources/META-INF/beans.xml
@@ -0,0 +1,4 @@
+<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
+
+</beans>
\ No newline at end of file
diff --git a/jetty-cdi/cdi-websocket/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension b/jetty-cdi/cdi-websocket/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
new file mode 100644
index 0000000..93723bc
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
@@ -0,0 +1 @@
+org.eclipse.jetty.cdi.websocket.WebSocketScopeExtension
\ No newline at end of file
diff --git a/jetty-cdi/cdi-websocket/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer b/jetty-cdi/cdi-websocket/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer
new file mode 100644
index 0000000..f527270
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer
@@ -0,0 +1 @@
+org.eclipse.jetty.cdi.websocket.WebSocketCdiInitializer
\ No newline at end of file
diff --git a/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/CheckSocket.java b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/CheckSocket.java
new file mode 100644
index 0000000..825d6b6
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/CheckSocket.java
@@ -0,0 +1,99 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jetty.toolchain.test.EventQueue;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.api.WebSocketAdapter;
+import org.eclipse.jetty.websocket.api.annotations.WebSocket;
+
+@WebSocket
+public class CheckSocket extends WebSocketAdapter
+{
+    private static final Logger LOG = Log.getLogger(CheckSocket.class);
+    private CountDownLatch closeLatch = new CountDownLatch(1);
+    private CountDownLatch openLatch = new CountDownLatch(1);
+    private EventQueue<String> textMessages = new EventQueue<>();
+
+    public void awaitClose(int timeout, TimeUnit timeunit) throws InterruptedException
+    {
+        assertTrue("Timeout waiting for close",closeLatch.await(timeout,timeunit));
+    }
+
+    public void awaitOpen(int timeout, TimeUnit timeunit) throws InterruptedException
+    {
+        assertTrue("Timeout waiting for open",openLatch.await(timeout,timeunit));
+    }
+
+    public EventQueue<String> getTextMessages()
+    {
+        return textMessages;
+    }
+
+    @Override
+    public void onWebSocketClose(int statusCode, String reason)
+    {
+        LOG.debug("Close: {}, {}",statusCode,reason);
+        super.onWebSocketClose(statusCode,reason);
+        closeLatch.countDown();
+    }
+
+    @Override
+    public void onWebSocketConnect(Session sess)
+    {
+        LOG.debug("Open: {}",sess);
+        super.onWebSocketConnect(sess);
+        openLatch.countDown();
+    }
+    
+    @Override
+    public void onWebSocketError(Throwable cause)
+    {
+        LOG.warn("WebSocket Error",cause);
+        super.onWebSocketError(cause);
+    }
+
+    @Override
+    public void onWebSocketText(String message)
+    {
+        LOG.debug("TEXT: {}",message);
+        textMessages.add(message);
+    }
+
+    public void sendText(String msg) throws IOException
+    {
+        if (isConnected())
+        {
+            getRemote().sendString(msg);
+        }
+    }
+
+    public void close(int statusCode, String reason)
+    {
+        getSession().close(statusCode,reason);
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/basicapp/BasicAppTest.java b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/basicapp/BasicAppTest.java
new file mode 100644
index 0000000..33f6447
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/basicapp/BasicAppTest.java
@@ -0,0 +1,130 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket.basicapp;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.io.File;
+import java.net.URI;
+import java.util.concurrent.TimeUnit;
+
+import javax.websocket.server.ServerContainer;
+
+import org.eclipse.jetty.cdi.servlet.EmbeddedCdiHandler;
+import org.eclipse.jetty.cdi.websocket.CheckSocket;
+import org.eclipse.jetty.cdi.websocket.cdiapp.InfoSocket;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+import org.eclipse.jetty.util.log.JettyLogHandler;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.resource.Resource;
+import org.eclipse.jetty.websocket.api.StatusCode;
+import org.eclipse.jetty.websocket.client.WebSocketClient;
+import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class BasicAppTest
+{
+    private static final Logger LOG = Log.getLogger(BasicAppTest.class);
+    
+    private static Server server;
+    @SuppressWarnings("unused")
+    private static URI serverHttpURI;
+    private static URI serverWebsocketURI;
+
+    @BeforeClass
+    public static void startServer() throws Exception
+    {
+        JettyLogHandler.config();
+
+        server = new Server();
+        ServerConnector connector = new ServerConnector(server);
+        connector.setPort(0);
+        server.addConnector(connector);
+
+        EmbeddedCdiHandler context = new EmbeddedCdiHandler();
+
+        File baseDir = MavenTestingUtils.getTestResourcesDir();
+
+        context.setBaseResource(Resource.newResource(baseDir));
+        context.setContextPath("/");
+        server.setHandler(context);
+        
+        // Add some websockets
+        ServerContainer container = WebSocketServerContainerInitializer.configureContext(context);
+        container.addEndpoint(EchoSocket.class);
+        container.addEndpoint(InfoSocket.class);
+
+        server.start();
+
+        String host = connector.getHost();
+        if (host == null)
+        {
+            host = "localhost";
+        }
+        int port = connector.getLocalPort();
+        serverHttpURI = new URI(String.format("http://%s:%d/",host,port));
+        serverWebsocketURI = new URI(String.format("ws://%s:%d/",host,port));
+    }
+
+    @AfterClass
+    public static void stopServer()
+    {
+        try
+        {
+            server.stop();
+        }
+        catch (Exception e)
+        {
+            LOG.warn(e);
+        }
+    }
+
+    @Test
+    public void testWebSocketEcho() throws Exception
+    {
+        WebSocketClient client = new WebSocketClient();
+        try
+        {
+            client.start();
+            CheckSocket socket = new CheckSocket();
+            client.connect(socket,serverWebsocketURI.resolve("/echo"));
+
+            socket.awaitOpen(2,TimeUnit.SECONDS);
+            socket.sendText("Hello World");
+            socket.close(StatusCode.NORMAL,"Test complete");
+            socket.awaitClose(2,TimeUnit.SECONDS);
+
+            assertThat("Messages received",socket.getTextMessages().size(),is(1));
+            String response = socket.getTextMessages().poll();
+            System.err.println(response);
+
+            assertThat("Message[0]",response,is("Hello World"));
+        }
+        finally
+        {
+            client.stop();
+        }
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/basicapp/EchoSocket.java b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/basicapp/EchoSocket.java
new file mode 100644
index 0000000..5f0267f
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/basicapp/EchoSocket.java
@@ -0,0 +1,57 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket.basicapp;
+
+import javax.websocket.CloseReason;
+import javax.websocket.OnClose;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+@ServerEndpoint("/echo")
+public class EchoSocket
+{
+    private static final Logger LOG = Log.getLogger(EchoSocket.class);
+    @SuppressWarnings("unused")
+    private Session session;
+
+    @OnOpen
+    public void onOpen(Session session)
+    {
+        LOG.debug("onOpen(): {}",session);
+        this.session = session;
+    }
+
+    @OnClose
+    public void onClose(CloseReason close)
+    {
+        LOG.debug("onClose(): {}",close);
+        this.session = null;
+    }
+
+    @OnMessage
+    public String onMessage(String msg)
+    {
+        return msg;
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/basicscope/Food.java b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/basicscope/Food.java
new file mode 100644
index 0000000..c16b2b5
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/basicscope/Food.java
@@ -0,0 +1,100 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket.basicscope;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+
+public class Food
+{
+    private boolean constructed = false;
+    private boolean destroyed = false;
+    private String name;
+
+    @PreDestroy
+    void destroy()
+    {
+        destroyed = true;       
+    }
+
+    @Override
+    public boolean equals(Object obj)
+    {
+        if (this == obj)
+        {
+            return true;
+        }
+        if (obj == null)
+        {
+            return false;
+        }
+        if (getClass() != obj.getClass())
+        {
+            return false;
+        }
+        Food other = (Food)obj;
+        if (name == null)
+        {
+            if (other.name != null)
+            {
+                return false;
+            }
+        }
+        else if (!name.equals(other.name))
+        {
+            return false;
+        }
+        return true;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        final int prime = 31;
+        int result = 1;
+        result = (prime * result) + ((name == null) ? 0 : name.hashCode());
+        return result;
+    }
+
+    @PostConstruct
+    void init()
+    {
+        constructed = true;
+    }
+
+    public boolean isConstructed()
+    {
+        return constructed;
+    }
+
+    public boolean isDestroyed()
+    {
+        return destroyed;
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/basicscope/Meal.java b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/basicscope/Meal.java
new file mode 100644
index 0000000..b48852e
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/basicscope/Meal.java
@@ -0,0 +1,40 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket.basicscope;
+
+import javax.inject.Inject;
+
+public class Meal
+{
+    @Inject
+    private Food entree;
+
+    @Inject
+    private Food side;
+
+    public Food getEntree()
+    {
+        return entree;
+    }
+
+    public Food getSide()
+    {
+        return side;
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/basicscope/ScopeBasicsTest.java b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/basicscope/ScopeBasicsTest.java
new file mode 100644
index 0000000..1b58920
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/basicscope/ScopeBasicsTest.java
@@ -0,0 +1,97 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket.basicscope;
+
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.sameInstance;
+import static org.junit.Assert.assertThat;
+
+import java.util.Set;
+
+import javax.enterprise.inject.spi.Bean;
+
+import org.eclipse.jetty.cdi.core.AnyLiteral;
+import org.eclipse.jetty.cdi.core.ScopedInstance;
+import org.eclipse.jetty.cdi.core.logging.Logging;
+import org.jboss.weld.environment.se.Weld;
+import org.jboss.weld.environment.se.WeldContainer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ScopeBasicsTest
+{
+    private static Weld weld;
+    private static WeldContainer container;
+
+    @BeforeClass
+    public static void startWeld()
+    {
+        Logging.config();
+        weld = new Weld();
+        container = weld.initialize();
+    }
+
+    @AfterClass
+    public static void stopWeld()
+    {
+        weld.shutdown();
+    }
+
+    /**
+     * Validation of Scope / Inject logic on non-websocket-scoped classes
+     * @throws Exception on test failure
+     */
+    @Test
+    public void testBasicBehavior() throws Exception
+    {
+        ScopedInstance<Meal> meal1Bean = newInstance(Meal.class);
+        Meal meal1 = meal1Bean.instance;
+        ScopedInstance<Meal> meal2Bean = newInstance(Meal.class);
+        Meal meal2 = meal2Bean.instance;
+
+        assertThat("Meals are not the same",meal1,not(sameInstance(meal2)));
+
+        assertThat("Meal 1 Entree Constructed",meal1.getEntree().isConstructed(),is(true));
+        assertThat("Meal 1 Side Constructed",meal1.getSide().isConstructed(),is(true));
+
+        assertThat("Meal parts not the same",meal1.getEntree(),not(sameInstance(meal1.getSide())));
+        assertThat("Meal entrees are the same",meal1.getEntree(),not(sameInstance(meal2.getEntree())));
+        assertThat("Meal sides are the same",meal1.getSide(),not(sameInstance(meal2.getSide())));
+    }
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    public static <T> ScopedInstance<T> newInstance(Class<T> clazz) throws Exception
+    {
+        ScopedInstance sbean = new ScopedInstance();
+        Set<Bean<?>> beans = container.getBeanManager().getBeans(clazz,AnyLiteral.INSTANCE);
+        if (beans.size() > 0)
+        {
+            sbean.bean = beans.iterator().next();
+            sbean.creationalContext = container.getBeanManager().createCreationalContext(sbean.bean);
+            sbean.instance = container.getBeanManager().getReference(sbean.bean,clazz,sbean.creationalContext);
+            return sbean;
+        }
+        else
+        {
+            throw new Exception(String.format("Can't find class %s",clazz));
+        }
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/cdiapp/CdiAppTest.java b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/cdiapp/CdiAppTest.java
new file mode 100644
index 0000000..025a05d
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/cdiapp/CdiAppTest.java
@@ -0,0 +1,185 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket.cdiapp;
+
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.io.File;
+import java.net.URI;
+import java.util.concurrent.TimeUnit;
+
+import javax.websocket.server.ServerContainer;
+
+import org.eclipse.jetty.cdi.servlet.EmbeddedCdiHandler;
+import org.eclipse.jetty.cdi.websocket.CheckSocket;
+import org.eclipse.jetty.cdi.websocket.WebSocketCdiInitializer;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+import org.eclipse.jetty.util.log.JettyLogHandler;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.resource.Resource;
+import org.eclipse.jetty.websocket.api.StatusCode;
+import org.eclipse.jetty.websocket.client.WebSocketClient;
+import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class CdiAppTest
+{
+    private static final Logger LOG = Log.getLogger(CdiAppTest.class);
+    private static Server server;
+    private static URI serverWebsocketURI;
+
+    @BeforeClass
+    public static void startServer() throws Exception
+    {
+        JettyLogHandler.config();
+
+        server = new Server();
+        ServerConnector connector = new ServerConnector(server);
+        connector.setPort(0);
+        server.addConnector(connector);
+
+        EmbeddedCdiHandler context = new EmbeddedCdiHandler();
+        WebSocketCdiInitializer.configureContext(context);
+
+        File baseDir = MavenTestingUtils.getTestResourcesDir();
+
+        context.setBaseResource(Resource.newResource(baseDir));
+        context.setContextPath("/");
+        server.setHandler(context);
+        
+        // Add some websockets
+        ServerContainer container = WebSocketServerContainerInitializer.configureContext(context);
+        container.addEndpoint(EchoSocket.class);
+        container.addEndpoint(InfoSocket.class);
+
+        server.start();
+
+        String host = connector.getHost();
+        if (host == null)
+        {
+            host = "localhost";
+        }
+        int port = connector.getLocalPort();
+        serverWebsocketURI = new URI(String.format("ws://%s:%d/",host,port));
+    }
+
+    @AfterClass
+    public static void stopServer()
+    {
+        try
+        {
+            server.stop();
+        }
+        catch (Exception e)
+        {
+            LOG.warn(e);
+        }
+    }
+
+    @Test
+    public void testWebSocketActivated() throws Exception
+    {
+        WebSocketClient client = new WebSocketClient();
+        try
+        {
+            client.start();
+            CheckSocket socket = new CheckSocket();
+            client.connect(socket,serverWebsocketURI.resolve("/echo"));
+
+            socket.awaitOpen(2,TimeUnit.SECONDS);
+            socket.sendText("Hello");
+            socket.close(StatusCode.NORMAL,"Test complete");
+            socket.awaitClose(2,TimeUnit.SECONDS);
+
+            assertThat("Messages received",socket.getTextMessages().size(),is(1));
+            assertThat("Message[0]",socket.getTextMessages().poll(),is("Hello"));
+        }
+        finally
+        {
+            client.stop();
+        }
+    }
+
+    @Test
+    public void testWebSocket_Info_FieldPresence() throws Exception
+    {
+        WebSocketClient client = new WebSocketClient();
+        try
+        {
+            client.start();
+            CheckSocket socket = new CheckSocket();
+            client.connect(socket,serverWebsocketURI.resolve("/cdi-info"));
+
+            socket.awaitOpen(2,TimeUnit.SECONDS);
+            socket.sendText("info");
+            socket.close(StatusCode.NORMAL,"Test complete");
+            socket.awaitClose(2,TimeUnit.SECONDS);
+
+            assertThat("Messages received",socket.getTextMessages().size(),is(1));
+            String response = socket.getTextMessages().poll();
+            System.err.println(response);
+
+            assertThat("Message[0]",response,
+                    allOf(
+                            containsString("websocketSession is PRESENT"),
+                            containsString("httpSession is PRESENT"),
+                            containsString("servletContext is PRESENT")
+                    ));
+        }
+        finally
+        {
+            client.stop();
+        }
+    }
+    
+    @Test
+    public void testWebSocket_Info_DataFromCdi() throws Exception
+    {
+        WebSocketClient client = new WebSocketClient();
+        try
+        {
+            client.start();
+            CheckSocket socket = new CheckSocket();
+            client.connect(socket,serverWebsocketURI.resolve("/cdi-info"));
+
+            socket.awaitOpen(2,TimeUnit.SECONDS);
+            socket.sendText("data|stuff");
+            socket.close(StatusCode.NORMAL,"Test complete");
+            socket.awaitClose(2,TimeUnit.SECONDS);
+
+            assertThat("Messages received",socket.getTextMessages().size(),is(2));
+            String response = socket.getTextMessages().poll();
+            System.out.println("[0]" + response);
+            assertThat("Message[0]",response,containsString("Hello there stuff"));
+            System.out.println("[1]" + socket.getTextMessages().poll());
+        }
+        finally
+        {
+            client.stop();
+        }
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/cdiapp/DataMaker.java b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/cdiapp/DataMaker.java
new file mode 100644
index 0000000..b90b8b9
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/cdiapp/DataMaker.java
@@ -0,0 +1,43 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket.cdiapp;
+
+import javax.inject.Inject;
+
+import org.eclipse.jetty.cdi.websocket.annotation.WebSocketScope;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.websocket.api.Session;
+
+public class DataMaker
+{
+    private static final Logger LOG = Log.getLogger(DataMaker.class);
+    
+    @Inject
+    @WebSocketScope
+    private Session session;
+
+    public void processMessage(String msg) 
+    {
+        LOG.debug(".processMessage({})",msg);
+        LOG.debug("session = {}",session);
+
+        session.getRemote().sendStringByFuture("Hello there " + msg);
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/cdiapp/EchoSocket.java b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/cdiapp/EchoSocket.java
new file mode 100644
index 0000000..264b265
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/cdiapp/EchoSocket.java
@@ -0,0 +1,57 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket.cdiapp;
+
+import javax.websocket.CloseReason;
+import javax.websocket.OnClose;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+@ServerEndpoint("/echo")
+public class EchoSocket
+{
+    private static final Logger LOG = Log.getLogger(EchoSocket.class);
+    @SuppressWarnings("unused")
+    private Session session;
+
+    @OnOpen
+    public void onOpen(Session session)
+    {
+        LOG.debug("onOpen(): {}",session);
+        this.session = session;
+    }
+
+    @OnClose
+    public void onClose(CloseReason close)
+    {
+        LOG.debug("onClose(): {}",close);
+        this.session = null;
+    }
+
+    @OnMessage
+    public String onMessage(String msg)
+    {
+        return msg;
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/cdiapp/InfoSocket.java b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/cdiapp/InfoSocket.java
new file mode 100644
index 0000000..e724edd
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/cdiapp/InfoSocket.java
@@ -0,0 +1,94 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket.cdiapp;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.logging.Level;
+
+import javax.enterprise.context.SessionScoped;
+import javax.inject.Inject;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpSession;
+import javax.websocket.CloseReason;
+import javax.websocket.OnClose;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+
+@ServerEndpoint("/cdi-info")
+public class InfoSocket
+{
+    private static final java.util.logging.Logger LOG = java.util.logging.Logger.getLogger(InfoSocket.class.getName());
+
+    @SessionScoped
+    @Inject
+    private HttpSession httpSession;
+
+    @Inject
+    private ServletContext servletContext;
+    
+    @Inject
+    private DataMaker dataMaker;
+
+    private Session session;
+    
+    @OnOpen
+    public void onOpen(Session session)
+    {
+        LOG.log(Level.INFO,"onOpen(): {0}",session);
+        this.session = session;
+    }
+
+    @OnClose
+    public void onClose(CloseReason close)
+    {
+        LOG.log(Level.INFO,"onClose(): {}",close);
+        this.session = null;
+    }
+
+    @OnMessage
+    public String onMessage(String msg)
+    {
+        StringWriter str = new StringWriter();
+        PrintWriter out = new PrintWriter(str);
+        
+        String args[] = msg.split("\\|");
+
+        switch (args[0])
+        {
+            case "info":
+                out.printf("websocketSession is %s%n",asPresent(session));
+                out.printf("httpSession is %s%n",asPresent(httpSession));
+                out.printf("servletContext is %s%n",asPresent(servletContext));
+                break;
+            case "data":
+                dataMaker.processMessage(args[1]);
+                break;
+        }
+
+        return str.toString();
+    }
+
+    private String asPresent(Object obj)
+    {
+        return obj == null ? "NULL" : "PRESENT";
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/wsscope/BogusSession.java b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/wsscope/BogusSession.java
new file mode 100644
index 0000000..777824b
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/wsscope/BogusSession.java
@@ -0,0 +1,150 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket.wsscope;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+
+import org.eclipse.jetty.websocket.api.CloseStatus;
+import org.eclipse.jetty.websocket.api.RemoteEndpoint;
+import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.api.SuspendToken;
+import org.eclipse.jetty.websocket.api.UpgradeRequest;
+import org.eclipse.jetty.websocket.api.UpgradeResponse;
+import org.eclipse.jetty.websocket.api.WebSocketPolicy;
+
+/**
+ * A bogus websocket Session concept object.
+ * <p>
+ * Used to test the scope @Inject of this kind of Session. This is important to test, as the BogusSession does not have
+ * a default constructor that CDI itself can use to create this object.
+ * <p>
+ * This object would need to be added to the beanstore for this scope for later @Inject to use.
+ */
+public class BogusSession implements Session
+{
+    private final String id;
+
+    public BogusSession(String id)
+    {
+        this.id = id;
+    }
+    
+    @Override
+    public String toString()
+    {
+        return String.format("BogusSession[id=%s]",id);
+    }
+
+    public String getId()
+    {
+        return id;
+    }
+
+    @Override
+    public void close()
+    {
+    }
+
+    @Override
+    public void close(CloseStatus closeStatus)
+    {
+    }
+
+    @Override
+    public void close(int statusCode, String reason)
+    {
+    }
+
+    @Override
+    public void disconnect() throws IOException
+    {
+    }
+
+    @Override
+    public long getIdleTimeout()
+    {
+        return 0;
+    }
+
+    @Override
+    public InetSocketAddress getLocalAddress()
+    {
+        return null;
+    }
+
+    @Override
+    public WebSocketPolicy getPolicy()
+    {
+        return null;
+    }
+
+    @Override
+    public String getProtocolVersion()
+    {
+        return null;
+    }
+
+    @Override
+    public RemoteEndpoint getRemote()
+    {
+        return null;
+    }
+
+    @Override
+    public InetSocketAddress getRemoteAddress()
+    {
+        return null;
+    }
+
+    @Override
+    public UpgradeRequest getUpgradeRequest()
+    {
+        return null;
+    }
+
+    @Override
+    public UpgradeResponse getUpgradeResponse()
+    {
+        return null;
+    }
+
+    @Override
+    public boolean isOpen()
+    {
+        return false;
+    }
+
+    @Override
+    public boolean isSecure()
+    {
+        return false;
+    }
+
+    @Override
+    public void setIdleTimeout(long ms)
+    {
+    }
+
+    @Override
+    public SuspendToken suspend()
+    {
+        return null;
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/wsscope/BogusSocket.java b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/wsscope/BogusSocket.java
new file mode 100644
index 0000000..cf9b1b1
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/wsscope/BogusSocket.java
@@ -0,0 +1,36 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket.wsscope;
+
+import javax.inject.Inject;
+
+import org.eclipse.jetty.cdi.websocket.annotation.WebSocketScope;
+import org.eclipse.jetty.websocket.api.Session;
+
+public class BogusSocket
+{
+    @Inject
+    @WebSocketScope
+    private Session session;
+    
+    public Session getSession()
+    {
+        return session;
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/wsscope/Food.java b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/wsscope/Food.java
new file mode 100644
index 0000000..693a1e8
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/wsscope/Food.java
@@ -0,0 +1,119 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket.wsscope;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+
+import org.eclipse.jetty.cdi.websocket.annotation.WebSocketScope;
+
+@WebSocketScope
+public class Food
+{
+    private boolean constructed = false;
+    private boolean destroyed = false;
+    private String name;
+
+    public Food()
+    {
+        // default constructor (for CDI use)
+    }
+
+    public Food(String name)
+    {
+        this.name = name;
+    }
+
+    @PreDestroy
+    void destroy()
+    {
+        destroyed = true;
+    }
+
+    @Override
+    public boolean equals(Object obj)
+    {
+        if (this == obj)
+        {
+            return true;
+        }
+        if (obj == null)
+        {
+            return false;
+        }
+        if (getClass() != obj.getClass())
+        {
+            return false;
+        }
+        Food other = (Food)obj;
+        if (name == null)
+        {
+            if (other.name != null)
+            {
+                return false;
+            }
+        }
+        else if (!name.equals(other.name))
+        {
+            return false;
+        }
+        return true;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        final int prime = 31;
+        int result = 1;
+        result = (prime * result) + ((name == null) ? 0 : name.hashCode());
+        return result;
+    }
+
+    @PostConstruct
+    void init()
+    {
+        constructed = true;
+    }
+
+    public boolean isConstructed()
+    {
+        return constructed;
+    }
+
+    public boolean isDestroyed()
+    {
+        return destroyed;
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("%s@%X[%s]",Food.class.getSimpleName(),hashCode(),name);
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/wsscope/Meal.java b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/wsscope/Meal.java
new file mode 100644
index 0000000..d9c4d27
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/wsscope/Meal.java
@@ -0,0 +1,40 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket.wsscope;
+
+import javax.inject.Inject;
+
+public class Meal
+{
+    @Inject
+    private Food entree;
+
+    @Inject
+    private Food side;
+
+    public Food getEntree()
+    {
+        return entree;
+    }
+
+    public Food getSide()
+    {
+        return side;
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/wsscope/WebSocketScopeBaselineTest.java b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/wsscope/WebSocketScopeBaselineTest.java
new file mode 100644
index 0000000..ba1fd99
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/wsscope/WebSocketScopeBaselineTest.java
@@ -0,0 +1,131 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket.wsscope;
+
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.sameInstance;
+import static org.junit.Assert.assertThat;
+
+import java.util.Set;
+
+import javax.enterprise.inject.spi.Bean;
+
+import org.eclipse.jetty.cdi.core.AnyLiteral;
+import org.eclipse.jetty.cdi.core.ScopedInstance;
+import org.eclipse.jetty.cdi.core.logging.Logging;
+import org.eclipse.jetty.cdi.websocket.WebSocketScopeContext;
+import org.eclipse.jetty.cdi.websocket.annotation.WebSocketScope;
+import org.jboss.weld.environment.se.Weld;
+import org.jboss.weld.environment.se.WeldContainer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class WebSocketScopeBaselineTest
+{
+    private static Weld weld;
+    private static WeldContainer container;
+
+    @BeforeClass
+    public static void startWeld()
+    {
+        Logging.config();
+        weld = new Weld();
+        container = weld.initialize();
+    }
+
+    @AfterClass
+    public static void stopWeld()
+    {
+        weld.shutdown();
+    }
+    
+    /**
+     * Test behavior of {@link WebSocketScope} in basic operation.
+     * <p>
+     * Food is declared as part of WebSocketScope, and as such, only 1 instance of it can exist.
+     * @throws Exception on test failure
+     */
+    @Test
+    public void testScopeBehavior() throws Exception
+    {
+        ScopedInstance<WebSocketScopeContext> wsScopeBean = newInstance(WebSocketScopeContext.class);
+        WebSocketScopeContext wsScope = wsScopeBean.instance;
+
+        wsScope.create();
+        Meal meal1;
+        try
+        {
+            wsScope.begin();
+            ScopedInstance<Meal> meal1Bean = newInstance(Meal.class);
+            meal1 = meal1Bean.instance;
+            ScopedInstance<Meal> meal2Bean = newInstance(Meal.class);
+            Meal meal2 = meal2Bean.instance;
+            
+            assertThat("Meals are not the same",meal1,not(sameInstance(meal2)));
+            
+            assertThat("Meal 1 Entree Constructed",meal1.getEntree().isConstructed(),is(true));
+            assertThat("Meal 1 Side Constructed",meal1.getSide().isConstructed(),is(true));
+            
+            /* Since Food is annotated with @WebSocketScope, there can only be one instance of it
+             * in use with the 2 Meal objects.
+             */
+            assertThat("Meal parts not the same",meal1.getEntree(),sameInstance(meal1.getSide()));
+            assertThat("Meal entrees are the same",meal1.getEntree(),sameInstance(meal2.getEntree()));
+            assertThat("Meal sides are the same",meal1.getSide(),sameInstance(meal2.getSide()));
+
+            meal1Bean.destroy();
+            meal2Bean.destroy();
+        }
+        finally
+        {
+            wsScope.end();
+        }
+        
+        Food entree1 = meal1.getEntree();
+        Food side1 = meal1.getSide();
+
+        assertThat("Meal 1 entree destroyed",entree1.isDestroyed(),is(false));
+        assertThat("Meal 1 side destroyed",side1.isDestroyed(),is(false));
+        wsScope.destroy();
+
+        // assertThat("Meal 1 entree destroyed",entree1.isDestroyed(),is(true));
+        // assertThat("Meal 1 side destroyed",side1.isDestroyed(),is(true));
+        wsScopeBean.destroy();
+    }
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    public static <T> ScopedInstance<T> newInstance(Class<T> clazz) throws Exception
+    {
+        ScopedInstance sbean = new ScopedInstance();
+        Set<Bean<?>> beans = container.getBeanManager().getBeans(clazz,AnyLiteral.INSTANCE);
+        if (beans.size() > 0)
+        {
+            sbean.bean = beans.iterator().next();
+            sbean.creationalContext = container.getBeanManager().createCreationalContext(sbean.bean);
+            sbean.instance = container.getBeanManager().getReference(sbean.bean,clazz,sbean.creationalContext);
+            return sbean;
+        }
+        else
+        {
+            throw new Exception(String.format("Can't find class %s",clazz));
+        }
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/wsscope/WebSocketScopeSessionTest.java b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/wsscope/WebSocketScopeSessionTest.java
new file mode 100644
index 0000000..33b6e88
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/java/org/eclipse/jetty/cdi/websocket/wsscope/WebSocketScopeSessionTest.java
@@ -0,0 +1,253 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.cdi.websocket.wsscope;
+
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.sameInstance;
+import static org.junit.Assert.assertThat;
+
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import javax.enterprise.inject.spi.Bean;
+
+import org.eclipse.jetty.cdi.core.AnyLiteral;
+import org.eclipse.jetty.cdi.core.ScopedInstance;
+import org.eclipse.jetty.cdi.core.logging.Logging;
+import org.eclipse.jetty.cdi.websocket.WebSocketScopeContext;
+import org.eclipse.jetty.websocket.api.Session;
+import org.jboss.weld.environment.se.Weld;
+import org.jboss.weld.environment.se.WeldContainer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class WebSocketScopeSessionTest
+{
+    private static Weld weld;
+    private static WeldContainer container;
+
+    @BeforeClass
+    public static void startWeld()
+    {
+        Logging.config();
+        weld = new Weld();
+        container = weld.initialize();
+    }
+
+    @AfterClass
+    public static void stopWeld()
+    {
+        weld.shutdown();
+    }
+    
+    @Test
+    public void testSessionActivation() throws Exception
+    {
+        ScopedInstance<WebSocketScopeContext> wsScopeBean = newInstance(WebSocketScopeContext.class);
+        WebSocketScopeContext wsScope = wsScopeBean.instance;
+
+        wsScope.create();
+        try
+        {
+            // Scope 1
+            wsScope.begin();
+            BogusSession sess = new BogusSession("1");
+            wsScope.setSession(sess);
+            ScopedInstance<BogusSocket> sock1Bean = newInstance(BogusSocket.class);
+            BogusSocket sock1 = sock1Bean.instance;
+            assertThat("Socket 1 Session",sock1.getSession().toString(),is(sess.toString()));
+
+            sock1Bean.destroy();
+        }
+        finally
+        {
+            wsScope.end();
+        }
+
+        wsScope.destroy();
+        wsScopeBean.destroy();
+    }
+    
+    @Test
+    public void testMultiSession_Sequential() throws Exception
+    {
+        ScopedInstance<WebSocketScopeContext> wsScope1Bean = newInstance(WebSocketScopeContext.class);
+        WebSocketScopeContext wsScope1 = wsScope1Bean.instance;
+        
+        ScopedInstance<WebSocketScopeContext> wsScope2Bean = newInstance(WebSocketScopeContext.class);
+        WebSocketScopeContext wsScope2 = wsScope2Bean.instance;
+
+        wsScope1.create();
+        try
+        {
+            // Scope 1
+            wsScope1.begin();
+            BogusSession sess = new BogusSession("1");
+            wsScope1.setSession(sess);
+            ScopedInstance<BogusSocket> sock1Bean = newInstance(BogusSocket.class);
+            BogusSocket sock1 = sock1Bean.instance;
+            assertThat("Socket 1 Session",sock1.getSession(),sameInstance((Session)sess));
+            sock1Bean.destroy();
+        }
+        finally
+        {
+            wsScope1.end();
+        }
+        
+        wsScope1.destroy();
+        wsScope1Bean.destroy();
+
+        wsScope2.create();
+        try
+        {
+            // Scope 2
+            wsScope2.begin();
+            BogusSession sess = new BogusSession("2");
+            wsScope2.setSession(sess);
+            ScopedInstance<BogusSocket> sock2Bean = newInstance(BogusSocket.class);
+            BogusSocket sock2 = sock2Bean.instance;
+            assertThat("Socket 2 Session",sock2.getSession(),sameInstance((Session)sess));
+            sock2Bean.destroy();
+        }
+        finally
+        {
+            wsScope2.end();
+        }
+
+        wsScope2.destroy();
+        wsScope2Bean.destroy();
+    }
+    
+    @Test
+    public void testMultiSession_Overlapping() throws Exception
+    {
+        final CountDownLatch midLatch = new CountDownLatch(2);
+        final CountDownLatch end1Latch = new CountDownLatch(1);
+        
+        Callable<Session> call1 = new Callable<Session>() {
+            @Override
+            public Session call() throws Exception
+            {
+                Session ret = null;
+                ScopedInstance<WebSocketScopeContext> wsScope1Bean = newInstance(WebSocketScopeContext.class);
+                WebSocketScopeContext wsScope1 = wsScope1Bean.instance;
+                
+                wsScope1.create();
+                try
+                {
+                    // Scope 1
+                    wsScope1.begin();
+                    BogusSession sess = new BogusSession("1");
+                    wsScope1.setSession(sess);
+                    
+                    midLatch.countDown();
+                    midLatch.await(1, TimeUnit.SECONDS);
+                    
+                    ScopedInstance<BogusSocket> sock1Bean = newInstance(BogusSocket.class);
+                    BogusSocket sock1 = sock1Bean.instance;
+                    assertThat("Socket 1 Session",sock1.getSession(),sameInstance((Session)sess));
+                    ret = sock1.getSession();
+                    sock1Bean.destroy();
+                }
+                finally
+                {
+                    wsScope1.end();
+                }
+                
+                wsScope1.destroy();
+                wsScope1Bean.destroy();
+                end1Latch.countDown();
+                return ret;
+            }
+        };
+        
+        final CountDownLatch end2Latch = new CountDownLatch(1);
+        
+        Callable<Session> call2 = new Callable<Session>() {
+            @Override
+            public Session call() throws Exception
+            {
+                Session ret = null;
+                ScopedInstance<WebSocketScopeContext> wsScope2Bean = newInstance(WebSocketScopeContext.class);
+                WebSocketScopeContext wsScope2 = wsScope2Bean.instance;
+
+                wsScope2.create();
+                try
+                {
+                    // Scope 2
+                    wsScope2.begin();
+                    BogusSession sess = new BogusSession("2");
+                    wsScope2.setSession(sess);
+                    ScopedInstance<BogusSocket> sock2Bean = newInstance(BogusSocket.class);
+                    
+                    midLatch.countDown();
+                    midLatch.await(1, TimeUnit.SECONDS);
+                    
+                    BogusSocket sock2 = sock2Bean.instance;
+                    ret = sock2.getSession();
+                    assertThat("Socket 2 Session",sock2.getSession(),sameInstance((Session)sess)); 
+                    sock2Bean.destroy();
+                }
+                finally
+                {
+                    wsScope2.end();
+                }
+
+                wsScope2.destroy();
+                wsScope2Bean.destroy();
+                end2Latch.countDown();
+                return ret;
+            }
+        };
+        
+        ExecutorService svc = Executors.newFixedThreadPool(4);
+        Future<Session> fut1 = svc.submit(call1);
+        Future<Session> fut2 = svc.submit(call2);
+        
+        Session sess1 = fut1.get(1,TimeUnit.SECONDS);
+        Session sess2 = fut2.get(1,TimeUnit.SECONDS);
+        
+        assertThat("Sessions are different", sess1, not(sameInstance(sess2)));
+    }
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    public static <T> ScopedInstance<T> newInstance(Class<T> clazz)
+    {
+        ScopedInstance sbean = new ScopedInstance();
+        Set<Bean<?>> beans = container.getBeanManager().getBeans(clazz,AnyLiteral.INSTANCE);
+        if (beans.size() > 0)
+        {
+            sbean.bean = beans.iterator().next();
+            sbean.creationalContext = container.getBeanManager().createCreationalContext(sbean.bean);
+            sbean.instance = container.getBeanManager().getReference(sbean.bean,clazz,sbean.creationalContext);
+            return sbean;
+        }
+        else
+        {
+            throw new RuntimeException(String.format("Can't find class %s",clazz));
+        }
+    }
+}
diff --git a/jetty-cdi/cdi-websocket/src/test/resources/META-INF/beans.xml b/jetty-cdi/cdi-websocket/src/test/resources/META-INF/beans.xml
new file mode 100644
index 0000000..f158a71
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/resources/META-INF/beans.xml
@@ -0,0 +1,6 @@
+<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
+        http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
+       bean-discovery-mode="all">
+</beans>
\ No newline at end of file
diff --git a/jetty-cdi/cdi-websocket/src/test/resources/jetty-logging.properties b/jetty-cdi/cdi-websocket/src/test/resources/jetty-logging.properties
new file mode 100644
index 0000000..eeed11d
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/resources/jetty-logging.properties
@@ -0,0 +1,15 @@
+org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
+org.jetty.LEVEL=INFO
+org.jboss.LEVEL=INFO
+# org.eclipse.jetty.LEVEL=INFO
+ 
+# org.eclipse.jetty.util.component.LEVEL=DEBUG
+
+# org.eclipse.jetty.websocket.common.LEVEL=DEBUG
+# org.eclipse.jetty.util.DecoratedObjectFactory.LEVEL=DEBUG
+# org.eclipse.jetty.cdi.LEVEL=DEBUG
+
+# org.eclipse.jetty.LEVEL=DEBUG
+# org.eclipse.jetty.websocket.LEVEL=DEBUG
+# org.eclipse.jetty.websocket.client.LEVEL=DEBUG
+
diff --git a/jetty-cdi/cdi-websocket/src/test/resources/logging.properties b/jetty-cdi/cdi-websocket/src/test/resources/logging.properties
new file mode 100644
index 0000000..cfec8c7
--- /dev/null
+++ b/jetty-cdi/cdi-websocket/src/test/resources/logging.properties
@@ -0,0 +1,2 @@
+handlers = org.eclipse.jetty.util.log.JettyLogHandler
+.level=FINE
diff --git a/jetty-cdi/pom.xml b/jetty-cdi/pom.xml
index 4d5d6ec..fd342cc 100644
--- a/jetty-cdi/pom.xml
+++ b/jetty-cdi/pom.xml
@@ -2,48 +2,26 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
-  <artifactId>jetty-cdi</artifactId>
-  <name>Jetty :: CDI Configurations</name>
+  <groupId>org.eclipse.jetty.cdi</groupId>
+  <artifactId>jetty-cdi-parent</artifactId>
+  <name>Jetty :: CDI :: Parent</name>
   <url>http://www.eclipse.org/jetty</url>
-  <packaging>jar</packaging>
+  <packaging>pom</packaging>
   <properties>
-    <bundle-symbolic-name>${project.groupId}.${project.artifactId}</bundle-symbolic-name>
+    <weld.version>2.2.9.Final</weld.version>
   </properties>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
 
-  <dependencies>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-plus</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-deploy</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-  </dependencies>
+  <modules>
+    <module>cdi-core</module>
+    <module>cdi-servlet</module>
+    <module>cdi-full-servlet</module>
+    <module>cdi-websocket</module>
+    <module>test-cdi-webapp</module>
+    <!-- needs to be fixed still 
+    <module>test-cdi-it</module>
+     -->
+  </modules>
 </project>
diff --git a/jetty-cdi/src/main/config/etc/jetty-cdi.xml b/jetty-cdi/src/main/config/etc/jetty-cdi.xml
deleted file mode 100644
index d364f4c..0000000
--- a/jetty-cdi/src/main/config/etc/jetty-cdi.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
-<!-- =============================================================== -->
-<!-- Mixin the Weld / CDI classes to the class loader                -->
-<!-- =============================================================== -->
-
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-  <Ref refid="DeploymentManager">
-    <Call name="addLifeCycleBinding">
-      <Arg>
-        <New
-          class="org.eclipse.jetty.cdi.WeldDeploymentBinding">
-        </New>
-      </Arg>
-    </Call>
-  </Ref>
-</Configure>
-
diff --git a/jetty-cdi/src/main/config/modules/cdi.mod b/jetty-cdi/src/main/config/modules/cdi.mod
deleted file mode 100644
index 68dea58..0000000
--- a/jetty-cdi/src/main/config/modules/cdi.mod
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# CDI / Weld Jetty module
-#
-
-[depend]
-deploy
-annotations
-plus
-# JSP (and EL) are requirements for CDI and Weld
-jsp
-
-[files]
-lib/weld/
-http://central.maven.org/maven2/org/jboss/weld/servlet/weld-servlet/2.2.5.Final/weld-servlet-2.2.5.Final.jar|lib/weld/weld-servlet-2.2.5.Final.jar
-
-[lib]
-lib/weld/weld-servlet-2.2.5.Final.jar
-lib/jetty-cdi-${jetty.version}.jar
-
-[xml]
-etc/jetty-cdi.xml
-
-[license]
-Weld is an open source project hosted on Github and released under the Apache 2.0 license.
-http://weld.cdi-spec.org/
-http://www.apache.org/licenses/LICENSE-2.0.html
diff --git a/jetty-cdi/src/main/java/org/eclipse/jetty/cdi/WeldDeploymentBinding.java b/jetty-cdi/src/main/java/org/eclipse/jetty/cdi/WeldDeploymentBinding.java
deleted file mode 100644
index 0ce37ec..0000000
--- a/jetty-cdi/src/main/java/org/eclipse/jetty/cdi/WeldDeploymentBinding.java
+++ /dev/null
@@ -1,77 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.cdi;
-
-import javax.naming.Reference;
-
-import org.eclipse.jetty.deploy.App;
-import org.eclipse.jetty.deploy.AppLifeCycle;
-import org.eclipse.jetty.deploy.graph.Node;
-import org.eclipse.jetty.plus.jndi.Resource;
-import org.eclipse.jetty.server.handler.ContextHandler;
-import org.eclipse.jetty.webapp.WebAppContext;
-
-/**
- * Perform some basic weld configuration of WebAppContext
- */
-public class WeldDeploymentBinding implements AppLifeCycle.Binding
-{
-    public String[] getBindingTargets()
-    {
-        return new String[]
-        { "deploying" };
-    }
-
-    public void processBinding(Node node, App app) throws Exception
-    {
-        ContextHandler handler = app.getContextHandler();
-        if (handler == null)
-        {
-            throw new NullPointerException("No Handler created for App: " + app);
-        }
-
-        if (handler instanceof WebAppContext)
-        {
-            WebAppContext webapp = (WebAppContext)handler;
-
-            // Add context specific weld container reference.
-            // See https://issues.jboss.org/browse/WELD-1710
-            // and https://github.com/weld/core/blob/2.2.5.Final/environments/servlet/core/src/main/java/org/jboss/weld/environment/servlet/WeldServletLifecycle.java#L244-L253
-            webapp.setInitParameter("org.jboss.weld.environment.container.class",
-                    "org.jboss.weld.environment.jetty.JettyContainer");
-            
-            // Setup Weld BeanManager reference
-            Reference ref = new Reference("javax.enterprise.inject.spi.BeanManager",
-                    "org.jboss.weld.resources.ManagerObjectFactory", null);
-            new Resource(webapp,"BeanManager",ref);
-            
-            // webapp cannot change / replace weld classes
-            webapp.addSystemClass("org.jboss.weld.");
-            webapp.addSystemClass("org.jboss.classfilewriter.");
-            webapp.addSystemClass("org.jboss.logging.");
-            webapp.addSystemClass("com.google.common.");
-            
-            // don't hide weld classes from webapps (allow webapp to use ones from system classloader)
-            webapp.addServerClass("-org.jboss.weld.");
-            webapp.addServerClass("-org.jboss.classfilewriter.");
-            webapp.addServerClass("-org.jboss.logging.");
-            webapp.addServerClass("-com.google.common.");
-        }
-    }
-}
diff --git a/jetty-cdi/test-cdi-it/pom.xml b/jetty-cdi/test-cdi-it/pom.xml
new file mode 100644
index 0000000..160bdb0
--- /dev/null
+++ b/jetty-cdi/test-cdi-it/pom.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+// ========================================================================
+// Copyright (c) Webtide LLC
+// 
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at 
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.apache.org/licenses/LICENSE-2.0.txt
+//
+// You may elect to redistribute this code under either of these licenses. 
+// ========================================================================
+ -->
+<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>
+    <groupId>org.eclipse.jetty.cdi</groupId>
+    <artifactId>jetty-cdi-parent</artifactId>
+    <version>9.3.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>cdi-webapp-it</artifactId>
+  <packaging>jar</packaging>
+  <name>Jetty :: CDI :: Test :: WebApp Integration Tests</name>
+  <url>http://www.eclipse.org/jetty</url>
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <bundle-symbolic-name>${project.groupId}.cdi.webapp.it</bundle-symbolic-name>
+    <scripts-dir>${project.basedir}/src/test/scripts</scripts-dir>
+    <test-base-dir>${project.build.directory}/test-base</test-base-dir>
+    <test-home-dir>${project.build.directory}/test-home</test-home-dir>
+  </properties>
+  <dependencies>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-distribution</artifactId>
+      <version>${project.version}</version>
+      <type>zip</type>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.cdi</groupId>
+      <artifactId>test-cdi-webapp</artifactId>
+      <version>${project.version}</version>
+      <type>war</type>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.toolchain</groupId>
+      <artifactId>jetty-test-helper</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-deploy-plugin</artifactId>
+        <configuration>
+          <!-- DO NOT DEPLOY (or Release) -->
+          <skip>true</skip>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy-apps-for-testing</id>
+            <phase>process-test-resources</phase>
+            <goals>
+              <goal>copy-dependencies</goal>
+            </goals>
+            <configuration>
+              <includeArtifactIds>test-cdi-webapp</includeArtifactIds>
+              <includeScope>runtime</includeScope>
+              <includeTypes>war</includeTypes>
+              <overwriteSnapshots>true</overwriteSnapshots>
+              <overwriteReleases>true</overwriteReleases>
+              <stripVersion>true</stripVersion>
+              <outputDirectory>${test-base-dir}/webapps</outputDirectory>
+            </configuration>
+          </execution>
+          <execution>
+            <id>unpack-jetty-distro</id>
+            <phase>process-test-resources</phase>
+            <goals>
+              <goal>unpack-dependencies</goal>
+            </goals>
+            <configuration>
+              <includeArtifactIds>jetty-distribution</includeArtifactIds>
+              <includeScope>runtime</includeScope>
+              <includeTypes>zip</includeTypes>
+              <outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>
+              <outputDirectory>${test-home-dir}</outputDirectory>
+              <overWriteSnapshots>true</overWriteSnapshots>
+              <overWriteIfNewer>true</overWriteIfNewer>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-failsafe-plugin</artifactId>
+        <version>2.17</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>integration-test</goal>
+              <goal>verify</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-antrun-plugin</artifactId>
+        <version>1.7</version>
+        <executions>
+          <execution>
+            <id>start-jetty</id>
+            <phase>pre-integration-test</phase>
+            <goals>
+              <goal>run</goal>
+            </goals>
+            <configuration>
+              <target>
+                <property name="jetty.cdi.home" location="${test-home-dir}/jetty-distribution-${project.version}"/>
+                <property name="jetty.cdi.base" location="${test-base-dir}"/>
+                <echo>Integration Test : Setup Jetty</echo>
+                <exec executable="${run.command}"
+                      dir="${scripts-dir}"
+                      spawn="false">
+                  <arg value="${run.command.xtra}"/>
+                  <arg value="${setup.script}"/>
+                  <arg file="${java.home}"/>
+                  <arg file="${jetty.cdi.home}"/>
+                  <arg file="${jetty.cdi.base}"/>
+                </exec>
+
+                <echo>Integration Test : Starting Jetty ...</echo>
+                <exec executable="${run.command}"
+                      dir="${scripts-dir}"
+                      spawn="true">
+                  <arg value="${run.command.xtra}"/>
+                  <arg value="${start.script}"/>
+                  <arg file="${java.home}"/>
+                  <arg file="${jetty.cdi.home}"/>
+                  <arg file="${jetty.cdi.base}"/>
+                </exec>
+                <waitfor maxwait="5" maxwaitunit="second"
+                  checkevery="100" checkeveryunit="millisecond">
+                  <http url="http://localhost:58080/cdi-webapp/"/>
+                </waitfor>
+                <echo>Integration Test : Jetty is now available</echo>
+              </target>
+            </configuration>
+          </execution>
+          <execution>
+            <id>stop-jetty</id>
+            <phase>post-integration-test</phase>
+            <goals>
+              <goal>run</goal>
+            </goals>
+            <configuration>
+              <target>
+                <property name="jetty.cdi.home" location="${test-home-dir}/jetty-distribution-${project.version}"/>
+                <property name="jetty.cdi.base" location="${test-base-dir}"/>
+                <echo>Integration Test : Stop Jetty</echo>
+                <exec executable="${run.command}"
+                      dir="${scripts-dir}"
+                      spawn="false">
+                  <arg value="${run.command.xtra}"/>
+                  <arg value="${stop.script}"/>
+                  <arg file="${java.home}"/>
+                  <arg file="${jetty.cdi.home}"/>
+                  <arg file="${jetty.cdi.base}"/>
+                </exec>
+              </target>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+  <profiles>
+    <profile>
+      <id>it-windows</id>
+      <activation>
+        <os>
+          <family>Windows</family>
+        </os>
+      </activation>
+      <properties>
+        <run.command>cmd</run.command>
+        <run.command.xtra>/c</run.command.xtra>
+        <start.script>start-jetty.bat</start.script>
+        <stop.script>stop-jetty.bat</stop.script>
+      </properties>
+    </profile>
+    <profile>
+      <id>it-unix</id>
+      <activation>
+        <os>
+          <family>unix</family>
+        </os>
+      </activation>
+      <properties>
+        <run.command>sh</run.command>
+        <run.command.xtra>--</run.command.xtra>
+        <setup.script>setup-jetty.sh</setup.script>
+        <start.script>start-jetty.sh</start.script>
+        <stop.script>stop-jetty.sh</stop.script>
+      </properties>
+    </profile>
+  </profiles>
+</project>
diff --git a/jetty-cdi/test-cdi-it/src/test/java/org/eclipse/jetty/tests/HelloIT.java b/jetty-cdi/test-cdi-it/src/test/java/org/eclipse/jetty/tests/HelloIT.java
new file mode 100644
index 0000000..72a9c52
--- /dev/null
+++ b/jetty-cdi/test-cdi-it/src/test/java/org/eclipse/jetty/tests/HelloIT.java
@@ -0,0 +1,41 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.tests;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+
+import java.net.URI;
+
+import org.eclipse.jetty.toolchain.test.SimpleRequest;
+import org.junit.Test;
+
+/**
+ * Basic tests for a simple @WebServlet with no CDI
+ */
+public class HelloIT
+{
+    @Test
+    public void testBasic() throws Exception
+    {
+        URI serverURI = new URI("http://localhost:58080/cdi-webapp/");
+        SimpleRequest req = new SimpleRequest(serverURI);
+        assertThat(req.getString("hello"),is("Hello World" + System.lineSeparator()));
+    }
+}
diff --git a/jetty-cdi/test-cdi-it/src/test/java/org/eclipse/jetty/tests/ServerInfoIT.java b/jetty-cdi/test-cdi-it/src/test/java/org/eclipse/jetty/tests/ServerInfoIT.java
new file mode 100644
index 0000000..6357812
--- /dev/null
+++ b/jetty-cdi/test-cdi-it/src/test/java/org/eclipse/jetty/tests/ServerInfoIT.java
@@ -0,0 +1,47 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.tests;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+
+import java.net.URI;
+
+import org.eclipse.jetty.toolchain.test.SimpleRequest;
+import org.junit.Test;
+
+public class ServerInfoIT
+{
+    @Test
+    public void testGET() throws Exception {
+        URI serverURI = new URI("http://localhost:58080/cdi-webapp/");
+        SimpleRequest req = new SimpleRequest(serverURI);
+        
+        // Typical response:
+        // context = ServletContext@o.e.j.w.WebAppContext@37cb63fd{/cdi-webapp,
+        // file:///tmp/jetty-0.0.0.0-58080-cdi-webapp.war-_cdi-webapp-any-417759194514596377.dir/webapp/,AVAILABLE}
+        // {/cdi-webapp.war}\ncontext.contextPath = /cdi-webapp\ncontext.effective-version = 3.1\n
+        assertThat(req.getString("serverinfo"),
+                allOf(
+                containsString("context = ServletContext@"),
+                containsString("context.contextPath = /cdi-webapp"),
+                containsString("context.effective-version = 3.1")
+                ));
+    }
+}
diff --git a/jetty-cdi/test-cdi-it/src/test/java/org/eclipse/jetty/tests/ws/SessionInfoIT.java b/jetty-cdi/test-cdi-it/src/test/java/org/eclipse/jetty/tests/ws/SessionInfoIT.java
new file mode 100644
index 0000000..719dcd4
--- /dev/null
+++ b/jetty-cdi/test-cdi-it/src/test/java/org/eclipse/jetty/tests/ws/SessionInfoIT.java
@@ -0,0 +1,106 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.tests.ws;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+
+import java.net.URI;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import javax.websocket.ClientEndpoint;
+import javax.websocket.CloseReason;
+import javax.websocket.ContainerProvider;
+import javax.websocket.OnClose;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.WebSocketContainer;
+
+import org.eclipse.jetty.toolchain.test.EventQueue;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.junit.Test;
+
+public class SessionInfoIT
+{
+    @ClientEndpoint
+    public static class ClientSessionInfoSocket
+    {
+        private static final Logger LOG = Log.getLogger(SessionInfoIT.ClientSessionInfoSocket.class);
+        
+        public CountDownLatch openLatch = new CountDownLatch(1);
+        public CountDownLatch closeLatch = new CountDownLatch(1);
+        public Session session;
+        public EventQueue<String> messages = new EventQueue<>();
+        public CloseReason closeReason;
+        
+        @OnOpen
+        public void onOpen(Session session)
+        {
+            LOG.info("onOpen(): {}", session);
+            this.session = session;
+            this.openLatch.countDown();
+        }
+        
+        @OnClose
+        public void onClose(CloseReason close)
+        {
+            LOG.info("onClose(): {}", close);
+            this.session = null;
+            this.closeReason = close;
+            this.closeLatch.countDown();
+        }
+
+        @OnMessage
+        public void onMessage(String message)
+        {
+            LOG.info("onMessage(): {}", message);
+            this.messages.offer(message);
+        }
+    }
+
+    @Test
+    public void testSessionInfo() throws Exception
+    {
+        URI serverURI = new URI("ws://localhost:58080/cdi-webapp/");
+
+        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
+
+        ClientSessionInfoSocket socket = new ClientSessionInfoSocket();
+        
+        container.connectToServer(socket,serverURI.resolve("sessioninfo"));
+
+        assertThat("Await open", socket.openLatch.await(1,TimeUnit.SECONDS), is(true));
+        
+        socket.session.getBasicRemote().sendText("info");
+        socket.messages.awaitEventCount(1,2,TimeUnit.SECONDS);
+        
+        System.out.printf("socket.messages.size = %s%n",socket.messages.size());
+        
+        String msg = socket.messages.poll();
+        System.out.printf("Message is [%s]%n",msg);
+        
+        assertThat("Message", msg, containsString("HttpSession = HttpSession"));
+        
+        socket.session.getBasicRemote().sendText("close");
+        assertThat("Await close", socket.closeLatch.await(1,TimeUnit.SECONDS),is(true));
+    }
+}
diff --git a/jetty-cdi/test-cdi-it/src/test/resources/jetty-logging.properties b/jetty-cdi/test-cdi-it/src/test/resources/jetty-logging.properties
new file mode 100644
index 0000000..a3e0efd
--- /dev/null
+++ b/jetty-cdi/test-cdi-it/src/test/resources/jetty-logging.properties
@@ -0,0 +1,10 @@
+org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
+org.jboss.LEVEL=DEBUG
+org.eclipse.jetty.LEVEL=INFO
+
+org.eclipse.jetty.util.DecoratedObjectFactory.LEVEL=DEBUG
+
+# org.eclipse.jetty.LEVEL=DEBUG
+org.eclipse.jetty.websocket.LEVEL=DEBUG
+# org.eclipse.jetty.websocket.client.LEVEL=DEBUG
+
diff --git a/jetty-cdi/test-cdi-it/src/test/scripts/setup-jetty.sh b/jetty-cdi/test-cdi-it/src/test/scripts/setup-jetty.sh
new file mode 100755
index 0000000..3dc240f
--- /dev/null
+++ b/jetty-cdi/test-cdi-it/src/test/scripts/setup-jetty.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+
+JAVA_HOME=$1
+JETTY_HOME=$2
+JETTY_BASE=$3
+
+echo \${java.home}  : $JAVA_HOME
+echo \${jetty.home} : $JETTY_HOME
+echo \${jetty.base} : $JETTY_BASE
+
+cd "$JETTY_BASE"
+
+"$JAVA_HOME/bin/java" -jar "$JETTY_HOME/start.jar" \
+    --approve-all-licenses \
+    --add-to-start=deploy,http,annotations,websocket,cdi,logging
+
+"$JAVA_HOME/bin/java" -jar "$JETTY_HOME/start.jar" \
+    --version
+
diff --git a/jetty-cdi/test-cdi-it/src/test/scripts/start-jetty.sh b/jetty-cdi/test-cdi-it/src/test/scripts/start-jetty.sh
new file mode 100755
index 0000000..ea7843b
--- /dev/null
+++ b/jetty-cdi/test-cdi-it/src/test/scripts/start-jetty.sh
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+JAVA_HOME=$1
+JETTY_HOME=$2
+JETTY_BASE=$3
+
+echo \${java.home}  : $JAVA_HOME
+echo \${jetty.home} : $JETTY_HOME
+echo \${jetty.base} : $JETTY_BASE
+
+cd "$JETTY_BASE"
+
+"$JAVA_HOME/bin/java" -jar "$JETTY_HOME/start.jar" \
+    jetty.http.port=58080 \
+    STOP.PORT=58181 STOP.KEY=it
+
+
diff --git a/tests/test-cdi/cdi-webapp-it/src/test/scripts/stop-jetty.sh b/jetty-cdi/test-cdi-it/src/test/scripts/stop-jetty.sh
similarity index 100%
rename from tests/test-cdi/cdi-webapp-it/src/test/scripts/stop-jetty.sh
rename to jetty-cdi/test-cdi-it/src/test/scripts/stop-jetty.sh
diff --git a/jetty-cdi/test-cdi-webapp/pom.xml b/jetty-cdi/test-cdi-webapp/pom.xml
new file mode 100644
index 0000000..af5940a
--- /dev/null
+++ b/jetty-cdi/test-cdi-webapp/pom.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  // ========================================================================
+  // Copyright (c) Webtide LLC
+  //
+  // All rights reserved. This program and the accompanying materials
+  // are made available under the terms of the Eclipse Public License v1.0
+  // and Apache License v2.0 which accompanies this distribution.
+  //
+  // The Eclipse Public License is available at
+  // http://www.eclipse.org/legal/epl-v10.html
+  //
+  // The Apache License v2.0 is available at
+  // http://www.apache.org/licenses/LICENSE-2.0.txt
+  //
+  // You may elect to redistribute this code under either of these licenses.
+  // ========================================================================
+-->
+<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>
+    <groupId>org.eclipse.jetty.cdi</groupId>
+    <artifactId>jetty-cdi-parent</artifactId>
+    <version>9.3.6-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>test-cdi-webapp</artifactId>
+  <packaging>war</packaging>
+  <name>Jetty :: CDI :: Test :: WebApp</name>
+  <url>http://www.eclipse.org/jetty</url>
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <bundle-symbolic-name>${project.groupId}.cdi.webapp.noweld</bundle-symbolic-name>
+  </properties>
+  <dependencies>
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>javax.servlet-api</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>javax.websocket</groupId>
+      <artifactId>javax.websocket-api</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>javax.enterprise</groupId>
+      <artifactId>cdi-api</artifactId>
+      <version>1.1</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.weld.servlet</groupId>
+      <artifactId>weld-servlet</artifactId>
+      <version>${weld.version}</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+  <build>
+    <finalName>cdi-webapp</finalName>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-deploy-plugin</artifactId>
+        <configuration>
+          <!-- DO NOT DEPLOY (or Release) -->
+          <skip>true</skip>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <version>2.5.3</version>
+        <executions>
+          <execution>
+            <id>with-weld</id>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+            <configuration>
+              <descriptors>
+                <descriptor>src/assembly/with-weld.xml</descriptor>
+              </descriptors>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+         <groupId>org.eclipse.jetty</groupId>
+         <artifactId>jetty-maven-plugin</artifactId>
+         <version>${project.version}</version>
+         <configuration>
+         </configuration>
+         <dependencies>
+           <dependency>
+               <groupId>org.eclipse.jetty.cdi</groupId>
+               <artifactId>cdi-full-servlet</artifactId>
+               <version>${project.version}</version>
+               <type>pom</type>
+           </dependency>
+         </dependencies>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/jetty-cdi/test-cdi-webapp/src/assembly/with-weld.xml b/jetty-cdi/test-cdi-webapp/src/assembly/with-weld.xml
new file mode 100644
index 0000000..ca17471
--- /dev/null
+++ b/jetty-cdi/test-cdi-webapp/src/assembly/with-weld.xml
@@ -0,0 +1,31 @@
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+  <id>with-weld</id>
+  <formats>
+    <format>war</format>
+  </formats>
+  <includeBaseDirectory>false</includeBaseDirectory>
+  <fileSets>
+    <fileSet>
+      <directory>${project.basedir}/src/main/webapp</directory>
+      <outputDirectory>/</outputDirectory>
+    </fileSet>
+    <fileSet>
+      <directory>${project.build.outputDirectory}</directory>
+      <outputDirectory>/WEB-INF/classes</outputDirectory>
+    </fileSet>
+  </fileSets>
+  <dependencySets>
+    <dependencySet>
+      <outputDirectory>/WEB-INF/lib</outputDirectory>
+      <useProjectArtifact>true</useProjectArtifact>
+      <unpack>false</unpack>
+      <scope>test</scope>
+      <includes>
+        <include>*:cdi-api</include>
+        <include>*:weld-servlet</include>
+      </includes>
+    </dependencySet>
+  </dependencySets>
+</assembly>
diff --git a/tests/test-cdi/cdi-webapp/src/main/java/org/eclipse/jetty/tests/HelloServlet.java b/jetty-cdi/test-cdi-webapp/src/main/java/org/eclipse/jetty/tests/HelloServlet.java
similarity index 100%
rename from tests/test-cdi/cdi-webapp/src/main/java/org/eclipse/jetty/tests/HelloServlet.java
rename to jetty-cdi/test-cdi-webapp/src/main/java/org/eclipse/jetty/tests/HelloServlet.java
diff --git a/tests/test-cdi/cdi-webapp/src/main/java/org/eclipse/jetty/tests/ServerInfoServlet.java b/jetty-cdi/test-cdi-webapp/src/main/java/org/eclipse/jetty/tests/ServerInfoServlet.java
similarity index 100%
rename from tests/test-cdi/cdi-webapp/src/main/java/org/eclipse/jetty/tests/ServerInfoServlet.java
rename to jetty-cdi/test-cdi-webapp/src/main/java/org/eclipse/jetty/tests/ServerInfoServlet.java
diff --git a/jetty-cdi/test-cdi-webapp/src/main/java/org/eclipse/jetty/tests/logging/JULog.java b/jetty-cdi/test-cdi-webapp/src/main/java/org/eclipse/jetty/tests/logging/JULog.java
new file mode 100644
index 0000000..8f7d02f
--- /dev/null
+++ b/jetty-cdi/test-cdi-webapp/src/main/java/org/eclipse/jetty/tests/logging/JULog.java
@@ -0,0 +1,47 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.tests.logging;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class JULog
+{
+    private final Logger log;
+
+    public JULog(Class<?> clazz)
+    {
+        this.log = Logger.getLogger(clazz.getName());
+    }
+
+    public void info(String msg)
+    {
+        log.log(Level.INFO, msg);
+    }
+
+    public void info(String msg, Object ... args)
+    {
+        log.log(Level.INFO, msg, args);
+    }
+
+    public void warn(Throwable t)
+    {
+        log.log(Level.WARNING, "", t);
+    }
+}
diff --git a/jetty-cdi/test-cdi-webapp/src/main/java/org/eclipse/jetty/tests/logging/JULogFactory.java b/jetty-cdi/test-cdi-webapp/src/main/java/org/eclipse/jetty/tests/logging/JULogFactory.java
new file mode 100644
index 0000000..6a6a1f8
--- /dev/null
+++ b/jetty-cdi/test-cdi-webapp/src/main/java/org/eclipse/jetty/tests/logging/JULogFactory.java
@@ -0,0 +1,31 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.tests.logging;
+
+import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.spi.InjectionPoint;
+
+public class JULogFactory
+{
+    @Produces
+    public JULog createJULog(InjectionPoint injectionPoint)
+    {
+        return new JULog(injectionPoint.getMember().getDeclaringClass());
+    }
+}
diff --git a/jetty-cdi/test-cdi-webapp/src/main/java/org/eclipse/jetty/tests/ws/SessionInfoSocket.java b/jetty-cdi/test-cdi-webapp/src/main/java/org/eclipse/jetty/tests/ws/SessionInfoSocket.java
new file mode 100644
index 0000000..53d15fe
--- /dev/null
+++ b/jetty-cdi/test-cdi-webapp/src/main/java/org/eclipse/jetty/tests/ws/SessionInfoSocket.java
@@ -0,0 +1,98 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.tests.ws;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpSession;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.RemoteEndpoint;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+
+import org.eclipse.jetty.tests.logging.JULog;
+
+@ServerEndpoint(value = "/sessioninfo")
+public class SessionInfoSocket
+{
+    @Inject
+    private JULog LOG;
+
+    @Inject
+    private HttpSession httpSession;
+
+    private Session wsSession;
+
+    @OnOpen
+    public void onOpen(Session session)
+    {
+        LOG.info("onOpen({0})",asClassId(session));
+        this.wsSession = session;
+    }
+
+    @OnMessage
+    public void onMessage(String message)
+    {
+        LOG.info("onMessage({0})",quoted(message));
+        
+        try
+        {
+            RemoteEndpoint.Basic remote = wsSession.getBasicRemote();
+            LOG.info("Remote.Basic: {0}", remote);
+            
+            if ("info".equalsIgnoreCase(message))
+            {
+                LOG.info("returning 'info' details");
+                remote.sendText("HttpSession = " + httpSession);
+            }
+            else if ("close".equalsIgnoreCase(message))
+            {
+                LOG.info("closing session");
+                wsSession.close();
+            }
+            else
+            {
+                LOG.info("echoing message as-is");
+                remote.sendText(message);
+            }
+        }
+        catch (Throwable t)
+        {
+            LOG.warn(t);
+        }
+    }
+
+    private String asClassId(Object obj)
+    {
+        if (obj == null)
+        {
+            return "<null>";
+        }
+        return String.format("%s@%X",obj.getClass().getName(),obj.hashCode());
+    }
+
+    private String quoted(String str)
+    {
+        if (str == null)
+        {
+            return "<null>";
+        }
+        return '"' + str + '"';
+    }
+}
diff --git a/tests/test-cdi/cdi-webapp/src/main/webapp/WEB-INF/beans.xml b/jetty-cdi/test-cdi-webapp/src/main/webapp/WEB-INF/beans.xml
similarity index 100%
rename from tests/test-cdi/cdi-webapp/src/main/webapp/WEB-INF/beans.xml
rename to jetty-cdi/test-cdi-webapp/src/main/webapp/WEB-INF/beans.xml
diff --git a/tests/test-cdi/cdi-webapp/src/main/webapp/WEB-INF/web.xml b/jetty-cdi/test-cdi-webapp/src/main/webapp/WEB-INF/web.xml
similarity index 100%
rename from tests/test-cdi/cdi-webapp/src/main/webapp/WEB-INF/web.xml
rename to jetty-cdi/test-cdi-webapp/src/main/webapp/WEB-INF/web.xml
diff --git a/jetty-client/pom.xml b/jetty-client/pom.xml
index 64aac0c..4a70e64 100644
--- a/jetty-client/pom.xml
+++ b/jetty-client/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
 
   <modelVersion>4.0.0</modelVersion>
@@ -16,50 +16,6 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-                <Import-Package>javax.net.*,*</Import-Package>
-              </instructions>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <!-- Required for OSGI -->
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
         <configuration>
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/AbstractHttpClientTransport.java b/jetty-client/src/main/java/org/eclipse/jetty/client/AbstractHttpClientTransport.java
index 508f705..f4e9d90 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/AbstractHttpClientTransport.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/AbstractHttpClientTransport.java
@@ -19,21 +19,27 @@
 package org.eclipse.jetty.client;
 
 import java.io.IOException;
+import java.net.InetSocketAddress;
 import java.net.SocketAddress;
+import java.net.SocketException;
 import java.nio.channels.SelectionKey;
 import java.nio.channels.SocketChannel;
 import java.util.Map;
 
 import org.eclipse.jetty.client.api.Connection;
 import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.ManagedSelector;
 import org.eclipse.jetty.io.SelectChannelEndPoint;
 import org.eclipse.jetty.io.SelectorManager;
 import org.eclipse.jetty.io.ssl.SslClientConnectionFactory;
 import org.eclipse.jetty.util.Promise;
+import org.eclipse.jetty.util.annotation.ManagedAttribute;
+import org.eclipse.jetty.util.annotation.ManagedObject;
 import org.eclipse.jetty.util.component.ContainerLifeCycle;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
+@ManagedObject
 public abstract class AbstractHttpClientTransport extends ContainerLifeCycle implements HttpClientTransport
 {
     protected static final Logger LOG = Log.getLogger(HttpClientTransport.class);
@@ -58,6 +64,12 @@
         this.client = client;
     }
 
+    @ManagedAttribute(value = "The number of selectors", readonly = true)
+    public int getSelectors()
+    {
+        return selectors;
+    }
+
     @Override
     protected void doStart() throws Exception
     {
@@ -75,7 +87,7 @@
     }
 
     @Override
-    public void connect(SocketAddress address, Map<String, Object> context)
+    public void connect(InetSocketAddress address, Map<String, Object> context)
     {
         SocketChannel channel = null;
         try
@@ -110,6 +122,11 @@
         // UnresolvedAddressException are not IOExceptions.
         catch (Throwable x)
         {
+            // If IPv6 is not deployed, a generic SocketException "Network is unreachable"
+            // exception is being thrown, so we attempt to provide a better error message.
+            if (x.getClass() == SocketException.class)
+                x = new SocketException("Could not connect to " + address).initCause(x);
+
             try
             {
                 if (channel != null)
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/AuthenticationProtocolHandler.java b/jetty-client/src/main/java/org/eclipse/jetty/client/AuthenticationProtocolHandler.java
index 9e7f684..d25903e 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/AuthenticationProtocolHandler.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/AuthenticationProtocolHandler.java
@@ -37,7 +37,7 @@
 
 public abstract class AuthenticationProtocolHandler implements ProtocolHandler
 {
-    public static final int DEFAULT_MAX_CONTENT_LENGTH = 4096;
+    public static final int DEFAULT_MAX_CONTENT_LENGTH = 16*1024;
     public static final Logger LOG = Log.getLogger(AuthenticationProtocolHandler.class);
     private static final Pattern AUTHENTICATE_PATTERN = Pattern.compile("([^\\s]+)\\s+realm=\"([^\"]+)\"(.*)", Pattern.CASE_INSENSITIVE);
     private static final String AUTHENTICATION_ATTRIBUTE = AuthenticationProtocolHandler.class.getName() + ".authentication";
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/ConnectionPool.java b/jetty-client/src/main/java/org/eclipse/jetty/client/ConnectionPool.java
index 456dc5e..fc95421 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/ConnectionPool.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/ConnectionPool.java
@@ -18,393 +18,17 @@
 
 package org.eclipse.jetty.client;
 
-import java.io.Closeable;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.BlockingDeque;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingDeque;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.locks.ReentrantLock;
-
-import org.eclipse.jetty.client.api.Connection;
 import org.eclipse.jetty.client.api.Destination;
-import org.eclipse.jetty.util.BlockingArrayQueue;
-import org.eclipse.jetty.util.Promise;
-import org.eclipse.jetty.util.component.ContainerLifeCycle;
-import org.eclipse.jetty.util.component.Dumpable;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.util.thread.Sweeper;
+import org.eclipse.jetty.util.Callback;
 
-public class ConnectionPool implements Closeable, Dumpable, Sweeper.Sweepable
+/**
+ * @deprecated use {@link DuplexConnectionPool} instead
+ */
+@Deprecated
+public class ConnectionPool extends DuplexConnectionPool
 {
-    protected static final Logger LOG = Log.getLogger(ConnectionPool.class);
-
-    private final AtomicInteger connectionCount = new AtomicInteger();
-    private final ReentrantLock lock = new ReentrantLock();
-    private final Destination destination;
-    private final int maxConnections;
-    private final Promise<Connection> requester;
-    private final BlockingDeque<Connection> idleConnections;
-    private final BlockingQueue<Connection> activeConnections;
-
-    public ConnectionPool(Destination destination, int maxConnections, Promise<Connection> requester)
+    public ConnectionPool(Destination destination, int maxConnections, Callback requester)
     {
-        this.destination = destination;
-        this.maxConnections = maxConnections;
-        this.requester = requester;
-        this.idleConnections = new LinkedBlockingDeque<>(maxConnections);
-        this.activeConnections = new BlockingArrayQueue<>(maxConnections);
-    }
-
-    public int getConnectionCount()
-    {
-        return connectionCount.get();
-    }
-
-    public BlockingQueue<Connection> getIdleConnections()
-    {
-        return idleConnections;
-    }
-
-    public BlockingQueue<Connection> getActiveConnections()
-    {
-        return activeConnections;
-    }
-
-    public Connection acquire()
-    {
-        Connection connection = activateIdle();
-        if (connection == null)
-            connection = tryCreate();
-        return connection;
-    }
-
-    private Connection tryCreate()
-    {
-        while (true)
-        {
-            int current = getConnectionCount();
-            final int next = current + 1;
-
-            if (next > maxConnections)
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Max connections {}/{} reached", current, maxConnections);
-                // Try again the idle connections
-                return activateIdle();
-            }
-
-            if (connectionCount.compareAndSet(current, next))
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Connection {}/{} creation", next, maxConnections);
-
-                destination.newConnection(new Promise<Connection>()
-                {
-                    @Override
-                    public void succeeded(Connection connection)
-                    {
-                        if (LOG.isDebugEnabled())
-                            LOG.debug("Connection {}/{} creation succeeded {}", next, maxConnections, connection);
-
-                        idleCreated(connection);
-
-                        requester.succeeded(connection);
-                    }
-
-                    @Override
-                    public void failed(Throwable x)
-                    {
-                        if (LOG.isDebugEnabled())
-                            LOG.debug("Connection " + next + "/" + maxConnections + " creation failed", x);
-
-                        connectionCount.decrementAndGet();
-
-                        requester.failed(x);
-                    }
-                });
-
-                // Try again the idle connections
-                return activateIdle();
-            }
-        }
-    }
-
-    protected void idleCreated(Connection connection)
-    {
-        boolean idle;
-        final ReentrantLock lock = this.lock;
-        lock.lock();
-        try
-        {
-            // Use "cold" new connections as last.
-            idle = idleConnections.offerLast(connection);
-        }
-        finally
-        {
-            lock.unlock();
-        }
-
-        idle(connection, idle);
-    }
-
-    private Connection activateIdle()
-    {
-        boolean acquired;
-        Connection connection;
-        final ReentrantLock lock = this.lock;
-        lock.lock();
-        try
-        {
-            connection = idleConnections.pollFirst();
-            if (connection == null)
-                return null;
-            acquired = activeConnections.offer(connection);
-        }
-        finally
-        {
-            lock.unlock();
-        }
-
-        if (acquired)
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Connection active {}", connection);
-            acquired(connection);
-            return connection;
-        }
-        else
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Connection active overflow {}", connection);
-            connection.close();
-            return null;
-        }
-    }
-
-    protected void acquired(Connection connection)
-    {
-    }
-
-    public boolean release(Connection connection)
-    {
-        boolean idle;
-        final ReentrantLock lock = this.lock;
-        lock.lock();
-        try
-        {
-            if (!activeConnections.remove(connection))
-                return false;
-            // Make sure we use "hot" connections first.
-            idle = idleConnections.offerFirst(connection);
-        }
-        finally
-        {
-            lock.unlock();
-        }
-
-        released(connection);
-        return idle(connection, idle);
-    }
-
-    protected boolean idle(Connection connection, boolean idle)
-    {
-        if (idle)
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Connection idle {}", connection);
-            return true;
-        }
-        else
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Connection idle overflow {}", connection);
-            connection.close();
-            return false;
-        }
-    }
-
-    protected void released(Connection connection)
-    {
-    }
-
-    public boolean remove(Connection connection)
-    {
-        boolean activeRemoved;
-        boolean idleRemoved;
-        final ReentrantLock lock = this.lock;
-        lock.lock();
-        try
-        {
-            activeRemoved = activeConnections.remove(connection);
-            idleRemoved = idleConnections.remove(connection);
-        }
-        finally
-        {
-            lock.unlock();
-        }
-
-        if (activeRemoved)
-            released(connection);
-        boolean removed = activeRemoved || idleRemoved;
-        if (removed)
-        {
-            int pooled = connectionCount.decrementAndGet();
-            if (LOG.isDebugEnabled())
-                LOG.debug("Connection removed {} - pooled: {}", connection, pooled);
-        }
-        return removed;
-    }
-
-    public boolean isActive(Connection connection)
-    {
-        final ReentrantLock lock = this.lock;
-        lock.lock();
-        try
-        {
-            return activeConnections.contains(connection);
-        }
-        finally
-        {
-            lock.unlock();
-        }
-    }
-
-    public boolean isIdle(Connection connection)
-    {
-        final ReentrantLock lock = this.lock;
-        lock.lock();
-        try
-        {
-            return idleConnections.contains(connection);
-        }
-        finally
-        {
-            lock.unlock();
-        }
-    }
-
-    public boolean isEmpty()
-    {
-        return connectionCount.get() == 0;
-    }
-
-    public void close()
-    {
-        List<Connection> idles = new ArrayList<>();
-        List<Connection> actives = new ArrayList<>();
-        final ReentrantLock lock = this.lock;
-        lock.lock();
-        try
-        {
-            idles.addAll(idleConnections);
-            idleConnections.clear();
-            actives.addAll(activeConnections);
-            activeConnections.clear();
-        }
-        finally
-        {
-            lock.unlock();
-        }
-
-        connectionCount.set(0);
-
-        for (Connection connection : idles)
-            connection.close();
-
-        // A bit drastic, but we cannot wait for all requests to complete
-        for (Connection connection : actives)
-            connection.close();
-    }
-
-    @Override
-    public String dump()
-    {
-        return ContainerLifeCycle.dump(this);
-    }
-
-    @Override
-    public void dump(Appendable out, String indent) throws IOException
-    {
-        List<Connection> actives = new ArrayList<>();
-        List<Connection> idles = new ArrayList<>();
-        final ReentrantLock lock = this.lock;
-        lock.lock();
-        try
-        {
-            actives.addAll(activeConnections);
-            idles.addAll(idleConnections);
-        }
-        finally
-        {
-            lock.unlock();
-        }
-
-        ContainerLifeCycle.dumpObject(out, this);
-        ContainerLifeCycle.dump(out, indent, actives, idles);
-    }
-
-    @Override
-    public boolean sweep()
-    {
-        List<Sweeper.Sweepable> toSweep = new ArrayList<>();
-        final ReentrantLock lock = this.lock;
-        lock.lock();
-        try
-        {
-            for (Connection connection : getActiveConnections())
-            {
-                if (connection instanceof Sweeper.Sweepable)
-                    toSweep.add(((Sweeper.Sweepable)connection));
-            }
-        }
-        finally
-        {
-            lock.unlock();
-        }
-
-        for (Sweeper.Sweepable candidate : toSweep)
-        {
-            if (candidate.sweep())
-            {
-                boolean removed = getActiveConnections().remove(candidate);
-                LOG.warn("Connection swept: {}{}{} from active connections{}{}",
-                        candidate,
-                        System.lineSeparator(),
-                        removed ? "Removed" : "Not removed",
-                        System.lineSeparator(),
-                        dump());
-            }
-        }
-
-        return false;
-    }
-
-    @Override
-    public String toString()
-    {
-        int activeSize;
-        int idleSize;
-        final ReentrantLock lock = this.lock;
-        lock.lock();
-        try
-        {
-            activeSize = activeConnections.size();
-            idleSize = idleConnections.size();
-        }
-        finally
-        {
-            lock.unlock();
-        }
-
-        return String.format("%s[c=%d/%d,a=%d,i=%d]",
-                getClass().getSimpleName(),
-                connectionCount.get(),
-                maxConnections,
-                activeSize,
-                idleSize);
+        super(destination, maxConnections, requester);
     }
 }
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/ContentDecoder.java b/jetty-client/src/main/java/org/eclipse/jetty/client/ContentDecoder.java
index 7b230f6..f811e6b 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/ContentDecoder.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/ContentDecoder.java
@@ -37,10 +37,10 @@
 
     /**
      * Factory for {@link ContentDecoder}s; subclasses must implement {@link #newContentDecoder()}.
-     * <p />
+     * <p>
      * {@link Factory} have an {@link #getEncoding() encoding}, which is the string used in
      * {@code Accept-Encoding} request header and in {@code Content-Encoding} response headers.
-     * <p />
+     * <p>
      * {@link Factory} instances are configured in {@link HttpClient} via
      * {@link HttpClient#getContentDecoderFactories()}.
      */
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/ContinueProtocolHandler.java b/jetty-client/src/main/java/org/eclipse/jetty/client/ContinueProtocolHandler.java
index 2120ac2..460f014 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/ContinueProtocolHandler.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/ContinueProtocolHandler.java
@@ -27,20 +27,28 @@
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpHeaderValue;
 
+/**
+ * <p>A protocol handler that handles the 100 response code.</p>
+ */
 public class ContinueProtocolHandler implements ProtocolHandler
 {
+    public static final String NAME = "continue";
     private static final String ATTRIBUTE = ContinueProtocolHandler.class.getName() + ".100continue";
 
-    private final HttpClient client;
     private final ResponseNotifier notifier;
 
-    public ContinueProtocolHandler(HttpClient client)
+    public ContinueProtocolHandler()
     {
-        this.client = client;
         this.notifier = new ResponseNotifier();
     }
 
     @Override
+    public String getName()
+    {
+        return NAME;
+    }
+
+    @Override
     public boolean accept(Request request, Response response)
     {
         boolean expect100 = request.getHeaders().contains(HttpHeader.EXPECT, HttpHeaderValue.CONTINUE.asString());
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/DuplexConnectionPool.java b/jetty-client/src/main/java/org/eclipse/jetty/client/DuplexConnectionPool.java
new file mode 100644
index 0000000..dcf7470
--- /dev/null
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/DuplexConnectionPool.java
@@ -0,0 +1,458 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.client;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Deque;
+import java.util.List;
+import java.util.Queue;
+import java.util.concurrent.LinkedBlockingDeque;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.eclipse.jetty.client.api.Connection;
+import org.eclipse.jetty.client.api.Destination;
+import org.eclipse.jetty.util.BlockingArrayQueue;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.Promise;
+import org.eclipse.jetty.util.annotation.ManagedAttribute;
+import org.eclipse.jetty.util.annotation.ManagedObject;
+import org.eclipse.jetty.util.component.ContainerLifeCycle;
+import org.eclipse.jetty.util.component.Dumpable;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.Sweeper;
+
+@ManagedObject("The connection pool")
+public class DuplexConnectionPool implements Closeable, Dumpable, Sweeper.Sweepable
+{
+    private static final Logger LOG = Log.getLogger(DuplexConnectionPool.class);
+
+    private final AtomicInteger connectionCount = new AtomicInteger();
+    private final ReentrantLock lock = new ReentrantLock();
+    private final Destination destination;
+    private final int maxConnections;
+    private final Callback requester;
+    private final Deque<Connection> idleConnections;
+    private final Queue<Connection> activeConnections;
+
+    public DuplexConnectionPool(Destination destination, int maxConnections, Callback requester)
+    {
+        this.destination = destination;
+        this.maxConnections = maxConnections;
+        this.requester = requester;
+        this.idleConnections = new LinkedBlockingDeque<>(maxConnections);
+        this.activeConnections = new BlockingArrayQueue<>(maxConnections);
+    }
+
+    @ManagedAttribute(value = "The number of connections", readonly = true)
+    public int getConnectionCount()
+    {
+        return connectionCount.get();
+    }
+
+    @ManagedAttribute(value = "The number of idle connections", readonly = true)
+    public int getIdleConnectionCount()
+    {
+        lock();
+        try
+        {
+            return idleConnections.size();
+        }
+        finally
+        {
+            unlock();
+        }
+    }
+
+    @ManagedAttribute(value = "The number of active connections", readonly = true)
+    public int getActiveConnectionCount()
+    {
+        lock();
+        try
+        {
+            return activeConnections.size();
+        }
+        finally
+        {
+            unlock();
+        }
+    }
+
+    public Queue<Connection> getIdleConnections()
+    {
+        return idleConnections;
+    }
+
+    public Queue<Connection> getActiveConnections()
+    {
+        return activeConnections;
+    }
+
+    public Connection acquire()
+    {
+        Connection connection = activateIdle();
+        if (connection == null)
+            connection = tryCreate();
+        return connection;
+    }
+
+    private Connection tryCreate()
+    {
+        while (true)
+        {
+            int current = getConnectionCount();
+            final int next = current + 1;
+
+            if (next > maxConnections)
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Max connections {}/{} reached", current, maxConnections);
+                // Try again the idle connections
+                return activateIdle();
+            }
+
+            if (connectionCount.compareAndSet(current, next))
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Connection {}/{} creation", next, maxConnections);
+
+                destination.newConnection(new Promise<Connection>()
+                {
+                    @Override
+                    public void succeeded(Connection connection)
+                    {
+                        if (LOG.isDebugEnabled())
+                            LOG.debug("Connection {}/{} creation succeeded {}", next, maxConnections, connection);
+
+                        idleCreated(connection);
+
+                        proceed();
+                    }
+
+                    @Override
+                    public void failed(Throwable x)
+                    {
+                        if (LOG.isDebugEnabled())
+                            LOG.debug("Connection " + next + "/" + maxConnections + " creation failed", x);
+
+                        connectionCount.decrementAndGet();
+
+                        requester.failed(x);
+                    }
+                });
+
+                // Try again the idle connections
+                return activateIdle();
+            }
+        }
+    }
+
+    protected void proceed()
+    {
+        requester.succeeded();
+    }
+
+    protected void idleCreated(Connection connection)
+    {
+        boolean idle;
+        lock();
+        try
+        {
+            // Use "cold" new connections as last.
+            idle = idleConnections.offerLast(connection);
+        }
+        finally
+        {
+            unlock();
+        }
+
+        idle(connection, idle);
+    }
+
+    private Connection activateIdle()
+    {
+        boolean acquired;
+        Connection connection;
+        lock();
+        try
+        {
+            connection = idleConnections.pollFirst();
+            if (connection == null)
+                return null;
+            acquired = activeConnections.offer(connection);
+        }
+        finally
+        {
+            unlock();
+        }
+
+        if (acquired)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Connection active {}", connection);
+            acquired(connection);
+            return connection;
+        }
+        else
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Connection active overflow {}", connection);
+            connection.close();
+            return null;
+        }
+    }
+
+    protected void acquired(Connection connection)
+    {
+    }
+
+    public boolean release(Connection connection)
+    {
+        boolean idle;
+        lock();
+        try
+        {
+            if (!activeConnections.remove(connection))
+                return false;
+            // Make sure we use "hot" connections first.
+            idle = offerIdle(connection);
+        }
+        finally
+        {
+            unlock();
+        }
+
+        released(connection);
+        return idle(connection, idle);
+    }
+
+    protected boolean offerIdle(Connection connection)
+    {
+        return idleConnections.offerFirst(connection);
+    }
+
+    protected boolean idle(Connection connection, boolean idle)
+    {
+        if (idle)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Connection idle {}", connection);
+            return true;
+        }
+        else
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Connection idle overflow {}", connection);
+            connection.close();
+            return false;
+        }
+    }
+
+    protected void released(Connection connection)
+    {
+    }
+
+    public boolean remove(Connection connection)
+    {
+        return remove(connection, false);
+    }
+
+    protected boolean remove(Connection connection, boolean force)
+    {
+        boolean activeRemoved;
+        boolean idleRemoved;
+        lock();
+        try
+        {
+            activeRemoved = activeConnections.remove(connection);
+            idleRemoved = idleConnections.remove(connection);
+        }
+        finally
+        {
+            unlock();
+        }
+
+        if (activeRemoved || force)
+            released(connection);
+        boolean removed = activeRemoved || idleRemoved || force;
+        if (removed)
+        {
+            int pooled = connectionCount.decrementAndGet();
+            if (LOG.isDebugEnabled())
+                LOG.debug("Connection removed {} - pooled: {}", connection, pooled);
+        }
+        return removed;
+    }
+
+    public boolean isActive(Connection connection)
+    {
+        lock();
+        try
+        {
+            return activeConnections.contains(connection);
+        }
+        finally
+        {
+            unlock();
+        }
+    }
+
+    public boolean isIdle(Connection connection)
+    {
+        lock();
+        try
+        {
+            return idleConnections.contains(connection);
+        }
+        finally
+        {
+            unlock();
+        }
+    }
+
+    public boolean isEmpty()
+    {
+        return connectionCount.get() == 0;
+    }
+
+    public void close()
+    {
+        List<Connection> idles = new ArrayList<>();
+        List<Connection> actives = new ArrayList<>();
+        lock();
+        try
+        {
+            idles.addAll(idleConnections);
+            idleConnections.clear();
+            actives.addAll(activeConnections);
+            activeConnections.clear();
+        }
+        finally
+        {
+            unlock();
+        }
+
+        connectionCount.set(0);
+
+        for (Connection connection : idles)
+            connection.close();
+
+        // A bit drastic, but we cannot wait for all requests to complete
+        for (Connection connection : actives)
+            connection.close();
+    }
+
+    @Override
+    public String dump()
+    {
+        return ContainerLifeCycle.dump(this);
+    }
+
+    @Override
+    public void dump(Appendable out, String indent) throws IOException
+    {
+        List<Connection> actives = new ArrayList<>();
+        List<Connection> idles = new ArrayList<>();
+        lock();
+        try
+        {
+            actives.addAll(activeConnections);
+            idles.addAll(idleConnections);
+        }
+        finally
+        {
+            unlock();
+        }
+
+        ContainerLifeCycle.dumpObject(out, this);
+        ContainerLifeCycle.dump(out, indent, actives, idles);
+    }
+
+    @Override
+    public boolean sweep()
+    {
+        List<Connection> toSweep = new ArrayList<>();
+        lock();
+        try
+        {
+            for (Connection connection : activeConnections)
+            {
+                if (connection instanceof Sweeper.Sweepable)
+                    toSweep.add(connection);
+            }
+        }
+        finally
+        {
+            unlock();
+        }
+
+        for (Connection connection : toSweep)
+        {
+            if (((Sweeper.Sweepable)connection).sweep())
+            {
+                boolean removed = remove(connection, true);
+                LOG.warn("Connection swept: {}{}{} from active connections{}{}",
+                        connection,
+                        System.lineSeparator(),
+                        removed ? "Removed" : "Not removed",
+                        System.lineSeparator(),
+                        dump());
+            }
+        }
+
+        return false;
+    }
+
+    protected void lock()
+    {
+        lock.lock();
+    }
+
+    protected void unlock()
+    {
+        lock.unlock();
+    }
+
+    @Override
+    public String toString()
+    {
+        int activeSize;
+        int idleSize;
+        lock();
+        try
+        {
+            activeSize = activeConnections.size();
+            idleSize = idleConnections.size();
+        }
+        finally
+        {
+            unlock();
+        }
+
+        return String.format("%s[c=%d/%d,a=%d,i=%d]",
+                getClass().getSimpleName(),
+                connectionCount.get(),
+                maxConnections,
+                activeSize,
+                idleSize);
+    }
+}
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java
index 10b0d5c..8c97c77 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java
@@ -18,10 +18,10 @@
 
 package org.eclipse.jetty.client;
 
-import java.io.IOException;
 import java.net.CookieManager;
 import java.net.CookiePolicy;
 import java.net.CookieStore;
+import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.net.SocketAddress;
 import java.net.URI;
@@ -62,6 +62,8 @@
 import org.eclipse.jetty.util.Jetty;
 import org.eclipse.jetty.util.Promise;
 import org.eclipse.jetty.util.SocketAddressResolver;
+import org.eclipse.jetty.util.annotation.ManagedAttribute;
+import org.eclipse.jetty.util.annotation.ManagedObject;
 import org.eclipse.jetty.util.component.ContainerLifeCycle;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
@@ -106,12 +108,13 @@
  * });
  * </pre>
  */
+@ManagedObject("The HTTP client")
 public class HttpClient extends ContainerLifeCycle
 {
     private static final Logger LOG = Log.getLogger(HttpClient.class);
 
     private final ConcurrentMap<Origin, HttpDestination> destinations = new ConcurrentHashMap<>();
-    private final List<ProtocolHandler> handlers = new ArrayList<>();
+    private final ProtocolHandlers handlers = new ProtocolHandlers();
     private final List<Request.Listener> requestListeners = new ArrayList<>();
     private final AuthenticationStore authenticationStore = new HttpAuthenticationStore();
     private final Set<ContentDecoder.Factory> decoderFactories = new ContentDecoderFactorySet();
@@ -136,7 +139,6 @@
     private volatile long addressResolutionTimeout = 15000;
     private volatile long idleTimeout;
     private volatile boolean tcpNoDelay = true;
-    private volatile boolean dispatchIO = true;
     private volatile boolean strictEventOrdering = false;
     private volatile HttpField encodingField;
     private volatile boolean removeIdleDestinations = false;
@@ -216,10 +218,10 @@
             resolver = new SocketAddressResolver.Async(executor, scheduler, getAddressResolutionTimeout());
         addBean(resolver);
 
-        handlers.add(new ContinueProtocolHandler(this));
-        handlers.add(new RedirectProtocolHandler(this));
-        handlers.add(new WWWAuthenticationProtocolHandler(this));
-        handlers.add(new ProxyAuthenticationProtocolHandler(this));
+        handlers.put(new ContinueProtocolHandler());
+        handlers.put(new RedirectProtocolHandler(this));
+        handlers.put(new WWWAuthenticationProtocolHandler(this));
+        handlers.put(new ProxyAuthenticationProtocolHandler(this));
 
         decoderFactories.add(new GZIPContentDecoder.Factory());
 
@@ -315,6 +317,9 @@
      *
      * @param uri the URI to GET
      * @return the {@link ContentResponse} for the request
+     * @throws InterruptedException if send threading has been interrupted
+     * @throws ExecutionException the execution failed
+     * @throws TimeoutException the send timed out
      * @see #GET(URI)
      */
     public ContentResponse GET(String uri) throws InterruptedException, ExecutionException, TimeoutException
@@ -327,6 +332,9 @@
      *
      * @param uri the URI to GET
      * @return the {@link ContentResponse} for the request
+     * @throws InterruptedException if send threading has been interrupted
+     * @throws ExecutionException the execution failed
+     * @throws TimeoutException the send timed out
      * @see #newRequest(URI)
      */
     public ContentResponse GET(URI uri) throws InterruptedException, ExecutionException, TimeoutException
@@ -340,6 +348,9 @@
      * @param uri the URI to POST
      * @param fields the fields composing the form name/value pairs
      * @return the {@link ContentResponse} for the request
+     * @throws InterruptedException if send threading has been interrupted
+     * @throws ExecutionException the execution failed
+     * @throws TimeoutException the send timed out
      */
     public ContentResponse FORM(String uri, Fields fields) throws InterruptedException, ExecutionException, TimeoutException
     {
@@ -352,6 +363,9 @@
      * @param uri the URI to POST
      * @param fields the fields composing the form name/value pairs
      * @return the {@link ContentResponse} for the request
+     * @throws InterruptedException if send threading has been interrupted
+     * @throws ExecutionException the execution failed
+     * @throws TimeoutException the send timed out
      */
     public ContentResponse FORM(URI uri, Fields fields) throws InterruptedException, ExecutionException, TimeoutException
     {
@@ -483,28 +497,25 @@
         if (destination == null)
         {
             destination = transport.newHttpDestination(origin);
-            if (isRunning())
+            addManaged(destination);
+            HttpDestination existing = destinations.putIfAbsent(origin, destination);
+            if (existing != null)
             {
-                HttpDestination existing = destinations.putIfAbsent(origin, destination);
-                if (existing != null)
-                {
-                    destination = existing;
-                }
-                else
-                {
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("Created {}", destination);
-                }
-                if (!isRunning())
-                    destinations.remove(origin);
+                removeBean(destination);
+                destination = existing;
             }
-
+            else
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Created {}", destination);
+            }
         }
         return destination;
     }
 
     protected boolean removeDestination(HttpDestination destination)
     {
+        removeBean(destination);
         return destinations.remove(destination.getOrigin()) != null;
     }
 
@@ -530,15 +541,14 @@
     protected void newConnection(final HttpDestination destination, final Promise<Connection> promise)
     {
         Origin.Address address = destination.getConnectAddress();
-        resolver.resolve(address.getHost(), address.getPort(), new Promise<SocketAddress>()
+        resolver.resolve(address.getHost(), address.getPort(), new Promise<List<InetSocketAddress>>()
         {
             @Override
-            public void succeeded(SocketAddress socketAddress)
+            public void succeeded(List<InetSocketAddress> socketAddresses)
             {
                 Map<String, Object> context = new HashMap<>();
                 context.put(HttpClientTransport.HTTP_DESTINATION_CONTEXT_KEY, destination);
-                context.put(HttpClientTransport.HTTP_CONNECTION_PROMISE_CONTEXT_KEY, promise);
-                transport.connect(socketAddress, context);
+                connect(socketAddresses, 0, context);
             }
 
             @Override
@@ -546,6 +556,29 @@
             {
                 promise.failed(x);
             }
+
+            private void connect(List<InetSocketAddress> socketAddresses, int index, Map<String, Object> context)
+            {
+                context.put(HttpClientTransport.HTTP_CONNECTION_PROMISE_CONTEXT_KEY, new Promise<Connection>()
+                {
+                    @Override
+                    public void succeeded(Connection result)
+                    {
+                        promise.succeeded(result);
+                    }
+
+                    @Override
+                    public void failed(Throwable x)
+                    {
+                        int nextIndex = index + 1;
+                        if (nextIndex == socketAddresses.size())
+                            promise.failed(x);
+                        else
+                            connect(socketAddresses, nextIndex, context);
+                    }
+                });
+                transport.connect(socketAddresses.get(index), context);
+            }
         });
     }
 
@@ -554,22 +587,14 @@
         return new HttpConversation();
     }
 
-    public List<ProtocolHandler> getProtocolHandlers()
+    public ProtocolHandlers getProtocolHandlers()
     {
         return handlers;
     }
 
     protected ProtocolHandler findProtocolHandler(Request request, Response response)
     {
-        // Optimized to avoid allocations of iterator instances
-        List<ProtocolHandler> protocolHandlers = getProtocolHandlers();
-        for (int i = 0; i < protocolHandlers.size(); ++i)
-        {
-            ProtocolHandler handler = protocolHandlers.get(i);
-            if (handler.accept(request, response))
-                return handler;
-        }
-        return null;
+        return handlers.find(request, response);
     }
 
     /**
@@ -591,6 +616,7 @@
     /**
      * @return the max time, in milliseconds, a connection can take to connect to destinations
      */
+    @ManagedAttribute("The timeout, in milliseconds, for connect() operations")
     public long getConnectTimeout()
     {
         return connectTimeout;
@@ -631,6 +657,7 @@
     /**
      * @return the max time, in milliseconds, a connection can be idle (that is, without traffic of bytes in either direction)
      */
+    @ManagedAttribute("The timeout, in milliseconds, to close idle connections")
     public long getIdleTimeout()
     {
         return idleTimeout;
@@ -685,6 +712,7 @@
      * @return whether this {@link HttpClient} follows HTTP redirects
      * @see Request#isFollowRedirects()
      */
+    @ManagedAttribute("Whether HTTP redirects are followed")
     public boolean isFollowRedirects()
     {
         return followRedirects;
@@ -750,6 +778,7 @@
     /**
      * @return the max number of connections that this {@link HttpClient} opens to {@link Destination}s
      */
+    @ManagedAttribute("The max number of connections per each destination")
     public int getMaxConnectionsPerDestination()
     {
         return maxConnectionsPerDestination;
@@ -757,7 +786,7 @@
 
     /**
      * Sets the max number of connections to open to each destinations.
-     * <p />
+     * <p>
      * RFC 2616 suggests that 2 connections should be opened per each destination,
      * but browsers commonly open 6.
      * If this {@link HttpClient} is used for load testing, it is common to have only one destination
@@ -774,6 +803,7 @@
     /**
      * @return the max number of requests that may be queued to a {@link Destination}.
      */
+    @ManagedAttribute("The max number of requests queued per each destination")
     public int getMaxRequestsQueuedPerDestination()
     {
         return maxRequestsQueuedPerDestination;
@@ -781,7 +811,7 @@
 
     /**
      * Sets the max number of requests that may be queued to a destination.
-     * <p />
+     * <p>
      * If this {@link HttpClient} performs a high rate of requests to a destination,
      * and all the connections managed by that destination are busy with other requests,
      * then new requests will be queued up in the destination.
@@ -800,6 +830,7 @@
     /**
      * @return the size of the buffer used to write requests
      */
+    @ManagedAttribute("The request buffer size")
     public int getRequestBufferSize()
     {
         return requestBufferSize;
@@ -816,6 +847,7 @@
     /**
      * @return the size of the buffer used to read responses
      */
+    @ManagedAttribute("The response buffer size")
     public int getResponseBufferSize()
     {
         return responseBufferSize;
@@ -850,6 +882,7 @@
     /**
      * @return whether TCP_NODELAY is enabled
      */
+    @ManagedAttribute(value = "Whether the TCP_NODELAY option is enabled", name = "tcpNoDelay")
     public boolean isTCPNoDelay()
     {
         return tcpNoDelay;
@@ -868,14 +901,16 @@
      * @return true to dispatch I/O operations in a different thread, false to execute them in the selector thread
      * @see #setDispatchIO(boolean)
      */
+    @Deprecated
     public boolean isDispatchIO()
     {
-        return dispatchIO;
+        // TODO this did default to true, so usage needs to be evaluated.
+        return false;
     }
 
     /**
      * Whether to dispatch I/O operations from the selector thread to a different thread.
-     * <p />
+     * <p>
      * This implementation never blocks on I/O operation, but invokes application callbacks that may
      * take time to execute or block on other I/O.
      * If application callbacks are known to take time or block on I/O, then parameter {@code dispatchIO}
@@ -886,15 +921,16 @@
      * @param dispatchIO true to dispatch I/O operations in a different thread,
      *                   false to execute them in the selector thread
      */
+    @Deprecated
     public void setDispatchIO(boolean dispatchIO)
     {
-        this.dispatchIO = dispatchIO;
     }
 
     /**
      * @return whether request events must be strictly ordered
      * @see #setStrictEventOrdering(boolean)
      */
+    @ManagedAttribute("Whether request/response events must be strictly ordered")
     public boolean isStrictEventOrdering()
     {
         return strictEventOrdering;
@@ -902,17 +938,17 @@
 
     /**
      * Whether request/response events must be strictly ordered with respect to connection usage.
-     * <p />
+     * <p>
      * From the point of view of connection usage, the connection can be reused just before the
      * "complete" event notified to {@link org.eclipse.jetty.client.api.Response.CompleteListener}s
      * (but after the "success" event).
-     * <p />
+     * <p>
      * When a request/response exchange is completing, the destination may have another request
      * queued to be sent to the server.
      * If the connection for that destination is reused for the second request before the "complete"
      * event of the first exchange, it may happen that the "begin" event of the second request
      * happens before the "complete" event of the first exchange.
-     * <p />
+     * <p>
      * Enforcing strict ordering of events so that a "begin" event of a request can never happen
      * before the "complete" event of the previous exchange comes with the cost of increased
      * connection usage.
@@ -921,7 +957,7 @@
      * when the connection cannot yet be reused.
      * When strict event ordering is not enforced, the redirect request will reuse the already
      * open connection making the system more efficient.
-     * <p />
+     * <p>
      * The default value for this property is {@code false}.
      *
      * @param strictEventOrdering whether request/response events must be strictly ordered
@@ -935,6 +971,7 @@
      * @return whether destinations that have no connections should be removed
      * @see #setRemoveIdleDestinations(boolean)
      */
+    @ManagedAttribute("Whether idle destinations are removed")
     public boolean isRemoveIdleDestinations()
     {
         return removeIdleDestinations;
@@ -942,7 +979,7 @@
 
     /**
      * Whether destinations that have no connections (nor active nor idle) should be removed.
-     * <p />
+     * <p>
      * Applications typically make request to a limited number of destinations so keeping
      * destinations around is not a problem for the memory or the GC.
      * However, for applications that hit millions of different destinations (e.g. a spider
@@ -950,7 +987,7 @@
      * anymore and leave space for new destinations.
      *
      * @param removeIdleDestinations whether destinations that have no connections should be removed
-     * @see org.eclipse.jetty.client.ConnectionPool
+     * @see org.eclipse.jetty.client.DuplexConnectionPool
      */
     public void setRemoveIdleDestinations(boolean removeIdleDestinations)
     {
@@ -960,6 +997,7 @@
     /**
      * @return whether {@code connect()} operations are performed in blocking mode
      */
+    @ManagedAttribute("Whether the connect() operation is blocking")
     public boolean isConnectBlocking()
     {
         return connectBlocking;
@@ -1005,18 +1043,11 @@
         return port > 0 ? port : HttpScheme.HTTPS.is(scheme) ? 443 : 80;
     }
 
-    protected boolean isDefaultPort(String scheme, int port)
+    public boolean isDefaultPort(String scheme, int port)
     {
         return HttpScheme.HTTPS.is(scheme) ? port == 443 : port == 80;
     }
 
-    @Override
-    public void dump(Appendable out, String indent) throws IOException
-    {
-        dumpThis(out);
-        dump(out, indent, getBeans(), destinations.values());
-    }
-
     private class ContentDecoderFactorySet implements Set<ContentDecoder.Factory>
     {
         private final Set<ContentDecoder.Factory> set = new HashSet<>();
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClientTransport.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClientTransport.java
index 4d16d0f..bf0bbe6 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClientTransport.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClientTransport.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.client;
 
-import java.net.SocketAddress;
+import java.net.InetSocketAddress;
 import java.util.Map;
 
 import org.eclipse.jetty.io.ClientConnectionFactory;
@@ -26,13 +26,13 @@
 /**
  * {@link HttpClientTransport} represents what transport implementations should provide
  * in order to plug-in a different transport for {@link HttpClient}.
- * <p/>
+ * <p>
  * While the {@link HttpClient} APIs define the HTTP semantic (request, response, headers, etc.)
  * <em>how</em> a HTTP exchange is carried over the network depends on implementations of this class.
- * <p/>
+ * <p>
  * The default implementation uses the HTTP protocol to carry over the network the HTTP exchange,
- * but the HTTP exchange may also be carried using the SPDY protocol or the FCGI protocol or, in future,
- * other protocols.
+ * but the HTTP exchange may also be carried using the FCGI protocol, the HTTP/2 protocol or,
+ * in future, other protocols.
  */
 public interface HttpClientTransport extends ClientConnectionFactory
 {
@@ -41,7 +41,7 @@
 
     /**
      * Sets the {@link HttpClient} instance on this transport.
-     * <p />
+     * <p>
      * This is needed because of a chicken-egg problem: in order to create the {@link HttpClient}
      * a {@link HttpClientTransport} is needed, that therefore cannot have a reference yet to the
      * {@link HttpClient}.
@@ -52,9 +52,9 @@
 
     /**
      * Creates a new, transport-specific, {@link HttpDestination} object.
-     * <p />
+     * <p>
      * {@link HttpDestination} controls the destination-connection cardinality: protocols like
-     * HTTP have 1-N cardinality, while multiplexed protocols like SPDY have a 1-1 cardinality.
+     * HTTP have 1-N cardinality, while multiplexed protocols like HTTP/2 have a 1-1 cardinality.
      *
      * @param origin the destination origin
      * @return a new, transport-specific, {@link HttpDestination} object
@@ -64,8 +64,8 @@
     /**
      * Establishes a physical connection to the given {@code address}.
      *
-     * @param address the address to connect to
+     *  @param address the address to connect to
      * @param context the context information to establish the connection
      */
-    public void connect(SocketAddress address, Map<String, Object> context);
+    public void connect(InetSocketAddress address, Map<String, Object> context);
 }
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpContent.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpContent.java
index 237b835..1d01f06 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpContent.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpContent.java
@@ -33,7 +33,7 @@
  * {@link HttpContent} is a stateful, linear representation of the request content provided
  * by a {@link ContentProvider} that can be traversed one-way to obtain content buffers to
  * send to a HTTP server.
- * <p />
+ * <p>
  * {@link HttpContent} offers the notion of a one-way cursor to traverse the content.
  * The cursor starts in a virtual "before" position and can be advanced using {@link #advance()}
  * until it reaches a virtual "after" position where the content is fully consumed.
@@ -42,7 +42,7 @@
  *      |   |  |   |  |   |  |   |  |   |
  *      +---+  +---+  +---+  +---+  +---+
  *   ^           ^                    ^    ^
- *   |           | --> advance()      |    |
+ *   |           | --&gt; advance()      |    |
  *   |           |                  last   |
  *   |           |                         |
  * before        |                        after
@@ -57,7 +57,7 @@
  * </ul>
  * {@link HttpContent} may not have content, if the related {@link ContentProvider} is {@code null}, and this
  * is reflected by {@link #hasContent()}.
- * <p />
+ * <p>
  * {@link HttpContent} may have {@link AsyncContentProvider deferred content}, in which case {@link #advance()}
  * moves the cursor to a position that provides {@code null} {@link #getByteBuffer() buffer} and
  * {@link #getContent() content}. When the deferred content is available, a further call to {@link #advance()}
@@ -67,11 +67,13 @@
 {
     private static final Logger LOG = Log.getLogger(HttpContent.class);
     private static final ByteBuffer AFTER = ByteBuffer.allocate(0);
+    private static final ByteBuffer CLOSE = ByteBuffer.allocate(0);
 
     private final ContentProvider provider;
     private final Iterator<ByteBuffer> iterator;
     private ByteBuffer buffer;
-    private volatile ByteBuffer content;
+    private ByteBuffer content;
+    private boolean last;
 
     public HttpContent(ContentProvider provider)
     {
@@ -92,7 +94,7 @@
      */
     public boolean isLast()
     {
-        return !iterator.hasNext();
+        return last;
     }
 
     /**
@@ -113,52 +115,61 @@
 
     /**
      * Advances the cursor to the next block of content.
-     * <p />
+     * <p>
      * The next block of content may be valid (which yields a non-null buffer
      * returned by {@link #getByteBuffer()}), but may also be deferred
      * (which yields a null buffer returned by {@link #getByteBuffer()}).
-     * <p />
+     * <p>
      * If the block of content pointed by the new cursor position is valid, this method returns true.
      *
      * @return true if there is content at the new cursor's position, false otherwise.
      */
     public boolean advance()
     {
-        boolean advanced;
-        boolean hasNext;
-        ByteBuffer bytes;
         if (iterator instanceof Synchronizable)
         {
             synchronized (((Synchronizable)iterator).getLock())
             {
-                advanced = iterator.hasNext();
-                bytes = advanced ? iterator.next() : null;
-                hasNext = advanced && iterator.hasNext();
+                return advance(iterator);
             }
         }
         else
         {
-            advanced = iterator.hasNext();
-            bytes = advanced ? iterator.next() : null;
-            hasNext = advanced && iterator.hasNext();
+            return advance(iterator);
         }
+    }
 
-        if (advanced)
+    private boolean advance(Iterator<ByteBuffer> iterator)
+    {
+        boolean hasNext = iterator.hasNext();
+        ByteBuffer bytes = hasNext ? iterator.next() : null;
+        boolean hasMore = hasNext && iterator.hasNext();
+        boolean wasLast = last;
+        last = !hasMore;
+
+        if (hasNext)
         {
             buffer = bytes;
             content = bytes == null ? null : bytes.slice();
             if (LOG.isDebugEnabled())
-                LOG.debug("Advanced content to {} chunk {}", hasNext ? "next" : "last", bytes);
+                LOG.debug("Advanced content to {} chunk {}", hasMore ? "next" : "last", String.valueOf(bytes));
             return bytes != null;
         }
         else
         {
-            if (content != AFTER)
+            // No more content, but distinguish between last and consumed.
+            if (wasLast)
             {
-                content = buffer = AFTER;
+                buffer = content = AFTER;
                 if (LOG.isDebugEnabled())
                     LOG.debug("Advanced content past last chunk");
             }
+            else
+            {
+                buffer = content = CLOSE;
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Advanced content to last chunk");
+            }
             return false;
         }
     }
@@ -168,7 +179,7 @@
      */
     public boolean isConsumed()
     {
-        return content == AFTER;
+        return buffer == AFTER;
     }
 
     @Override
@@ -176,6 +187,8 @@
     {
         if (isConsumed())
             return;
+        if (buffer == CLOSE)
+            return;
         if (iterator instanceof Callback)
             ((Callback)iterator).succeeded();
     }
@@ -185,6 +198,8 @@
     {
         if (isConsumed())
             return;
+        if (buffer == CLOSE)
+            return;
         if (iterator instanceof Callback)
             ((Callback)iterator).failed(x);
     }
@@ -197,7 +212,7 @@
             if (iterator instanceof Closeable)
                 ((Closeable)iterator).close();
         }
-        catch (Exception x)
+        catch (Throwable x)
         {
             LOG.ignore(x);
         }
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpConversation.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpConversation.java
index 2a5d0ae..327d8ac 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpConversation.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpConversation.java
@@ -41,42 +41,42 @@
      * This list changes as the conversation proceeds, as follows:
      * <ol>
      * <li>
-     *     request R1 send => conversation.updateResponseListeners(null)
+     *     request R1 send =&gt; conversation.updateResponseListeners(null)
      *     <ul>
      *         <li>exchanges in conversation: E1</li>
      *         <li>listeners to be notified: E1.listeners</li>
      *     </ul>
      * </li>
      * <li>
-     *     response R1 arrived, 401 => conversation.updateResponseListeners(AuthenticationProtocolHandler.listener)
+     *     response R1 arrived, 401 =&gt; conversation.updateResponseListeners(AuthenticationProtocolHandler.listener)
      *     <ul>
      *         <li>exchanges in conversation: E1</li>
      *         <li>listeners to be notified: AuthenticationProtocolHandler.listener</li>
      *     </ul>
      * </li>
      * <li>
-     *     request R2 send => conversation.updateResponseListeners(null)
+     *     request R2 send =&gt; conversation.updateResponseListeners(null)
      *     <ul>
      *         <li>exchanges in conversation: E1 + E2</li>
      *         <li>listeners to be notified: E2.listeners + E1.listeners</li>
      *     </ul>
      * </li>
      * <li>
-     *     response R2 arrived, 302 => conversation.updateResponseListeners(RedirectProtocolHandler.listener)
+     *     response R2 arrived, 302 =&gt; conversation.updateResponseListeners(RedirectProtocolHandler.listener)
      *     <ul>
      *         <li>exchanges in conversation: E1 + E2</li>
      *         <li>listeners to be notified: E2.listeners + RedirectProtocolHandler.listener</li>
      *     </ul>
      * </li>
      * <li>
-     *     request R3 send => conversation.updateResponseListeners(null)
+     *     request R3 send =&gt; conversation.updateResponseListeners(null)
      *     <ul>
      *         <li>exchanges in conversation: E1 + E2 + E3</li>
      *         <li>listeners to be notified: E3.listeners + E1.listeners</li>
      *     </ul>
      * </li>
      * <li>
-     *     response R3 arrived, 200 => conversation.updateResponseListeners(null)
+     *     response R3 arrived, 200 =&gt; conversation.updateResponseListeners(null)
      *     <ul>
      *         <li>exchanges in conversation: E1 + E2 + E3</li>
      *         <li>listeners to be notified: E3.listeners + E1.listeners</li>
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpDestination.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpDestination.java
index 7538921..9031562 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpDestination.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpDestination.java
@@ -36,12 +36,15 @@
 import org.eclipse.jetty.io.ssl.SslClientConnectionFactory;
 import org.eclipse.jetty.util.BlockingArrayQueue;
 import org.eclipse.jetty.util.Promise;
+import org.eclipse.jetty.util.annotation.ManagedAttribute;
+import org.eclipse.jetty.util.annotation.ManagedObject;
 import org.eclipse.jetty.util.component.ContainerLifeCycle;
 import org.eclipse.jetty.util.component.Dumpable;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
-public abstract class HttpDestination implements Destination, Closeable, Dumpable
+@ManagedObject
+public abstract class HttpDestination extends ContainerLifeCycle implements Destination, Closeable, Dumpable
 {
     protected static final Logger LOG = Log.getLogger(HttpDestination.class);
 
@@ -130,12 +133,14 @@
     }
 
     @Override
+    @ManagedAttribute(value = "The destination scheme", readonly = true)
     public String getScheme()
     {
         return origin.getScheme();
     }
 
     @Override
+    @ManagedAttribute(value = "The destination host", readonly = true)
     public String getHost()
     {
         // InetSocketAddress.getHostString() transforms the host string
@@ -144,11 +149,18 @@
     }
 
     @Override
+    @ManagedAttribute(value = "The destination port", readonly = true)
     public int getPort()
     {
         return origin.getAddress().getPort();
     }
 
+    @ManagedAttribute(value = "The number of queued requests", readonly = true)
+    public int getQueuedRequestCount()
+    {
+        return exchanges.size();
+    }
+
     public Origin.Address getConnectAddress()
     {
         return proxy == null ? origin.getAddress() : proxy.getAddress();
@@ -205,7 +217,7 @@
         return queue.offer(exchange);
     }
 
-    protected abstract void send();
+    public abstract void send();
 
     public void newConnection(Promise<Connection> promise)
     {
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpProxy.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpProxy.java
index c46bc6c..bd9abbe 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpProxy.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpProxy.java
@@ -26,7 +26,6 @@
 import org.eclipse.jetty.client.api.Connection;
 import org.eclipse.jetty.client.api.Request;
 import org.eclipse.jetty.client.api.Response;
-import org.eclipse.jetty.client.api.Result;
 import org.eclipse.jetty.client.http.HttpConnectionOverHTTP;
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpMethod;
@@ -119,7 +118,7 @@
                     {
                         String message = String.format("Cannot perform requests over SSL, no %s in %s",
                                 SslContextFactory.class.getSimpleName(), HttpClient.class.getSimpleName());
-                        promise.failed(new IllegalStateException(message));
+                        tunnelFailed(new IllegalStateException(message));
                     }
                 }
                 else
@@ -131,7 +130,7 @@
             @Override
             public void failed(Throwable x)
             {
-                promise.failed(x);
+                tunnelFailed(x);
             }
 
             private void tunnel(HttpDestination destination, final Connection connection)
@@ -139,33 +138,31 @@
                 String target = destination.getOrigin().getAddress().asString();
                 Origin.Address proxyAddress = destination.getConnectAddress();
                 HttpClient httpClient = destination.getHttpClient();
+                long connectTimeout = httpClient.getConnectTimeout();
                 Request connect = httpClient.newRequest(proxyAddress.getHost(), proxyAddress.getPort())
                         .scheme(HttpScheme.HTTP.asString())
                         .method(HttpMethod.CONNECT)
                         .path(target)
                         .header(HttpHeader.HOST, target)
-                        .timeout(httpClient.getConnectTimeout(), TimeUnit.MILLISECONDS);
+                        .idleTimeout(2 * connectTimeout, TimeUnit.MILLISECONDS)
+                        .timeout(connectTimeout, TimeUnit.MILLISECONDS);
 
-                connection.send(connect, new Response.CompleteListener()
+                connection.send(connect, result ->
                 {
-                    @Override
-                    public void onComplete(Result result)
+                    if (result.isFailed())
                     {
-                        if (result.isFailed())
+                        tunnelFailed(result.getFailure());
+                    }
+                    else
+                    {
+                        Response response = result.getResponse();
+                        if (response.getStatus() == 200)
                         {
-                            tunnelFailed(result.getFailure());
+                            tunnelSucceeded();
                         }
                         else
                         {
-                            Response response = result.getResponse();
-                            if (response.getStatus() == 200)
-                            {
-                                tunnelSucceeded();
-                            }
-                            else
-                            {
-                                tunnelFailed(new HttpResponseException("Received " + response + " for " + result.getRequest(), response));
-                            }
+                            tunnelFailed(new HttpResponseException("Received " + response + " for " + result.getRequest(), response));
                         }
                     }
                 });
@@ -182,10 +179,7 @@
                     ClientConnectionFactory sslConnectionFactory = new SslClientConnectionFactory(client.getSslContextFactory(), client.getByteBufferPool(), client.getExecutor(), connectionFactory);
                     HttpConnectionOverHTTP oldConnection = (HttpConnectionOverHTTP)endPoint.getConnection();
                     org.eclipse.jetty.io.Connection newConnection = sslConnectionFactory.newConnection(endPoint, context);
-                    Helper.replaceConnection(oldConnection, newConnection);
-                    // Avoid setting fill interest in the old Connection,
-                    // without closing the underlying EndPoint.
-                    oldConnection.softClose();
+                    endPoint.upgrade(newConnection);
                     if (LOG.isDebugEnabled())
                         LOG.debug("HTTP tunnel established: {} over {}", oldConnection, newConnection);
                 }
@@ -198,7 +192,7 @@
             private void tunnelFailed(Throwable failure)
             {
                 endPoint.close();
-                failed(failure);
+                promise.failed(failure);
             }
         }
     }
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpReceiver.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpReceiver.java
index deb6069..2fb4441 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpReceiver.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpReceiver.java
@@ -42,9 +42,9 @@
 
 /**
  * {@link HttpReceiver} provides the abstract code to implement the various steps of the receive of HTTP responses.
- * <p />
+ * <p>
  * {@link HttpReceiver} maintains a state machine that is updated when the steps of receiving a response are executed.
- * <p />
+ * <p>
  * Subclasses must handle the transport-specific details, for example how to read from the raw socket and how to parse
  * the bytes read from the socket. Then they have to call the methods defined in this class in the following order:
  * <ol>
@@ -59,7 +59,7 @@
  * (for example, because of I/O exceptions).
  * At any time, user threads may abort the response which will cause {@link #responseFailure(Throwable)} to be
  * invoked.
- * <p />
+ * <p>
  * The state machine maintained by this class ensures that the response steps are not executed by an I/O thread
  * if the response has already been failed.
  *
@@ -96,10 +96,10 @@
 
     /**
      * Method to be invoked when the response status code is available.
-     * <p />
+     * <p>
      * Subclasses must have set the response status code on the {@link Response} object of the {@link HttpExchange}
      * prior invoking this method.
-     * <p />
+     * <p>
      * This method takes case of notifying {@link org.eclipse.jetty.client.api.Response.BeginListener}s.
      *
      * @param exchange the HTTP exchange
@@ -139,10 +139,10 @@
 
     /**
      * Method to be invoked when a response HTTP header is available.
-     * <p />
+     * <p>
      * Subclasses must not have added the header to the {@link Response} object of the {@link HttpExchange}
      * prior invoking this method.
-     * <p />
+     * <p>
      * This method takes case of notifying {@link org.eclipse.jetty.client.api.Response.HeaderListener}s and storing cookies.
      *
      * @param exchange the HTTP exchange
@@ -223,7 +223,7 @@
 
     /**
      * Method to be invoked after all response HTTP headers are available.
-     * <p />
+     * <p>
      * This method takes case of notifying {@link org.eclipse.jetty.client.api.Response.HeadersListener}s.
      *
      * @param exchange the HTTP exchange
@@ -281,11 +281,12 @@
 
     /**
      * Method to be invoked when response HTTP content is available.
-     * <p />
+     * <p>
      * This method takes case of decoding the content, if necessary, and notifying {@link org.eclipse.jetty.client.api.Response.ContentListener}s.
      *
      * @param exchange the HTTP exchange
      * @param buffer the response HTTP content buffer
+     * @param callback the callback
      * @return whether the processing should continue
      */
     protected boolean responseContent(HttpExchange exchange, ByteBuffer buffer, final Callback callback)
@@ -356,7 +357,7 @@
 
     /**
      * Method to be invoked when the response is successful.
-     * <p />
+     * <p>
      * This method takes case of notifying {@link org.eclipse.jetty.client.api.Response.SuccessListener}s and possibly
      * {@link org.eclipse.jetty.client.api.Response.CompleteListener}s (if the exchange is completed).
      *
@@ -397,7 +398,7 @@
 
     /**
      * Method to be invoked when the response is failed.
-     * <p />
+     * <p>
      * This method takes care of notifying {@link org.eclipse.jetty.client.api.Response.FailureListener}s.
      *
      * @param failure the response failure
@@ -451,9 +452,9 @@
 
     /**
      * Resets this {@link HttpReceiver} state.
-     * <p />
+     * <p>
      * Subclasses should override (but remember to call {@code super}) to reset their own state.
-     * <p />
+     * <p>
      * Either this method or {@link #dispose()} is called.
      */
     protected void reset()
@@ -463,9 +464,9 @@
 
     /**
      * Disposes this {@link HttpReceiver} state.
-     * <p />
+     * <p>
      * Subclasses should override (but remember to call {@code super}) to dispose their own state.
-     * <p />
+     * <p>
      * Either this method or {@link #reset()} is called.
      */
     protected void dispose()
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpRedirector.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpRedirector.java
index a0cac1b..fb00bb0 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpRedirector.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpRedirector.java
@@ -37,7 +37,7 @@
 
 /**
  * Utility class that handles HTTP redirects.
- * <p />
+ * <p>
  * Applications can disable redirection via {@link Request#followRedirects(boolean)}
  * and then rely on this class to perform the redirect in a simpler way, for example:
  * <pre>
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpRequest.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpRequest.java
index 8fe757c..129f59f 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpRequest.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpRequest.java
@@ -503,7 +503,7 @@
                     listener.onContent(response, content);
                     callback.succeeded();
                 }
-                catch (Exception x)
+                catch (Throwable x)
                 {
                     callback.failed(x);
                 }
@@ -737,7 +737,7 @@
         if (value == null)
             return "";
 
-        String encoding = "UTF-8";
+        String encoding = "utf-8";
         try
         {
             return URLEncoder.encode(value, encoding);
@@ -768,7 +768,7 @@
 
     private String urlDecode(String value)
     {
-        String charset = "UTF-8";
+        String charset = "utf-8";
         try
         {
             return URLDecoder.decode(value, charset);
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpRequestException.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpRequestException.java
index 37fcb97..da1c95a 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpRequestException.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpRequestException.java
@@ -20,7 +20,7 @@
 
 import org.eclipse.jetty.client.api.Request;
 
-public class HttpRequestException extends Throwable
+public class HttpRequestException extends RuntimeException
 {
     private final Request request;
 
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpSender.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpSender.java
index be6b761..5417a12 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpSender.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpSender.java
@@ -37,16 +37,16 @@
  * the transport-specific code to send requests over the wire, implementing
  * {@link #sendHeaders(HttpExchange, HttpContent, Callback)} and
  * {@link #sendContent(HttpExchange, HttpContent, Callback)}.
- * <p />
+ * <p>
  * {@link HttpSender} governs two state machines.
- * <p />
+ * <p>
  * The request state machine is updated by {@link HttpSender} as the various steps of sending a request
- * are executed, see {@link RequestState}.
+ * are executed, see <code>RequestState</code>.
  * At any point in time, a user thread may abort the request, which may (if the request has not been
- * completely sent yet) move the request state machine to {@link RequestState#FAILURE}.
+ * completely sent yet) move the request state machine to <code>RequestState#FAILURE</code>.
  * The request state machine guarantees that the request steps are executed (by I/O threads) only if
  * the request has not been failed already.
- * <p />
+ * <p>
  * The sender state machine is updated by {@link HttpSender} from three sources: deferred content notifications
  * (via {@link #onContent()}), 100-continue notifications (via {@link #proceed(HttpExchange, Throwable)})
  * and normal request send (via {@link #sendContent(HttpExchange, HttpContent, Callback)}).
@@ -392,7 +392,7 @@
     /**
      * Implementations should send the HTTP headers over the wire, possibly with some content,
      * in a single write, and notify the given {@code callback} of the result of this operation.
-     * <p />
+     * <p>
      * If there is more content to send, then {@link #sendContent(HttpExchange, HttpContent, Callback)}
      * will be invoked.
      *
@@ -404,11 +404,11 @@
 
     /**
      * Implementations should send the content at the {@link HttpContent} cursor position over the wire.
-     * <p />
+     * <p>
      * The {@link HttpContent} cursor is advanced by {@link HttpSender} at the right time, and if more
      * content needs to be sent, this method is invoked again; subclasses need only to send the content
      * at the {@link HttpContent} cursor position.
-     * <p />
+     * <p>
      * This method is invoked one last time when {@link HttpContent#isConsumed()} is true and therefore
      * there is no actual content to send.
      * This is done to allow subclasses to write "terminal" bytes (such as the terminal chunk when the
@@ -672,6 +672,13 @@
 
     private class CommitCallback implements Callback
     {
+
+        @Override
+        public boolean isNonBlocking()
+        {
+            return content.isNonBlocking();
+        }
+
         @Override
         public void succeeded()
         {
@@ -804,9 +811,9 @@
             while (true)
             {
                 boolean advanced = content.advance();
-                boolean consumed = content.isConsumed();
+                boolean lastContent = content.isLast();
                 if (LOG.isDebugEnabled())
-                    LOG.debug("Content {} consumed {} for {}", advanced, consumed, exchange.getRequest());
+                    LOG.debug("Content present {}, last {}, consumed {} for {}", advanced, lastContent, content.isConsumed(), exchange.getRequest());
 
                 if (advanced)
                 {
@@ -814,7 +821,7 @@
                     return Action.SCHEDULED;
                 }
 
-                if (consumed)
+                if (lastContent)
                 {
                     sendContent(exchange, content, lastCallback);
                     return Action.IDLE;
@@ -883,6 +890,12 @@
     private class LastContentCallback implements Callback
     {
         @Override
+        public boolean isNonBlocking()
+        {
+            return content.isNonBlocking();
+        }
+
+        @Override
         public void succeeded()
         {
             HttpExchange exchange = getHttpExchange();
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/LeakTrackingConnectionPool.java b/jetty-client/src/main/java/org/eclipse/jetty/client/LeakTrackingConnectionPool.java
index da1040e..7762af0 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/LeakTrackingConnectionPool.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/LeakTrackingConnectionPool.java
@@ -20,11 +20,15 @@
 
 import org.eclipse.jetty.client.api.Connection;
 import org.eclipse.jetty.client.api.Destination;
+import org.eclipse.jetty.util.Callback;
 import org.eclipse.jetty.util.LeakDetector;
-import org.eclipse.jetty.util.Promise;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
 
 public class LeakTrackingConnectionPool extends ConnectionPool
 {
+    private static final Logger LOG = Log.getLogger(LeakTrackingConnectionPool.class);
+
     private final LeakDetector<Connection> leakDetector = new LeakDetector<Connection>()
     {
         @Override
@@ -34,9 +38,9 @@
         }
     };
 
-    public LeakTrackingConnectionPool(Destination destination, int maxConnections, Promise<Connection> connectionPromise)
+    public LeakTrackingConnectionPool(Destination destination, int maxConnections, Callback requester)
     {
-        super(destination, maxConnections, connectionPromise);
+        super(destination, maxConnections, requester);
         start();
     }
 
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/MultiplexHttpDestination.java b/jetty-client/src/main/java/org/eclipse/jetty/client/MultiplexHttpDestination.java
index df3f860..a50131f 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/MultiplexHttpDestination.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/MultiplexHttpDestination.java
@@ -35,7 +35,7 @@
     }
 
     @Override
-    protected void send()
+    public void send()
     {
         while (true)
         {
@@ -56,7 +56,7 @@
                 }
                 case CONNECTED:
                 {
-                    if (process(connection, false))
+                    if (process(connection))
                         break;
                     return;
                 }
@@ -76,7 +76,7 @@
         C connection = this.connection = (C)result;
         if (connect.compareAndSet(ConnectState.CONNECTING, ConnectState.CONNECTED))
         {
-            process(connection, true);
+            process(connection);
         }
         else
         {
@@ -89,9 +89,10 @@
     public void failed(Throwable x)
     {
         connect.set(ConnectState.DISCONNECTED);
+        abort(x);
     }
 
-    protected boolean process(final C connection, boolean dispatch)
+    protected boolean process(final C connection)
     {
         HttpClient client = getHttpClient();
         final HttpExchange exchange = getHttpExchanges().poll();
@@ -113,21 +114,7 @@
         }
         else
         {
-            if (dispatch)
-            {
-                client.getExecutor().execute(new Runnable()
-                {
-                    @Override
-                    public void run()
-                    {
-                        send(connection, exchange);
-                    }
-                });
-            }
-            else
-            {
-                send(connection, exchange);
-            }
+            send(connection, exchange);
         }
         return true;
     }
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/PoolingHttpDestination.java b/jetty-client/src/main/java/org/eclipse/jetty/client/PoolingHttpDestination.java
index 6bbca21..3c4e73b 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/PoolingHttpDestination.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/PoolingHttpDestination.java
@@ -19,70 +19,82 @@
 package org.eclipse.jetty.client;
 
 import java.io.IOException;
-import java.util.Arrays;
+import java.util.Collections;
 
 import org.eclipse.jetty.client.api.Connection;
 import org.eclipse.jetty.client.api.Request;
-import org.eclipse.jetty.util.Promise;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.annotation.ManagedAttribute;
+import org.eclipse.jetty.util.annotation.ManagedObject;
 import org.eclipse.jetty.util.component.ContainerLifeCycle;
 import org.eclipse.jetty.util.thread.Sweeper;
 
-public abstract class PoolingHttpDestination<C extends Connection> extends HttpDestination implements Promise<Connection>
+@ManagedObject
+public abstract class PoolingHttpDestination<C extends Connection> extends HttpDestination implements Callback
 {
-    private final ConnectionPool connectionPool;
+    private DuplexConnectionPool connectionPool;
 
     public PoolingHttpDestination(HttpClient client, Origin origin)
     {
         super(client, origin);
         this.connectionPool = newConnectionPool(client);
+        addBean(connectionPool);
         Sweeper sweeper = client.getBean(Sweeper.class);
         if (sweeper != null)
             sweeper.offer(connectionPool);
     }
 
-    protected ConnectionPool newConnectionPool(HttpClient client)
+    @Override
+    protected void doStart() throws Exception
     {
-        return new ConnectionPool(this, client.getMaxConnectionsPerDestination(), this);
+        HttpClient client = getHttpClient();
+        this.connectionPool = newConnectionPool(client);
+        addBean(connectionPool);
+        super.doStart();
+        Sweeper sweeper = client.getBean(Sweeper.class);
+        if (sweeper != null)
+            sweeper.offer(connectionPool);
     }
 
-    public ConnectionPool getConnectionPool()
+    @Override
+    protected void doStop() throws Exception
+    {
+        HttpClient client = getHttpClient();
+        Sweeper sweeper = client.getBean(Sweeper.class);
+        if (sweeper != null)
+            sweeper.remove(connectionPool);
+        super.doStop();
+        removeBean(connectionPool);
+    }
+
+    protected DuplexConnectionPool newConnectionPool(HttpClient client)
+    {
+        return new DuplexConnectionPool(this, client.getMaxConnectionsPerDestination(), this);
+    }
+
+    @ManagedAttribute(value = "The connection pool", readonly = true)
+    public DuplexConnectionPool getConnectionPool()
     {
         return connectionPool;
     }
 
     @Override
-    @SuppressWarnings("unchecked")
-    public void succeeded(Connection connection)
+    public void succeeded()
     {
-        send(true);
+        send();
     }
 
     @Override
     public void failed(final Throwable x)
     {
-        getHttpClient().getExecutor().execute(new Runnable()
-        {
-            @Override
-            public void run()
-            {
-                abort(x);
-            }
-        });
+        abort(x);
     }
 
-    @Override
-    protected void send()
-    {
-        send(false);
-    }
-
-    private void send(boolean dispatch)
+    public void send()
     {
         if (getHttpExchanges().isEmpty())
             return;
-        C connection = acquire();
-        if (connection != null)
-            process(connection, dispatch);
+        process();
     }
 
     @SuppressWarnings("unchecked")
@@ -91,6 +103,13 @@
         return (C)connectionPool.acquire();
     }
 
+    private void process()
+    {
+        C connection = acquire();
+        if (connection != null)
+            process(connection);
+    }
+
     /**
      * <p>Processes a new connection making it idle or active depending on whether requests are waiting to be sent.</p>
      * <p>A new connection is created when a request needs to be executed; it is possible that the request that
@@ -99,9 +118,8 @@
      * <p>If a request is waiting to be executed, it will be dequeued and executed by the new connection.</p>
      *
      * @param connection the new connection
-     * @param dispatch whether to dispatch the processing to another thread
      */
-    public void process(final C connection, boolean dispatch)
+    public void process(final C connection)
     {
         HttpClient client = getHttpClient();
         final HttpExchange exchange = getHttpExchanges().poll();
@@ -134,21 +152,7 @@
             }
             else
             {
-                if (dispatch)
-                {
-                    client.getExecutor().execute(new Runnable()
-                    {
-                        @Override
-                        public void run()
-                        {
-                            send(connection, exchange);
-                        }
-                    });
-                }
-                else
-                {
-                    send(connection, exchange);
-                }
+                send(connection, exchange);
             }
         }
     }
@@ -161,18 +165,21 @@
         @SuppressWarnings("unchecked")
         C connection = (C)c;
         if (LOG.isDebugEnabled())
-            LOG.debug("{} released", connection);
+            LOG.debug("Released {}", connection);
         HttpClient client = getHttpClient();
         if (client.isRunning())
         {
             if (connectionPool.isActive(connection))
             {
-                process(connection, false);
+                if (connectionPool.release(connection))
+                    send();
+                else
+                    connection.close();
             }
             else
             {
                 if (LOG.isDebugEnabled())
-                    LOG.debug("{} explicit", connection);
+                    LOG.debug("Released explicit {}", connection);
             }
         }
         else
@@ -184,11 +191,11 @@
     }
 
     @Override
-    public void close(Connection oldConnection)
+    public void close(Connection connection)
     {
-        super.close(oldConnection);
+        super.close(connection);
 
-        connectionPool.remove(oldConnection);
+        boolean removed = connectionPool.remove(connection);
 
         if (getHttpExchanges().isEmpty())
         {
@@ -208,9 +215,8 @@
             // We need to execute queued requests even if this connection failed.
             // We may create a connection that is not needed, but it will eventually
             // idle timeout, so no worries.
-            C newConnection = acquire();
-            if (newConnection != null)
-                process(newConnection, false);
+            if (removed)
+                process();
         }
     }
 
@@ -224,7 +230,7 @@
     public void dump(Appendable out, String indent) throws IOException
     {
         super.dump(out, indent);
-        ContainerLifeCycle.dump(out, indent, Arrays.asList(connectionPool));
+        ContainerLifeCycle.dump(out, indent, Collections.singletonList(connectionPool));
     }
 
     @Override
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/ProtocolHandler.java b/jetty-client/src/main/java/org/eclipse/jetty/client/ProtocolHandler.java
index a74e657..3f347b2 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/ProtocolHandler.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/ProtocolHandler.java
@@ -21,9 +21,38 @@
 import org.eclipse.jetty.client.api.Request;
 import org.eclipse.jetty.client.api.Response;
 
+/**
+ * <p>A protocol handler performs HTTP protocol operations on
+ * behalf of the application, typically like a browser would.</p>
+ * <p>A typical example is handling HTTP redirects. {@link HttpClient}
+ * could just return the redirect response to the application,
+ * but the application would have to implement the redirect
+ * functionality (while browsers do this automatically).</p>
+ */
 public interface ProtocolHandler
 {
+    /**
+     * @return a unique name among protocol handlers
+     */
+    public String getName();
+
+    /**
+     * <p>Inspects the given {@code request} and {@code response}
+     * to detect whether this protocol handler should handle them.</p>
+     * <p>For example, a redirect protocol handler can inspect the
+     * response code and return true if it is a redirect response code.</p>
+     * <p>This method is being called just after the response line has
+     * been parsed, and before the response headers are available.</p>
+     *
+     * @param request  the request to accept
+     * @param response the response to accept
+     * @return true if this protocol handler can handle the given request and response
+     */
     public boolean accept(Request request, Response response);
 
+    /**
+     * @return a response listener that will handle the request and response
+     * on behalf of the application.
+     */
     public Response.Listener getResponseListener();
 }
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/ProtocolHandlers.java b/jetty-client/src/main/java/org/eclipse/jetty/client/ProtocolHandlers.java
new file mode 100644
index 0000000..d068651
--- /dev/null
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/ProtocolHandlers.java
@@ -0,0 +1,94 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.client;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.eclipse.jetty.client.api.Request;
+import org.eclipse.jetty.client.api.Response;
+
+/**
+ * <p>A container for {@link ProtocolHandler}s accessible from {@link HttpClient#getProtocolHandlers()}.</p>
+ */
+public class ProtocolHandlers
+{
+    private final Map<String, ProtocolHandler> handlers = new LinkedHashMap<>();
+
+    protected ProtocolHandlers()
+    {
+    }
+
+    /**
+     * <p>Stores the given {@code protocolHandler} in this container.</p>
+     * <p>If a protocol handler with the same name exists, it is
+     * replaced by the given one, and the existing returned.</p>
+     *
+     * @param protocolHandler the protocol handler to store
+     * @return the existing protocol handler with the same name,
+     * or null if no protocol handler with that name was already stored
+     * @see #remove(String)
+     */
+    public ProtocolHandler put(ProtocolHandler protocolHandler)
+    {
+        return handlers.put(protocolHandler.getName(), protocolHandler);
+    }
+
+    /**
+     * <p>Removes the protocol handler with the given name.</p>
+     *
+     * @param name the name of the protocol handler to remove
+     * @return the removed protocol handler, or null if no
+     * protocol handler with that name was already stored
+     * @see #put(ProtocolHandler)
+     * @see #clear()
+     */
+    public ProtocolHandler remove(String name)
+    {
+        return handlers.remove(name);
+    }
+
+    /**
+     * <p>Removes all protocol handlers from this container.</p>
+     */
+    public void clear()
+    {
+        handlers.clear();
+    }
+
+    /**
+     * <p>Finds the first protocol handler that
+     * {@link ProtocolHandler#accept(Request, Response) accepts}
+     * the given request and response.</p>
+     *
+     * @param request  the request to accept
+     * @param response the response to accept
+     * @return the protocol handler that accepted the request and response,
+     * or null if none of the protocol handlers accepted the request and response
+     */
+    public ProtocolHandler find(Request request, Response response)
+    {
+        for (ProtocolHandler handler : handlers.values())
+        {
+            if (handler.accept(request, response))
+                return handler;
+        }
+        return null;
+    }
+}
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/ProxyAuthenticationProtocolHandler.java b/jetty-client/src/main/java/org/eclipse/jetty/client/ProxyAuthenticationProtocolHandler.java
index 64491b2..059bc0f 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/ProxyAuthenticationProtocolHandler.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/ProxyAuthenticationProtocolHandler.java
@@ -25,8 +25,16 @@
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpStatus;
 
+/**
+ * <p>A protocol handler that handles the 401 response code
+ * in association with the {@code Proxy-Authenticate} header.</p>
+ *
+ * @see WWWAuthenticationProtocolHandler
+ */
 public class ProxyAuthenticationProtocolHandler extends AuthenticationProtocolHandler
 {
+    public static final String NAME = "proxy-authenticate";
+
     public ProxyAuthenticationProtocolHandler(HttpClient client)
     {
         this(client, DEFAULT_MAX_CONTENT_LENGTH);
@@ -38,6 +46,12 @@
     }
 
     @Override
+    public String getName()
+    {
+        return NAME;
+    }
+
+    @Override
     public boolean accept(Request request, Response response)
     {
         return response.getStatus() == HttpStatus.PROXY_AUTHENTICATION_REQUIRED_407;
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/ProxyConfiguration.java b/jetty-client/src/main/java/org/eclipse/jetty/client/ProxyConfiguration.java
index d1b6267..81de2e0 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/ProxyConfiguration.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/ProxyConfiguration.java
@@ -28,7 +28,7 @@
 
 /**
  * The configuration of the forward proxy to use with {@link org.eclipse.jetty.client.HttpClient}.
- * <p />
+ * <p>
  * Applications add subclasses of {@link Proxy} to this configuration via:
  * <pre>
  * ProxyConfiguration proxyConfig = httpClient.getProxyConfiguration();
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/RedirectProtocolHandler.java b/jetty-client/src/main/java/org/eclipse/jetty/client/RedirectProtocolHandler.java
index 8ed88bf..8be72da 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/RedirectProtocolHandler.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/RedirectProtocolHandler.java
@@ -22,8 +22,13 @@
 import org.eclipse.jetty.client.api.Response;
 import org.eclipse.jetty.client.api.Result;
 
+/**
+ * <p>A protocol handler that handles redirect status codes 301, 302, 303, 307 and 308.</p>
+ */
 public class RedirectProtocolHandler extends Response.Listener.Adapter implements ProtocolHandler
 {
+    public static final String NAME = "redirect";
+
     private final HttpRedirector redirector;
 
     public RedirectProtocolHandler(HttpClient client)
@@ -32,6 +37,12 @@
     }
 
     @Override
+    public String getName()
+    {
+        return NAME;
+    }
+
+    @Override
     public boolean accept(Request request, Response response)
     {
         return redirector.isRedirect(response) && request.isFollowRedirects();
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/Socks4Proxy.java b/jetty-client/src/main/java/org/eclipse/jetty/client/Socks4Proxy.java
index 456e444..58ac5cc 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/Socks4Proxy.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/Socks4Proxy.java
@@ -198,10 +198,10 @@
                 ClientConnectionFactory connectionFactory = this.connectionFactory;
                 if (HttpScheme.HTTPS.is(destination.getScheme()))
                     connectionFactory = new SslClientConnectionFactory(client.getSslContextFactory(), client.getByteBufferPool(), client.getExecutor(), connectionFactory);
-                org.eclipse.jetty.io.Connection connection = connectionFactory.newConnection(getEndPoint(), context);
-                ClientConnectionFactory.Helper.replaceConnection(this, connection);
+                org.eclipse.jetty.io.Connection newConnection = connectionFactory.newConnection(getEndPoint(), context);
+                getEndPoint().upgrade(newConnection);
                 if (LOG.isDebugEnabled())
-                    LOG.debug("SOCKS4 tunnel established: {} over {}", this, connection);
+                    LOG.debug("SOCKS4 tunnel established: {} over {}", this, newConnection);
             }
             catch (Throwable x)
             {
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/ValidatingConnectionPool.java b/jetty-client/src/main/java/org/eclipse/jetty/client/ValidatingConnectionPool.java
new file mode 100644
index 0000000..2235f75
--- /dev/null
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/ValidatingConnectionPool.java
@@ -0,0 +1,209 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.client;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.eclipse.jetty.client.api.Connection;
+import org.eclipse.jetty.client.api.Destination;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.annotation.ManagedAttribute;
+import org.eclipse.jetty.util.component.ContainerLifeCycle;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.Scheduler;
+
+/**
+ * <p>A connection pool that validates connections before
+ * making them available for use.</p>
+ * <p>Connections that have just been opened are not validated.
+ * Connections that are {@link #release(Connection) released} will
+ * be validated.</p>
+ * <p>Validation by reading from the EndPoint is not reliable,
+ * since the TCP FIN may arrive just after the validation read.</p>
+ * <p>This class validates connections by putting them in a
+ * "quarantine" for a configurable timeout, where they cannot
+ * be used to send requests. When the timeout expires, the
+ * quarantined connection is made idle and therefore available
+ * to send requests.</p>
+ * <p>The existing HttpClient mechanism to detect server closes
+ * will trigger and close quarantined connections, before they
+ * are made idle (and reusable) again.</p>
+ * <p>There still is a small chance that the timeout expires,
+ * the connection is made idle and available again, it is used
+ * to send a request exactly when the server decides to close.
+ * This case is however unavoidable and may be mitigated by
+ * tuning the idle timeout of the servers to be larger than
+ * that of the client.</p>
+ */
+public class ValidatingConnectionPool extends ConnectionPool
+{
+    private static final Logger LOG = Log.getLogger(ValidatingConnectionPool.class);
+
+    private final Scheduler scheduler;
+    private final long timeout;
+    private final Map<Connection, Holder> quarantine;
+
+    public ValidatingConnectionPool(Destination destination, int maxConnections, Callback requester, Scheduler scheduler, long timeout)
+    {
+        super(destination, maxConnections, requester);
+        this.scheduler = scheduler;
+        this.timeout = timeout;
+        this.quarantine = new HashMap<>(maxConnections);
+    }
+
+    @ManagedAttribute(value = "The number of validating connections", readonly = true)
+    public int getValidatingConnectionCount()
+    {
+        return quarantine.size();
+    }
+
+    @Override
+    public boolean release(Connection connection)
+    {
+        lock();
+        try
+        {
+            if (!getActiveConnections().remove(connection))
+                return false;
+            Holder holder = new Holder(connection);
+            holder.task = scheduler.schedule(holder, timeout, TimeUnit.MILLISECONDS);
+            quarantine.put(connection, holder);
+            if (LOG.isDebugEnabled())
+                LOG.debug("Validating for {}ms {}", timeout, connection);
+        }
+        finally
+        {
+            unlock();
+        }
+
+        released(connection);
+        return true;
+    }
+
+    @Override
+    public boolean remove(Connection connection)
+    {
+        Holder holder;
+        lock();
+        try
+        {
+            holder = quarantine.remove(connection);
+        }
+        finally
+        {
+            unlock();
+        }
+
+        if (holder == null)
+            return super.remove(connection);
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("Removed while validating {}", connection);
+
+        boolean cancelled = holder.cancel();
+        if (cancelled)
+            return remove(connection, true);
+
+        return super.remove(connection);
+    }
+
+    @Override
+    public void dump(Appendable out, String indent) throws IOException
+    {
+        super.dump(out, indent);
+        ContainerLifeCycle.dump(out, indent, quarantine.values());
+    }
+
+    @Override
+    public String toString()
+    {
+        int size;
+        lock();
+        try
+        {
+            size = quarantine.size();
+        }
+        finally
+        {
+            unlock();
+        }
+        return String.format("%s[v=%d]", super.toString(), size);
+    }
+
+    private class Holder implements Runnable
+    {
+        private final long timestamp = System.nanoTime();
+        private final AtomicBoolean latch = new AtomicBoolean();
+        private final Connection connection;
+        public Scheduler.Task task;
+
+        public Holder(Connection connection)
+        {
+            this.connection = connection;
+        }
+
+        @Override
+        public void run()
+        {
+            if (latch.compareAndSet(false, true))
+            {
+                boolean idle;
+                lock();
+                try
+                {
+                    quarantine.remove(connection);
+                    idle = offerIdle(connection);
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Validated {}", connection);
+                }
+                finally
+                {
+                    unlock();
+                }
+
+                if (idle(connection, idle))
+                    proceed();
+            }
+        }
+
+        public boolean cancel()
+        {
+            if (latch.compareAndSet(false, true))
+            {
+                task.cancel();
+                return true;
+            }
+            return false;
+        }
+
+        @Override
+        public String toString()
+        {
+            return String.format("%s[validationLeft=%dms]",
+                    connection,
+                    timeout - TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - timestamp)
+            );
+        }
+    }
+}
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/WWWAuthenticationProtocolHandler.java b/jetty-client/src/main/java/org/eclipse/jetty/client/WWWAuthenticationProtocolHandler.java
index 4bc6258..1ff41a3 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/WWWAuthenticationProtocolHandler.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/WWWAuthenticationProtocolHandler.java
@@ -25,8 +25,16 @@
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpStatus;
 
+/**
+ * <p>A protocol handler that handles the 401 response code
+ * in association with the {@code WWW-Authenticate} header.</p>
+ *
+ * @see ProxyAuthenticationProtocolHandler
+ */
 public class WWWAuthenticationProtocolHandler extends AuthenticationProtocolHandler
 {
+    public static final String NAME = "www-authenticate";
+
     public WWWAuthenticationProtocolHandler(HttpClient client)
     {
         this(client, DEFAULT_MAX_CONTENT_LENGTH);
@@ -38,6 +46,12 @@
     }
 
     @Override
+    public String getName()
+    {
+        return NAME;
+    }
+
+    @Override
     public boolean accept(Request request, Response response)
     {
         return response.getStatus() == HttpStatus.UNAUTHORIZED_401;
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/api/Authentication.java b/jetty-client/src/main/java/org/eclipse/jetty/client/api/Authentication.java
index 48323a2..6260704 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/api/Authentication.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/api/Authentication.java
@@ -25,12 +25,12 @@
 
 /**
  * {@link Authentication} represents a mechanism to authenticate requests for protected resources.
- * <p />
+ * <p>
  * {@link Authentication}s are added to an {@link AuthenticationStore}, which is then
  * {@link #matches(String, URI, String) queried} to find the right
  * {@link Authentication} mechanism to use based on its type, URI and realm, as returned by
  * {@code WWW-Authenticate} response headers.
- * <p />
+ * <p>
  * If an {@link Authentication} mechanism is found, it is then
  * {@link #authenticate(Request, ContentResponse, HeaderInfo, Attributes) executed} for the given request,
  * returning an {@link Authentication.Result}, which is then stored in the {@link AuthenticationStore}
@@ -49,8 +49,8 @@
 
     /**
      * Executes the authentication mechanism for the given request, returning a {@link Result} that can be
-     * used to actually authenticate the request via {@link Result#apply(Request)}.
-     * <p />
+     * used to actually authenticate the request via {@link org.eclipse.jetty.client.api.Authentication.Result#apply(Request)}.
+     * <p>
      * If a request for {@code "/secure"} returns a {@link Result}, then the result may be used for other
      * requests such as {@code "/secure/foo"} or {@code "/secure/bar"}, unless those resources are protected
      * by other realms.
@@ -117,7 +117,7 @@
     }
 
     /**
-     * {@link Result} holds the information needed to authenticate a {@link Request} via {@link #apply(Request)}.
+     * {@link Result} holds the information needed to authenticate a {@link Request} via {@link org.eclipse.jetty.client.api.Authentication.Result#apply(org.eclipse.jetty.client.api.Request)}.
      */
     public static interface Result
     {
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/api/Connection.java b/jetty-client/src/main/java/org/eclipse/jetty/client/api/Connection.java
index 0242de5..f885aee 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/api/Connection.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/api/Connection.java
@@ -20,10 +20,12 @@
 
 import java.io.Closeable;
 
+import org.eclipse.jetty.util.Promise;
+
 /**
  * {@link Connection} represent a connection to a {@link Destination} and allow applications to send
  * requests via {@link #send(Request, Response.CompleteListener)}.
- * <p />
+ * <p>
  * {@link Connection}s are normally pooled by {@link Destination}s, but unpooled {@link Connection}s
  * may be created by applications that want to do their own connection management via
  * {@link Destination#newConnection(Promise)} and {@link Connection#close()}.
@@ -32,7 +34,7 @@
 {
     /**
      * Sends a request with an associated response listener.
-     * <p />
+     * <p>
      * {@link Request#send(Response.CompleteListener)} will eventually call this method to send the request.
      * It is exposed to allow applications to send requests via unpooled connections.
      *
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/api/ContentProvider.java b/jetty-client/src/main/java/org/eclipse/jetty/client/api/ContentProvider.java
index 6658cb3..04d1e54 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/api/ContentProvider.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/api/ContentProvider.java
@@ -18,19 +18,28 @@
 
 package org.eclipse.jetty.client.api;
 
+import java.io.Closeable;
 import java.nio.ByteBuffer;
+import java.util.Iterator;
+
+import org.eclipse.jetty.client.util.ByteBufferContentProvider;
+import org.eclipse.jetty.client.util.PathContentProvider;
 
 /**
- * {@link ContentProvider} provides a source of request content.
- * <p/>
- * Implementations should return an {@link Iterator} over the request content.
+ * <p>{@link ContentProvider} provides a source of request content.</p>
+ * <p>Implementations should return an {@link Iterator} over the request content.
  * If the request content comes from a source that needs to be closed (for
- * example, an {@link InputStream}), then the iterator implementation class
+ * example, an {@link java.io.InputStream}), then the iterator implementation class
  * must implement {@link Closeable} and will be closed when the request is
- * completed (either successfully or failed).
- * <p/>
- * Applications should rely on utility classes such as {@link ByteBufferContentProvider}
- * or {@link PathContentProvider}.
+ * completed (either successfully or failed).</p>
+ * <p>Applications should rely on utility classes such as {@link ByteBufferContentProvider}
+ * or {@link PathContentProvider}.</p>
+ * <p>{@link ContentProvider} provides a {@link #getLength() length} of the content
+ * it represents.
+ * If the length is positive, it typically overrides any {@code Content-Length}
+ * header set by applications; if the length is negative, it typically removes
+ * any {@code Content-Length} header set by applications, resulting in chunked
+ * content (i.e. {@code Transfer-Encoding: chunked}) being sent to the server.</p>
  */
 public interface ContentProvider extends Iterable<ByteBuffer>
 {
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/api/Destination.java b/jetty-client/src/main/java/org/eclipse/jetty/client/api/Destination.java
index a68b124..4dabbdc 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/api/Destination.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/api/Destination.java
@@ -18,15 +18,17 @@
 
 package org.eclipse.jetty.client.api;
 
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.util.FuturePromise;
 import org.eclipse.jetty.util.Promise;
 
 /**
  * {@link Destination} represents the triple made of the {@link #getScheme}, the {@link #getHost}
  * and the {@link #getPort}.
- * <p />
+ * <p>
  * {@link Destination} holds a pool of {@link Connection}s, but allows to create unpooled
  * connections if the application wants full control over connection management via {@link #newConnection(Promise)}.
- * <p />
+ * <p>
  * {@link Destination}s may be obtained via {@link HttpClient#getDestination(String, String, int)}
  */
 public interface Destination
@@ -49,7 +51,7 @@
     /**
      * Creates asynchronously a new, unpooled, {@link Connection} that will be returned
      * at a later time through the given {@link Promise}.
-     * <p />
+     * <p>
      * Use {@link FuturePromise} to wait for the connection:
      * <pre>
      * Destination destination = ...;
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/api/Request.java b/jetty-client/src/main/java/org/eclipse/jetty/client/api/Request.java
index 9721712..01f0c2c 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/api/Request.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/api/Request.java
@@ -21,6 +21,7 @@
 import java.io.IOException;
 import java.net.HttpCookie;
 import java.net.URI;
+import java.net.URLEncoder;
 import java.nio.ByteBuffer;
 import java.nio.file.Path;
 import java.util.EventListener;
@@ -30,6 +31,8 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.util.InputStreamResponseListener;
 import org.eclipse.jetty.http.HttpFields;
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpMethod;
@@ -202,6 +205,7 @@
 
     /**
      * @param content the content provider of this request
+     * @param contentType the content type
      * @return this request object
      */
     Request content(ContentProvider content, String contentType);
@@ -282,6 +286,7 @@
     /**
      * @param listenerClass the class of the listener, or null for all listeners classes
      * @return the listeners for request events of the given class
+     * @param <T> the type of listener class
      */
     <T extends RequestListener> List<T> getRequestListeners(Class<T> listenerClass);
 
@@ -383,17 +388,20 @@
 
     /**
      * Sends this request and returns the response.
-     * <p />
+     * <p>
      * This method should be used when a simple blocking semantic is needed, and when it is known
      * that the response content can be buffered without exceeding memory constraints.
-     * <p />
+     * <p>
      * For example, this method is not appropriate to download big files from a server; consider using
      * {@link #send(Response.CompleteListener)} instead, passing your own {@link Response.Listener} or a utility
      * listener such as {@link InputStreamResponseListener}.
-     * <p />
+     * <p>
      * The method returns when the {@link Response.CompleteListener complete event} is fired.
      *
      * @return a {@link ContentResponse} for this request
+     * @throws InterruptedException if send thread is interrupted
+     * @throws TimeoutException if send times out
+     * @throws ExecutionException if execution fails
      * @see Response.CompleteListener#onComplete(Result)
      */
     ContentResponse send() throws InterruptedException, TimeoutException, ExecutionException;
@@ -495,6 +503,7 @@
          * Callback method invoked when a chunk of request content has been sent successfully.
          * Changes to bytes in the given buffer have no effect, as the content has already been sent.
          * @param request the request that has been committed
+         * @param content the content
          */
         public void onContent(Request request, ByteBuffer content);
     }
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/api/Response.java b/jetty-client/src/main/java/org/eclipse/jetty/client/api/Response.java
index f1d933c..7214045 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/api/Response.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/api/Response.java
@@ -22,6 +22,7 @@
 import java.util.EventListener;
 import java.util.List;
 
+import org.eclipse.jetty.client.util.BufferingResponseListener;
 import org.eclipse.jetty.http.HttpField;
 import org.eclipse.jetty.http.HttpFields;
 import org.eclipse.jetty.http.HttpVersion;
@@ -45,7 +46,9 @@
     Request getRequest();
 
     /**
-     * @return the response listener passed to {@link Request#send(CompleteListener)}
+     * @param listenerClass the listener class
+     * @return the response listener passed to {@link org.eclipse.jetty.client.api.Request#send(org.eclipse.jetty.client.api.Response.CompleteListener)}
+     * @param <T> the type of class
      */
     <T extends ResponseListener> List<T> getListeners(Class<T> listenerClass);
 
@@ -92,7 +95,7 @@
         /**
          * Callback method invoked when the response line containing HTTP version,
          * HTTP status code and reason has been received and parsed.
-         * <p />
+         * <p>
          * This method is the best approximation to detect when the first bytes of the response arrived to the client.
          *
          * @param response the response containing the response line data
@@ -192,9 +195,9 @@
         /**
          * Callback method invoked when the request <em><b>and</b></em> the response have been processed,
          * either successfully or not.
-         * <p/>
+         * <p>
          * The {@code result} parameter contains the request, the response, and eventual failures.
-         * <p/>
+         * <p>
          * Requests may complete <em>after</em> response, for example in case of big uploads that are
          * discarded or read asynchronously by the server.
          * This method is always invoked <em>after</em> {@link SuccessListener#onSuccess(Response)} or
@@ -245,7 +248,7 @@
                     onContent(response, content);
                     callback.succeeded();
                 }
-                catch (Exception x)
+                catch (Throwable x)
                 {
                     callback.failed(x);
                 }
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpChannelOverHTTP.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpChannelOverHTTP.java
index 6578c44..a204cf3 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpChannelOverHTTP.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpChannelOverHTTP.java
@@ -27,6 +27,7 @@
 import org.eclipse.jetty.http.HttpFields;
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpHeaderValue;
+import org.eclipse.jetty.http.HttpMethod;
 import org.eclipse.jetty.http.HttpVersion;
 
 public class HttpChannelOverHTTP extends HttpChannel
@@ -96,26 +97,42 @@
 
         Response response = result.getResponse();
         HttpFields responseHeaders = response.getHeaders();
-        boolean close = result.isFailed() || receiver.isShutdown();
 
-        if (!close)
+        String closeReason = null;
+        if (result.isFailed())
+            closeReason = "failure";
+        else if (receiver.isShutdown())
+            closeReason = "server close";
+
+        if (closeReason == null)
         {
             if (response.getVersion().compareTo(HttpVersion.HTTP_1_1) < 0)
             {
-                // HTTP 1.0 must close the connection unless it has an explicit keep alive.
-                close = !responseHeaders.contains(HttpHeader.CONNECTION, HttpHeaderValue.KEEP_ALIVE.asString());
+                // HTTP 1.0 must close the connection unless it has
+                // an explicit keep alive or it's a CONNECT method.
+                boolean keepAlive = responseHeaders.contains(HttpHeader.CONNECTION, HttpHeaderValue.KEEP_ALIVE.asString());
+                boolean connect = HttpMethod.CONNECT.is(exchange.getRequest().getMethod());
+                if (!keepAlive && !connect)
+                    closeReason = "http/1.0";
             }
             else
             {
                 // HTTP 1.1 or greater closes only if it has an explicit close.
-                close = responseHeaders.contains(HttpHeader.CONNECTION, HttpHeaderValue.CLOSE.asString());
+                if (responseHeaders.contains(HttpHeader.CONNECTION, HttpHeaderValue.CLOSE.asString()))
+                    closeReason = "http/1.1";
             }
         }
 
-        if (close)
+        if (closeReason != null)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Closing, reason: {} - {}", closeReason, connection);
             connection.close();
+        }
         else
+        {
             release();
+        }
     }
 
     @Override
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpClientTransportOverHTTP.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpClientTransportOverHTTP.java
index e45d78d..873fa6e 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpClientTransportOverHTTP.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpClientTransportOverHTTP.java
@@ -27,7 +27,9 @@
 import org.eclipse.jetty.client.api.Connection;
 import org.eclipse.jetty.io.EndPoint;
 import org.eclipse.jetty.util.Promise;
+import org.eclipse.jetty.util.annotation.ManagedObject;
 
+@ManagedObject("The HTTP/1.1 client transport")
 public class HttpClientTransportOverHTTP extends AbstractHttpClientTransport
 {
     public HttpClientTransportOverHTTP()
@@ -62,13 +64,4 @@
     {
         return new HttpConnectionOverHTTP(endPoint, destination, promise);
     }
-
-    /**
-     * @deprecated use {@link #newHttpConnection(EndPoint, HttpDestination, Promise)} instead
-     */
-    @Deprecated
-    protected HttpConnectionOverHTTP newHttpConnection(EndPoint endPoint, HttpDestination destination)
-    {
-        throw new UnsupportedOperationException("Deprecated, override newHttpConnection(EndPoint, HttpDestination, Promise<Connection>) instead");
-    }
 }
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionOverHTTP.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionOverHTTP.java
index d4f350b..8108e54 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionOverHTTP.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpConnectionOverHTTP.java
@@ -47,19 +47,9 @@
     private final HttpChannelOverHTTP channel;
     private long idleTimeout;
 
-    /**
-     * @deprecated use {@link #HttpConnectionOverHTTP(EndPoint, HttpDestination, Promise)} instead
-     */
-    @Deprecated
-    public HttpConnectionOverHTTP(EndPoint endPoint, HttpDestination destination)
-    {
-        this(endPoint, destination, new Promise.Adapter<Connection>());
-        throw new UnsupportedOperationException("Deprecated, use HttpConnectionOverHTTP(EndPoint, HttpDestination, Promise<Connection>) instead");
-    }
-
     public HttpConnectionOverHTTP(EndPoint endPoint, HttpDestination destination, Promise<Connection> promise)
     {
-        super(endPoint, destination.getHttpClient().getExecutor(), destination.getHttpClient().isDispatchIO());
+        super(endPoint, destination.getHttpClient().getExecutor());
         this.promise = promise;
         this.delegate = new Delegate(destination);
         this.channel = newHttpChannel();
@@ -108,7 +98,7 @@
     protected boolean onReadTimeout()
     {
         if (LOG.isDebugEnabled())
-            LOG.debug("{} idle timeout", this);
+            LOG.debug("Idle timeout {}", this);
         close(new TimeoutException());
         return false;
     }
@@ -151,10 +141,10 @@
             getHttpDestination().close(this);
             getEndPoint().shutdownOutput();
             if (LOG.isDebugEnabled())
-                LOG.debug("{} oshut", this);
+                LOG.debug("Shutdown {}", this);
             getEndPoint().close();
             if (LOG.isDebugEnabled())
-                LOG.debug("{} closed", this);
+                LOG.debug("Closed {}", this);
 
             abort(failure);
         }
@@ -176,10 +166,8 @@
     {
         if (!closed.get())
             return false;
-
         if (sweeps.incrementAndGet() < 4)
             return false;
-
         return true;
     }
 
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java
index d4d0378..c957249 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java
@@ -35,7 +35,7 @@
 import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.util.CompletableCallback;
 
-public class HttpReceiverOverHTTP extends HttpReceiver implements HttpParser.ResponseHandler<ByteBuffer>
+public class HttpReceiverOverHTTP extends HttpReceiver implements HttpParser.ResponseHandler
 {
     private final HttpParser parser = new HttpParser(this);
     private ByteBuffer buffer;
@@ -96,11 +96,13 @@
             EndPoint endPoint = connection.getEndPoint();
             while (true)
             {
-                // Connection may be closed in a parser callback.
-                if (connection.isClosed())
+                boolean upgraded = connection != endPoint.getConnection();
+
+                // Connection may be closed or upgraded in a parser callback.
+                if (connection.isClosed() || upgraded)
                 {
                     if (LOG.isDebugEnabled())
-                        LOG.debug("{} closed", connection);
+                        LOG.debug("{} {}", connection, upgraded ? "upgraded" : "closed");
                     releaseBuffer();
                     return;
                 }
@@ -210,14 +212,11 @@
     }
 
     @Override
-    public boolean parsedHeader(HttpField field)
+    public void parsedHeader(HttpField field)
     {
         HttpExchange exchange = getHttpExchange();
-        if (exchange == null)
-            return false;
-
-        responseHeader(exchange, field);
-        return false;
+        if (exchange != null)
+            responseHeader(exchange, field);
     }
 
     @Override
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpSenderOverHTTP.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpSenderOverHTTP.java
index dac4962..80e762f 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpSenderOverHTTP.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpSenderOverHTTP.java
@@ -28,9 +28,12 @@
 import org.eclipse.jetty.client.api.ContentProvider;
 import org.eclipse.jetty.client.api.Request;
 import org.eclipse.jetty.http.HttpGenerator;
+import org.eclipse.jetty.http.HttpURI;
+import org.eclipse.jetty.http.MetaData;
 import org.eclipse.jetty.io.ByteBufferPool;
 import org.eclipse.jetty.io.EndPoint;
 import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.IteratingCallback;
 
 public class HttpSenderOverHTTP extends HttpSender
 {
@@ -50,77 +53,9 @@
     @Override
     protected void sendHeaders(HttpExchange exchange, HttpContent content, Callback callback)
     {
-        Request request = exchange.getRequest();
-        ContentProvider requestContent = request.getContent();
-        long contentLength = requestContent == null ? -1 : requestContent.getLength();
-        String path = request.getPath();
-        String query = request.getQuery();
-        if (query != null)
-            path += "?" + query;
-        HttpGenerator.RequestInfo requestInfo = new HttpGenerator.RequestInfo(request.getVersion(), request.getHeaders(), contentLength, request.getMethod(), path);
-
         try
         {
-            HttpClient client = getHttpChannel().getHttpDestination().getHttpClient();
-            ByteBufferPool bufferPool = client.getByteBufferPool();
-            ByteBuffer header = bufferPool.acquire(client.getRequestBufferSize(), false);
-            ByteBuffer chunk = null;
-
-            ByteBuffer contentBuffer = null;
-            boolean lastContent = false;
-            if (!expects100Continue(request))
-            {
-                content.advance();
-                contentBuffer = content.getByteBuffer();
-                lastContent = content.isLast();
-            }
-            while (true)
-            {
-                HttpGenerator.Result result = generator.generateRequest(requestInfo, header, chunk, contentBuffer, lastContent);
-                switch (result)
-                {
-                    case NEED_CHUNK:
-                    {
-                        chunk = bufferPool.acquire(HttpGenerator.CHUNK_SIZE, false);
-                        break;
-                    }
-                    case FLUSH:
-                    {
-                        int size = 1;
-                        boolean hasChunk = chunk != null;
-                        if (hasChunk)
-                            ++size;
-                        boolean hasContent = contentBuffer != null;
-                        if (hasContent)
-                            ++size;
-                        ByteBuffer[] toWrite = new ByteBuffer[size];
-                        ByteBuffer[] toRecycle = new ByteBuffer[hasChunk ? 2 : 1];
-                        toWrite[0] = header;
-                        toRecycle[0] = header;
-                        if (hasChunk)
-                        {
-                            toWrite[1] = chunk;
-                            toRecycle[1] = chunk;
-                        }
-                        if (hasContent)
-                            toWrite[toWrite.length - 1] = contentBuffer;
-                        EndPoint endPoint = getHttpChannel().getHttpConnection().getEndPoint();
-                        endPoint.write(new ByteBufferRecyclerCallback(callback, bufferPool, toRecycle), toWrite);
-                        return;
-                    }
-                    case DONE:
-                    {
-                        // The headers have already been generated, perhaps by a concurrent abort.
-                        callback.failed(new HttpRequestException("Could not generate headers", request));
-                        return;
-                    }
-                    default:
-                    {
-                        callback.failed(new IllegalStateException(result.toString()));
-                        return;
-                    }
-                }
-            }
+            new HeadersCallback(exchange, content, callback).iterate();
         }
         catch (Throwable x)
         {
@@ -143,6 +78,10 @@
                 ByteBuffer contentBuffer = content.getByteBuffer();
                 boolean lastContent = content.isLast();
                 HttpGenerator.Result result = generator.generateRequest(null, null, chunk, contentBuffer, lastContent);
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Generated content ({} bytes) - {}/{}",
+                            contentBuffer == null ? -1 : contentBuffer.remaining(),
+                            result, generator);
                 switch (result)
                 {
                     case NEED_CHUNK:
@@ -166,22 +105,24 @@
                     }
                     case CONTINUE:
                     {
-                        break;
+                        if (lastContent)
+                            break;
+                        callback.succeeded();
+                        return;
                     }
                     case DONE:
                     {
-                        assert generator.isEnd();
                         callback.succeeded();
                         return;
                     }
                     default:
                     {
-                        throw new IllegalStateException();
+                        throw new IllegalStateException(result.toString());
                     }
                 }
             }
         }
-        catch (Exception x)
+        catch (Throwable x)
         {
             if (LOG.isDebugEnabled())
                 LOG.debug(x);
@@ -206,6 +147,8 @@
 
     private void shutdownOutput()
     {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Request shutdown output {}", getHttpExchange().getRequest());
         getHttpChannel().getHttpConnection().getEndPoint().shutdownOutput();
     }
 
@@ -215,6 +158,148 @@
         return String.format("%s[%s]", super.toString(), generator);
     }
 
+    private class HeadersCallback extends IteratingCallback
+    {
+        private final HttpExchange exchange;
+        private final Callback callback;
+        private final MetaData.Request metaData;
+        private ByteBuffer headerBuffer;
+        private ByteBuffer chunkBuffer;
+        private ByteBuffer contentBuffer;
+        private boolean lastContent;
+        private boolean generated;
+
+        public HeadersCallback(HttpExchange exchange, HttpContent content, Callback callback)
+        {
+            super(false);
+            this.exchange = exchange;
+            this.callback = callback;
+
+            Request request = exchange.getRequest();
+            ContentProvider requestContent = request.getContent();
+            long contentLength = requestContent == null ? -1 : requestContent.getLength();
+            String path = request.getPath();
+            String query = request.getQuery();
+            if (query != null)
+                path += "?" + query;
+            metaData = new MetaData.Request(request.getMethod(), new HttpURI(path), request.getVersion(), request.getHeaders(), contentLength);
+
+            if (!expects100Continue(request))
+            {
+                content.advance();
+                contentBuffer = content.getByteBuffer();
+                lastContent = content.isLast();
+            }
+        }
+
+        @Override
+        protected Action process() throws Exception
+        {
+            HttpClient client = getHttpChannel().getHttpDestination().getHttpClient();
+            ByteBufferPool bufferPool = client.getByteBufferPool();
+
+            while (true)
+            {
+                HttpGenerator.Result result = generator.generateRequest(metaData, headerBuffer, chunkBuffer, contentBuffer, lastContent);
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Generated headers ({} bytes), chunk ({} bytes), content ({} bytes) - {}/{}",
+                            headerBuffer == null ? -1 : headerBuffer.remaining(),
+                            chunkBuffer == null ? -1 : chunkBuffer.remaining(),
+                            contentBuffer == null ? -1 : contentBuffer.remaining(),
+                            result, generator);
+                switch (result)
+                {
+                    case NEED_HEADER:
+                    {
+                        headerBuffer = bufferPool.acquire(client.getRequestBufferSize(), false);
+                        break;
+                    }
+                    case NEED_CHUNK:
+                    {
+                        chunkBuffer = bufferPool.acquire(HttpGenerator.CHUNK_SIZE, false);
+                        break;
+                    }
+                    case FLUSH:
+                    {
+                        EndPoint endPoint = getHttpChannel().getHttpConnection().getEndPoint();
+                        if (chunkBuffer == null)
+                        {
+                            if (contentBuffer == null)
+                                endPoint.write(this, headerBuffer);
+                            else
+                                endPoint.write(this, headerBuffer, contentBuffer);
+                        }
+                        else
+                        {
+                            if (contentBuffer == null)
+                                endPoint.write(this, headerBuffer, chunkBuffer);
+                            else
+                                endPoint.write(this, headerBuffer, chunkBuffer, contentBuffer);
+                        }
+                        generated = true;
+                        return Action.SCHEDULED;
+                    }
+                    case SHUTDOWN_OUT:
+                    {
+                        shutdownOutput();
+                        return Action.SUCCEEDED;
+                    }
+                    case CONTINUE:
+                    {
+                        if (generated)
+                            return Action.SUCCEEDED;
+                        break;
+                    }
+                    case DONE:
+                    {
+                        if (generated)
+                            return Action.SUCCEEDED;
+                        // The headers have already been generated by some
+                        // other thread, perhaps by a concurrent abort().
+                        throw new HttpRequestException("Could not generate headers", exchange.getRequest());
+                    }
+                    default:
+                    {
+                        throw new IllegalStateException(result.toString());
+                    }
+                }
+            }
+        }
+
+        @Override
+        public void succeeded()
+        {
+            release();
+            super.succeeded();
+        }
+
+        @Override
+        public void failed(Throwable x)
+        {
+            release();
+            callback.failed(x);
+            super.failed(x);
+        }
+
+        @Override
+        protected void onCompleteSuccess()
+        {
+            super.onCompleteSuccess();
+            callback.succeeded();
+        }
+
+        private void release()
+        {
+            HttpClient client = getHttpChannel().getHttpDestination().getHttpClient();
+            ByteBufferPool bufferPool = client.getByteBufferPool();
+            bufferPool.release(headerBuffer);
+            headerBuffer = null;
+            if (chunkBuffer != null)
+                bufferPool.release(chunkBuffer);
+            chunkBuffer = null;
+        }
+    }
+
     private class ByteBufferRecyclerCallback implements Callback
     {
         private final Callback callback;
@@ -229,6 +314,12 @@
         }
 
         @Override
+        public boolean isNonBlocking()
+        {
+            return callback.isNonBlocking();
+        }
+
+        @Override
         public void succeeded()
         {
             for (ByteBuffer buffer : buffers)
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/package-info.java b/jetty-client/src/main/java/org/eclipse/jetty/client/package-info.java
index 7b5ebf7..9c8cbe4 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/package-info.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/package-info.java
@@ -20,32 +20,34 @@
  * Jetty Client : Implementation and Core Classes
  * 
  * This package provides APIs, utility classes and an implementation of an asynchronous HTTP client.
- * <p />
- * The core class is {@link org.eclipse.jetty.client.api.HttpClient}, which acts as a central configuration object (for example
- * for {@link org.eclipse.jetty.client.api.HttpClient#setIdleTimeout(long) idle timeouts}, {@link org.eclipse.jetty.client.api.HttpClient#setMaxConnectionsPerDestination(int)
- * max connections per destination}, etc.) and as a factory for {@link Request} objects.
- * <p />
+ * <p>
+ * The core class is {@link org.eclipse.jetty.client.HttpClient}, which acts as a central configuration object (for example
+ * for {@link org.eclipse.jetty.client.HttpClient#setIdleTimeout(long) idle timeouts}, {@link org.eclipse.jetty.client.HttpClient#setMaxConnectionsPerDestination(int)
+ * max connections per destination}, etc.) and as a factory for {@link org.eclipse.jetty.client.api.Request} objects.
+ * <p>
  * The HTTP protocol is based on the request/response paradigm, a unit that in this implementation is called
- * <em>exchange</em> and is represented by {@link org.eclipse.jetty.client.api.HttpExchange}.
+ * <em>exchange</em> and is represented by {@link org.eclipse.jetty.client.HttpExchange}.
  * An initial request may trigger a sequence of exchanges with one or more servers, called a <em>conversation</em>
- * and represented by {@link org.eclipse.jetty.client.api.HttpConversation}. A typical example of a conversation is a redirect, where
+ * and represented by {@link org.eclipse.jetty.client.HttpConversation}. A typical example of a conversation is a redirect, where
  * upon a request for a resource URI, the server replies with a redirect (for example with the 303 status code)
  * to another URI. This conversation is made of a first exchange made of the original request and its 303 response,
  * and of a second exchange made of the request for the new URI and its 200 response.
- * <p />
- * {@link org.eclipse.jetty.client.api.HttpClient} holds a number of {@link org.eclipse.jetty.client.api.HttpDestination destinations}, which in turn hold a number of
- * pooled {@link org.eclipse.jetty.client.api.HttpConnection connections}.
- * <p />
+ * <p>
+ * {@link org.eclipse.jetty.client.HttpClient} holds a number of {@link org.eclipse.jetty.client.api.Destination destinations}, which in turn hold a number of
+ * pooled {@link org.eclipse.jetty.client.api.Connection connections}.
+ * <p>
  * When a request is sent, its exchange is associated to a connection, either taken from an idle queue or created
  * anew, and when both the request and response are completed, the exchange is disassociated from the connection.
  * Conversations may span multiple connections on different destinations, and therefore are maintained at the
- * {@link org.eclipse.jetty.client.api.HttpClient} level.
- * <p />
+ * {@link org.eclipse.jetty.client.HttpClient} level.
+ * <p>
  * Applications may decide to send the request and wait for the response in a blocking way, using
  * {@link org.eclipse.jetty.client.api.Request#send()}.
  * Alternatively, application may ask to be notified of response events asynchronously, using
- * {@link org.eclipse.jetty.client.api.Request#send(Response.Listener)}.
+ * {@link org.eclipse.jetty.client.api.Request#send(org.eclipse.jetty.client.api.Response.CompleteListener)}.
  */
 package org.eclipse.jetty.client;
 
+import org.eclipse.jetty.client.api.Response;
+
 
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/util/BasicAuthentication.java b/jetty-client/src/main/java/org/eclipse/jetty/client/util/BasicAuthentication.java
index 7c6a7a0..e76a0bd 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/util/BasicAuthentication.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/util/BasicAuthentication.java
@@ -21,7 +21,9 @@
 import java.net.URI;
 import java.nio.charset.StandardCharsets;
 
+import org.eclipse.jetty.client.HttpClient;
 import org.eclipse.jetty.client.api.Authentication;
+import org.eclipse.jetty.client.api.AuthenticationStore;
 import org.eclipse.jetty.client.api.ContentResponse;
 import org.eclipse.jetty.client.api.Request;
 import org.eclipse.jetty.http.HttpHeader;
@@ -30,7 +32,7 @@
 
 /**
  * Implementation of the HTTP "Basic" authentication defined in RFC 2617.
- * <p />
+ * <p>
  * Applications should create objects of this class and add them to the
  * {@link AuthenticationStore} retrieved from the {@link HttpClient}
  * via {@link HttpClient#getAuthenticationStore()}.
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/util/ByteBufferContentProvider.java b/jetty-client/src/main/java/org/eclipse/jetty/client/util/ByteBufferContentProvider.java
index e8e2d2e..058b9ad 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/util/ByteBufferContentProvider.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/util/ByteBufferContentProvider.java
@@ -22,9 +22,11 @@
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
+import org.eclipse.jetty.client.api.ContentProvider;
+
 /**
  * A {@link ContentProvider} for {@link ByteBuffer}s.
- * <p />
+ * <p>
  * The position and limit of the {@link ByteBuffer}s passed to the constructor are not modified,
  * and each invocation of the {@link #iterator()} method returns a {@link ByteBuffer#slice() slice}
  * of the original {@link ByteBuffer}.
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/util/BytesContentProvider.java b/jetty-client/src/main/java/org/eclipse/jetty/client/util/BytesContentProvider.java
index 56dd205..5277cca 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/util/BytesContentProvider.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/util/BytesContentProvider.java
@@ -22,6 +22,8 @@
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
+import org.eclipse.jetty.client.api.ContentProvider;
+
 /**
  * A {@link ContentProvider} for byte arrays.
  */
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/util/DeferredContentProvider.java b/jetty-client/src/main/java/org/eclipse/jetty/client/util/DeferredContentProvider.java
index f9aa729..ea09433 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/util/DeferredContentProvider.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/util/DeferredContentProvider.java
@@ -42,11 +42,11 @@
 /**
  * A {@link ContentProvider} that allows to add content after {@link Request#send(Response.CompleteListener)}
  * has been called, therefore providing the request content at a later time.
- * <p />
+ * <p>
  * {@link DeferredContentProvider} can only be used in conjunction with
  * {@link Request#send(Response.CompleteListener)} (and not with its blocking counterpart {@link Request#send()})
  * because it provides content asynchronously.
- * <p />
+ * <p>
  * The deferred content is provided once and then fully consumed.
  * Invocations to the {@link #iterator()} method after the first will return an "empty" iterator
  * because the stream has been consumed on the first invocation.
@@ -55,13 +55,13 @@
  * of of {@link #iterator()} returning the iterator provided by this
   * class on the first invocation, and an iterator on the bytes copied to the other location
   * for subsequent invocations.
- * <p />
+ * <p>
  * Typical usage of {@link DeferredContentProvider} is in asynchronous proxies, where HTTP headers arrive
  * separately from HTTP content chunks.
- * <p />
+ * <p>
  * The deferred content must be provided through {@link #offer(ByteBuffer)}, which can be invoked multiple
  * times, and when all content has been provided it must be signaled with a call to {@link #close()}.
- * <p />
+ * <p>
  * Example usage:
  * <pre>
  * HttpClient httpClient = ...;
@@ -73,7 +73,7 @@
  *             .content(content)
  *             .send(new Response.CompleteListener()
  *             {
- *                 &#64Override
+ *                 &#64;Override
  *                 public void onComplete(Result result)
  *                 {
  *                     // Your logic here
@@ -87,7 +87,7 @@
  */
 public class DeferredContentProvider implements AsyncContentProvider, Callback, Closeable
 {
-    private static final Chunk CLOSE = new Chunk(BufferUtil.EMPTY_BUFFER, Callback.Adapter.INSTANCE);
+    private static final Chunk CLOSE = new Chunk(BufferUtil.EMPTY_BUFFER, Callback.NOOP);
 
     private final Object lock = this;
     private final ArrayQueue<Chunk> chunks = new ArrayQueue<>(4, 64, lock);
@@ -143,7 +143,7 @@
      */
     public boolean offer(ByteBuffer buffer)
     {
-        return offer(buffer, Callback.Adapter.INSTANCE);
+        return offer(buffer, Callback.NOOP);
     }
 
     public boolean offer(ByteBuffer buffer, Callback callback)
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/util/DigestAuthentication.java b/jetty-client/src/main/java/org/eclipse/jetty/client/util/DigestAuthentication.java
index e853395..af5723b 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/util/DigestAuthentication.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/util/DigestAuthentication.java
@@ -33,16 +33,19 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.eclipse.jetty.client.HttpClient;
 import org.eclipse.jetty.client.api.Authentication;
+import org.eclipse.jetty.client.api.AuthenticationStore;
 import org.eclipse.jetty.client.api.ContentResponse;
 import org.eclipse.jetty.client.api.Request;
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.util.Attributes;
+import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.TypeUtil;
 
 /**
  * Implementation of the HTTP "Digest" authentication defined in RFC 2617.
- * <p />
+ * <p>
  * Applications should create objects of this class and add them to the
  * {@link AuthenticationStore} retrieved from the {@link HttpClient}
  * via {@link HttpClient#getAuthenticationStore()}.
@@ -100,7 +103,7 @@
         String clientQOP = null;
         if (serverQOP != null)
         {
-            List<String> serverQOPValues = Arrays.asList(serverQOP.split(","));
+            List<String> serverQOPValues = StringUtil.csvSplit(null,serverQOP,0,serverQOP.length());
             if (serverQOPValues.contains("auth"))
                 clientQOP = "auth";
             else if (serverQOPValues.contains("auth-int"))
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/util/FormContentProvider.java b/jetty-client/src/main/java/org/eclipse/jetty/client/util/FormContentProvider.java
index 49f0de0..897f7b9 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/util/FormContentProvider.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/util/FormContentProvider.java
@@ -24,6 +24,7 @@
 import java.nio.charset.StandardCharsets;
 import java.nio.charset.UnsupportedCharsetException;
 
+import org.eclipse.jetty.client.api.ContentProvider;
 import org.eclipse.jetty.util.Fields;
 
 /**
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/util/FutureResponseListener.java b/jetty-client/src/main/java/org/eclipse/jetty/client/util/FutureResponseListener.java
index 0fc9511..6638b85 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/util/FutureResponseListener.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/util/FutureResponseListener.java
@@ -34,7 +34,7 @@
  * A {@link BufferingResponseListener} that is also a {@link Future}, to allow applications
  * to block (indefinitely or for a timeout) until {@link #onComplete(Result)} is called,
  * or to {@link #cancel(boolean) abort} the request/response conversation.
- * <p />
+ * <p>
  * Typical usage is:
  * <pre>
  * Request request = httpClient.newRequest(...)...;
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/util/InputStreamContentProvider.java b/jetty-client/src/main/java/org/eclipse/jetty/client/util/InputStreamContentProvider.java
index edd88db..97db4f5 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/util/InputStreamContentProvider.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/util/InputStreamContentProvider.java
@@ -33,20 +33,20 @@
 
 /**
  * A {@link ContentProvider} for an {@link InputStream}.
- * <p />
+ * <p>
  * The input stream is read once and therefore fully consumed.
  * Invocations to the {@link #iterator()} method after the first will return an "empty" iterator
  * because the stream has been consumed on the first invocation.
- * <p />
+ * <p>
  * However, it is possible for subclasses to override {@link #onRead(byte[], int, int)} to copy
  * the content read from the stream to another location (for example a file), and be able to
  * support multiple invocations of {@link #iterator()}, returning the iterator provided by this
  * class on the first invocation, and an iterator on the bytes copied to the other location
  * for subsequent invocations.
- * <p />
+ * <p>
  * It is possible to specify, at the constructor, a buffer size used to read content from the
  * stream, by default 4096 bytes.
- * <p />
+ * <p>
  * The {@link InputStream} passed to the constructor is by default closed when is it fully
  * consumed (or when an exception is thrown while reading it), unless otherwise specified
  * to the {@link #InputStreamContentProvider(java.io.InputStream, int, boolean) constructor}.
@@ -87,7 +87,7 @@
      * Callback method invoked just after having read from the stream,
      * but before returning the iteration element (a {@link ByteBuffer}
      * to the caller.
-     * <p />
+     * <p>
      * Subclasses may override this method to copy the content read from
      * the stream to another location (a file, or in memory if the content
      * is known to fit).
@@ -154,12 +154,12 @@
      * means that stream reading must be performed by {@link #hasNext()}, which introduces a side-effect
      * on what is supposed to be a simple query method (with respect to the Query Command Separation
      * Principle).
-     * <p />
+     * <p>
      * Alternatively, we could return {@code true} from {@link #hasNext()} even if we don't know that
      * we will read -1, but then when {@link #next()} reads -1 it must return an empty buffer.
      * However this is problematic, since GETs with no content indication would become GET with chunked
      * content, and not understood by servers.
-     * <p />
+     * <p>
      * Therefore we need to make sure that {@link #hasNext()} does not perform any side effect (so that
      * it can be called multiple times) until {@link #next()} is called.
      */
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/util/InputStreamResponseListener.java b/jetty-client/src/main/java/org/eclipse/jetty/client/util/InputStreamResponseListener.java
index 984e7d8..c5e2dfc 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/util/InputStreamResponseListener.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/util/InputStreamResponseListener.java
@@ -32,6 +32,7 @@
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
 
+import org.eclipse.jetty.client.HttpClient;
 import org.eclipse.jetty.client.api.Response;
 import org.eclipse.jetty.client.api.Response.Listener;
 import org.eclipse.jetty.client.api.Result;
@@ -42,7 +43,7 @@
 /**
  * Implementation of {@link Listener} that produces an {@link InputStream}
  * that allows applications to read the response content.
- * <p />
+ * <p>
  * Typical usage is:
  * <pre>
  * InputStreamResponseListener listener = new InputStreamResponseListener();
@@ -59,12 +60,12 @@
  *     }
  * }
  * </pre>
- * <p />
+ * <p>
  * The {@link HttpClient} implementation (the producer) will feed the input stream
  * asynchronously while the application (the consumer) is reading from it.
  * Chunks of content are maintained in a queue, and it is possible to specify a
  * maximum buffer size for the bytes held in the queue, by default 16384 bytes.
- * <p />
+ * <p>
  * If the consumer is faster than the producer, then the consumer will block
  * with the typical {@link InputStream#read()} semantic.
  * If the consumer is slower than the producer, then the producer will block
@@ -208,7 +209,7 @@
 
     /**
      * Waits for the given timeout for the response to be available, then returns it.
-     * <p />
+     * <p>
      * The wait ends as soon as all the HTTP headers have been received, without waiting for the content.
      * To wait for the whole content, see {@link #await(long, TimeUnit)}.
      *
@@ -232,7 +233,7 @@
     /**
      * Waits for the given timeout for the whole request/response cycle to be finished,
      * then returns the corresponding result.
-     * <p />
+     * <p>
      *
      * @param timeout the time to wait
      * @param unit the timeout unit
@@ -251,7 +252,7 @@
 
     /**
      * Returns an {@link InputStream} providing the response content bytes.
-     * <p />
+     * <p>
      * The method may be invoked only once; subsequent invocations will return a closed {@link InputStream}.
      *
      * @return an input stream providing the response content
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/util/MultiPartContentProvider.java b/jetty-client/src/main/java/org/eclipse/jetty/client/util/MultiPartContentProvider.java
new file mode 100644
index 0000000..61a22f3
--- /dev/null
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/util/MultiPartContentProvider.java
@@ -0,0 +1,388 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.client.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.Closeable;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Random;
+
+import org.eclipse.jetty.client.AsyncContentProvider;
+import org.eclipse.jetty.client.Synchronizable;
+import org.eclipse.jetty.client.api.ContentProvider;
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.io.RuntimeIOException;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+/**
+ * <p>A {@link ContentProvider} for form uploads with the {@code "multipart/form-data"}
+ * content type.</p>
+ * <p>Example usage:</p>
+ * <pre>
+ * MultiPartContentProvider multiPart = new MultiPartContentProvider();
+ * multiPart.addFieldPart("field", new StringContentProvider("foo"), null);
+ * multiPart.addFilePart("icon", "img.png", new PathContentProvider(Paths.get("/tmp/img.png")), null);
+ * ContentResponse response = client.newRequest("localhost", connector.getLocalPort())
+ *         .method(HttpMethod.POST)
+ *         .content(multiPart)
+ *         .send();
+ * </pre>
+ * <p>The above example would be the equivalent of submitting this form:</p>
+ * <pre>
+ * &lt;form method="POST" enctype="multipart/form-data"  accept-charset="UTF-8"&gt;
+ *     &lt;input type="text" name="field" value="foo" /&gt;
+ *     &lt;input type="file" name="icon" /&gt;
+ * &lt;/form&gt;
+ * </pre>
+ */
+public class MultiPartContentProvider extends AbstractTypedContentProvider implements AsyncContentProvider
+{
+    private static final Logger LOG = Log.getLogger(MultiPartContentProvider.class);
+    private static final byte[] COLON_SPACE_BYTES = new byte[]{':', ' '};
+    private static final byte[] CR_LF_BYTES = new byte[]{'\r', '\n'};
+
+    private final List<Part> parts = new ArrayList<>();
+    private final ByteBuffer firstBoundary;
+    private final ByteBuffer middleBoundary;
+    private final ByteBuffer onlyBoundary;
+    private final ByteBuffer lastBoundary;
+    private Listener listener;
+    private long length;
+
+    public MultiPartContentProvider()
+    {
+        this(makeBoundary());
+    }
+
+    public MultiPartContentProvider(String boundary)
+    {
+        super("multipart/form-data; boundary=" + boundary);
+        String firstBoundaryLine = "--" + boundary + "\r\n";
+        this.firstBoundary = ByteBuffer.wrap(firstBoundaryLine.getBytes(StandardCharsets.US_ASCII));
+        String middleBoundaryLine = "\r\n" + firstBoundaryLine;
+        this.middleBoundary = ByteBuffer.wrap(middleBoundaryLine.getBytes(StandardCharsets.US_ASCII));
+        String onlyBoundaryLine = "--" + boundary + "--\r\n";
+        this.onlyBoundary = ByteBuffer.wrap(onlyBoundaryLine.getBytes(StandardCharsets.US_ASCII));
+        String lastBoundaryLine = "\r\n" + onlyBoundaryLine;
+        this.lastBoundary = ByteBuffer.wrap(lastBoundaryLine.getBytes(StandardCharsets.US_ASCII));
+    }
+
+    private static String makeBoundary()
+    {
+        Random random = new Random();
+        StringBuilder builder = new StringBuilder("JettyHttpClientBoundary");
+        int length = builder.length();
+        while (builder.length() < length + 16)
+        {
+            long rnd = random.nextLong();
+            builder.append(Long.toString(rnd < 0 ? -rnd : rnd, 36));
+        }
+        builder.setLength(length + 16);
+        return builder.toString();
+    }
+
+    /**
+     * <p>Adds a field part with the given {@code name} as field name, and the given
+     * {@code content} as part content.</p>
+     * <p>The {@code Content-Type} of this part will be obtained from:</p>
+     * <ul>
+     *     <li>the {@code Content-Type} header in the {@code fields} parameter; otherwise</li>
+     *     <li>the {@link Typed#getContentType()} method if the {@code content} parameter
+     *     implements {@link Typed}; otherwise</li>
+     *     <li>"text/plain"</li>
+     * </ul>
+     *
+     * @param name the part name
+     * @param content the part content
+     * @param fields the headers associated with this part
+     */
+    public void addFieldPart(String name, ContentProvider content, HttpFields fields)
+    {
+        addPart(new Part(name, null, "text/plain", content, fields));
+    }
+
+    /**
+     * <p>Adds a file part with the given {@code name} as field name, the given
+     * {@code fileName} as file name, and the given {@code content} as part content.</p>
+     * <p>The {@code Content-Type} of this part will be obtained from:</p>
+     * <ul>
+     *     <li>the {@code Content-Type} header in the {@code fields} parameter; otherwise</li>
+     *     <li>the {@link Typed#getContentType()} method if the {@code content} parameter
+     *     implements {@link Typed}; otherwise</li>
+     *     <li>"application/octet-stream"</li>
+     * </ul>
+     *
+     * @param name the part name
+     * @param fileName the file name associated to this part
+     * @param content the part content
+     * @param fields the headers associated with this part
+     */
+    public void addFilePart(String name, String fileName, ContentProvider content, HttpFields fields)
+    {
+        addPart(new Part(name, fileName, "application/octet-stream", content, fields));
+    }
+
+    private void addPart(Part part)
+    {
+        parts.add(part);
+        if (LOG.isDebugEnabled())
+            LOG.debug("Added {}", part);
+    }
+
+    @Override
+    public void setListener(Listener listener)
+    {
+        this.listener = listener;
+
+        // Compute the length, if possible.
+        if (parts.isEmpty())
+        {
+            length = onlyBoundary.remaining();
+        }
+        else
+        {
+            for (int i = 0; i < parts.size(); ++i)
+            {
+                length += (i == 0) ? firstBoundary.remaining() : middleBoundary.remaining();
+                Part part = parts.get(i);
+                long partLength = part.length;
+                length += partLength;
+                if (partLength < 0)
+                {
+                    length = -1;
+                    break;
+                }
+            }
+            if (length > 0)
+                length += lastBoundary.remaining();
+        }
+    }
+
+    @Override
+    public long getLength()
+    {
+        return length;
+    }
+
+    @Override
+    public Iterator<ByteBuffer> iterator()
+    {
+        return new MultiPartIterator();
+    }
+
+    private static class Part
+    {
+        private final String name;
+        private final String fileName;
+        private final String contentType;
+        private final ContentProvider content;
+        private final HttpFields fields;
+        private final ByteBuffer headers;
+        private final long length;
+
+        private Part(String name, String fileName, String contentType, ContentProvider content, HttpFields fields)
+        {
+            this.name = name;
+            this.fileName = fileName;
+            this.contentType = contentType;
+            this.content = content;
+            this.fields = fields;
+            this.headers = headers();
+            this.length = content.getLength() < 0 ? -1 : headers.remaining() + content.getLength();
+        }
+
+        private ByteBuffer headers()
+        {
+            try
+            {
+                // Compute the Content-Disposition.
+                String contentDisposition = "Content-Disposition: form-data; name=\"" + name + "\"";
+                if (fileName != null)
+                    contentDisposition += "; filename=\"" + fileName + "\"";
+                contentDisposition += "\r\n";
+
+                // Compute the Content-Type.
+                String contentType = fields == null ? null : fields.get(HttpHeader.CONTENT_TYPE);
+                if (contentType == null)
+                {
+                    if (content instanceof Typed)
+                        contentType = ((Typed)content).getContentType();
+                    else
+                        contentType = this.contentType;
+                }
+                contentType = "Content-Type: " + contentType + "\r\n";
+
+                if (fields == null || fields.size() == 0)
+                {
+                    String headers = contentDisposition;
+                    headers += contentType;
+                    headers += "\r\n";
+                    return ByteBuffer.wrap(headers.getBytes(StandardCharsets.UTF_8));
+                }
+
+                ByteArrayOutputStream buffer = new ByteArrayOutputStream((fields.size() + 1) * contentDisposition.length());
+                buffer.write(contentDisposition.getBytes(StandardCharsets.UTF_8));
+                buffer.write(contentType.getBytes(StandardCharsets.UTF_8));
+                for (HttpField field : fields)
+                {
+                    if (HttpHeader.CONTENT_TYPE.equals(field.getHeader()))
+                        continue;
+                    buffer.write(field.getName().getBytes(StandardCharsets.US_ASCII));
+                    buffer.write(COLON_SPACE_BYTES);
+                    buffer.write(field.getValue().getBytes(StandardCharsets.UTF_8));
+                    buffer.write(CR_LF_BYTES);
+                }
+                buffer.write(CR_LF_BYTES);
+                return ByteBuffer.wrap(buffer.toByteArray());
+            }
+            catch (IOException x)
+            {
+                throw new RuntimeIOException(x);
+            }
+        }
+
+        @Override
+        public String toString()
+        {
+            return String.format("%s@%x[name=%s,fileName=%s,length=%d,headers=%s]",
+                    getClass().getSimpleName(),
+                    hashCode(),
+                    name,
+                    fileName,
+                    content.getLength(),
+                    fields);
+        }
+    }
+
+    private class MultiPartIterator implements Iterator<ByteBuffer>, Synchronizable, Callback, Closeable
+    {
+        private Iterator<ByteBuffer> iterator;
+        private int index;
+        private State state = State.FIRST_BOUNDARY;
+
+        @Override
+        public boolean hasNext()
+        {
+            return state != State.COMPLETE;
+        }
+
+        @Override
+        public ByteBuffer next()
+        {
+            while (true)
+            {
+                switch (state)
+                {
+                    case FIRST_BOUNDARY:
+                    {
+                        if (parts.isEmpty())
+                        {
+                            state = State.COMPLETE;
+                            return onlyBoundary.slice();
+                        }
+                        else
+                        {
+                            state = State.HEADERS;
+                            return firstBoundary.slice();
+                        }
+                    }
+                    case HEADERS:
+                    {
+                        Part part = parts.get(index);
+                        ContentProvider content = part.content;
+                        if (content instanceof AsyncContentProvider)
+                            ((AsyncContentProvider)content).setListener(listener);
+                        iterator = content.iterator();
+                        state = State.CONTENT;
+                        return part.headers.slice();
+                    }
+                    case CONTENT:
+                    {
+                        if (iterator.hasNext())
+                            return iterator.next();
+                        ++index;
+                        if (index == parts.size())
+                            state = State.LAST_BOUNDARY;
+                        else
+                            state = State.MIDDLE_BOUNDARY;
+                        break;
+                    }
+                    case MIDDLE_BOUNDARY:
+                    {
+                        state = State.HEADERS;
+                        return middleBoundary.slice();
+                    }
+                    case LAST_BOUNDARY:
+                    {
+                        state = State.COMPLETE;
+                        return lastBoundary.slice();
+                    }
+                    case COMPLETE:
+                    {
+                        throw new NoSuchElementException();
+                    }
+                }
+            }
+        }
+
+        @Override
+        public Object getLock()
+        {
+            if (iterator instanceof Synchronizable)
+                return ((Synchronizable)iterator).getLock();
+            return this;
+        }
+
+        @Override
+        public void succeeded()
+        {
+            if (iterator instanceof Callback)
+                ((Callback)iterator).succeeded();
+        }
+
+        @Override
+        public void failed(Throwable x)
+        {
+            if (iterator instanceof Callback)
+                ((Callback)iterator).failed(x);
+        }
+
+        @Override
+        public void close() throws IOException
+        {
+            if (iterator instanceof Closeable)
+                ((Closeable)iterator).close();
+        }
+    }
+
+    private enum State
+    {
+        FIRST_BOUNDARY, HEADERS, CONTENT, MIDDLE_BOUNDARY, LAST_BOUNDARY, COMPLETE
+    }
+}
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/util/OutputStreamContentProvider.java b/jetty-client/src/main/java/org/eclipse/jetty/client/util/OutputStreamContentProvider.java
index 55131c2..d7e8e65 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/util/OutputStreamContentProvider.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/util/OutputStreamContentProvider.java
@@ -33,11 +33,11 @@
 /**
  * A {@link ContentProvider} that provides content asynchronously through an {@link OutputStream}
  * similar to {@link DeferredContentProvider}.
- * <p />
+ * <p>
  * {@link OutputStreamContentProvider} can only be used in conjunction with
  * {@link Request#send(Response.CompleteListener)} (and not with its blocking counterpart {@link Request#send()})
  * because it provides content asynchronously.
- * <p />
+ * <p>
  * The deferred content is provided once by writing to the {@link #getOutputStream() output stream}
  * and then fully consumed.
  * Invocations to the {@link #iterator()} method after the first will return an "empty" iterator
@@ -45,10 +45,10 @@
  * However, it is possible for subclasses to support multiple invocations of {@link #iterator()}
  * by overriding {@link #write(ByteBuffer)} and {@link #close()}, copying the bytes and making them
  * available for subsequent invocations.
- * <p />
+ * <p>
  * Content must be provided by writing to the {@link #getOutputStream() output stream}, that must be
  * {@link OutputStream#close() closed} when all content has been provided.
- * <p />
+ * <p>
  * Example usage:
  * <pre>
  * HttpClient httpClient = ...;
@@ -61,7 +61,7 @@
  *             .content(content)
  *             .send(new Response.CompleteListener()
  *             {
- *                 &#64Override
+ *                 &#64;Override
  *                 public void onComplete(Result result)
  *                 {
  *                     // Your logic here
@@ -79,6 +79,12 @@
     private final OutputStream output = new DeferredOutputStream();
 
     @Override
+    public boolean isNonBlocking()
+    {
+        return deferred.isNonBlocking();
+    }
+    
+    @Override
     public long getLength()
     {
         return deferred.getLength();
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/util/PathContentProvider.java b/jetty-client/src/main/java/org/eclipse/jetty/client/util/PathContentProvider.java
index f7685b9..eab80c7 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/util/PathContentProvider.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/util/PathContentProvider.java
@@ -30,12 +30,13 @@
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
+import org.eclipse.jetty.client.api.ContentProvider;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
 /**
  * A {@link ContentProvider} for files using JDK 7's {@code java.nio.file} APIs.
- * <p />
+ * <p>
  * It is possible to specify, at the constructor, a buffer size used to read content from the
  * stream, by default 4096 bytes.
  */
@@ -131,7 +132,7 @@
                 close();
                 throw x;
             }
-            catch (Exception x)
+            catch (Throwable x)
             {
                 close();
                 throw (NoSuchElementException)new NoSuchElementException().initCause(x);
@@ -152,7 +153,7 @@
                 if (channel != null)
                     channel.close();
             }
-            catch (Exception x)
+            catch (Throwable x)
             {
                 LOG.ignore(x);
             }
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/util/StringContentProvider.java b/jetty-client/src/main/java/org/eclipse/jetty/client/util/StringContentProvider.java
index a1f0109..c34d3c6 100644
--- a/jetty-client/src/main/java/org/eclipse/jetty/client/util/StringContentProvider.java
+++ b/jetty-client/src/main/java/org/eclipse/jetty/client/util/StringContentProvider.java
@@ -21,9 +21,11 @@
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 
+import org.eclipse.jetty.client.api.ContentProvider;
+
 /**
  * A {@link ContentProvider} for strings.
- * <p />
+ * <p>
  * It is possible to specify, at the constructor, an encoding used to convert
  * the string into bytes, by default UTF-8.
  */
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/AbstractHttpClientServerTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/AbstractHttpClientServerTest.java
index 70303ba..9cea0fd 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/AbstractHttpClientServerTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/AbstractHttpClientServerTest.java
@@ -21,9 +21,9 @@
 import java.util.Arrays;
 import java.util.Collection;
 
+import org.eclipse.jetty.client.http.HttpClientTransportOverHTTP;
 import org.eclipse.jetty.http.HttpScheme;
 import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.NetworkConnector;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
 import org.eclipse.jetty.toolchain.test.TestTracker;
@@ -50,7 +50,7 @@
     protected String scheme;
     protected Server server;
     protected HttpClient client;
-    protected NetworkConnector connector;
+    protected ServerConnector connector;
 
     public AbstractHttpClientServerTest(SslContextFactory sslContextFactory)
     {
@@ -89,9 +89,14 @@
 
     protected void startClient() throws Exception
     {
+        startClient(new HttpClientTransportOverHTTP(1));
+    }
+
+    protected void startClient(HttpClientTransport transport) throws Exception
+    {
         QueuedThreadPool clientThreads = new QueuedThreadPool();
         clientThreads.setName("client");
-        client = new HttpClient(sslContextFactory);
+        client = new HttpClient(transport, sslContextFactory);
         client.setExecutor(clientThreads);
         client.start();
     }
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/ClientConnectionCloseTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/ClientConnectionCloseTest.java
new file mode 100644
index 0000000..4564c5e
--- /dev/null
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/ClientConnectionCloseTest.java
@@ -0,0 +1,122 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.client;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.client.api.ContentProvider;
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.client.util.DeferredContentProvider;
+import org.eclipse.jetty.client.util.StringContentProvider;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpHeaderValue;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ClientConnectionCloseTest extends AbstractHttpClientServerTest
+{
+    public ClientConnectionCloseTest(SslContextFactory sslContextFactory)
+    {
+        super(sslContextFactory);
+    }
+
+    @Test
+    public void testClientConnectionCloseShutdownOutputWithoutRequestContent() throws Exception
+    {
+        testClientConnectionCloseShutdownOutput(null);
+    }
+
+    @Test
+    public void testClientConnectionCloseShutdownOutputWithRequestContent() throws Exception
+    {
+        testClientConnectionCloseShutdownOutput(new StringContentProvider("data", StandardCharsets.UTF_8));
+    }
+
+    @Test
+    public void testClientConnectionCloseShutdownOutputWithChunkedRequestContent() throws Exception
+    {
+        DeferredContentProvider content = new DeferredContentProvider()
+        {
+            @Override
+            public long getLength()
+            {
+                return -1;
+            }
+        };
+        content.offer(ByteBuffer.wrap("data".getBytes(StandardCharsets.UTF_8)));
+        content.close();
+        testClientConnectionCloseShutdownOutput(content);
+    }
+
+    private void testClientConnectionCloseShutdownOutput(ContentProvider content) throws Exception
+    {
+        AtomicReference<EndPoint> ref = new AtomicReference<>();
+        start(new AbstractHandler()
+        {
+            @Override
+            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+            {
+                baseRequest.setHandled(true);
+                ref.set(baseRequest.getHttpChannel().getEndPoint());
+                ServletInputStream input = request.getInputStream();
+                while (true)
+                {
+                    int read = input.read();
+                    if (read < 0)
+                        break;
+                }
+                response.setStatus(HttpStatus.OK_200);
+            }
+        });
+
+        ContentResponse response = client.newRequest("localhost", connector.getLocalPort())
+                .scheme(scheme)
+                .path("/ctx/path")
+                .header(HttpHeader.CONNECTION, HttpHeaderValue.CLOSE.asString())
+                .content(content)
+                .send();
+
+        Assert.assertEquals(HttpStatus.OK_200, response.getStatus());
+
+        // Wait for the FIN to arrive to the server
+        Thread.sleep(1000);
+
+        // Do not read from the server because it will trigger
+        // the send of the TLS Close Message before the response.
+
+        EndPoint serverEndPoint = ref.get();
+        ByteBuffer buffer = BufferUtil.allocate(1);
+        int read = serverEndPoint.fill(buffer);
+        Assert.assertEquals(-1, read);
+    }
+}
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/ContentResponseTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/ContentResponseTest.java
index e9094af..7b9121e 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/ContentResponseTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/ContentResponseTest.java
@@ -21,6 +21,7 @@
 import java.io.IOException;
 import java.util.Random;
 import java.util.concurrent.TimeUnit;
+
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HostnameVerificationTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HostnameVerificationTest.java
index 4d2add5..f46a360 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/HostnameVerificationTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HostnameVerificationTest.java
@@ -22,6 +22,7 @@
 import java.nio.channels.ClosedChannelException;
 import java.security.cert.CertificateException;
 import java.util.concurrent.ExecutionException;
+
 import javax.net.ssl.SSLHandshakeException;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
@@ -94,7 +95,7 @@
      * http://www.ietf.org/rfc/rfc2818.txt section 3.1. It uses a certificate with a common name different to localhost
      * and sends a request to localhost. This should fail with a SSLHandshakeException.
      *
-     * @throws Exception
+     * @throws Exception on test failure
      */
     @Test
     public void simpleGetWithHostnameVerificationEnabledTest() throws Exception
@@ -132,7 +133,8 @@
      * This test has hostname verification disabled and connecting, ssl handshake and sending the request should just
      * work fine.
      *
-     * @throws Exception
+     * @throws Exception on test failure
+     * 
      */
     @Test
     public void simpleGetWithHostnameVerificationDisabledTest() throws Exception
@@ -153,7 +155,7 @@
      * This test has hostname verification disabled by setting trustAll to true and connecting,
      * ssl handshake and sending the request should just work fine.
      *
-     * @throws Exception
+     * @throws Exception on test failure
      */
     @Test
     public void trustAllDisablesHostnameVerificationTest() throws Exception
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientAsyncContentTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientAsyncContentTest.java
index cf4f93f..4b6225d 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientAsyncContentTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientAsyncContentTest.java
@@ -24,6 +24,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
+
 import javax.servlet.ServletException;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientContinueTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientContinueTest.java
index a7ed98c..1c511f8 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientContinueTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientContinueTest.java
@@ -27,8 +27,6 @@
 import java.net.Socket;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
-import java.util.Iterator;
-import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import javax.servlet.ServletException;
@@ -404,7 +402,7 @@
         });
 
         client.getProtocolHandlers().clear();
-        client.getProtocolHandlers().add(new ContinueProtocolHandler(client)
+        client.getProtocolHandlers().put(new ContinueProtocolHandler()
         {
             @Override
             public Response.Listener getResponseListener()
@@ -608,14 +606,7 @@
 
         final DeferredContentProvider content = new DeferredContentProvider(ByteBuffer.wrap(chunk1));
 
-        List<ProtocolHandler> protocolHandlers = client.getProtocolHandlers();
-        for (Iterator<ProtocolHandler> iterator = protocolHandlers.iterator(); iterator.hasNext();)
-        {
-            ProtocolHandler protocolHandler = iterator.next();
-            if (protocolHandler instanceof ContinueProtocolHandler)
-                iterator.remove();
-        }
-        protocolHandlers.add(new ContinueProtocolHandler(client)
+        client.getProtocolHandlers().put(new ContinueProtocolHandler()
         {
             @Override
             public Response.Listener getResponseListener()
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientCustomProxyTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientCustomProxyTest.java
index 08a45c9..dba109c 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientCustomProxyTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientCustomProxyTest.java
@@ -93,7 +93,7 @@
             public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
             {
                 baseRequest.setHandled(true);
-                if (!URI.create(baseRequest.getUri().toString()).isAbsolute())
+                if (!URI.create(baseRequest.getHttpURI().toString()).isAbsolute())
                     response.setStatus(HttpServletResponse.SC_USE_PROXY);
                 else if (serverHost.equals(request.getServerName()))
                     response.setStatus(status);
@@ -146,7 +146,7 @@
         }
     }
 
-    private class CAFEBABEConnection extends AbstractConnection
+    private class CAFEBABEConnection extends AbstractConnection implements Callback
     {
         private final ClientConnectionFactory connectionFactory;
         private final Map<String, Object> context;
@@ -162,8 +162,19 @@
         public void onOpen()
         {
             super.onOpen();
+            getEndPoint().write(this, ByteBuffer.wrap(CAFE_BABE));
+        }
+
+        @Override
+        public void succeeded()
+        {
             fillInterested();
-            getEndPoint().write(new Callback.Adapter(), ByteBuffer.wrap(CAFE_BABE));
+        }
+
+        @Override
+        public void failed(Throwable x)
+        {
+            close();
         }
 
         @Override
@@ -177,7 +188,7 @@
                 Assert.assertArrayEquals(CAFE_BABE, buffer.array());
 
                 // We are good, upgrade the connection
-                ClientConnectionFactory.Helper.replaceConnection(this, connectionFactory.newConnection(getEndPoint(), context));
+                getEndPoint().upgrade(connectionFactory.newConnection(getEndPoint(), context));
             }
             catch (Throwable x)
             {
@@ -206,7 +217,7 @@
         }
     }
 
-    private class CAFEBABEServerConnection extends AbstractConnection
+    private class CAFEBABEServerConnection extends AbstractConnection implements Callback
     {
         private final org.eclipse.jetty.server.ConnectionFactory connectionFactory;
 
@@ -232,15 +243,25 @@
                 int filled = getEndPoint().fill(buffer);
                 Assert.assertEquals(4, filled);
                 Assert.assertArrayEquals(CAFE_BABE, buffer.array());
-                getEndPoint().write(new Callback.Adapter(), buffer);
-
-                // We are good, upgrade the connection
-                ClientConnectionFactory.Helper.replaceConnection(this, connectionFactory.newConnection(connector, getEndPoint()));
+                getEndPoint().write(this, buffer);
             }
             catch (Throwable x)
             {
                 close();
             }
         }
+
+        @Override
+        public void succeeded()
+        {
+            // We are good, upgrade the connection
+            getEndPoint().upgrade(connectionFactory.newConnection(connector, getEndPoint()));
+        }
+
+        @Override
+        public void failed(Throwable x)
+        {
+            close();
+        }
     }
 }
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientExplicitConnectionTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientExplicitConnectionTest.java
index 34c0b0f..c54f889 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientExplicitConnectionTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientExplicitConnectionTest.java
@@ -59,7 +59,7 @@
             Assert.assertEquals(200, response.getStatus());
 
             HttpDestinationOverHTTP httpDestination = (HttpDestinationOverHTTP)destination;
-            ConnectionPool connectionPool = httpDestination.getConnectionPool();
+            DuplexConnectionPool connectionPool = httpDestination.getConnectionPool();
             Assert.assertTrue(connectionPool.getActiveConnections().isEmpty());
             Assert.assertTrue(connectionPool.getIdleConnections().isEmpty());
         }
@@ -94,7 +94,7 @@
         Assert.assertFalse(httpConnection.getEndPoint().isOpen());
 
         HttpDestinationOverHTTP httpDestination = (HttpDestinationOverHTTP)destination;
-        ConnectionPool connectionPool = httpDestination.getConnectionPool();
+        DuplexConnectionPool connectionPool = httpDestination.getConnectionPool();
         Assert.assertTrue(connectionPool.getActiveConnections().isEmpty());
         Assert.assertTrue(connectionPool.getIdleConnections().isEmpty());
     }
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientFailureTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientFailureTest.java
index 9453025..0db3444 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientFailureTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientFailureTest.java
@@ -106,7 +106,7 @@
             // Expected.
         }
 
-        ConnectionPool connectionPool = connectionRef.get().getHttpDestination().getConnectionPool();
+        DuplexConnectionPool connectionPool = connectionRef.get().getHttpDestination().getConnectionPool();
         Assert.assertEquals(0, connectionPool.getConnectionCount());
         Assert.assertEquals(0, connectionPool.getActiveConnections().size());
         Assert.assertEquals(0, connectionPool.getIdleConnections().size());
@@ -157,7 +157,7 @@
 
         Assert.assertTrue(commitLatch.await(5, TimeUnit.SECONDS));
         final CountDownLatch contentLatch = new CountDownLatch(1);
-        content.offer(ByteBuffer.allocate(1024), new Callback.Adapter()
+        content.offer(ByteBuffer.allocate(1024), new Callback()
         {
             @Override
             public void failed(Throwable x)
@@ -170,7 +170,7 @@
         Assert.assertTrue(contentLatch.await(5, TimeUnit.SECONDS));
         Assert.assertTrue(completeLatch.await(5, TimeUnit.SECONDS));
 
-        ConnectionPool connectionPool = connectionRef.get().getHttpDestination().getConnectionPool();
+        DuplexConnectionPool connectionPool = connectionRef.get().getHttpDestination().getConnectionPool();
         Assert.assertEquals(0, connectionPool.getConnectionCount());
         Assert.assertEquals(0, connectionPool.getActiveConnections().size());
         Assert.assertEquals(0, connectionPool.getIdleConnections().size());
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientGZIPTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientGZIPTest.java
index bd45bb8..0826907 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientGZIPTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientGZIPTest.java
@@ -24,6 +24,7 @@
 import java.util.Arrays;
 import java.util.concurrent.TimeUnit;
 import java.util.zip.GZIPOutputStream;
+
 import javax.servlet.ServletException;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientLoadTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientLoadTest.java
index 09ae112..7ddeea8 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientLoadTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientLoadTest.java
@@ -58,10 +58,10 @@
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
 import org.eclipse.jetty.util.thread.Scheduler;
+import org.hamcrest.Matchers;
 import org.junit.Assert;
 import org.junit.Test;
 
-import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertThat;
 
 public class HttpClientLoadTest extends AbstractHttpClientServerTest
@@ -100,7 +100,7 @@
                 return new HttpDestinationOverHTTP(getHttpClient(), origin)
                 {
                     @Override
-                    protected ConnectionPool newConnectionPool(HttpClient client)
+                    protected DuplexConnectionPool newConnectionPool(HttpClient client)
                     {
                         return new LeakTrackingConnectionPool(this, client.getMaxConnectionsPerDestination(), this)
                         {
@@ -143,15 +143,15 @@
 
         System.gc();
 
-        assertThat("Server BufferPool - leaked acquires", serverBufferPool.getLeakedAcquires(), is(0L));
-        assertThat("Server BufferPool - leaked releases", serverBufferPool.getLeakedReleases(), is(0L));
-        assertThat("Server BufferPool - unreleased", serverBufferPool.getLeakedResources(), is(0L));
+        assertThat("Server BufferPool - leaked acquires", serverBufferPool.getLeakedAcquires(), Matchers.is(0L));
+        assertThat("Server BufferPool - leaked releases", serverBufferPool.getLeakedReleases(), Matchers.is(0L));
+        assertThat("Server BufferPool - unreleased", serverBufferPool.getLeakedResources(), Matchers.is(0L));
 
-        assertThat("Client BufferPool - leaked acquires", clientBufferPool.getLeakedAcquires(), is(0L));
-        assertThat("Client BufferPool - leaked releases", clientBufferPool.getLeakedReleases(), is(0L));
-        assertThat("Client BufferPool - unreleased", clientBufferPool.getLeakedResources(), is(0L));
+        assertThat("Client BufferPool - leaked acquires", clientBufferPool.getLeakedAcquires(), Matchers.is(0L));
+        assertThat("Client BufferPool - leaked releases", clientBufferPool.getLeakedReleases(), Matchers.is(0L));
+        assertThat("Client BufferPool - unreleased", clientBufferPool.getLeakedResources(), Matchers.is(0L));
 
-        assertThat("Connection Leaks", connectionLeaks.get(), is(0L));
+        assertThat("Connection Leaks", connectionLeaks.get(), Matchers.is(0L));
     }
 
     private void run(Random random, int iterations) throws InterruptedException
@@ -173,7 +173,7 @@
                 for (String host : Arrays.asList("localhost", "127.0.0.1"))
                 {
                     HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, host, connector.getLocalPort());
-                    ConnectionPool connectionPool = destination.getConnectionPool();
+                    DuplexConnectionPool connectionPool = destination.getConnectionPool();
                     for (Connection connection : new ArrayList<>(connectionPool.getActiveConnections()))
                     {
                         HttpConnectionOverHTTP active = (HttpConnectionOverHTTP)connection;
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientProxyTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientProxyTest.java
index 1156804..4193c4d 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientProxyTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientProxyTest.java
@@ -58,7 +58,7 @@
             public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
             {
                 baseRequest.setHandled(true);
-                if (!URI.create(baseRequest.getUri().toString()).isAbsolute())
+                if (!URI.create(baseRequest.getHttpURI().toString()).isAbsolute())
                     response.setStatus(HttpServletResponse.SC_USE_PROXY);
                 else if (serverHost.equals(request.getServerName()))
                     response.setStatus(status);
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientRedirectTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientRedirectTest.java
index 53cfa5a..ebbebad 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientRedirectTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientRedirectTest.java
@@ -26,6 +26,7 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
+
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientStreamTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientStreamTest.java
index 2b7c7e0..f88312d 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientStreamTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientStreamTest.java
@@ -18,6 +18,9 @@
 
 package org.eclipse.jetty.client;
 
+import static java.nio.file.StandardOpenOption.CREATE;
+import static org.junit.Assert.fail;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -36,9 +39,12 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
+
+import javax.servlet.AsyncContext;
 import javax.servlet.ServletException;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
@@ -64,10 +70,6 @@
 import org.junit.Assert;
 import org.junit.Test;
 
-import static java.nio.file.StandardOpenOption.CREATE;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
 public class HttpClientStreamTest extends AbstractHttpClientServerTest
 {
     public HttpClientStreamTest(SslContextFactory sslContextFactory)
@@ -89,7 +91,7 @@
                 output.write(kb);
         }
 
-        start(new EmptyServerHandler());
+        start(new RespondThenConsumeHandler());
 
         final AtomicLong requestTime = new AtomicLong();
         ContentResponse response = client.newRequest("localhost", connector.getLocalPort())
@@ -186,7 +188,7 @@
         for (byte b : data)
         {
             int read = input.read();
-            assertTrue(read >= 0);
+            Assert.assertTrue(read >= 0);
             Assert.assertEquals(b & 0xFF, read);
         }
 
@@ -689,7 +691,7 @@
         try (DeferredContentProvider content = new DeferredContentProvider())
         {
             // Make the content immediately available.
-            content.offer(ByteBuffer.allocate(1024), new Callback.Adapter()
+            content.offer(ByteBuffer.allocate(1024), new Callback()
             {
                 @Override
                 public void succeeded()
@@ -974,7 +976,7 @@
         start(new EmptyServerHandler());
 
         final CountDownLatch failLatch = new CountDownLatch(2);
-        final Callback.Adapter callback = new Callback.Adapter()
+        final Callback callback = new Callback()
         {
             @Override
             public void failed(Throwable x)
@@ -1012,7 +1014,7 @@
 
         // Make sure that adding more content results in the callback to be failed.
         final CountDownLatch latch = new CountDownLatch(1);
-        content.offer(ByteBuffer.wrap(new byte[128]), new Callback.Adapter()
+        content.offer(ByteBuffer.wrap(new byte[128]), new Callback()
         {
             @Override
             public void failed(Throwable x)
@@ -1059,43 +1061,52 @@
     }
 
     @Test
-    public void testUploadWithWriteFailureClosesStream() throws Exception
+    public void testUploadWithConcurrentServerCloseClosesStream() throws Exception
     {
-        start(new EmptyServerHandler());
+        final CountDownLatch serverLatch = new CountDownLatch(1);
+        start(new AbstractHandler()
+        {
+            @Override
+            public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+            {
+                baseRequest.setHandled(true);
+                AsyncContext asyncContext = request.startAsync();
+                asyncContext.setTimeout(0);
+                serverLatch.countDown();
+            }
+        });
 
-        final AtomicInteger bytes = new AtomicInteger();
+        final AtomicBoolean commit = new AtomicBoolean();
         final CountDownLatch closeLatch = new CountDownLatch(1);
         InputStream stream = new InputStream()
         {
             @Override
             public int read() throws IOException
             {
-                int result = bytes.incrementAndGet();
-                switch (result)
+                // This method will be called few times before
+                // the request is committed.
+                // We wait for the request to commit, and we
+                // wait for the request to reach the server,
+                // to be sure that the server endPoint has
+                // been created, before stopping the connector.
+
+                if (commit.get())
                 {
-                    case 1:
+                    try
                     {
-                        break;
+                        Assert.assertTrue(serverLatch.await(5, TimeUnit.SECONDS));
+                        connector.stop();
+                        return 0;
                     }
-                    case 2:
+                    catch (Throwable x)
                     {
-                        try
-                        {
-                            connector.stop();
-                        }
-                        catch (Exception x)
-                        {
-                            throw new IOException(x);
-                        }
-                        break;
-                    }
-                    default:
-                    {
-                        result = -1;
-                        break;
+                        throw new IOException(x);
                     }
                 }
-                return result;
+                else
+                {
+                    return connector.isStopped() ? -1 : 0;
+                }
             }
 
             @Override
@@ -1111,6 +1122,14 @@
         client.newRequest("localhost", connector.getLocalPort())
                 .scheme(scheme)
                 .content(provider)
+                .onRequestCommit(new Request.CommitListener()
+                {
+                    @Override
+                    public void onCommit(Request request)
+                    {
+                        commit.set(true);
+                    }
+                })
                 .send(new Response.CompleteListener()
                 {
                     @Override
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTest.java
index 144588b..592d7d6 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTest.java
@@ -22,14 +22,19 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.HttpCookie;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.ServerSocket;
+import java.net.Socket;
 import java.net.URI;
 import java.net.URLEncoder;
+import java.net.UnknownHostException;
 import java.nio.ByteBuffer;
-import java.nio.channels.UnresolvedAddressException;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -42,7 +47,6 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
@@ -59,7 +63,6 @@
 import org.eclipse.jetty.client.api.Request;
 import org.eclipse.jetty.client.api.Response;
 import org.eclipse.jetty.client.api.Result;
-import org.eclipse.jetty.client.http.HttpClientTransportOverHTTP;
 import org.eclipse.jetty.client.http.HttpConnectionOverHTTP;
 import org.eclipse.jetty.client.http.HttpDestinationOverHTTP;
 import org.eclipse.jetty.client.util.BufferingResponseListener;
@@ -72,7 +75,6 @@
 import org.eclipse.jetty.http.HttpHeaderValue;
 import org.eclipse.jetty.http.HttpMethod;
 import org.eclipse.jetty.http.HttpVersion;
-import org.eclipse.jetty.io.EndPoint;
 import org.eclipse.jetty.server.handler.AbstractHandler;
 import org.eclipse.jetty.toolchain.test.TestingDir;
 import org.eclipse.jetty.toolchain.test.annotation.Slow;
@@ -80,14 +82,13 @@
 import org.eclipse.jetty.util.FuturePromise;
 import org.eclipse.jetty.util.IO;
 import org.eclipse.jetty.util.Promise;
+import org.eclipse.jetty.util.SocketAddressResolver;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
 import org.junit.Assert;
 import org.junit.Assume;
 import org.junit.Rule;
 import org.junit.Test;
 
-import static java.nio.file.StandardOpenOption.CREATE;
-
 public class HttpClientTest extends AbstractHttpClientServerTest
 {
     @Rule
@@ -110,7 +111,7 @@
         Assert.assertEquals(200, response.getStatus());
 
         HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, host, port);
-        ConnectionPool connectionPool = destination.getConnectionPool();
+        DuplexConnectionPool connectionPool = destination.getConnectionPool();
 
         long start = System.nanoTime();
         HttpConnectionOverHTTP connection = null;
@@ -127,8 +128,8 @@
         client.stop();
 
         Assert.assertEquals(0, client.getDestinations().size());
-        Assert.assertEquals(0, connectionPool.getIdleConnections().size());
-        Assert.assertEquals(0, connectionPool.getActiveConnections().size());
+        Assert.assertEquals(0, connectionPool.getIdleConnectionCount());
+        Assert.assertEquals(0, connectionPool.getActiveConnectionCount());
         Assert.assertFalse(connection.getEndPoint().isOpen());
     }
 
@@ -329,7 +330,7 @@
             public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
             {
                 baseRequest.setHandled(true);
-                consume(request.getInputStream());
+                consume(request.getInputStream(), true);
                 String value = request.getParameter(paramName);
                 if (paramValue.equals(value))
                 {
@@ -360,7 +361,7 @@
             public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
             {
                 baseRequest.setHandled(true);
-                consume(request.getInputStream());
+                consume(request.getInputStream(), true);
             }
         });
 
@@ -394,7 +395,7 @@
             public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
             {
                 baseRequest.setHandled(true);
-                consume(request.getInputStream());
+                consume(request.getInputStream(), true);
             }
         });
 
@@ -543,13 +544,13 @@
     @Test
     public void test_ExchangeIsComplete_OnlyWhenBothRequestAndResponseAreComplete() throws Exception
     {
-        start(new EmptyServerHandler());
+        start(new RespondThenConsumeHandler());
 
         // Prepare a big file to upload
-        Path targetTestsDir = testdir.getEmptyDir().toPath();
+        Path targetTestsDir = testdir.getEmptyPathDir();
         Files.createDirectories(targetTestsDir);
         Path file = Paths.get(targetTestsDir.toString(), "http_client_conversation.big");
-        try (OutputStream output = Files.newOutputStream(file, CREATE))
+        try (OutputStream output = Files.newOutputStream(file, StandardOpenOption.CREATE))
         {
             byte[] kb = new byte[1024];
             for (int i = 0; i < 10 * 1024; ++i)
@@ -857,7 +858,7 @@
     }
 
     @Test
-    public void testConnectThrowsUnresolvedAddressException() throws Exception
+    public void testConnectThrowsUnknownHostException() throws Exception
     {
         start(new EmptyServerHandler());
 
@@ -869,7 +870,8 @@
                     public void onComplete(Result result)
                     {
                         Assert.assertTrue(result.isFailed());
-                        Assert.assertTrue(result.getFailure() instanceof UnresolvedAddressException);
+                        Throwable failure = result.getFailure();
+                        Assert.assertTrue(failure instanceof UnknownHostException);
                         latch.countDown();
                     }
                 });
@@ -877,6 +879,54 @@
     }
 
     @Test
+    public void testConnectHostWithMultipleAddresses() throws Exception
+    {
+        String host = "google.com";
+        try
+        {
+            // Likely that the DNS for google.com returns multiple addresses.
+            Assume.assumeTrue(InetAddress.getAllByName(host).length > 1);
+        }
+        catch (Throwable x)
+        {
+            Assume.assumeNoException(x);
+        }
+
+        startClient();
+        client.setFollowRedirects(false); // Avoid redirects from 80 to 443.
+        client.setSocketAddressResolver(new SocketAddressResolver.Async(client.getExecutor(), client.getScheduler(), client.getConnectTimeout())
+        {
+            @Override
+            public void resolve(String host, int port, Promise<List<InetSocketAddress>> promise)
+            {
+                super.resolve(host, port, new Promise<List<InetSocketAddress>>()
+                {
+                    @Override
+                    public void succeeded(List<InetSocketAddress> result)
+                    {
+                        // Add as first address an invalid address so that we test
+                        // that the connect operation iterates over the addresses.
+                        result.add(0, new InetSocketAddress("idontexist", 80));
+                        promise.succeeded(result);
+                    }
+
+                    @Override
+                    public void failed(Throwable x)
+                    {
+                        promise.failed(x);
+                    }
+                });
+            }
+        });
+
+        // Response code may be 200 or 302;
+        // if no exceptions the test passes.
+        client.newRequest(host, 80)
+                .header(HttpHeader.CONNECTION, "close")
+                .send();
+    }
+
+    @Test
     public void testCustomUserAgent() throws Exception
     {
         final String userAgent = "Test/1.0";
@@ -1122,7 +1172,7 @@
             }
         });
 
-        final Exchanger<Response> ex = new Exchanger<Response>();
+        final Exchanger<Response> ex = new Exchanger<>();
         BufferingResponseListener listener = new BufferingResponseListener()
         {
             @Override
@@ -1369,7 +1419,7 @@
                 int count = requests.incrementAndGet();
                 if (count == maxRetries)
                     baseRequest.setHandled(true);
-                consume(request.getInputStream());
+                consume(request.getInputStream(), true);
             }
         });
 
@@ -1491,11 +1541,73 @@
         Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
     }
 
-    private void consume(InputStream input) throws IOException
+    @Test
+    public void testCONNECTWithHTTP10() throws Exception
     {
+        try (ServerSocket server = new ServerSocket(0))
+        {
+            startClient();
+
+            String host = "localhost";
+            int port = server.getLocalPort();
+
+            Request request = client.newRequest(host, port)
+                    .method(HttpMethod.CONNECT)
+                    .version(HttpVersion.HTTP_1_0);
+            FuturePromise<Connection> promise = new FuturePromise<>();
+            client.getDestination("http", host, port).newConnection(promise);
+            Connection connection = promise.get(5, TimeUnit.SECONDS);
+            FutureResponseListener listener = new FutureResponseListener(request);
+            connection.send(request, listener);
+
+            try (Socket socket = server.accept())
+            {
+                InputStream input = socket.getInputStream();
+                consume(input, false);
+
+                // HTTP/1.0 response, the client must not close the connection.
+                String httpResponse = "" +
+                        "HTTP/1.0 200 OK\r\n" +
+                        "\r\n";
+                OutputStream output = socket.getOutputStream();
+                output.write(httpResponse.getBytes(StandardCharsets.UTF_8));
+                output.flush();
+
+                ContentResponse response = listener.get(5, TimeUnit.SECONDS);
+                Assert.assertEquals(200, response.getStatus());
+
+                // Test that I can send another request on the same connection.
+                request = client.newRequest(host, port);
+                listener = new FutureResponseListener(request);
+                connection.send(request, listener);
+
+                consume(input, false);
+
+                httpResponse = "" +
+                        "HTTP/1.1 200 OK\r\n" +
+                        "Content-Length: 0\r\n" +
+                        "\r\n";
+                output.write(httpResponse.getBytes(StandardCharsets.UTF_8));
+                output.flush();
+
+                listener.get(5, TimeUnit.SECONDS);
+            }
+        }
+    }
+
+    private void consume(InputStream input, boolean eof) throws IOException
+    {
+        int crlfs = 0;
         while (true)
         {
-            if (input.read() < 0)
+            int read = input.read();
+            if (read == '\r' || read == '\n')
+                ++crlfs;
+            else
+                crlfs = 0;
+            if (!eof && crlfs == 4)
+                break;
+            if (read < 0)
                 break;
         }
     }
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientUploadDuringServerShutdown.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientUploadDuringServerShutdown.java
index 61e8cf5..b899a1f 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientUploadDuringServerShutdown.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientUploadDuringServerShutdown.java
@@ -272,7 +272,7 @@
         Assert.assertTrue(completeLatch.await(5, TimeUnit.SECONDS));
 
         HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination("http", "localhost", connector.getLocalPort());
-        ConnectionPool pool = destination.getConnectionPool();
+        DuplexConnectionPool pool = destination.getConnectionPool();
         Assert.assertEquals(0, pool.getConnectionCount());
         Assert.assertEquals(0, pool.getIdleConnections().size());
         Assert.assertEquals(0, pool.getActiveConnections().size());
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpConnectionLifecycleTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpConnectionLifecycleTest.java
index 368c5ab..f8cbb04 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpConnectionLifecycleTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpConnectionLifecycleTest.java
@@ -21,9 +21,10 @@
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
-import java.util.concurrent.BlockingQueue;
+import java.util.Queue;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -68,12 +69,12 @@
         String host = "localhost";
         int port = connector.getLocalPort();
         HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, host, port);
-        ConnectionPool connectionPool = destination.getConnectionPool();
+        DuplexConnectionPool connectionPool = destination.getConnectionPool();
 
-        final BlockingQueue<Connection> idleConnections = connectionPool.getIdleConnections();
+        final Queue<Connection> idleConnections = connectionPool.getIdleConnections();
         Assert.assertEquals(0, idleConnections.size());
 
-        final BlockingQueue<Connection> activeConnections = connectionPool.getActiveConnections();
+        final Queue<Connection> activeConnections = connectionPool.getActiveConnections();
         Assert.assertEquals(0, activeConnections.size());
 
         final CountDownLatch headersLatch = new CountDownLatch(1);
@@ -129,12 +130,12 @@
         String host = "localhost";
         int port = connector.getLocalPort();
         HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, host, port);
-        ConnectionPool connectionPool = destination.getConnectionPool();
+        DuplexConnectionPool connectionPool = destination.getConnectionPool();
 
-        final BlockingQueue<Connection> idleConnections = connectionPool.getIdleConnections();
+        final Queue<Connection> idleConnections = connectionPool.getIdleConnections();
         Assert.assertEquals(0, idleConnections.size());
 
-        final BlockingQueue<Connection> activeConnections = connectionPool.getActiveConnections();
+        final Queue<Connection> activeConnections = connectionPool.getActiveConnections();
         Assert.assertEquals(0, activeConnections.size());
 
         final CountDownLatch beginLatch = new CountDownLatch(1);
@@ -180,12 +181,12 @@
         String host = "localhost";
         int port = connector.getLocalPort();
         HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, host, port);
-        ConnectionPool connectionPool = destination.getConnectionPool();
+        DuplexConnectionPool connectionPool = destination.getConnectionPool();
 
-        final BlockingQueue<Connection> idleConnections = connectionPool.getIdleConnections();
+        final Queue<Connection> idleConnections = connectionPool.getIdleConnections();
         Assert.assertEquals(0, idleConnections.size());
 
-        final BlockingQueue<Connection> activeConnections = connectionPool.getActiveConnections();
+        final Queue<Connection> activeConnections = connectionPool.getActiveConnections();
         Assert.assertEquals(0, activeConnections.size());
 
         final CountDownLatch successLatch = new CountDownLatch(3);
@@ -240,12 +241,12 @@
         String host = "localhost";
         int port = connector.getLocalPort();
         HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, host, port);
-        ConnectionPool connectionPool = destination.getConnectionPool();
+        DuplexConnectionPool connectionPool = destination.getConnectionPool();
 
-        final BlockingQueue<Connection> idleConnections = connectionPool.getIdleConnections();
+        final Queue<Connection> idleConnections = connectionPool.getIdleConnections();
         Assert.assertEquals(0, idleConnections.size());
 
-        final BlockingQueue<Connection> activeConnections = connectionPool.getActiveConnections();
+        final Queue<Connection> activeConnections = connectionPool.getActiveConnections();
         Assert.assertEquals(0, activeConnections.size());
 
         final long delay = 1000;
@@ -313,12 +314,12 @@
         String host = "localhost";
         int port = connector.getLocalPort();
         HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, host, port);
-        ConnectionPool connectionPool = destination.getConnectionPool();
+        DuplexConnectionPool connectionPool = destination.getConnectionPool();
 
-        final BlockingQueue<Connection> idleConnections = connectionPool.getIdleConnections();
+        final Queue<Connection> idleConnections = connectionPool.getIdleConnections();
         Assert.assertEquals(0, idleConnections.size());
 
-        final BlockingQueue<Connection> activeConnections = connectionPool.getActiveConnections();
+        final Queue<Connection> activeConnections = connectionPool.getActiveConnections();
         Assert.assertEquals(0, activeConnections.size());
 
         server.stop();
@@ -366,12 +367,12 @@
         String host = "localhost";
         int port = connector.getLocalPort();
         HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, host, port);
-        ConnectionPool connectionPool = destination.getConnectionPool();
+        DuplexConnectionPool connectionPool = destination.getConnectionPool();
 
-        final BlockingQueue<Connection> idleConnections = connectionPool.getIdleConnections();
+        final Queue<Connection> idleConnections = connectionPool.getIdleConnections();
         Assert.assertEquals(0, idleConnections.size());
 
-        final BlockingQueue<Connection> activeConnections = connectionPool.getActiveConnections();
+        final Queue<Connection> activeConnections = connectionPool.getActiveConnections();
         Assert.assertEquals(0, activeConnections.size());
 
         final CountDownLatch latch = new CountDownLatch(1);
@@ -416,12 +417,12 @@
             String host = "localhost";
             int port = connector.getLocalPort();
             HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, host, port);
-            ConnectionPool connectionPool = destination.getConnectionPool();
+            DuplexConnectionPool connectionPool = destination.getConnectionPool();
 
-            final BlockingQueue<Connection> idleConnections = connectionPool.getIdleConnections();
+            final Queue<Connection> idleConnections = connectionPool.getIdleConnections();
             Assert.assertEquals(0, idleConnections.size());
 
-            final BlockingQueue<Connection> activeConnections = connectionPool.getActiveConnections();
+            final Queue<Connection> activeConnections = connectionPool.getActiveConnections();
             Assert.assertEquals(0, activeConnections.size());
 
             Log.getLogger(HttpConnection.class).info("Expecting java.lang.IllegalStateException: HttpParser{s=CLOSED,...");
@@ -448,7 +449,7 @@
 
             Assert.assertEquals(0, idleConnections.size());
             Assert.assertEquals(0, activeConnections.size());
-            
+
             server.stop();
         }
         finally
@@ -466,12 +467,12 @@
         String host = "localhost";
         int port = connector.getLocalPort();
         HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, host, port);
-        ConnectionPool connectionPool = destination.getConnectionPool();
+        DuplexConnectionPool connectionPool = destination.getConnectionPool();
 
-        final BlockingQueue<Connection> idleConnections = connectionPool.getIdleConnections();
+        final Queue<Connection> idleConnections = connectionPool.getIdleConnections();
         Assert.assertEquals(0, idleConnections.size());
 
-        final BlockingQueue<Connection> activeConnections = connectionPool.getActiveConnections();
+        final Queue<Connection> activeConnections = connectionPool.getActiveConnections();
         Assert.assertEquals(0, activeConnections.size());
 
         ContentResponse response = client.newRequest(host, port)
@@ -498,12 +499,12 @@
         String host = "localhost";
         int port = connector.getLocalPort();
         HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, host, port);
-        ConnectionPool connectionPool = destination.getConnectionPool();
+        DuplexConnectionPool connectionPool = destination.getConnectionPool();
 
-        final BlockingQueue<Connection> idleConnections = connectionPool.getIdleConnections();
+        final Queue<Connection> idleConnections = connectionPool.getIdleConnections();
         Assert.assertEquals(0, idleConnections.size());
 
-        final BlockingQueue<Connection> activeConnections = connectionPool.getActiveConnections();
+        final Queue<Connection> activeConnections = connectionPool.getActiveConnections();
         Assert.assertEquals(0, activeConnections.size());
 
         client.setStrictEventOrdering(false);
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpCookieTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpCookieTest.java
index 5fa3806..ec6a507 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpCookieTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpCookieTest.java
@@ -23,6 +23,7 @@
 import java.net.URI;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
+
 import javax.servlet.ServletException;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpRequestAbortTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpRequestAbortTest.java
index d40178d..45b78e7 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpRequestAbortTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpRequestAbortTest.java
@@ -88,7 +88,7 @@
         }
 
         HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, "localhost", connector.getLocalPort());
-        ConnectionPool connectionPool = destination.getConnectionPool();
+        DuplexConnectionPool connectionPool = destination.getConnectionPool();
         Assert.assertEquals(0, connectionPool.getConnectionCount());
         Assert.assertEquals(0, connectionPool.getActiveConnections().size());
         Assert.assertEquals(0, connectionPool.getIdleConnections().size());
@@ -135,7 +135,7 @@
         }
 
         HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, "localhost", connector.getLocalPort());
-        ConnectionPool connectionPool = destination.getConnectionPool();
+        DuplexConnectionPool connectionPool = destination.getConnectionPool();
         Assert.assertEquals(0, connectionPool.getConnectionCount());
         Assert.assertEquals(0, connectionPool.getActiveConnections().size());
         Assert.assertEquals(0, connectionPool.getIdleConnections().size());
@@ -182,7 +182,7 @@
         }
 
         HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, "localhost", connector.getLocalPort());
-        ConnectionPool connectionPool = destination.getConnectionPool();
+        DuplexConnectionPool connectionPool = destination.getConnectionPool();
         Assert.assertEquals(0, connectionPool.getConnectionCount());
         Assert.assertEquals(0, connectionPool.getActiveConnections().size());
         Assert.assertEquals(0, connectionPool.getIdleConnections().size());
@@ -225,7 +225,7 @@
         }
 
         HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, "localhost", connector.getLocalPort());
-        ConnectionPool connectionPool = destination.getConnectionPool();
+        DuplexConnectionPool connectionPool = destination.getConnectionPool();
         Assert.assertEquals(0, connectionPool.getConnectionCount());
         Assert.assertEquals(0, connectionPool.getActiveConnections().size());
         Assert.assertEquals(0, connectionPool.getIdleConnections().size());
@@ -289,7 +289,7 @@
         }
 
         HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, "localhost", connector.getLocalPort());
-        ConnectionPool connectionPool = destination.getConnectionPool();
+        DuplexConnectionPool connectionPool = destination.getConnectionPool();
         Assert.assertEquals(0, connectionPool.getConnectionCount());
         Assert.assertEquals(0, connectionPool.getActiveConnections().size());
         Assert.assertEquals(0, connectionPool.getIdleConnections().size());
@@ -344,7 +344,7 @@
         }
 
         HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, "localhost", connector.getLocalPort());
-        ConnectionPool connectionPool = destination.getConnectionPool();
+        DuplexConnectionPool connectionPool = destination.getConnectionPool();
         Assert.assertEquals(0, connectionPool.getConnectionCount());
         Assert.assertEquals(0, connectionPool.getActiveConnections().size());
         Assert.assertEquals(0, connectionPool.getIdleConnections().size());
@@ -454,7 +454,7 @@
         }
 
         HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination(scheme, "localhost", connector.getLocalPort());
-        ConnectionPool connectionPool = destination.getConnectionPool();
+        DuplexConnectionPool connectionPool = destination.getConnectionPool();
         Assert.assertEquals(0, connectionPool.getConnectionCount());
         Assert.assertEquals(0, connectionPool.getActiveConnections().size());
         Assert.assertEquals(0, connectionPool.getIdleConnections().size());
@@ -527,7 +527,7 @@
         final AtomicBoolean aborted = new AtomicBoolean();
         final CountDownLatch latch = new CountDownLatch(1);
         client.getProtocolHandlers().clear();
-        client.getProtocolHandlers().add(new RedirectProtocolHandler(client)
+        client.getProtocolHandlers().put(new RedirectProtocolHandler(client)
         {
             @Override
             public void onComplete(Result result)
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpResponseAbortTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpResponseAbortTest.java
index 7a22d12..64eafac 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpResponseAbortTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpResponseAbortTest.java
@@ -24,6 +24,7 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
+
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpResponseConcurrentAbortTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpResponseConcurrentAbortTest.java
index bc9fecb..29ed86b 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpResponseConcurrentAbortTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpResponseConcurrentAbortTest.java
@@ -24,6 +24,7 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
+
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -42,7 +43,8 @@
     private final CountDownLatch callbackLatch = new CountDownLatch(1);
     private final CountDownLatch failureLatch = new CountDownLatch(1);
     private final CountDownLatch completeLatch = new CountDownLatch(1);
-    private final AtomicBoolean success = new AtomicBoolean();
+    private final AtomicBoolean failureWasAsync = new AtomicBoolean();
+    private final AtomicBoolean completeWasSync = new AtomicBoolean();
 
     public HttpResponseConcurrentAbortTest(SslContextFactory sslContextFactory)
     {
@@ -66,8 +68,9 @@
                 })
                 .send(new TestResponseListener());
         Assert.assertTrue(callbackLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(completeLatch.await(6, TimeUnit.SECONDS));
-        Assert.assertTrue(success.get());
+        Assert.assertTrue(completeLatch.await(5, TimeUnit.SECONDS));
+        Assert.assertTrue(failureWasAsync.get());
+        Assert.assertTrue(completeWasSync.get());
     }
 
     @Test
@@ -89,7 +92,8 @@
                 .send(new TestResponseListener());
         Assert.assertTrue(callbackLatch.await(5, TimeUnit.SECONDS));
         Assert.assertTrue(completeLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(success.get());
+        Assert.assertTrue(failureWasAsync.get());
+        Assert.assertTrue(completeWasSync.get());
     }
 
     @Test
@@ -110,7 +114,8 @@
                 .send(new TestResponseListener());
         Assert.assertTrue(callbackLatch.await(5, TimeUnit.SECONDS));
         Assert.assertTrue(completeLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(success.get());
+        Assert.assertTrue(failureWasAsync.get());
+        Assert.assertTrue(completeWasSync.get());
     }
 
     @Test
@@ -141,7 +146,8 @@
                 .send(new TestResponseListener());
         Assert.assertTrue(callbackLatch.await(5, TimeUnit.SECONDS));
         Assert.assertTrue(completeLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(success.get());
+        Assert.assertTrue(failureWasAsync.get());
+        Assert.assertTrue(completeWasSync.get());
     }
 
     private void abort(final Response response)
@@ -157,14 +163,15 @@
 
         try
         {
-            // The failure callback must be executed asynchronously.
-            boolean latched = failureLatch.await(4, TimeUnit.SECONDS);
-            success.set(latched);
+            // The failure callback is executed asynchronously, but
+            // here we are within the context of another response
+            // callback, which should detect that a failure happened
+            // and therefore this thread should complete the response.
+            failureWasAsync.set(failureLatch.await(2, TimeUnit.SECONDS));
 
-            // The complete callback must not be executed
-            // until we return from this callback.
-            latched = completeLatch.await(1, TimeUnit.SECONDS);
-            success.set(!latched);
+            // The complete callback must be executed by this thread,
+            // after we return from this response callback.
+            completeWasSync.set(!completeLatch.await(1, TimeUnit.SECONDS));
 
             callbackLatch.countDown();
         }
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/RespondThenConsumeHandler.java b/jetty-client/src/test/java/org/eclipse/jetty/client/RespondThenConsumeHandler.java
new file mode 100644
index 0000000..149cd6b
--- /dev/null
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/RespondThenConsumeHandler.java
@@ -0,0 +1,45 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.client;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.server.handler.AbstractHandler;
+
+class RespondThenConsumeHandler extends AbstractHandler
+{
+    @Override
+    public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response)
+            throws IOException, ServletException
+    {
+        baseRequest.setHandled(true);
+        response.setContentLength(0);
+        response.setStatus(200);
+        response.flushBuffer();
+        
+        InputStream in = request.getInputStream();
+        while(in.read()>=0);
+    }
+    
+}
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/ServerConnectionCloseTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/ServerConnectionCloseTest.java
new file mode 100644
index 0000000..23d72de
--- /dev/null
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/ServerConnectionCloseTest.java
@@ -0,0 +1,176 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.client;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.client.api.Request;
+import org.eclipse.jetty.client.http.HttpClientTransportOverHTTP;
+import org.eclipse.jetty.client.http.HttpDestinationOverHTTP;
+import org.eclipse.jetty.client.util.FutureResponseListener;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.toolchain.test.TestTracker;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class ServerConnectionCloseTest
+{
+    @Rule
+    public final TestTracker tracker = new TestTracker();
+    private HttpClient client;
+
+    private void startClient() throws Exception
+    {
+        QueuedThreadPool clientThreads = new QueuedThreadPool();
+        clientThreads.setName("client");
+        client = new HttpClient(new HttpClientTransportOverHTTP(1), null);
+        client.setExecutor(clientThreads);
+        client.start();
+    }
+
+    @After
+    public void dispose() throws Exception
+    {
+        if (client != null)
+            client.stop();
+    }
+
+    @Test
+    public void testServerSendsConnectionCloseWithoutContent() throws Exception
+    {
+        testServerSendsConnectionClose(true, false, "");
+    }
+
+    @Test
+    public void testServerSendsConnectionCloseWithContent() throws Exception
+    {
+        testServerSendsConnectionClose(true, false, "data");
+    }
+
+    @Test
+    public void testServerSendsConnectionCloseWithChunkedContent() throws Exception
+    {
+        testServerSendsConnectionClose(true, true, "data");
+    }
+
+    @Test
+    public void testServerSendsConnectionCloseWithoutContentButDoesNotClose() throws Exception
+    {
+        testServerSendsConnectionClose(false, false, "");
+    }
+
+    @Test
+    public void testServerSendsConnectionCloseWithContentButDoesNotClose() throws Exception
+    {
+        testServerSendsConnectionClose(false, false, "data");
+    }
+
+    @Test
+    public void testServerSendsConnectionCloseWithChunkedContentButDoesNotClose() throws Exception
+    {
+        testServerSendsConnectionClose(false, true, "data");
+    }
+
+    private void testServerSendsConnectionClose(boolean shutdownOutput, boolean chunked, String content) throws Exception
+    {
+        ServerSocket server = new ServerSocket(0);
+        int port = server.getLocalPort();
+
+        startClient();
+
+        Request request = client.newRequest("localhost", port).path("/ctx/path");
+        FutureResponseListener listener = new FutureResponseListener(request);
+        request.send(listener);
+
+        Socket socket = server.accept();
+
+        InputStream input = socket.getInputStream();
+        consumeRequest(input);
+
+        OutputStream output = socket.getOutputStream();
+        String serverResponse = "" +
+                "HTTP/1.1 200 OK\r\n" +
+                "Connection: close\r\n";
+        if (chunked)
+        {
+            serverResponse += "" +
+                    "Transfer-Encoding: chunked\r\n" +
+                    "\r\n";
+                    for (int i = 0; i < 2; ++i)
+                    {
+                        serverResponse +=
+                                Integer.toHexString(content.length()) + "\r\n" +
+                                content + "\r\n";
+                    }
+            serverResponse += "" +
+                    "0\r\n" +
+                    "\r\n";
+        }
+        else
+        {
+            serverResponse += "Content-Length: " + content.length() + "\r\n";
+            serverResponse += "\r\n";
+            serverResponse += content;
+        }
+
+        output.write(serverResponse.getBytes("UTF-8"));
+        output.flush();
+        if (shutdownOutput)
+            socket.shutdownOutput();
+
+        ContentResponse response = listener.get(5, TimeUnit.SECONDS);
+        Assert.assertEquals(HttpStatus.OK_200, response.getStatus());
+
+        // Give some time to process the connection.
+        Thread.sleep(1000);
+
+        // Connection should have been removed from pool.
+        HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination("http", "localhost", port);
+        DuplexConnectionPool connectionPool = destination.getConnectionPool();
+        Assert.assertEquals(0, connectionPool.getConnectionCount());
+        Assert.assertEquals(0, connectionPool.getIdleConnectionCount());
+        Assert.assertEquals(0, connectionPool.getActiveConnectionCount());
+    }
+
+    private boolean consumeRequest(InputStream input) throws IOException
+    {
+        int crlfs = 0;
+        while (true)
+        {
+            int read = input.read();
+            if (read < 0)
+                return true;
+            if (read == '\r' || read == '\n')
+                ++crlfs;
+            else
+                crlfs = 0;
+            if (crlfs == 4)
+                return false;
+        }
+    }
+}
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/TLSServerConnectionCloseTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/TLSServerConnectionCloseTest.java
new file mode 100644
index 0000000..79a9cd1
--- /dev/null
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/TLSServerConnectionCloseTest.java
@@ -0,0 +1,213 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.client;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.concurrent.TimeUnit;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocket;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.client.api.Request;
+import org.eclipse.jetty.client.http.HttpClientTransportOverHTTP;
+import org.eclipse.jetty.client.http.HttpDestinationOverHTTP;
+import org.eclipse.jetty.client.util.FutureResponseListener;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.toolchain.test.TestTracker;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class TLSServerConnectionCloseTest
+{
+    @Parameterized.Parameters(name = "CloseMode: {0}")
+    public static Object[] parameters()
+    {
+        return new Object[]{CloseMode.NONE, CloseMode.CLOSE, CloseMode.ABRUPT};
+    }
+
+    @Rule
+    public final TestTracker tracker = new TestTracker();
+    private HttpClient client;
+    private final CloseMode closeMode;
+
+    public TLSServerConnectionCloseTest(CloseMode closeMode)
+    {
+        this.closeMode = closeMode;
+    }
+
+    private void startClient() throws Exception
+    {
+        SslContextFactory sslContextFactory = new SslContextFactory();
+        sslContextFactory.setEndpointIdentificationAlgorithm("");
+        sslContextFactory.setKeyStorePath("src/test/resources/keystore.jks");
+        sslContextFactory.setKeyStorePassword("storepwd");
+        sslContextFactory.setTrustStorePath("src/test/resources/truststore.jks");
+        sslContextFactory.setTrustStorePassword("storepwd");
+
+        QueuedThreadPool clientThreads = new QueuedThreadPool();
+        clientThreads.setName("client");
+        client = new HttpClient(new HttpClientTransportOverHTTP(1), sslContextFactory);
+        client.setExecutor(clientThreads);
+        client.start();
+    }
+
+    @After
+    public void dispose() throws Exception
+    {
+        if (client != null)
+            client.stop();
+    }
+
+    @Test
+    public void testServerSendsConnectionCloseWithoutContent() throws Exception
+    {
+        testServerSendsConnectionClose(false, "");
+    }
+
+    @Test
+    public void testServerSendsConnectionCloseWithContent() throws Exception
+    {
+        testServerSendsConnectionClose(false, "data");
+    }
+
+    @Test
+    public void testServerSendsConnectionCloseWithChunkedContent() throws Exception
+    {
+        testServerSendsConnectionClose(true, "data");
+    }
+
+    private void testServerSendsConnectionClose(boolean chunked, String content) throws Exception
+    {
+        ServerSocket server = new ServerSocket(0);
+        int port = server.getLocalPort();
+
+        startClient();
+
+        Request request = client.newRequest("localhost", port).scheme("https").path("/ctx/path");
+        FutureResponseListener listener = new FutureResponseListener(request);
+        request.send(listener);
+
+        Socket socket = server.accept();
+        SSLContext sslContext = client.getSslContextFactory().getSslContext();
+        SSLSocket sslSocket = (SSLSocket)sslContext.getSocketFactory().createSocket(socket, "localhost", port, false);
+        sslSocket.setUseClientMode(false);
+        sslSocket.startHandshake();
+
+        InputStream input = sslSocket.getInputStream();
+        consumeRequest(input);
+
+        OutputStream output = sslSocket.getOutputStream();
+        String serverResponse = "" +
+                "HTTP/1.1 200 OK\r\n" +
+                "Connection: close\r\n";
+        if (chunked)
+        {
+            serverResponse += "" +
+                    "Transfer-Encoding: chunked\r\n" +
+                    "\r\n";
+                    for (int i = 0; i < 2; ++i)
+                    {
+                        serverResponse +=
+                                Integer.toHexString(content.length()) + "\r\n" +
+                                content + "\r\n";
+                    }
+            serverResponse += "" +
+                    "0\r\n" +
+                    "\r\n";
+        }
+        else
+        {
+            serverResponse += "Content-Length: " + content.length() + "\r\n";
+            serverResponse += "\r\n";
+            serverResponse += content;
+        }
+
+        output.write(serverResponse.getBytes("UTF-8"));
+        output.flush();
+
+        switch (closeMode)
+        {
+            case NONE:
+            {
+                break;
+            }
+            case CLOSE:
+            {
+                sslSocket.close();
+                break;
+            }
+            case ABRUPT:
+            {
+                socket.shutdownOutput();
+                break;
+            }
+            default:
+            {
+                throw new IllegalStateException();
+            }
+        }
+
+        ContentResponse response = listener.get(5, TimeUnit.SECONDS);
+        Assert.assertEquals(HttpStatus.OK_200, response.getStatus());
+
+        // Give some time to process the connection.
+        Thread.sleep(1000);
+
+        // Connection should have been removed from pool.
+        HttpDestinationOverHTTP destination = (HttpDestinationOverHTTP)client.getDestination("http", "localhost", port);
+        DuplexConnectionPool connectionPool = destination.getConnectionPool();
+        Assert.assertEquals(0, connectionPool.getConnectionCount());
+        Assert.assertEquals(0, connectionPool.getIdleConnectionCount());
+        Assert.assertEquals(0, connectionPool.getActiveConnectionCount());
+    }
+
+    private boolean consumeRequest(InputStream input) throws IOException
+    {
+        int crlfs = 0;
+        while (true)
+        {
+            int read = input.read();
+            if (read < 0)
+                return true;
+            if (read == '\r' || read == '\n')
+                ++crlfs;
+            else
+                crlfs = 0;
+            if (crlfs == 4)
+                return false;
+        }
+    }
+
+    private enum CloseMode
+    {
+        NONE, CLOSE, ABRUPT
+    }
+}
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/ValidatingConnectionPoolTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/ValidatingConnectionPoolTest.java
new file mode 100644
index 0000000..a9ad817
--- /dev/null
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/ValidatingConnectionPoolTest.java
@@ -0,0 +1,204 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.client;
+
+import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.client.api.Request;
+import org.eclipse.jetty.client.http.HttpClientTransportOverHTTP;
+import org.eclipse.jetty.client.http.HttpDestinationOverHTTP;
+import org.eclipse.jetty.client.util.FutureResponseListener;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpHeaderValue;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ValidatingConnectionPoolTest extends AbstractHttpClientServerTest
+{
+    public ValidatingConnectionPoolTest(SslContextFactory sslContextFactory)
+    {
+        super(sslContextFactory);
+    }
+
+    @Override
+    protected void startClient() throws Exception
+    {
+        startClient(new ValidatingHttpClientTransportOverHTTP(1000));
+    }
+
+    @Test
+    public void testRequestAfterValidation() throws Exception
+    {
+        start(new EmptyServerHandler());
+
+        client.setMaxConnectionsPerDestination(1);
+
+        ContentResponse response = client.newRequest("localhost", connector.getLocalPort())
+                .scheme(scheme)
+                .send();
+        Assert.assertEquals(200, response.getStatus());
+
+        // The second request should be sent after the validating timeout.
+        response = client.newRequest("localhost", connector.getLocalPort())
+                .scheme(scheme)
+                .send();
+        Assert.assertEquals(200, response.getStatus());
+    }
+
+    @Test
+    public void testServerClosesConnectionAfterRedirectWithoutConnectionCloseHeader() throws Exception
+    {
+        start(new AbstractHandler()
+        {
+            @Override
+            public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+            {
+                baseRequest.setHandled(true);
+                if (target.endsWith("/redirect"))
+                {
+                    response.setStatus(HttpStatus.TEMPORARY_REDIRECT_307);
+                    response.setContentLength(0);
+                    response.setHeader(HttpHeader.LOCATION.asString(), scheme + "://localhost:" + connector.getLocalPort() + "/");
+                    response.flushBuffer();
+                    baseRequest.getHttpChannel().getEndPoint().shutdownOutput();
+                }
+                else
+                {
+                    response.setStatus(HttpStatus.OK_200);
+                    response.setContentLength(0);
+                    response.setHeader(HttpHeader.CONNECTION.asString(), HttpHeaderValue.CLOSE.asString());
+                }
+            }
+        });
+
+        ContentResponse response = client.newRequest("localhost", connector.getLocalPort())
+                .scheme(scheme)
+                .path("/redirect")
+                .send();
+        Assert.assertEquals(200, response.getStatus());
+    }
+
+    @Test
+    public void testServerClosesConnectionAfterResponseWithQueuedRequestWithMaxConnectionsWithConnectionCloseHeader() throws Exception
+    {
+        testServerClosesConnectionAfterResponseWithQueuedRequestWithMaxConnections(new AbstractHandler()
+        {
+            @Override
+            public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+            {
+                baseRequest.setHandled(true);
+                response.setStatus(HttpStatus.OK_200);
+                response.setContentLength(0);
+                response.setHeader(HttpHeader.CONNECTION.asString(), HttpHeaderValue.CLOSE.asString());
+            }
+        });
+    }
+
+    @Test
+    public void testServerClosesConnectionAfterResponseWithQueuedRequestWithMaxConnectionsWithoutConnectionCloseHeader() throws Exception
+    {
+        testServerClosesConnectionAfterResponseWithQueuedRequestWithMaxConnections(new AbstractHandler()
+        {
+            @Override
+            public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+            {
+                baseRequest.setHandled(true);
+                response.setStatus(HttpStatus.OK_200);
+                response.setContentLength(0);
+                response.flushBuffer();
+                baseRequest.getHttpChannel().getEndPoint().shutdownOutput();
+            }
+        });
+    }
+
+    private void testServerClosesConnectionAfterResponseWithQueuedRequestWithMaxConnections(Handler handler) throws Exception
+    {
+        start(handler);
+        client.setMaxConnectionsPerDestination(1);
+
+        final CountDownLatch latch = new CountDownLatch(1);
+        Request request1 = client.newRequest("localhost", connector.getLocalPort())
+                .scheme(scheme)
+                .path("/one")
+                .onRequestBegin(r ->
+                {
+                    try
+                    {
+                        latch.await();
+                    }
+                    catch (InterruptedException x)
+                    {
+                        r.abort(x);
+                    }
+                });
+        FutureResponseListener listener1 = new FutureResponseListener(request1);
+        request1.send(listener1);
+
+        Request request2 = client.newRequest("localhost", connector.getLocalPort())
+                .scheme(scheme)
+                .path("/two");
+        FutureResponseListener listener2 = new FutureResponseListener(request2);
+        request2.send(listener2);
+
+        // Now we have one request about to be sent, and one queued.
+
+        latch.countDown();
+
+        ContentResponse response1 = listener1.get(5, TimeUnit.SECONDS);
+        Assert.assertEquals(200, response1.getStatus());
+
+        ContentResponse response2 = listener2.get(5, TimeUnit.SECONDS);
+        Assert.assertEquals(200, response2.getStatus());
+    }
+
+    private static class ValidatingHttpClientTransportOverHTTP extends HttpClientTransportOverHTTP
+    {
+        private final long timeout;
+
+        public ValidatingHttpClientTransportOverHTTP(long timeout)
+        {
+            super(1);
+            this.timeout = timeout;
+        }
+
+        @Override
+        public HttpDestination newHttpDestination(Origin origin)
+        {
+            return new HttpDestinationOverHTTP(getHttpClient(), origin)
+            {
+                @Override
+                protected DuplexConnectionPool newConnectionPool(HttpClient client)
+                {
+                    return new ValidatingConnectionPool(this, client.getMaxConnectionsPerDestination(), this, client.getScheduler(), timeout);
+                }
+            };
+        }
+    }
+}
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/http/HttpDestinationOverHTTPTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/http/HttpDestinationOverHTTPTest.java
index 9b292e9..aa3b4f5 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/http/HttpDestinationOverHTTPTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/http/HttpDestinationOverHTTPTest.java
@@ -18,12 +18,13 @@
 
 package org.eclipse.jetty.client.http;
 
+import java.util.Queue;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.TimeUnit;
 
 import org.eclipse.jetty.client.AbstractHttpClientServerTest;
-import org.eclipse.jetty.client.ConnectionPool;
+import org.eclipse.jetty.client.DuplexConnectionPool;
 import org.eclipse.jetty.client.EmptyServerHandler;
 import org.eclipse.jetty.client.HttpClient;
 import org.eclipse.jetty.client.Origin;
@@ -62,7 +63,7 @@
         if (connection == null)
         {
             // There are no queued requests, so the newly created connection will be idle
-            connection = destination.getConnectionPool().getIdleConnections().poll(5, TimeUnit.SECONDS);
+            connection = timedPoll(destination.getConnectionPool().getIdleConnections(), 5, TimeUnit.SECONDS);
         }
         Assert.assertNotNull(connection);
     }
@@ -96,9 +97,9 @@
         HttpDestinationOverHTTP destination = new HttpDestinationOverHTTP(client, new Origin("http", "localhost", connector.getLocalPort()))
         {
             @Override
-            protected ConnectionPool newConnectionPool(HttpClient client)
+            protected DuplexConnectionPool newConnectionPool(HttpClient client)
             {
-                return new ConnectionPool(this, client.getMaxConnectionsPerDestination(), this)
+                return new DuplexConnectionPool(this, client.getMaxConnectionsPerDestination(), this)
                 {
                     @Override
                     protected void idleCreated(Connection connection)
@@ -132,10 +133,11 @@
 
         latch.countDown();
 
-        // There must be 2 idle connections
-        Connection connection = destination.getConnectionPool().getIdleConnections().poll(5, TimeUnit.SECONDS);
+        // There must be 2 idle connections.
+        Queue<Connection> idleConnections = destination.getConnectionPool().getIdleConnections();
+        Connection connection = timedPoll(idleConnections, 5, TimeUnit.SECONDS);
         Assert.assertNotNull(connection);
-        connection = destination.getConnectionPool().getIdleConnections().poll(5, TimeUnit.SECONDS);
+        connection = timedPoll(idleConnections, 5, TimeUnit.SECONDS);
         Assert.assertNotNull(connection);
     }
 
@@ -156,7 +158,7 @@
         // Acquire the connection to make it active
         Assert.assertSame(connection1, destination.acquire());
 
-        destination.process(connection1, false);
+        destination.process(connection1);
         destination.release(connection1);
 
         Connection connection2 = destination.acquire();
@@ -272,4 +274,17 @@
         destinationAfter = client.getDestination(scheme, host, port);
         Assert.assertNotSame(destinationBefore, destinationAfter);
     }
+
+    private Connection timedPoll(Queue<Connection> connections, long time, TimeUnit unit) throws InterruptedException
+    {
+        long start = System.nanoTime();
+        while (unit.toNanos(time) > System.nanoTime() - start)
+        {
+            Connection connection = connections.poll();
+            if (connection != null)
+                return connection;
+            TimeUnit.MILLISECONDS.sleep(5);
+        }
+        return connections.poll();
+    }
 }
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTPTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTPTest.java
index 3dbb7a7..e057cf3 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTPTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTPTest.java
@@ -30,7 +30,6 @@
 import org.eclipse.jetty.client.HttpRequest;
 import org.eclipse.jetty.client.HttpResponseException;
 import org.eclipse.jetty.client.Origin;
-import org.eclipse.jetty.client.api.Connection;
 import org.eclipse.jetty.client.api.Response;
 import org.eclipse.jetty.client.util.FutureResponseListener;
 import org.eclipse.jetty.http.HttpFields;
@@ -62,7 +61,8 @@
         client.start();
         destination = new HttpDestinationOverHTTP(client, new Origin("http", "localhost", 8080));
         endPoint = new ByteArrayEndPoint();
-        connection = new HttpConnectionOverHTTP(endPoint, destination, new Promise.Adapter<Connection>());
+        connection = new HttpConnectionOverHTTP(endPoint, destination, new Promise.Adapter<>());
+        endPoint.setConnection(connection);
     }
 
     @After
@@ -86,7 +86,7 @@
     @Test
     public void test_Receive_NoResponseContent() throws Exception
     {
-        endPoint.setInput("" +
+        endPoint.addInput("" +
                 "HTTP/1.1 200 OK\r\n" +
                 "Content-length: 0\r\n" +
                 "\r\n");
@@ -109,7 +109,7 @@
     public void test_Receive_ResponseContent() throws Exception
     {
         String content = "0123456789ABCDEF";
-        endPoint.setInput("" +
+        endPoint.addInput("" +
                 "HTTP/1.1 200 OK\r\n" +
                 "Content-length: " + content.length() + "\r\n" +
                 "\r\n" +
@@ -136,7 +136,7 @@
     {
         String content1 = "0123456789";
         String content2 = "ABCDEF";
-        endPoint.setInput("" +
+        endPoint.addInput("" +
                 "HTTP/1.1 200 OK\r\n" +
                 "Content-length: " + (content1.length() + content2.length()) + "\r\n" +
                 "\r\n" +
@@ -144,7 +144,7 @@
         HttpExchange exchange = newExchange();
         FutureResponseListener listener = (FutureResponseListener)exchange.getResponseListeners().get(0);
         connection.getHttpChannel().receive();
-        endPoint.setInputEOF();
+        endPoint.addInputEOF();
         connection.getHttpChannel().receive();
 
         try
@@ -161,7 +161,7 @@
     @Test
     public void test_Receive_ResponseContent_IdleTimeout() throws Exception
     {
-        endPoint.setInput("" +
+        endPoint.addInput("" +
                 "HTTP/1.1 200 OK\r\n" +
                 "Content-length: 1\r\n" +
                 "\r\n");
@@ -185,7 +185,7 @@
     @Test
     public void test_Receive_BadResponse() throws Exception
     {
-        endPoint.setInput("" +
+        endPoint.addInput("" +
                 "HTTP/1.1 200 OK\r\n" +
                 "Content-length: A\r\n" +
                 "\r\n");
@@ -207,7 +207,7 @@
     @Test
     public void test_FillInterested_RacingWith_BufferRelease() throws Exception
     {
-        connection = new HttpConnectionOverHTTP(endPoint, destination, new Promise.Adapter<Connection>())
+        connection = new HttpConnectionOverHTTP(endPoint, destination, new Promise.Adapter<>())
         {
             @Override
             protected HttpChannelOverHTTP newHttpChannel()
@@ -226,7 +226,7 @@
                                 // before fillInterested() is called.
                                 Assert.assertNull(getResponseBuffer());
                                 // Fill the endpoint so receive is called again.
-                                endPoint.setInput("X");
+                                endPoint.addInput("X");
                                 super.fillInterested();
                             }
                         };
@@ -234,9 +234,10 @@
                 };
             }
         };
+        endPoint.setConnection(connection);
 
         // Partial response to trigger the call to fillInterested().
-        endPoint.setInput("" +
+        endPoint.addInput("" +
                 "HTTP/1.1 200 OK\r\n" +
                 "Content-Length: 1\r\n" +
                 "\r\n");
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslBytesServerTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslBytesServerTest.java
index ca00519..8dd287f 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslBytesServerTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslBytesServerTest.java
@@ -56,8 +56,8 @@
 import org.eclipse.jetty.http.HttpParser;
 import org.eclipse.jetty.io.Connection;
 import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.ManagedSelector;
 import org.eclipse.jetty.io.SelectChannelEndPoint;
-import org.eclipse.jetty.io.SelectorManager.ManagedSelector;
 import org.eclipse.jetty.io.ssl.SslConnection;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.HttpConnection;
@@ -299,7 +299,7 @@
         closeClient(client);
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testHandshakeWithResumedSessionThenClose() throws Exception
     {
         // First socket will establish the SSL session
@@ -381,7 +381,7 @@
         Assert.assertThat(httpParses.get(), Matchers.lessThan(20));
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testHandshakeWithSplitBoundary() throws Exception
     {
         final SSLSocket client = newClient();
@@ -486,7 +486,7 @@
         }
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testClientHelloIncompleteThenReset() throws Exception
     {
         final SSLSocket client = newClient();
@@ -519,7 +519,7 @@
         client.close();
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testClientHelloThenReset() throws Exception
     {
         final SSLSocket client = newClient();
@@ -550,7 +550,7 @@
         client.close();
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testHandshakeThenReset() throws Exception
     {
         final SSLSocket client = newClient();
@@ -570,7 +570,7 @@
         client.close();
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testRequestIncompleteThenReset() throws Exception
     {
         final SSLSocket client = newClient();
@@ -612,7 +612,7 @@
         client.close();
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testRequestResponse() throws Exception
     {
         final SSLSocket client = newClient();
@@ -665,7 +665,7 @@
         closeClient(client);
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testHandshakeAndRequestOneByteAtATime() throws Exception
     {
         final SSLSocket client = newClient();
@@ -752,11 +752,11 @@
 
         // Check that we did not spin
         TimeUnit.MILLISECONDS.sleep(1000);
-        Assert.assertThat(sslFills.get(), Matchers.lessThan(1000));
+        Assert.assertThat(sslFills.get(), Matchers.lessThan(2000));
         Assert.assertThat(sslFlushes.get(), Matchers.lessThan(20));
         // An average of 958 httpParses is seen in standard Oracle JDK's
         // An average of 1183 httpParses is seen in OpenJDK JVMs.
-        Assert.assertThat(httpParses.get(), Matchers.lessThan(500));
+        Assert.assertThat(httpParses.get(), Matchers.lessThan(2000));
 
         client.close();
 
@@ -782,7 +782,7 @@
         }
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testRequestWithCloseAlertAndShutdown() throws Exception
     {
         // See next test on why we only run in Linux
@@ -850,7 +850,7 @@
         Assert.assertThat(httpParses.get(), Matchers.lessThan(20));
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testRequestWithCloseAlert() throws Exception
     {
         // Currently we are ignoring this test on anything other then linux
@@ -930,7 +930,7 @@
         proxy.flushToServer(record);
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testRequestWithRawClose() throws Exception
     {
         final SSLSocket client = newClient();
@@ -989,7 +989,7 @@
         client.close();
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testRequestWithImmediateRawClose() throws Exception
     {
         final SSLSocket client = newClient();
@@ -1046,7 +1046,7 @@
         client.close();
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testRequestWithBigContentWriteBlockedThenReset() throws Exception
     {
         // Don't run on Windows (buggy JVM)
@@ -1107,7 +1107,7 @@
         client.close();
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testRequestWithBigContentReadBlockedThenReset() throws Exception
     {
         // Don't run on Windows (buggy JVM)
@@ -1163,7 +1163,7 @@
         client.close();
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testRequestWithCloseAlertWithSplitBoundary() throws Exception
     {
         if (!OS.IS_LINUX)
@@ -1251,7 +1251,7 @@
         Assert.assertThat(httpParses.get(), Matchers.lessThan(20));
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testRequestWithContentWithSplitBoundary() throws Exception
     {
         final SSLSocket client = newClient();
@@ -1314,7 +1314,7 @@
         closeClient(client);
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testRequestWithBigContentWithSplitBoundary() throws Exception
     {
         final SSLSocket client = newClient();
@@ -1362,8 +1362,8 @@
 
         // Check that we did not spin
         TimeUnit.MILLISECONDS.sleep(500);
-        Assert.assertThat(sslFills.get(), Matchers.lessThan(50));
-        Assert.assertThat(sslFlushes.get(), Matchers.lessThan(20));
+        Assert.assertThat(sslFills.get(), Matchers.lessThan(100));
+        Assert.assertThat(sslFlushes.get(), Matchers.lessThan(50));
         Assert.assertThat(httpParses.get(), Matchers.lessThan(100));
 
         Assert.assertNull(request.get(5, TimeUnit.SECONDS));
@@ -1384,8 +1384,8 @@
 
         // Check that we did not spin
         TimeUnit.MILLISECONDS.sleep(500);
-        Assert.assertThat(sslFills.get(), Matchers.lessThan(50));
-        Assert.assertThat(sslFlushes.get(), Matchers.lessThan(20));
+        Assert.assertThat(sslFills.get(), Matchers.lessThan(100));
+        Assert.assertThat(sslFlushes.get(), Matchers.lessThan(50));
         Assert.assertThat(httpParses.get(), Matchers.lessThan(100));
 
         closeClient(client);
@@ -1485,7 +1485,7 @@
         client.close();
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testRequestWithBigContentWithRenegotiationInMiddleOfContent() throws Exception
     {
         assumeJavaVersionSupportsTLSRenegotiations();
@@ -1781,7 +1781,7 @@
         closeClient(client);
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testServerShutdownOutputClientDoesNotCloseServerCloses() throws Exception
     {
         final SSLSocket client = newClient();
@@ -1835,7 +1835,7 @@
         Assert.assertFalse(serverEndPoint.get().isOpen());
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testPlainText() throws Exception
     {
         final SSLSocket client = newClient();
@@ -1866,7 +1866,7 @@
         client.close();
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testRequestConcurrentWithIdleExpiration() throws Exception
     {
         final SSLSocket client = newClient();
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/util/MultiPartContentProviderTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/util/MultiPartContentProviderTest.java
new file mode 100644
index 0000000..4ae83b2
--- /dev/null
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/util/MultiPartContentProviderTest.java
@@ -0,0 +1,439 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.client.util;
+
+import java.io.BufferedWriter;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.MultipartConfigElement;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.Part;
+
+import org.eclipse.jetty.client.AbstractHttpClientServerTest;
+import org.eclipse.jetty.client.api.ContentProvider;
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class MultiPartContentProviderTest extends AbstractHttpClientServerTest
+{
+    public MultiPartContentProviderTest(SslContextFactory sslContextFactory)
+    {
+        super(sslContextFactory);
+    }
+
+    @Test
+    public void testEmptyMultiPart() throws Exception
+    {
+        start(new AbstractMultiPartHandler()
+        {
+            @Override
+            protected void handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                Collection<Part> parts = request.getParts();
+                Assert.assertEquals(0, parts.size());
+            }
+        });
+
+        MultiPartContentProvider multiPart = new MultiPartContentProvider();
+        ContentResponse response = client.newRequest("localhost", connector.getLocalPort())
+                .scheme(scheme)
+                .method(HttpMethod.POST)
+                .content(multiPart)
+                .send();
+
+        Assert.assertEquals(200, response.getStatus());
+    }
+
+    @Test
+    public void testSimpleField() throws Exception
+    {
+        String name = "field";
+        String value = "value";
+        start(new AbstractMultiPartHandler()
+        {
+            @Override
+            protected void handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                Collection<Part> parts = request.getParts();
+                Assert.assertEquals(1, parts.size());
+                Part part = parts.iterator().next();
+                Assert.assertEquals(name, part.getName());
+                Assert.assertEquals(value, IO.toString(part.getInputStream()));
+            }
+        });
+
+        MultiPartContentProvider multiPart = new MultiPartContentProvider();
+        multiPart.addFieldPart(name, new StringContentProvider(value), null);
+        ContentResponse response = client.newRequest("localhost", connector.getLocalPort())
+                .scheme(scheme)
+                .method(HttpMethod.POST)
+                .content(multiPart)
+                .send();
+
+        Assert.assertEquals(200, response.getStatus());
+    }
+
+    @Test
+    public void testFieldWithOverridenContentType() throws Exception
+    {
+        String name = "field";
+        String value = "\u00e8";
+        Charset encoding = StandardCharsets.ISO_8859_1;
+        start(new AbstractMultiPartHandler()
+        {
+            @Override
+            protected void handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                Collection<Part> parts = request.getParts();
+                Assert.assertEquals(1, parts.size());
+                Part part = parts.iterator().next();
+                Assert.assertEquals(name, part.getName());
+                String contentType = part.getContentType();
+                Assert.assertNotNull(contentType);
+                int equal = contentType.lastIndexOf('=');
+                Charset charset = Charset.forName(contentType.substring(equal + 1));
+                Assert.assertEquals(encoding, charset);
+                Assert.assertEquals(value, IO.toString(part.getInputStream(), charset));
+            }
+        });
+
+        MultiPartContentProvider multiPart = new MultiPartContentProvider();
+        HttpFields fields = new HttpFields();
+        fields.put(HttpHeader.CONTENT_TYPE, "text/plain;charset=" + encoding.name());
+        BytesContentProvider content = new BytesContentProvider(value.getBytes(encoding));
+        multiPart.addFieldPart(name, content, fields);
+        ContentResponse response = client.newRequest("localhost", connector.getLocalPort())
+                .scheme(scheme)
+                .method(HttpMethod.POST)
+                .content(multiPart)
+                .send();
+
+        Assert.assertEquals(200, response.getStatus());
+    }
+
+    @Test
+    public void testFieldDeferred() throws Exception
+    {
+        String name = "field";
+        byte[] data = "Hello, World".getBytes(StandardCharsets.US_ASCII);
+        start(new AbstractMultiPartHandler()
+        {
+            @Override
+            protected void handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                Collection<Part> parts = request.getParts();
+                Assert.assertEquals(1, parts.size());
+                Part part = parts.iterator().next();
+                Assert.assertEquals(name, part.getName());
+                Assert.assertEquals("text/plain", part.getContentType());
+                Assert.assertArrayEquals(data, IO.readBytes(part.getInputStream()));
+            }
+        });
+
+        MultiPartContentProvider multiPart = new MultiPartContentProvider();
+        DeferredContentProvider content = new DeferredContentProvider();
+        multiPart.addFieldPart(name, content, null);
+        CountDownLatch responseLatch = new CountDownLatch(1);
+        client.newRequest("localhost", connector.getLocalPort())
+                .scheme(scheme)
+                .method(HttpMethod.POST)
+                .content(multiPart)
+                .send(result ->
+                {
+                    if (result.isSucceeded())
+                    {
+                        Assert.assertEquals(200, result.getResponse().getStatus());
+                        responseLatch.countDown();
+                    }
+                });
+
+        // Wait until the request has been sent.
+        Thread.sleep(1000);
+
+        // Provide the content.
+        content.offer(ByteBuffer.wrap(data));
+        content.close();
+
+        Assert.assertTrue(responseLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testFileFromInputStream() throws Exception
+    {
+        String name = "file";
+        String fileName = "upload.png";
+        String contentType = "image/png";
+        byte[] data = new byte[512];
+        new Random().nextBytes(data);
+        start(new AbstractMultiPartHandler()
+        {
+            @Override
+            protected void handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                Collection<Part> parts = request.getParts();
+                Assert.assertEquals(1, parts.size());
+                Part part = parts.iterator().next();
+                Assert.assertEquals(name, part.getName());
+                Assert.assertEquals(contentType, part.getContentType());
+                Assert.assertEquals(fileName, part.getSubmittedFileName());
+                Assert.assertEquals(data.length, part.getSize());
+                Assert.assertArrayEquals(data, IO.readBytes(part.getInputStream()));
+            }
+        });
+
+        CountDownLatch closeLatch = new CountDownLatch(1);
+        MultiPartContentProvider multiPart = new MultiPartContentProvider();
+        InputStreamContentProvider content = new InputStreamContentProvider(new ByteArrayInputStream(data)
+        {
+            @Override
+            public void close() throws IOException
+            {
+                super.close();
+                closeLatch.countDown();
+            }
+        });
+        HttpFields fields = new HttpFields();
+        fields.put(HttpHeader.CONTENT_TYPE, contentType);
+        multiPart.addFilePart(name, fileName, content, fields);
+        ContentResponse response = client.newRequest("localhost", connector.getLocalPort())
+                .scheme(scheme)
+                .method(HttpMethod.POST)
+                .content(multiPart)
+                .send();
+
+        Assert.assertTrue(closeLatch.await(5, TimeUnit.SECONDS));
+        Assert.assertEquals(200, response.getStatus());
+    }
+
+    @Test
+    public void testFileFromPath() throws Exception
+    {
+        // Prepare a file to upload.
+        String data = "multipart_test_\u20ac";
+        Path tmpDir = MavenTestingUtils.getTargetTestingPath();
+        Path tmpPath = Files.createTempFile(tmpDir, "multipart_", ".txt");
+        Charset encoding = StandardCharsets.UTF_8;
+        try (BufferedWriter writer = Files.newBufferedWriter(tmpPath, encoding, StandardOpenOption.CREATE))
+        {
+            writer.write(data);
+        }
+
+        String name = "file";
+        String contentType = "text/plain; charset=" + encoding.name();
+        start(new AbstractMultiPartHandler()
+        {
+            @Override
+            protected void handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                Collection<Part> parts = request.getParts();
+                Assert.assertEquals(1, parts.size());
+                Part part = parts.iterator().next();
+                Assert.assertEquals(name, part.getName());
+                Assert.assertEquals(contentType, part.getContentType());
+                Assert.assertEquals(tmpPath.getFileName().toString(), part.getSubmittedFileName());
+                Assert.assertEquals(Files.size(tmpPath), part.getSize());
+                Assert.assertEquals(data, IO.toString(part.getInputStream(), encoding));
+            }
+        });
+
+        MultiPartContentProvider multiPart = new MultiPartContentProvider();
+        ContentProvider content = new PathContentProvider(contentType, tmpPath);
+        multiPart.addFilePart(name, tmpPath.getFileName().toString(), content, null);
+        ContentResponse response = client.newRequest("localhost", connector.getLocalPort())
+                .scheme(scheme)
+                .method(HttpMethod.POST)
+                .content(multiPart)
+                .send();
+
+        Assert.assertEquals(200, response.getStatus());
+
+        Files.delete(tmpPath);
+    }
+
+    @Test
+    public void testFieldWithFile() throws Exception
+    {
+        // Prepare a file to upload.
+        byte[] data = new byte[1024];
+        new Random().nextBytes(data);
+        Path tmpDir = MavenTestingUtils.getTargetTestingPath();
+        Path tmpPath = Files.createTempFile(tmpDir, "multipart_", ".txt");
+        try (OutputStream output = Files.newOutputStream(tmpPath, StandardOpenOption.CREATE))
+        {
+            output.write(data);
+        }
+
+        String field = "field";
+        String value = "\u20ac";
+        String fileField = "file";
+        Charset encoding = StandardCharsets.UTF_8;
+        String contentType = "text/plain;charset=" + encoding.name();
+        String headerName = "foo";
+        String headerValue = "bar";
+        start(new AbstractMultiPartHandler()
+        {
+            @Override
+            protected void handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                List<Part> parts = new ArrayList<>(request.getParts());
+                Assert.assertEquals(2, parts.size());
+                Part fieldPart = parts.get(0);
+                Part filePart = parts.get(1);
+                if (!field.equals(fieldPart.getName()))
+                {
+                    Part swap = filePart;
+                    filePart = fieldPart;
+                    fieldPart = swap;
+                }
+
+                Assert.assertEquals(field, fieldPart.getName());
+                Assert.assertEquals(contentType, fieldPart.getContentType());
+                Assert.assertEquals(value, IO.toString(fieldPart.getInputStream(), encoding));
+                Assert.assertEquals(headerValue, fieldPart.getHeader(headerName));
+
+                Assert.assertEquals(fileField, filePart.getName());
+                Assert.assertEquals("application/octet-stream", filePart.getContentType());
+                Assert.assertEquals(tmpPath.getFileName().toString(), filePart.getSubmittedFileName());
+                Assert.assertEquals(Files.size(tmpPath), filePart.getSize());
+                Assert.assertArrayEquals(data, IO.readBytes(filePart.getInputStream()));
+            }
+        });
+
+        MultiPartContentProvider multiPart = new MultiPartContentProvider();
+        HttpFields fields = new HttpFields();
+        fields.put(headerName, headerValue);
+        multiPart.addFieldPart(field, new StringContentProvider(value, encoding), fields);
+        multiPart.addFilePart(fileField, tmpPath.getFileName().toString(), new PathContentProvider(tmpPath), null);
+        ContentResponse response = client.newRequest("localhost", connector.getLocalPort())
+                .scheme(scheme)
+                .method(HttpMethod.POST)
+                .content(multiPart)
+                .send();
+
+        Assert.assertEquals(200, response.getStatus());
+
+        Files.delete(tmpPath);
+    }
+
+    @Test
+    public void testFieldDeferredAndFileDeferred() throws Exception
+    {
+        String value = "text";
+        Charset encoding = StandardCharsets.US_ASCII;
+        byte[] fileData = new byte[1024];
+        new Random().nextBytes(fileData);
+        start(new AbstractMultiPartHandler()
+        {
+            @Override
+            protected void handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                List<Part> parts = new ArrayList<>(request.getParts());
+                Assert.assertEquals(2, parts.size());
+                Part fieldPart = parts.get(0);
+                Part filePart = parts.get(1);
+                if (!"field".equals(fieldPart.getName()))
+                {
+                    Part swap = filePart;
+                    filePart = fieldPart;
+                    fieldPart = swap;
+                }
+
+                Assert.assertEquals(value, IO.toString(fieldPart.getInputStream(), encoding));
+
+                Assert.assertEquals("file", filePart.getName());
+                Assert.assertEquals("application/octet-stream", filePart.getContentType());
+                Assert.assertEquals("fileName", filePart.getSubmittedFileName());
+                Assert.assertArrayEquals(fileData, IO.readBytes(filePart.getInputStream()));
+            }
+        });
+
+        MultiPartContentProvider multiPart = new MultiPartContentProvider();
+        DeferredContentProvider fieldContent = new DeferredContentProvider();
+        multiPart.addFieldPart("field", fieldContent, null);
+        DeferredContentProvider fileContent = new DeferredContentProvider();
+        multiPart.addFilePart("file", "fileName", fileContent, null);
+        CountDownLatch responseLatch = new CountDownLatch(1);
+        client.newRequest("localhost", connector.getLocalPort())
+                .scheme(scheme)
+                .method(HttpMethod.POST)
+                .content(multiPart)
+                .send(result ->
+                {
+                    if (result.isSucceeded())
+                    {
+                        Assert.assertEquals(200, result.getResponse().getStatus());
+                        responseLatch.countDown();
+                    }
+                });
+
+        // Wait until the request has been sent.
+        Thread.sleep(1000);
+
+        // Provide the content, in reversed part order.
+        fileContent.offer(ByteBuffer.wrap(fileData));
+        fileContent.close();
+
+        Thread.sleep(1000);
+
+        fieldContent.offer(encoding.encode(value));
+        fieldContent.close();
+
+        Assert.assertTrue(responseLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    private static abstract class AbstractMultiPartHandler extends AbstractHandler
+    {
+        @Override
+        public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+        {
+            baseRequest.setHandled(true);
+            File tmpDir = MavenTestingUtils.getTargetTestingDir();
+            request.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, new MultipartConfigElement(tmpDir.getAbsolutePath()));
+            handle(request, response);
+        }
+
+        protected abstract void handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
+    }
+}
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/util/TypedContentProviderTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/util/TypedContentProviderTest.java
index 3cdc6fc..6d7f096 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/util/TypedContentProviderTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/util/TypedContentProviderTest.java
@@ -20,6 +20,7 @@
 
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
+
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
diff --git a/jetty-continuation/pom.xml b/jetty-continuation/pom.xml
index 1a51dbb..7b4a7df 100644
--- a/jetty-continuation/pom.xml
+++ b/jetty-continuation/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-continuation</artifactId>
@@ -15,35 +15,6 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-           </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>artifact-jar</id>
-            <goals>
-              <goal>jar</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
         <configuration>
diff --git a/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/Continuation.java b/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/Continuation.java
index 0d71b81..a6ff70e 100644
--- a/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/Continuation.java
+++ b/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/Continuation.java
@@ -18,12 +18,15 @@
 
 package org.eclipse.jetty.continuation;
 
+import javax.servlet.FilterChain;
+import javax.servlet.Servlet;
+import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
+import javax.servlet.ServletResponseWrapper;
 
-/* ------------------------------------------------------------ */
 /**
  * Continuation.
- * 
+ * <p> 
  * A continuation is a mechanism by which a HTTP Request can be suspended and
  * restarted after a timeout or an asynchronous event has occurred.
  * <p>
@@ -48,7 +51,7 @@
  * <p>
  * There are two distinct style of operation of the continuation API.
  * </p>
- * <h3>Suspend/Resume Usage</h3> 
+ * <h1>Suspend/Resume Usage</h1> 
  * <p>The suspend/resume style is used when a servlet and/or
  * filter is used to generate the response after a asynchronous wait that is
  * terminated by an asynchronous handler.
@@ -83,7 +86,7 @@
  *     response.getOutputStream().write(process(results));
  *   }
  * </pre> 
- * <h3>Suspend/Complete Usage</h3> 
+ * <h1>Suspend/Complete Usage</h1> 
  * <p>
  * The suspend/complete style is used when an asynchronous handler is used to 
  * generate the response:
@@ -148,7 +151,7 @@
      * @param timeoutMs
      *            The time in milliseconds to wait before expiring this
      *            continuation after a call to {@link #suspend()} or {@link #suspend(ServletResponse)}.
-     *            A timeout of <=0 means the continuation will never expire.
+     *            A timeout of &lt;=0 means the continuation will never expire.
      */
     void setTimeout(long timeoutMs);
 
@@ -160,8 +163,8 @@
      * <p>
      * After this method has been called, the lifecycle of the request will be
      * extended beyond the return to the container from the
-     * {@link Servlet#service(ServletRequest, ServletResponse)} method and
-     * {@link Filter#doFilter(ServletRequest, ServletResponse, FilterChain)}
+     * {@link javax.servlet.Servlet#service(ServletRequest, ServletResponse)} method and
+     * {@link javax.servlet.Filter#doFilter(ServletRequest, ServletResponse, FilterChain)}
      * calls. When a suspended request is returned to the container after
      * a dispatch, then the container will not commit the associated response
      * (unless an exception other than {@link ContinuationThrowable} is thrown).
@@ -196,8 +199,8 @@
      * <p>
      * After this method has been called, the lifecycle of the request will be
      * extended beyond the return to the container from the
-     * {@link Servlet#service(ServletRequest, ServletResponse)} method and
-     * {@link Filter#doFilter(ServletRequest, ServletResponse, FilterChain)}
+     * {@link javax.servlet.Servlet#service(ServletRequest, ServletResponse)} method and
+     * {@link javax.servlet.Filter#doFilter(ServletRequest, ServletResponse, FilterChain)}
      * calls. When a suspended request is returned to the container after
      * a dispatch, then the container will not commit the associated response
      * (unless an exception other than {@link ContinuationThrowable} is thrown).
@@ -361,7 +364,7 @@
     /** 
      * Add a ContinuationListener.
      * 
-     * @param listener
+     * @param listener the listener
      */
     void addContinuationListener(ContinuationListener listener);
     
diff --git a/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/ContinuationListener.java b/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/ContinuationListener.java
index 5d81cf4..f30d5d3 100644
--- a/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/ContinuationListener.java
+++ b/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/ContinuationListener.java
@@ -20,13 +20,13 @@
 
 import java.util.EventListener;
 
+import javax.servlet.ServletRequestListener;
 
-/* ------------------------------------------------------------ */
-/** A Continuation Listener
+/** 
+ * A Continuation Listener
  * <p>
  * A ContinuationListener may be registered with a call to
  * {@link Continuation#addContinuationListener(ContinuationListener)}.
- *
  */
 public interface ContinuationListener extends EventListener
 {
@@ -36,7 +36,7 @@
      * any calls to {@link ServletRequestListener#requestDestroyed(javax.servlet.ServletRequestEvent)}
      * The response may still be written to during the call.
      *
-     * @param continuation
+     * @param continuation the continuation
      */
     public void onComplete(Continuation continuation);
 
@@ -46,7 +46,7 @@
      * The response may be written to and the methods
      * {@link Continuation#resume()} or {@link Continuation#complete()}
      * may be called by a onTimeout implementation,
-     * @param continuation
+     * @param continuation the continuation
      */
     public void onTimeout(Continuation continuation);
 
diff --git a/jetty-deploy/pom.xml b/jetty-deploy/pom.xml
index 6be3023..babc83e 100644
--- a/jetty-deploy/pom.xml
+++ b/jetty-deploy/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-deploy</artifactId>
@@ -15,53 +15,6 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-                <Import-Package>org.eclipse.jetty.jmx.*;version="9.1";resolution:=optional,*</Import-Package>
-                <_nouses>true</_nouses>
-              </instructions>
-            </configuration>
-           </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <!--
-        Required for OSGI
-        -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
         <configuration>
diff --git a/jetty-deploy/src/main/config/etc/jetty-deploy.xml b/jetty-deploy/src/main/config/etc/jetty-deploy.xml
index 6dfc7e5..4544362 100644
--- a/jetty-deploy/src/main/config/etc/jetty-deploy.xml
+++ b/jetty-deploy/src/main/config/etc/jetty-deploy.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Create the deployment manager                                   -->
@@ -39,7 +39,7 @@
         <Call id="webappprovider" name="addAppProvider">
           <Arg>
             <New class="org.eclipse.jetty.deploy.providers.WebAppProvider">
-              <Set name="monitoredDirName"><Property name="jetty.base" default="." />/<Property name="jetty.deploy.monitoredDirName" default="webapps"/></Set>
+              <Set name="monitoredDirName"><Property name="jetty.base" default="." />/<Property name="jetty.deploy.monitoredDir" deprecated="jetty.deploy.monitoredDirName" default="webapps"/></Set>
               <Set name="defaultsDescriptor"><Property name="jetty.home" default="." />/etc/webdefault.xml</Set>
               <Set name="scanInterval"><Property name="jetty.deploy.scanInterval" default="1"/></Set>
               <Set name="extractWars"><Property name="jetty.deploy.extractWars" default="true"/></Set>
diff --git a/jetty-deploy/src/main/config/modules/deploy.mod b/jetty-deploy/src/main/config/modules/deploy.mod
index f16b3f2..f567a20 100644
--- a/jetty-deploy/src/main/config/modules/deploy.mod
+++ b/jetty-deploy/src/main/config/modules/deploy.mod
@@ -15,7 +15,11 @@
 etc/jetty-deploy.xml
 
 [ini-template]
-## DeployManager configuration
-# Monitored Directory name (relative to jetty.base)
-# jetty.deploy.monitoredDirName=webapps
+# Monitored directory name (relative to $jetty.base)
+# jetty.deploy.monitoredDir=webapps
 
+# Monitored directory scan period (seconds)
+# jetty.deploy.scanInterval=1
+
+# Whether to extract *.war files
+# jetty.deploy.extractWars=true
diff --git a/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/App.java b/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/App.java
index 64395e1..c3fc58b 100644
--- a/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/App.java
+++ b/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/App.java
@@ -34,6 +34,8 @@
     /**
      * Create an App with specified Origin ID and archivePath
      * 
+     * @param manager the deployment manager 
+     * @param provider the app provider
      * @param originId
      *            the origin ID (The ID that the {@link AppProvider} knows
      *            about)
@@ -50,6 +52,8 @@
     /**
      * Create an App with specified Origin ID and archivePath
      * 
+     * @param manager the deployment manager 
+     * @param provider the app provider
      * @param originId
      *            the origin ID (The ID that the {@link AppProvider} knows
      *            about)
@@ -92,7 +96,7 @@
      * @return the {@link ContextHandler} to use for the App when fully started.
      *         (Portions of which might be ignored when App is not yet 
      *         {@link AppLifeCycle#DEPLOYED} or {@link AppLifeCycle#STARTED})
-     * @throws Exception
+     * @throws Exception if unable to get the context handler
      */
     public ContextHandler getContextHandler() throws Exception
     {
diff --git a/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/AppLifeCycle.java b/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/AppLifeCycle.java
index 428c683..80a9280 100644
--- a/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/AppLifeCycle.java
+++ b/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/AppLifeCycle.java
@@ -32,11 +32,11 @@
 
 /**
  * The lifecycle of an App in the {@link DeploymentManager}.
- * 
+ * <p>
  * Setups a the default {@link Graph}, and manages the bindings to the life cycle via the {@link AppLifeCycle.Binding}
  * annotation.
  * <p>
- * <img src="doc-files/AppLifeCycle.png">
+ * <img alt="app lifecycle graph" src="doc-files/AppLifeCycle.png">
  */
 public class AppLifeCycle extends Graph
 {
@@ -144,6 +144,7 @@
     /**
      * Get all objects bound to a specific {@link Node}
      * 
+     * @param node the deployment graph node 
      * @return Set of Object(s) for specific lifecycle bindings. never null.
      */
     public Set<AppLifeCycle.Binding> getBindings(Node node)
@@ -154,6 +155,7 @@
     /**
      * Get all objects bound to a specific {@link Node}
      * 
+     * @param nodeName the node name 
      * @return Set of Object(s) for specific lifecycle bindings. never null.
      */
     public Set<AppLifeCycle.Binding> getBindings(String nodeName)
diff --git a/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/AppProvider.java b/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/AppProvider.java
index a60b32e..ca151c9 100644
--- a/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/AppProvider.java
+++ b/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/AppProvider.java
@@ -18,6 +18,8 @@
 
 package org.eclipse.jetty.deploy;
 
+import java.io.IOException;
+
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.util.component.LifeCycle;
 
@@ -29,7 +31,7 @@
     /**
      * Set the Deployment Manager
      * 
-     * @param deploymentManager
+     * @param deploymentManager the deployment manager
      * @throws IllegalStateException
      *             if the provider {@link #isRunning()}.
      */
@@ -39,8 +41,8 @@
     /** Create a ContextHandler for an App
      * @param app The App
      * @return A ContextHandler
-     * @throws IOException
-     * @throws Exception 
+     * @throws IOException if unable to create context
+     * @throws Exception if unable to create context
      */
     ContextHandler createContextHandler(App app) throws Exception;
 }
diff --git a/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/DeploymentManager.java b/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/DeploymentManager.java
index c9e1151..6135284 100644
--- a/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/DeploymentManager.java
+++ b/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/DeploymentManager.java
@@ -51,14 +51,14 @@
  * <p>
  * Responsibilities:
  * <p>
- * <img src="doc-files/DeploymentManager_Roles.png">
+ * <img alt="deployment manager roles graph" src="doc-files/DeploymentManager_Roles.png">
  * <ol>
  * <li>Tracking Apps and their LifeCycle Location</li>
  * <li>Managing AppProviders and the Apps that they provide.</li>
  * <li>Executing AppLifeCycle on App based on current and desired LifeCycle Location.</li>
  * </ol>
  * <p>
- * <img src="doc-files/DeploymentManager.png">
+ * <img alt="deployment manager graph" src="doc-files/DeploymentManager.png">
  */
 @ManagedObject("Deployment Manager")
 public class DeploymentManager extends ContainerLifeCycle
@@ -131,6 +131,7 @@
      * Receive an app for processing.
      * 
      * Most commonly used by the various {@link AppProvider} implementations.
+     * @param app the app
      */
     public void addApp(App app)
     {
@@ -151,7 +152,7 @@
     /** Set the AppProviders.
      * The providers passed are added via {@link #addBean(Object)} so that 
      * their lifecycles may be managed as a {@link ContainerLifeCycle}.
-     * @param providers
+     * @param providers the app provider list
      */
     public void setAppProviders(Collection<AppProvider> providers)
     {
@@ -202,9 +203,9 @@
     /**
      * Convenience method to allow for insertion of nodes into the lifecycle.
      * 
-     * @param existingFromNodeName
-     * @param existingToNodeName
-     * @param insertedNodeName
+     * @param existingFromNodeName the existing node start
+     * @param existingToNodeName the existing node end
+     * @param insertedNodeName the new node to create between the existing nodes
      */
     public void insertLifeCycleNode(String existingFromNodeName, String existingToNodeName, String insertedNodeName)
     {
@@ -353,7 +354,7 @@
     /**
      * Get a contextAttribute that will be set for every Context deployed by this provider.
      * 
-     * @param name
+     * @param name context attribute name
      * @return the context attribute value
      */
     public Object getContextAttribute(String name)
@@ -431,7 +432,7 @@
     /**
      * Remove a contextAttribute that will be set for every Context deployed by this provider.
      * 
-     * @param name
+     * @param name the context attribute name
      */
     public void removeContextAttribute(String name)
     {
@@ -529,8 +530,8 @@
     /**
      * Set a contextAttribute that will be set for every Context deployed by this provider.
      * 
-     * @param name
-     * @param value
+     * @param name the context attribute name
+     * @param value the context attribute value
      */
     public void setContextAttribute(String name, Object value)
     {
diff --git a/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/bindings/DebugListenerBinding.java b/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/bindings/DebugListenerBinding.java
new file mode 100644
index 0000000..cc8698c
--- /dev/null
+++ b/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/bindings/DebugListenerBinding.java
@@ -0,0 +1,53 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.deploy.bindings;
+
+import org.eclipse.jetty.deploy.App;
+import org.eclipse.jetty.deploy.graph.Node;
+import org.eclipse.jetty.server.DebugListener;
+
+
+/** A Deployment binding that installs a DebugListener in all deployed contexts
+ */
+public class DebugListenerBinding extends DebugBinding
+{
+    final DebugListener _debugListener;
+
+    public DebugListenerBinding()
+    {
+        this(new DebugListener());
+    }
+    
+    public DebugListenerBinding(DebugListener debugListener)
+    {
+        super(new String[]{"deploying"});
+        _debugListener=debugListener;
+    }
+    
+    public DebugListener getDebugListener()
+    {
+        return _debugListener;
+    }
+    
+    public void processBinding(Node node, App app) throws Exception
+    {
+        app.getContextHandler().addEventListener(_debugListener);
+    }
+
+}
diff --git a/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/bindings/GlobalWebappConfigBinding.java b/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/bindings/GlobalWebappConfigBinding.java
index 0c41218..15289d5 100644
--- a/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/bindings/GlobalWebappConfigBinding.java
+++ b/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/bindings/GlobalWebappConfigBinding.java
@@ -97,6 +97,8 @@
                 Resource resource = Resource.newResource(app.getOriginId());
                 File file = resource.getFile();
                 jettyXmlConfig.getIdMap().put("Server",app.getDeploymentManager().getServer());
+                jettyXmlConfig.getProperties().put("jetty.home",System.getProperty("jetty.home","."));
+                jettyXmlConfig.getProperties().put("jetty.base",System.getProperty("jetty.base","."));
                 jettyXmlConfig.getProperties().put("jetty.webapp",file.getCanonicalPath());
                 jettyXmlConfig.getProperties().put("jetty.webapps",file.getParentFile().getCanonicalPath());
                 
diff --git a/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/providers/WebAppProvider.java b/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/providers/WebAppProvider.java
index 20af493..91f70c9 100644
--- a/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/providers/WebAppProvider.java
+++ b/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/providers/WebAppProvider.java
@@ -25,6 +25,7 @@
 import org.eclipse.jetty.deploy.App;
 import org.eclipse.jetty.deploy.ConfigurationManager;
 import org.eclipse.jetty.deploy.util.FileID;
+import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.util.URIUtil;
 import org.eclipse.jetty.util.annotation.ManagedAttribute;
@@ -33,8 +34,8 @@
 import org.eclipse.jetty.webapp.WebAppContext;
 import org.eclipse.jetty.xml.XmlConfiguration;
 
-/* ------------------------------------------------------------ */
-/** The webapps directory scanning provider.
+/** 
+ * The webapps directory scanning provider.
  * <p>
  * This provider scans one or more directories (typically "webapps") for contexts to
  * deploy, which may be:<ul>
@@ -213,9 +214,6 @@
     }  
     
     /* ------------------------------------------------------------ */
-    /**
-     *
-     */
     @ManagedAttribute("configuration classes for webapps to be processed through")
     public String[] getConfigurationClasses()
     {
@@ -259,7 +257,7 @@
 
         if (resource.exists() && FileID.isXmlFile(file))
         {
-            XmlConfiguration xmlc = new XmlConfiguration(resource.getURL())
+            XmlConfiguration xmlc = new XmlConfiguration(resource.getURI().toURL())
             {
                 @Override
                 public void initializeDefaults(Object context)
diff --git a/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/AppLifeCycleTest.java b/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/AppLifeCycleTest.java
index 867f97f..de58bf6 100644
--- a/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/AppLifeCycleTest.java
+++ b/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/AppLifeCycleTest.java
@@ -36,10 +36,10 @@
  */
 public class AppLifeCycleTest
 {
-        @Rule
-        public TestingDir testdir = new TestingDir();
+    @Rule
+    public TestingDir testdir = new TestingDir();
 
-        private void assertNoPath(String from, String to)
+    private void assertNoPath(String from, String to)
     {
         assertPath(from,to,new ArrayList<String>());
     }
@@ -168,7 +168,7 @@
      * Request multiple lifecycle paths with a single lifecycle instance. Just to ensure that there is no state
      * maintained between {@link AppLifeCycle#getPath(Node, Node)} requests.
      * 
-     * @throws IOException
+     * @throws IOException on test failure
      */
     @Test
     public void testFindPathMultiple() throws IOException
diff --git a/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/bindings/GlobalWebappConfigBindingTest.java b/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/bindings/GlobalWebappConfigBindingTest.java
index 95a168d..15acbe8 100644
--- a/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/bindings/GlobalWebappConfigBindingTest.java
+++ b/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/bindings/GlobalWebappConfigBindingTest.java
@@ -26,6 +26,7 @@
 import java.io.File;
 import java.util.List;
 
+import org.eclipse.jetty.deploy.providers.ScanningAppProvider;
 import org.eclipse.jetty.deploy.test.XmlConfiguredJetty;
 import org.eclipse.jetty.toolchain.test.IO;
 import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
diff --git a/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/providers/ScanningAppProviderRuntimeUpdatesTest.java b/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/providers/ScanningAppProviderRuntimeUpdatesTest.java
index 158d62b..6d79d6d 100644
--- a/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/providers/ScanningAppProviderRuntimeUpdatesTest.java
+++ b/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/providers/ScanningAppProviderRuntimeUpdatesTest.java
@@ -116,6 +116,7 @@
 
     /**
      * Simple webapp deployment after startup of server.
+     * @throws IOException on test failure
      */
     @Test
     public void testAfterStartupContext() throws IOException
@@ -131,6 +132,7 @@
 
     /**
      * Simple webapp deployment after startup of server, and then removal of the webapp.
+     * @throws IOException on test failure
      */
     @Test
     public void testAfterStartupThenRemoveContext() throws IOException
@@ -154,6 +156,7 @@
 
     /**
      * Simple webapp deployment after startup of server, and then removal of the webapp.
+     * @throws Exception on test failure
      */
     @Test
     public void testAfterStartupThenUpdateContext() throws Exception
diff --git a/jetty-deploy/src/test/resources/binding-test-contexts-1.xml b/jetty-deploy/src/test/resources/binding-test-contexts-1.xml
index 3c6a950..d49cf70 100644
--- a/jetty-deploy/src/test/resources/binding-test-contexts-1.xml
+++ b/jetty-deploy/src/test/resources/binding-test-contexts-1.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
 
diff --git a/jetty-deploy/src/test/resources/etc/webdefault.xml b/jetty-deploy/src/test/resources/etc/webdefault.xml
index 13a96e9..6a58d98 100644
--- a/jetty-deploy/src/test/resources/etc/webdefault.xml
+++ b/jetty-deploy/src/test/resources/etc/webdefault.xml
@@ -1,113 +1,142 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
-<!-- ===================================================================== -->
-<!-- This file contains the default descriptor for web applications.       -->
-<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-<!-- The intent of this descriptor is to include jetty specific or common  -->
-<!-- configuration for all webapps.   If a context has a webdefault.xml    -->
-<!-- descriptor, it is applied before the contexts own web.xml file        -->
-<!--                                                                       -->
-<!-- A context may be assigned a default descriptor by:                    -->
-<!--  + Calling WebApplicationContext.setDefaultsDescriptor                -->
-<!--  + Passed an arg to addWebApplications                                -->
-<!--                                                                       -->
-<!-- This file is used both as the resource within the jetty.jar (which is -->
-<!-- used as the default if no explicit defaults descriptor is set) and it -->
-<!-- is copied to the etc directory of the Jetty distro and explicitly     -->
-<!-- by the jetty.xml file.                                                -->
-<!--                                                                       -->
-<!-- ===================================================================== -->
 <web-app 
-   xmlns="http://java.sun.com/xml/ns/javaee" 
+   xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
-   metadata-complete="true"
-   version="2.5"> 
+   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+   metadata-complete="false"
+   version="3.1"> 
+
+  <!-- ===================================================================== -->
+  <!-- This file contains the default descriptor for web applications.       -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+  <!-- The intent of this descriptor is to include jetty specific or common  -->
+  <!-- configuration for all webapps.   If a context has a webdefault.xml    -->
+  <!-- descriptor, it is applied before the context's own web.xml file       -->
+  <!--                                                                       -->
+  <!-- A context may be assigned a default descriptor by calling             -->
+  <!-- WebAppContext.setDefaultsDescriptor(String).                          -->
+  <!--                                                                       -->
+  <!-- This file is present in the jetty-webapp.jar, and is used as the      -->
+  <!-- defaults descriptor if no other is explicitly set on a context.       -->
+  <!--                                                                       -->
+  <!-- A copy of this file is also placed into the $JETTY_HOME/etc dir of    -->
+  <!-- the  distribution, and is referenced by some of the other xml files,  -->
+  <!-- eg the jetty-deploy.xml file.                                         -->
+  <!-- ===================================================================== -->
 
   <description>
     Default web.xml file.  
     This file is applied to a Web application before it's own WEB_INF/web.xml file
   </description>
 
+  <!-- ==================================================================== -->
+  <!-- Removes static references to beans from javax.el.BeanELResolver to   -->
+  <!-- ensure webapp classloader can be released on undeploy                -->
+  <!-- ==================================================================== -->
+  <listener>
+   <listener-class>org.eclipse.jetty.servlet.listener.ELContextCleaner</listener-class>
+  </listener>
+  
+  <!-- ==================================================================== -->
+  <!-- Removes static cache of Methods from java.beans.Introspector to      -->
+  <!-- ensure webapp classloader can be released on undeploy                -->
+  <!-- ==================================================================== -->  
+  <listener>
+   <listener-class>org.eclipse.jetty.servlet.listener.IntrospectorCleaner</listener-class>
+  </listener>
+  
 
   <!-- ==================================================================== -->
   <!-- Context params to control Session Cookies                            -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <!-- UNCOMMENT TO ACTIVATE
-  <context-param>
-    <param-name>org.eclipse.jetty.servlet.SessionDomain</param-name>
-    <param-value>127.0.0.1</param-value>
-  </context-param>
-
-  <context-param>
-    <param-name>org.eclipse.jetty.servlet.SessionPath</param-name>
-    <param-value>/</param-value>
-  </context-param>
-
-  <context-param>
-    <param-name>org.eclipse.jetty.servlet.MaxAge</param-name>
-    <param-value>-1</param-value>
-  </context-param>
+  <!--
+    UNCOMMENT TO ACTIVATE 
+    <context-param> 
+      <param-name>org.eclipse.jetty.servlet.SessionDomain</param-name> 
+      <param-value>127.0.0.1</param-value> 
+    </context-param> 
+    <context-param>
+      <param-name>org.eclipse.jetty.servlet.SessionPath</param-name>
+      <param-value>/</param-value>
+    </context-param>
+    <context-param>
+      <param-name>org.eclipse.jetty.servlet.MaxAge</param-name>
+      <param-value>-1</param-value>
+    </context-param>
   -->
 
-
   <!-- ==================================================================== -->
   <!-- The default servlet.                                                 -->
   <!-- This servlet, normally mapped to /, provides the handling for static -->
   <!-- content, OPTIONS and TRACE methods for the context.                  -->
   <!-- The following initParameters are supported:                          -->
-  <!--                                                                      -->
-  <!--   acceptRanges     If true, range requests and responses are         -->
-  <!--                    supported                                         -->
-  <!--                                                                      -->
-  <!--   dirAllowed       If true, directory listings are returned if no    -->
-  <!--                    welcome file is found. Else 403 Forbidden.        -->
-  <!--                                                                      -->
-  <!--   welcomeServlets  If true, attempt to dispatch to welcome files     -->
-  <!--                    that are servlets, if no matching static          -->
-  <!--                    resources can be found.                           -->
-  <!--                                                                      -->
-  <!--   redirectWelcome  If true, redirect welcome file requests           -->
-  <!--                    else use request dispatcher forwards              -->
-  <!--                                                                      -->
-  <!--   gzip             If set to true, then static content will be served--> 
-  <!--                    as gzip content encoded if a matching resource is -->
-  <!--                    found ending with ".gz"                           -->
-  <!--                                                                      -->
-  <!--   resoureBase      Can be set to replace the context resource base   -->
-  <!--                                                                      -->
-  <!--   relativeResourceBase                                               -->
-  <!--                    Set with a pathname relative to the base of the   -->
-  <!--                    servlet context root. Useful for only serving     -->
-  <!--                    static content from only specific subdirectories. -->
-  <!--                                                                      -->
-  <!--   useFileMappedBuffer                                                -->
-  <!--                    If set to true (the default), a  memory mapped    -->
-  <!--                    file buffer will be used to serve static content  -->
-  <!--                    when using an NIO connector. Setting this value   -->
-  <!--                    to false means that a direct buffer will be used  -->
-  <!--                    instead. If you are having trouble with Windows   -->
-  <!--                    file locking, set this to false.                  -->
-  <!--                                                                      -->
-  <!--  cacheControl      If set, all static content will have this value   -->
-  <!--                    set as the cache-control header.                  -->
-  <!--                                                                      -->
-  <!--  maxCacheSize      Maximum size of the static resource cache         -->
-  <!--                                                                      -->
-  <!--  maxCachedFileSize Maximum size of any single file in the cache      -->
-  <!--                                                                      -->
-  <!--  maxCachedFiles    Maximum number of files in the cache              -->
-  <!--                                                                      -->
-  <!--  cacheType         "nio", "bio" or "both" to determine the type(s)   -->
-  <!--                    of resource cache. A bio cached buffer may be used-->
-  <!--                    by nio but is not as efficient as a nio buffer.   -->
-  <!--                    An nio cached buffer may not be used by bio.      -->
-  <!--                                                                      -->
-  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+  <!--  
+ *  acceptRanges      If true, range requests and responses are
+ *                    supported
+ *
+ *  dirAllowed        If true, directory listings are returned if no
+ *                    welcome file is found. Else 403 Forbidden.
+ *
+ *  welcomeServlets   If true, attempt to dispatch to welcome files
+ *                    that are servlets, but only after no matching static
+ *                    resources could be found. If false, then a welcome
+ *                    file must exist on disk. If "exact", then exact
+ *                    servlet matches are supported without an existing file.
+ *                    Default is true.
+ *
+ *                    This must be false if you want directory listings,
+ *                    but have index.jsp in your welcome file list.
+ *
+ *  redirectWelcome   If true, welcome files are redirected rather than
+ *                    forwarded to.
+ *
+ *  gzip              If set to true, then static content will be served as
+ *                    gzip content encoded if a matching resource is
+ *                    found ending with ".gz"
+ *
+ *  resourceBase      Set to replace the context resource base
+ *
+ *  resourceCache     If set, this is a context attribute name, which the servlet
+ *                    will use to look for a shared ResourceCache instance.
+ *
+ *  relativeResourceBase
+ *                    Set with a pathname relative to the base of the
+ *                    servlet context root. Useful for only serving static content out
+ *                    of only specific subdirectories.
+ *
+ *  pathInfoOnly      If true, only the path info will be applied to the resourceBase
+ *
+ *  stylesheet        Set with the location of an optional stylesheet that will be used
+ *                    to decorate the directory listing html.
+ *
+ *  aliases           If True, aliases of resources are allowed (eg. symbolic
+ *                    links and caps variations). May bypass security constraints.
+ *                    
+ *  etags             If True, weak etags will be generated and handled.
+ *
+ *  maxCacheSize      The maximum total size of the cache or 0 for no cache.
+ *  maxCachedFileSize The maximum size of a file to cache
+ *  maxCachedFiles    The maximum number of files to cache
+ *
+ *  useFileMappedBuffer
+ *                    If set to true, it will use mapped file buffers to serve static content
+ *                    when using an NIO connector. Setting this value to false means that
+ *                    a direct buffer will be used instead of a mapped file buffer.
+ *                    This file sets the value to true.
+ *
+ *  cacheControl      If set, all static content will have this value set as the cache-control
+ *                    header.
+ *
+ -->
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <servlet>
     <servlet-name>default</servlet-name>
     <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
     <init-param>
+      <param-name>aliases</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
       <param-name>acceptRanges</param-name>
       <param-value>true</param-value>
     </init-param>
@@ -117,8 +146,8 @@
     </init-param>
     <init-param>
       <param-name>welcomeServlets</param-name>
- 	    <param-value>false</param-value>
- 	  </init-param>
+      <param-value>false</param-value>
+    </init-param>
     <init-param>
       <param-name>redirectWelcome</param-name>
       <param-value>false</param-value>
@@ -129,24 +158,30 @@
     </init-param>
     <init-param>
       <param-name>maxCachedFileSize</param-name>
-      <param-value>10000000</param-value>
+      <param-value>200000000</param-value>
     </init-param>
     <init-param>
       <param-name>maxCachedFiles</param-name>
-      <param-value>1000</param-value>
-    </init-param>
-    <init-param>
-      <param-name>cacheType</param-name>
-      <param-value>both</param-value>
+      <param-value>2048</param-value>
     </init-param>
     <init-param>
       <param-name>gzip</param-name>
       <param-value>true</param-value>
     </init-param>
     <init-param>
+      <param-name>etags</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
       <param-name>useFileMappedBuffer</param-name>
       <param-value>true</param-value>
-    </init-param>  
+    </init-param>
+    <!--
+    <init-param>
+      <param-name>resourceCache</param-name>
+      <param-value>resourceCache</param-value>
+    </init-param>
+    -->
     <!--
     <init-param>
       <param-name>cacheControl</param-name>
@@ -154,20 +189,23 @@
     </init-param>
     -->
     <load-on-startup>0</load-on-startup>
-  </servlet> 
+  </servlet>
 
-  <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
-  
+  <servlet-mapping>
+    <servlet-name>default</servlet-name>
+    <url-pattern>/</url-pattern>
+  </servlet-mapping>
+
 
   <!-- ==================================================================== -->
   <!-- JSP Servlet                                                          -->
-  <!-- This is the jasper JSP servlet from the jakarta project              -->
+  <!-- This is the jasper JSP servlet.                                      -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <!-- The JSP page compiler and execution servlet, which is the mechanism  -->
-  <!-- used by Glassfish to support JSP pages.  Traditionally, this servlet -->
-  <!-- is mapped to URL patterh "*.jsp".  This servlet supports the         -->
-  <!-- following initialization parameters (default values are in square    -->
-  <!-- brackets):                                                           -->
+  <!-- used by the jsp container to support JSP pages.  Traditionally,      -->
+  <!-- this servlet is mapped to URL pattern "*.jsp".  This servlet         -->
+  <!-- supports the following initialization parameters (default values     -->
+  <!-- are in square brackets):                                             -->
   <!--                                                                      -->
   <!--   checkInterval       If development is false and reloading is true, -->
   <!--                       background compiles are enabled. checkInterval -->
@@ -175,7 +213,7 @@
   <!--                       if a JSP page needs to be recompiled. [300]    -->
   <!--                                                                      -->
   <!--   compiler            Which compiler Ant should use to compile JSP   -->
-  <!--                       pages.  See the Ant documenation for more      -->
+  <!--                       pages.  See the Ant documentation for more     -->
   <!--                       information. [javac]                           -->
   <!--                                                                      -->
   <!--   classdebuginfo      Should the class file be compiled with         -->
@@ -236,28 +274,29 @@
   <!--   xpoweredBy          Determines whether X-Powered-By response       -->
   <!--                       header is added by generated servlet  [false]  -->
   <!--                                                                      -->
-  <!-- If you wish to use Jikes to compile JSP pages:                       -->
-  <!--   Set the init parameter "compiler" to "jikes".  Define              -->
-  <!--   the property "-Dbuild.compiler.emacs=true" when starting Jetty     -->
-  <!--   to cause Jikes to emit error messages in a format compatible with  -->
-  <!--   Jasper.                                                            -->
-  <!--   If you get an error reporting that jikes can't use UTF-8 encoding, -->
-  <!--   try setting the init parameter "javaEncoding" to "ISO-8859-1".     -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <servlet id="jsp">
     <servlet-name>jsp</servlet-name>
-    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
+    <servlet-class>org.eclipse.jetty.jsp.JettyJspServlet</servlet-class>
     <init-param>
-        <param-name>logVerbosityLevel</param-name>
-        <param-value>DEBUG</param-value>
+      <param-name>logVerbosityLevel</param-name>
+      <param-value>DEBUG</param-value>
     </init-param>
     <init-param>
-        <param-name>fork</param-name>
-        <param-value>false</param-value>
+      <param-name>fork</param-name>
+      <param-value>false</param-value>
     </init-param>
     <init-param>
-        <param-name>xpoweredBy</param-name>
-        <param-value>false</param-value>
+      <param-name>xpoweredBy</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
+      <param-name>compilerTargetVM</param-name>
+      <param-value>1.7</param-value>
+    </init-param>
+    <init-param>
+      <param-name>compilerSourceVM</param-name>
+      <param-value>1.7</param-value>
     </init-param>
     <!--  
     <init-param>
@@ -268,62 +307,22 @@
     <load-on-startup>0</load-on-startup>
   </servlet>
 
-  <servlet-mapping> 
-    <servlet-name>jsp</servlet-name> 
-    <url-pattern>*.jsp</url-pattern> 
+  <servlet-mapping>
+    <servlet-name>jsp</servlet-name>
+    <url-pattern>*.jsp</url-pattern>
     <url-pattern>*.jspf</url-pattern>
     <url-pattern>*.jspx</url-pattern>
     <url-pattern>*.xsp</url-pattern>
-    <url-pattern>*.JSP</url-pattern> 
+    <url-pattern>*.JSP</url-pattern>
     <url-pattern>*.JSPF</url-pattern>
     <url-pattern>*.JSPX</url-pattern>
     <url-pattern>*.XSP</url-pattern>
   </servlet-mapping>
-  
+
+
   <!-- ==================================================================== -->
-  <!-- Dynamic Servlet Invoker.                                             -->
-  <!-- This servlet invokes anonymous servlets that have not been defined   -->
-  <!-- in the web.xml or by other means. The first element of the pathInfo  -->
-  <!-- of a request passed to the envoker is treated as a servlet name for  -->
-  <!-- an existing servlet, or as a class name of a new servlet.            -->
-  <!-- This servlet is normally mapped to /servlet/*                        -->
-  <!-- This servlet support the following initParams:                       -->
-  <!--                                                                      -->
-  <!--  nonContextServlets       If false, the invoker can only load        -->
-  <!--                           servlets from the contexts classloader.    -->
-  <!--                           This is false by default and setting this  -->
-  <!--                           to true may have security implications.    -->
-  <!--                                                                      -->
-  <!--  verbose                  If true, log dynamic loads                 -->
-  <!--                                                                      -->
-  <!--  *                        All other parameters are copied to the     -->
-  <!--                           each dynamic servlet as init parameters    -->
+  <!-- Default session configuration                                        -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <!-- Uncomment for dynamic invocation
-  <servlet>
-    <servlet-name>invoker</servlet-name>
-    <servlet-class>org.eclipse.jetty.servlet.Invoker</servlet-class>
-    <init-param>
-      <param-name>verbose</param-name>
-      <param-value>false</param-value>
-    </init-param>
-    <init-param>
-      <param-name>nonContextServlets</param-name>
-      <param-value>false</param-value>
-    </init-param>
-    <init-param>
-      <param-name>dynamicParam</param-name>
-      <param-value>anyValue</param-value>
-    </init-param>
-    <load-on-startup>0</load-on-startup>
-  </servlet>
-
-  <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping>
-  -->
-
-
-
-  <!-- ==================================================================== -->
   <session-config>
     <session-timeout>30</session-timeout>
   </session-config>
@@ -342,6 +341,8 @@
   -->
 
   <!-- ==================================================================== -->
+  <!-- Default welcome files                                                -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <welcome-file-list>
     <welcome-file>index.html</welcome-file>
     <welcome-file>index.htm</welcome-file>
@@ -349,48 +350,170 @@
   </welcome-file-list>
 
   <!-- ==================================================================== -->
+  <!-- Default locale encodings                                             -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <locale-encoding-mapping-list>
-    <locale-encoding-mapping><locale>ar</locale><encoding>ISO-8859-6</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>be</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>bg</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ca</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>cs</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>da</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>de</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>el</locale><encoding>ISO-8859-7</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>en</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>es</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>et</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>fi</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>fr</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>hr</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>hu</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>is</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>it</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>iw</locale><encoding>ISO-8859-8</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ja</locale><encoding>Shift_JIS</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ko</locale><encoding>EUC-KR</encoding></locale-encoding-mapping>     
-    <locale-encoding-mapping><locale>lt</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>lv</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>mk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>nl</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>no</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>pl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>pt</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ro</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ru</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sh</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sk</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sq</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sr</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sv</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>tr</locale><encoding>ISO-8859-9</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>uk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>zh</locale><encoding>GB2312</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>zh_TW</locale><encoding>Big5</encoding></locale-encoding-mapping>   
+    <locale-encoding-mapping>
+      <locale>ar</locale>
+      <encoding>ISO-8859-6</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>be</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>bg</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>ca</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>cs</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>da</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>de</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>el</locale>
+      <encoding>ISO-8859-7</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>en</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>es</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>et</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>fi</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>fr</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>hr</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>hu</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>is</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>it</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>iw</locale>
+      <encoding>ISO-8859-8</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>ja</locale>
+      <encoding>Shift_JIS</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>ko</locale>
+      <encoding>EUC-KR</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>lt</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>lv</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>mk</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>nl</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>no</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>pl</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>pt</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>ro</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>ru</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>sh</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>sk</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>sl</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>sq</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>sr</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>sv</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>tr</locale>
+      <encoding>ISO-8859-9</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>uk</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>zh</locale>
+      <encoding>GB2312</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>zh_TW</locale>
+      <encoding>Big5</encoding>
+    </locale-encoding-mapping>
   </locale-encoding-mapping-list>
-  
+
+  <!-- ==================================================================== -->
+  <!-- Disable TRACE method with security constraint                        -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <security-constraint>
     <web-resource-collection>
       <web-resource-name>Disable TRACE</web-resource-name>
@@ -399,6 +522,13 @@
     </web-resource-collection>
     <auth-constraint/>
   </security-constraint>
-  
+  <security-constraint>
+    <web-resource-collection>
+      <web-resource-name>Enable everything but TRACE</web-resource-name>
+      <url-pattern>/</url-pattern>
+      <http-method-omission>TRACE</http-method-omission>
+    </web-resource-collection>
+  </security-constraint>
+
 </web-app>
 
diff --git a/jetty-deploy/src/test/resources/jetty-deploy-wars.xml b/jetty-deploy/src/test/resources/jetty-deploy-wars.xml
index 9933cb6..1760a67 100644
--- a/jetty-deploy/src/test/resources/jetty-deploy-wars.xml
+++ b/jetty-deploy/src/test/resources/jetty-deploy-wars.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
 
diff --git a/jetty-deploy/src/test/resources/jetty-deploymgr-contexts.xml b/jetty-deploy/src/test/resources/jetty-deploymgr-contexts.xml
index 8d55d22..b16fbd7 100644
--- a/jetty-deploy/src/test/resources/jetty-deploymgr-contexts.xml
+++ b/jetty-deploy/src/test/resources/jetty-deploymgr-contexts.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
   <Call name="addBean">
diff --git a/jetty-deploy/src/test/resources/jetty-http.xml b/jetty-deploy/src/test/resources/jetty-http.xml
index 42b889b..7fa6def 100644
--- a/jetty-deploy/src/test/resources/jetty-http.xml
+++ b/jetty-deploy/src/test/resources/jetty-http.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- ============================================================= -->
 <!-- Configure the Jetty Server instance with an ID "Server"       -->
diff --git a/jetty-deploy/src/test/resources/jetty.xml b/jetty-deploy/src/test/resources/jetty.xml
index 25332f6..a08e270 100644
--- a/jetty-deploy/src/test/resources/jetty.xml
+++ b/jetty-deploy/src/test/resources/jetty.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Documentation of this file format can be found at:              -->
@@ -46,9 +46,9 @@
     <Arg name="threadpool"><New id="threadpool" class="org.eclipse.jetty.util.thread.QueuedThreadPool"/></Arg>
     -->
     <Get name="ThreadPool">
-      <Set name="minThreads" type="int"><Property name="threads.min" default="10"/></Set>
-      <Set name="maxThreads" type="int"><Property name="threads.max" default="200"/></Set>
-      <Set name="idleTimeout" type="int"><Property name="threads.timeout" default="60000"/></Set>
+      <Set name="minThreads" type="int"><Property name="jetty.threadPool.minThreads" default="10"/></Set>
+      <Set name="maxThreads" type="int"><Property name="jetty.threadPool.maxThreads" default="200"/></Set>
+      <Set name="idleTimeout" type="int"><Property name="jetty.threadPool.idleTimeout" default="60000"/></Set>
       <Set name="detailedDump">false</Set>
     </Get>
 
@@ -64,21 +64,21 @@
     <!-- =========================================================== -->
     <!-- Http Configuration.                                         -->
     <!-- This is a common configuration instance used by all         -->
-    <!-- connectors that can carry HTTP semantics (HTTP, HTTPS, SPDY)-->
+    <!-- connectors that can carry HTTP semantics (HTTP, HTTPS, etc.)-->
     <!-- It configures the non wire protocol aspects of the HTTP     -->
     <!-- semantic.                                                   -->
     <!--                                                             -->
     <!-- This configuration is only defined here and is used by      -->
-    <!-- reference from the jetty-http.xml, jetty-https.xml and      -->
-    <!-- jetty-spdy.xml configuration files which instantiate the    -->
-    <!-- connectors.                                                 -->
+    <!-- reference from other XML files such as jetty-http.xml,      -->
+    <!-- jetty-https.xml and other configuration files which         -->
+    <!-- instantiate the connectors.                                 -->
     <!--                                                             -->
     <!-- Consult the javadoc of o.e.j.server.HttpConfiguration       -->
     <!-- for all configuration that may be set here.                 -->
     <!-- =========================================================== -->
     <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
       <Set name="secureScheme">https</Set>
-      <Set name="securePort" type="java.lang.Integer"><Property name="jetty.secure.port" default="8443" /></Set>
+      <Set name="securePort" type="java.lang.Integer"><Property name="jetty.httpConfig.securePort" default="8443" /></Set>
       <Set name="outputBufferSize">32768</Set>
       <Set name="requestHeaderSize">8192</Set>
       <Set name="responseHeaderSize">8192</Set>
@@ -125,7 +125,7 @@
     <!-- =========================================================== -->
     <Set name="stopAtShutdown">true</Set>
     <Set name="stopTimeout">5000</Set>
-    <Set name="dumpAfterStart"><Property name="jetty.dump.start" default="false"/></Set>
-    <Set name="dumpBeforeStop"><Property name="jetty.dump.stop" default="false"/></Set>
+    <Set name="dumpAfterStart"><Property name="jetty.server.dumpAfterStart" default="false"/></Set>
+    <Set name="dumpBeforeStop"><Property name="jetty.server.dumpBeforeStop" default="false"/></Set>
 
 </Configure>
diff --git a/jetty-deploy/src/test/resources/webapps/foo.xml b/jetty-deploy/src/test/resources/webapps/foo.xml
index e7c6e9d..f0a9611 100644
--- a/jetty-deploy/src/test/resources/webapps/foo.xml
+++ b/jetty-deploy/src/test/resources/webapps/foo.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 <Configure class="org.eclipse.jetty.webapp.WebAppContext">
     <Set name="contextPath">/foo</Set>
     <Set name="war">
diff --git a/jetty-distribution/pom.xml b/jetty-distribution/pom.xml
index 488a860..f7ebb8e 100644
--- a/jetty-distribution/pom.xml
+++ b/jetty-distribution/pom.xml
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <artifactId>jetty-distribution</artifactId>
   <name>Jetty :: Distribution Assemblies</name>
@@ -11,7 +11,7 @@
   <packaging>pom</packaging>
   <properties>
     <assembly-directory>${basedir}/target/distribution</assembly-directory>
-    <jetty-setuid-version>1.0.1</jetty-setuid-version>
+    <jetty-setuid-version>1.0.3</jetty-setuid-version>
   </properties>
   <build>
     <plugins>
@@ -53,6 +53,18 @@
               </tasks>
             </configuration>
           </execution>
+          <execution>
+	    <id>removeKeystore</id>
+            <phase>process-resources</phase>
+            <goals>
+              <goal>run</goal>
+            </goals>
+            <configuration>
+              <tasks>
+                <delete file="${assembly-directory}/etc/keystore" />
+              </tasks>
+            </configuration>
+          </execution>
         </executions>
       </plugin>
       <plugin>
@@ -206,28 +218,6 @@
           </execution>
 
           <execution>
-            <id>unpack-setuid-config</id>
-            <phase>process-resources</phase>
-            <goals>
-              <goal>unpack</goal>
-            </goals>
-            <configuration>
-              <artifactItems>
-                <artifactItem>
-                  <groupId>org.eclipse.jetty.toolchain.setuid</groupId>
-                  <artifactId>jetty-setuid-java</artifactId>
-                  <version>${jetty-setuid-version}</version>
-                  <classifier>config</classifier>
-                  <type>jar</type>
-                  <overWrite>true</overWrite>
-                  <outputDirectory>${assembly-directory}</outputDirectory>
-                </artifactItem>
-              </artifactItems>
-              <excludes>META-INF/**</excludes>
-            </configuration>
-          </execution>
-
-          <execution>
             <id>unpack-test-jaas-config</id>
             <phase>process-resources</phase>
             <goals>
@@ -301,8 +291,8 @@
             </goals>
             <configuration>
               <includeGroupIds>org.eclipse.jetty</includeGroupIds>
-              <excludeGroupIds>org.eclipse.jetty.orbit,org.eclipse.jetty.spdy,org.eclipse.jetty.websocket,org.eclipse.jetty.fcgi,org.eclipse.jetty.toolchain,org.apache.taglibs</excludeGroupIds>
-              <excludeArtifactIds>jetty-all,jetty-jsp,apache-jsp,apache-jstl,jetty-start,jetty-monitor,jetty-spring</excludeArtifactIds>
+              <excludeGroupIds>org.eclipse.jetty.orbit,org.eclipse.jetty.http2,org.eclipse.jetty.websocket,org.eclipse.jetty.fcgi,org.eclipse.jetty.toolchain,org.apache.taglibs</excludeGroupIds>
+              <excludeArtifactIds>jetty-all,apache-jsp,apache-jstl,jetty-start,jetty-monitor,jetty-spring</excludeArtifactIds>
               <includeTypes>jar</includeTypes>
               <outputDirectory>${assembly-directory}/lib</outputDirectory>
             </configuration>
@@ -321,6 +311,19 @@
             </configuration>
           </execution>
           <execution>
+            <id>copy-lib-http2-deps</id>
+            <phase>generate-resources</phase>
+            <goals>
+              <goal>copy-dependencies</goal>
+            </goals>
+            <configuration>
+              <includeGroupIds>org.eclipse.jetty.http2</includeGroupIds>
+              <includeArtifactIds>http2-hpack,http2-common,http2-server</includeArtifactIds>
+              <includeTypes>jar</includeTypes>
+              <outputDirectory>${assembly-directory}/lib/http2</outputDirectory>
+            </configuration>
+          </execution>
+          <execution>
             <id>copy-lib-fcgi-deps</id>
             <phase>generate-resources</phase>
             <goals>
@@ -392,32 +395,6 @@
             </configuration>
           </execution>
           <execution>
-            <id>unpack-spdy</id>
-            <phase>process-resources</phase>
-            <goals>
-              <goal>unpack-dependencies</goal>
-            </goals>
-            <configuration>
-              <includeGroupIds>org.eclipse.jetty.spdy</includeGroupIds>
-              <classifier>config</classifier>
-              <failOnMissingClassifierArtifact>false</failOnMissingClassifierArtifact>
-              <excludes>META-INF/**</excludes>
-              <outputDirectory>${assembly-directory}</outputDirectory>
-            </configuration>
-          </execution>
-          <execution>
-            <id>copy-lib-spdy-deps</id>
-            <phase>process-resources</phase>
-            <goals>
-              <goal>copy-dependencies</goal>
-            </goals>
-            <configuration>
-              <includeGroupIds>org.eclipse.jetty.spdy</includeGroupIds>
-              <includeTypes>jar</includeTypes>
-              <outputDirectory>${assembly-directory}/lib/spdy</outputDirectory>
-            </configuration>
-          </execution>
-          <execution>
             <id>copy-annotations-deps</id>
             <phase>generate-resources</phase>
             <goals>
@@ -458,27 +435,14 @@
             </configuration>
           </execution>
           <execution>
-            <id>copy-glassfish-jsp-deps</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy-dependencies</goal>
-            </goals>
-            <configuration>
-              <includeGroupIds>org.eclipse.jetty.orbit,org.glassfish.web, org.glassfish, javax.el, javax.servlet.jsp, org.eclipse.jetty.toolchain, org.eclipse.jetty</includeGroupIds>
-              <includeArtifactIds>org.eclipse.jdt.core, javax.servlet.jsp-api, javax.servlet.jsp, jetty-jsp-jdt, javax.el-api, javax.el, jetty-jsp</includeArtifactIds>
-              <includeTypes>jar</includeTypes>
-              <outputDirectory>${assembly-directory}/lib/jsp</outputDirectory>
-            </configuration>
-          </execution>
-          <execution>
             <id>copy-apache-jsp-deps</id>
             <phase>generate-resources</phase>
             <goals>
               <goal>copy-dependencies</goal>
             </goals>
             <configuration>
-              <includeGroupIds>org.eclipse.jetty,org.eclipse.jetty.toolchain,org.mortbay.jasper,org.eclipse.jetty.orbit</includeGroupIds>
-              <includeArtifactIds>apache-jsp,apache-el,org.eclipse.jdt.core</includeArtifactIds>
+              <includeGroupIds>org.eclipse.jetty,org.eclipse.jetty.toolchain,org.mortbay.jasper,org.eclipse.jetty.orbit,org.eclipse.jdt.core.compiler</includeGroupIds>
+              <includeArtifactIds>apache-jsp,apache-el,ecj</includeArtifactIds>
               <includeTypes>jar</includeTypes>
               <prependGroupId>true</prependGroupId>
               <outputDirectory>${assembly-directory}/lib/apache-jsp</outputDirectory>
@@ -499,19 +463,6 @@
            </configuration>
           </execution>
           <execution>
-           <id>copy-jstl-impl</id>
-           <phase>generate-resources</phase>
-           <goals>
-             <goal>copy-dependencies</goal>
-           </goals>
-           <configuration>
-              <includeGroupIds>org.glassfish.web</includeGroupIds>
-              <includeArtifactIds>javax.servlet.jsp.jstl</includeArtifactIds>
-              <includeTypes>jar</includeTypes>
-              <outputDirectory>${assembly-directory}/lib/jsp</outputDirectory>
-           </configuration>
-          </execution>
-          <execution>
            <id>copy-apache-jstl-deps</id>
            <phase>generate-resources</phase>
            <goals>
@@ -566,7 +517,7 @@
               <arguments>
                 <argument>jetty.home=${assembly-directory}</argument>
                 <argument>jetty.base=${assembly-directory}</argument>
-                <argument>--add-to-start=server,deploy,websocket,ext,resources,jsp,jstl,http</argument>
+                <argument>--add-to-start=deploy,websocket,ext,resources,jsp,jstl,http</argument>
               </arguments>
             </configuration>
             <goals>
@@ -574,14 +525,28 @@
             </goals>
           </execution>
           <execution>
-            <id>setup demo-base</id>
+            <id>setup demo-base-ini</id>
             <phase>process-classes</phase>
             <configuration>
               <mainClass>org.eclipse.jetty.start.Main</mainClass>
               <arguments>
                 <argument>jetty.home=${assembly-directory}</argument>
                 <argument>jetty.base=${assembly-directory}/demo-base</argument>
-                <argument>--add-to-start=server,continuation,deploy,websocket,ext,resources,client,annotations,jndi,servlets</argument>
+                <argument>--add-to-start=continuation,deploy,websocket,ext,resources,client,annotations,jndi,servlets</argument>
+              </arguments>
+            </configuration>
+            <goals>
+              <goal>java</goal>
+            </goals>
+          </execution>
+          <execution>
+            <id>setup demo-base-startd</id>
+            <phase>process-classes</phase>
+            <configuration>
+              <mainClass>org.eclipse.jetty.start.Main</mainClass>
+              <arguments>
+                <argument>jetty.home=${assembly-directory}</argument>
+                <argument>jetty.base=${assembly-directory}/demo-base</argument>
                 <argument>--add-to-startd=jsp,jstl,http,https</argument>
               </arguments>
             </configuration>
@@ -649,28 +614,6 @@
     </dependency>
 
     <dependency>
-      <groupId>org.glassfish.web</groupId>
-      <artifactId>javax.servlet.jsp.jstl</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.glassfish.web</groupId>
-      <artifactId>javax.servlet.jsp</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty.toolchain</groupId>
-      <artifactId>jetty-jsp-jdt</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>javax.servlet.jsp</groupId>
-      <artifactId>javax.servlet.jsp-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.glassfish</groupId>
-      <artifactId>javax.el</artifactId>
-    </dependency>
-
-    <dependency>
       <groupId>org.ow2.asm</groupId>
       <artifactId>asm</artifactId>
     </dependency>
@@ -739,11 +682,6 @@
     </dependency>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-jsp</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
       <artifactId>apache-jsp</artifactId>
       <version>${project.version}</version>
     </dependency>
@@ -790,8 +728,13 @@
     </dependency>
 -->
     <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-cdi</artifactId>
+      <groupId>org.eclipse.jetty.cdi</groupId>
+      <artifactId>cdi-servlet</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.cdi</groupId>
+      <artifactId>cdi-websocket</artifactId>
       <version>${project.version}</version>
     </dependency>
     <dependency>
@@ -810,27 +753,11 @@
       <version>${project.version}</version>
     </dependency>
     <dependency>
-      <groupId>org.eclipse.jetty.spdy</groupId>
-      <artifactId>spdy-core</artifactId>
+      <groupId>org.eclipse.jetty.http2</groupId>
+      <artifactId>http2-server</artifactId>
       <version>${project.version}</version>
     </dependency>
     <dependency>
-      <groupId>org.eclipse.jetty.spdy</groupId>
-      <artifactId>spdy-server</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty.spdy</groupId>
-      <artifactId>spdy-http-server</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty.spdy</groupId>
-      <artifactId>spdy-example-webapp</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-    </dependency>
-    <dependency>
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-alpn-server</artifactId>
       <version>${project.version}</version>
@@ -846,5 +773,20 @@
       <artifactId>jetty-jaspi</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-infinispan</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.gcloud</groupId>
+      <artifactId>gcloud-session-manager</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-nosql</artifactId>
+      <version>${project.version}</version>
+    </dependency>
   </dependencies>
 </project>
diff --git a/jetty-distribution/src/main/resources/bin/jetty.sh b/jetty-distribution/src/main/resources/bin/jetty.sh
index da6f571..21c2c97 100755
--- a/jetty-distribution/src/main/resources/bin/jetty.sh
+++ b/jetty-distribution/src/main/resources/bin/jetty.sh
@@ -69,7 +69,7 @@
 # JETTY_ARGS
 #   The default arguments to pass to jetty.
 #   For example
-#      JETTY_ARGS=jetty.port=8080 jetty.spdy.port=8443 jetty.secure.port=443
+#      JETTY_ARGS=jetty.http.port=8080 jetty.ssl.port=8443
 #
 # JETTY_USER
 #   if set, then used as a username to run the server as
@@ -166,7 +166,7 @@
   ETC=$HOME/etc
 fi
 
-for CONFIG in $ETC/default/${NAME}{,9} $HOME/.${NAME}rc; do
+for CONFIG in {/etc,~/etc}/default/${NAME}{,9} $HOME/.${NAME}rc; do
   if [ -f "$CONFIG" ] ; then 
     readConfig "$CONFIG"
   fi
@@ -350,7 +350,7 @@
   CYGWIN*) JETTY_LOGS="`cygpath -w $JETTY_LOGS`";;
   esac
 
-  JAVA_OPTIONS=(${JAVA_OPTIONS[*]} "-Djetty.logs=$JETTY_LOGS")
+  JAVA_OPTIONS=(${JAVA_OPTIONS[*]} "-Djetty.logging.dir=$JETTY_LOGS")
 fi
 
 #####################################################
@@ -445,7 +445,7 @@
         exit 1
       fi
 
-      if [ -n "$JETTY_USER" ] 
+      if [ -n "$JETTY_USER" ] && [ `whoami` != "$JETTY_USER" ]
       then
         unset SU_SHELL
         if [ "$JETTY_SHELL" ]
@@ -457,11 +457,11 @@
         chown "$JETTY_USER" "$JETTY_PID"
         # FIXME: Broken solution: wordsplitting, pathname expansion, arbitrary command execution, etc.
         su - "$JETTY_USER" $SU_SHELL -c "
-          exec ${RUN_CMD[*]} start-log-file="$JETTY_LOGS/start.log" &
+          exec ${RUN_CMD[*]} start-log-file="$JETTY_LOGS/start.log" > /dev/null &
           disown \$!
           echo \$! > '$JETTY_PID'"
       else
-        "${RUN_CMD[@]}" &
+        "${RUN_CMD[@]}" > /dev/null &
         disown $!
         echo $! > "$JETTY_PID"
       fi
diff --git a/jetty-distribution/src/main/resources/demo-base/etc/keystore b/jetty-distribution/src/main/resources/demo-base/etc/keystore
deleted file mode 100644
index 08f6cda..0000000
--- a/jetty-distribution/src/main/resources/demo-base/etc/keystore
+++ /dev/null
Binary files differ
diff --git a/jetty-distribution/src/main/resources/demo-base/webapps/ROOT/index.html b/jetty-distribution/src/main/resources/demo-base/webapps/ROOT/index.html
index ce03053..4d5a13f 100644
--- a/jetty-distribution/src/main/resources/demo-base/webapps/ROOT/index.html
+++ b/jetty-distribution/src/main/resources/demo-base/webapps/ROOT/index.html
@@ -21,7 +21,7 @@
       Container which supports asynchronous server and client
       implementations of the <a href="http://en.wikipedia.org/wiki/HTTP">HTTP</a>,
       <a href="http://en.wikipedia.org/wiki/WebSocket">Websocket</a> and <a
-        href="http://en.wikipedia.org/wiki/SPDY">SPDY</a> protocols. The
+        href="http://en.wikipedia.org/wiki/HTTP/2">HTTP/2</a> protocols. The
       project is 100% <a href="http://en.wikipedia.org/wiki/Open_source">Open Source</a> and hosted by the <a href="http://www.eclipse.org">Eclipse Foundation</a> at <a href="http://www.eclipse.org/jetty/">http://www.eclipse.org/jetty</a>.
     </p>
   </div>
diff --git a/jetty-distribution/src/main/resources/demo-base/webapps/example-moved.xml b/jetty-distribution/src/main/resources/demo-base/webapps/example-moved.xml
index 53d6bfd..e9ad124 100644
--- a/jetty-distribution/src/main/resources/demo-base/webapps/example-moved.xml
+++ b/jetty-distribution/src/main/resources/demo-base/webapps/example-moved.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- Simple handler to redirect from old path to new -->
 <Configure class="org.eclipse.jetty.server.handler.MovedContextHandler">
diff --git a/jetty-distribution/src/main/resources/etc/hawtio.xml b/jetty-distribution/src/main/resources/etc/hawtio.xml
index 228adc1..cc87fce 100644
--- a/jetty-distribution/src/main/resources/etc/hawtio.xml
+++ b/jetty-distribution/src/main/resources/etc/hawtio.xml
@@ -1,15 +1,15 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection">
   <Call name="addHandler">
     <Arg>
       <New class="org.eclipse.jetty.webapp.WebAppContext">
-	<Set name="contextPath">/hawtio</Set>
-	<Set name="war"><Property name="jetty.base" default="."/>/lib/hawtio/hawtio.war</Set>
-	<Set name="extractWAR">true</Set>
-	<Set name="copyWebDir">false</Set>
-	<Set name="defaultsDescriptor"><Property name="jetty.home" default="."/>/etc/webdefault.xml</Set>
+        <Set name="contextPath">/hawtio</Set>
+        <Set name="war"><Property name="jetty.base" default="."/>/lib/hawtio/hawtio.war</Set>
+        <Set name="extractWAR">true</Set>
+        <Set name="copyWebDir">false</Set>
+        <Set name="defaultsDescriptor"><Property name="jetty.home" default="."/>/etc/webdefault.xml</Set>
       </New>
     </Arg>
   </Call>
diff --git a/jetty-distribution/src/main/resources/etc/jamon.xml b/jetty-distribution/src/main/resources/etc/jamon.xml
index d00d9c7..ec1d3f5 100644
--- a/jetty-distribution/src/main/resources/etc/jamon.xml
+++ b/jetty-distribution/src/main/resources/etc/jamon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Mixin the Jamon Handler                                         -->
@@ -18,13 +18,13 @@
   <Ref refid="Contexts">
     <Call name="addHandler">
       <Arg>
-	<New class="org.eclipse.jetty.webapp.WebAppContext">
-	  <Set name="contextPath">/jamon</Set>
-	  <Set name="war"><Property name="jetty.base" default="."/>/lib/jamon/jamon.war</Set>
-	  <Set name="extractWAR">true</Set>
-	  <Set name="copyWebDir">false</Set>
-	  <Set name="defaultsDescriptor"><Property name="jetty.home" default="."/>/etc/webdefault.xml</Set>
-	</New>
+        <New class="org.eclipse.jetty.webapp.WebAppContext">
+          <Set name="contextPath">/jamon</Set>
+          <Set name="war"><Property name="jetty.base" default="."/>/lib/jamon/jamon.war</Set>
+          <Set name="extractWAR">true</Set>
+          <Set name="copyWebDir">false</Set>
+          <Set name="defaultsDescriptor"><Property name="jetty.home" default="."/>/etc/webdefault.xml</Set>
+        </New>
       </Arg>
     </Call>
   </Ref>
diff --git a/jetty-distribution/src/main/resources/etc/jetty-setuid.xml b/jetty-distribution/src/main/resources/etc/jetty-setuid.xml
new file mode 100644
index 0000000..cb33a1a
--- /dev/null
+++ b/jetty-distribution/src/main/resources/etc/jetty-setuid.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<!-- ================================================================ -->
+<!-- Configure the Jetty SetUIDListener                                -->
+<!-- ================================================================ -->
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+
+  <Call name="addLifeCycleListener">
+    <Arg>
+      <New class="org.eclipse.jetty.setuid.SetUIDListener">
+        <Set name="startServerAsPrivileged"><Property name="jetty.setuid.startServerAsPrivileged" deprecated="jetty.startServerAsPrivileged" default="false"/></Set>
+        <Set name="umaskOctal"><Property name="jetty.setuid.umask" deprecated="jetty.umask" default="002"/></Set>
+        <Set name="username"><Property name="jetty.setuid.userName" deprecated="jetty.username" default="jetty"/></Set>
+        <Set name="groupname"><Property name="jetty.setuid.groupName" deprecated="jetty.groupname" default="jetty"/></Set>
+        <!-- uncomment to change the limits on number of open file descriptors for root -->
+        <!--
+        <Call name="setRLimitNoFiles">
+          <Arg>
+            <New class="org.eclipse.jetty.setuid.RLimit">
+              <Set name="soft">20000</Set>
+              <Set name="hard">40000</Set>
+            </New>
+          </Arg>
+        </Call>
+        -->
+      </New>
+    </Arg>
+  </Call>
+</Configure>
diff --git a/jetty-distribution/src/main/resources/etc/jetty-started.xml b/jetty-distribution/src/main/resources/etc/jetty-started.xml
index b958074..faa2839 100644
--- a/jetty-distribution/src/main/resources/etc/jetty-started.xml
+++ b/jetty-distribution/src/main/resources/etc/jetty-started.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Mixin the Start FileNoticeLifeCycleListener                     -->
diff --git a/jetty-distribution/src/main/resources/etc/jminix.xml b/jetty-distribution/src/main/resources/etc/jminix.xml
index 1be4757..15c699e 100644
--- a/jetty-distribution/src/main/resources/etc/jminix.xml
+++ b/jetty-distribution/src/main/resources/etc/jminix.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
  
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
   <Call name="addBean">
diff --git a/jetty-distribution/src/main/resources/etc/jolokia.xml b/jetty-distribution/src/main/resources/etc/jolokia.xml
index 575912f..b6e2404 100644
--- a/jetty-distribution/src/main/resources/etc/jolokia.xml
+++ b/jetty-distribution/src/main/resources/etc/jolokia.xml
@@ -1,15 +1,15 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection">
   <Call name="addHandler">
     <Arg>
       <New class="org.eclipse.jetty.webapp.WebAppContext">
-	<Set name="contextPath">/jolokia</Set>
-	<Set name="war"><Property name="jetty.base" default="."/>/lib/jolokia/jolokia.war</Set>
-	<Set name="extractWAR">true</Set>
-	<Set name="copyWebDir">false</Set>
-	<Set name="defaultsDescriptor"><Property name="jetty.home" default="."/>/etc/webdefault.xml</Set>
+        <Set name="contextPath">/jolokia</Set>
+        <Set name="war"><Property name="jetty.base" default="."/>/lib/jolokia/jolokia.war</Set>
+        <Set name="extractWAR">true</Set>
+        <Set name="copyWebDir">false</Set>
+        <Set name="defaultsDescriptor"><Property name="jetty.home" default="."/>/etc/webdefault.xml</Set>
       </New>
     </Arg>
   </Call>
diff --git a/jetty-distribution/src/main/resources/modules/hawtio.mod b/jetty-distribution/src/main/resources/modules/hawtio.mod
index 2dfb31b..f6d0d9d 100644
--- a/jetty-distribution/src/main/resources/modules/hawtio.mod
+++ b/jetty-distribution/src/main/resources/modules/hawtio.mod
@@ -22,7 +22,7 @@
 http://www.apache.org/licenses/LICENSE-2.0.html
 
 [ini-template]
-
+## Hawt.io configuration
 -Dhawtio.authenticationEnabled=false
 -Dhawtio.dirname=/dirname
 -Dhawtio.config.dir=${jetty.base}/etc/hawtio
diff --git a/jetty-distribution/src/main/resources/modules/jamon.mod b/jetty-distribution/src/main/resources/modules/jamon.mod
index 2aeb2ad..2d1f144 100644
--- a/jetty-distribution/src/main/resources/modules/jamon.mod
+++ b/jetty-distribution/src/main/resources/modules/jamon.mod
@@ -13,8 +13,8 @@
 
 [files]
 lib/jamon/
-http://central.maven.org/maven2/com/jamonapi/jamon/2.79/jamon-2.79.jar|lib/jamon/jamon-2.79.jar
-http://central.maven.org/maven2/com/jamonapi/jamon_war/2.79/jamon_war-2.79.war|lib/jamon/jamon.war
+maven://com.jamonapi/jamon/2.79|lib/jamon/jamon-2.79.jar
+maven://com.jamonapi/jamon_war/2.79/war|lib/jamon/jamon.war
 
 [lib]
 lib/jamon/**.jar
@@ -25,6 +25,7 @@
 http://jamonapi.sourceforge.net/JAMonLicense.html
 
 [ini-template]
+## Jamon Configuration
+# jamon.summaryLabels=demo
 jamon.summaryLabels=default, request.getStatus().contextpath.value.ms
-#jamon.summaryLabels=demo
 
diff --git a/jetty-distribution/src/main/resources/modules/jminix.mod b/jetty-distribution/src/main/resources/modules/jminix.mod
index b35d702..05788f0 100644
--- a/jetty-distribution/src/main/resources/modules/jminix.mod
+++ b/jetty-distribution/src/main/resources/modules/jminix.mod
@@ -11,21 +11,21 @@
 
 [files]
 lib/jminix/
-http://central.maven.org/maven2/org/jminix/jminix/1.1.0/jminix-1.1.0.jar|lib/jminix/jminix-1.1.0.jar
+maven://org.jminix/jminix/1.1.0|lib/jminix/jminix-1.1.0.jar
 http://maven.restlet.com/org/restlet/org.restlet/1.1.5/org.restlet-1.1.5.jar|lib/jminix/org.restlet-1.1.5.jar
 http://maven.restlet.com/org/restlet/org.restlet.ext.velocity/1.1.5/org.restlet.ext.velocity-1.1.5.jar|lib/jminix/org.restlet.ext.velocity-1.1.5.jar
-http://central.maven.org/maven2/org/apache/velocity/velocity/1.5/velocity-1.5.jar|lib/jminix/velocity-1.5.jar
-http://central.maven.org/maven2/oro/oro/2.0.8/oro-2.0.8.jar|lib/jminix/oro-2.0.8.jar
+maven://org.apache.velocity/velocity/1.5|lib/jminix/velocity-1.5.jar
+maven://oro/oro/2.0.8|lib/jminix/oro-2.0.8.jar
 http://maven.restlet.com/com/noelios/restlet/com.noelios.restlet/1.1.5/com.noelios.restlet-1.1.5.jar|lib/jminix/com.noelios.restlet-1.1.5.jar
 http://maven.restlet.com/com/noelios/restlet/com.noelios.restlet.ext.servlet/1.1.5/com.noelios.restlet.ext.servlet-1.1.5.jar|lib/jminix/com.noelios.restlet.ext.servlet-1.1.5.jar
-http://central.maven.org/maven2/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar|lib/jminix/commons-logging-1.1.1.jar
-http://repo2.maven.org/maven2/net/sf/json-lib/json-lib/2.2.3/json-lib-2.2.3-jdk15.jar|lib/jminix/json-lib-2.2.3-jdk15.jar
-http://central.maven.org/maven2/commons-lang/commons-lang/2.4/commons-lang-2.4.jar|lib/jminix/commons-lang-2.4.jar
-http://central.maven.org/maven2/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0.jar|lib/jminix/commons-beanutils-1.7.0.jar
-http://central.maven.org/maven2/commons-collections/commons-collections/3.2/commons-collections-3.2.jar|lib/jminix/commons-collections-3.2.jar
-http://central.maven.org/maven2/net/sf/ezmorph/ezmorph/1.0.6/ezmorph-1.0.6.jar|lib/jminix/ezmorph-1.0.6.jar
-http://central.maven.org/maven2/org/jgroups/jgroups/2.12.1.3.Final/jgroups-2.12.1.3.Final.jar|lib/jminix/jgroups-2.12.1.3.Final.jar
-http://central.maven.org/maven2/org/jasypt/jasypt/1.8/jasypt-1.8.jar|lib/jminix/jasypt-1.8.jar
+maven://commons-logging/commons-logging/1.1.1|lib/jminix/commons-logging-1.1.1.jar
+maven://net.sf.json-lib/json-lib/2.2.3/jar/jdk15|lib/jminix/json-lib-2.2.3-jdk15.jar
+maven://commons-lang/commons-lang/2.4|lib/jminix/commons-lang-2.4.jar
+maven://commons-beanutils/commons-beanutils/1.7.0|lib/jminix/commons-beanutils-1.7.0.jar
+maven://commons-collections/commons-collections/3.2|lib/jminix/commons-collections-3.2.jar
+maven://net.sf.ezmorph/ezmorph/1.0.6|lib/jminix/ezmorph-1.0.6.jar
+maven://org.jgroups/jgroups/2.12.1.3.Final|lib/jminix/jgroups-2.12.1.3.Final.jar
+maven://org.jasypt/jasypt/1.8|lib/jminix/jasypt-1.8.jar
 
 [lib]
 lib/jminix/**.jar
@@ -36,6 +36,6 @@
 http://www.apache.org/licenses/LICENSE-2.0
 
 [ini-template]
-# Jminix Configuration
+## Jminix Configuration
 jminix.port=8088
 
diff --git a/jetty-distribution/src/main/resources/modules/jolokia.mod b/jetty-distribution/src/main/resources/modules/jolokia.mod
index 876c2fc..da8ac8f 100644
--- a/jetty-distribution/src/main/resources/modules/jolokia.mod
+++ b/jetty-distribution/src/main/resources/modules/jolokia.mod
@@ -11,7 +11,7 @@
 etc/jolokia.xml
 
 [files]
-http://repo1.maven.org/maven2/org/jolokia/jolokia-war/1.2.2/jolokia-war-1.2.2.war|lib/jolokia/jolokia.war
+maven://org.jolokia/jolokia-war/1.2.2/war|lib/jolokia/jolokia.war
 
 [license]
 Jolokia is released under the Apache License 2.0
diff --git a/jetty-distribution/src/main/resources/modules/jsp.mod b/jetty-distribution/src/main/resources/modules/jsp.mod
index bb31ca7..a16cc93 100644
--- a/jetty-distribution/src/main/resources/modules/jsp.mod
+++ b/jetty-distribution/src/main/resources/modules/jsp.mod
@@ -5,17 +5,5 @@
 [depend]
 servlet
 annotations
-jsp-impl/${jsp-impl}-jsp
+apache-jsp
 
-[ini-template]
-# JSP Configuration
-
-# Select JSP implementation, choices are
-#   glassfish : The reference implementation 
-#               default in jetty <= 9.1
-#   apache    : The apache version 
-#               default jetty >= 9.2
-jsp-impl=apache
-
-# To use a non-jdk compiler for JSP compilation when using glassfish uncomment next line
-# -Dorg.apache.jasper.compiler.disablejsr199=true
diff --git a/jetty-distribution/src/main/resources/modules/jstl.mod b/jetty-distribution/src/main/resources/modules/jstl.mod
index cb06244..efc310a 100644
--- a/jetty-distribution/src/main/resources/modules/jstl.mod
+++ b/jetty-distribution/src/main/resources/modules/jstl.mod
@@ -1,14 +1,8 @@
 #
-# Jetty JSP Module
+# Jetty JSTL Module
 #
 
 [depend]
 jsp
-jsp-impl/${jsp-impl}-jstl
+apache-jstl
 
-[ini-template]
-# JSTL Configuration
-# The glassfish jsp-impl includes JSTL by default and this module
-# is not required to activate it.
-# The apache jsp-impl does not include JSTL by default and this module
-# is required to put JSTL on the container classpath
diff --git a/jetty-distribution/src/main/resources/modules/protonego.mod b/jetty-distribution/src/main/resources/modules/protonego.mod
deleted file mode 100644
index fbf4d08..0000000
--- a/jetty-distribution/src/main/resources/modules/protonego.mod
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# Protocol Negotiatin Selection Module
-#
-
-[depend]
-protonego-impl/${protonego}
-
-[ini-template]
-# Protocol Negotiation Implementation Selection
-#  choices are:
-#    'npn'  : original implementation for SPDY (now deprecated)
-#    'alpn' : replacement for NPN, in use by current SPDY implementations
-#             and the future HTTP/2 spec
-#  Note: java 1.8+ are ALPN only.
-protonego=alpn
-
-# Configuration for NPN
-# npn.protocols=spdy/3,http/1.1
-# npn.defaultProtocol=http/1.1
-
-# Configuration for ALPN
-# alpn.protocols=h2-14,http/1.1
-# alpn.defaultProtocol=http/1.1
-
diff --git a/jetty-distribution/src/main/resources/modules/setuid.mod b/jetty-distribution/src/main/resources/modules/setuid.mod
index 64c9e23..41ef757 100644
--- a/jetty-distribution/src/main/resources/modules/setuid.mod
+++ b/jetty-distribution/src/main/resources/modules/setuid.mod
@@ -6,14 +6,14 @@
 server
 
 [lib]
-lib/setuid/jetty-setuid-java-1.0.1.jar
+lib/setuid/jetty-setuid-java-1.0.3.jar
 
 [xml]
 etc/jetty-setuid.xml
 
 [ini-template]
 ## SetUID Configuration
-# jetty.startServerAsPrivileged=false
-# jetty.username=jetty
-# jetty.groupname=jetty
-# jetty.umask=002
+# jetty.setuid.startServerAsPrivileged=false
+# jetty.setuid.userName=jetty
+# jetty.setuid.groupName=jetty
+# jetty.setuid.umask=002
diff --git a/jetty-fcgi/fcgi-client/pom.xml b/jetty-fcgi/fcgi-client/pom.xml
index c76a44b..e921b34 100644
--- a/jetty-fcgi/fcgi-client/pom.xml
+++ b/jetty-fcgi/fcgi-client/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <groupId>org.eclipse.jetty.fcgi</groupId>
         <artifactId>fcgi-parent</artifactId>
-        <version>9.2.14-SNAPSHOT</version>
+        <version>9.3.6-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpClientTransportOverFCGI.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpClientTransportOverFCGI.java
index edfcfc2..1e4eeaa 100644
--- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpClientTransportOverFCGI.java
+++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpClientTransportOverFCGI.java
@@ -30,7 +30,10 @@
 import org.eclipse.jetty.http.HttpFields;
 import org.eclipse.jetty.io.EndPoint;
 import org.eclipse.jetty.util.Promise;
+import org.eclipse.jetty.util.annotation.ManagedAttribute;
+import org.eclipse.jetty.util.annotation.ManagedObject;
 
+@ManagedObject("The FastCGI/1.0 client transport")
 public class HttpClientTransportOverFCGI extends AbstractHttpClientTransport
 {
     private final boolean multiplexed;
@@ -53,6 +56,7 @@
         return multiplexed;
     }
 
+    @ManagedAttribute(value = "The scripts root directory", readonly = true)
     public String getScriptRoot()
     {
         return scriptRoot;
@@ -71,12 +75,17 @@
         HttpDestination destination = (HttpDestination)context.get(HTTP_DESTINATION_CONTEXT_KEY);
         @SuppressWarnings("unchecked")
         Promise<Connection> promise = (Promise<Connection>)context.get(HTTP_CONNECTION_PROMISE_CONTEXT_KEY);
-        HttpConnectionOverFCGI connection = new HttpConnectionOverFCGI(endPoint, destination, promise, isMultiplexed());
+        HttpConnectionOverFCGI connection = newHttpConnection(endPoint, destination, promise);
         if (LOG.isDebugEnabled())
             LOG.debug("Created {}", connection);
         return connection;
     }
 
+    protected HttpConnectionOverFCGI newHttpConnection(EndPoint endPoint, HttpDestination destination, Promise<Connection> promise)
+    {
+        return new HttpConnectionOverFCGI(endPoint, destination, promise, isMultiplexed());
+    }
+
     protected void customize(Request request, HttpFields fastCGIHeaders)
     {
         fastCGIHeaders.put(FCGI.Headers.DOCUMENT_ROOT, getScriptRoot());
diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpConnectionOverFCGI.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpConnectionOverFCGI.java
index 8d7c224..4d9691d 100644
--- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpConnectionOverFCGI.java
+++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpConnectionOverFCGI.java
@@ -57,27 +57,17 @@
     private final LinkedList<Integer> requests = new LinkedList<>();
     private final Map<Integer, HttpChannelOverFCGI> channels = new ConcurrentHashMap<>();
     private final AtomicBoolean closed = new AtomicBoolean();
-    private final Flusher flusher;
     private final HttpDestination destination;
     private final Promise<Connection> promise;
     private final boolean multiplexed;
+    private final Flusher flusher;
     private final Delegate delegate;
     private final ClientParser parser;
     private ByteBuffer buffer;
 
-    /**
-     * @deprecated use {@link #HttpConnectionOverFCGI(EndPoint, HttpDestination, Promise, boolean)} instead
-     */
-    @Deprecated
-    public HttpConnectionOverFCGI(EndPoint endPoint, HttpDestination destination, boolean multiplexed)
-    {
-        this(endPoint, destination, new Promise.Adapter<Connection>(), multiplexed);
-        throw new UnsupportedOperationException("Deprecated, use HttpConnectionOverFCGI(EndPoint, HttpDestination, Promise<Connection>, boolean) instead");
-    }
-
     public HttpConnectionOverFCGI(EndPoint endPoint, HttpDestination destination, Promise<Connection> promise, boolean multiplexed)
     {
-        super(endPoint, destination.getHttpClient().getExecutor(), destination.getHttpClient().isDispatchIO());
+        super(endPoint, destination.getHttpClient().getExecutor());
         this.destination = destination;
         this.promise = promise;
         this.multiplexed = multiplexed;
@@ -114,61 +104,68 @@
     @Override
     public void onFillable()
     {
+        buffer = acquireBuffer();
+        process(buffer);
+    }
+
+    private ByteBuffer acquireBuffer()
+    {
         HttpClient client = destination.getHttpClient();
         ByteBufferPool bufferPool = client.getByteBufferPool();
-        buffer = bufferPool.acquire(client.getResponseBufferSize(), true);
-        process();
+        return bufferPool.acquire(client.getResponseBufferSize(), true);
     }
 
-    private void process()
+    private void releaseBuffer(ByteBuffer buffer)
     {
-        if (readAndParse())
-        {
-            HttpClient client = destination.getHttpClient();
-            ByteBufferPool bufferPool = client.getByteBufferPool();
-            bufferPool.release(buffer);
-            // Don't linger the buffer around if we are idle.
-            buffer = null;
-        }
+        assert this.buffer == buffer;
+        HttpClient client = destination.getHttpClient();
+        ByteBufferPool bufferPool = client.getByteBufferPool();
+        bufferPool.release(buffer);
+        this.buffer = null;
     }
 
-    private boolean readAndParse()
+    private void process(ByteBuffer buffer)
     {
-        EndPoint endPoint = getEndPoint();
-        ByteBuffer buffer = this.buffer;
-        while (true)
+        try
         {
-            try
+            EndPoint endPoint = getEndPoint();
+            boolean looping = false;
+            while (true)
             {
-                if (parse(buffer))
-                    return false;
+                if (!looping && parse(buffer))
+                    return;
 
                 int read = endPoint.fill(buffer);
-                if (LOG.isDebugEnabled()) // Avoid boxing of variable 'read'.
+                if (LOG.isDebugEnabled())
                     LOG.debug("Read {} bytes from {}", read, endPoint);
+
                 if (read > 0)
                 {
                     if (parse(buffer))
-                        return false;
+                        return;
                 }
                 else if (read == 0)
                 {
+                    releaseBuffer(buffer);
                     fillInterested();
-                    return true;
+                    return;
                 }
                 else
                 {
+                    releaseBuffer(buffer);
                     shutdown();
-                    return true;
+                    return;
                 }
+
+                looping = true;
             }
-            catch (Exception x)
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug(x);
-                close(x);
-                return false;
-            }
+        }
+        catch (Exception x)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug(x);
+            releaseBuffer(buffer);
+            close(x);
         }
     }
 
@@ -184,7 +181,7 @@
         if (channels.isEmpty())
             close();
         else
-            failAndClose(new EOFException());
+            failAndClose(new EOFException(String.valueOf(getEndPoint())));
     }
 
     @Override
@@ -368,7 +365,7 @@
                             {
                                 if (LOG.isDebugEnabled())
                                     LOG.debug("Content consumed asynchronously, resuming processing");
-                                process();
+                                process(HttpConnectionOverFCGI.this.buffer);
                             }
 
                             @Override
diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpSenderOverFCGI.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpSenderOverFCGI.java
index a257185..abb8138 100644
--- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpSenderOverFCGI.java
+++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpSenderOverFCGI.java
@@ -99,7 +99,7 @@
         int id = getHttpChannel().getRequest();
         boolean hasContent = content.hasContent();
         Generator.Result headersResult = generator.generateRequestHeaders(id, fcgiHeaders,
-                hasContent ? callback : Callback.Adapter.INSTANCE);
+                hasContent ? callback : Callback.NOOP);
         if (hasContent)
         {
             getHttpChannel().flush(headersResult);
diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/ClientGenerator.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/ClientGenerator.java
index aa3a4ff..4f2df94 100644
--- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/ClientGenerator.java
+++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/ClientGenerator.java
@@ -20,6 +20,7 @@
 
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -46,7 +47,7 @@
     {
         request &= 0xFF_FF;
 
-        Charset utf8 = Charset.forName("UTF-8");
+        final Charset utf8 = StandardCharsets.UTF_8;
         List<byte[]> bytes = new ArrayList<>(fields.size() * 2);
         int fieldsLength = 0;
         for (HttpField field : fields)
diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/Generator.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/Generator.java
index 5a47411..78fe927 100644
--- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/Generator.java
+++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/Generator.java
@@ -80,6 +80,7 @@
         return result;
     }
 
+    // TODO: rewrite this class in light of ByteBufferPool.Lease.
     public static class Result implements Callback
     {
         private final List<Callback> callbacks = new ArrayList<>(2);
diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/ServerGenerator.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/ServerGenerator.java
index 091e3eb..d44df4c 100644
--- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/ServerGenerator.java
+++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/generator/ServerGenerator.java
@@ -20,6 +20,7 @@
 
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -54,7 +55,7 @@
     {
         request &= 0xFF_FF;
 
-        Charset utf8 = Charset.forName("UTF-8");
+        final Charset utf8 = StandardCharsets.UTF_8;
         List<byte[]> bytes = new ArrayList<>(fields.size() * 2);
         int length = 0;
 
diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/BeginRequestContentParser.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/BeginRequestContentParser.java
index 2367fb6..912f4f8 100644
--- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/BeginRequestContentParser.java
+++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/BeginRequestContentParser.java
@@ -22,6 +22,16 @@
 
 import org.eclipse.jetty.fcgi.FCGI;
 
+/**
+ * <p>Parser for the BEGIN_REQUEST frame body.</p>
+ * <pre>
+ * struct begin_request_body {
+ *     ushort role;
+ *     ubyte flags;
+ *     ubyte[5] reserved;
+ * }
+ * </pre>
+ */
 public class BeginRequestContentParser extends ContentParser
 {
     private final ServerParser.Listener listener;
diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/EndRequestContentParser.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/EndRequestContentParser.java
index b8173bf..dc07bd5 100644
--- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/EndRequestContentParser.java
+++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/EndRequestContentParser.java
@@ -20,6 +20,16 @@
 
 import java.nio.ByteBuffer;
 
+/**
+ * <p>Parser for the END_REQUEST frame body.</p>
+ * <pre>
+ * struct end_request_body {
+ *     uint applicationStatus;
+ *     ubyte protocolStatus;
+ *     ubyte[3] reserved;
+ * }
+ * </pre>
+ */
 public class EndRequestContentParser extends ContentParser
 {
     private final Parser.Listener listener;
@@ -80,7 +90,7 @@
                     }
                     else
                     {
-                        state = State.APPLICATION_BYTES;
+                        state = State.RESERVED_BYTES;
                         cursor = 0;
                         break;
                     }
@@ -88,7 +98,7 @@
                 case RESERVED_BYTES:
                 {
                     buffer.get();
-                    if (++cursor == 0)
+                    if (++cursor == 3)
                     {
                         onEnd();
                         reset();
diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/HeaderParser.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/HeaderParser.java
index 078105a..7d43112 100644
--- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/HeaderParser.java
+++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/HeaderParser.java
@@ -21,9 +21,28 @@
 import java.nio.ByteBuffer;
 
 import org.eclipse.jetty.fcgi.FCGI;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
 
+/**
+ * <p>Parser for FastCGI frame headers.</p>
+ * <pre>
+ * struct frame_header {
+ *     ubyte version;
+ *     ubyte type;
+ *     ushort requestId;
+ *     ushort contentLength;
+ *     ubyte paddingLength;
+ *     ubyte reserved;
+ * }
+ * </pre>
+ *
+ * @see Parser
+ */
 public class HeaderParser
 {
+    private static final Logger LOG = Log.getLogger(Parser.class);
+
     private State state = State.VERSION;
     private int cursor;
     private int version;
@@ -109,6 +128,8 @@
                 case RESERVED:
                 {
                     buffer.get();
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Parsed request {} header {} length={}", getRequest(), getFrameType(), getContentLength());
                     return true;
                 }
                 default:
diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/ParamsContentParser.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/ParamsContentParser.java
index 4678ad5..dcf34fe 100644
--- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/ParamsContentParser.java
+++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/ParamsContentParser.java
@@ -20,11 +20,44 @@
 
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 
 import org.eclipse.jetty.http.HttpField;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
+/**
+ * <p>Parser for the PARAMS frame body.</p>
+ * <pre>
+ * struct small_name_small_value_params_body {
+ *     ubyte nameLength;
+ *     ubyte valueLength;
+ *     ubyte[] nameBytes;
+ *     ubyte[] valueBytes;
+ * }
+ *
+ * struct small_name_large_value_params_body {
+ *     ubyte nameLength;
+ *     uint valueLength;
+ *     ubyte[] nameBytes;
+ *     ubyte[] valueBytes;
+ * }
+ *
+ * struct large_name_small_value_params_body {
+ *     uint nameLength;
+ *     ubyte valueLength;
+ *     ubyte[] nameBytes;
+ *     ubyte[] valueBytes;
+ * }
+ *
+ * struct large_name_large_value_params_body {
+ *     uint nameLength;
+ *     uint valueLength;
+ *     ubyte[] nameBytes;
+ *     ubyte[] valueBytes;
+ * }
+ * </pre>
+ */
 public class ParamsContentParser extends ContentParser
 {
     private static final Logger LOG = Log.getLogger(ParamsContentParser.class);
@@ -179,7 +212,7 @@
                 }
                 case PARAM:
                 {
-                    Charset utf8 = Charset.forName("UTF-8");
+                    Charset utf8 = StandardCharsets.UTF_8;
                     onParam(new String(nameBytes, utf8), new String(valueBytes, utf8));
                     partialReset();
                     if (length == 0)
diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/Parser.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/Parser.java
index cb86d66..be2ac48 100644
--- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/Parser.java
+++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/Parser.java
@@ -22,9 +22,33 @@
 
 import org.eclipse.jetty.fcgi.FCGI;
 import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
 
+/**
+ * <p>The FastCGI protocol exchanges <em>frames</em>.</p>
+ * <pre>
+ * struct frame {
+ *     ubyte version;
+ *     ubyte type;
+ *     ushort requestId;
+ *     ushort contentLength;
+ *     ubyte paddingLength;
+ *     ubyte reserved;
+ *     ubyte[] content;
+ *     ubyte[] padding;
+ * }
+ * </pre>
+ * <p>Depending on the {@code type}, the content may have a different format,
+ * so there are specialized content parsers.</p>
+ *
+ * @see HeaderParser
+ * @see ContentParser
+ */
 public abstract class Parser
 {
+    private static final Logger LOG = Log.getLogger(Parser.class);
+
     protected final HeaderParser headerParser = new HeaderParser();
     private State state = State.HEADER;
     private int padding;
@@ -56,6 +80,9 @@
                     else
                     {
                         ContentParser.Result result = contentParser.parse(buffer);
+                        if (LOG.isDebugEnabled())
+                            LOG.debug("Parsed request {} content {} result={}", headerParser.getRequest(), headerParser.getFrameType(), result);
+
                         if (result == ContentParser.Result.PENDING)
                         {
                             // Not enough data, signal to read/parse more.
diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/ResponseContentParser.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/ResponseContentParser.java
index 18900fb..6d0fefa 100644
--- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/ResponseContentParser.java
+++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/ResponseContentParser.java
@@ -18,11 +18,13 @@
 
 package org.eclipse.jetty.fcgi.parser;
 
+import java.io.EOFException;
 import java.nio.ByteBuffer;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.eclipse.jetty.fcgi.FCGI;
+import org.eclipse.jetty.http.BadMessageException;
 import org.eclipse.jetty.http.HttpField;
 import org.eclipse.jetty.http.HttpFields;
 import org.eclipse.jetty.http.HttpHeader;
@@ -32,6 +34,14 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
+/**
+ * <p>The parser for STDOUT type frame bodies.</p>
+ * <p>STDOUT frame bodies contain both the HTTP headers (but not the response line)
+ * and the HTTP content (either Content-Length delimited or chunked).</p>
+ * <p>For this reason, a special HTTP parser is used to parse the frames body.
+ * This special HTTP parser is configured to skip the response line, and to
+ * parse HTTP headers and HTTP content.</p>
+ */
 public class ResponseContentParser extends StreamContentParser
 {
     private static final Logger LOG = Log.getLogger(ResponseContentParser.class);
@@ -71,7 +81,7 @@
         parsers.remove(request);
     }
 
-    private class ResponseParser implements HttpParser.ResponseHandler<ByteBuffer>
+    private class ResponseParser implements HttpParser.ResponseHandler
     {
         private final HttpFields fields = new HttpFields();
         private ClientParser.Listener listener;
@@ -89,12 +99,12 @@
 
         public boolean parse(ByteBuffer buffer)
         {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Response {} {} content {} {}", request, FCGI.StreamType.STD_OUT, state, buffer);
-
             int remaining = buffer.remaining();
             while (remaining > 0)
             {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Response {} {}, state {} {}", request, FCGI.StreamType.STD_OUT, state, buffer);
+
                 switch (state)
                 {
                     case HEADERS:
@@ -154,7 +164,7 @@
         }
 
         @Override
-        public boolean parsedHeader(HttpField httpField)
+        public void parsedHeader(HttpField httpField)
         {
             try
             {
@@ -190,7 +200,6 @@
                 if (LOG.isDebugEnabled())
                     LOG.debug("Exception while invoking listener " + listener, x);
             }
-            return false;
         }
 
         private void notifyBegin(int code, String reason)
@@ -246,12 +255,12 @@
         {
             if (!seenResponseCode)
             {
-                // No Status header but we have other headers, assume 200 OK
+                // No Status header but we have other headers, assume 200 OK.
                 notifyBegin(200, "OK");
                 notifyHeaders(fields);
             }
             notifyHeaders();
-            // Return from parsing so that we can parse the content
+            // Return from HTTP parsing so that we can parse the content.
             return true;
         }
 
@@ -278,28 +287,41 @@
         @Override
         public boolean messageComplete()
         {
-            // Return from parsing so that we can parse the next headers or the raw content.
-            // No need to notify the listener because it will be done by FCGI_END_REQUEST.
-            return true;
+            // No need to notify the end of the response to the
+            // listener because it will be done by FCGI_END_REQUEST.
+            return false;
         }
 
         @Override
         public void earlyEOF()
         {
-            // TODO
+            fail(new EOFException());
         }
 
         @Override
         public void badMessage(int status, String reason)
         {
-            // TODO
+            fail(new BadMessageException(status, reason));
+        }
+
+        protected void fail(Throwable failure)
+        {
+            try
+            {
+                listener.onFailure(request, failure);
+            }
+            catch (Throwable x)
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Exception while invoking listener " + listener, x);
+            }
         }
     }
 
     // Methods overridden to make them visible here
     private static class FCGIHttpParser extends HttpParser
     {
-        private FCGIHttpParser(ResponseHandler<ByteBuffer> handler)
+        private FCGIHttpParser(ResponseHandler handler)
         {
             super(handler, 65 * 1024, true);
             reset();
diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/StreamContentParser.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/StreamContentParser.java
index a341013..70602a6 100644
--- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/StreamContentParser.java
+++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/parser/StreamContentParser.java
@@ -24,6 +24,10 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
+/**
+ * <p>A stream content parser parses frame bodies of type STDIN, STDOUT and STDERR.</p>
+ * <p>STDOUT frame bodies are handled specially by {@link ResponseContentParser}.
+ */
 public class StreamContentParser extends ContentParser
 {
     private static final Logger LOG = Log.getLogger(StreamContentParser.class);
diff --git a/jetty-fcgi/fcgi-server/pom.xml b/jetty-fcgi/fcgi-server/pom.xml
index d6e5429..99b4ee5 100644
--- a/jetty-fcgi/fcgi-server/pom.xml
+++ b/jetty-fcgi/fcgi-server/pom.xml
@@ -1,73 +1,67 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <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/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.eclipse.jetty.fcgi</groupId>
-        <artifactId>fcgi-parent</artifactId>
-        <version>9.2.14-SNAPSHOT</version>
-    </parent>
+  <parent>
+    <groupId>org.eclipse.jetty.fcgi</groupId>
+    <artifactId>fcgi-parent</artifactId>
+    <version>9.3.6-SNAPSHOT</version>
+  </parent>
 
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>fcgi-server</artifactId>
-    <name>Jetty :: FastCGI :: Server</name>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>fcgi-server</artifactId>
+  <name>Jetty :: FastCGI :: Server</name>
 
-    <properties>
-        <bundle-symbolic-name>${project.groupId}.server</bundle-symbolic-name>
-    </properties>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.server</bundle-symbolic-name>
+  </properties>
 
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>single</goal>
-                        </goals>
-                        <configuration>
-                            <descriptorRefs>
-                                <descriptorRef>config</descriptorRef>
-                            </descriptorRefs>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
+  <build>
+    <plugins>
+    </plugins>
+  </build>
 
-    <dependencies>
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.fcgi</groupId>
-            <artifactId>fcgi-client</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-proxy</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-server</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-servlet</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.spdy</groupId>
-            <artifactId>spdy-http-server</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
+  <dependencies>
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>javax.servlet-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.fcgi</groupId>
+      <artifactId>fcgi-client</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-proxy</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-server</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-servlet</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.http2</groupId>
+      <artifactId>http2-server</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-alpn-server</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-annotations</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
 </project>
diff --git a/jetty-fcgi/fcgi-server/src/main/config/modules/fcgi.mod b/jetty-fcgi/fcgi-server/src/main/config/modules/fcgi.mod
index e837b00..14152d5 100644
--- a/jetty-fcgi/fcgi-server/src/main/config/modules/fcgi.mod
+++ b/jetty-fcgi/fcgi-server/src/main/config/modules/fcgi.mod
@@ -12,4 +12,4 @@
 
 [ini-template]
 ## For configuration of FastCGI contexts, see
-## TODO: documentation url here
+## https://www.eclipse.org/jetty/documentation/current/fastcgi.html
diff --git a/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/HttpChannelOverFCGI.java b/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/HttpChannelOverFCGI.java
index 62e3825..58b48b0 100644
--- a/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/HttpChannelOverFCGI.java
+++ b/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/HttpChannelOverFCGI.java
@@ -18,41 +18,41 @@
 
 package org.eclipse.jetty.fcgi.server;
 
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Locale;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicReference;
 
 import org.eclipse.jetty.fcgi.FCGI;
+import org.eclipse.jetty.http.HostPortHttpField;
 import org.eclipse.jetty.http.HttpField;
-import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpScheme;
 import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
 import org.eclipse.jetty.io.EndPoint;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.HttpChannel;
 import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.HttpInput;
 import org.eclipse.jetty.server.HttpTransport;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
-public class HttpChannelOverFCGI extends HttpChannel<ByteBuffer>
+public class HttpChannelOverFCGI extends HttpChannel
 {
     private static final Logger LOG = Log.getLogger(HttpChannelOverFCGI.class);
 
-    private final List<HttpField> fields = new ArrayList<>();
+    private final HttpFields fields = new HttpFields();
     private final Dispatcher dispatcher;
     private String method;
     private String path;
     private String query;
     private String version;
+    private HostPortHttpField hostPort;
 
-    public HttpChannelOverFCGI(Connector connector, HttpConfiguration configuration, EndPoint endPoint, HttpTransport transport, HttpInput<ByteBuffer> input)
+    public HttpChannelOverFCGI(Connector connector, HttpConfiguration configuration, EndPoint endPoint, HttpTransport transport)
     {
-        super(connector, configuration, endPoint, transport, input);
+        super(connector, configuration, endPoint, transport);
         this.dispatcher = new Dispatcher(connector.getExecutor(), this);
     }
 
@@ -67,26 +67,27 @@
         else if (FCGI.Headers.SERVER_PROTOCOL.equalsIgnoreCase(field.getName()))
             version = field.getValue();
         else
-            fields.add(field);
+            processField(field);
     }
 
-    @Override
-    public boolean headerComplete()
+    private void processField(HttpField field)
+    {
+        HttpField httpField = convertHeader(field);
+        if (httpField != null)
+        {
+            fields.add(httpField);
+            if (HttpHeader.HOST.is(httpField.getName()))
+                hostPort = (HostPortHttpField)httpField;
+        }
+    }
+
+    public void onRequest()
     {
         String uri = path;
         if (query != null && query.length() > 0)
             uri += "?" + query;
-        startRequest(HttpMethod.fromString(method), method, ByteBuffer.wrap(uri.getBytes(StandardCharsets.UTF_8)),
-                HttpVersion.fromString(version));
-
-        for (HttpField fcgiField : fields)
-        {
-            HttpField httpField = convertHeader(fcgiField);
-            if (httpField != null)
-                parsedHeader(httpField);
-        }
-
-        return super.headerComplete();
+        // TODO https?
+        onRequest(new MetaData.Request(method, HttpScheme.HTTP.asString(), hostPort, uri, HttpVersion.fromString(version), fields,Long.MIN_VALUE));
     }
 
     private HttpField convertHeader(HttpField field)
@@ -105,7 +106,11 @@
                 httpName.append(Character.toUpperCase(part.charAt(0)));
                 httpName.append(part.substring(1).toLowerCase(Locale.ENGLISH));
             }
-            return new HttpField(httpName.toString(), field.getValue());
+            String headerName = httpName.toString();
+            if (HttpHeader.HOST.is(headerName))
+                return new HostPortHttpField(field.getValue());
+            else
+                return new HttpField(httpName.toString(), field.getValue());
         }
         return null;
     }
diff --git a/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/HttpTransportOverFCGI.java b/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/HttpTransportOverFCGI.java
index 24210d0..39bc2ea 100644
--- a/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/HttpTransportOverFCGI.java
+++ b/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/HttpTransportOverFCGI.java
@@ -23,9 +23,9 @@
 import org.eclipse.jetty.fcgi.generator.Flusher;
 import org.eclipse.jetty.fcgi.generator.Generator;
 import org.eclipse.jetty.fcgi.generator.ServerGenerator;
-import org.eclipse.jetty.http.HttpGenerator;
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpHeaderValue;
+import org.eclipse.jetty.http.MetaData;
 import org.eclipse.jetty.io.ByteBufferPool;
 import org.eclipse.jetty.server.HttpTransport;
 import org.eclipse.jetty.util.BufferUtil;
@@ -48,16 +48,64 @@
     }
 
     @Override
-    public void send(HttpGenerator.ResponseInfo info, ByteBuffer content, boolean lastContent, Callback callback)
+    public boolean isOptimizedForDirectBuffers()
     {
-        boolean head = this.head = info.isHead();
-        boolean shutdown = this.shutdown = info.getHttpFields().contains(HttpHeader.CONNECTION, HttpHeaderValue.CLOSE.asString());
+        return false;
+    }
+    
+    @Override
+    public void send(MetaData.Response info, boolean head, ByteBuffer content, boolean lastContent, Callback callback)
+    {
+        if (info!=null)
+            commit(info,head,content,lastContent,callback);
+        else
+        {
+            if (head)
+            {
+                if (lastContent)
+                {
+                    Generator.Result result = generateResponseContent(BufferUtil.EMPTY_BUFFER, true, callback);
+                    flusher.flush(result);
+                }
+                else
+                {
+                    // Skip content generation
+                    callback.succeeded();
+                }
+            }
+            else
+            {
+                Generator.Result result = generateResponseContent(content, lastContent, callback);
+                flusher.flush(result);
+            }
+
+            if (lastContent && shutdown)
+                flusher.shutdown();
+        }
+    }
+
+    @Override
+    public boolean isPushSupported()
+    {
+        return false;
+    }
+    
+    @Override
+    public void push(org.eclipse.jetty.http.MetaData.Request request)
+    {   
+        // LOG.debug("ignore push in {}",this);
+    }
+    
+    private void commit(MetaData.Response info, boolean head, ByteBuffer content, boolean lastContent, Callback callback)
+    {
+        this.head = head;
+        boolean shutdown = this.shutdown = info.getFields().contains(HttpHeader.CONNECTION, HttpHeaderValue.CLOSE.asString());
 
         if (head)
         {
             if (lastContent)
             {
-                Generator.Result headersResult = generateResponseHeaders(info, Callback.Adapter.INSTANCE);
+                Generator.Result headersResult = generateResponseHeaders(info, Callback.NOOP);
                 Generator.Result contentResult = generateResponseContent(BufferUtil.EMPTY_BUFFER, true, callback);
                 flusher.flush(headersResult, contentResult);
             }
@@ -69,7 +117,7 @@
         }
         else
         {
-            Generator.Result headersResult = generateResponseHeaders(info, Callback.Adapter.INSTANCE);
+            Generator.Result headersResult = generateResponseHeaders(info, Callback.NOOP);
             Generator.Result contentResult = generateResponseContent(content, lastContent, callback);
             flusher.flush(headersResult, contentResult);
         }
@@ -78,35 +126,9 @@
             flusher.shutdown();
     }
 
-    @Override
-    public void send(ByteBuffer content, boolean lastContent, Callback callback)
+    protected Generator.Result generateResponseHeaders(MetaData.Response info, Callback callback)
     {
-        if (head)
-        {
-            if (lastContent)
-            {
-                Generator.Result result = generateResponseContent(BufferUtil.EMPTY_BUFFER, true, callback);
-                flusher.flush(result);
-            }
-            else
-            {
-                // Skip content generation
-                callback.succeeded();
-            }
-        }
-        else
-        {
-            Generator.Result result = generateResponseContent(content, lastContent, callback);
-            flusher.flush(result);
-        }
-
-        if (lastContent && shutdown)
-            flusher.shutdown();
-    }
-
-    protected Generator.Result generateResponseHeaders(HttpGenerator.ResponseInfo info, Callback callback)
-    {
-        return generator.generateResponseHeaders(request, info.getStatus(), info.getReason(), info.getHttpFields(), callback);
+        return generator.generateResponseHeaders(request, info.getStatus(), info.getReason(), info.getFields(), callback);
     }
 
     protected Generator.Result generateResponseContent(ByteBuffer buffer, boolean lastContent, Callback callback)
@@ -115,13 +137,13 @@
     }
 
     @Override
-    public void abort()
+    public void abort(Throwable failure)
     {
         aborted = true;
     }
 
     @Override
-    public void completed()
+    public void onCompleted()
     {
     }
 }
diff --git a/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/ServerFCGIConnection.java b/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/ServerFCGIConnection.java
index 9809dd9..2b87a91 100644
--- a/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/ServerFCGIConnection.java
+++ b/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/ServerFCGIConnection.java
@@ -29,9 +29,9 @@
 import org.eclipse.jetty.io.AbstractConnection;
 import org.eclipse.jetty.io.ByteBufferPool;
 import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.server.ByteBufferQueuedHttpInput;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpInput;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
@@ -82,11 +82,13 @@
                 }
                 else if (read == 0)
                 {
+                    bufferPool.release(buffer);
                     fillInterested();
                     break;
                 }
                 else
                 {
+                    bufferPool.release(buffer);
                     shutdown();
                     break;
                 }
@@ -96,11 +98,8 @@
         {
             if (LOG.isDebugEnabled())
                 LOG.debug(x);
-            // TODO: fail and close ?
-        }
-        finally
-        {
             bufferPool.release(buffer);
+            // TODO: fail and close ?
         }
     }
 
@@ -122,8 +121,7 @@
         {
             // TODO: handle flags
             HttpChannelOverFCGI channel = new HttpChannelOverFCGI(connector, configuration, getEndPoint(),
-                    new HttpTransportOverFCGI(connector.getByteBufferPool(), flusher, request, sendStatus200),
-                    new ByteBufferQueuedHttpInput());
+                    new HttpTransportOverFCGI(connector.getByteBufferPool(), flusher, request, sendStatus200));
             HttpChannelOverFCGI existing = channels.putIfAbsent(request, channel);
             if (existing != null)
                 throw new IllegalStateException();
@@ -149,8 +147,8 @@
                 LOG.debug("Request {} headers on {}", request, channel);
             if (channel != null)
             {
-                if (channel.headerComplete())
-                    channel.dispatch();
+                channel.onRequest();
+                channel.dispatch();
             }
         }
 
@@ -162,8 +160,9 @@
                 LOG.debug("Request {} {} content {} on {}", request, stream, buffer, channel);
             if (channel != null)
             {
-                if (channel.content(buffer))
-                    channel.dispatch();
+                ByteBuffer copy = ByteBuffer.allocate(buffer.remaining());
+                copy.put(buffer).flip();
+                channel.onContent(new HttpInput.Content(copy));
             }
             return false;
         }
@@ -176,8 +175,7 @@
                 LOG.debug("Request {} end on {}", request, channel);
             if (channel != null)
             {
-                if (channel.messageComplete())
-                    channel.dispatch();
+                channel.onRequestComplete();
             }
         }
 
@@ -189,7 +187,7 @@
                 LOG.debug("Request {} failure on {}: {}", request, channel, failure);
             if (channel != null)
             {
-                channel.badMessage(400, failure.toString());
+                channel.onBadMessage(400, failure.toString());
             }
         }
     }
diff --git a/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/proxy/FastCGIProxyServlet.java b/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/proxy/FastCGIProxyServlet.java
index b725ccf..8587042 100644
--- a/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/proxy/FastCGIProxyServlet.java
+++ b/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/proxy/FastCGIProxyServlet.java
@@ -19,29 +19,35 @@
 package org.eclipse.jetty.fcgi.server.proxy;
 
 import java.net.URI;
+import java.util.List;
+import java.util.TreeMap;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 import org.eclipse.jetty.client.HttpClient;
 import org.eclipse.jetty.client.api.Request;
 import org.eclipse.jetty.fcgi.FCGI;
 import org.eclipse.jetty.fcgi.client.http.HttpClientTransportOverFCGI;
+import org.eclipse.jetty.http.HttpField;
 import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpScheme;
 import org.eclipse.jetty.proxy.AsyncProxyServlet;
-import org.eclipse.jetty.proxy.ProxyServlet;
 
 /**
- * Specific implementation of {@link ProxyServlet.Transparent} for FastCGI.
- * <p />
+ * Specific implementation of {@link org.eclipse.jetty.proxy.AsyncProxyServlet.Transparent} for FastCGI.
+ * <p>
  * This servlet accepts a HTTP request and transforms it into a FastCGI request
  * that is sent to the FastCGI server specified in the <code>proxyTo</code>
  * init-param.
- * <p />
+ * <p>
  * This servlet accepts two additional init-params:
  * <ul>
  *     <li><code>scriptRoot</code>, mandatory, that must be set to the directory where
@@ -64,6 +70,7 @@
 {
     public static final String SCRIPT_ROOT_INIT_PARAM = "scriptRoot";
     public static final String SCRIPT_PATTERN_INIT_PARAM = "scriptPattern";
+    public static final String ORIGINAL_URI_ATTRIBUTE_INIT_PARAM = "originalURIAttribute";
     public static final String FASTCGI_HTTPS_INIT_PARAM = "fastCGI.HTTPS";
 
     private static final String REMOTE_ADDR_ATTRIBUTE = FastCGIProxyServlet.class.getName() + ".remoteAddr";
@@ -75,6 +82,7 @@
     private static final String REQUEST_URI_ATTRIBUTE = FastCGIProxyServlet.class.getName() + ".requestURI";
 
     private Pattern scriptPattern;
+    private String originalURIAttribute;
     private boolean fcgiHTTPS;
 
     @Override
@@ -87,6 +95,8 @@
             value = "(.+?\\.php)";
         scriptPattern = Pattern.compile(value);
 
+        originalURIAttribute = getInitParameter(ORIGINAL_URI_ATTRIBUTE_INIT_PARAM);
+
         fcgiHTTPS = Boolean.parseBoolean(getInitParameter(FASTCGI_HTTPS_INIT_PARAM));
     }
 
@@ -101,33 +111,69 @@
     }
 
     @Override
-    protected void customizeProxyRequest(Request proxyRequest, HttpServletRequest request)
+    protected void sendProxyRequest(HttpServletRequest request, HttpServletResponse proxyResponse, Request proxyRequest)
     {
         proxyRequest.attribute(REMOTE_ADDR_ATTRIBUTE, request.getRemoteAddr());
         proxyRequest.attribute(REMOTE_PORT_ATTRIBUTE, String.valueOf(request.getRemotePort()));
         proxyRequest.attribute(SERVER_NAME_ATTRIBUTE, request.getServerName());
         proxyRequest.attribute(SERVER_ADDR_ATTRIBUTE, request.getLocalAddr());
         proxyRequest.attribute(SERVER_PORT_ATTRIBUTE, String.valueOf(request.getLocalPort()));
-
         proxyRequest.attribute(SCHEME_ATTRIBUTE, request.getScheme());
 
-        // If we are forwarded or included, retain the original request URI.
-        String originalPath = (String)request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);
-        String originalQuery = (String)request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING);
-        if (originalPath == null)
+        // Has the original URI been rewritten ?
+        String originalURI = null;
+        if (originalURIAttribute != null)
+            originalURI = (String)request.getAttribute(originalURIAttribute);
+
+        if (originalURI == null)
         {
-            originalPath = (String)request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI);
-            originalQuery = (String)request.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING);
-        }
-        if (originalPath != null)
-        {
-            String originalURI = originalPath;
-            if (originalQuery != null)
-                originalURI += "?" + originalQuery;
-            proxyRequest.attribute(REQUEST_URI_ATTRIBUTE, originalURI);
+            // If we are forwarded or included, retain the original request URI.
+            String originalPath = (String)request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);
+            String originalQuery = (String)request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING);
+            if (originalPath == null)
+            {
+                originalPath = (String)request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI);
+                originalQuery = (String)request.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING);
+            }
+            if (originalPath != null)
+            {
+                originalURI = originalPath;
+                if (originalQuery != null)
+                    originalURI += "?" + originalQuery;
+            }
         }
 
-        super.customizeProxyRequest(proxyRequest, request);
+        if (originalURI != null)
+            proxyRequest.attribute(REQUEST_URI_ATTRIBUTE, originalURI);
+
+        // If the Host header is missing, add it.
+        if (!proxyRequest.getHeaders().containsKey(HttpHeader.HOST.asString()))
+        {
+            String host = request.getServerName();
+            int port = request.getServerPort();
+            if (!getHttpClient().isDefaultPort(request.getScheme(), port))
+                host += ":" + port;
+            proxyRequest.header(HttpHeader.HOST, host);
+            proxyRequest.header(HttpHeader.X_FORWARDED_HOST, host);
+        }
+
+        // PHP does not like multiple Cookie headers, coalesce into one.
+        List<String> cookies = proxyRequest.getHeaders().getValuesList(HttpHeader.COOKIE.asString());
+        if (cookies.size() > 1)
+        {
+            StringBuilder builder = new StringBuilder();
+            for (int i = 0; i < cookies.size(); ++i)
+            {
+                if (i > 0)
+                    builder.append("; ");
+                String cookie = cookies.get(i);
+                builder.append(cookie);
+            }
+            proxyRequest.header(HttpHeader.COOKIE, null);
+            proxyRequest.header(HttpHeader.COOKIE, builder.toString());
+        }
+
+        super.sendProxyRequest(request, proxyResponse, proxyRequest);
     }
 
     protected void customizeFastCGIHeaders(Request proxyRequest, HttpFields fastCGIHeaders)
@@ -183,6 +229,16 @@
         {
             super.customize(request, fastCGIHeaders);
             customizeFastCGIHeaders(request, fastCGIHeaders);
+            if (_log.isDebugEnabled())
+            {
+                TreeMap<String, String> fcgi = new TreeMap<>();
+                for (HttpField field : fastCGIHeaders)
+                    fcgi.put(field.getName(), field.getValue());
+                String eol = System.lineSeparator();
+                _log.debug("FastCGI variables{}{}", eol, fcgi.entrySet().stream()
+                        .map(entry -> String.format("%s: %s", entry.getKey(), entry.getValue()))
+                        .collect(Collectors.joining(eol)));
+            }
         }
     }
 }
diff --git a/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/proxy/TryFilesFilter.java b/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/proxy/TryFilesFilter.java
index 5cdfa1d..715d65c 100644
--- a/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/proxy/TryFilesFilter.java
+++ b/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/proxy/TryFilesFilter.java
@@ -24,6 +24,7 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
@@ -36,11 +37,11 @@
 
 /**
  * Inspired by nginx's try_files functionality.
- * <p />
+ * <p>
  * This filter accepts the <code>files</code> init-param as a list of space-separated
  * file URIs. The special token <code>$path</code> represents the current request URL's
  * path (the portion after the context path).
- * <p />
+ * <p>
  * Typical example of how this filter can be configured is the following:
  * <pre>
  * &lt;filter&gt;
@@ -58,7 +59,7 @@
  * failing that it will forward the request to <code>index.php?p=/path/to/resource.ext</code>.
  * The last file URI specified in the list is therefore the "fallback" to which the request
  * is forwarded to in case no previous files can be found.
- * <p />
+ * <p>
  * The files are resolved using {@link ServletContext#getResource(String)} to make sure
  * that only files visible to the application are served.
  *
diff --git a/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/AbstractHttpClientServerTest.java b/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/AbstractHttpClientServerTest.java
index 843dbd8..35b75f5 100644
--- a/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/AbstractHttpClientServerTest.java
+++ b/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/AbstractHttpClientServerTest.java
@@ -20,7 +20,7 @@
 
 import java.util.concurrent.atomic.AtomicLong;
 
-import org.eclipse.jetty.client.ConnectionPool;
+import org.eclipse.jetty.client.DuplexConnectionPool;
 import org.eclipse.jetty.client.HttpClient;
 import org.eclipse.jetty.client.HttpDestination;
 import org.eclipse.jetty.client.LeakTrackingConnectionPool;
@@ -37,10 +37,10 @@
 import org.eclipse.jetty.toolchain.test.TestTracker;
 import org.eclipse.jetty.util.LeakDetector;
 import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.hamcrest.Matchers;
 import org.junit.After;
 import org.junit.Rule;
 
-import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertThat;
 
 public abstract class AbstractHttpClientServerTest
@@ -71,7 +71,7 @@
 
         QueuedThreadPool executor = new QueuedThreadPool();
         executor.setName(executor.getName() + "-client");
-        
+
         client = new HttpClient(new HttpClientTransportOverFCGI(1, false, "")
         {
             @Override
@@ -80,7 +80,7 @@
                 return new HttpDestinationOverFCGI(client, origin)
                 {
                     @Override
-                    protected ConnectionPool newConnectionPool(HttpClient client)
+                    protected DuplexConnectionPool newConnectionPool(HttpClient client)
                     {
                         return new LeakTrackingConnectionPool(this, client.getMaxConnectionsPerDestination(), this)
                         {
@@ -105,15 +105,15 @@
     {
         System.gc();
 
-        assertThat("Server BufferPool - leaked acquires", serverBufferPool.getLeakedAcquires(), is(0L));
-        assertThat("Server BufferPool - leaked releases", serverBufferPool.getLeakedReleases(), is(0L));
-        assertThat("Server BufferPool - unreleased", serverBufferPool.getLeakedResources(), is(0L));
-        
-        assertThat("Client BufferPool - leaked acquires", clientBufferPool.getLeakedAcquires(), is(0L));
-        assertThat("Client BufferPool - leaked releases", clientBufferPool.getLeakedReleases(), is(0L));
-        assertThat("Client BufferPool - unreleased", clientBufferPool.getLeakedResources(), is(0L));
-        
-        assertThat("Connection Leaks", connectionLeaks.get(), is(0L));
+        assertThat("Server BufferPool - leaked acquires", serverBufferPool.getLeakedAcquires(), Matchers.is(0L));
+        assertThat("Server BufferPool - leaked releases", serverBufferPool.getLeakedReleases(), Matchers.is(0L));
+        assertThat("Server BufferPool - unreleased", serverBufferPool.getLeakedResources(), Matchers.is(0L));
+
+        assertThat("Client BufferPool - leaked acquires", clientBufferPool.getLeakedAcquires(), Matchers.is(0L));
+        assertThat("Client BufferPool - leaked releases", clientBufferPool.getLeakedReleases(), Matchers.is(0L));
+        assertThat("Client BufferPool - unreleased", clientBufferPool.getLeakedResources(), Matchers.is(0L));
+
+        assertThat("Connection Leaks", connectionLeaks.get(), Matchers.is(0L));
 
         if (client != null)
             client.stop();
diff --git a/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/EmptyServerHandler.java b/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/EmptyServerHandler.java
index 37307ab..f9e01f3 100644
--- a/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/EmptyServerHandler.java
+++ b/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/EmptyServerHandler.java
@@ -19,6 +19,7 @@
 package org.eclipse.jetty.fcgi.server;
 
 import java.io.IOException;
+
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
diff --git a/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/HttpClientTest.java b/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/HttpClientTest.java
index 885f774..135dd7a 100644
--- a/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/HttpClientTest.java
+++ b/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/HttpClientTest.java
@@ -32,6 +32,7 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.zip.GZIPOutputStream;
+
 import javax.servlet.ServletException;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
@@ -95,6 +96,35 @@
     }
 
     @Test
+    public void testGETResponseWithBigContent() throws Exception
+    {
+        final byte[] data = new byte[16 * 1024 * 1024];
+        new Random().nextBytes(data);
+        start(new AbstractHandler()
+        {
+            @Override
+            public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+            {
+                // Setting the Content-Length triggers the HTTP
+                // content mode for response content parsing,
+                // otherwise the RAW content mode is used.
+                response.setContentLength(data.length);
+                response.getOutputStream().write(data);
+                baseRequest.setHandled(true);
+            }
+        });
+
+        Request request = client.newRequest(scheme + "://localhost:" + connector.getLocalPort());
+        FutureResponseListener listener = new FutureResponseListener(request, data.length);
+        request.send(listener);
+        ContentResponse response = listener.get(15, TimeUnit.SECONDS);
+        Assert.assertNotNull(response);
+        Assert.assertEquals(200, response.getStatus());
+        byte[] content = response.getContent();
+        Assert.assertArrayEquals(data, content);
+    }
+
+    @Test
     public void testGETWithParametersResponseWithContent() throws Exception
     {
         final String paramName1 = "a";
@@ -419,7 +449,7 @@
         Assert.assertNotNull(response);
         Assert.assertEquals(200, response.getStatus());
     }
-    
+
     @Test
     public void testConnectionIdleTimeout() throws Exception
     {
diff --git a/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/DrupalHTTP2FastCGIProxyServer.java b/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/DrupalHTTP2FastCGIProxyServer.java
new file mode 100644
index 0000000..fc1bca5
--- /dev/null
+++ b/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/DrupalHTTP2FastCGIProxyServer.java
@@ -0,0 +1,95 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.fcgi.server.proxy;
+
+import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
+import org.eclipse.jetty.http2.HTTP2Cipher;
+import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.NegotiatingServerConnectionFactory;
+import org.eclipse.jetty.server.SecureRequestCustomizer;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.SslConnectionFactory;
+import org.eclipse.jetty.servlet.DefaultServlet;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+
+public class DrupalHTTP2FastCGIProxyServer
+{
+    public static void main(String[] args) throws Exception
+    {
+        SslContextFactory sslContextFactory = new SslContextFactory();
+        sslContextFactory.setEndpointIdentificationAlgorithm("");
+        sslContextFactory.setKeyStorePath("src/test/resources/keystore.jks");
+        sslContextFactory.setKeyStorePassword("storepwd");
+        sslContextFactory.setTrustStorePath("src/test/resources/truststore.jks");
+        sslContextFactory.setTrustStorePassword("storepwd");
+        sslContextFactory.setCipherComparator(new HTTP2Cipher.CipherComparator());
+
+        Server server = new Server();
+
+        // HTTP(S) Configuration
+        HttpConfiguration config = new HttpConfiguration();
+        HttpConfiguration https_config = new HttpConfiguration(config);
+        https_config.addCustomizer(new SecureRequestCustomizer());
+        
+        // HTTP2 factory
+        HTTP2ServerConnectionFactory h2 = new HTTP2ServerConnectionFactory(https_config);
+        NegotiatingServerConnectionFactory.checkProtocolNegotiationAvailable();
+        ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory();
+        alpn.setDefaultProtocol(h2.getProtocol());
+        
+        // SSL Factory
+        SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory,alpn.getProtocol());
+        
+        // HTTP2 Connector
+        ServerConnector http2Connector = 
+            new ServerConnector(server,ssl,alpn,h2,new HttpConnectionFactory(https_config));
+        http2Connector.setPort(8443);
+        http2Connector.setIdleTimeout(15000);
+        server.addConnector(http2Connector);
+
+        // Drupal seems to only work on the root context,
+        // at least out of the box without additional plugins
+
+        String root = "/home/simon/programs/drupal-7.23";
+
+        ServletContextHandler context = new ServletContextHandler(server, "/");
+        context.setResourceBase(root);
+        context.setWelcomeFiles(new String[]{"index.php"});
+
+        // Serve static resources
+        ServletHolder defaultServlet = new ServletHolder(DefaultServlet.class);
+        defaultServlet.setName("default");
+        context.addServlet(defaultServlet, "/");
+
+        // FastCGI
+        ServletHolder fcgiServlet = new ServletHolder(FastCGIProxyServlet.class);
+        fcgiServlet.setInitParameter(FastCGIProxyServlet.SCRIPT_ROOT_INIT_PARAM, root);
+        fcgiServlet.setInitParameter("proxyTo", "http://localhost:9000");
+        fcgiServlet.setInitParameter("prefix", "/");
+        fcgiServlet.setInitParameter(FastCGIProxyServlet.SCRIPT_PATTERN_INIT_PARAM, "(.+\\.php)");
+        context.addServlet(fcgiServlet, "*.php");
+
+        server.start();
+    }
+}
diff --git a/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/DrupalSPDYFastCGIProxyServer.java b/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/DrupalSPDYFastCGIProxyServer.java
deleted file mode 100644
index 948997d..0000000
--- a/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/DrupalSPDYFastCGIProxyServer.java
+++ /dev/null
@@ -1,77 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.fcgi.server.proxy;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.servlet.DefaultServlet;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnector;
-import org.eclipse.jetty.spdy.server.http.PushStrategy;
-import org.eclipse.jetty.spdy.server.http.ReferrerPushStrategy;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-
-public class DrupalSPDYFastCGIProxyServer
-{
-    public static void main(String[] args) throws Exception
-    {
-        SslContextFactory sslContextFactory = new SslContextFactory();
-        sslContextFactory.setEndpointIdentificationAlgorithm("");
-        sslContextFactory.setKeyStorePath("src/test/resources/keystore.jks");
-        sslContextFactory.setKeyStorePassword("storepwd");
-        sslContextFactory.setTrustStorePath("src/test/resources/truststore.jks");
-        sslContextFactory.setTrustStorePassword("storepwd");
-
-        Server server = new Server();
-
-        Map<Short, PushStrategy> pushStrategies = new HashMap<>();
-        pushStrategies.put(SPDY.V3, new ReferrerPushStrategy());
-        HTTPSPDYServerConnector connector = new HTTPSPDYServerConnector(server, sslContextFactory, pushStrategies);
-        connector.setPort(8443);
-        server.addConnector(connector);
-
-        // Drupal seems to only work on the root context,
-        // at least out of the box without additional plugins
-
-        String root = "/home/simon/programs/drupal-7.23";
-
-        ServletContextHandler context = new ServletContextHandler(server, "/");
-        context.setResourceBase(root);
-        context.setWelcomeFiles(new String[]{"index.php"});
-
-        // Serve static resources
-        ServletHolder defaultServlet = new ServletHolder(DefaultServlet.class);
-        defaultServlet.setName("default");
-        context.addServlet(defaultServlet, "/");
-
-        // FastCGI
-        ServletHolder fcgiServlet = new ServletHolder(FastCGIProxyServlet.class);
-        fcgiServlet.setInitParameter(FastCGIProxyServlet.SCRIPT_ROOT_INIT_PARAM, root);
-        fcgiServlet.setInitParameter("proxyTo", "http://localhost:9000");
-        fcgiServlet.setInitParameter("prefix", "/");
-        fcgiServlet.setInitParameter(FastCGIProxyServlet.SCRIPT_PATTERN_INIT_PARAM, "(.+\\.php)");
-        context.addServlet(fcgiServlet, "*.php");
-
-        server.start();
-    }
-}
diff --git a/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/FastCGIProxyServletTest.java b/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/FastCGIProxyServletTest.java
index e326d42..c6dae98 100644
--- a/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/FastCGIProxyServletTest.java
+++ b/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/FastCGIProxyServletTest.java
@@ -19,12 +19,9 @@
 package org.eclipse.jetty.fcgi.server.proxy;
 
 import java.io.IOException;
-import java.net.URI;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Collection;
 import java.util.Random;
 import java.util.concurrent.TimeUnit;
+
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
@@ -33,7 +30,6 @@
 import org.eclipse.jetty.client.HttpClient;
 import org.eclipse.jetty.client.api.ContentResponse;
 import org.eclipse.jetty.client.api.Request;
-import org.eclipse.jetty.client.api.Response;
 import org.eclipse.jetty.client.util.FutureResponseListener;
 import org.eclipse.jetty.fcgi.server.ServerFCGIConnectionFactory;
 import org.eclipse.jetty.server.HttpConfiguration;
@@ -41,7 +37,7 @@
 import org.eclipse.jetty.server.ServerConnector;
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Test;
@@ -52,9 +48,9 @@
 public class FastCGIProxyServletTest
 {
     @Parameterized.Parameters
-    public static Collection<Object[]> parameters()
+    public static Object[] parameters()
     {
-        return Arrays.asList(new Object[]{true}, new Object[]{false});
+        return new Object[]{true, false};
     }
 
     private final boolean sendStatus200;
@@ -70,7 +66,9 @@
 
     public void prepare(HttpServlet servlet) throws Exception
     {
-        server = new Server();
+        QueuedThreadPool serverThreads = new QueuedThreadPool();
+        serverThreads.setName("server");
+        server = new Server(serverThreads);
         httpConnector = new ServerConnector(server);
         server.addConnector(httpConnector);
 
@@ -84,20 +82,24 @@
         FastCGIProxyServlet fcgiServlet = new FastCGIProxyServlet()
         {
             @Override
-            protected URI rewriteURI(HttpServletRequest request)
+            protected String rewriteTarget(HttpServletRequest request)
             {
-                return URI.create("http://localhost:" + fcgiConnector.getLocalPort() + servletPath + request.getServletPath());
+                return "http://localhost:" + fcgiConnector.getLocalPort() + servletPath + request.getServletPath();
             }
         };
         ServletHolder fcgiServletHolder = new ServletHolder(fcgiServlet);
-        context.addServlet(fcgiServletHolder, "*.php");
+        fcgiServletHolder.setName("fcgi");
         fcgiServletHolder.setInitParameter(FastCGIProxyServlet.SCRIPT_ROOT_INIT_PARAM, "/scriptRoot");
         fcgiServletHolder.setInitParameter("proxyTo", "http://localhost");
         fcgiServletHolder.setInitParameter(FastCGIProxyServlet.SCRIPT_PATTERN_INIT_PARAM, "(.+?\\.php)");
+        context.addServlet(fcgiServletHolder, "*.php");
 
         context.addServlet(new ServletHolder(servlet), servletPath + "/*");
 
+        QueuedThreadPool clientThreads = new QueuedThreadPool();
+        clientThreads.setName("client");
         client = new HttpClient();
+        client.setExecutor(clientThreads);
         server.addBean(client);
 
         server.start();
@@ -145,21 +147,17 @@
         });
 
         Request request = client.newRequest("localhost", httpConnector.getLocalPort())
-                .onResponseContentAsync(new Response.AsyncContentListener()
+                .onResponseContentAsync((response, content, callback) ->
                 {
-                    @Override
-                    public void onContent(Response response, ByteBuffer content, Callback callback)
+                    try
                     {
-                        try
-                        {
-                            if (delay > 0)
-                                TimeUnit.MILLISECONDS.sleep(delay);
-                            callback.succeeded();
-                        }
-                        catch (InterruptedException x)
-                        {
-                            callback.failed(x);
-                        }
+                        if (delay > 0)
+                            TimeUnit.MILLISECONDS.sleep(delay);
+                        callback.succeeded();
+                    }
+                    catch (InterruptedException x)
+                    {
+                        callback.failed(x);
                     }
                 })
                 .path(path);
diff --git a/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/TryFilesFilterTest.java b/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/TryFilesFilterTest.java
index c1b9f2e..dad5aed 100644
--- a/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/TryFilesFilterTest.java
+++ b/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/TryFilesFilterTest.java
@@ -20,6 +20,7 @@
 
 import java.io.IOException;
 import java.util.EnumSet;
+
 import javax.servlet.DispatcherType;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
diff --git a/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/WordPressHTTP2FastCGIProxyServer.java b/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/WordPressHTTP2FastCGIProxyServer.java
new file mode 100644
index 0000000..4771763
--- /dev/null
+++ b/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/WordPressHTTP2FastCGIProxyServer.java
@@ -0,0 +1,101 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.fcgi.server.proxy;
+
+import java.util.EnumSet;
+
+import javax.servlet.DispatcherType;
+
+import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
+import org.eclipse.jetty.http2.HTTP2Cipher;
+import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.NegotiatingServerConnectionFactory;
+import org.eclipse.jetty.server.SecureRequestCustomizer;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.SslConnectionFactory;
+import org.eclipse.jetty.servlet.DefaultServlet;
+import org.eclipse.jetty.servlet.FilterHolder;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+
+public class WordPressHTTP2FastCGIProxyServer
+{
+    public static void main(String[] args) throws Exception
+    {
+        int tlsPort = 8443;
+
+        SslContextFactory sslContextFactory = new SslContextFactory();
+        sslContextFactory.setEndpointIdentificationAlgorithm("");
+        sslContextFactory.setKeyStorePath("src/test/resources/keystore.jks");
+        sslContextFactory.setKeyStorePassword("storepwd");
+        sslContextFactory.setTrustStorePath("src/test/resources/truststore.jks");
+        sslContextFactory.setTrustStorePassword("storepwd");
+        sslContextFactory.setCipherComparator(new HTTP2Cipher.CipherComparator());
+
+        Server server = new Server();
+
+        // HTTP(S) Configuration
+        HttpConfiguration config = new HttpConfiguration();
+        HttpConfiguration https_config = new HttpConfiguration(config);
+        https_config.addCustomizer(new SecureRequestCustomizer());
+        
+        // HTTP2 factory
+        HTTP2ServerConnectionFactory h2 = new HTTP2ServerConnectionFactory(https_config);
+        NegotiatingServerConnectionFactory.checkProtocolNegotiationAvailable();
+        ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory();
+        alpn.setDefaultProtocol(h2.getProtocol());
+        
+        // SSL Factory
+        SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory,alpn.getProtocol());
+        
+        // HTTP2 Connector
+        ServerConnector http2Connector = 
+            new ServerConnector(server,ssl,alpn,h2,new HttpConnectionFactory(https_config));
+        http2Connector.setPort(tlsPort);
+        http2Connector.setIdleTimeout(15000);
+        server.addConnector(http2Connector);
+
+        String root = "/home/simon/programs/wordpress-3.7.1";
+
+        ServletContextHandler context = new ServletContextHandler(server, "/wp");
+        context.setResourceBase(root);
+        context.setWelcomeFiles(new String[]{"index.php"});
+
+        // Serve static resources
+        ServletHolder defaultServlet = new ServletHolder("default", DefaultServlet.class);
+        context.addServlet(defaultServlet, "/");
+
+        FilterHolder tryFilesFilter = context.addFilter(TryFilesFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
+//        tryFilesFilter.setInitParameter(TryFilesFilter.FILES_INIT_PARAM, "$path $path/index.php"); // Permalink /?p=123
+        tryFilesFilter.setInitParameter(TryFilesFilter.FILES_INIT_PARAM, "$path /index.php?p=$path"); // Permalink /%year%/%monthnum%/%postname%
+
+        // FastCGI
+        ServletHolder fcgiServlet = context.addServlet(FastCGIProxyServlet.class, "*.php");
+        fcgiServlet.setInitParameter(FastCGIProxyServlet.SCRIPT_ROOT_INIT_PARAM, root);
+        fcgiServlet.setInitParameter("proxyTo", "http://localhost:9000");
+        fcgiServlet.setInitParameter("prefix", "/");
+        fcgiServlet.setInitParameter(FastCGIProxyServlet.SCRIPT_PATTERN_INIT_PARAM, "(.+?\\.php)");
+
+        server.start();
+    }
+}
diff --git a/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/WordPressSPDYFastCGIProxyServer.java b/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/WordPressSPDYFastCGIProxyServer.java
deleted file mode 100644
index 716227a..0000000
--- a/jetty-fcgi/fcgi-server/src/test/java/org/eclipse/jetty/fcgi/server/proxy/WordPressSPDYFastCGIProxyServer.java
+++ /dev/null
@@ -1,85 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.fcgi.server.proxy;
-
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.Map;
-import javax.servlet.DispatcherType;
-
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.servlet.DefaultServlet;
-import org.eclipse.jetty.servlet.FilterHolder;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnector;
-import org.eclipse.jetty.spdy.server.http.PushStrategy;
-import org.eclipse.jetty.spdy.server.http.ReferrerPushStrategy;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-
-public class WordPressSPDYFastCGIProxyServer
-{
-    public static void main(String[] args) throws Exception
-    {
-        int port = 8080;
-        int tlsPort = 8443;
-
-        SslContextFactory sslContextFactory = new SslContextFactory();
-        sslContextFactory.setEndpointIdentificationAlgorithm("");
-        sslContextFactory.setKeyStorePath("src/test/resources/keystore.jks");
-        sslContextFactory.setKeyStorePassword("storepwd");
-        sslContextFactory.setTrustStorePath("src/test/resources/truststore.jks");
-        sslContextFactory.setTrustStorePassword("storepwd");
-
-        Server server = new Server();
-
-        Map<Short, PushStrategy> pushStrategies = new HashMap<>();
-        pushStrategies.put(SPDY.V3, new ReferrerPushStrategy());
-        HTTPSPDYServerConnector tlsConnector = new HTTPSPDYServerConnector(server, sslContextFactory, pushStrategies);
-        tlsConnector.setPort(tlsPort);
-        server.addConnector(tlsConnector);
-        HTTPSPDYServerConnector connector = new HTTPSPDYServerConnector(server, null, pushStrategies);
-        connector.setPort(port);
-        server.addConnector(connector);
-
-        String root = "/home/simon/programs/wordpress-3.7.1";
-
-        ServletContextHandler context = new ServletContextHandler(server, "/wp");
-        context.setResourceBase(root);
-        context.setWelcomeFiles(new String[]{"index.php"});
-
-        // Serve static resources
-        ServletHolder defaultServlet = new ServletHolder("default", DefaultServlet.class);
-        context.addServlet(defaultServlet, "/");
-
-        FilterHolder tryFilesFilter = context.addFilter(TryFilesFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
-//        tryFilesFilter.setInitParameter(TryFilesFilter.FILES_INIT_PARAM, "$path $path/index.php"); // Permalink /?p=123
-        tryFilesFilter.setInitParameter(TryFilesFilter.FILES_INIT_PARAM, "$path /index.php?p=$path"); // Permalink /%year%/%monthnum%/%postname%
-
-        // FastCGI
-        ServletHolder fcgiServlet = context.addServlet(FastCGIProxyServlet.class, "*.php");
-        fcgiServlet.setInitParameter(FastCGIProxyServlet.SCRIPT_ROOT_INIT_PARAM, root);
-        fcgiServlet.setInitParameter("proxyTo", "http://localhost:9000");
-        fcgiServlet.setInitParameter("prefix", "/");
-        fcgiServlet.setInitParameter(FastCGIProxyServlet.SCRIPT_PATTERN_INIT_PARAM, "(.+?\\.php)");
-
-        server.start();
-    }
-}
diff --git a/jetty-fcgi/pom.xml b/jetty-fcgi/pom.xml
index a8b374e..67abce6 100644
--- a/jetty-fcgi/pom.xml
+++ b/jetty-fcgi/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <groupId>org.eclipse.jetty</groupId>
         <artifactId>jetty-project</artifactId>
-        <version>9.2.14-SNAPSHOT</version>
+        <version>9.3.6-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
diff --git a/jetty-gcloud/gcloud-session-manager/pom.xml b/jetty-gcloud/gcloud-session-manager/pom.xml
new file mode 100644
index 0000000..f187a7a
--- /dev/null
+++ b/jetty-gcloud/gcloud-session-manager/pom.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+    <groupId>org.eclipse.jetty.gcloud</groupId>
+    <artifactId>gcloud-parent</artifactId>
+    <version>9.3.6-SNAPSHOT</version>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>gcloud-session-manager</artifactId>
+  <name>Jetty :: GCloud :: Session Manager</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-server</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.google.gcloud</groupId>
+      <artifactId>gcloud-java-datastore</artifactId>
+      <version>${gcloud.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-webapp</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>websocket-servlet</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>websocket-server</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.toolchain</groupId>
+      <artifactId>jetty-test-helper</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+ <properties>
+   <bundle-symbolic-name>${project.groupId}.session</bundle-symbolic-name>
+ </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+          <groupId>org.apache.felix</groupId>
+          <artifactId>maven-bundle-plugin</artifactId>
+          <extensions>true</extensions>
+          <executions>
+              <execution>
+                  <goals>
+                      <goal>manifest</goal>
+                  </goals>
+                  <configuration>
+                      <instructions>
+                          <Export-Package>org.eclipse.jetty.gcloud.session.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}";</Export-Package>
+                      </instructions>
+                    </configuration>
+                 </execution>
+            </executions>
+      </plugin>
+   </plugins>
+  </build>
+
+</project>
diff --git a/jetty-gcloud/gcloud-session-manager/src/main/config/etc/jetty-gcloud-sessions.xml b/jetty-gcloud/gcloud-session-manager/src/main/config/etc/jetty-gcloud-sessions.xml
new file mode 100644
index 0000000..72f9da6
--- /dev/null
+++ b/jetty-gcloud/gcloud-session-manager/src/main/config/etc/jetty-gcloud-sessions.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+
+  <!-- ============================================================================================== -->
+  <!-- GCloud configuration.                                                                          -->
+  <!-- Note: passwords can use jetty obfuscation.  See                                                -->
+  <!-- https://www.eclipse.org/jetty/documentation/current/configuring-security-secure-passwords.html -->
+  <!-- ============================================================================================== -->
+  <New id="gconf" class="org.eclipse.jetty.gcloud.session.GCloudConfiguration">
+    <!-- To contact remote gclouddatastore set the following properties in start.ini -->
+    <!-- Either set jetty.gcloudSession.projectId or use system property/env var DATASTORE_DATASET-->
+    <Set name="projectId"><Property name="jetty.gcloudSession.projectId"/></Set>
+    <Set name="p12File"><Property name="jetty.gcloudSession.p12File"/></Set>
+    <Set name="serviceAccount"><Property name="jetty.gcloudSession.serviceAccount"/></Set>
+    <Set name="password"><Property name="jetty.gcloudSession.password"/></Set>
+  </New>
+
+
+  <!-- ===================================================================== -->
+  <!-- Configure a GCloudSessionIdManager                                    -->
+  <!-- ===================================================================== -->
+  <Set name="sessionIdManager">
+    <New id="idMgr" class="org.eclipse.jetty.gcloud.session.GCloudSessionIdManager">
+      <Arg>
+        <Ref id="Server"/>
+      </Arg>
+      <Set name="workerName"><Property name="jetty.gcloudSession.workerName" default="node1"/></Set>
+      <Set name="config"><Ref id="gconf"/></Set>
+    </New>
+  </Set>
+
+</Configure>
diff --git a/jetty-gcloud/gcloud-session-manager/src/main/config/modules/gcloud-sessions.mod b/jetty-gcloud/gcloud-session-manager/src/main/config/modules/gcloud-sessions.mod
new file mode 100644
index 0000000..0780a60
--- /dev/null
+++ b/jetty-gcloud/gcloud-session-manager/src/main/config/modules/gcloud-sessions.mod
@@ -0,0 +1,91 @@
+#
+# Jetty GCloudDatastore Session Manager module
+#
+
+[depend]
+annotations
+webapp
+
+[files]
+
+maven://com.google.gcloud/gcloud-java-datastore/0.0.7|lib/gcloud/gcloud-java-datastore-0.0.7.jar
+maven://com.google.gcloud/gcloud-java-core/0.0.7|lib/gcloud/gcloud-java-core-0.0.7.jar
+maven://com.google.auth/google-auth-library-credentials/0.1.0|lib/gcloud/google-auth-library-credentials-0.1.0.jar
+maven://com.google.auth/google-auth-library-oauth2-http/0.1.0|lib/gcloud/google-auth-library-oauth2-http-0.1.0.jar
+maven://com.google.http-client/google-http-client-jackson2/1.19.0|lib/gcloud/google-http-client-jackson2-1.19.0.jar
+maven://com.fasterxml.jackson.core/jackson-core/2.1.3|lib/gcloud/jackson-core-2.1.3.jar
+maven://com.google.http-client/google-http-client/1.20.0|lib/gcloud/google-http-client-1.20.0.jar
+maven://com.google.code.findbugs/jsr305/1.3.9|lib/gcloud/jsr305-1.3.9.jar
+maven://org.apache.httpcomponents/httpclient/4.0.1|lib/gcloud/httpclient-4.0.1.jar
+maven://org.apache.httpcomponents/httpcore/4.0.1|lib/gcloud/httpcore-4.0.1.jar
+maven://commons-logging/commons-logging/1.1.1|lib/gcloud/commons-logging-1.1.1.jar
+maven://commons-codec/commons-codec/1.3|lib/gcloud/commons-codec-1.3.jar
+maven://com.google.oauth-client/google-oauth-client/1.20.0|lib/gcloud//google-oauth-client-1.20.0.jar
+maven://com.google.guava/guava/18.0|lib/gcloud/guava-18.0.jar
+maven://com.google.api-client/google-api-client-appengine/1.20.0|lib/gcloud/google-api-client-appengine-1.20.0.jar
+maven://com.google.oauth-client/google-oauth-client-appengine/1.20.0|lib/gcloud/google-oauth-client-appengine-1.20.0.jar
+maven://com.google.oauth-client/google-oauth-client-servlet/1.20.0|lib/gcloud/google-oauth-client-servlet-1.20.0.jar
+maven://com.google.http-client/google-http-client-jdo/1.20.0|lib/gcloud/google-http-client-jdo-1.20.0.jar
+maven://com.google.api-client/google-api-client-servlet/1.20.0|lib/gcloud/google-api-client-servlet-1.20.0.jar
+maven://javax.jdo/jdo2-api/2.3-eb|lib/gcloud/jdo2-api-2.3-eb.jar
+maven://javax.transaction/transaction-api/1.1|lib/gcloud/transaction-api-1.1.jar
+maven://com.google.http-client/google-http-client-appengine/1.20.0|lib/gcloud/google-http-client-appengine-1.20.0.jar
+maven://com.google.http-client/google-http-client-jackson/1.20.0|lib/gcloud/google-http-client-jackson-1.20.0.jar
+maven://org.codehaus.jackson/jackson-core-asl/1.9.11|lib/gcloud/jackson-core-asl-1.9.11.jar
+maven://joda-time/joda-time/2.8.2|lib/gcloud/joda-time-2.8.2.jar
+maven://org.json/json/20090211|lib/gcloud/json-20090211.jar
+maven://com.google.apis/google-api-services-datastore-protobuf/v1beta2-rev1-2.1.2|lib/gcloud/google-api-services-datastore-protobuf-v1beta2-rev1-2.1.2.jar
+maven://com.google.protobuf/protobuf-java/2.5.0|lib/gcloud/protobuf-java-2.5.0.jar
+maven://com.google.http-client/google-http-client-protobuf/1.15.0-rc|lib/gcloud/google-http-client-protobuf-1.15.0-rc.jar
+maven://com.google.api-client/google-api-client/1.15.0-rc|lib/gcloud/google-api-client-1.15.0-rc.jar
+maven://com.google.apis/google-api-services-datastore/v1beta2-rev23-1.19.0|lib/gcloud/google-api-services-datastore-v1beta2-rev23-1.19.0.jar
+
+[lib]
+lib/gcloud-session-manager-${jetty.version}.jar
+lib/gcloud/*.jar
+
+[xml]
+etc/jetty-gcloud-sessions.xml
+
+[license]
+GCloudDatastore is an open source project hosted on Github and released under the Apache 2.0 license.
+https://github.com/GoogleCloudPlatform/gcloud-java
+http://www.apache.org/licenses/LICENSE-2.0.html
+
+[ini-template]
+## Unique identifier for this node in the cluster
+# jetty.gcloudSession.workerName=node1
+
+
+## GCloudDatastore Session config
+## If running inside Google cloud all configuration is provided by
+## environment variables and you do not need to set anything in this file.
+##    
+## If running externally to Google:
+##   To contact the remote gcloud datastore:
+##   1. set the DATASTORE_DATASET System property/environment variable to the name of your project
+##      or alternatively set the jetty.gcloudSession.projectId property below.
+##   2. set the jetty.gcloudSession.p12File, jetty.gcloudSession.serviceAccount and 
+##      jetty.gcloudSession.password (supports obfuscation) below.
+##
+##   To contact a local dev gcloud datastore server:
+##   1. set the DATASTORE_DATASET System property/environment variable to the name of your project.
+##   2. set the DATASTORE_HOST System property/environment variable to the url of the dev server
+##      as described at https://cloud.google.com/datastore/docs/tools/devserver#setting_environment_variables
+
+## The gcloud projectId
+## Set this property to connect to remote gcloud datastore. 
+## Or, set the DATASTORE_DATASET System property/env variable instead.
+#jetty.gcloudSession.projectId=
+
+## The p12 file associated with the project.
+## Set this property to connect to remote gcloud datastore
+#jetty.gcloudSession.p12File=
+
+## The serviceAccount for the Datastore.
+## Set this property to connect to to remote gcloud datastore
+#jetty.gcloudSession.serviceAccount=
+
+## The password (can be obfuscated).
+## Set this property to connect to remote gcloud datastore
+#jetty.gcloudSession.password=
diff --git a/jetty-gcloud/gcloud-session-manager/src/main/java/org/eclipse/jetty/gcloud/session/GCloudConfiguration.java b/jetty-gcloud/gcloud-session-manager/src/main/java/org/eclipse/jetty/gcloud/session/GCloudConfiguration.java
new file mode 100644
index 0000000..3ce4acb
--- /dev/null
+++ b/jetty-gcloud/gcloud-session-manager/src/main/java/org/eclipse/jetty/gcloud/session/GCloudConfiguration.java
@@ -0,0 +1,201 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.security.KeyStore;
+import java.security.PrivateKey;
+import java.util.Properties;
+
+import org.eclipse.jetty.util.security.Password;
+
+import com.google.gcloud.AuthCredentials;
+import com.google.gcloud.datastore.DatastoreOptions;
+
+
+
+/**
+ * GCloudConfiguration
+ *
+ *
+ */
+public class GCloudConfiguration
+{
+    public static final String PROJECT_ID = "projectId";
+    public static final String P12 = "p12";
+    public static final String PASSWORD = "password";
+    public static final String SERVICE_ACCOUNT = "serviceAccount";
+    
+    private String _projectId;
+    private String _p12Filename;
+    private File _p12File;
+    private String _serviceAccount;
+    private String _passwordSet;
+    private String _password;
+    private AuthCredentials _authCredentials;
+    private DatastoreOptions _options;
+    
+    /**
+     * Generate a configuration from a properties file
+     * 
+     * @param propsFile
+     * @return
+     * @throws IOException
+     */
+    public static GCloudConfiguration fromFile(String propsFile)
+    throws IOException
+    {
+        if (propsFile == null)
+            throw new IllegalArgumentException ("Null properties file");
+        
+        File f = new File(propsFile);
+        if (!f.exists())
+            throw new IllegalArgumentException("No such file "+f.getAbsolutePath());
+        Properties props = new Properties();
+        try (FileInputStream is=new FileInputStream(f))
+        {
+            props.load(is);
+        }
+        
+        GCloudConfiguration config = new GCloudConfiguration();
+        config.setProjectId(props.getProperty(PROJECT_ID));
+        config.setP12File(props.getProperty(P12));
+        config.setPassword(props.getProperty(PASSWORD));
+        config.setServiceAccount(props.getProperty(SERVICE_ACCOUNT));
+        return config;
+    }
+    
+    
+    
+    public String getProjectId()
+    {
+        return _projectId;
+    }
+
+    public File getP12File()
+    {
+        return _p12File;
+    }
+
+    public String getServiceAccount()
+    {
+        return _serviceAccount;
+    }
+
+
+    public void setProjectId(String projectId)
+    {
+        checkForModification();
+        _projectId = projectId;
+    }
+
+    public void setP12File (String file)
+    {
+        checkForModification();
+        _p12Filename = file;
+
+    }
+    
+    
+    public void setServiceAccount (String serviceAccount)
+    {
+        checkForModification();
+        _serviceAccount = serviceAccount;
+    }
+    
+
+    public void setPassword (String pwd)
+    {
+        checkForModification();
+        _passwordSet = pwd;
+
+    }
+
+
+    public DatastoreOptions getDatastoreOptions ()
+            throws Exception
+    {
+        if (_options == null)
+        {
+            if (_passwordSet == null && _p12Filename == null && _serviceAccount == null)
+            {
+                //When no values are explicitly presented for auth info, we are either running
+                //1. inside GCE environment, in which case all auth info is derived from the environment
+                //2. outside the GCE environment, but using a local gce dev server, in which case you
+                //   need to set the following 2 environment/system properties
+                //          DATASTORE_HOST: eg http://localhost:9999 - this is the host and port of a local development server
+                //          DATASTORE_DATASET: eg myProj - this is the name of your project          
+                _options = DatastoreOptions.defaultInstance();
+            }
+            else
+            {
+                //When running externally to GCE, you need to provide
+                //explicit auth info. You can either set the projectId explicitly, or you can set the
+                //DATASTORE_DATASET env/system property
+                _p12File = new File(_p12Filename);
+                Password p = new Password(_passwordSet);
+                _password = p.toString();
+                _options = DatastoreOptions.builder()
+                        .projectId(_projectId)
+                        .authCredentials(getAuthCredentials())
+                        .build();
+            }
+        }
+        return _options;
+    }
+
+    /**
+     * @return
+     * @throws Exception
+     */
+    public AuthCredentials getAuthCredentials()
+    throws Exception
+    {
+        if (_authCredentials == null)
+        {
+            if (_password == null)
+                throw new IllegalStateException("No password");
+
+            if (_p12File == null || !_p12File.exists())
+                throw new IllegalStateException("No p12 file: "+(_p12File==null?"null":_p12File.getAbsolutePath()));
+
+            if (_serviceAccount == null)
+                throw new IllegalStateException("No service account");
+
+            char[] pwdChars = _password.toCharArray();
+            KeyStore keystore = KeyStore.getInstance("PKCS12");
+            keystore.load(new FileInputStream(getP12File()), pwdChars);
+            PrivateKey privateKey = (PrivateKey) keystore.getKey("privatekey", pwdChars);
+            _authCredentials = AuthCredentials.createFor(getServiceAccount(), privateKey);
+        }
+        return _authCredentials;
+    }
+    
+    /**
+     * @throws IllegalStateException
+     */
+    protected void checkForModification () throws IllegalStateException
+    {
+        if (_authCredentials != null || _options != null)
+            throw new IllegalStateException("Cannot modify auth configuration after datastore initialized");     
+    }
+}
diff --git a/jetty-gcloud/gcloud-session-manager/src/main/java/org/eclipse/jetty/gcloud/session/GCloudSessionIdManager.java b/jetty-gcloud/gcloud-session-manager/src/main/java/org/eclipse/jetty/gcloud/session/GCloudSessionIdManager.java
new file mode 100644
index 0000000..e8a32a5
--- /dev/null
+++ b/jetty-gcloud/gcloud-session-manager/src/main/java/org/eclipse/jetty/gcloud/session/GCloudSessionIdManager.java
@@ -0,0 +1,323 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.gcloud.session;
+
+import java.util.Random;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.SessionManager;
+import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.server.session.AbstractSession;
+import org.eclipse.jetty.server.session.AbstractSessionIdManager;
+import org.eclipse.jetty.server.session.SessionHandler;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+import com.google.gcloud.datastore.Datastore;
+import com.google.gcloud.datastore.DatastoreFactory;
+import com.google.gcloud.datastore.Entity;
+import com.google.gcloud.datastore.Key;
+import com.google.gcloud.datastore.KeyFactory;
+
+
+
+/**
+ * GCloudSessionIdManager
+ *
+ * 
+ * 
+ */
+public class GCloudSessionIdManager extends AbstractSessionIdManager
+{
+    private  final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session");
+    public static final int DEFAULT_IDLE_EXPIRY_MULTIPLE = 2;
+    public static final String KIND = "GCloudSessionId";
+    private Server _server;
+    private Datastore _datastore;
+    private KeyFactory _keyFactory;
+    private GCloudConfiguration _config;
+    
+    
+    
+ 
+    /**
+     * @param server
+     */
+    public GCloudSessionIdManager(Server server)
+    {
+        super();
+        _server = server;
+    }
+
+    /**
+     * @param server
+     * @param random
+     */
+    public GCloudSessionIdManager(Server server, Random random)
+    {
+       super(random);
+       _server = server;
+    }
+
+
+
+    /** 
+     * Start the id manager.
+     * @see org.eclipse.jetty.server.session.AbstractSessionIdManager#doStart()
+     */
+    @Override
+    protected void doStart() throws Exception
+    {
+        if (_config == null)
+            throw new IllegalStateException("No gcloud configuration specified");       
+        
+
+        _datastore = DatastoreFactory.instance().get(_config.getDatastoreOptions());
+        _keyFactory = _datastore.newKeyFactory().kind(KIND);
+  
+        super.doStart();
+    }
+
+
+    
+    /** 
+     * Stop the id manager
+     * @see org.eclipse.jetty.server.session.AbstractSessionIdManager#doStop()
+     */
+    @Override
+    protected void doStop() throws Exception
+    {
+        super.doStop();
+    }
+
+    
+   
+
+    
+    /** 
+     * Check to see if the given session id is being
+     * used by a session in any context.
+     * 
+     * This method will consult the cluster.
+     * 
+     * @see org.eclipse.jetty.server.SessionIdManager#idInUse(java.lang.String)
+     */
+    @Override
+    public boolean idInUse(String id)
+    {
+        if (id == null)
+            return false;
+        
+        String clusterId = getClusterId(id);
+        
+        //ask the cluster - this should also tickle the idle expiration timer on the sessionid entry
+        //keeping it valid
+        try
+        {
+            return exists(clusterId);
+        }
+        catch (Exception e)
+        {
+            LOG.warn("Problem checking inUse for id="+clusterId, e);
+            return false;
+        }
+        
+    }
+
+    /** 
+     * Remember a new in-use session id.
+     * 
+     * This will save the in-use session id to the cluster.
+     * 
+     * @see org.eclipse.jetty.server.SessionIdManager#addSession(javax.servlet.http.HttpSession)
+     */
+    @Override
+    public void addSession(HttpSession session)
+    {
+        if (session == null)
+            return;
+
+        //insert into the store
+        insert (((AbstractSession)session).getClusterId());
+    }
+
+  
+
+    
+    public GCloudConfiguration getConfig()
+    {
+        return _config;
+    }
+
+    public void setConfig(GCloudConfiguration config)
+    {
+        _config = config;
+    }
+
+    
+    
+    /** 
+     * Remove a session id from the list of in-use ids.
+     * 
+     * This will remvove the corresponding session id from the cluster.
+     * 
+     * @see org.eclipse.jetty.server.SessionIdManager#removeSession(javax.servlet.http.HttpSession)
+     */
+    @Override
+    public void removeSession(HttpSession session)
+    {
+        if (session == null)
+            return;
+
+        //delete from the cache
+        delete (((AbstractSession)session).getClusterId());
+    }
+
+    /** 
+     * Remove a session id. This compels all other contexts who have a session
+     * with the same id to also remove it.
+     * 
+     * @see org.eclipse.jetty.server.SessionIdManager#invalidateAll(java.lang.String)
+     */
+    @Override
+    public void invalidateAll(String id)
+    {
+        //delete the session id from list of in-use sessions
+        delete (id);
+
+
+        //tell all contexts that may have a session object with this id to
+        //get rid of them
+        Handler[] contexts = _server.getChildHandlersByClass(ContextHandler.class);
+        for (int i=0; contexts!=null && i<contexts.length; i++)
+        {
+            SessionHandler sessionHandler = ((ContextHandler)contexts[i]).getChildHandlerByClass(SessionHandler.class);
+            if (sessionHandler != null)
+            {
+                SessionManager manager = sessionHandler.getSessionManager();
+
+                if (manager != null && manager instanceof GCloudSessionManager)
+                {
+                    ((GCloudSessionManager)manager).invalidateSession(id);
+                }
+            }
+        }
+
+    }
+
+    /** 
+     * Change a session id. 
+     * 
+     * Typically this occurs when a previously existing session has passed through authentication.
+     * 
+     * @see org.eclipse.jetty.server.session.AbstractSessionIdManager#renewSessionId(java.lang.String, java.lang.String, javax.servlet.http.HttpServletRequest)
+     */
+    @Override
+    public void renewSessionId(String oldClusterId, String oldNodeId, HttpServletRequest request)
+    {
+        //generate a new id
+        String newClusterId = newSessionId(request.hashCode());
+
+        delete(oldClusterId);
+        insert(newClusterId);
+
+
+        //tell all contexts to update the id 
+        Handler[] contexts = _server.getChildHandlersByClass(ContextHandler.class);
+        for (int i=0; contexts!=null && i<contexts.length; i++)
+        {
+            SessionHandler sessionHandler = ((ContextHandler)contexts[i]).getChildHandlerByClass(SessionHandler.class);
+            if (sessionHandler != null) 
+            {
+                SessionManager manager = sessionHandler.getSessionManager();
+
+                if (manager != null && manager instanceof GCloudSessionManager)
+                {
+                    ((GCloudSessionManager)manager).renewSessionId(oldClusterId, oldNodeId, newClusterId, getNodeId(newClusterId, request));
+                }
+            }
+        }
+
+    }
+
+    
+    
+    /**
+     * Ask the datastore if a particular id exists.
+     * 
+     * @param id
+     * @return
+     */
+    protected boolean exists (String id)
+    {
+        if (_datastore == null)
+            throw new IllegalStateException ("No DataStore");
+        Key key = _keyFactory.newKey(id);
+        return _datastore.get(key) != null;
+    }
+    
+
+    /**
+     * Put a session id into the cluster.
+     * 
+     * @param id
+     */
+    protected void insert (String id)
+    {        
+        if (_datastore == null)
+            throw new IllegalStateException ("No DataStore");
+
+        Entity entity = Entity.builder(makeKey(id))
+                        .set("id", id).build();
+        _datastore.put(entity);
+    }
+
+   
+   
+    
+    /**
+     * Remove a session id from the cluster.
+     * 
+     * @param id
+     */
+    protected void delete (String id)
+    {
+        if (_datastore == null)
+            throw new IllegalStateException ("No DataStore");
+        
+        _datastore.delete(makeKey(id));
+    }
+    
+    
+
+    /**
+     * Generate a unique key from the session id.
+     * 
+     * @param id
+     * @return
+     */
+    protected Key makeKey (String id)
+    {
+        return _keyFactory.newKey(id);
+    }
+}
diff --git a/jetty-gcloud/gcloud-session-manager/src/main/java/org/eclipse/jetty/gcloud/session/GCloudSessionManager.java b/jetty-gcloud/gcloud-session-manager/src/main/java/org/eclipse/jetty/gcloud/session/GCloudSessionManager.java
new file mode 100644
index 0000000..b6b39a9
--- /dev/null
+++ b/jetty-gcloud/gcloud-session-manager/src/main/java/org/eclipse/jetty/gcloud/session/GCloudSessionManager.java
@@ -0,0 +1,1298 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.gcloud.session;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.locks.ReentrantLock;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.server.handler.ContextHandler.Context;
+import org.eclipse.jetty.server.session.AbstractSession;
+import org.eclipse.jetty.server.session.AbstractSessionManager;
+import org.eclipse.jetty.server.session.MemSession;
+import org.eclipse.jetty.util.ClassLoadingObjectInputStream;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.ScheduledExecutorScheduler;
+import org.eclipse.jetty.util.thread.Scheduler;
+
+import com.google.gcloud.datastore.Blob;
+import com.google.gcloud.datastore.Datastore;
+import com.google.gcloud.datastore.DatastoreFactory;
+import com.google.gcloud.datastore.Entity;
+import com.google.gcloud.datastore.GqlQuery;
+import com.google.gcloud.datastore.Key;
+import com.google.gcloud.datastore.KeyFactory;
+import com.google.gcloud.datastore.Query;
+import com.google.gcloud.datastore.Query.ResultType;
+import com.google.gcloud.datastore.QueryResults;
+
+
+
+/**
+ * GCloudSessionManager
+ * 
+ * 
+ */
+public class GCloudSessionManager extends AbstractSessionManager
+{
+    private  final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session");
+    
+    
+    public static final String KIND = "GCloudSession";
+    public static final int DEFAULT_MAX_QUERY_RESULTS = 100;
+    public static final long DEFAULT_SCAVENGE_SEC = 600; 
+    
+    /**
+     * Sessions known to this node held in memory
+     */
+    private ConcurrentHashMap<String, GCloudSessionManager.Session> _sessions;
+
+    
+    /**
+     * The length of time a session can be in memory without being checked against
+     * the cluster. A value of 0 indicates that the session is never checked against
+     * the cluster - the current node is considered to be the master for the session.
+     *
+     */
+    private long _staleIntervalSec = 0;
+    
+    protected Scheduler.Task _task; //scavenge task
+    protected Scheduler _scheduler;
+    protected Scavenger _scavenger;
+    protected long _scavengeIntervalMs = 1000L * DEFAULT_SCAVENGE_SEC; //10mins
+    protected boolean _ownScheduler;
+    
+    private Datastore _datastore;
+    private KeyFactory _keyFactory;
+
+
+    private SessionEntityConverter _converter;
+
+
+    private int _maxResults = DEFAULT_MAX_QUERY_RESULTS;
+
+
+    /**
+     * Scavenger
+     *
+     */
+    protected class Scavenger implements Runnable
+    {
+
+        @Override
+        public void run()
+        {
+           try
+           {
+               scavenge();
+           }
+           finally
+           {
+               if (_scheduler != null && _scheduler.isRunning())
+                   _task = _scheduler.schedule(this, _scavengeIntervalMs, TimeUnit.MILLISECONDS);
+           }
+        }
+    }
+
+    /**
+     * SessionEntityConverter
+     *
+     *
+     */
+    public class SessionEntityConverter
+    {
+        public  final String CLUSTERID = "clusterId";
+        public  final String CONTEXTPATH = "contextPath";
+        public  final String VHOST = "vhost";
+        public  final String ACCESSED = "accessed";
+        public  final String LASTACCESSED = "lastAccessed";
+        public  final String CREATETIME = "createTime";
+        public  final  String COOKIESETTIME = "cookieSetTime";
+        public  final String LASTNODE = "lastNode";
+        public  final String EXPIRY = "expiry";
+        public  final  String MAXINACTIVE = "maxInactive";
+        public  final  String ATTRIBUTES = "attributes";
+
+      
+        
+        public Entity entityFromSession (Session session, Key key) throws Exception
+        {
+            if (session == null)
+                return null;
+            
+            Entity entity = null;
+            
+            //serialize the attribute map
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            ObjectOutputStream oos = new ObjectOutputStream(baos);
+            oos.writeObject(session.getAttributeMap());
+            oos.flush();
+            
+            //turn a session into an entity
+            entity = Entity.builder(key)
+                    .set(CLUSTERID, session.getId())
+                    .set(CONTEXTPATH, session.getContextPath())
+                    .set(VHOST, session.getVHost())
+                    .set(ACCESSED, session.getAccessed())
+                    .set(LASTACCESSED, session.getLastAccessedTime())
+                    .set(CREATETIME, session.getCreationTime())
+                    .set(COOKIESETTIME, session.getCookieSetTime())
+                    .set(LASTNODE,session.getLastNode())
+                    .set(EXPIRY, session.getExpiry())
+                    .set(MAXINACTIVE, session.getMaxInactiveInterval())
+                    .set(ATTRIBUTES, Blob.copyFrom(baos.toByteArray())).build();
+                     
+            return entity;
+        }
+        
+        public Session sessionFromEntity (Entity entity) throws Exception
+        {
+            if (entity == null)
+                return null;
+
+            final AtomicReference<Session> reference = new AtomicReference<Session>();
+            final AtomicReference<Exception> exception = new AtomicReference<Exception>();
+            Runnable load = new Runnable()
+            {
+                public void run ()
+                {
+                    try
+                    {
+                        //turn an entity into a Session
+                        String clusterId = entity.getString(CLUSTERID);
+                        String contextPath = entity.getString(CONTEXTPATH);
+                        String vhost = entity.getString(VHOST);
+                        long accessed = entity.getLong(ACCESSED);
+                        long lastAccessed = entity.getLong(LASTACCESSED);
+                        long createTime = entity.getLong(CREATETIME);
+                        long cookieSetTime = entity.getLong(COOKIESETTIME);
+                        String lastNode = entity.getString(LASTNODE);
+                        long expiry = entity.getLong(EXPIRY);
+                        long maxInactive = entity.getLong(MAXINACTIVE);
+                        Blob blob = (Blob) entity.getBlob(ATTRIBUTES);
+
+                        Session session = new Session (clusterId, createTime, accessed, maxInactive);
+                        session.setLastNode(lastNode);
+                        session.setContextPath(contextPath);
+                        session.setVHost(vhost);
+                        session.setCookieSetTime(cookieSetTime);
+                        session.setLastAccessedTime(lastAccessed);
+                        session.setLastNode(lastNode);
+                        session.setExpiry(expiry);
+                        try (ClassLoadingObjectInputStream ois = new ClassLoadingObjectInputStream(blob.asInputStream()))
+                        {
+                            Object o = ois.readObject();
+                            session.addAttributes((Map<String,Object>)o);
+                        }
+                        reference.set(session);
+                    }
+                    catch (Exception e)
+                    {
+                        exception.set(e);
+                    }
+                }
+            };
+            
+            if (_context==null)
+                load.run();
+            else
+                _context.getContextHandler().handle(null,load);
+   
+           
+            if (exception.get() != null)
+            {
+                exception.get().printStackTrace();
+                throw exception.get();
+            }
+            
+            return reference.get();
+        }
+    }
+    
+    /*
+     * Every time a Session is put into the cache one of these objects
+     * is created to copy the data out of the in-memory session, and 
+     * every time an object is read from the cache one of these objects
+     * a fresh Session object is created based on the data held by this
+     * object.
+     */
+    public class SerializableSessionData implements Serializable
+    {
+        /**
+         * 
+         */
+        private static final long serialVersionUID = -7779120106058533486L;
+        String clusterId;
+        String contextPath;
+        String vhost;
+        long accessed;
+        long lastAccessed;
+        long createTime;
+        long cookieSetTime;
+        String lastNode;
+        long expiry;
+        long maxInactive;
+        Map<String, Object> attributes;
+
+        public SerializableSessionData()
+        {
+
+        }
+
+       
+       public SerializableSessionData(Session s)
+       {
+           clusterId = s.getClusterId();
+           contextPath = s.getContextPath();
+           vhost = s.getVHost();
+           accessed = s.getAccessed();
+           lastAccessed = s.getLastAccessedTime();
+           createTime = s.getCreationTime();
+           cookieSetTime = s.getCookieSetTime();
+           lastNode = s.getLastNode();
+           expiry = s.getExpiry();
+           maxInactive = s.getMaxInactiveInterval();
+           attributes = s.getAttributeMap(); // TODO pointer, not a copy
+       }
+        
+        private void writeObject(java.io.ObjectOutputStream out) throws IOException
+        {  
+            out.writeUTF(clusterId); //session id
+            out.writeUTF(contextPath); //context path
+            out.writeUTF(vhost); //first vhost
+
+            out.writeLong(accessed);//accessTime
+            out.writeLong(lastAccessed); //lastAccessTime
+            out.writeLong(createTime); //time created
+            out.writeLong(cookieSetTime);//time cookie was set
+            out.writeUTF(lastNode); //name of last node managing
+      
+            out.writeLong(expiry); 
+            out.writeLong(maxInactive);
+            out.writeObject(attributes);
+        }
+        
+        private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException
+        {
+            clusterId = in.readUTF();
+            contextPath = in.readUTF();
+            vhost = in.readUTF();
+            
+            accessed = in.readLong();//accessTime
+            lastAccessed = in.readLong(); //lastAccessTime
+            createTime = in.readLong(); //time created
+            cookieSetTime = in.readLong();//time cookie was set
+            lastNode = in.readUTF(); //last managing node
+            expiry = in.readLong(); 
+            maxInactive = in.readLong();
+            attributes = (HashMap<String,Object>)in.readObject();
+        }
+        
+    }
+    
+
+    
+    /**
+     * Session
+     *
+     * Representation of a session in local memory.
+     */
+    public class Session extends MemSession
+    {
+        
+        private ReentrantLock _lock = new ReentrantLock();
+        
+        /**
+         * The (canonical) context path for with which this session is associated
+         */
+        private String _contextPath;
+        
+        
+        
+        /**
+         * The time in msec since the epoch at which this session should expire
+         */
+        private long _expiryTime; 
+        
+        
+        /**
+         * Time in msec since the epoch at which this session was last read from cluster
+         */
+        private long _lastSyncTime;
+        
+        
+        /**
+         * The workername of last node known to be managing the session
+         */
+        private String _lastNode;
+        
+        
+        /**
+         * If dirty, session needs to be (re)sent to cluster
+         */
+        protected boolean _dirty=false;
+        
+        
+     
+
+        /**
+         * Any virtual hosts for the context with which this session is associated
+         */
+        private String _vhost;
+
+        
+        /**
+         * Count of how many threads are active in this session
+         */
+        private AtomicInteger _activeThreads = new AtomicInteger(0);
+        
+        
+        
+        
+        /**
+         * A new session.
+         * 
+         * @param request
+         */
+        protected Session (HttpServletRequest request)
+        {
+            super(GCloudSessionManager.this,request);
+            long maxInterval = getMaxInactiveInterval();
+            _expiryTime = (maxInterval <= 0 ? 0 : (System.currentTimeMillis() + maxInterval*1000L));
+            _lastNode = getSessionIdManager().getWorkerName();
+           setVHost(GCloudSessionManager.getVirtualHost(_context));
+           setContextPath(GCloudSessionManager.getContextPath(_context));
+           _activeThreads.incrementAndGet(); //access will not be called on a freshly created session so increment here
+        }
+        
+        
+    
+        
+        /**
+         * A restored session.
+         * 
+         * @param sessionId
+         * @param created
+         * @param accessed
+         * @param maxInterval
+         */
+        protected Session (String sessionId, long created, long accessed, long maxInterval)
+        {
+            super(GCloudSessionManager.this, created, accessed, sessionId);
+            _expiryTime = (maxInterval <= 0 ? 0 : (System.currentTimeMillis() + maxInterval*1000L));
+        }
+        
+        /** 
+         * Called on entry to the session.
+         * 
+         * @see org.eclipse.jetty.server.session.AbstractSession#access(long)
+         */
+        @Override
+        protected boolean access(long time)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Access session({}) for context {} on worker {}", getId(), getContextPath(), getSessionIdManager().getWorkerName());
+            try
+            {
+
+                long now = System.currentTimeMillis();
+                //lock so that no other thread can call access or complete until the first one has refreshed the session object if necessary
+                _lock.lock();
+                //a request thread is entering
+                if (_activeThreads.incrementAndGet() == 1)
+                {
+                    //if the first thread, check that the session in memory is not stale, if we're checking for stale sessions
+                    if (getStaleIntervalSec() > 0  && (now - getLastSyncTime()) >= (getStaleIntervalSec() * 1000L))
+                    {
+                        if (LOG.isDebugEnabled())
+                            LOG.debug("Acess session({}) for context {} on worker {} stale session. Reloading.", getId(), getContextPath(), getSessionIdManager().getWorkerName());
+                        refresh();
+                    }
+                }
+            }
+            catch (Exception e)
+            {
+                LOG.warn(e);
+            }
+            finally
+            {            
+                _lock.unlock();
+            }
+
+            if (super.access(time))
+            {
+                int maxInterval=getMaxInactiveInterval();
+                _expiryTime = (maxInterval <= 0 ? 0 : (time + maxInterval*1000L));
+                return true;
+            }
+            return false;
+        }
+
+
+        /**
+         * Exit from session
+         * @see org.eclipse.jetty.server.session.AbstractSession#complete()
+         */
+        @Override
+        protected void complete()
+        {
+            super.complete();
+
+            //lock so that no other thread that might be calling access can proceed until this complete is done
+            _lock.lock();
+
+            try
+            {
+                //if this is the last request thread to be in the session
+                if (_activeThreads.decrementAndGet() == 0)
+                {
+                    try
+                    {
+                        //an invalid session will already have been removed from the
+                        //local session map and deleted from the cluster. If its valid save
+                        //it to the cluster.
+                        //TODO consider doing only periodic saves if only the last access
+                        //time to the session changes
+                        if (isValid())
+                        {
+                            //if session still valid && its dirty or stale or never been synced, write it to the cluster
+                            //otherwise, we just keep the updated last access time in memory
+                            if (_dirty || getLastSyncTime() == 0 || isStale(System.currentTimeMillis()))
+                            {
+                                willPassivate();
+                                save(this);
+                                didActivate();
+                            }
+                        }
+                    }
+                    catch (Exception e)
+                    {
+                        LOG.warn("Problem saving session({})",getId(), e);
+                    } 
+                    finally
+                    {
+                        _dirty = false;
+                    }
+                }
+            }
+            finally
+            {
+                _lock.unlock();
+            }
+        }
+        
+        /** Test if the session is stale
+         * @param atTime
+         * @return
+         */
+        protected boolean isStale (long atTime)
+        {
+            return (getStaleIntervalSec() > 0) && (atTime - getLastSyncTime() >= (getStaleIntervalSec()*1000L));
+        }
+        
+        
+        /** Test if the session is dirty
+         * @return
+         */
+        protected boolean isDirty ()
+        {
+            return _dirty;
+        }
+
+        /** 
+         * Expire the session.
+         * 
+         * @see org.eclipse.jetty.server.session.AbstractSession#timeout()
+         */
+        @Override
+        protected void timeout()
+        {
+            if (LOG.isDebugEnabled()) LOG.debug("Timing out session {}", getId());
+            super.timeout();
+        }
+        
+      
+        
+        /**
+         * Reload the session from the cluster. If the node that
+         * last managed the session from the cluster is ourself,
+         * then the session does not need refreshing.
+         * NOTE: this method MUST be called with sufficient locks
+         * in place to prevent 2 or more concurrent threads from
+         * simultaneously updating the session.
+         */
+        private void refresh () 
+        throws Exception
+        {
+            //get fresh copy from the cluster
+            Session fresh = load(makeKey(getClusterId(), _context));
+
+            //if the session no longer exists, invalidate
+            if (fresh == null)
+            {
+                invalidate();
+                return;
+            }
+
+            //cluster copy assumed to be the same as we were the last
+            //node to manage it
+            if (fresh.getLastNode().equals(getLastNode()))
+                return;
+
+            setLastNode(getSessionIdManager().getWorkerName());
+            
+            //prepare for refresh
+            willPassivate();
+
+            //if fresh has no attributes, remove them
+            if (fresh.getAttributes() == 0)
+                this.clearAttributes();
+            else
+            {
+                //reconcile attributes
+                for (String key:fresh.getAttributeMap().keySet())
+                {
+                    Object freshvalue = fresh.getAttribute(key);
+
+                    //session does not already contain this attribute, so bind it
+                    if (getAttribute(key) == null)
+                    { 
+                        doPutOrRemove(key,freshvalue);
+                        bindValue(key,freshvalue);
+                    }
+                    else //session already contains this attribute, update its value
+                    {
+                        doPutOrRemove(key,freshvalue);
+                    }
+
+                }
+                // cleanup, remove values from session, that don't exist in data anymore:
+                for (String key : getNames())
+                {
+                    if (fresh.getAttribute(key) == null)
+                    {
+                        Object oldvalue = getAttribute(key);
+                        doPutOrRemove(key,null);
+                        unbindValue(key,oldvalue);
+                    }
+                }
+            }
+            //finish refresh
+            didActivate();
+        }
+
+
+        public void setExpiry (long expiry)
+        {
+            _expiryTime = expiry;
+        }
+        
+
+        public long getExpiry ()
+        {
+            return _expiryTime;
+        }
+        
+        public boolean isExpiredAt (long time)
+        {
+            if (_expiryTime <= 0)
+                return false; //never expires
+            
+            return  (_expiryTime <= time);
+        }
+        
+        public void swapId (String newId, String newNodeId)
+        {
+            //TODO probably synchronize rather than use the access/complete lock?
+            _lock.lock();
+            setClusterId(newId);
+            setNodeId(newNodeId);
+            _lock.unlock();
+        }
+        
+        @Override
+        public void setAttribute (String name, Object value)
+        {
+            Object old = changeAttribute(name, value);
+            if (value == null && old == null)
+                return; //if same as remove attribute but attribute was already removed, no change
+            
+           _dirty = true;
+        }
+        
+        
+        public String getContextPath()
+        {
+            return _contextPath;
+        }
+
+
+        public void setContextPath(String contextPath)
+        {
+            this._contextPath = contextPath;
+        }
+
+
+        public String getVHost()
+        {
+            return _vhost;
+        }
+
+
+        public void setVHost(String vhost)
+        {
+            this._vhost = vhost;
+        }
+        
+        public String getLastNode()
+        {
+            return _lastNode;
+        }
+
+
+        public void setLastNode(String lastNode)
+        {
+            _lastNode = lastNode;
+        }
+
+
+        public long getLastSyncTime()
+        {
+            return _lastSyncTime;
+        }
+
+
+        public void setLastSyncTime(long lastSyncTime)
+        {
+            _lastSyncTime = lastSyncTime;
+        }
+
+    }
+
+
+
+    
+    /**
+     * Start the session manager.
+     *
+     * @see org.eclipse.jetty.server.session.AbstractSessionManager#doStart()
+     */
+    @Override
+    public void doStart() throws Exception
+    {
+        if (_sessionIdManager == null)
+            throw new IllegalStateException("No session id manager defined");
+        
+        GCloudConfiguration config = ((GCloudSessionIdManager)_sessionIdManager).getConfig();
+        if (config == null)
+            throw new IllegalStateException("No gcloud configuration");
+        
+        
+        _datastore = DatastoreFactory.instance().get(config.getDatastoreOptions());
+        _keyFactory = _datastore.newKeyFactory().kind(KIND);
+        _converter = new SessionEntityConverter();       
+        _sessions = new ConcurrentHashMap<String, Session>();
+
+        //try and use a common scheduler, fallback to own
+        _scheduler = getSessionHandler().getServer().getBean(Scheduler.class);
+        if (_scheduler == null)
+        {
+            _scheduler = new ScheduledExecutorScheduler();
+            _ownScheduler = true;
+            _scheduler.start();
+        }
+        else if (!_scheduler.isStarted())
+            throw new IllegalStateException("Shared scheduler not started");
+ 
+        setScavengeIntervalSec(getScavengeIntervalSec());
+        
+        super.doStart();
+    }
+
+
+    /**
+     * Stop the session manager.
+     *
+     * @see org.eclipse.jetty.server.session.AbstractSessionManager#doStop()
+     */
+    @Override
+    public void doStop() throws Exception
+    {
+        super.doStop();
+
+        if (_task!=null)
+            _task.cancel();
+        _task=null;
+        if (_ownScheduler && _scheduler !=null)
+            _scheduler.stop();
+        _scheduler = null;
+
+        _sessions.clear();
+        _sessions = null;
+    }
+
+
+
+    /**
+     * Look for sessions in local memory that have expired.
+     */
+    public void scavenge ()
+    {
+        try
+        {
+            //scavenge in the database every so often
+            scavengeGCloudDataStore();
+        }
+        catch (Exception e)
+        {
+            LOG.warn("Problem scavenging", e);
+        }
+    }
+
+ 
+    
+    protected void scavengeGCloudDataStore()
+    throws Exception
+    {
+       
+        //query the datastore for sessions that have expired
+        long now = System.currentTimeMillis();
+        
+        //give a bit of leeway so we don't immediately something that has only just expired a nanosecond ago
+        now = now - (_scavengeIntervalMs/2);
+        
+        if (LOG.isDebugEnabled())
+            LOG.debug("Scavenging for sessions expired before "+now);
+
+
+        GqlQuery.Builder builder = Query.gqlQueryBuilder(ResultType.ENTITY, "select * from "+KIND+" where expiry < @1 limit "+_maxResults);
+        builder.allowLiteral(true);
+        builder.addBinding(now);
+        Query<Entity> query = builder.build();
+        QueryResults<Entity> results = _datastore.run(query);
+        
+        while (results.hasNext())
+        {          
+            Entity sessionEntity = results.next();
+            scavengeSession(sessionEntity);        
+        }
+
+    }
+
+    /**
+     * Scavenge a session that has expired
+     * @param e
+     * @throws Exception
+     */
+    protected void scavengeSession (Entity e)
+            throws Exception
+    {
+        long now = System.currentTimeMillis();
+        Session session = _converter.sessionFromEntity(e);
+        if (session == null)
+            return;
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("Scavenging session: {}",session.getId());
+        //if the session isn't in memory already, put it there so we can do a normal timeout call
+         Session memSession =  _sessions.putIfAbsent(session.getId(), session);
+         if (memSession == null)
+         {
+             memSession = session;
+         }
+
+        //final check
+        if (memSession.isExpiredAt(now))
+        {
+            if (LOG.isDebugEnabled()) LOG.debug("Session {} is definitely expired", memSession.getId());
+            memSession.timeout();   
+        }
+    }
+
+    public long getScavengeIntervalSec ()
+    {
+        return _scavengeIntervalMs/1000;
+    }
+
+    
+    
+    /**
+     * Set the interval between runs of the scavenger. It should not be run too
+     * often.
+     * 
+     * 
+     * @param sec
+     */
+    public void setScavengeIntervalSec (long sec)
+    {
+
+        long old_period=_scavengeIntervalMs;
+        long period=sec*1000L;
+
+        _scavengeIntervalMs=period;
+
+        if (_scavengeIntervalMs > 0)
+        {
+            //add a bit of variability into the scavenge time so that not all
+            //nodes with the same scavenge time sync up
+            long tenPercent = _scavengeIntervalMs/10;
+            if ((System.currentTimeMillis()%2) == 0)
+                _scavengeIntervalMs += tenPercent;
+            if (LOG.isDebugEnabled())
+                LOG.debug("Scavenging every "+_scavengeIntervalMs+" ms");
+        }
+        else
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Scavenging disabled"); 
+        }
+
+ 
+        
+        synchronized (this)
+        {
+            if (_scheduler != null && (period!=old_period || _task==null))
+            {
+                //clean up any previously scheduled scavenger
+                if (_task!=null)
+                    _task.cancel();
+
+                //start a new one
+                if (_scavengeIntervalMs > 0)
+                {
+                    if (_scavenger == null)
+                        _scavenger = new Scavenger();
+
+                    _task = _scheduler.schedule(_scavenger,_scavengeIntervalMs,TimeUnit.MILLISECONDS);
+                }
+            }
+        }
+    }
+    
+    
+    public long getStaleIntervalSec()
+    {
+        return _staleIntervalSec;
+    }
+
+
+    public void setStaleIntervalSec(long staleIntervalSec)
+    {
+        _staleIntervalSec = staleIntervalSec;
+    }
+    
+    
+    public int getMaxResults()
+    {
+        return _maxResults;
+    }
+
+
+    public void setMaxResults(int maxResults)
+    {
+        if (_maxResults <= 0)
+            _maxResults = DEFAULT_MAX_QUERY_RESULTS;
+        else
+            _maxResults = maxResults;
+    }
+
+
+    /** 
+     * Add a new session for the context related to this session manager
+     * 
+     * @see org.eclipse.jetty.server.session.AbstractSessionManager#addSession(org.eclipse.jetty.server.session.AbstractSession)
+     */
+    @Override
+    protected void addSession(AbstractSession session)
+    {
+        if (session==null)
+            return;
+        
+        if (LOG.isDebugEnabled()) LOG.debug("Adding session({}) to session manager for context {} on worker {}",session.getClusterId(), getContextPath(getContext()),getSessionIdManager().getWorkerName() + " with lastnode="+((Session)session).getLastNode());
+        _sessions.put(session.getClusterId(), (Session)session);
+        
+        try
+        {     
+                session.willPassivate();
+                save(((GCloudSessionManager.Session)session));
+                session.didActivate();
+            
+        }
+        catch (Exception e)
+        {
+            LOG.warn("Unable to store new session id="+session.getId() , e);
+        }
+    }
+
+    /** 
+     * Ask the cluster for the session.
+     * 
+     * @see org.eclipse.jetty.server.session.AbstractSessionManager#getSession(java.lang.String)
+     */
+    @Override
+    public AbstractSession getSession(String idInCluster)
+    {
+        Session session = null;
+
+        //try and find the session in this node's memory
+        Session memSession = (Session)_sessions.get(idInCluster);
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("getSession({}) {} in session map",idInCluster,(memSession==null?"not":""));
+
+        long now = System.currentTimeMillis();
+        try
+        {
+            //if the session is not in this node's memory, then load it from the datastore
+            if (memSession == null)
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("getSession({}): loading session data from cluster", idInCluster);
+
+                session = load(makeKey(idInCluster, _context));
+                if (session != null)
+                {
+                    //Check that it wasn't expired
+                    if (session.getExpiry() > 0 && session.getExpiry() <= now)
+                    {
+                        if (LOG.isDebugEnabled()) LOG.debug("getSession ({}): Session expired", idInCluster);
+                        //ensure that the session id for the expired session is deleted so that a new session with the 
+                        //same id cannot be created (because the idInUse() test would succeed)
+                        ((GCloudSessionIdManager)getSessionIdManager()).removeSession(session);
+                        return null;  
+                    }
+
+                    //Update the last worker node to me
+                    session.setLastNode(getSessionIdManager().getWorkerName());                            
+                    //TODO consider saving session here if lastNode was not this node
+
+                    //Check that another thread hasn't loaded the same session
+                    Session existingSession = _sessions.putIfAbsent(idInCluster, session);
+                    if (existingSession != null)
+                    {
+                        //use the one that the other thread inserted
+                        session = existingSession;
+                        LOG.debug("getSession({}): using session loaded by another request thread ", idInCluster);
+                    }
+                    else
+                    {
+                        //indicate that the session was reinflated
+                        session.didActivate();
+                        LOG.debug("getSession({}): loaded session from cluster", idInCluster);
+                    }
+                    return session;
+                }
+                else
+                {
+                    //The requested session does not exist anywhere in the cluster
+                    LOG.debug("getSession({}): No session in cluster matching",idInCluster);
+                    return null;
+                }
+            }
+            else
+            {
+               //The session exists in this node's memory
+               LOG.debug("getSession({}): returning session from local memory ", memSession.getClusterId());
+                return memSession;
+            }
+        }
+        catch (Exception e)
+        {
+            LOG.warn("Unable to load session="+idInCluster, e);
+            return null;
+        }
+    }
+    
+    
+
+    /** 
+     * The session manager is stopping.
+     * 
+     * @see org.eclipse.jetty.server.session.AbstractSessionManager#shutdownSessions()
+     */
+    @Override
+    protected void shutdownSessions() throws Exception
+    {
+        Set<String> keys = new HashSet<String>(_sessions.keySet());
+        for (String key:keys)
+        {
+            Session session = _sessions.remove(key); //take the session out of the session list
+            //If the session is dirty, then write it to the cluster.
+            //If the session is simply stale do NOT write it to the cluster, as some other node
+            //may have started managing that session - this means that the last accessed/expiry time
+            //will not be updated, meaning it may look like it can expire sooner than it should.
+            try
+            {
+                if (session.isDirty())
+                {
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Saving dirty session {} before exiting ", session.getId());
+                    save(session);
+                }
+            }
+            catch (Exception e)
+            {
+                LOG.warn(e);
+            }
+        }
+    }
+
+
+    @Override
+    protected AbstractSession newSession(HttpServletRequest request)
+    {
+        return new Session(request);
+    }
+
+    /** 
+     * Remove a session from local memory, and delete it from
+     * the cluster cache.
+     * 
+     * @see org.eclipse.jetty.server.session.AbstractSessionManager#removeSession(java.lang.String)
+     */
+    @Override
+    protected boolean removeSession(String idInCluster)
+    {
+        Session session = (Session)_sessions.remove(idInCluster);
+        try
+        {
+            if (session != null)
+            {
+                delete(session);
+            }
+        }
+        catch (Exception e)
+        {
+            LOG.warn("Problem deleting session id="+idInCluster, e);
+        }
+        return session!=null;
+    }
+    
+    
+    
+    
+    @Override
+    public void renewSessionId(String oldClusterId, String oldNodeId, String newClusterId, String newNodeId)
+    {
+        Session session = null;
+        try
+        {
+            //take the session with that id out of our managed list
+            session = (Session)_sessions.remove(oldClusterId);
+            if (session != null)
+            {
+                //TODO consider transactionality and ramifications if the session is live on another node
+                delete(session); //delete the old session from the cluster  
+                session.swapId(newClusterId, newNodeId); //update the session
+                _sessions.put(newClusterId, session); //put it into managed list under new key
+                save(session); //put the session under the new id into the cluster
+            }
+        }
+        catch (Exception e)
+        {
+            LOG.warn(e);
+        }
+
+        super.renewSessionId(oldClusterId, oldNodeId, newClusterId, newNodeId);
+    }
+
+
+    /**
+     * Load a session from the clustered cache.
+     * 
+     * @param key
+     * @return
+     */
+    protected Session load (Key key)
+    throws Exception
+    {
+        if (_datastore == null)
+            throw new IllegalStateException("No DataStore");
+        
+        if (LOG.isDebugEnabled()) LOG.debug("Loading session {} from DataStore", key);
+
+        Entity entity = _datastore.get(key);
+        if (entity == null)
+        {
+            if (LOG.isDebugEnabled()) LOG.debug("No session {} in DataStore ",key);
+            return null;
+        }
+        else
+        {
+            Session session = _converter.sessionFromEntity(entity);
+            session.setLastSyncTime(System.currentTimeMillis());
+            return session;
+        }
+    }
+    
+    
+    
+    /**
+     * Save or update the session to the cluster cache
+     * 
+     * @param session
+     * @throws Exception
+     */
+    protected void save (GCloudSessionManager.Session session)
+    throws Exception
+    {
+        if (_datastore == null)
+            throw new IllegalStateException("No DataStore");
+        
+        if (LOG.isDebugEnabled()) LOG.debug("Writing session {} to DataStore", session.getId());
+    
+        Entity entity = _converter.entityFromSession(session, makeKey(session, _context));
+        _datastore.put(entity);
+        session.setLastSyncTime(System.currentTimeMillis());
+    }
+    
+    
+    
+    /**
+     * Remove the session from the cluster cache.
+     * 
+     * @param session
+     */
+    protected void delete (GCloudSessionManager.Session session)
+    {  
+        if (_datastore == null)
+            throw new IllegalStateException("No DataStore");
+        if (LOG.isDebugEnabled()) LOG.debug("Removing session {} from DataStore", session.getId());
+        _datastore.delete(makeKey(session, _context));
+    }
+
+    
+    /**
+     * Invalidate a session for this context with the given id
+     * 
+     * @param idInCluster
+     */
+    public void invalidateSession (String idInCluster)
+    {
+        Session session = (Session)_sessions.get(idInCluster);
+
+        if (session != null)
+        {
+            session.invalidate();
+        }
+    }
+
+    
+    /**
+     * Make a unique key for this session.
+     * As the same session id can be used across multiple contexts, to
+     * make it unique, the key must be composed of:
+     * <ol>
+     * <li>the id</li>
+     * <li>the context path</li>
+     * <li>the virtual hosts</li>
+     * </ol>
+     * 
+     *TODO consider the difference between getClusterId and getId
+     * @param session
+     * @return
+     */
+    private Key makeKey (Session session, Context context)
+    {
+       return makeKey(session.getId(), context);
+    }
+    
+    /**
+     * Make a unique key for this session.
+     * As the same session id can be used across multiple contexts, to
+     * make it unique, the key must be composed of:
+     * <ol>
+     * <li>the id</li>
+     * <li>the context path</li>
+     * <li>the virtual hosts</li>
+     * </ol>
+     * 
+     *TODO consider the difference between getClusterId and getId
+     * @param session
+     * @return
+     */
+    private Key makeKey (String id, Context context)
+    {
+        String key = getContextPath(context);
+        key = key + "_" + getVirtualHost(context);
+        key = key+"_"+id;
+        return _keyFactory.newKey(key);
+    }
+    
+    /**
+     * Turn the context path into an acceptable string
+     * 
+     * @param context
+     * @return
+     */
+    private static String getContextPath (ContextHandler.Context context)
+    {
+        return canonicalize (context.getContextPath());
+    }
+
+    /**
+     * Get the first virtual host for the context.
+     *
+     * Used to help identify the exact session/contextPath.
+     *
+     * @return 0.0.0.0 if no virtual host is defined
+     */
+    private static String getVirtualHost (ContextHandler.Context context)
+    {
+        String vhost = "0.0.0.0";
+
+        if (context==null)
+            return vhost;
+
+        String [] vhosts = context.getContextHandler().getVirtualHosts();
+        if (vhosts==null || vhosts.length==0 || vhosts[0]==null)
+            return vhost;
+
+        return vhosts[0];
+    }
+
+    /**
+     * Make an acceptable name from a context path.
+     *
+     * @param path
+     * @return
+     */
+    private static String canonicalize (String path)
+    {
+        if (path==null)
+            return "";
+
+        return path.replace('/', '_').replace('.','_').replace('\\','_');
+    }
+
+}
diff --git a/jetty-gcloud/gcloud-session-manager/src/test/java/org/eclipse/jetty/gcloud/session/GCloudSessionTester.java b/jetty-gcloud/gcloud-session-manager/src/test/java/org/eclipse/jetty/gcloud/session/GCloudSessionTester.java
new file mode 100644
index 0000000..fe596e2
--- /dev/null
+++ b/jetty-gcloud/gcloud-session-manager/src/test/java/org/eclipse/jetty/gcloud/session/GCloudSessionTester.java
@@ -0,0 +1,75 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.gcloud.session;
+
+
+
+
+import org.eclipse.jetty.security.HashLoginService;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.AllowSymLinkAliasChecker;
+import org.eclipse.jetty.server.session.SessionHandler;
+import org.eclipse.jetty.webapp.WebAppContext;
+
+public class GCloudSessionTester
+{
+    public static void main( String[] args ) throws Exception
+    {
+        if (args.length < 4)
+            System.err.println("Usage: GCloudSessionTester projectid p12file password serviceaccount");
+        
+        System.setProperty("org.eclipse.jetty.server.session.LEVEL", "DEBUG");
+        
+        Server server = new Server(8080);
+        HashLoginService loginService = new HashLoginService();
+        loginService.setName( "Test Realm" );
+        loginService.setConfig( "../../jetty-distribution/target/distribution/demo-base/resources/realm.properties" );
+        server.addBean( loginService );
+
+        GCloudConfiguration config = new GCloudConfiguration();
+        config.setProjectId(args[0]);
+        config.setP12File(args[1]);
+        config.setPassword(args[2]);
+        config.setServiceAccount(args[3]);
+
+        GCloudSessionIdManager idmgr = new GCloudSessionIdManager(server);
+        idmgr.setConfig(config);
+        idmgr.setWorkerName("w1");
+        server.setSessionIdManager(idmgr);
+
+ 
+        WebAppContext webapp = new WebAppContext();
+        webapp.setContextPath("/");
+        webapp.setWar("../../jetty-distribution/target/distribution/demo-base/webapps/test.war");
+        webapp.addAliasCheck(new AllowSymLinkAliasChecker());
+        GCloudSessionManager mgr = new GCloudSessionManager();
+        mgr.setSessionIdManager(idmgr);
+        webapp.setSessionHandler(new SessionHandler(mgr));
+
+        // A WebAppContext is a ContextHandler as well so it needs to be set to
+        // the server so it is aware of where to send the appropriate requests.
+        server.setHandler(webapp);
+
+        // Start things up! 
+        server.start();
+
+    
+        server.join();
+    }
+}
diff --git a/jetty-gcloud/pom.xml b/jetty-gcloud/pom.xml
new file mode 100644
index 0000000..d59ae6c
--- /dev/null
+++ b/jetty-gcloud/pom.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>jetty-project</artifactId>
+    <groupId>org.eclipse.jetty</groupId>
+    <version>9.3.6-SNAPSHOT</version>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.eclipse.jetty.gcloud</groupId>
+  <artifactId>gcloud-parent</artifactId>
+  <packaging>pom</packaging>
+  <name>Jetty :: GCloud</name>
+
+  <properties>
+    <gcloud.version>0.0.8</gcloud.version>
+  </properties>
+
+  <modules>
+    <module>gcloud-session-manager</module>
+  </modules>
+
+</project>
diff --git a/jetty-http-spi/pom.xml b/jetty-http-spi/pom.xml
index a6be593..7a08801 100644
--- a/jetty-http-spi/pom.xml
+++ b/jetty-http-spi/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-http-spi</artifactId>
@@ -33,35 +33,6 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>artifact-jar</id>
-            <goals>
-              <goal>jar</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
         <configuration>
diff --git a/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/DelegatingThreadPool.java b/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/DelegatingThreadPool.java
index 429c48f..11ae6c9 100644
--- a/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/DelegatingThreadPool.java
+++ b/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/DelegatingThreadPool.java
@@ -20,7 +20,6 @@
 
 import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
diff --git a/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/HttpSpiContextHandler.java b/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/HttpSpiContextHandler.java
index ea32d9e..f3e4a70 100644
--- a/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/HttpSpiContextHandler.java
+++ b/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/HttpSpiContextHandler.java
@@ -46,7 +46,7 @@
 public class HttpSpiContextHandler extends ContextHandler
 {
     public static final Logger LOG = Log.getLogger(HttpSpiContextHandler.class);
-    
+
     private HttpContext _httpContext;
 
     private HttpHandler _httpHandler;
@@ -106,7 +106,7 @@
                 writer.println("</pre>");
             }
             
-            writer.println("<p><i><small><a href=\"http://eclipse.org/jetty\">Powered by jetty://</a></small></i></p>");
+            baseRequest.getHttpChannel().getHttpConfiguration().writePoweredBy(writer,"<p>","</p>");
 
             writer.close();
         }
diff --git a/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/JettyHttpExchange.java b/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/JettyHttpExchange.java
index 4b9510e..32e349e 100644
--- a/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/JettyHttpExchange.java
+++ b/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/JettyHttpExchange.java
@@ -32,9 +32,6 @@
 import com.sun.net.httpserver.HttpExchange;
 import com.sun.net.httpserver.HttpPrincipal;
 
-/* ------------------------------------------------------------ */
-/**
- */
 public class JettyHttpExchange extends HttpExchange implements JettyExchange
 {
     private JettyHttpExchangeDelegate _delegate;
@@ -46,9 +43,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.http.spi.JettyExchange#hashCode()
-     */
     @Override
     public int hashCode()
     {
@@ -56,9 +50,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see JettyHttpExchangeDelegate#getRequestHeaders()
-     */
     @Override
     public Headers getRequestHeaders()
     {
@@ -66,9 +57,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see JettyHttpExchangeDelegate#getResponseHeaders()
-     */
     @Override
     public Headers getResponseHeaders()
     {
@@ -76,9 +64,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see JettyHttpExchangeDelegate#getRequestURI()
-     */
     @Override
     public URI getRequestURI()
     {
@@ -86,9 +71,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see JettyHttpExchangeDelegate#getRequestMethod()
-     */
     @Override
     public String getRequestMethod()
     {
@@ -96,9 +78,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see JettyHttpExchangeDelegate#getHttpContext()
-     */
     @Override
     public HttpContext getHttpContext()
     {
@@ -106,9 +85,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see JettyHttpExchangeDelegate#close()
-     */
     @Override
     public void close()
     {
@@ -116,9 +92,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.http.spi.JettyExchange#equals(java.lang.Object)
-     */
     @Override
     public boolean equals(Object obj)
     {
@@ -126,9 +99,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see JettyHttpExchangeDelegate#getRequestBody()
-     */
     @Override
     public InputStream getRequestBody()
     {
@@ -136,9 +106,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see JettyHttpExchangeDelegate#getResponseBody()
-     */
     @Override
     public OutputStream getResponseBody()
     {
@@ -146,9 +113,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see JettyHttpExchangeDelegate#sendResponseHeaders(int, long)
-     */
     @Override
     public void sendResponseHeaders(int rCode, long responseLength) throws IOException
     {
@@ -156,9 +120,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see JettyHttpExchangeDelegate#getRemoteAddress()
-     */
     @Override
     public InetSocketAddress getRemoteAddress()
     {
@@ -166,9 +127,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see JettyHttpExchangeDelegate#getResponseCode()
-     */
     @Override
     public int getResponseCode()
     {
@@ -176,9 +134,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see JettyHttpExchangeDelegate#getLocalAddress()
-     */
     @Override
     public InetSocketAddress getLocalAddress()
     {
@@ -186,9 +141,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see JettyHttpExchangeDelegate#getProtocol()
-     */
     @Override
     public String getProtocol()
     {
@@ -196,9 +148,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see JettyHttpExchangeDelegate#getAttribute(java.lang.String)
-     */
     @Override
     public Object getAttribute(String name)
     {
@@ -206,9 +155,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see JettyHttpExchangeDelegate#setAttribute(java.lang.String, java.lang.Object)
-     */
     @Override
     public void setAttribute(String name, Object value)
     {
@@ -216,9 +162,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see JettyHttpExchangeDelegate#setStreams(java.io.InputStream, java.io.OutputStream)
-     */
     @Override
     public void setStreams(InputStream i, OutputStream o)
     {
@@ -226,9 +169,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.http.spi.JettyExchange#getPrincipal()
-     */
     @Override
     public HttpPrincipal getPrincipal()
     {
@@ -236,18 +176,12 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.http.spi.JettyExchange#setPrincipal(com.sun.net.httpserver.HttpPrincipal)
-     */
     public void setPrincipal(HttpPrincipal principal)
     {
         _delegate.setPrincipal(principal);
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.http.spi.JettyExchange#toString()
-     */
     @Override
     public String toString()
     {
diff --git a/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/JettyHttpServer.java b/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/JettyHttpServer.java
index 73a12ce..552d405 100644
--- a/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/JettyHttpServer.java
+++ b/jetty-http-spi/src/main/java/org/eclipse/jetty/http/spi/JettyHttpServer.java
@@ -28,6 +28,8 @@
 
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpConnectionFactory;
 import org.eclipse.jetty.server.NetworkConnector;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
@@ -48,24 +50,35 @@
 {
     private static final Logger LOG = Log.getLogger(JettyHttpServer.class);
 
+    private final HttpConfiguration _httpConfiguration;
 
-    private Server _server;
-    
+    private final Server _server;
+
     private boolean _serverShared;
 
     private InetSocketAddress _addr;
 
-    private ThreadPoolExecutor _executor;
 
     private Map<String, JettyHttpContext> _contexts = new HashMap<String, JettyHttpContext>();
-    
+
     private Map<String, Connector> _connectors = new HashMap<String, Connector>();
 
-    
+
     public JettyHttpServer(Server server, boolean shared)
     {
+        this(server,shared,new HttpConfiguration());
+    }
+
+    public JettyHttpServer(Server server, boolean shared, HttpConfiguration configuration)
+    {
         this._server = server;
         this._serverShared = shared;
+        this._httpConfiguration = configuration;
+    }
+
+    public HttpConfiguration getHttpConfiguration()
+    {
+        return _httpConfiguration;
     }
 
     @Override
@@ -83,10 +96,10 @@
                 }
             }
         }
-        
+
         if (_serverShared)
-                throw new IOException("jetty server is not bound to port " + addr.getPort());
-        
+            throw new IOException("jetty server is not bound to port " + addr.getPort());
+
         this._addr = addr;
 
         if (LOG.isDebugEnabled()) LOG.debug("binding server to port " + addr.getPort());
@@ -94,10 +107,18 @@
         connector.setPort(addr.getPort());
         connector.setHost(addr.getHostName());
         _server.addConnector(connector);
-        
+
         _connectors.put(addr.getHostName() + addr.getPort(), connector);
     }
 
+    protected ServerConnector newServerConnector(InetSocketAddress addr,int backlog)
+    {
+        ServerConnector connector = new ServerConnector(_server,new HttpConnectionFactory(_httpConfiguration));
+        connector.setPort(addr.getPort());
+        connector.setHost(addr.getHostName());
+        return connector;
+    }
+
     @Override
     public InetSocketAddress getAddress()
     {
@@ -108,7 +129,7 @@
     public void start()
     {
         if (_serverShared) return;
-        
+
         try
         {
             _server.start();
@@ -145,7 +166,7 @@
     {
         cleanUpContexts();
         cleanUpConnectors();
-        
+
         if (_serverShared) return;
 
         try
@@ -158,15 +179,15 @@
         }
     }
 
-        private void cleanUpContexts()
-        {
+    private void cleanUpContexts()
+    {
         for (Map.Entry<String, JettyHttpContext> stringJettyHttpContextEntry : _contexts.entrySet())
         {
             JettyHttpContext context = stringJettyHttpContextEntry.getValue();
             _server.removeBean(context.getJettyContextHandler());
         }
-                _contexts.clear();
-        }
+        _contexts.clear();
+    }
 
     private void cleanUpConnectors()
     {
@@ -176,15 +197,17 @@
             try
             {
                 connector.stop();
-            } catch (Exception ex) {
+            } 
+            catch (Exception ex) 
+            {
                 LOG.warn(ex);
             }
             _server.removeConnector(connector);
         }
-                _connectors.clear();
-        }
+        _connectors.clear();
+    }
 
-        @Override
+    @Override
     public HttpContext createContext(String path, HttpHandler httpHandler)
     {
         checkIfContextIsFree(path);
@@ -194,7 +217,7 @@
 
         ContextHandlerCollection chc = findContextHandlerCollection(_server.getHandlers());
         if (chc == null)
-                throw new RuntimeException("could not find ContextHandlerCollection, you must configure one");
+            throw new RuntimeException("could not find ContextHandlerCollection, you must configure one");
 
         chc.addHandler(jettyContextHandler);
         _contexts.put(path, context);
@@ -228,13 +251,13 @@
     private void checkIfContextIsFree(String path)
     {
         Handler serverHandler = _server.getHandler();
-                if (serverHandler instanceof ContextHandler)
-                {
-                        ContextHandler ctx = (ContextHandler) serverHandler;
-                        if (ctx.getContextPath().equals(path))
-                        throw new RuntimeException("another context already bound to path " + path);
-                }
-        
+        if (serverHandler instanceof ContextHandler)
+        {
+            ContextHandler ctx = (ContextHandler) serverHandler;
+            if (ctx.getContextPath().equals(path))
+                throw new RuntimeException("another context already bound to path " + path);
+        }
+
         Handler[] handlers = _server.getHandlers();
         if (handlers == null) return;
 
@@ -246,9 +269,9 @@
                     throw new RuntimeException("another context already bound to path " + path);
             }
         }
-        }
+    }
 
-        @Override
+    @Override
     public HttpContext createContext(String path)
     {
         return createContext(path, null);
diff --git a/jetty-http/pom.xml b/jetty-http/pom.xml
index aba3add..420ce08 100644
--- a/jetty-http/pom.xml
+++ b/jetty-http/pom.xml
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>jetty-project</artifactId>
     <groupId>org.eclipse.jetty</groupId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-http</artifactId>
@@ -27,44 +27,16 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-                <Import-Package>javax.servlet.*;version="[2.6.0,3.2)",javax.net.*,*</Import-Package>
-              </instructions>
-            </configuration>
-           </execution>
-        </executions>
-      </plugin>
-      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-jar-plugin</artifactId>
         <executions>
           <execution>
-            <id>artifact-jar</id>
-            <goals>
-              <goal>jar</goal>
-            </goals>
-          </execution>
-          <execution>
             <id>test-jar</id>
             <goals>
               <goal>test-jar</goal>
             </goals>
           </execution>
         </executions>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
       </plugin>
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/BadMessageException.java b/jetty-http/src/main/java/org/eclipse/jetty/http/BadMessageException.java
new file mode 100644
index 0000000..6bc7322
--- /dev/null
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/BadMessageException.java
@@ -0,0 +1,65 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http;
+
+/* ------------------------------------------------------------------------------- */
+public class BadMessageException extends RuntimeException
+{
+    final int _code;
+    final String _reason;
+
+    public BadMessageException()
+    {
+        this(400,null);
+    }
+    
+    public BadMessageException(int code)
+    {
+        this(code,null);
+    }
+    
+    public BadMessageException(String reason)
+    {
+        this(400,reason);
+    }
+    
+    public BadMessageException(int code, String reason)
+    {
+        super(code+": "+reason);
+        _code=code;
+        _reason=reason;
+    }
+    
+    public BadMessageException(int code, String reason, Throwable cause)
+    {
+        super(code+": "+reason, cause);
+        _code=code;
+        _reason=reason;
+    }
+    
+    public int getCode()
+    {
+        return _code;
+    }
+    
+    public String getReason()
+    {
+        return _reason;
+    }
+}
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/DateGenerator.java b/jetty-http/src/main/java/org/eclipse/jetty/http/DateGenerator.java
index c5e02f2..841753c 100644
--- a/jetty-http/src/main/java/org/eclipse/jetty/http/DateGenerator.java
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/DateGenerator.java
@@ -26,7 +26,6 @@
 
 /**
  * ThreadLocal Date formatters for HTTP style dates.
- *
  */
 public class DateGenerator
 {
@@ -56,6 +55,8 @@
     
     /**
      * Format HTTP date "EEE, dd MMM yyyy HH:mm:ss 'GMT'"
+     * @param date the date in milliseconds
+     * @return the formatted date
      */
     public static String formatDate(long date)
     {
@@ -64,6 +65,8 @@
 
     /**
      * Format "EEE, dd-MMM-yyyy HH:mm:ss 'GMT'" for cookies
+     * @param buf the buffer to put the formatted date into
+     * @param date the date in milliseconds
      */
     public static void formatCookieDate(StringBuilder buf, long date)
     {
@@ -72,6 +75,8 @@
 
     /**
      * Format "EEE, dd-MMM-yyyy HH:mm:ss 'GMT'" for cookies
+     * @param date the date in milliseconds 
+     * @return the formatted date
      */
     public static String formatCookieDate(long date)
     {
@@ -85,6 +90,8 @@
 
     /**
      * Format HTTP date "EEE, dd MMM yyyy HH:mm:ss 'GMT'"
+     * @param date the date in milliseconds
+     * @return the formatted date
      */
     public String doFormatDate(long date)
     {
@@ -125,6 +132,8 @@
 
     /**
      * Format "EEE, dd-MMM-yy HH:mm:ss 'GMT'" for cookies
+     * @param buf the buffer to format the date into
+     * @param date the date in milliseconds
      */
     public void doFormatCookieDate(StringBuilder buf, long date)
     {
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/DateParser.java b/jetty-http/src/main/java/org/eclipse/jetty/http/DateParser.java
index ea44889..b8d9a38 100644
--- a/jetty-http/src/main/java/org/eclipse/jetty/http/DateParser.java
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/DateParser.java
@@ -27,7 +27,7 @@
  * ThreadLocal data parsers for HTTP style dates
  *
  */
-class DateParser
+public class DateParser
 {
     private static final TimeZone __GMT = TimeZone.getTimeZone("GMT");
     static
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/GzipHttpContent.java b/jetty-http/src/main/java/org/eclipse/jetty/http/GzipHttpContent.java
new file mode 100644
index 0000000..1354358
--- /dev/null
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/GzipHttpContent.java
@@ -0,0 +1,188 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.nio.channels.ReadableByteChannel;
+import org.eclipse.jetty.http.MimeTypes.Type;
+
+import org.eclipse.jetty.util.resource.Resource;
+
+/* ------------------------------------------------------------ */
+public class GzipHttpContent implements HttpContent
+{
+    private final HttpContent _content; 
+    private final HttpContent _contentGz;
+    public final static String ETAG_GZIP="--gzip";
+    public final static String ETAG_GZIP_QUOTE="--gzip\"";
+    public final static PreEncodedHttpField CONTENT_ENCODING_GZIP=new PreEncodedHttpField(HttpHeader.CONTENT_ENCODING,"gzip");
+    
+    public static String removeGzipFromETag(String etag)
+    {
+        if (etag==null)
+            return null;
+        int i = etag.indexOf(ETAG_GZIP_QUOTE);
+        if (i<0)
+            return etag;
+        return etag.substring(0,i)+'"';
+    }
+    
+    public GzipHttpContent(HttpContent content, HttpContent contentGz)
+    {  
+        _content=content;
+        _contentGz=contentGz;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return _content.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj)
+    {
+        return _content.equals(obj);
+    }
+
+    @Override
+    public Resource getResource()
+    {
+        return _content.getResource();
+    }
+
+    @Override
+    public HttpField getETag()
+    {
+        return new HttpField(HttpHeader.ETAG,getETagValue());
+    }
+
+    @Override
+    public String getETagValue()
+    {
+        return _content.getResource().getWeakETag(ETAG_GZIP);
+    }
+
+    @Override
+    public HttpField getLastModified()
+    {
+        return _content.getLastModified();
+    }
+
+    @Override
+    public String getLastModifiedValue()
+    {
+        return _content.getLastModifiedValue();
+    }
+
+    @Override
+    public HttpField getContentType()
+    {
+        return _content.getContentType();
+    }
+
+    @Override
+    public String getContentTypeValue()
+    {
+        return _content.getContentTypeValue();
+    }
+
+    @Override
+    public HttpField getContentEncoding()
+    {
+        return CONTENT_ENCODING_GZIP;
+    }
+
+    @Override
+    public String getContentEncodingValue()
+    {
+        return CONTENT_ENCODING_GZIP.getValue();
+    }
+
+    @Override
+    public String getCharacterEncoding()
+    {
+        return _content.getCharacterEncoding();
+    }
+
+    @Override
+    public Type getMimeType()
+    {
+        return _content.getMimeType();
+    }
+
+    @Override
+    public void release()
+    {
+        _content.release();
+    }
+
+    @Override
+    public ByteBuffer getIndirectBuffer()
+    {
+        return _contentGz.getIndirectBuffer();
+    }
+
+    @Override
+    public ByteBuffer getDirectBuffer()
+    {
+        return _contentGz.getDirectBuffer();
+    }
+
+    @Override
+    public HttpField getContentLength()
+    {
+        return _contentGz.getContentLength();
+    }
+
+    @Override
+    public long getContentLengthValue()
+    {
+        return _contentGz.getContentLengthValue();
+    }
+
+    @Override
+    public InputStream getInputStream() throws IOException
+    {
+        return _contentGz.getInputStream();
+    }
+
+    @Override
+    public ReadableByteChannel getReadableByteChannel() throws IOException
+    {
+        return _contentGz.getReadableByteChannel();
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("GzipHttpContent@%x{r=%s|%s,lm=%s|%s,ct=%s}",hashCode(),
+                _content.getResource(),_contentGz.getResource(),
+                _content.getResource().lastModified(),_contentGz.getResource().lastModified(),
+                getContentType());
+    }
+
+    @Override
+    public HttpContent getGzipContent()
+    {
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HostPortHttpField.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HostPortHttpField.java
new file mode 100644
index 0000000..a533400
--- /dev/null
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HostPortHttpField.java
@@ -0,0 +1,106 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.http;
+
+import org.eclipse.jetty.util.StringUtil;
+
+
+
+/* ------------------------------------------------------------ */
+/**
+ */
+public class HostPortHttpField extends HttpField
+{
+    private final String _host;
+    private final int _port;
+
+    public HostPortHttpField(String authority)
+    {
+        this(HttpHeader.HOST,HttpHeader.HOST.asString(),authority);
+    }
+    
+    public HostPortHttpField(HttpHeader header, String name, String authority)
+    {
+        super(header,name,authority);
+        if (authority==null || authority.length()==0)
+            throw new IllegalArgumentException("No Authority");
+        try
+        {
+            if (authority.charAt(0)=='[')
+            {
+                // ipv6reference
+                int close=authority.lastIndexOf(']');
+                if (close<0)
+                    throw new BadMessageException(HttpStatus.BAD_REQUEST_400,"Bad ipv6");
+                _host=authority.substring(0,close+1);
+
+                if (authority.length()>close+1)
+                {
+                    if (authority.charAt(close+1)!=':')
+                        throw new BadMessageException(HttpStatus.BAD_REQUEST_400,"Bad ipv6 port");
+                    _port=StringUtil.toInt(authority,close+2);
+                }
+                else
+                    _port=0;
+            }
+            else
+            {
+                // ipv4address or hostname
+                int c = authority.lastIndexOf(':');
+                if (c>=0)
+                {
+                    _host=authority.substring(0,c);
+                    _port=StringUtil.toInt(authority,c+1);
+                }
+                else
+                {
+                    _host=authority;
+                    _port=0;
+                }
+            }
+        }
+        catch (BadMessageException bm)
+        {
+            throw bm;
+        }
+        catch(Exception e)
+        {
+            throw new BadMessageException(HttpStatus.BAD_REQUEST_400,"Bad HostPort",e);
+        }
+    }
+
+    /* ------------------------------------------------------------ */
+    /** Get the host.
+     * @return the host
+     */
+    public String getHost()
+    {
+        return _host;
+    }
+
+    /* ------------------------------------------------------------ */
+    /** Get the port.
+     * @return the port
+     */
+    public int getPort()
+    {
+        return _port;
+    }
+}
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/Http1FieldPreEncoder.java b/jetty-http/src/main/java/org/eclipse/jetty/http/Http1FieldPreEncoder.java
new file mode 100644
index 0000000..3c5844f
--- /dev/null
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/Http1FieldPreEncoder.java
@@ -0,0 +1,69 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.http;
+
+import static java.nio.charset.StandardCharsets.ISO_8859_1;
+
+import java.util.Arrays;
+
+
+/* ------------------------------------------------------------ */
+/**
+ */
+public class Http1FieldPreEncoder implements HttpFieldPreEncoder
+{
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.http.HttpFieldPreEncoder#getHttpVersion()
+     */
+    @Override
+    public HttpVersion getHttpVersion()
+    {
+        return HttpVersion.HTTP_1_0;
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.http.HttpFieldPreEncoder#getEncodedField(org.eclipse.jetty.http.HttpHeader, java.lang.String, java.lang.String)
+     */
+    @Override
+    public byte[] getEncodedField(HttpHeader header, String headerString, String value)
+    {
+        if (header!=null)
+        {
+            int cbl=header.getBytesColonSpace().length;
+            byte[] bytes=Arrays.copyOf(header.getBytesColonSpace(), cbl+value.length()+2);
+            System.arraycopy(value.getBytes(ISO_8859_1),0,bytes,cbl,value.length());
+            bytes[bytes.length-2]=(byte)'\r';
+            bytes[bytes.length-1]=(byte)'\n';
+            return bytes;
+        }
+
+        byte[] n=headerString.getBytes(ISO_8859_1);
+        byte[] v=value.getBytes(ISO_8859_1);
+        byte[] bytes=Arrays.copyOf(n,n.length+2+v.length+2);
+        bytes[n.length]=(byte)':';
+        bytes[n.length]=(byte)' ';
+        bytes[bytes.length-2]=(byte)'\r';
+        bytes[bytes.length-1]=(byte)'\n';
+
+        return bytes;
+    }
+}
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpContent.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpContent.java
index 4bff0c9..7ae190a 100644
--- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpContent.java
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpContent.java
@@ -23,156 +23,51 @@
 import java.nio.ByteBuffer;
 import java.nio.channels.ReadableByteChannel;
 
-import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.http.MimeTypes.Type;
 import org.eclipse.jetty.util.resource.Resource;
 
 /* ------------------------------------------------------------ */
-/** HttpContent.
- * 
+/** HttpContent interface.
+ * <p>This information represents all the information about a 
+ * static resource that is needed to evaluate conditional headers
+ * and to serve the content if need be.     It can be implemented
+ * either transiently (values and fields generated on demand) or 
+ * persistently (values and fields pre-generated in anticipation of
+ * reuse in from a cache).
+ * </p> 
  *
  */
 public interface HttpContent
 {
-    String getContentType();
-    String getLastModified();
+    HttpField getContentType();
+    String getContentTypeValue();
+    String getCharacterEncoding();
+    Type getMimeType();
+
+    HttpField getContentEncoding();
+    String getContentEncodingValue();
+    
+    HttpField getContentLength();
+    long getContentLengthValue();
+    
+    HttpField getLastModified();
+    String getLastModifiedValue();
+    
+    HttpField getETag();
+    String getETagValue();
+    
     ByteBuffer getIndirectBuffer();
     ByteBuffer getDirectBuffer();
-    String getETag();
     Resource getResource();
-    long getContentLength();
     InputStream getInputStream() throws IOException;
     ReadableByteChannel getReadableByteChannel() throws IOException;
     void release();
 
-    /* ------------------------------------------------------------ */
-    /* ------------------------------------------------------------ */
-    /* ------------------------------------------------------------ */
-    public class ResourceAsHttpContent implements HttpContent
+    HttpContent getGzipContent();
+    
+    
+    public interface Factory
     {
-        final Resource _resource;
-        final String _mimeType;
-        final int _maxBuffer;
-        final String _etag;
-
-        /* ------------------------------------------------------------ */
-        public ResourceAsHttpContent(final Resource resource, final String mimeType)
-        {
-            this(resource,mimeType,-1,false);
-        }
-
-        /* ------------------------------------------------------------ */
-        public ResourceAsHttpContent(final Resource resource, final String mimeType, int maxBuffer)
-        {
-            this(resource,mimeType,maxBuffer,false);
-        }
-
-        /* ------------------------------------------------------------ */
-        public ResourceAsHttpContent(final Resource resource, final String mimeType, boolean etag)
-        {
-            this(resource,mimeType,-1,etag);
-        }
-
-        /* ------------------------------------------------------------ */
-        public ResourceAsHttpContent(final Resource resource, final String mimeType, int maxBuffer, boolean etag)
-        {
-            _resource=resource;
-            _mimeType=mimeType;
-            _maxBuffer=maxBuffer;
-            _etag=etag?resource.getWeakETag():null;
-        }
-
-        /* ------------------------------------------------------------ */
-        @Override
-        public String getContentType()
-        {
-            return _mimeType;
-        }
-
-        /* ------------------------------------------------------------ */
-        @Override
-        public String getLastModified()
-        {
-            return null;
-        }
-
-        /* ------------------------------------------------------------ */
-        @Override
-        public ByteBuffer getDirectBuffer()
-        {
-            if (_resource.length()<=0 || _maxBuffer<_resource.length())
-                return null;
-            try
-            {
-                return BufferUtil.toBuffer(_resource,true);
-            }
-            catch(IOException e)
-            {
-                throw new RuntimeException(e);
-            }
-        }
-        
-        /* ------------------------------------------------------------ */
-        @Override
-        public String getETag()
-        {
-            return _etag;
-        }
-
-        /* ------------------------------------------------------------ */
-        @Override
-        public ByteBuffer getIndirectBuffer()
-        {
-            if (_resource.length()<=0 || _maxBuffer<_resource.length())
-                return null;
-            try
-            {
-                return BufferUtil.toBuffer(_resource,false);
-            }
-            catch(IOException e)
-            {
-                throw new RuntimeException(e);
-            }
-        }
-
-        /* ------------------------------------------------------------ */
-        @Override
-        public long getContentLength()
-        {
-            return _resource.length();
-        }
-
-        /* ------------------------------------------------------------ */
-        @Override
-        public InputStream getInputStream() throws IOException
-        {
-            return _resource.getInputStream();
-        }
-        
-        /* ------------------------------------------------------------ */
-        @Override
-        public ReadableByteChannel getReadableByteChannel() throws IOException
-        {
-            return _resource.getReadableByteChannel();
-        }
-
-        /* ------------------------------------------------------------ */
-        @Override
-        public Resource getResource()
-        {
-            return _resource;
-        }
-
-        /* ------------------------------------------------------------ */
-        @Override
-        public void release()
-        {
-            _resource.close();
-        }
-        
-        @Override
-        public String toString()
-        {
-            return String.format("%s@%x{r=%s}",this.getClass().getSimpleName(),hashCode(),_resource);
-        }
+        HttpContent getContent(String path) throws IOException;
     }
 }
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpField.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpField.java
index 9355d8b..8b6531f 100644
--- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpField.java
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpField.java
@@ -18,33 +18,37 @@
 
 package org.eclipse.jetty.http;
 
+import java.util.ArrayList;
+import java.util.Objects;
 
-/* ------------------------------------------------------------ */
 /** A HTTP Field
  */
 public class HttpField
 {
+    private final static String __zeroquality="q=0";
     private final HttpHeader _header;
     private final String _name;
     private final String _value;
-        
+    // cached hashcode for case insensitive name
+    private int hash = 0;
+
     public HttpField(HttpHeader header, String name, String value)
     {
         _header = header;
         _name = name;
         _value = value;
-    }  
-    
+    }
+
     public HttpField(HttpHeader header, String value)
     {
         this(header,header.asString(),value);
     }
-    
+
     public HttpField(HttpHeader header, HttpHeaderValue value)
     {
         this(header,header.asString(),value.asString());
     }
-    
+
     public HttpField(String name, String value)
     {
         this(HttpHeader.CACHE.get(name),name,value);
@@ -64,7 +68,301 @@
     {
         return _value;
     }
-    
+
+    public int getIntValue()
+    {
+        return Integer.valueOf(_value);
+    }
+
+    public long getLongValue()
+    {
+        return Long.valueOf(_value);
+    }
+
+    public String[] getValues()
+    {
+        ArrayList<String> list = new ArrayList<>();
+        int state = 0;
+        int start=0;
+        int end=0;
+        StringBuilder builder = new StringBuilder();
+
+        for (int i=0;i<_value.length();i++)
+        {
+            char c = _value.charAt(i);
+            switch(state)
+            {
+                case 0: // initial white space
+                    switch(c)
+                    {
+                        case '"': // open quote
+                            state=2;
+                            break;
+
+                        case ',': // ignore leading empty field
+                            break;
+
+                        case ' ': // more white space
+                        case '\t':
+                            break;
+
+                        default: // character
+                            start=i;
+                            end=i;
+                            state=1;
+                    }
+                    break;
+
+                case 1: // In token
+                    switch(c)
+                    {
+                        case ',': // next field
+                            list.add(_value.substring(start,end+1));
+                            state=0;
+                            break;
+
+                        case ' ': // more white space
+                        case '\t':
+                            break;
+
+                        default:
+                            end=i;
+                    }
+                    break;
+
+                case 2: // In Quoted
+                    switch(c)
+                    {
+                        case '\\': // next field
+                            state=3;
+                            break;
+
+                        case '"': // end quote
+                            list.add(builder.toString());
+                            builder.setLength(0);
+                            state=4;
+                            break;
+
+                        default:
+                            builder.append(c);
+                    }
+                    break;
+
+                case 3: // In Quoted Quoted
+                    builder.append(c);
+                    state=2;
+                    break;
+
+                case 4: // WS after end quote
+                    switch(c)
+                    {
+                        case ' ': // white space
+                        case '\t': // white space
+                            break;
+
+                        case ',': // white space
+                            state=0;
+                            break;
+
+                        default:
+                            throw new IllegalArgumentException("c="+(int)c);
+
+                    }
+                    break;
+            }
+        }
+
+        switch(state)
+        {
+            case 0:
+                break;
+            case 1:
+                list.add(_value.substring(start,end+1));
+                break;
+            case 4:
+                break;
+
+            default:
+                throw new IllegalArgumentException("state="+state);
+        }
+
+        return list.toArray(new String[list.size()]);
+    }
+
+    /* ------------------------------------------------------------ */
+    /** Look for a value in a possible multi valued field
+     * @param search Values to search for
+     * @return True iff the value is contained in the field value entirely or
+     * as an element of a quoted comma separated list. List element parameters (eg qualities) are ignored,
+     * except if they are q=0, in which case the item itself is ignored.
+     */
+    public boolean contains(String search)
+    {
+        if (search==null)
+            return _value==null;
+        if (search.length()==0)
+            return false;
+        if (_value==null)
+            return false;
+
+        int state=0;
+        int match=0;
+        int param=0;
+
+        for (int i=0;i<_value.length();i++)
+        {
+            char c = _value.charAt(i);
+            switch(state)
+            {
+                case 0: // initial white space
+                    switch(c)
+                    {
+                        case '"': // open quote
+                            match=0;
+                            state=2;
+                            break;
+
+                        case ',': // ignore leading empty field
+                            break;
+
+                        case ';': // ignore leading empty field parameter
+                            param=-1;
+                            match=-1;
+                            state=5;
+                            break;
+
+                        case ' ': // more white space
+                        case '\t':
+                            break;
+
+                        default: // character
+                            match = c==search.charAt(0)?1:-1;
+                            state=1;
+                            break;
+                    }
+                    break;
+
+                case 1: // In token
+                    switch(c)
+                    {
+                        case ',': // next field
+                            // Have we matched the token?
+                            if (match==search.length())
+                                return true;
+                            state=0;
+                            break;
+
+                        case ';':
+                            param=match>=0?0:-1;
+                            state=5; // parameter
+                            break;
+
+                        default:
+                            if (match>0)
+                            {
+                                if (match<search.length())
+                                    match=c==search.charAt(match)?(match+1):-1;
+                                else if (c!=' ' && c!= '\t')
+                                    match=-1;
+                            }
+                            break;
+
+                    }
+                    break;
+
+                case 2: // In Quoted token
+                    switch(c)
+                    {
+                        case '\\': // quoted character
+                            state=3;
+                            break;
+
+                        case '"': // end quote
+                            state=4;
+                            break;
+
+                        default:
+                            if (match>=0)
+                            {
+                                if (match<search.length())
+                                    match=c==search.charAt(match)?(match+1):-1;
+                                else
+                                    match=-1;
+                            }
+                    }
+                    break;
+
+                case 3: // In Quoted character in quoted token
+                    if (match>=0)
+                    {
+                        if (match<search.length())
+                            match=c==search.charAt(match)?(match+1):-1;
+                        else
+                            match=-1;
+                    }
+                    state=2;
+                    break;
+
+                case 4: // WS after end quote
+                    switch(c)
+                    {
+                        case ' ': // white space
+                        case '\t': // white space
+                            break;
+
+                        case ';':
+                            state=5; // parameter
+                            break;
+
+                        case ',': // end token
+                            // Have we matched the token?
+                            if (match==search.length())
+                                return true;
+                            state=0;
+                            break;
+
+                        default:
+                            // This is an illegal token, just ignore
+                            match=-1;
+                    }
+                    break;
+
+                case 5:  // parameter
+                    switch(c)
+                    {
+                        case ',': // end token
+                            // Have we matched the token and not q=0?
+                            if (param!=__zeroquality.length() && match==search.length())
+                                return true;
+                            param=0;
+                            state=0;
+                            break;
+
+                        case ' ': // white space
+                        case '\t': // white space
+                            break;
+
+                        default:
+                            if (param>=0)
+                            {
+                                if (param<__zeroquality.length())
+                                    param=c==__zeroquality.charAt(param)?(param+1):-1;
+                                else if (c!='0'&&c!='.')
+                                    param=-1;
+                            }
+
+                    }
+                    break;
+
+                default:
+                    throw new IllegalStateException();
+            }
+        }
+
+        return param!=__zeroquality.length() && match==search.length();
+    }
+
+
     @Override
     public String toString()
     {
@@ -72,7 +370,7 @@
         return getName() + ": " + (v==null?"":v);
     }
 
-    public boolean isSame(HttpField field)
+    public boolean isSameName(HttpField field)
     {
         if (field==null)
             return false;
@@ -84,6 +382,125 @@
             return true;
         return false;
     }
-    
-    
+
+    private int nameHashCode()
+    {
+        int h = this.hash;
+        int len = _name.length();
+        if (h == 0 && len > 0)
+        {
+            for (int i = 0; i < len; i++)
+            {
+                // simple case insensitive hash
+                char c = _name.charAt(i);
+                // assuming us-ascii (per last paragraph on http://tools.ietf.org/html/rfc7230#section-3.2.4)
+                if ((c >= 'a' && c <= 'z'))
+                    c -= 0x20;
+                h = 31 * h + c;
+            }
+            this.hash = h;
+        }
+        return h;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        if (_header==null)
+            return _value.hashCode() ^ nameHashCode();
+        return _value.hashCode() ^ _header.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (o==this)
+            return true;
+        if (!(o instanceof HttpField))
+            return false;
+        HttpField field=(HttpField)o;
+        if (_header!=field.getHeader())
+            return false;
+        if (!_name.equalsIgnoreCase(field.getName()))
+            return false;
+        if (_value==null && field.getValue()!=null)
+            return false;
+        return Objects.equals(_value,field.getValue());
+    }
+
+    public static class IntValueHttpField extends HttpField
+    {
+        private final int _int;
+
+        public IntValueHttpField(HttpHeader header, String name, String value, int intValue)
+        {
+            super(header,name,value);
+            _int=intValue;
+        }
+
+        public IntValueHttpField(HttpHeader header, String name, String value)
+        {
+            this(header,name,value,Integer.valueOf(value));
+        }
+
+        public IntValueHttpField(HttpHeader header, String name, int intValue)
+        {
+            this(header,name,Integer.toString(intValue),intValue);
+        }
+
+        public IntValueHttpField(HttpHeader header, int value)
+        {
+            this(header,header.asString(),value);
+        }
+
+        @Override
+        public int getIntValue()
+        {
+            return _int;
+        }
+
+        @Override
+        public long getLongValue()
+        {
+            return _int;
+        }
+    }
+
+    public static class LongValueHttpField extends HttpField
+    {
+        private final long _long;
+
+        public LongValueHttpField(HttpHeader header, String name, String value, long longValue)
+        {
+            super(header,name,value);
+            _long=longValue;
+        }
+
+        public LongValueHttpField(HttpHeader header, String name, String value)
+        {
+            this(header,name,value,Long.valueOf(value));
+        }
+
+        public LongValueHttpField(HttpHeader header, String name, long value)
+        {
+            this(header,name,Long.toString(value),value);
+        }
+
+        public LongValueHttpField(HttpHeader header,long value)
+        {
+            this(header,header.asString(),value);
+        }
+
+        @Override
+        public int getIntValue()
+        {
+            return (int)_long;
+        }
+
+        @Override
+        public long getLongValue()
+        {
+            return _long;
+        }
+    }
 }
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFieldPreEncoder.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFieldPreEncoder.java
new file mode 100644
index 0000000..94df72d
--- /dev/null
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFieldPreEncoder.java
@@ -0,0 +1,36 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.http;
+
+
+/* ------------------------------------------------------------ */
+/** Interface to pre-encode HttpFields.  Used by {@link PreEncodedHttpField}
+ */
+public interface HttpFieldPreEncoder
+{
+    /* ------------------------------------------------------------ */
+    /** The major version this encoder is for.  Both HTTP/1.0 and HTTP/1.1
+     * use the same field encoding, so the {@link HttpVersion#HTTP_1_0} should
+     * be return for all HTTP/1.x encodings.
+     * @return The major version this encoder is for.
+     */
+    HttpVersion getHttpVersion();
+    byte[] getEncodedField(HttpHeader header, String headerString, String value);
+}
\ No newline at end of file
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java
index 698392e..e72b91b 100644
--- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java
@@ -19,7 +19,7 @@
 package org.eclipse.jetty.http;
 
 import java.util.ArrayList;
-import java.util.Collection;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -30,12 +30,10 @@
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.StringTokenizer;
-import java.util.regex.Pattern;
 
 import org.eclipse.jetty.util.ArrayTernaryTrie;
 import org.eclipse.jetty.util.LazyList;
 import org.eclipse.jetty.util.QuotedStringTokenizer;
-import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.Trie;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
@@ -52,68 +50,95 @@
  */
 public class HttpFields implements Iterable<HttpField>
 {
+    public static final String __separators = ", \t";
+
     private static final Logger LOG = Log.getLogger(HttpFields.class);
-    private final static Pattern __splitter = Pattern.compile("\\s*,\\s*");     
-    public final static String __separators = ", \t";
 
-    private final ArrayList<HttpField> _fields = new ArrayList<>(20);
-
+    private HttpField[] _fields;
+    private int _size;
+    
     /**
-     * Constructor.
+     * Initialize an empty HttpFields.
      */
     public HttpFields()
     {
+        _fields=new HttpField[20];
+    }
+    
+    /**
+     * Initialize an empty HttpFields.
+     * 
+     * @param capacity the capacity of the http fields
+     */
+    public HttpFields(int capacity)
+    {
+        _fields=new HttpField[capacity];
+    }
+    
+    /**
+     * Initialize HttpFields from copy.
+     * 
+     * @param fields the fields to copy data from
+     */
+    public HttpFields(HttpFields fields)
+    {
+        _fields=Arrays.copyOf(fields._fields,fields._fields.length+10);
+        _size=fields._size;
+    }
+
+    public int size()
+    {
+        return _size;
+    }
+    
+    @Override
+    public Iterator<HttpField> iterator()
+    {
+        return new Itr();
     }
 
     /**
      * Get Collection of header names.
+     * @return the unique set of field names.
      */
-    public Collection<String> getFieldNamesCollection()
+    public Set<String> getFieldNamesCollection()
     {
-        final Set<String> list = new HashSet<>(_fields.size());
-        for (HttpField f : _fields)
+        final Set<String> set = new HashSet<>(_size);
+        for (HttpField f : this)
         {
             if (f!=null)
-                list.add(f.getName());
+                set.add(f.getName());
         }
-        return list;
+        return set;
     }
 
     /**
      * Get enumeration of header _names. Returns an enumeration of strings representing the header
      * _names for this request.
+     * @return an enumeration of field names
      */
     public Enumeration<String> getFieldNames()
     {
         return Collections.enumeration(getFieldNamesCollection());
     }
 
-    public int size()
-    {
-        return _fields.size();
-    }
-
     /**
      * Get a Field by index.
+     * @param index the field index 
      * @return A Field value or null if the Field value has not been set
-     *
      */
-    public HttpField getField(int i)
+    public HttpField getField(int index)
     {
-        return _fields.get(i);
-    }
-
-    @Override
-    public Iterator<HttpField> iterator()
-    {
-        return _fields.iterator();
+        if (index>=_size)
+            throw new NoSuchElementException();
+        return _fields[index];
     }
 
     public HttpField getField(HttpHeader header)
     {
-        for (int i=0;i<_fields.size();i++)
+        for (int i=0;i<_size;i++)
         {
-            HttpField f=_fields.get(i);
+            HttpField f=_fields[i];
             if (f.getHeader()==header)
                 return f;
         }
@@ -122,21 +147,32 @@
 
     public HttpField getField(String name)
     {
-        for (int i=0;i<_fields.size();i++)
+        for (int i=0;i<_size;i++)
         {
-            HttpField f=_fields.get(i);
+            HttpField f=_fields[i];
             if (f.getName().equalsIgnoreCase(name))
                 return f;
         }
         return null;
     }
-    
+
+    public boolean contains(HttpField field)
+    {
+        for (int i=_size;i-->0;)
+        {
+            HttpField f=_fields[i];
+            if (f.isSameName(field) && f.contains(field.getValue()))
+                return true;
+        }
+        return false;
+    }
+
     public boolean contains(HttpHeader header, String value)
     {
-        for (int i=0;i<_fields.size();i++)
+        for (int i=_size;i-->0;)
         {
-            HttpField f=_fields.get(i);
-            if (f.getHeader()==header && contains(f,value))
+            HttpField f=_fields[i];
+            if (f.getHeader()==header && f.contains(value))
                 return true;
         }
         return false;
@@ -144,39 +180,20 @@
     
     public boolean contains(String name, String value)
     {
-        for (int i=0;i<_fields.size();i++)
+        for (int i=_size;i-->0;)
         {
-            HttpField f=_fields.get(i);
-            if (f.getName().equalsIgnoreCase(name) && contains(f,value))
+            HttpField f=_fields[i];
+            if (f.getName().equalsIgnoreCase(name) && f.contains(value))
                 return true;
         }
         return false;
     }
-    
-    private boolean contains(HttpField field,String value)
-    {
-        String v = field.getValue();
-        if (v==null)
-            return false;
-
-        if (value.equalsIgnoreCase(v))
-            return true;
-
-        String[] split = __splitter.split(v);
-        for (int i = 0; split!=null && i < split.length; i++) 
-        {
-            if (value.equals(split[i]))
-                return true;
-        }
-
-        return false;
-    }
 
     public boolean contains(HttpHeader header)
     {
-        for (int i=0;i<_fields.size();i++)
+        for (int i=_size;i-->0;)
         {
-            HttpField f=_fields.get(i);
+            HttpField f=_fields[i];
             if (f.getHeader()==header)
                 return true;
         }
@@ -185,42 +202,49 @@
     
     public boolean containsKey(String name)
     {
-        for (int i=0;i<_fields.size();i++)
+        for (int i=_size;i-->0;)
         {
-            HttpField f=_fields.get(i);
+            HttpField f=_fields[i];
             if (f.getName().equalsIgnoreCase(name))
                 return true;
         }
         return false;
     }
-    
-    
+
+    @Deprecated
     public String getStringField(HttpHeader header)
     {
-        return getStringField(header.asString());
+        return get(header);
     }
-
+    
     public String get(HttpHeader header)
     {
-        return getStringField(header.asString());
+        for (int i=0;i<_size;i++)
+        {
+            HttpField f=_fields[i];
+            if (f.getHeader()==header)
+                return f.getValue();
+        }
+        return null;
     }
 
-    public String get(String header)
-    {
-        return getStringField(header);
-    }
-
-    /**
-     * @return the value of a field, or null if not found. For multiple fields of the same name,
-     *         only the first is returned.
-     * @param name the case-insensitive field name
-     */
+    @Deprecated
     public String getStringField(String name)
     {
-        HttpField field = getField(name);
-        return field==null?null:field.getValue();
+        return get(name);
     }
-
+    
+    public String get(String header)
+    {
+        for (int i=0;i<_size;i++)
+        {
+            HttpField f=_fields[i];
+            if (f.getName().equalsIgnoreCase(header))
+                return f.getValue();
+        }
+        return null;
+    }
+    
     /**
      * Get multi headers
      *
@@ -230,7 +254,7 @@
     public List<String> getValuesList(String name)
     {
         final List<String> list = new ArrayList<>();
-        for (HttpField f : _fields)
+        for (HttpField f : this)
             if (f.getName().equalsIgnoreCase(name))
                 list.add(f.getValue());
         return list;
@@ -244,9 +268,9 @@
      */
     public Enumeration<String> getValues(final String name)
     {
-        for (int i=0;i<_fields.size();i++)
+        for (int i=0;i<_size;i++)
         {
-            final HttpField f = _fields.get(i);
+            final HttpField f = _fields[i];
             
             if (f.getName().equalsIgnoreCase(name) && f.getValue()!=null)
             {
@@ -261,9 +285,9 @@
                     {
                         if (field==null)
                         {
-                            while (i<_fields.size()) 
+                            while (i<_size) 
                             {
-                                field=_fields.get(i++);
+                                field=_fields[i++];
                                 if (field.getName().equalsIgnoreCase(name) && field.getValue()!=null)
                                     return true;
                             }
@@ -284,7 +308,6 @@
                         }
                         throw new NoSuchElementException();
                     }
-
                 };
             }
         }
@@ -342,22 +365,24 @@
     public void put(HttpField field)
     {
         boolean put=false;
-        for (int i=_fields.size();i-->0;)
+        for (int i=_size;i-->0;)
         {
-            HttpField f=_fields.get(i);
-            if (f.isSame(field))
+            HttpField f=_fields[i];
+            if (f.isSameName(field))
             {
                 if (put)
-                    _fields.remove(i);
+                {
+                    System.arraycopy(_fields,i+1,_fields,i,--_size-i);
+                }
                 else
                 {
-                    _fields.set(i,field);
+                    _fields[i]=field;
                     put=true;
                 }
             }
         }
         if (!put)
-            _fields.add(field);
+            add(field);
     }
     
     /**
@@ -413,19 +438,17 @@
      *
      * @param name the name of the field
      * @param value the value of the field.
-     * @exception IllegalArgumentException If the name is a single valued field and already has a
-     *                value.
      */
-    public void add(String name, String value) throws IllegalArgumentException
+    public void add(String name, String value)
     {
         if (value == null)
             return;
 
         HttpField field = new HttpField(name, value);
-        _fields.add(field);
+        add(field);
     }
 
-    public void add(HttpHeader header, HttpHeaderValue value) throws IllegalArgumentException
+    public void add(HttpHeader header, HttpHeaderValue value)
     {
         add(header,value.toString());
     }
@@ -436,46 +459,55 @@
      *
      * @param header the header
      * @param value the value of the field.
-     * @exception IllegalArgumentException 
      */
-    public void add(HttpHeader header, String value) throws IllegalArgumentException
+    public void add(HttpHeader header, String value)
     {
         if (value == null) throw new IllegalArgumentException("null value");
 
         HttpField field = new HttpField(header, value);
-        _fields.add(field);
+        add(field);
     }
 
     /**
      * Remove a field.
      *
      * @param name the field to remove
+     * @return the header that was removed
      */
     public HttpField remove(HttpHeader name)
     {
-        for (int i=_fields.size();i-->0;)
+        HttpField removed=null;
+        for (int i=_size;i-->0;)
         {
-            HttpField f=_fields.get(i);
+            HttpField f=_fields[i];
             if (f.getHeader()==name)
-                return _fields.remove(i);
+            {
+                removed=f;
+                System.arraycopy(_fields,i+1,_fields,i,--_size-i);
+            }
         }
-        return null;
+        return removed;
     }
 
     /**
      * Remove a field.
      *
      * @param name the field to remove
+     * @return the header that was removed
      */
     public HttpField remove(String name)
     {
-        for (int i=_fields.size();i-->0;)
+        HttpField removed=null;
+        for (int i=_size;i-->0;)
         {
-            HttpField f=_fields.get(i);
+            HttpField f=_fields[i];
             if (f.getName().equalsIgnoreCase(name))
-                return _fields.remove(i);
+            {
+                removed=f;
+                System.arraycopy(_fields,i+1,_fields,i,--_size-i);
+            }
         }
-        return null;
+        return removed;
     }
 
     /**
@@ -483,12 +515,13 @@
      * case of the field name is ignored.
      *
      * @param name the case-insensitive field name
+     * @return the value of the field as a long
      * @exception NumberFormatException If bad long found
      */
     public long getLongField(String name) throws NumberFormatException
     {
         HttpField field = getField(name);
-        return field==null?-1L:StringUtil.toLong(field.getValue());
+        return field==null?-1L:field.getLongValue();
     }
 
     /**
@@ -496,6 +529,7 @@
      * of the field name is ignored.
      *
      * @param name the case-insensitive field name
+     * @return the value of the field as a number of milliseconds since unix epoch
      */
     public long getDateField(String name)
     {
@@ -576,13 +610,47 @@
     }
 
     @Override
-    public String
-    toString()
+    public int hashCode()
+    {
+        int hash=0;
+        for (HttpField field:_fields)
+            hash+=field.hashCode();
+        return hash;
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+            return true;
+        if (!(o instanceof HttpFields))
+            return false;
+
+        HttpFields that = (HttpFields)o;
+
+        // Order is not important, so we cannot rely on List.equals().
+        if (size() != that.size())
+            return false;
+
+        loop: for (HttpField fi : this)
+        {
+            for (HttpField fa : that)
+            {
+                if (fi.equals(fa))
+                    continue loop;
+            }
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString()
     {
         try
         {
             StringBuilder buffer = new StringBuilder();
-            for (HttpField field : _fields)
+            for (HttpField field : this)
             {
                 if (field != null)
                 {
@@ -604,21 +672,27 @@
         }
     }
 
-    /**
-     * Clear the header.
-     */
     public void clear()
     {
-        _fields.clear();
+        _size=0;
     }
-
+    
     public void add(HttpField field)
     {
-        _fields.add(field);
+        if (field!=null)
+        {
+            if (_size==_fields.length)
+                _fields=Arrays.copyOf(_fields,_size*2);
+            _fields[_size++]=field;
+        }
     }
 
-    
-    
+    public void addAll(HttpFields fields)
+    {
+        for (int i=0;i<fields._size;i++)
+            add(fields._fields[i]);
+    }
+
     /**
      * Add fields from another HttpFields instance. Single valued fields are replaced, while all
      * others are added.
@@ -792,5 +866,34 @@
     }
 
 
+    private class Itr implements Iterator<HttpField> 
+    {
+        int _cursor;       // index of next element to return
+        int _last=-1;
+
+        public boolean hasNext() 
+        {
+            return _cursor != _size;
+        }
+
+        public HttpField next() 
+        {
+            int i = _cursor;
+            if (i >= _size)
+                throw new NoSuchElementException();
+            _cursor = i + 1;
+            return _fields[_last=i];
+        }
+
+        public void remove() 
+        {
+            if (_last<0)
+                throw new IllegalStateException();
+
+            System.arraycopy(_fields,_last+1,_fields,_last,--_size-_last);
+            _cursor=_last;
+            _last=-1;
+        }
+    }
 
 }
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpGenerator.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpGenerator.java
index a4e3037..f7d589c 100644
--- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpGenerator.java
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpGenerator.java
@@ -21,7 +21,6 @@
 import java.io.IOException;
 import java.nio.BufferOverflowException;
 import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 
 import org.eclipse.jetty.http.HttpTokens.EndOfContent;
@@ -30,28 +29,26 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
-/* ------------------------------------------------------------ */
 /**
  * HttpGenerator. Builds HTTP Messages.
- *
+ * <p>
  * If the system property "org.eclipse.jetty.http.HttpGenerator.STRICT" is set to true,
  * then the generator will strictly pass on the exact strings received from methods and header
  * fields.  Otherwise a fast case insensitive string lookup is used that may alter the
  * case and white space of some methods/headers
- * </p>
  */
 public class HttpGenerator
 {
     private final static Logger LOG = Log.getLogger(HttpGenerator.class);
 
-    public final static boolean __STRICT=Boolean.getBoolean("org.eclipse.jetty.http.HttpGenerator.STRICT"); 
+    public final static boolean __STRICT=Boolean.getBoolean("org.eclipse.jetty.http.HttpGenerator.STRICT");
 
     private final static byte[] __colon_space = new byte[] {':',' '};
     private final static HttpHeaderValue[] CLOSE = {HttpHeaderValue.CLOSE};
-    public static final ResponseInfo CONTINUE_100_INFO = new ResponseInfo(HttpVersion.HTTP_1_1,null,-1,100,null,false);
-    public static final ResponseInfo PROGRESS_102_INFO = new ResponseInfo(HttpVersion.HTTP_1_1,null,-1,102,null,false);
-    public final static ResponseInfo RESPONSE_500_INFO =
-        new ResponseInfo(HttpVersion.HTTP_1_1,new HttpFields(){{put(HttpHeader.CONNECTION,HttpHeaderValue.CLOSE);}},0,HttpStatus.INTERNAL_SERVER_ERROR_500,null,false);
+    public static final MetaData.Response CONTINUE_100_INFO = new MetaData.Response(HttpVersion.HTTP_1_1,100,null,null,-1);
+    public static final MetaData.Response PROGRESS_102_INFO = new MetaData.Response(HttpVersion.HTTP_1_1,102,null,null,-1);
+    public final static MetaData.Response RESPONSE_500_INFO =
+        new MetaData.Response(HttpVersion.HTTP_1_1,HttpStatus.INTERNAL_SERVER_ERROR_500,null,new HttpFields(){{put(HttpHeader.CONNECTION,HttpHeaderValue.CLOSE);}},0);
 
     // states
     public enum State { START, COMMITTED, COMPLETING, COMPLETING_1XX, END }
@@ -90,7 +87,7 @@
     {
         this(false,false);
     }
-    
+
     /* ------------------------------------------------------------------------------- */
     public HttpGenerator(boolean sendServerVersion,boolean sendXPoweredBy)
     {
@@ -163,7 +160,7 @@
     {
         return _noContent;
     }
-    
+
     /* ------------------------------------------------------------ */
     public void setPersistent(boolean persistent)
     {
@@ -200,7 +197,7 @@
     }
 
     /* ------------------------------------------------------------ */
-    public Result generateRequest(RequestInfo info, ByteBuffer header, ByteBuffer chunk, ByteBuffer content, boolean last) throws IOException
+    public Result generateRequest(MetaData.Request info, ByteBuffer header, ByteBuffer chunk, ByteBuffer content, boolean last) throws IOException
     {
         switch(_state)
         {
@@ -215,7 +212,11 @@
 
                 // If we have not been told our persistence, set the default
                 if (_persistent==null)
-                    _persistent=(info.getHttpVersion().ordinal() > HttpVersion.HTTP_1_0.ordinal());
+                {
+                    _persistent=info.getVersion().ordinal() > HttpVersion.HTTP_1_0.ordinal();
+                    if (!_persistent && HttpMethod.CONNECT.is(info.getMethod()))
+                        _persistent=true;
+                }
 
                 // prepare the header
                 int pos=BufferUtil.flipToFill(header);
@@ -224,12 +225,12 @@
                     // generate ResponseLine
                     generateRequestLine(info,header);
 
-                    if (info.getHttpVersion()==HttpVersion.HTTP_0_9)
+                    if (info.getVersion()==HttpVersion.HTTP_0_9)
                         _noContent=true;
                     else
                         generateHeaders(info,header,content,last);
 
-                    boolean expect100 = info.getHttpFields().contains(HttpHeader.EXPECT, HttpHeaderValue.CONTINUE.asString());
+                    boolean expect100 = info.getFields().contains(HttpHeader.EXPECT, HttpHeaderValue.CONTINUE.asString());
 
                     if (expect100)
                     {
@@ -252,7 +253,7 @@
                 }
                 catch(Exception e)
                 {
-                    String message= (e instanceof BufferOverflowException)?"Response header too large":e.getMessage();
+                    String message= (e instanceof BufferOverflowException)?"Request header too large":e.getMessage();
                     throw new IOException(message,e);
                 }
                 finally
@@ -281,12 +282,9 @@
                 }
 
                 if (last)
-                {
                     _state=State.COMPLETING;
-                    return len>0?Result.FLUSH:Result.CONTINUE;
-                }
 
-                return Result.FLUSH;
+                return len>0?Result.FLUSH:Result.CONTINUE;
             }
 
             case COMPLETING:
@@ -329,7 +327,13 @@
     }
 
     /* ------------------------------------------------------------ */
-    public Result generateResponse(ResponseInfo info, ByteBuffer header, ByteBuffer chunk, ByteBuffer content, boolean last) throws IOException
+    public Result generateResponse(MetaData.Response info, ByteBuffer header, ByteBuffer chunk, ByteBuffer content, boolean last) throws IOException
+    {
+        return generateResponse(info,false,header,chunk,content,last);
+    }
+
+    /* ------------------------------------------------------------ */
+    public Result generateResponse(MetaData.Response info, boolean head, ByteBuffer header, ByteBuffer chunk, ByteBuffer content, boolean last) throws IOException
     {
         switch(_state)
         {
@@ -339,7 +343,7 @@
                     return Result.NEED_INFO;
 
                 // Handle 0.9
-                if (info.getHttpVersion() == HttpVersion.HTTP_0_9)
+                if (info.getVersion() == HttpVersion.HTTP_0_9)
                 {
                     _persistent = false;
                     _endOfContent=EndOfContent.EOF_CONTENT;
@@ -355,7 +359,7 @@
 
                 // If we have not been told our persistence, set the default
                 if (_persistent==null)
-                    _persistent=(info.getHttpVersion().ordinal() > HttpVersion.HTTP_1_0.ordinal());
+                    _persistent=(info.getVersion().ordinal() > HttpVersion.HTTP_1_0.ordinal());
 
                 // prepare the header
                 int pos=BufferUtil.flipToFill(header);
@@ -389,7 +393,7 @@
                     if (len>0)
                     {
                         _contentPrepared+=len;
-                        if (isChunking() && !info.isHead())
+                        if (isChunking() && !head)
                             prepareChunk(header,len);
                     }
                     _state = last?State.COMPLETING:State.COMMITTED;
@@ -504,17 +508,17 @@
     }
 
     /* ------------------------------------------------------------ */
-    private void generateRequestLine(RequestInfo request,ByteBuffer header)
+    private void generateRequestLine(MetaData.Request request,ByteBuffer header)
     {
         header.put(StringUtil.getBytes(request.getMethod()));
         header.put((byte)' ');
-        header.put(StringUtil.getBytes(request.getUri()));
-        switch(request.getHttpVersion())
+        header.put(StringUtil.getBytes(request.getURIString()));
+        switch(request.getVersion())
         {
             case HTTP_1_0:
             case HTTP_1_1:
                 header.put((byte)' ');
-                header.put(request.getHttpVersion().toBytes());
+                header.put(request.getVersion().toBytes());
                 break;
             default:
                 throw new IllegalStateException();
@@ -523,7 +527,7 @@
     }
 
     /* ------------------------------------------------------------ */
-    private void generateResponseLine(ResponseInfo response, ByteBuffer header)
+    private void generateResponseLine(MetaData.Response response, ByteBuffer header)
     {
         // Look for prepared response line
         int status=response.getStatus();
@@ -573,10 +577,10 @@
     }
 
     /* ------------------------------------------------------------ */
-    private void generateHeaders(Info _info,ByteBuffer header,ByteBuffer content,boolean last)
+    private void generateHeaders(MetaData _info,ByteBuffer header,ByteBuffer content,boolean last)
     {
-        final RequestInfo request=(_info instanceof RequestInfo)?(RequestInfo)_info:null;
-        final ResponseInfo response=(_info instanceof ResponseInfo)?(ResponseInfo)_info:null;
+        final MetaData.Request request=(_info instanceof MetaData.Request)?(MetaData.Request)_info:null;
+        final MetaData.Response response=(_info instanceof MetaData.Response)?(MetaData.Response)_info:null;
 
         // default field values
         int send=_send;
@@ -587,10 +591,14 @@
         StringBuilder connection = null;
 
         // Generate fields
-        if (_info.getHttpFields() != null)
+        if (_info.getFields() != null)
         {
-            for (HttpField field : _info.getHttpFields())
+            for (HttpField field : _info.getFields())
             {
+                String v = field.getValue();
+                if (v==null || v.length()==0)
+                    continue; // rfc7230 does not allow no value
+
                 HttpHeader h = field.getHeader();
 
                 switch (h==null?HttpHeader.UNKNOWN:h)
@@ -614,7 +622,7 @@
 
                     case TRANSFER_ENCODING:
                     {
-                        if (_info.getHttpVersion() == HttpVersion.HTTP_1_1)
+                        if (_info.getVersion() == HttpVersion.HTTP_1_1)
                             transfer_encoding = field;
                         // Do NOT add yet!
                         break;
@@ -631,7 +639,7 @@
 
                         if (values[0]==null)
                         {
-                            split = field.getValue().split("\\s*,\\s*");
+                            split = StringUtil.csvSplit(field.getValue());
                             if (split.length>0)
                             {
                                 values=new HttpHeaderValue[split.length];
@@ -657,9 +665,9 @@
                                 case CLOSE:
                                 {
                                     close=true;
+                                    _persistent=false;
                                     if (response!=null)
                                     {
-                                        _persistent=false;
                                         if (_endOfContent == EndOfContent.UNKNOWN_CONTENT)
                                             _endOfContent=EndOfContent.EOF_CONTENT;
                                     }
@@ -668,7 +676,7 @@
 
                                 case KEEP_ALIVE:
                                 {
-                                    if (_info.getHttpVersion() == HttpVersion.HTTP_1_0)
+                                    if (_info.getVersion() == HttpVersion.HTTP_1_0)
                                     {
                                         keep_alive = true;
                                         if (response!=null)
@@ -760,22 +768,35 @@
                     // For a request with HTTP 1.0 & Connection: keep-alive
                     // we *must* close the connection, otherwise the client
                     // has no way to detect the end of the content.
-                    if (!isPersistent() || _info.getHttpVersion().ordinal() < HttpVersion.HTTP_1_1.ordinal())
+                    if (!isPersistent() || _info.getVersion().ordinal() < HttpVersion.HTTP_1_1.ordinal())
                         _endOfContent = EndOfContent.EOF_CONTENT;
                 }
                 break;
 
             case CONTENT_LENGTH:
+            {
                 long content_length = _info.getContentLength();
                 if ((response!=null || content_length>0 || content_type ) && !_noContent)
                 {
-                    // known length but not actually set.
                     header.put(HttpHeader.CONTENT_LENGTH.getBytesColonSpace());
                     BufferUtil.putDecLong(header, content_length);
                     header.put(HttpTokens.CRLF);
                 }
                 break;
+            }
 
+            case SELF_DEFINING_CONTENT:
+            {
+                // TODO - Should we do this? Why was it not required before?
+                long content_length = _info.getContentLength();
+                if (content_length>0)
+                {
+                    header.put(HttpHeader.CONTENT_LENGTH.getBytesColonSpace());
+                    BufferUtil.putDecLong(header, content_length);
+                    header.put(HttpTokens.CRLF);
+                }
+                break;
+            }
             case NO_CONTENT:
                 if (response!=null && status >= 200 && status != 204 && status != 304)
                     header.put(CONTENT_LENGTH_0);
@@ -818,7 +839,7 @@
         // If this is a response, work out persistence
         if (response!=null)
         {
-            if (!isPersistent() && (close || _info.getHttpVersion().ordinal() > HttpVersion.HTTP_1_0.ordinal()))
+            if (!isPersistent() && (close || _info.getVersion().ordinal() > HttpVersion.HTTP_1_0.ordinal()))
             {
                 if (connection==null)
                     header.put(CONNECTION_CLOSE);
@@ -870,8 +891,9 @@
     @Override
     public String toString()
     {
-        return String.format("%s{s=%s}",
+        return String.format("%s@%x{s=%s}",
                 getClass().getSimpleName(),
+                hashCode(),
                 _state);
     }
 
@@ -933,110 +955,13 @@
         }
     }
 
-    public static class Info
-    {
-        final HttpVersion _httpVersion;
-        final HttpFields _httpFields;
-        final long _contentLength;
-
-        private Info(HttpVersion httpVersion, HttpFields httpFields, long contentLength)
-        {
-            _httpVersion = httpVersion;
-            _httpFields = httpFields;
-            _contentLength = contentLength;
-        }
-
-        public HttpVersion getHttpVersion()
-        {
-            return _httpVersion;
-        }
-        public HttpFields getHttpFields()
-        {
-            return _httpFields;
-        }
-        public long getContentLength()
-        {
-            return _contentLength;
-        }
-    }
-
-    public static class RequestInfo extends Info
-    {
-        private final String _method;
-        private final String _uri;
-
-        public RequestInfo(HttpVersion httpVersion, HttpFields httpFields, long contentLength, String method, String uri)
-        {
-            super(httpVersion,httpFields,contentLength);
-            _method = method;
-            _uri = uri;
-        }
-
-        public String getMethod()
-        {
-            return _method;
-        }
-
-        public String getUri()
-        {
-            return _uri;
-        }
-
-        @Override
-        public String toString()
-        {
-            return String.format("RequestInfo{%s %s %s,%d}",_method,_uri,_httpVersion,_contentLength);
-        }
-    }
-
-    public static class ResponseInfo extends Info
-    {
-        private final int _status;
-        private final String _reason;
-        private final boolean _head;
-
-        public ResponseInfo(HttpVersion httpVersion, HttpFields httpFields, long contentLength, int status, String reason, boolean head)
-        {
-            super(httpVersion,httpFields,contentLength);
-            _status = status;
-            _reason = reason;
-            _head = head;
-        }
-
-        public boolean isInformational()
-        {
-            return _status>=100 && _status<200;
-        }
-
-        public int getStatus()
-        {
-            return _status;
-        }
-
-        public String getReason()
-        {
-            return _reason;
-        }
-
-        public boolean isHead()
-        {
-            return _head;
-        }
-
-        @Override
-        public String toString()
-        {
-            return String.format("ResponseInfo{%s %s %s,%d,%b}",_httpVersion,_status,_reason,_contentLength,_head);
-        }
-    } 
-
     private static void putSanitisedName(String s,ByteBuffer buffer)
     {
         int l=s.length();
         for (int i=0;i<l;i++)
         {
             char c=s.charAt(i);
-            
+
             if (c<0 || c>0xff || c=='\r' || c=='\n'|| c==':')
                 buffer.put((byte)'?');
             else
@@ -1050,7 +975,7 @@
         for (int i=0;i<l;i++)
         {
             char c=s.charAt(i);
-            
+
             if (c<0 || c>0xff || c=='\r' || c=='\n')
                 buffer.put((byte)' ');
             else
@@ -1060,9 +985,9 @@
 
     public static void putTo(HttpField field, ByteBuffer bufferInFillMode)
     {
-        if (field instanceof CachedHttpField)
+        if (field instanceof PreEncodedHttpField)
         {
-            ((CachedHttpField)field).putTo(bufferInFillMode);
+            ((PreEncodedHttpField)field).putTo(bufferInFillMode,HttpVersion.HTTP_1_0);
         }
         else
         {
@@ -1083,7 +1008,7 @@
         }
     }
 
-    public static void putTo(HttpFields fields, ByteBuffer bufferInFillMode) 
+    public static void putTo(HttpFields fields, ByteBuffer bufferInFillMode)
     {
         for (HttpField field : fields)
         {
@@ -1092,23 +1017,4 @@
         }
         BufferUtil.putCRLF(bufferInFillMode);
     }
-    
-    public static class CachedHttpField extends HttpField
-    {
-        private final byte[] _bytes;
-        public CachedHttpField(HttpHeader header,String value)
-        {
-            super(header,value);
-            int cbl=header.getBytesColonSpace().length;
-            _bytes=Arrays.copyOf(header.getBytesColonSpace(), cbl+value.length()+2);
-            System.arraycopy(value.getBytes(StandardCharsets.ISO_8859_1),0,_bytes,cbl,value.length());
-            _bytes[_bytes.length-2]=(byte)'\r';
-            _bytes[_bytes.length-1]=(byte)'\n';
-        }
-        
-        public void putTo(ByteBuffer bufferInFillMode)
-        {
-            bufferInFillMode.put(_bytes);
-        }
-    }
 }
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpHeader.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpHeader.java
index a9c7fa0..54735cb 100644
--- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpHeader.java
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpHeader.java
@@ -110,17 +110,28 @@
     IDENTITY("identity"),
     
     X_POWERED_BY("X-Powered-By"),
+    HTTP2_SETTINGS("HTTP2-Settings"),
 
+    /* ------------------------------------------------------------ */
+    /** HTTP2 Fields.
+     */
+    C_METHOD(":method"),
+    C_SCHEME(":scheme"),
+    C_AUTHORITY(":authority"),
+    C_PATH(":path"),
+    C_STATUS(":status"),
+    
     UNKNOWN("::UNKNOWN::");
 
 
     /* ------------------------------------------------------------ */
-    public final static Trie<HttpHeader> CACHE= new ArrayTrie<>(512);
+    public final static Trie<HttpHeader> CACHE= new ArrayTrie<>(530);
     static
     {
         for (HttpHeader header : HttpHeader.values())
             if (header!=UNKNOWN)
-                CACHE.put(header.toString(),header);
+                if (!CACHE.put(header.toString(),header))
+                    throw new IllegalStateException();
     }
     
     private final String _string;
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java
index f5ff98f..a31f231 100644
--- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java
@@ -18,24 +18,29 @@
 
 package org.eclipse.jetty.http;
 
-import static org.eclipse.jetty.http.HttpTokens.*;
+import static org.eclipse.jetty.http.HttpTokens.CARRIAGE_RETURN;
+import static org.eclipse.jetty.http.HttpTokens.LINE_FEED;
+import static org.eclipse.jetty.http.HttpTokens.SPACE;
+import static org.eclipse.jetty.http.HttpTokens.TAB;
 
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.EnumSet;
 
 import org.eclipse.jetty.http.HttpTokens.EndOfContent;
 import org.eclipse.jetty.util.ArrayTernaryTrie;
 import org.eclipse.jetty.util.ArrayTrie;
 import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.Trie;
 import org.eclipse.jetty.util.TypeUtil;
+import org.eclipse.jetty.util.Utf8StringBuilder;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
 
 /* ------------------------------------------------------------ */
-/** A Parser for HTTP 0.9, 1.0 and 1.1
+/** A Parser for 1.0 and 1.1 as defined by RFC7230
  * <p>
  * This parser parses HTTP client and server messages from buffers
  * passed in the {@link #parseNext(ByteBuffer)} method.  The parsed
@@ -73,6 +78,8 @@
  * fields.  Otherwise a fast case insensitive string lookup is used that may alter the
  * case of the method and/or headers
  * </p>
+ * <p>
+ * @see <a href="http://tools.ietf.org/html/rfc7230">RFC 7230</a>
  */
 public class HttpParser
 {
@@ -119,13 +126,17 @@
         CHUNK,
         CHUNK_END,
         END,
-        CLOSED
+        CLOSE,  // The associated stream/endpoint should be closed
+        CLOSED  // The associated stream/endpoint is at EOF
     }
 
+    private final static EnumSet<State> __idleStates = EnumSet.of(State.START,State.END,State.CLOSE,State.CLOSED);
+    private final static EnumSet<State> __completeStates = EnumSet.of(State.END,State.CLOSE,State.CLOSED);
+    
     private final boolean DEBUG=LOG.isDebugEnabled(); // Cache debug to help branch prediction
-    private final HttpHandler<ByteBuffer> _handler;
-    private final RequestHandler<ByteBuffer> _requestHandler;
-    private final ResponseHandler<ByteBuffer> _responseHandler;
+    private final HttpHandler _handler;
+    private final RequestHandler _requestHandler;
+    private final ResponseHandler _responseHandler;
     private final int _maxHeaderBytes;
     private final boolean _strict;
     private HttpField _field;
@@ -140,11 +151,10 @@
     /* ------------------------------------------------------------------------------- */
     private volatile State _state=State.START;
     private volatile boolean _eof;
-    private volatile boolean _closed;
     private HttpMethod _method;
     private String _methodString;
     private HttpVersion _version;
-    private ByteBuffer _uri=ByteBuffer.allocate(INITIAL_URI_LENGTH); // Tune?
+    private Utf8StringBuilder _uri=new Utf8StringBuilder(INITIAL_URI_LENGTH); // Tune?
     private EndOfContent _endOfContent;
     private long _contentLength;
     private long _contentPosition;
@@ -184,13 +194,15 @@
         // Add common Content types as fields
         for (String type : new String[]{"text/plain","text/html","text/xml","text/json","application/json","application/x-www-form-urlencoded"})
         {
-            HttpField field=new HttpGenerator.CachedHttpField(HttpHeader.CONTENT_TYPE,type);
+            HttpField field=new PreEncodedHttpField(HttpHeader.CONTENT_TYPE,type);
             CACHE.put(field);
             
-            for (String charset : new String[]{"UTF-8","ISO-8859-1"})
+            for (String charset : new String[]{"utf-8","iso-8859-1"})
             {
-                CACHE.put(new HttpGenerator.CachedHttpField(HttpHeader.CONTENT_TYPE,type+";charset="+charset));
-                CACHE.put(new HttpGenerator.CachedHttpField(HttpHeader.CONTENT_TYPE,type+"; charset="+charset));
+                CACHE.put(new PreEncodedHttpField(HttpHeader.CONTENT_TYPE,type+";charset="+charset));
+                CACHE.put(new PreEncodedHttpField(HttpHeader.CONTENT_TYPE,type+"; charset="+charset));
+                CACHE.put(new PreEncodedHttpField(HttpHeader.CONTENT_TYPE,type+";charset="+charset.toUpperCase()));
+                CACHE.put(new PreEncodedHttpField(HttpHeader.CONTENT_TYPE,type+"; charset="+charset.toUpperCase()));
             }
         }
     
@@ -207,31 +219,31 @@
     }
 
     /* ------------------------------------------------------------------------------- */
-    public HttpParser(RequestHandler<ByteBuffer> handler)
+    public HttpParser(RequestHandler handler)
     {
         this(handler,-1,__STRICT);
     }
 
     /* ------------------------------------------------------------------------------- */
-    public HttpParser(ResponseHandler<ByteBuffer> handler)
+    public HttpParser(ResponseHandler handler)
     {
         this(handler,-1,__STRICT);
     }
 
     /* ------------------------------------------------------------------------------- */
-    public HttpParser(RequestHandler<ByteBuffer> handler,int maxHeaderBytes)
+    public HttpParser(RequestHandler handler,int maxHeaderBytes)
     {
         this(handler,maxHeaderBytes,__STRICT);
     }
 
     /* ------------------------------------------------------------------------------- */
-    public HttpParser(ResponseHandler<ByteBuffer> handler,int maxHeaderBytes)
+    public HttpParser(ResponseHandler handler,int maxHeaderBytes)
     {
         this(handler,maxHeaderBytes,__STRICT);
     }
     
     /* ------------------------------------------------------------------------------- */
-    public HttpParser(RequestHandler<ByteBuffer> handler,int maxHeaderBytes,boolean strict)
+    public HttpParser(RequestHandler handler,int maxHeaderBytes,boolean strict)
     {
         _handler=handler;
         _requestHandler=handler;
@@ -241,7 +253,7 @@
     }
 
     /* ------------------------------------------------------------------------------- */
-    public HttpParser(ResponseHandler<ByteBuffer> handler,int maxHeaderBytes,boolean strict)
+    public HttpParser(ResponseHandler handler,int maxHeaderBytes,boolean strict)
     {
         _handler=handler;
         _requestHandler=null;
@@ -264,7 +276,7 @@
 
     /* ------------------------------------------------------------ */
     /** Set if a HEAD response is expected
-     * @param head
+     * @param head true if head response is expected
      */
     public void setHeadResponse(boolean head)
     {
@@ -308,6 +320,12 @@
     }
 
     /* ------------------------------------------------------------ */
+    public boolean isClose()
+    {
+        return isState(State.CLOSE);
+    }
+
+    /* ------------------------------------------------------------ */
     public boolean isClosed()
     {
         return isState(State.CLOSED);
@@ -316,13 +334,13 @@
     /* ------------------------------------------------------------ */
     public boolean isIdle()
     {
-        return isState(State.START)||isState(State.END)||isState(State.CLOSED);
+        return __idleStates.contains(_state);
     }
 
     /* ------------------------------------------------------------ */
     public boolean isComplete()
     {
-        return isState(State.END)||isState(State.CLOSED);
+        return __completeStates.contains(_state);
     }
 
     /* ------------------------------------------------------------------------------- */
@@ -332,31 +350,55 @@
     }
 
     /* ------------------------------------------------------------------------------- */
-    @SuppressWarnings("serial")
-    private static class BadMessageException extends RuntimeException
+    enum CharState { ILLEGAL, CR, LF, LEGAL }
+    private final static CharState[] __charState;
+    static
     {
-        private final int _code;
-
-        private BadMessageException()
-        {
-            this(400,null);
-        }
+        // token          = 1*tchar
+        // tchar          = "!" / "#" / "$" / "%" / "&" / "'" / "*"
+        //                / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
+        //                / DIGIT / ALPHA
+        //                ; any VCHAR, except delimiters
+        // quoted-string  = DQUOTE *( qdtext / quoted-pair ) DQUOTE
+        // qdtext         = HTAB / SP /%x21 / %x23-5B / %x5D-7E / obs-text
+        // obs-text       = %x80-FF
+        // comment        = "(" *( ctext / quoted-pair / comment ) ")"
+        // ctext          = HTAB / SP / %x21-27 / %x2A-5B / %x5D-7E / obs-text
+        // quoted-pair    = "\" ( HTAB / SP / VCHAR / obs-text )
+   
+        __charState=new CharState[256];
+        Arrays.fill(__charState,CharState.ILLEGAL);
+        __charState[LINE_FEED]=CharState.LF;
+        __charState[CARRIAGE_RETURN]=CharState.CR;
+        __charState[TAB]=CharState.LEGAL;
+        __charState[SPACE]=CharState.LEGAL;
         
-        private BadMessageException(int code)
-        {
-            this(code,null);
-        }
+        __charState['!']=CharState.LEGAL;
+        __charState['#']=CharState.LEGAL;
+        __charState['$']=CharState.LEGAL;
+        __charState['%']=CharState.LEGAL;
+        __charState['&']=CharState.LEGAL;
+        __charState['\'']=CharState.LEGAL;
+        __charState['*']=CharState.LEGAL;
+        __charState['+']=CharState.LEGAL;
+        __charState['-']=CharState.LEGAL;
+        __charState['.']=CharState.LEGAL;
+        __charState['^']=CharState.LEGAL;
+        __charState['_']=CharState.LEGAL;
+        __charState['`']=CharState.LEGAL;
+        __charState['|']=CharState.LEGAL;
+        __charState['~']=CharState.LEGAL;
         
-        private BadMessageException(String message)
-        {
-            this(400,message);
-        }
+        __charState['"']=CharState.LEGAL;
         
-        private BadMessageException(int code,String message)
-        {
-            super(message);
-            _code=code;
-        }
+        __charState['\\']=CharState.LEGAL;
+        __charState['(']=CharState.LEGAL;
+        __charState[')']=CharState.LEGAL;
+        Arrays.fill(__charState,0x21,0x27+1,CharState.LEGAL);
+        Arrays.fill(__charState,0x2A,0x5B+1,CharState.LEGAL);
+        Arrays.fill(__charState,0x5D,0x7E+1,CharState.LEGAL);
+        Arrays.fill(__charState,0x80,0xFF+1,CharState.LEGAL);
+        
     }
     
     /* ------------------------------------------------------------------------------- */
@@ -364,37 +406,36 @@
     {
         byte ch = buffer.get();
         
-        if (_cr)
+        CharState s = __charState[0xff & ch];
+        switch(s)
         {
-            if (ch!=LINE_FEED)
-                throw new BadMessageException("Bad EOL");
-            _cr=false;
-            return ch;
-        }
+            case ILLEGAL:
+                throw new IllegalCharacterException(_state,ch,buffer);
+                
+            case LF:
+                _cr=false;
+                break;
+                
+            case CR:
+                if (_cr)
+                    throw new BadMessageException("Bad EOL");
 
-        if (ch>=0 && ch<SPACE)
-        {
-            if (ch==CARRIAGE_RETURN)
-            {
+                _cr=true;
                 if (buffer.hasRemaining())
                 {
                     if(_maxHeaderBytes>0 && _state.ordinal()<State.END.ordinal())
                         _headerBytes++;
-                    ch=buffer.get();
-                    if (ch!=LINE_FEED)
-                        throw new BadMessageException("Bad EOL");
+                    return next(buffer);
                 }
-                else
-                {
-                    _cr=true;
-                    // Can return 0 here to indicate the need for more characters, 
-                    // because a real 0 in the buffer would cause a BadMessage below 
-                    return 0;
-                }
-            }
-            // Only LF or TAB acceptable special characters
-            else if (!(ch==LINE_FEED || ch==TAB))
-                throw new IllegalCharacterException(_state,ch,buffer);
+                
+                // Can return 0 here to indicate the need for more characters, 
+                // because a real 0 in the buffer would cause a BadMessage below 
+                return 0;
+                
+            case LEGAL:
+                if (_cr)
+                    throw new BadMessageException("Bad EOL");
+                
         }
         
         return ch;
@@ -555,7 +596,7 @@
                         }
                         else
                         {
-                            _uri.clear();
+                            _uri.reset();
                             setState(State.URI);
                             // quick scan for space or EoBuffer
                             if (buffer.hasArray())
@@ -575,18 +616,11 @@
                                     LOG.warn("URI is too large >"+_maxHeaderBytes);
                                     throw new BadMessageException(HttpStatus.REQUEST_URI_TOO_LONG_414);
                                 }
-                                if (_uri.remaining()<=len)
-                                {
-                                    ByteBuffer uri = ByteBuffer.allocate(_uri.capacity()+2*len);
-                                    _uri.flip();
-                                    uri.put(_uri);
-                                    _uri=uri;
-                                }
-                                _uri.put(array,p-1,len+1);
+                                _uri.append(array,p-1,len+1);
                                 buffer.position(i-buffer.arrayOffset());
                             }
                             else
-                                _uri.put(ch);
+                                _uri.append(ch);
                         }
                     }
                     else if (ch < HttpTokens.SPACE)
@@ -623,24 +657,11 @@
                     else if (ch < HttpTokens.SPACE && ch>=0)
                     {
                         // HTTP/0.9
-                        _uri.flip();
-                        handle=_requestHandler.startRequest(_method,_methodString,_uri,null)||handle;
-                        setState(State.END);
-                        BufferUtil.clear(buffer);
-                        handle=_handler.headerComplete()||handle;
-                        handle=_handler.messageComplete()||handle;
-                        return handle;
+                        throw new BadMessageException("HTTP/0.9 not supported");
                     }
                     else
                     {
-                        if (!_uri.hasRemaining())
-                        {
-                            ByteBuffer uri = ByteBuffer.allocate(_uri.capacity()*2);
-                            _uri.flip();
-                            uri.put(_uri);
-                            _uri=uri;
-                        }
-                        _uri.put(ch);
+                        _uri.append(ch);
                     }
                     break;
 
@@ -664,29 +685,8 @@
                                 version=HttpVersion.lookAheadGet(buffer.array(),buffer.arrayOffset()+buffer.position()-1,buffer.arrayOffset()+buffer.limit());
                             else
                                 version=HttpVersion.CACHE.getBest(buffer,0,buffer.remaining());
-                            if (version==null)
-                            {
-                                if (_method==HttpMethod.PROXY)
-                                {
-                                    if (!(_requestHandler instanceof ProxyHandler))
-                                        throw new BadMessageException();
-                                    
-                                    _uri.flip();
-                                    String protocol=BufferUtil.toString(_uri);
-                                    // This is the proxy protocol, so we can assume entire first line is in buffer else 400
-                                    buffer.position(buffer.position()-1);
-                                    String sAddr = getProxyField(buffer);
-                                    String dAddr = getProxyField(buffer);
-                                    int sPort = BufferUtil.takeInt(buffer);
-                                    next(buffer);
-                                    int dPort = BufferUtil.takeInt(buffer);
-                                    next(buffer);
-                                    _state=State.START;
-                                    ((ProxyHandler)_requestHandler).proxied(protocol,sAddr,dAddr,sPort,dPort);
-                                    return false;
-                                }
-                            }
-                            else
+                            
+                            if (version!=null)
                             {
                                 int pos = buffer.position()+version.asString().length()-1;
                                 if (pos<buffer.limit())
@@ -719,13 +719,7 @@
                         else
                         {
                             // HTTP/0.9
-                            _uri.flip();
-                            handle=_requestHandler.startRequest(_method,_methodString,_uri, null)||handle;
-                            setState(State.END);
-                            BufferUtil.clear(buffer);
-                            handle=_handler.headerComplete()||handle;
-                            handle=_handler.messageComplete()||handle;
-                            return handle;
+                            throw new BadMessageException("HTTP/0.9 not supported");
                         }
                     }
                     else if (ch<0)
@@ -744,15 +738,15 @@
                             throw new BadMessageException(HttpStatus.BAD_REQUEST_400,"Unknown Version");
                         
                         // Should we try to cache header fields?
-                        if (_connectionFields==null && _version.getVersion()>=HttpVersion.HTTP_1_1.getVersion())
+                        if (_connectionFields==null && _version.getVersion()>=HttpVersion.HTTP_1_1.getVersion() && _handler.getHeaderCacheSize()>0)
                         {
                             int header_cache = _handler.getHeaderCacheSize();
                             _connectionFields=new ArrayTernaryTrie<>(header_cache);                            
                         }
 
                         setState(State.HEADER);
-                        _uri.flip();
-                        handle=_requestHandler.startRequest(_method,_methodString,_uri, _version)||handle;
+                        
+                        handle=_requestHandler.startRequest(_methodString,_uri.toString(), _version)||handle;
                         continue;
                     }
                     else if (ch>=HttpTokens.SPACE)
@@ -790,124 +784,94 @@
         return handle;
     }
 
-    private boolean handleKnownHeaders(ByteBuffer buffer)
+    private void parsedHeader()
     {
-        boolean add_to_connection_trie=false;
-        switch (_header)
+        // handler last header if any.  Delayed to here just in case there was a continuation line (above)
+        if (_headerString!=null || _valueString!=null)
         {
-            case CONTENT_LENGTH:
-                if (_endOfContent != EndOfContent.CHUNKED_CONTENT)
+            // Handle known headers
+            if (_header!=null)
+            {
+                boolean add_to_connection_trie=false;
+                switch (_header)
                 {
-                    try
-                    {
-                        _contentLength=Long.parseLong(_valueString);
-                    }
-                    catch(NumberFormatException e)
-                    {
-                        LOG.ignore(e);
-                        throw new BadMessageException(HttpStatus.BAD_REQUEST_400,"Bad Content-Length");
-                    }
-                    if (_contentLength <= 0)
-                        _endOfContent=EndOfContent.NO_CONTENT;
-                    else
-                        _endOfContent=EndOfContent.CONTENT_LENGTH;
-                }
-                break;
-
-            case TRANSFER_ENCODING:
-                if (_value==HttpHeaderValue.CHUNKED)
-                    _endOfContent=EndOfContent.CHUNKED_CONTENT;
-                else
-                {
-                    if (_valueString.endsWith(HttpHeaderValue.CHUNKED.toString()))
-                        _endOfContent=EndOfContent.CHUNKED_CONTENT;
-                    else if (_valueString.contains(HttpHeaderValue.CHUNKED.toString()))
-                    {
-                        throw new BadMessageException(HttpStatus.BAD_REQUEST_400,"Bad chunking");
-                    }
-                }
-                break;
-
-            case HOST:
-                add_to_connection_trie=_connectionFields!=null && _field==null;
-                _host=true;
-                String host=_valueString;
-                int port=0;
-                if (host==null || host.length()==0)
-                {
-                    throw new BadMessageException(HttpStatus.BAD_REQUEST_400,"Bad Host header");
-                }
-
-                int len=host.length();
-                loop: for (int i = len; i-- > 0;)
-                {
-                    char c2 = (char)(0xff & host.charAt(i));
-                    switch (c2)
-                    {
-                        case ']':
-                            break loop;
-
-                        case ':':
+                    case CONTENT_LENGTH:
+                        if (_endOfContent != EndOfContent.CHUNKED_CONTENT)
+                        {
                             try
                             {
-                                len=i;
-                                port = StringUtil.toInt(host.substring(i+1));
+                                _contentLength=Long.parseLong(_valueString);
                             }
-                            catch (NumberFormatException e)
+                            catch(NumberFormatException e)
                             {
-                                if (DEBUG)
-                                    LOG.debug(e);
-                                throw new BadMessageException(HttpStatus.BAD_REQUEST_400,"Bad Host header");
+                                LOG.ignore(e);
+                                throw new BadMessageException(HttpStatus.BAD_REQUEST_400,"Bad Content-Length");
                             }
-                            break loop;
-                    }
-                }
-                if (host.charAt(0)=='[')
-                {
-                    if (host.charAt(len-1)!=']') 
-                    {
-                        throw new BadMessageException(HttpStatus.BAD_REQUEST_400,"Bad IPv6 Host header");
-                    }
-                    host = host.substring(0,len);
-                }
-                else if (len!=host.length())
-                    host = host.substring(0,len);
-                
-                if (_requestHandler!=null)
-                    _requestHandler.parsedHostHeader(host,port);
-                
-              break;
-              
-            case CONNECTION:
-                // Don't cache if not persistent
-                if (_valueString!=null && _valueString.contains("close"))
-                {
-                    _closed=true;
-                    _connectionFields=null;
-                }
-                break;
+                            if (_contentLength <= 0)
+                                _endOfContent=EndOfContent.NO_CONTENT;
+                            else
+                                _endOfContent=EndOfContent.CONTENT_LENGTH;
+                        }
+                        break;
 
-            case AUTHORIZATION:
-            case ACCEPT:
-            case ACCEPT_CHARSET:
-            case ACCEPT_ENCODING:
-            case ACCEPT_LANGUAGE:
-            case COOKIE:
-            case CACHE_CONTROL:
-            case USER_AGENT:
-                add_to_connection_trie=_connectionFields!=null && _field==null;
-                break;
-                
-            default: break;
-        }
-    
-        if (add_to_connection_trie && !_connectionFields.isFull() && _header!=null && _valueString!=null)
-        {
-            _field=new HttpField(_header,_valueString);
-            _connectionFields.put(_field);
+                    case TRANSFER_ENCODING:
+                        if (_value==HttpHeaderValue.CHUNKED)
+                            _endOfContent=EndOfContent.CHUNKED_CONTENT;
+                        else
+                        {
+                            if (_valueString.endsWith(HttpHeaderValue.CHUNKED.toString()))
+                                _endOfContent=EndOfContent.CHUNKED_CONTENT;
+                            else if (_valueString.contains(HttpHeaderValue.CHUNKED.toString()))
+                            {
+                                throw new BadMessageException(HttpStatus.BAD_REQUEST_400,"Bad chunking");
+                            }
+                        }
+                        break;
+
+                    case HOST:
+                        _host=true;
+                        if (!(_field instanceof HostPortHttpField))
+                        {
+                            _field=new HostPortHttpField(_header,_strict?_headerString:_header.asString(),_valueString);
+                            add_to_connection_trie=_connectionFields!=null;
+                        }
+                      break;
+                      
+                    case CONNECTION:
+                        // Don't cache if not persistent
+                        if (_valueString!=null && _valueString.contains("close"))
+                            _connectionFields=null;
+                        
+                        break;
+
+                    case AUTHORIZATION:
+                    case ACCEPT:
+                    case ACCEPT_CHARSET:
+                    case ACCEPT_ENCODING:
+                    case ACCEPT_LANGUAGE:
+                    case COOKIE:
+                    case CACHE_CONTROL:
+                    case USER_AGENT:
+                        add_to_connection_trie=_connectionFields!=null && _field==null;
+                        break;
+                        
+                    default: break;
+                }
+            
+                if (add_to_connection_trie && !_connectionFields.isFull() && _header!=null && _valueString!=null)
+                {
+                    if (_field==null)
+                        _field=new HttpField(_header,_strict?_headerString:_header.asString(),_valueString);
+                    _connectionFields.put(_field);
+                }
+            }
+            _handler.parsedHeader(_field!=null?_field:new HttpField(_header,_headerString,_valueString));
         }
         
-        return false;
+        _headerString=_valueString=null;
+        _header=null;
+        _value=null;
+        _field=null;
     }
     
     
@@ -941,194 +905,159 @@
                         case HttpTokens.COLON:
                         case HttpTokens.SPACE:
                         case HttpTokens.TAB:
+                            throw new BadMessageException(HttpStatus.BAD_REQUEST_400,"Bad Continuation");
+
+                        case HttpTokens.LINE_FEED:
                         {
-                            // header value without name - continuation?
-                            if (_valueString==null)
+                            _contentPosition=0;
+
+                            // End of headers!
+
+                            // Was there a required host header?
+                            if (!_host && _version==HttpVersion.HTTP_1_1 && _requestHandler!=null)
                             {
-                                _string.setLength(0);
-                                _length=0;
+                                throw new BadMessageException(HttpStatus.BAD_REQUEST_400,"No Host");
                             }
-                            else
+
+                            // is it a response that cannot have a body?
+                            if (_responseHandler !=null  && // response  
+                                    (_responseStatus == 304  || // not-modified response
+                                    _responseStatus == 204 || // no-content response
+                                    _responseStatus < 200)) // 1xx response
+                                _endOfContent=EndOfContent.NO_CONTENT; // ignore any other headers set
+
+                            // else if we don't know framing
+                            else if (_endOfContent == EndOfContent.UNKNOWN_CONTENT)
                             {
-                                setString(_valueString);
-                                _string.append(' ');
-                                _length++;
-                                _valueString=null;
+                                if (_responseStatus == 0  // request
+                                        || _responseStatus == 304 // not-modified response
+                                        || _responseStatus == 204 // no-content response
+                                        || _responseStatus < 200) // 1xx response
+                                    _endOfContent=EndOfContent.NO_CONTENT;
+                                else
+                                    _endOfContent=EndOfContent.EOF_CONTENT;
                             }
-                            setState(State.HEADER_VALUE);
-                            break;
+
+                            // How is the message ended?
+                            switch (_endOfContent)
+                            {
+                                case EOF_CONTENT:
+                                    setState(State.EOF_CONTENT);
+                                    handle=_handler.headerComplete()||handle;
+                                    return handle;
+
+                                case CHUNKED_CONTENT:
+                                    setState(State.CHUNKED_CONTENT);
+                                    handle=_handler.headerComplete()||handle;
+                                    return handle;
+
+                                case NO_CONTENT:
+                                    handle=_handler.headerComplete()||handle;
+                                    setState(State.END);
+                                    handle=_handler.messageComplete()||handle;
+                                    return handle;
+
+                                default:
+                                    setState(State.CONTENT);
+                                    handle=_handler.headerComplete()||handle;
+                                    return handle;
+                            }
                         }
 
                         default:
                         {
-                            // handler last header if any.  Delayed to here just in case there was a continuation line (above)
-                            if (_headerString!=null || _valueString!=null)
-                            {
-                                // Handle known headers
-                                if (_header!=null && handleKnownHeaders(buffer))
-                                {
-                                    _headerString=_valueString=null;
-                                    _header=null;
-                                    _value=null;
-                                    _field=null;
-                                    return true;
-                                }
-                                handle=_handler.parsedHeader(_field!=null?_field:new HttpField(_header,_headerString,_valueString))||handle;
-                            }
-                            _headerString=_valueString=null;
-                            _header=null;
-                            _value=null;
-                            _field=null;
-
                             // now handle the ch
-                            if (ch == HttpTokens.LINE_FEED)
-                            {
-                                _contentPosition=0;
-
-                                // End of headers!
-
-                                // Was there a required host header?
-                                if (!_host && _version==HttpVersion.HTTP_1_1 && _requestHandler!=null)
-                                {
-                                    throw new BadMessageException(HttpStatus.BAD_REQUEST_400,"No Host");
-                                }
-
-                                // is it a response that cannot have a body?
-                                if (_responseHandler !=null  && // response  
-                                    (_responseStatus == 304  || // not-modified response
-                                    _responseStatus == 204 || // no-content response
-                                    _responseStatus < 200)) // 1xx response
-                                    _endOfContent=EndOfContent.NO_CONTENT; // ignore any other headers set
-                                
-                                // else if we don't know framing
-                                else if (_endOfContent == EndOfContent.UNKNOWN_CONTENT)
-                                {
-                                    if (_responseStatus == 0  // request
-                                            || _responseStatus == 304 // not-modified response
-                                            || _responseStatus == 204 // no-content response
-                                            || _responseStatus < 200) // 1xx response
-                                        _endOfContent=EndOfContent.NO_CONTENT;
-                                    else
-                                        _endOfContent=EndOfContent.EOF_CONTENT;
-                                }
-
-                                // How is the message ended?
-                                switch (_endOfContent)
-                                {
-                                    case EOF_CONTENT:
-                                        setState(State.EOF_CONTENT);
-                                        handle=_handler.headerComplete()||handle;
-                                        return handle;
-
-                                    case CHUNKED_CONTENT:
-                                        setState(State.CHUNKED_CONTENT);
-                                        handle=_handler.headerComplete()||handle;
-                                        return handle;
-
-                                    case NO_CONTENT:
-                                        handle=_handler.headerComplete()||handle;
-                                        setState(State.END);
-                                        handle=_handler.messageComplete()||handle;
-                                        return handle;
-
-                                    default:
-                                        setState(State.CONTENT);
-                                        handle=_handler.headerComplete()||handle;
-                                        return handle;
-                                }
-                            }
-                            else if (ch<=HttpTokens.SPACE)
+                            if (ch<=HttpTokens.SPACE)
                                 throw new BadMessageException();
-                            else
-                            {
-                                if (buffer.hasRemaining())
-                                {
-                                    // Try a look ahead for the known header name and value.
-                                    HttpField field=_connectionFields==null?null:_connectionFields.getBest(buffer,-1,buffer.remaining());
-                                    if (field==null)
-                                        field=CACHE.getBest(buffer,-1,buffer.remaining());
-                                        
-                                    if (field!=null)
-                                    {
-                                        final String n;
-                                        final String v;
 
-                                        if (_strict)
-                                        {
-                                            // Have to get the fields exactly from the buffer to match case
-                                            String fn=field.getName();
-                                            String fv=field.getValue();
-                                            n=BufferUtil.toString(buffer,buffer.position()-1,fn.length(),StandardCharsets.US_ASCII);
-                                            if (fv==null)
-                                                v=null;
-                                            else
-                                            {
-                                                v=BufferUtil.toString(buffer,buffer.position()+fn.length()+1,fv.length(),StandardCharsets.ISO_8859_1);
-                                                field=new HttpField(field.getHeader(),n,v);
-                                            }
-                                        }
+                            if (buffer.hasRemaining())
+                            {
+                                // Try a look ahead for the known header name and value.
+                                HttpField field=_connectionFields==null?null:_connectionFields.getBest(buffer,-1,buffer.remaining());
+                                if (field==null)
+                                    field=CACHE.getBest(buffer,-1,buffer.remaining());
+
+                                if (field!=null)
+                                {
+                                    final String n;
+                                    final String v;
+
+                                    if (_strict)
+                                    {
+                                        // Have to get the fields exactly from the buffer to match case
+                                        String fn=field.getName();
+                                        String fv=field.getValue();
+                                        n=BufferUtil.toString(buffer,buffer.position()-1,fn.length(),StandardCharsets.US_ASCII);
+                                        if (fv==null)
+                                            v=null;
                                         else
                                         {
-                                            n=field.getName();
-                                            v=field.getValue(); 
+                                            v=BufferUtil.toString(buffer,buffer.position()+fn.length()+1,fv.length(),StandardCharsets.ISO_8859_1);
+                                            field=new HttpField(field.getHeader(),n,v);
                                         }
-                                        
-                                        _header=field.getHeader();
-                                        _headerString=n;
-         
-                                        if (v==null)
-                                        {
-                                            // Header only
-                                            setState(State.HEADER_VALUE);
-                                            _string.setLength(0);
-                                            _length=0;
-                                            buffer.position(buffer.position()+n.length()+1);
+                                    }
+                                    else
+                                    {
+                                        n=field.getName();
+                                        v=field.getValue(); 
+                                    }
+
+                                    _header=field.getHeader();
+                                    _headerString=n;
+
+                                    if (v==null)
+                                    {
+                                        // Header only
+                                        setState(State.HEADER_VALUE);
+                                        _string.setLength(0);
+                                        _length=0;
+                                        buffer.position(buffer.position()+n.length()+1);
+                                        break;
+                                    }
+                                    else
+                                    {
+                                        // Header and value
+                                        int pos=buffer.position()+n.length()+v.length()+1;
+                                        byte b=buffer.get(pos);
+
+                                        if (b==HttpTokens.CARRIAGE_RETURN || b==HttpTokens.LINE_FEED)
+                                        {                     
+                                            _field=field;
+                                            _valueString=v;
+                                            setState(State.HEADER_IN_VALUE);
+
+                                            if (b==HttpTokens.CARRIAGE_RETURN)
+                                            {
+                                                _cr=true;
+                                                buffer.position(pos+1);
+                                            }
+                                            else
+                                                buffer.position(pos);
                                             break;
                                         }
                                         else
                                         {
-                                            // Header and value
-                                            int pos=buffer.position()+n.length()+v.length()+1;
-                                            byte b=buffer.get(pos);
-
-                                            if (b==HttpTokens.CARRIAGE_RETURN || b==HttpTokens.LINE_FEED)
-                                            {                     
-                                                _field=field;
-                                                _valueString=v;
-                                                setState(State.HEADER_IN_VALUE);
-
-                                                if (b==HttpTokens.CARRIAGE_RETURN)
-                                                {
-                                                    _cr=true;
-                                                    buffer.position(pos+1);
-                                                }
-                                                else
-                                                    buffer.position(pos);
-                                                break;
-                                            }
-                                            else
-                                            {
-                                                setState(State.HEADER_IN_VALUE);
-                                                setString(v);
-                                                buffer.position(pos);
-                                                break;
-                                            }
+                                            setState(State.HEADER_IN_VALUE);
+                                            setString(v);
+                                            buffer.position(pos);
+                                            break;
                                         }
                                     }
                                 }
-
-                                // New header
-                                setState(State.HEADER_IN_NAME);
-                                _string.setLength(0);
-                                _string.append((char)ch);
-                                _length=1;
                             }
+
+                            // New header
+                            setState(State.HEADER_IN_NAME);
+                            _string.setLength(0);
+                            _string.append((char)ch);
+                            _length=1;
+
                         }
                     }
                     break;
 
                 case HEADER_IN_NAME:
-                    if (ch==HttpTokens.COLON || ch==HttpTokens.LINE_FEED)
+                    if (ch==HttpTokens.COLON)
                     {
                         if (_headerString==null)
                         {
@@ -1137,11 +1066,11 @@
                         }
                         _length=-1;
 
-                        setState(ch==HttpTokens.LINE_FEED?State.HEADER:State.HEADER_VALUE);
+                        setState(State.HEADER_VALUE);
                         break;
                     }
                     
-                    if (ch>=HttpTokens.SPACE || ch==HttpTokens.TAB)
+                    if (ch>HttpTokens.SPACE)
                     {
                         if (_header!=null)
                         {
@@ -1169,18 +1098,18 @@
                     
                     if (ch==HttpTokens.SPACE || ch==HttpTokens.TAB)
                         break;
-                    
+
                     if (ch==HttpTokens.LINE_FEED)
                     {
-                        if (_length > 0)
-                        {
-                            _value=null;
-                            _valueString=(_valueString==null)?takeString():(_valueString+" "+takeString());
-                        }
+                        _value=null;
+                        _string.setLength(0);
+                        _valueString=null;
+                        _length=-1;
+                        
+                        parsedHeader();
                         setState(State.HEADER);
-                        break; 
+                        break;
                     }
-                    
                     throw new IllegalCharacterException(_state,ch,buffer);
 
                 case HEADER_IN_VALUE:
@@ -1206,6 +1135,7 @@
                             _valueString=takeString();
                             _length=-1;
                         }
+                        parsedHeader();
                         setState(State.HEADER);
                         break;
                     }
@@ -1224,6 +1154,7 @@
     /* ------------------------------------------------------------------------------- */
     /**
      * Parse until next Event.
+     * @param buffer the buffer to parse
      * @return True if an {@link RequestHandler} method was called and it returned true;
      */
     public boolean parseNext(ByteBuffer buffer)
@@ -1281,8 +1212,9 @@
                 while (buffer.remaining()>0 && buffer.get(buffer.position())<=HttpTokens.SPACE)
                     buffer.get();
             }
-            else if (_state==State.CLOSED)
+            else if (_state==State.CLOSE)
             {
+                // Seeking EOF
                 if (BufferUtil.hasContent(buffer))
                 {
                     // Just ignore data when closed
@@ -1291,10 +1223,14 @@
                     if (_maxHeaderBytes>0 && _headerBytes>_maxHeaderBytes)
                     {
                         // Don't want to waste time reading data of a closed request
-                        throw new IllegalStateException("too much data after closed");
+                        throw new IllegalStateException("too much data seeking EOF");
                     }
                 }
             }
+            else if (_state==State.CLOSED)
+            {
+                BufferUtil.clear(buffer);
+            }
             
             // Handle EOF
             if (_eof && !buffer.hasRemaining())
@@ -1310,6 +1246,7 @@
                         break;
                         
                     case END:
+                    case CLOSE:
                         setState(State.CLOSED);
                         break;
                         
@@ -1334,41 +1271,60 @@
                         break;
                 }
             }
-            
-            return false;
         }
         catch(BadMessageException e)
         {
             BufferUtil.clear(buffer);
 
-            LOG.warn("badMessage: "+e._code+(e.getMessage()!=null?" "+e.getMessage():"")+" for "+_handler);
-            if (DEBUG)
-                LOG.debug(e);
-            setState(State.CLOSED);
-            _handler.badMessage(e._code, e.getMessage());
-            return false;
+            Throwable cause = e.getCause();
+            boolean stack = LOG.isDebugEnabled() || 
+                    (!(cause instanceof NumberFormatException )  && (cause instanceof RuntimeException || cause instanceof Error));
+            
+            if (stack)
+                LOG.warn("bad HTTP parsed: "+e._code+(e.getReason()!=null?" "+e.getReason():"")+" for "+_handler,e);
+            else
+                LOG.warn("bad HTTP parsed: "+e._code+(e.getReason()!=null?" "+e.getReason():"")+" for "+_handler);
+            setState(State.CLOSE);
+            _handler.badMessage(e.getCode(), e.getReason());
         }
-        catch(Exception e)
+        catch(NumberFormatException|IllegalStateException e)
         {
             BufferUtil.clear(buffer);
-
-            LOG.warn("badMessage: "+e.toString()+" for "+_handler);
+            LOG.warn("parse exception: {} in {} for {}",e.toString(),_state,_handler);
             if (DEBUG)
                 LOG.debug(e);
             
-            if (_state.ordinal()<=State.END.ordinal())
+            switch(_state)
             {
-                setState(State.CLOSED);
-                _handler.badMessage(400,null);
+                case CLOSED:
+                    break;
+                case CLOSE:
+                    _handler.earlyEOF();
+                    break;
+                default:
+                    setState(State.CLOSE);
+                    _handler.badMessage(400,null);
             }
-            else
-            {
-                _handler.earlyEOF();
-                setState(State.CLOSED);
-            }
-
-            return false;
         }
+        catch(Exception|Error e)
+        {
+            BufferUtil.clear(buffer);
+
+            LOG.warn("parse exception: "+e.toString()+" for "+_handler,e);
+
+            switch(_state)
+            {
+                case CLOSED:
+                    break;
+                case CLOSE:
+                    _handler.earlyEOF();
+                    break;
+                default:
+                    setState(State.CLOSE);
+                    _handler.badMessage(400,null);
+            }
+        }
+        return false;
     }
 
     protected boolean parseContent(ByteBuffer buffer)
@@ -1540,8 +1496,9 @@
     }
     
     /* ------------------------------------------------------------------------------- */
+    /** Signal that the associated data source is at EOF
+     */
     public void atEOF()
-
     {        
         if (DEBUG)
             LOG.debug("atEOF {}", this);
@@ -1549,11 +1506,13 @@
     }
 
     /* ------------------------------------------------------------------------------- */
+    /** Request that the associated data source be closed
+     */
     public void close()
     {
         if (DEBUG)
             LOG.debug("close {}", this);
-        setState(State.CLOSED);
+        setState(State.CLOSE);
     }
     
     /* ------------------------------------------------------------------------------- */
@@ -1561,14 +1520,10 @@
     {
         if (DEBUG)
             LOG.debug("reset {}", this);
+
         // reset state
-        if (_state==State.CLOSED)
+        if (_state==State.CLOSE || _state==State.CLOSED)
             return;
-        if (_closed)
-        {
-            setState(State.CLOSED);
-            return;
-        }
         
         setState(State.START);
         _endOfContent=EndOfContent.UNKNOWN_CONTENT;
@@ -1632,9 +1587,9 @@
      * headerComplete then messageComplete) from the same point in the parsing
      * then it is sufficient for the caller to process the events only once.
      */
-    public interface HttpHandler<T>
+    public interface HttpHandler
     {
-        public boolean content(T item);
+        public boolean content(ByteBuffer item);
 
         public boolean headerComplete();
 
@@ -1643,10 +1598,9 @@
         /**
          * This is the method called by parser when a HTTP Header name and value is found
          * @param field The field parsed
-         * @return True if the parser should return to its caller
          */
-        public boolean parsedHeader(HttpField field);
-
+        public void parsedHeader(HttpField field);
+        
         /* ------------------------------------------------------------ */
         /** Called to signal that an EOF was received unexpectedly
          * during the parsing of a HTTP message
@@ -1669,43 +1623,32 @@
     /* ------------------------------------------------------------------------------- */
     /* ------------------------------------------------------------------------------- */
     /* ------------------------------------------------------------------------------- */
-    public interface ProxyHandler 
-    {
-        void proxied(String protocol, String sAddr, String dAddr, int sPort, int dPort);
-    }
-
-    /* ------------------------------------------------------------------------------- */
-    /* ------------------------------------------------------------------------------- */
-    /* ------------------------------------------------------------------------------- */
-    public interface RequestHandler<T> extends HttpHandler<T>
+    public interface RequestHandler extends HttpHandler
     {
         /**
          * This is the method called by parser when the HTTP request line is parsed
-         * @param method The method as enum if of a known type
-         * @param methodString The method as a string
+         * @param method The method 
          * @param uri The raw bytes of the URI.  These are copied into a ByteBuffer that will not be changed until this parser is reset and reused.
-         * @param version
+         * @param version the http version in use
          * @return true if handling parsing should return.
          */
-        public abstract boolean startRequest(HttpMethod method, String methodString, ByteBuffer uri, HttpVersion version);
+        public boolean startRequest(String method, String uri, HttpVersion version);
 
-        /**
-         * This is the method called by the parser after it has parsed the host header (and checked it's format). This is
-         * called after the {@link HttpHandler#parsedHeader(HttpField)} methods and before
-         * HttpHandler#headerComplete();
-         */
-        public abstract boolean parsedHostHeader(String host,int port);
     }
 
     /* ------------------------------------------------------------------------------- */
     /* ------------------------------------------------------------------------------- */
     /* ------------------------------------------------------------------------------- */
-    public interface ResponseHandler<T> extends HttpHandler<T>
+    public interface ResponseHandler extends HttpHandler
     {
         /**
          * This is the method called by parser when the HTTP request line is parsed
+         * @param version the http version in use
+         * @param status the response status
+         * @param reason the response reason phrase
+         * @return true if handling parsing should return
          */
-        public abstract boolean startResponse(HttpVersion version, int status, String reason);
+        public boolean startResponse(HttpVersion version, int status, String reason);
     }
 
     /* ------------------------------------------------------------------------------- */
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpScheme.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpScheme.java
index 32a21a7..d5edcca 100644
--- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpScheme.java
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpScheme.java
@@ -61,7 +61,7 @@
     /* ------------------------------------------------------------ */
     public boolean is(String s)
     {
-        return _string.equalsIgnoreCase(s);
+        return s!=null && _string.equalsIgnoreCase(s);
     }
 
     public String asString()
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpStatus.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpStatus.java
index a7b3473..c21be71 100644
--- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpStatus.java
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpStatus.java
@@ -25,14 +25,17 @@
  * </p>
  *
  * <table border="1" cellpadding="5">
+ * <caption>HTTP Status Codes Table</caption>
  * <tr>
  * <th>Enum</th>
  * <th>Code</th>
  * <th>Message</th>
- * <th>
+ * <th> 
  * <a href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a></th>
+ * <th> 
+ * <a href="http://tools.ietf.org/html/rfc7231">RFC 7231 - HTTP/1.1 Semantics and Content</a></th>
  * <th>
- * <a href="http://tools.ietf.org/html/rfc2616">RFC 2616 - HTTP/1.1</a></th>
+ * <a href="http://tools.ietf.org/html/rfc7238">RFC 7238 - HTTP/1.1 Permanent Redirect</a></th>
  * <th>
  * <a href="http://tools.ietf.org/html/rfc2518">RFC 2518 - WEBDAV</a></th>
  * </tr>
@@ -48,7 +51,7 @@
  * <td>Continue</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.1.1">Sec. 10.1.1</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.2.1">Sec. 6.2.1</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -57,7 +60,7 @@
  * <td>Switching Protocols</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.1.2">Sec. 10.1.2</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.2.2">Sec. 6.2.2</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -82,7 +85,7 @@
  * <td>
  * <a href="http://tools.ietf.org/html/rfc1945#section-9.2">Sec. 9.2</a></td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.2.1">Sec. 10.2.1</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.3.1">Sec. 6.3.1</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -92,7 +95,7 @@
  * <td>
  * <a href="http://tools.ietf.org/html/rfc1945#section-9.2">Sec. 9.2</a></td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.2.2">Sec. 10.2.2</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.3.2">Sec. 6.3.2</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -102,7 +105,7 @@
  * <td>
  * <a href="http://tools.ietf.org/html/rfc1945#section-9.2">Sec. 9.2</a></td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.2.3">Sec. 10.2.3</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.3.3">Sec. 6.3.3</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -111,7 +114,7 @@
  * <td>Non Authoritative Information</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.2.4">Sec. 10.2.4</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.3.4">Sec. 6.3.4</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -121,7 +124,7 @@
  * <td>
  * <a href="http://tools.ietf.org/html/rfc1945#section-9.2">Sec. 9.2</a></td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.2.5">Sec. 10.2.5</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.3.5">Sec. 6.3.5</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -130,7 +133,7 @@
  * <td>Reset Content</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.2.6">Sec. 10.2.6</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.3.6">Sec. 6.3.6</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -139,7 +142,7 @@
  * <td>Partial Content</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.2.7">Sec. 10.2.7</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.3.7">Sec. 6.3.7</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -153,8 +156,8 @@
  * </tr>
  * <tr>
  * <td>&nbsp;</td>
- * <td><strike>207</strike></td>
- * <td><strike>Partial Update OK</strike></td>
+ * <td style="text-decoration: line-through;">207</td>
+ * <td style="text-decoration: line-through;">Partial Update OK</td>
  * <td>&nbsp;</td>
  * <td>
  * <a href=
@@ -175,7 +178,7 @@
  * <td>
  * <a href="http://tools.ietf.org/html/rfc1945#section-9.3">Sec. 9.3</a></td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.3.1">Sec. 10.3.1</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.4.1">Sec. 6.4.1</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -185,7 +188,7 @@
  * <td>
  * <a href="http://tools.ietf.org/html/rfc1945#section-9.3">Sec. 9.3</a></td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.3.2">Sec. 10.3.2</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.4.2">Sec. 6.4.2</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -203,7 +206,7 @@
  * <td>Found</td>
  * <td>(was "<code>302 Moved Temporarily</code>")</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.3.3">Sec. 10.3.3</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.4.3">Sec. 6.4.3</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -212,7 +215,7 @@
  * <td>See Other</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.3.4">Sec. 10.3.4</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.4.4">Sec. 6.4.4</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -222,7 +225,7 @@
  * <td>
  * <a href="http://tools.ietf.org/html/rfc1945#section-9.3">Sec. 9.3</a></td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.3.5">Sec. 10.3.5</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.4.5">Sec. 6.4.5</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -231,7 +234,7 @@
  * <td>Use Proxy</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.3.6">Sec. 10.3.6</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.4.6">Sec. 6.4.6</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -240,7 +243,7 @@
  * <td><em>(Unused)</em></td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.3.7">Sec. 10.3.7</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.4.7">Sec. 6.4.7</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -249,7 +252,17 @@
  * <td>Temporary Redirect</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.3.8">Sec. 10.3.8</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.4.8">Sec. 6.4.8</a></td>
+ * <td>&nbsp;</td>
+ * </tr>
+ *
+ * <tr>
+ * <td>{@link #PERMANENT_REDIRECT_308}</td>
+ * <td>307</td>
+ * <td>Permanent Redirect</td>
+ * <td>&nbsp;</td>
+ * <td>
+ * <a href="http://tools.ietf.org/html/rfc7238">RFC7238</a></td>
  * <td>&nbsp;</td>
  * </tr>
  *
@@ -265,7 +278,7 @@
  * <td>
  * <a href="http://tools.ietf.org/html/rfc1945#section-9.4">Sec. 9.4</a></td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.1">Sec. 10.4.1</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.5.1">Sec. 6.5.1</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -275,7 +288,7 @@
  * <td>
  * <a href="http://tools.ietf.org/html/rfc1945#section-9.4">Sec. 9.4</a></td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.2">Sec. 10.4.2</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.5.2">Sec. 6.5.2</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -285,7 +298,7 @@
  * <td>
  * <a href="http://tools.ietf.org/html/rfc1945#section-9.4">Sec. 9.4</a></td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.3">Sec. 10.4.3</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.5.3">Sec. 6.5.3</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -295,7 +308,7 @@
  * <td>
  * <a href="http://tools.ietf.org/html/rfc1945#section-9.4">Sec. 9.4</a></td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.4">Sec. 10.4.4</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.5.4">Sec. 6.5.4</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -305,7 +318,7 @@
  * <td>
  * <a href="http://tools.ietf.org/html/rfc1945#section-9.4">Sec. 9.4</a></td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.5">Sec. 10.4.5</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.5.5">Sec. 6.5.5</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -314,7 +327,7 @@
  * <td>Method Not Allowed</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.6">Sec. 10.4.6</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.5.6">Sec. 6.5.6</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -323,7 +336,7 @@
  * <td>Not Acceptable</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.7">Sec. 10.4.7</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.5.7">Sec. 6.5.7</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -332,7 +345,7 @@
  * <td>Proxy Authentication Required</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.8">Sec. 10.4.8</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.5.8">Sec. 6.5.8</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -341,7 +354,7 @@
  * <td>Request Timeout</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.9">Sec. 10.4.9</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.5.9">Sec. 6.5.9</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -350,7 +363,7 @@
  * <td>Conflict</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.10">Sec. 10.4.10</a>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-10.4.10">Sec. 10.4.10</a>
  * </td>
  * <td>&nbsp;</td>
  * </tr>
@@ -360,7 +373,7 @@
  * <td>Gone</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.11">Sec. 10.4.11</a>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-10.4.11">Sec. 10.4.11</a>
  * </td>
  * <td>&nbsp;</td>
  * </tr>
@@ -370,7 +383,7 @@
  * <td>Length Required</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.12">Sec. 10.4.12</a>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-10.4.12">Sec. 10.4.12</a>
  * </td>
  * <td>&nbsp;</td>
  * </tr>
@@ -380,7 +393,7 @@
  * <td>Precondition Failed</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.13">Sec. 10.4.13</a>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-10.4.13">Sec. 10.4.13</a>
  * </td>
  * <td>&nbsp;</td>
  * </tr>
@@ -390,7 +403,7 @@
  * <td>Request Entity Too Large</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.14">Sec. 10.4.14</a>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-10.4.14">Sec. 10.4.14</a>
  * </td>
  * <td>&nbsp;</td>
  * </tr>
@@ -400,7 +413,7 @@
  * <td>Request-URI Too Long</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.15">Sec. 10.4.15</a>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-10.4.15">Sec. 10.4.15</a>
  * </td>
  * <td>&nbsp;</td>
  * </tr>
@@ -410,7 +423,7 @@
  * <td>Unsupported Media Type</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.16">Sec. 10.4.16</a>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-10.4.16">Sec. 10.4.16</a>
  * </td>
  * <td>&nbsp;</td>
  * </tr>
@@ -420,7 +433,7 @@
  * <td>Requested Range Not Satisfiable</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.17">Sec. 10.4.17</a>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-10.4.17">Sec. 10.4.17</a>
  * </td>
  * <td>&nbsp;</td>
  * </tr>
@@ -430,14 +443,14 @@
  * <td>Expectation Failed</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.4.18">Sec. 10.4.18</a>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-10.4.18">Sec. 10.4.18</a>
  * </td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
  * <td>&nbsp;</td>
- * <td><strike>418</strike></td>
- * <td><strike>Reauthentication Required</strike></td>
+ * <td style="text-decoration: line-through;">418</td>
+ * <td style="text-decoration: line-through;">Reauthentication Required</td>
  * <td>&nbsp;</td>
  * <td>
  * <a href=
@@ -447,8 +460,8 @@
  * </tr>
  * <tr>
  * <td>&nbsp;</td>
- * <td><strike>418</strike></td>
- * <td><strike>Unprocessable Entity</strike></td>
+ * <td style="text-decoration: line-through;">418</td>
+ * <td style="text-decoration: line-through;">Unprocessable Entity</td>
  * <td>&nbsp;</td>
  * <td>&nbsp;</td>
  * <td>
@@ -458,8 +471,8 @@
  * </tr>
  * <tr>
  * <td>&nbsp;</td>
- * <td><strike>419</strike></td>
- * <td><strike>Proxy Reauthentication Required</stike></td>
+ * <td style="text-decoration: line-through;">419</td>
+ * <td style="text-decoration: line-through;">Proxy Reauthentication Required</td>
  * <td>&nbsp;</td>
  * <td>
  * <a href=
@@ -469,8 +482,8 @@
  * </tr>
  * <tr>
  * <td>&nbsp;</td>
- * <td><strike>419</strike></td>
- * <td><strike>Insufficient Space on Resource</stike></td>
+ * <td style="text-decoration: line-through;">419</td>
+ * <td style="text-decoration: line-through;">Insufficient Space on Resource</td>
  * <td>&nbsp;</td>
  * <td>&nbsp;</td>
  * <td>
@@ -480,8 +493,8 @@
  * </tr>
  * <tr>
  * <td>&nbsp;</td>
- * <td><strike>420</strike></td>
- * <td><strike>Method Failure</strike></td>
+ * <td style="text-decoration: line-through;">420</td>
+ * <td style="text-decoration: line-through;">Method Failure</td>
  * <td>&nbsp;</td>
  * <td>&nbsp;</td>
  * <td>
@@ -537,7 +550,7 @@
  * <td>
  * <a href="http://tools.ietf.org/html/rfc1945#section-9.5">Sec. 9.5</a></td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.5.1">Sec. 10.5.1</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.6.1">Sec. 6.6.1</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -547,7 +560,7 @@
  * <td>
  * <a href="http://tools.ietf.org/html/rfc1945#section-9.5">Sec. 9.5</a></td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.5.2">Sec. 10.5.2</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.6.2">Sec. 6.6.2</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -557,7 +570,7 @@
  * <td>
  * <a href="http://tools.ietf.org/html/rfc1945#section-9.5">Sec. 9.5</a></td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.5.3">Sec. 10.5.3</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.6.3">Sec. 6.6.3</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -567,7 +580,7 @@
  * <td>
  * <a href="http://tools.ietf.org/html/rfc1945#section-9.5">Sec. 9.5</a></td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.5.4">Sec. 10.5.4</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.6.4">Sec. 6.6.4</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -576,7 +589,7 @@
  * <td>Gateway Timeout</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.5.5">Sec. 10.5.5</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.6.5">Sec. 6.6.5</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -585,7 +598,7 @@
  * <td>HTTP Version Not Supported</td>
  * <td>&nbsp;</td>
  * <td>
- * <a href="http://tools.ietf.org/html/rfc2616#section-10.5.6">Sec. 10.5.6</a></td>
+ * <a href="http://tools.ietf.org/html/rfc7231#section-6.6.6">Sec. 6.6.6</a></td>
  * <td>&nbsp;</td>
  * </tr>
  * <tr>
@@ -633,6 +646,7 @@
     public final static int NOT_MODIFIED_304 = 304;
     public final static int USE_PROXY_305 = 305;
     public final static int TEMPORARY_REDIRECT_307 = 307;
+    public final static int PERMANENT_REDIRECT_308 = 308;
 
     public final static int BAD_REQUEST_400 = 400;
     public final static int UNAUTHORIZED_401 = 401;
@@ -652,9 +666,11 @@
     public final static int UNSUPPORTED_MEDIA_TYPE_415 = 415;
     public final static int REQUESTED_RANGE_NOT_SATISFIABLE_416 = 416;
     public final static int EXPECTATION_FAILED_417 = 417;
+    public final static int MISDIRECTED_REQUEST_421 = 421;
     public final static int UNPROCESSABLE_ENTITY_422 = 422;
     public final static int LOCKED_423 = 423;
     public final static int FAILED_DEPENDENCY_424 = 424;
+    public final static int UPGRADE_REQUIRED_426 = 426;
 
     public final static int INTERNAL_SERVER_ERROR_500 = 500;
     public final static int NOT_IMPLEMENTED_501 = 501;
@@ -664,8 +680,13 @@
     public final static int HTTP_VERSION_NOT_SUPPORTED_505 = 505;
     public final static int INSUFFICIENT_STORAGE_507 = 507;
 
-    public static final int MAX_CODE = 507;
-
+    // RFC 6585
+    public final static int PRECONDITION_REQUIRED_428 = 428;
+    public final static int TOO_MANY_REQUESTS_429 = 429;
+    public final static int REQUEST_HEADER_FIELDS_TOO_LARGE_431 = 431;
+    public final static int NETWORK_AUTHENTICATION_REQUIRED_511 = 511;
+    
+    public static final int MAX_CODE = 511;
 
     private static final Code[] codeMap = new Code[MAX_CODE+1];
 
@@ -683,7 +704,7 @@
         /*
          * --------------------------------------------------------------------
          * Informational messages in 1xx series. As defined by ... RFC 1945 -
-         * HTTP/1.0 RFC 2616 - HTTP/1.1 RFC 2518 - WebDAV
+         * HTTP/1.0 RFC 7231 - HTTP/1.1 RFC 2518 - WebDAV
          */
 
         /** <code>100 Continue</code> */
@@ -696,7 +717,7 @@
         /*
          * --------------------------------------------------------------------
          * Success messages in 2xx series. As defined by ... RFC 1945 - HTTP/1.0
-         * RFC 2616 - HTTP/1.1 RFC 2518 - WebDAV
+         * RFC 7231 - HTTP/1.1 RFC 2518 - WebDAV
          */
 
         /** <code>200 OK</code> */
@@ -719,7 +740,7 @@
         /*
          * --------------------------------------------------------------------
          * Redirection messages in 3xx series. As defined by ... RFC 1945 -
-         * HTTP/1.0 RFC 2616 - HTTP/1.1
+         * HTTP/1.0 RFC 7231 - HTTP/1.1
          */
 
         /** <code>300 Mutliple Choices</code> */
@@ -738,11 +759,13 @@
         USE_PROXY(USE_PROXY_305, "Use Proxy"),
         /** <code>307 Temporary Redirect</code> */
         TEMPORARY_REDIRECT(TEMPORARY_REDIRECT_307, "Temporary Redirect"),
+        /** <code>308 Permanent Redirect</code> */
+        PERMANET_REDIRECT(PERMANENT_REDIRECT_308, "Permanent Redirect"),
 
         /*
          * --------------------------------------------------------------------
          * Client Error messages in 4xx series. As defined by ... RFC 1945 -
-         * HTTP/1.0 RFC 2616 - HTTP/1.1 RFC 2518 - WebDAV
+         * HTTP/1.0 RFC 7231 - HTTP/1.1 RFC 2518 - WebDAV
          */
 
         /** <code>400 Bad Request</code> */
@@ -781,17 +804,29 @@
         REQUESTED_RANGE_NOT_SATISFIABLE(REQUESTED_RANGE_NOT_SATISFIABLE_416, "Requested Range Not Satisfiable"),
         /** <code>417 Expectation Failed</code> */
         EXPECTATION_FAILED(EXPECTATION_FAILED_417, "Expectation Failed"),
+        /** <code>421 Misdirected Request(RFC7234)y</code> */
+        MISDIRECTED_REQUEST(MISDIRECTED_REQUEST_421, "Misdirected Request"),
         /** <code>422 Unprocessable Entity</code> */
         UNPROCESSABLE_ENTITY(UNPROCESSABLE_ENTITY_422, "Unprocessable Entity"),
         /** <code>423 Locked</code> */
         LOCKED(LOCKED_423, "Locked"),
         /** <code>424 Failed Dependency</code> */
         FAILED_DEPENDENCY(FAILED_DEPENDENCY_424, "Failed Dependency"),
-
+        
+        /** <code>426 Upgrade Required (RFC7231)</code> */
+        UPGRADE_REQUIRED(UPGRADE_REQUIRED_426, "Upgrade Required"),
+        
+        /** <code>428 Precondition Required (RFC6585)</code> */
+        PRECONDITION_REQUIRED(PRECONDITION_REQUIRED_428, "Precondition Required"),
+        /** <code>429 Too Many Requests (RFC6585)</code> */
+        TOO_MANY_REQUESTS(TOO_MANY_REQUESTS_429, "Too Many Requests"),
+        /** <code>431 Request Header Fields Too Large (RFC6585)</code> */
+        REQUEST_HEADER_FIELDS_TOO_LARGE(REQUEST_HEADER_FIELDS_TOO_LARGE_431, "Request Header Fields Too Large"),
+      
         /*
          * --------------------------------------------------------------------
          * Server Error messages in 5xx series. As defined by ... RFC 1945 -
-         * HTTP/1.0 RFC 2616 - HTTP/1.1 RFC 2518 - WebDAV
+         * HTTP/1.0 RFC 7231 - HTTP/1.1 RFC 2518 - WebDAV
          */
 
         /** <code>500 Server Error</code> */
@@ -807,8 +842,13 @@
         /** <code>505 HTTP Version Not Supported</code> */
         HTTP_VERSION_NOT_SUPPORTED(HTTP_VERSION_NOT_SUPPORTED_505, "HTTP Version Not Supported"),
         /** <code>507 Insufficient Storage</code> */
-        INSUFFICIENT_STORAGE(INSUFFICIENT_STORAGE_507, "Insufficient Storage");
+        INSUFFICIENT_STORAGE(INSUFFICIENT_STORAGE_507, "Insufficient Storage"),
 
+        /** <code>511 Network Authentication Required (RFC6585)</code> */
+        NETWORK_AUTHENTICATION_REQUIRED(NETWORK_AUTHENTICATION_REQUIRED_511, "Network Authentication Required"),
+        
+        ;
+        
         private final int _code;
         private final String _message;
 
@@ -844,7 +884,7 @@
          * Simple test against an code to determine if it falls into the
          * <code>Informational</code> message category as defined in the <a
          * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>,
-         * and <a href="http://tools.ietf.org/html/rfc2616">RFC 2616 -
+         * and <a href="http://tools.ietf.org/html/rfc7231">RFC 7231 -
          * HTTP/1.1</a>.
          *
          * @return true if within range of codes that belongs to
@@ -859,7 +899,7 @@
          * Simple test against an code to determine if it falls into the
          * <code>Success</code> message category as defined in the <a
          * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>,
-         * and <a href="http://tools.ietf.org/html/rfc2616">RFC 2616 -
+         * and <a href="http://tools.ietf.org/html/rfc7231">RFC 7231 -
          * HTTP/1.1</a>.
          *
          * @return true if within range of codes that belongs to
@@ -874,7 +914,7 @@
          * Simple test against an code to determine if it falls into the
          * <code>Redirection</code> message category as defined in the <a
          * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>,
-         * and <a href="http://tools.ietf.org/html/rfc2616">RFC 2616 -
+         * and <a href="http://tools.ietf.org/html/rfc7231">RFC 7231 -
          * HTTP/1.1</a>.
          *
          * @return true if within range of codes that belongs to
@@ -889,7 +929,7 @@
          * Simple test against an code to determine if it falls into the
          * <code>Client Error</code> message category as defined in the <a
          * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>,
-         * and <a href="http://tools.ietf.org/html/rfc2616">RFC 2616 -
+         * and <a href="http://tools.ietf.org/html/rfc7231">RFC 7231 -
          * HTTP/1.1</a>.
          *
          * @return true if within range of codes that belongs to
@@ -904,7 +944,7 @@
          * Simple test against an code to determine if it falls into the
          * <code>Server Error</code> message category as defined in the <a
          * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>,
-         * and <a href="http://tools.ietf.org/html/rfc2616">RFC 2616 -
+         * and <a href="http://tools.ietf.org/html/rfc7231">RFC 7231 -
          * HTTP/1.1</a>.
          *
          * @return true if within range of codes that belongs to
@@ -958,7 +998,7 @@
      * Simple test against an code to determine if it falls into the
      * <code>Informational</code> message category as defined in the <a
      * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>, and <a
-     * href="http://tools.ietf.org/html/rfc2616">RFC 2616 - HTTP/1.1</a>.
+     * href="http://tools.ietf.org/html/rfc7231">RFC 7231 - HTTP/1.1</a>.
      *
      * @param code
      *            the code to test.
@@ -974,7 +1014,7 @@
      * Simple test against an code to determine if it falls into the
      * <code>Success</code> message category as defined in the <a
      * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>, and <a
-     * href="http://tools.ietf.org/html/rfc2616">RFC 2616 - HTTP/1.1</a>.
+     * href="http://tools.ietf.org/html/rfc7231">RFC 7231 - HTTP/1.1</a>.
      *
      * @param code
      *            the code to test.
@@ -990,7 +1030,7 @@
      * Simple test against an code to determine if it falls into the
      * <code>Redirection</code> message category as defined in the <a
      * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>, and <a
-     * href="http://tools.ietf.org/html/rfc2616">RFC 2616 - HTTP/1.1</a>.
+     * href="http://tools.ietf.org/html/rfc7231">RFC 7231 - HTTP/1.1</a>.
      *
      * @param code
      *            the code to test.
@@ -1006,7 +1046,7 @@
      * Simple test against an code to determine if it falls into the
      * <code>Client Error</code> message category as defined in the <a
      * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>, and <a
-     * href="http://tools.ietf.org/html/rfc2616">RFC 2616 - HTTP/1.1</a>.
+     * href="http://tools.ietf.org/html/rfc7231">RFC 7231 - HTTP/1.1</a>.
      *
      * @param code
      *            the code to test.
@@ -1022,7 +1062,7 @@
      * Simple test against an code to determine if it falls into the
      * <code>Server Error</code> message category as defined in the <a
      * href="http://tools.ietf.org/html/rfc1945">RFC 1945 - HTTP/1.0</a>, and <a
-     * href="http://tools.ietf.org/html/rfc2616">RFC 2616 - HTTP/1.1</a>.
+     * href="http://tools.ietf.org/html/rfc7231">RFC 7231 - HTTP/1.1</a>.
      *
      * @param code
      *            the code to test.
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpTester.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpTester.java
deleted file mode 100644
index 4eee70c..0000000
--- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpTester.java
+++ /dev/null
@@ -1,367 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.http;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-
-import org.eclipse.jetty.http.HttpGenerator.RequestInfo;
-import org.eclipse.jetty.http.HttpGenerator.ResponseInfo;
-import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.StringUtil;
-
-public class HttpTester
-{
-    private HttpTester()
-    {
-    }
-
-    public static Request newRequest()
-    {
-        return new Request();
-    }
-
-    public static Request parseRequest(String request)
-    {
-        Request r=new Request();
-        HttpParser parser =new HttpParser(r);
-        parser.parseNext(BufferUtil.toBuffer(request));
-        return r;
-    }
-
-    public static Request parseRequest(ByteBuffer request)
-    {
-        Request r=new Request();
-        HttpParser parser =new HttpParser(r);
-        parser.parseNext(request);
-        return r;
-    }
-
-    public static Response parseResponse(String response)
-    {
-        Response r=new Response();
-        HttpParser parser =new HttpParser(r);
-        parser.parseNext(BufferUtil.toBuffer(response));
-        return r;
-    }
-
-    public static Response parseResponse(ByteBuffer response)
-    {
-        Response r=new Response();
-        HttpParser parser =new HttpParser(r);
-        parser.parseNext(response);
-        return r;
-    }
-
-
-    public abstract static class Message extends HttpFields implements HttpParser.HttpHandler<ByteBuffer>
-    {
-        ByteArrayOutputStream _content;
-        HttpVersion _version=HttpVersion.HTTP_1_0;
-
-        public HttpVersion getVersion()
-        {
-            return _version;
-        }
-
-        public void setVersion(String version)
-        {
-            setVersion(HttpVersion.CACHE.get(version));
-        }
-
-        public void setVersion(HttpVersion version)
-        {
-            _version=version;
-        }
-
-        public void setContent(byte[] bytes)
-        {
-            try
-            {
-                _content=new ByteArrayOutputStream();
-                _content.write(bytes);
-            }
-            catch (IOException e)
-            {
-                throw new RuntimeException(e);
-            }
-        }
-
-        public void setContent(String content)
-        {
-            try
-            {
-                _content=new ByteArrayOutputStream();
-                _content.write(StringUtil.getBytes(content));
-            }
-            catch (IOException e)
-            {
-                throw new RuntimeException(e);
-            }
-        }
-
-        public void setContent(ByteBuffer content)
-        {
-            try
-            {
-                _content=new ByteArrayOutputStream();
-                _content.write(BufferUtil.toArray(content));
-            }
-            catch (IOException e)
-            {
-                throw new RuntimeException(e);
-            }
-        }
-        @Override
-        public boolean parsedHeader(HttpField field)
-        {
-            put(field.getName(),field.getValue());
-            return false;
-        }
-
-        @Override
-        public boolean messageComplete()
-        {
-            return true;
-        }
-
-        @Override
-        public boolean headerComplete()
-        {
-            _content=new ByteArrayOutputStream();
-            return false;
-        }
-
-        @Override
-        public void earlyEOF()
-        {
-        }
-
-        @Override
-        public boolean content(ByteBuffer ref)
-        {
-            try
-            {
-                _content.write(BufferUtil.toArray(ref));
-            }
-            catch (IOException e)
-            {
-                throw new RuntimeException(e);
-            }
-            return false;
-        }
-
-        @Override
-        public void badMessage(int status, String reason)
-        {
-            throw new RuntimeException(reason);
-        }
-
-        public ByteBuffer generate()
-        {
-            try
-            {
-                HttpGenerator generator = new HttpGenerator();
-                HttpGenerator.Info info = getInfo();
-                // System.err.println(info.getClass());
-                // System.err.println(info);
-
-                ByteArrayOutputStream out = new ByteArrayOutputStream();
-                ByteBuffer header=null;
-                ByteBuffer chunk=null;
-                ByteBuffer content=_content==null?null:ByteBuffer.wrap(_content.toByteArray());
-
-
-                loop: while(!generator.isEnd())
-                {
-                    HttpGenerator.Result result =  info instanceof RequestInfo
-                        ?generator.generateRequest((RequestInfo)info,header,chunk,content,true)
-                        :generator.generateResponse((ResponseInfo)info,header,chunk,content,true);
-                    switch(result)
-                    {
-                        case NEED_HEADER:
-                            header=BufferUtil.allocate(8192);
-                            continue;
-
-                        case NEED_CHUNK:
-                            chunk=BufferUtil.allocate(HttpGenerator.CHUNK_SIZE);
-                            continue;
-
-                        case NEED_INFO:
-                            throw new IllegalStateException();
-
-                        case FLUSH:
-                            if (BufferUtil.hasContent(header))
-                            {
-                                out.write(BufferUtil.toArray(header));
-                                BufferUtil.clear(header);
-                            }
-                            if (BufferUtil.hasContent(chunk))
-                            {
-                                out.write(BufferUtil.toArray(chunk));
-                                BufferUtil.clear(chunk);
-                            }
-                            if (BufferUtil.hasContent(content))
-                            {
-                                out.write(BufferUtil.toArray(content));
-                                BufferUtil.clear(content);
-                            }
-                            break;
-
-                        case SHUTDOWN_OUT:
-                            break loop;
-                    }
-                }
-
-                return ByteBuffer.wrap(out.toByteArray());
-            }
-            catch (IOException e)
-            {
-                throw new RuntimeException(e);
-            }
-
-        }
-        abstract public HttpGenerator.Info getInfo();
-
-        @Override
-        public int getHeaderCacheSize()
-        {
-            return 0;
-        }
-
-    }
-
-    public static class Request extends Message implements HttpParser.RequestHandler<ByteBuffer>
-    {
-        private String _method;
-        private String _uri;
-
-        @Override
-        public boolean startRequest(HttpMethod method, String methodString, ByteBuffer uri, HttpVersion version)
-        {
-            _method=methodString;
-            _uri=BufferUtil.toUTF8String(uri);
-            _version=version;
-            return false;
-        }
-
-        public String getMethod()
-        {
-            return _method;
-        }
-
-        public String getUri()
-        {
-            return _uri;
-        }
-
-        public void setMethod(String method)
-        {
-            _method=method;
-        }
-
-        public void setURI(String uri)
-        {
-            _uri=uri;
-        }
-
-        @Override
-        public HttpGenerator.RequestInfo getInfo()
-        {
-            return new HttpGenerator.RequestInfo(_version,this,_content==null?0:_content.size(),_method,_uri);
-        }
-
-        @Override
-        public String toString()
-        {
-            return String.format("%s %s %s\n%s\n",_method,_uri,_version,super.toString());
-        }
-
-        public void setHeader(String name, String value)
-        {
-            put(name,value);
-        }
-
-        @Override
-        public boolean parsedHostHeader(String host,int port)
-        {
-            return false;
-        }
-    }
-
-    public static class Response extends Message implements HttpParser.ResponseHandler<ByteBuffer>
-    {
-        private int _status;
-        private String _reason;
-
-        @Override
-        public boolean startResponse(HttpVersion version, int status, String reason)
-        {
-            _version=version;
-            _status=status;
-            _reason=reason;
-            return false;
-        }
-
-        public int getStatus()
-        {
-            return _status;
-        }
-
-        public String getReason()
-        {
-            return _reason;
-        }
-
-        public byte[] getContentBytes()
-        {
-            if (_content==null)
-                return null;
-            return _content.toByteArray();
-        }
-
-        public String getContent()
-        {
-            if (_content==null)
-                return null;
-            byte[] bytes=_content.toByteArray();
-
-            String content_type=get(HttpHeader.CONTENT_TYPE);
-            String encoding=MimeTypes.getCharsetFromContentType(content_type);
-            Charset charset=encoding==null?StandardCharsets.UTF_8:Charset.forName(encoding);
-
-            return new String(bytes,charset);
-        }
-
-        @Override
-        public HttpGenerator.ResponseInfo getInfo()
-        {
-            return new HttpGenerator.ResponseInfo(_version,this,_content==null?-1:_content.size(),_status,_reason,false);
-        }
-
-        @Override
-        public String toString()
-        {
-            return String.format("%s %s %s\n%s\n",_version,_status,_reason,super.toString());
-        }
-    }
-}
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpURI.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpURI.java
index dbdca99..5da5dd4 100644
--- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpURI.java
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpURI.java
@@ -20,15 +20,14 @@
 
 import java.io.UnsupportedEncodingException;
 import java.net.URI;
+import java.net.URISyntaxException;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 
 import org.eclipse.jetty.util.MultiMap;
-import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.TypeUtil;
 import org.eclipse.jetty.util.URIUtil;
 import org.eclipse.jetty.util.UrlEncoded;
-import org.eclipse.jetty.util.Utf8StringBuilder;
 
 
 /* ------------------------------------------------------------ */
@@ -45,359 +44,306 @@
  * <li>{@link #getQuery()} - query</li>
  * <li>{@link #getFragment()} - fragment</li>
  * </ul>
- *
+ * 
+ * <p>Any parameters will be returned from {@link #getPath()}, but are excluded from the
+ * return value of {@link #getDecodedPath()}.   If there are multiple parameters, the 
+ * {@link #getParam()} method returns only the last one.
  */
 public class HttpURI
 {
-    private static final byte[] __empty={};
-    private final static int
-    START=0,
-    AUTH_OR_PATH=1,
-    SCHEME_OR_PATH=2,
-    AUTH=4,
-    IPV6=5,
-    PORT=6,
-    PATH=7,
-    PARAM=8,
-    QUERY=9,
-    ASTERISK=10;
+    private enum State {
+    START,
+    HOST_OR_PATH,
+    SCHEME_OR_PATH,
+    HOST,
+    IPV6,
+    PORT,
+    PATH,
+    PARAM,
+    QUERY,
+    FRAGMENT,
+    ASTERISK};
 
-    final Charset _charset;
-    boolean _partial=false;
-    byte[] _raw=__empty;
-    String _rawString;
-    int _scheme;
-    int _authority;
-    int _host;
-    int _port;
-    int _portValue;
-    int _path;
-    int _param;
-    int _query;
-    int _fragment;
-    int _end;
-    boolean _encoded=false;
-
-    public HttpURI()
-    {
-        _charset = URIUtil.__CHARSET;
-    }
-
-    public HttpURI(Charset charset)
-    {
-        _charset = charset;
-    }
+    private String _scheme;
+    private String _user;
+    private String _host;
+    private int _port;
+    private String _path;
+    private String _param;
+    private String _query;
+    private String _fragment;
+    
+    String _uri;
+    String _decodedPath;
 
     /* ------------------------------------------------------------ */
     /**
-     * @param parsePartialAuth If True, parse auth without prior scheme, else treat all URIs starting with / as paths
+     * Construct a normalized URI.
+     * Port is not set if it is the default port.
+     * @param scheme the URI scheme
+     * @param host the URI hose
+     * @param port the URI port
+     * @param path the URI path
+     * @param param the URI param
+     * @param query the URI query
+     * @param fragment the URI fragment
+     * @return the normalized URI
      */
-    public HttpURI(boolean parsePartialAuth)
+    public static HttpURI createHttpURI(String scheme, String host, int port, String path, String param, String query, String fragment)
     {
-        _partial=parsePartialAuth;
-        _charset = URIUtil.__CHARSET;
+        if (port==80 && HttpScheme.HTTP.is(scheme))
+            port=0;
+        if (port==443 && HttpScheme.HTTPS.is(scheme))
+            port=0;
+        return new HttpURI(scheme,host,port,path,param,query,fragment);
+    }
+    
+    /* ------------------------------------------------------------ */
+    public HttpURI()
+    {
     }
 
-    public HttpURI(String raw)
+    /* ------------------------------------------------------------ */
+    public HttpURI(String scheme, String host, int port, String path, String param, String query, String fragment)
     {
-        _rawString=raw;
-        byte[] b = raw.getBytes(StandardCharsets.UTF_8);
-        parse(b,0,b.length);
-        _charset = URIUtil.__CHARSET;
+        _scheme = scheme;
+        _host = host;
+        _port = port;
+        _path = path;
+        _param = param;
+        _query = query;
+        _fragment = fragment;
     }
 
-    public HttpURI(byte[] raw,int offset, int length)
+    /* ------------------------------------------------------------ */
+    public HttpURI(HttpURI uri)
     {
-        parse2(raw,offset,length);
-        _charset = URIUtil.__CHARSET;
+        this(uri._scheme,uri._host,uri._port,uri._path,uri._param,uri._query,uri._fragment);
+    }
+    
+    /* ------------------------------------------------------------ */
+    public HttpURI(String uri)
+    {
+        _port=-1;
+        parse(State.START,uri,0,uri.length());
     }
 
+    /* ------------------------------------------------------------ */
     public HttpURI(URI uri)
     {
-        parse(uri.toASCIIString());
-        _charset = URIUtil.__CHARSET;
-    }
-
-    public void parse(String raw)
-    {
-        byte[] b = StringUtil.getUtf8Bytes(raw);
-        parse2(b,0,b.length);
-        _rawString=raw;
-    }
-
-    public void parseConnect(String raw)
-    {
-        byte[] b = StringUtil.getBytes(raw);
-        parseConnect(b,0,b.length);
-        _rawString=raw;
-    }
-
-    public void parse(byte[] raw,int offset, int length)
-    {
-        _rawString=null;
-        parse2(raw,offset,length);
-    }
-
-
-    public void parseConnect(byte[] raw,int offset, int length)
-    {
-        _rawString=null;
-        _encoded=false;
-        _raw=raw;
-        int i=offset;
-        int e=offset+length;
-        int state=AUTH;
-        _end=offset+length;
-        _scheme=offset;
-        _authority=offset;
-        _host=offset;
-        _port=_end;
-        _portValue=-1;
-        _path=_end;
-        _param=_end;
-        _query=_end;
-        _fragment=_end;
-
-        loop: while (i<e)
+        _uri=null;
+        
+        _scheme=uri.getScheme();
+        _host=uri.getHost();
+        if (_host==null && uri.getRawSchemeSpecificPart().startsWith("//"))
+            _host="";
+        _port=uri.getPort();
+        _user = uri.getUserInfo();
+        _path=uri.getRawPath();
+        
+        _decodedPath = uri.getPath();
+        if (_decodedPath != null)
         {
-            char c=(char)(0xff&_raw[i]);
-            int s=i++;
+            int p = _decodedPath.lastIndexOf(';');
+            if (p >= 0)
+                _param = _decodedPath.substring(p + 1);
+        }
+        _query=uri.getRawQuery();
+        _fragment=uri.getFragment();
+        
+        _decodedPath=null;
+    }
+
+    /* ------------------------------------------------------------ */
+    public HttpURI(String scheme, String host, int port, String pathQuery)
+    {
+        _uri=null;
+        
+        _scheme=scheme;
+        _host=host;
+        _port=port;
+
+        parse(State.PATH,pathQuery,0,pathQuery.length());
+        
+    }
+
+    /* ------------------------------------------------------------ */
+    public void parse(String uri)
+    {
+        clear();
+        _uri=uri;
+        parse(State.START,uri,0,uri.length());
+    }
+
+    /* ------------------------------------------------------------ */
+    public void parseConnect(String uri)
+    {
+        clear();
+        _uri=uri;
+        _path=uri;
+    }
+
+    /* ------------------------------------------------------------ */
+    public void parse(String uri, int offset, int length)
+    {
+        clear();
+        int end=offset+length;
+        _uri=uri.substring(offset,end);
+        parse(State.START,uri,offset,end);
+    }
+
+    /* ------------------------------------------------------------ */
+    private void parse(State state, final String uri, final int offset, final int end)
+    {
+        boolean encoded=false;
+        int mark=offset;
+        int path_mark=0;
+        
+        for (int i=offset; i<end; i++)
+        {
+            char c=uri.charAt(i);
 
             switch (state)
             {
-                case AUTH:
-                {
-                    switch (c)
-                    {
-                        case ':':
-                        {
-                            _port = s;
-                            break loop;
-                        }
-                        case '[':
-                        {
-                            state = IPV6;
-                            break;
-                        }
-                    }
-                    continue;
-                }
-
-                case IPV6:
-                {
-                    switch (c)
-                    {
-                        case '/':
-                        {
-                            throw new IllegalArgumentException("No closing ']' for " + new String(_raw,offset,length,_charset));
-                        }
-                        case ']':
-                        {
-                            state = AUTH;
-                            break;
-                        }
-                    }
-
-                    continue;
-                }
-            }
-        }
-
-        if (_port<_path)
-            _portValue=TypeUtil.parseInt(_raw, _port+1, _path-_port-1,10);
-        else
-            throw new IllegalArgumentException("No port");
-        _path=offset;
-    }
-
-
-    private void parse2(byte[] raw,int offset, int length)
-    {
-        _encoded=false;
-        _raw=raw;
-        int i=offset;
-        int e=offset+length;
-        int state=START;
-        int m=offset;
-        _end=offset+length;
-        _scheme=offset;
-        _authority=offset;
-        _host=offset;
-        _port=offset;
-        _portValue=-1;
-        _path=offset;
-        _param=_end;
-        _query=_end;
-        _fragment=_end;
-        while (i<e)
-        {
-            char c=(char)(0xff&_raw[i]);
-            int s=i++;
-
-            state: switch (state)
-            {
                 case START:
                 {
-                    m=s;
                     switch(c)
                     {
                         case '/':
-                            state=AUTH_OR_PATH;
+                            mark = i;
+                            state = State.HOST_OR_PATH;
                             break;
                         case ';':
-                            _param=s;
-                            state=PARAM;
+                            mark=i+1;
+                            state=State.PARAM;
                             break;
                         case '?':
-                            _param=s;
-                            _query=s;
-                            state=QUERY;
+                            // assume empty path (if seen at start)
+                            _path = "";
+                            mark=i+1;
+                            state=State.QUERY;
                             break;
                         case '#':
-                            _param=s;
-                            _query=s;
-                            _fragment=s;
+                            mark=i+1;
+                            state=State.FRAGMENT;
                             break;
                         case '*':
-                            _path=s;
-                            state=ASTERISK;
+                            _path="*";
+                            state=State.ASTERISK;
                             break;
 
                         default:
-                            state=SCHEME_OR_PATH;
+                            mark=i;
+                            if (_scheme==null)
+                                state=State.SCHEME_OR_PATH;
+                            else
+                            {
+                                path_mark=i;
+                                state=State.PATH;
+                            }
                     }
 
                     continue;
                 }
 
-                case AUTH_OR_PATH:
-                {
-                    if ((_partial||_scheme!=_authority) && c=='/')
-                    {
-                        _host=i;
-                        _port=_end;
-                        _path=_end;
-                        state=AUTH;
-                    }
-                    else if (c==';' || c=='?' || c=='#')
-                    {
-                        i--;
-                        state=PATH;
-                    }
-                    else
-                    {
-                        _host=m;
-                        _port=m;
-                        state=PATH;
-                    }
-                    continue;
-                }
-
                 case SCHEME_OR_PATH:
                 {
-                    // short cut for http and https
-                    if (length>6 && c=='t')
-                    {
-                        if (_raw[offset+3]==':')
-                        {
-                            s=offset+3;
-                            i=offset+4;
-                            c=':';
-                        }
-                        else if (_raw[offset+4]==':')
-                        {
-                            s=offset+4;
-                            i=offset+5;
-                            c=':';
-                        }
-                        else if (_raw[offset+5]==':')
-                        {
-                            s=offset+5;
-                            i=offset+6;
-                            c=':';
-                        }
-                    }
-
                     switch (c)
                     {
                         case ':':
-                        {
-                            m = i++;
-                            _authority = m;
-                            _path = m;
-                            c = (char)(0xff & _raw[i]);
-                            if (c == '/')
-                                state = AUTH_OR_PATH;
-                            else
-                            {
-                                _host = m;
-                                _port = m;
-                                state = PATH;
-                            }
+                            // must have been a scheme
+                            _scheme=uri.substring(mark,i);
+                            // Start again with scheme set
+                            state=State.START;
                             break;
-                        }
 
                         case '/':
-                        {
-                            state = PATH;
+                            // must have been in a path and still are
+                            state=State.PATH;
                             break;
-                        }
 
                         case ';':
-                        {
-                            _param = s;
-                            state = PARAM;
+                            // must have been in a path 
+                            mark=i+1;
+                            state=State.PARAM;
                             break;
-                        }
 
                         case '?':
-                        {
-                            _param = s;
-                            _query = s;
-                            state = QUERY;
+                            // must have been in a path 
+                            _path=uri.substring(mark,i);
+                            mark=i+1;
+                            state=State.QUERY;
                             break;
-                        }
 
-                        case '#':
-                        {
-                            _param = s;
-                            _query = s;
-                            _fragment = s;
+                        case '%':
+                            // must have be in an encoded path 
+                            encoded=true;
+                            state=State.PATH;
                             break;
-                        }
+                        
+                        case '#':
+                            // must have been in a path 
+                            _path=uri.substring(mark,i);
+                            state=State.FRAGMENT;
+                            break;
+                    }
+                    continue;
+                }
+                
+                case HOST_OR_PATH:
+                {
+                    switch(c)
+                    {
+                        case '/':
+                            _host="";
+                            mark=i+1;
+                            state=State.HOST;
+                            break;
+                            
+                        case '@':
+                            _user=uri.substring(mark,i);
+                            mark=i+1;
+                            break;
+                            
+                        case ';':
+                        case '?':
+                        case '#':
+                            // was a path, look again
+                            i--;
+                            path_mark=mark;
+                            state=State.PATH;
+                            break;
+                        default:
+                            // it is a path
+                            path_mark=mark;
+                            state=State.PATH;
                     }
                     continue;
                 }
 
-                case AUTH:
+                case HOST:
                 {
                     switch (c)
                     {
-
                         case '/':
-                        {
-                            m = s;
-                            _path = m;
-                            _port = _path;
-                            state = PATH;
+                            _host = uri.substring(mark,i);
+                            path_mark=mark=i;
+                            state=State.PATH;
                             break;
-                        }
-                        case '@':
-                        {
-                            _host = i;
-                            break;
-                        }
                         case ':':
-                        {
-                            _port = s;
-                            state = PORT;
+                            if (i > mark)
+                                _host=uri.substring(mark,i);
+                            mark=i+1;
+                            state=State.PORT;
                             break;
-                        }
+                        case '@':
+                            _user=uri.substring(mark,i);
+                            mark=i+1;
+                            break;
+                            
                         case '[':
-                        {
-                            state = IPV6;
+                            state=State.IPV6;
                             break;
-                        }
                     }
                     continue;
                 }
@@ -407,14 +353,21 @@
                     switch (c)
                     {
                         case '/':
-                        {
-                            throw new IllegalArgumentException("No closing ']' for " + new String(_raw,offset,length,_charset));
-                        }
+                            throw new IllegalArgumentException("No closing ']' for ipv6 in " + uri);
                         case ']':
-                        {
-                            state = AUTH;
+                            c = uri.charAt(++i);
+                            _host=uri.substring(mark,i);
+                            if (c == ':')
+                            {
+                                mark=i+1;
+                                state=State.PORT;
+                            }
+                            else
+                            {
+                                path_mark=mark=i;
+                                state=State.PATH;
+                            }
                             break;
-                        }
                     }
 
                     continue;
@@ -424,11 +377,9 @@
                 {
                     if (c=='/')
                     {
-                        m=s;
-                        _path=m;
-                        if (_port<=_authority)
-                            _port=_path;
-                        state=PATH;
+                        _port=TypeUtil.parseInt(uri,mark,i-mark,10);
+                        path_mark=mark=i;
+                        state=State.PATH;
                     }
                     continue;
                 }
@@ -438,29 +389,22 @@
                     switch (c)
                     {
                         case ';':
-                        {
-                            _param = s;
-                            state = PARAM;
+                            mark=i+1;
+                            state=State.PARAM;
                             break;
-                        }
                         case '?':
-                        {
-                            _param = s;
-                            _query = s;
-                            state = QUERY;
+                            _path=uri.substring(path_mark,i);
+                            mark=i+1;
+                            state=State.QUERY;
                             break;
-                        }
                         case '#':
-                        {
-                            _param = s;
-                            _query = s;
-                            _fragment = s;
-                            break state;
-                        }
+                            _path=uri.substring(path_mark,i);
+                            mark=i+1;
+                            state=State.FRAGMENT;
+                            break;
                         case '%':
-                        {
-                            _encoded=true;
-                        }
+                            encoded=true;
+                            break;
                     }
                     continue;
                 }
@@ -470,17 +414,26 @@
                     switch (c)
                     {
                         case '?':
-                        {
-                            _query = s;
-                            state = QUERY;
+                            _path=uri.substring(path_mark,i);
+                            _param=uri.substring(mark,i);
+                            mark=i+1;
+                            state=State.QUERY;
                             break;
-                        }
                         case '#':
-                        {
-                            _query = s;
-                            _fragment = s;
-                            break state;
-                        }
+                            _path=uri.substring(path_mark,i);
+                            _param=uri.substring(mark,i);
+                            mark=i+1;
+                            state=State.FRAGMENT;
+                            break;
+                        case '/':
+                            encoded=true;
+                            // ignore internal params
+                            state=State.PATH;
+                            break;
+                        case ';':
+                            // multiple parameters
+                            mark=i+1;
+                            break;
                     }
                     continue;
                 }
@@ -489,8 +442,9 @@
                 {
                     if (c=='#')
                     {
-                        _fragment=s;
-                        break state;
+                        _query=uri.substring(mark,i);
+                        mark=i+1;
+                        state=State.FRAGMENT;
                     }
                     continue;
                 }
@@ -499,284 +453,301 @@
                 {
                     throw new IllegalArgumentException("only '*'");
                 }
+                
+                case FRAGMENT:
+                {
+                    _fragment=uri.substring(mark,end);
+                    i=end;
+                }
             }
         }
 
-        if (_port<_path)
-            _portValue=TypeUtil.parseInt(_raw, _port+1, _path-_port-1,10);
+        
+        switch(state)
+        {
+            case START:
+                break;
+            case SCHEME_OR_PATH:
+                _path=uri.substring(mark,end);
+                break;
+
+            case HOST_OR_PATH:
+                _path=uri.substring(mark,end);
+                break;
+                
+            case HOST:
+                if(end>mark)
+                    _host=uri.substring(mark,end);
+                break;
+                
+            case IPV6:
+                throw new IllegalArgumentException("No closing ']' for ipv6 in " + uri);
+
+            case PORT:
+                _port=TypeUtil.parseInt(uri,mark,end-mark,10);
+                break;
+                
+            case ASTERISK:
+                break;
+                
+            case FRAGMENT:
+                _fragment=uri.substring(mark,end);
+                break;
+                
+            case PARAM:
+                _path=uri.substring(path_mark,end);
+                _param=uri.substring(mark,end);
+                break;
+                
+            case PATH:
+                _path=uri.substring(path_mark,end);
+                break;
+                
+            case QUERY:
+                _query=uri.substring(mark,end);
+                break;
+        }
+        
+        if (!encoded)
+        {
+            if (_param==null)
+                _decodedPath=_path;
+            else
+                _decodedPath=_path.substring(0,_path.length()-_param.length()-1);
+        }
     }
 
+    /* ------------------------------------------------------------ */
     public String getScheme()
     {
-        if (_scheme==_authority)
-            return null;
-        int l=_authority-_scheme;
-        if (l==5 &&
-                _raw[_scheme]=='h' &&
-                _raw[_scheme+1]=='t' &&
-                _raw[_scheme+2]=='t' &&
-                _raw[_scheme+3]=='p' )
-            return HttpScheme.HTTP.asString();
-        if (l==6 &&
-                _raw[_scheme]=='h' &&
-                _raw[_scheme+1]=='t' &&
-                _raw[_scheme+2]=='t' &&
-                _raw[_scheme+3]=='p' &&
-                _raw[_scheme+4]=='s' )
-            return HttpScheme.HTTPS.asString();
-
-        return new String(_raw,_scheme,_authority-_scheme-1,_charset);
+        return _scheme;
     }
 
-    public String getAuthority()
-    {
-        if (_authority==_path)
-            return null;
-        return new String(_raw,_authority,_path-_authority,_charset);
-    }
-
+    /* ------------------------------------------------------------ */
     public String getHost()
     {
-        if (_host==_port)
+        // Return null for empty host to retain compatibility with java.net.URI
+        if (_host!=null && _host.length()==0)
             return null;
-        return new String(_raw,_host,_port-_host,_charset);
+        return _host;
     }
 
+    /* ------------------------------------------------------------ */
     public int getPort()
     {
-        return _portValue;
+        return _port;
     }
 
+    /* ------------------------------------------------------------ */
+    /**
+     * The parsed Path.
+     * 
+     * @return the path as parsed on valid URI.  null for invalid URI.
+     */
     public String getPath()
     {
-        if (_path==_param)
-            return null;
-        return new String(_raw,_path,_param-_path,_charset);
+        return _path;
     }
 
+    /* ------------------------------------------------------------ */
     public String getDecodedPath()
     {
-        if (_path==_param)
-            return null;
-
-        Utf8StringBuilder utf8b=null;
-
-        for (int i=_path;i<_param;i++)
-        {
-            byte b = _raw[i];
-
-            if (b=='%')
-            {
-                if (utf8b==null)
-                {
-                    utf8b=new Utf8StringBuilder();
-                    utf8b.append(_raw,_path,i-_path);
-                }
-                
-                if ((i+2)>=_param)
-                    throw new IllegalArgumentException("Bad % encoding: "+this);
-                if (_raw[i+1]=='u')
-                {
-                    if ((i+5)>=_param)
-                        throw new IllegalArgumentException("Bad %u encoding: "+this);
-                    try
-                    {
-                        String unicode = new String(Character.toChars(TypeUtil.parseInt(_raw,i+2,4,16)));
-                        utf8b.getStringBuilder().append(unicode);
-                        i+=5;
-                    }
-                    catch(Exception e)
-                    {
-                        throw new RuntimeException(e);
-                    }
-                }
-                else
-                {
-                    b=(byte)(0xff&TypeUtil.parseInt(_raw,i+1,2,16));
-                    utf8b.append(b);
-                    i+=2;
-                }
-                continue;
-            }
-            else if (utf8b!=null)
-            {
-                utf8b.append(b);
-            }
-        }
-
-        if (utf8b==null)
-            return StringUtil.toUTF8String(_raw, _path, _param-_path);
-        return utf8b.toString();
+        if (_decodedPath==null && _path!=null)
+            _decodedPath=URIUtil.decodePath(_path);
+        return _decodedPath;
     }
 
-    public String getDecodedPath(String encoding)
-    {
-        return getDecodedPath(Charset.forName(encoding));
-    }
-
-    public String getDecodedPath(Charset encoding)
-    {
-        if (_path==_param)
-            return null;
-
-        int length = _param-_path;
-        byte[] bytes=null;
-        int n=0;
-
-        for (int i=_path;i<_param;i++)
-        {
-            byte b = _raw[i];
-
-            if (b=='%')
-            {
-                if (bytes==null)
-                {
-                    bytes=new byte[length];
-                    System.arraycopy(_raw,_path,bytes,0,n);
-                }
-                
-                if ((i+2)>=_param)
-                    throw new IllegalArgumentException("Bad % encoding: "+this);
-                if (_raw[i+1]=='u')
-                {
-                    if ((i+5)>=_param)
-                        throw new IllegalArgumentException("Bad %u encoding: "+this);
-
-                    try
-                    {
-                        String unicode = new String(Character.toChars(TypeUtil.parseInt(_raw,i+2,4,16)));
-                        byte[] encoded = unicode.getBytes(encoding);
-                        System.arraycopy(encoded,0,bytes,n,encoded.length);
-                        n+=encoded.length;
-                        i+=5;
-                    }
-                    catch(Exception e)
-                    {
-                        throw new RuntimeException(e);
-                    }
-                }
-                else
-                {
-                    b=(byte)(0xff&TypeUtil.parseInt(_raw,i+1,2,16));
-                    bytes[n++]=b;
-                    i+=2;
-                }
-                continue;
-            }
-            else if (bytes==null)
-            {
-                n++;
-                continue;
-            }
-
-            bytes[n++]=b;
-        }
-
-
-        if (bytes==null)
-            return new String(_raw,_path,_param-_path,encoding);
-
-        return new String(bytes,0,n,encoding);
-    }
-
-    public String getPathAndParam()
-    {
-        if (_path==_query)
-            return null;
-        return new String(_raw,_path,_query-_path,_charset);
-    }
-
-    public String getCompletePath()
-    {
-        if (_path==_end)
-            return null;
-        return new String(_raw,_path,_end-_path,_charset);
-    }
-
+    /* ------------------------------------------------------------ */
     public String getParam()
     {
-        if (_param==_query)
-            return null;
-        return new String(_raw,_param+1,_query-_param-1,_charset);
+        return _param;
     }
 
+    /* ------------------------------------------------------------ */
     public String getQuery()
     {
-        if (_query==_fragment)
-            return null;
-        return new String(_raw,_query+1,_fragment-_query-1,_charset);
+        return _query;
     }
 
-    public String getQuery(String encoding)
-    {
-        if (_query==_fragment)
-            return null;
-        return StringUtil.toString(_raw,_query+1,_fragment-_query-1,encoding);
-    }
-
+    /* ------------------------------------------------------------ */
     public boolean hasQuery()
     {
-        return (_fragment>_query);
+        return _query!=null && _query.length()>0;
     }
 
+    /* ------------------------------------------------------------ */
     public String getFragment()
     {
-        if (_fragment==_end)
-            return null;
-        return new String(_raw,_fragment+1,_end-_fragment-1,_charset);
+        return _fragment;
     }
 
+    /* ------------------------------------------------------------ */
     public void decodeQueryTo(MultiMap<String> parameters)
     {
         if (_query==_fragment)
             return;
-        if (_charset.equals(StandardCharsets.UTF_8))
-            UrlEncoded.decodeUtf8To(_raw,_query+1,_fragment-_query-1,parameters);
-        else
-            UrlEncoded.decodeTo(new String(_raw,_query+1,_fragment-_query-1,_charset),parameters,_charset,-1);
+        UrlEncoded.decodeUtf8To(_query,parameters);
     }
 
+    /* ------------------------------------------------------------ */
     public void decodeQueryTo(MultiMap<String> parameters, String encoding) throws UnsupportedEncodingException
     {
-        if (_query==_fragment)
-            return;
-
-        if (encoding==null || StringUtil.isUTF8(encoding))
-            UrlEncoded.decodeUtf8To(_raw,_query+1,_fragment-_query-1,parameters);
-        else
-            UrlEncoded.decodeTo(StringUtil.toString(_raw,_query+1,_fragment-_query-1,encoding),parameters,encoding,-1);
+        decodeQueryTo(parameters,Charset.forName(encoding));
     }
 
+    /* ------------------------------------------------------------ */
     public void decodeQueryTo(MultiMap<String> parameters, Charset encoding) throws UnsupportedEncodingException
     {
         if (_query==_fragment)
             return;
 
         if (encoding==null || StandardCharsets.UTF_8.equals(encoding))
-            UrlEncoded.decodeUtf8To(_raw,_query+1,_fragment-_query-1,parameters);
+            UrlEncoded.decodeUtf8To(_query,parameters);
         else
-            UrlEncoded.decodeTo(new String(_raw,_query+1,_fragment-_query-1,encoding),parameters,encoding,-1);
+            UrlEncoded.decodeTo(_query,parameters,encoding);
     }
 
+    /* ------------------------------------------------------------ */
     public void clear()
     {
-        _scheme=_authority=_host=_port=_path=_param=_query=_fragment=_end=0;
-        _raw=__empty;
-        _rawString="";
-        _encoded=false;
+        _uri=null;
+
+        _scheme=null;
+        _host=null;
+        _port=-1;
+        _path=null;
+        _param=null;
+        _query=null;
+        _fragment=null;
+
+        _decodedPath=null;
     }
 
+    /* ------------------------------------------------------------ */
+    public boolean isAbsolute()
+    {
+        return _scheme!=null && _scheme.length()>0;
+    }
+    
+    /* ------------------------------------------------------------ */
     @Override
     public String toString()
     {
-        if (_rawString==null)
-            _rawString=new String(_raw,_scheme,_end-_scheme,_charset);
-        return _rawString;
+        if (_uri==null)
+        {
+            StringBuilder out = new StringBuilder();
+            
+            if (_scheme!=null)
+                out.append(_scheme).append(':');
+            
+            if (_host != null)
+            {
+                out.append("//");
+                if (_user != null)
+                    out.append(_user).append('@');
+                out.append(_host);
+            }
+            
+            if (_port>0)
+                out.append(':').append(_port);
+            
+            if (_path!=null)
+                out.append(_path);
+            
+            if (_query!=null)
+                out.append('?').append(_query);
+            
+            if (_fragment!=null)
+                out.append('#').append(_fragment);
+            
+            if (out.length()>0)
+                _uri=out.toString();
+            else
+                _uri="";
+        }
+        return _uri;
     }
 
-    public void writeTo(Utf8StringBuilder buf)
+    /* ------------------------------------------------------------ */
+    public boolean equals(Object o)
     {
-        buf.append(_raw,_scheme,_end-_scheme);
+        if (o==this)
+            return true;
+        if (!(o instanceof HttpURI))
+            return false;
+        return toString().equals(o.toString());
     }
 
+    /* ------------------------------------------------------------ */
+    public void setScheme(String scheme)
+    {
+        _scheme=scheme;
+        _uri=null;
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @param host the host
+     * @param port the port
+     */
+    public void setAuthority(String host, int port)
+    {
+        _host=host;
+        _port=port;
+        _uri=null;
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @param path the path
+     */
+    public void setPath(String path)
+    {
+        _uri=null;
+        _path=path;
+        _decodedPath=null;
+    }
+    
+    /* ------------------------------------------------------------ */
+    public void setPathQuery(String path)
+    {
+        _uri=null;
+        _path=null;
+        _decodedPath=null;
+        _param=null;
+        _fragment=null;
+        if (path!=null)
+            parse(State.PATH,path,0,path.length());
+    }
+    
+    /* ------------------------------------------------------------ */
+    public void setQuery(String query)
+    {
+        _query=query;
+        _uri=null;
+    }
+    
+    /* ------------------------------------------------------------ */
+    public URI toURI() throws URISyntaxException
+    {
+        return new URI(_scheme,null,_host,_port,_path,_query==null?null:UrlEncoded.decodeString(_query),_fragment);
+    }
+
+    /* ------------------------------------------------------------ */
+    public String getPathQuery()
+    {
+        if (_query==null)
+            return _path;
+        return _path+"?"+_query;
+    }
+    
+    /* ------------------------------------------------------------ */
+    public String getAuthority()
+    {
+        if (_port>0)
+            return _host+":"+_port;
+        return _host;
+    }
+
+
 }
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/MetaData.java b/jetty-http/src/main/java/org/eclipse/jetty/http/MetaData.java
new file mode 100644
index 0000000..b4038cb
--- /dev/null
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/MetaData.java
@@ -0,0 +1,298 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http;
+
+import java.util.Collections;
+import java.util.Iterator;
+
+public class MetaData implements Iterable<HttpField>
+{
+    private HttpVersion _httpVersion;
+    private HttpFields _fields;
+    private long _contentLength;
+
+    public MetaData(HttpVersion version, HttpFields fields)
+    {
+        this(version, fields, Long.MIN_VALUE);
+    }
+
+    public MetaData(HttpVersion version, HttpFields fields, long contentLength)
+    {
+        _httpVersion = version;
+        _fields = fields;
+        _contentLength = contentLength;
+    }
+
+    protected void recycle()
+    {
+        _httpVersion = null;
+        if (_fields != null)
+            _fields.clear();
+        _contentLength = Long.MIN_VALUE;
+    }
+
+    public boolean isRequest()
+    {
+        return false;
+    }
+
+    public boolean isResponse()
+    {
+        return false;
+    }
+
+    /**
+     * @return the HTTP version of this MetaData object
+     */
+    public HttpVersion getVersion()
+    {
+        return _httpVersion;
+    }
+
+    /**
+     * @param httpVersion the HTTP version to set
+     */
+    public void setHttpVersion(HttpVersion httpVersion)
+    {
+        _httpVersion = httpVersion;
+    }
+
+    /**
+     * @return the HTTP fields of this MetaData object
+     */
+    public HttpFields getFields()
+    {
+        return _fields;
+    }
+
+    /**
+     * @return the content length if available, otherwise {@link Long#MIN_VALUE}
+     */
+    public long getContentLength()
+    {
+        if (_contentLength == Long.MIN_VALUE)
+        {
+            if (_fields != null)
+            {
+                HttpField field = _fields.getField(HttpHeader.CONTENT_LENGTH);
+                _contentLength = field == null ? -1 : field.getLongValue();
+            }
+        }
+        return _contentLength;
+    }
+
+    /**
+     * @return an iterator over the HTTP fields
+     * @see #getFields()
+     */
+    public Iterator<HttpField> iterator()
+    {
+        HttpFields fields = getFields();
+        return fields == null ? Collections.<HttpField>emptyIterator() : fields.iterator();
+    }
+
+    @Override
+    public String toString()
+    {
+        StringBuilder out = new StringBuilder();
+        for (HttpField field : this)
+            out.append(field).append(System.lineSeparator());
+        return out.toString();
+    }
+
+    public static class Request extends MetaData
+    {
+        private String _method;
+        private HttpURI _uri;
+
+        public Request(HttpFields fields)
+        {
+            this(null, null, null, fields);
+        }
+
+        public Request(String method, HttpURI uri, HttpVersion version, HttpFields fields)
+        {
+            this(method, uri, version, fields, Long.MIN_VALUE);
+        }
+
+        public Request(String method, HttpURI uri, HttpVersion version, HttpFields fields, long contentLength)
+        {
+            super(version, fields, contentLength);
+            _method = method;
+            _uri = uri;
+        }
+
+        public Request(String method, HttpScheme scheme, HostPortHttpField hostPort, String uri, HttpVersion version, HttpFields fields)
+        {
+            this(method, new HttpURI(scheme == null ? null : scheme.asString(), hostPort.getHost(), hostPort.getPort(), uri), version, fields);
+        }
+
+        public Request(String method, HttpScheme scheme, HostPortHttpField hostPort, String uri, HttpVersion version, HttpFields fields, long contentLength)
+        {
+            this(method, new HttpURI(scheme == null ? null : scheme.asString(), hostPort.getHost(), hostPort.getPort(), uri), version, fields, contentLength);
+        }
+
+        public Request(String method, String scheme, HostPortHttpField hostPort, String uri, HttpVersion version, HttpFields fields, long contentLength)
+        {
+            this(method, new HttpURI(scheme, hostPort.getHost(), hostPort.getPort(), uri), version, fields, contentLength);
+        }
+
+        public Request(Request request)
+        {
+            this(request.getMethod(),new HttpURI(request.getURI()), request.getVersion(), new HttpFields(request.getFields()), request.getContentLength());
+        }
+
+        // TODO MetaData should be immuttable!!! 
+        public void recycle()
+        {
+            super.recycle();
+            _method = null;
+            if (_uri != null)
+                _uri.clear();
+        }
+
+        @Override
+        public boolean isRequest()
+        {
+            return true;
+        }
+
+        /**
+         * @return the HTTP method
+         */
+        public String getMethod()
+        {
+            return _method;
+        }
+
+        /**
+         * @param method the HTTP method to set
+         */
+        public void setMethod(String method)
+        {
+            _method = method;
+        }
+
+        /**
+         * @return the HTTP URI
+         */
+        public HttpURI getURI()
+        {
+            return _uri;
+        }
+
+        /**
+         * @return the HTTP URI in string form
+         */
+        public String getURIString()
+        {
+            return _uri == null ? null : _uri.toString();
+        }
+
+        /**
+         * @param uri the HTTP URI to set
+         */
+        public void setURI(HttpURI uri)
+        {
+            _uri = uri;
+        }
+
+        @Override
+        public String toString()
+        {
+            HttpFields fields = getFields();
+            return String.format("%s{u=%s,%s,h=%d}",
+                    getMethod(), getURI(), getVersion(), fields == null ? -1 : fields.size());
+        }
+    }
+
+    public static class Response extends MetaData
+    {
+        private int _status;
+        private String _reason;
+
+        public Response()
+        {
+            this(null, 0, null);
+        }
+
+        public Response(HttpVersion version, int status, HttpFields fields)
+        {
+            this(version, status, fields, Long.MIN_VALUE);
+        }
+
+        public Response(HttpVersion version, int status, HttpFields fields, long contentLength)
+        {
+            super(version, fields, contentLength);
+            _status = status;
+        }
+
+        public Response(HttpVersion version, int status, String reason, HttpFields fields, long contentLength)
+        {
+            super(version, fields, contentLength);
+            _reason = reason;
+            _status = status;
+        }
+
+        @Override
+        public boolean isResponse()
+        {
+            return true;
+        }
+
+        /**
+         * @return the HTTP status
+         */
+        public int getStatus()
+        {
+            return _status;
+        }
+
+        /**
+         * @return the HTTP reason
+         */
+        public String getReason()
+        {
+            return _reason;
+        }
+
+        /**
+         * @param status the HTTP status to set
+         */
+        public void setStatus(int status)
+        {
+            _status = status;
+        }
+
+        /**
+         * @param reason the HTTP reason to set
+         */
+        public void setReason(String reason)
+        {
+            _reason = reason;
+        }
+
+        @Override
+        public String toString()
+        {
+            HttpFields fields = getFields();
+            return String.format("%s{s=%d,h=%d}", getVersion(), getStatus(), fields == null ? -1 : fields.size());
+        }
+    }
+}
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/MimeTypes.java b/jetty-http/src/main/java/org/eclipse/jetty/http/MimeTypes.java
index 9a6b0cc..b519c4b 100644
--- a/jetty-http/src/main/java/org/eclipse/jetty/http/MimeTypes.java
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/MimeTypes.java
@@ -56,20 +56,20 @@
         TEXT_JSON("text/json",StandardCharsets.UTF_8),
         APPLICATION_JSON("application/json",StandardCharsets.UTF_8),
 
-        TEXT_HTML_8859_1("text/html; charset=ISO-8859-1",TEXT_HTML),
-        TEXT_HTML_UTF_8("text/html; charset=UTF-8",TEXT_HTML),
+        TEXT_HTML_8859_1("text/html;charset=iso-8859-1",TEXT_HTML),
+        TEXT_HTML_UTF_8("text/html;charset=utf-8",TEXT_HTML),
         
-        TEXT_PLAIN_8859_1("text/plain; charset=ISO-8859-1",TEXT_PLAIN),
-        TEXT_PLAIN_UTF_8("text/plain; charset=UTF-8",TEXT_PLAIN),
+        TEXT_PLAIN_8859_1("text/plain;charset=iso-8859-1",TEXT_PLAIN),
+        TEXT_PLAIN_UTF_8("text/plain;charset=utf-8",TEXT_PLAIN),
         
-        TEXT_XML_8859_1("text/xml; charset=ISO-8859-1",TEXT_XML),
-        TEXT_XML_UTF_8("text/xml; charset=UTF-8",TEXT_XML),
+        TEXT_XML_8859_1("text/xml;charset=iso-8859-1",TEXT_XML),
+        TEXT_XML_UTF_8("text/xml;charset=utf-8",TEXT_XML),
         
-        TEXT_JSON_8859_1("text/json; charset=ISO-8859-1",TEXT_JSON),
-        TEXT_JSON_UTF_8("text/json; charset=UTF-8",TEXT_JSON),
+        TEXT_JSON_8859_1("text/json;charset=iso-8859-1",TEXT_JSON),
+        TEXT_JSON_UTF_8("text/json;charset=utf-8",TEXT_JSON),
         
-        APPLICATION_JSON_8859_1("text/json; charset=ISO-8859-1",APPLICATION_JSON),
-        APPLICATION_JSON_UTF_8("text/json; charset=UTF-8",APPLICATION_JSON);
+        APPLICATION_JSON_8859_1("text/json;charset=iso-8859-1",APPLICATION_JSON),
+        APPLICATION_JSON_UTF_8("text/json;charset=utf-8",APPLICATION_JSON);
 
 
         /* ------------------------------------------------------------ */
@@ -77,6 +77,7 @@
         private final Type _base;
         private final ByteBuffer _buffer;
         private final Charset _charset;
+        private final String _charsetString;
         private final boolean _assumedCharset;
         private final HttpField _field;
 
@@ -87,8 +88,9 @@
             _buffer=BufferUtil.toBuffer(s);
             _base=this;
             _charset=null;
+            _charsetString=null;
             _assumedCharset=false;
-            _field=new HttpGenerator.CachedHttpField(HttpHeader.CONTENT_TYPE,_string);
+            _field=new PreEncodedHttpField(HttpHeader.CONTENT_TYPE,_string);
         } 
 
         /* ------------------------------------------------------------ */
@@ -97,10 +99,11 @@
             _string=s;
             _buffer=BufferUtil.toBuffer(s);
             _base=base;
-            int i=s.indexOf("; charset=");
-            _charset=Charset.forName(s.substring(i+10));
+            int i=s.indexOf(";charset=");
+            _charset=Charset.forName(s.substring(i+9));
+            _charsetString=_charset==null?null:_charset.toString().toLowerCase();
             _assumedCharset=false;
-            _field=new HttpGenerator.CachedHttpField(HttpHeader.CONTENT_TYPE,_string);
+            _field=new PreEncodedHttpField(HttpHeader.CONTENT_TYPE,_string);
         }
 
         /* ------------------------------------------------------------ */
@@ -110,8 +113,9 @@
             _base=this;
             _buffer=BufferUtil.toBuffer(s);
             _charset=cs;
+            _charsetString=_charset==null?null:_charset.toString().toLowerCase();
             _assumedCharset=true;
-            _field=new HttpGenerator.CachedHttpField(HttpHeader.CONTENT_TYPE,_string);
+            _field=new PreEncodedHttpField(HttpHeader.CONTENT_TYPE,_string);
         }
 
         /* ------------------------------------------------------------ */
@@ -127,6 +131,12 @@
         }
         
         /* ------------------------------------------------------------ */
+        public String getCharsetString()
+        {
+            return _charsetString;
+        }
+        
+        /* ------------------------------------------------------------ */
         public boolean is(String s)
         {
             return _string.equalsIgnoreCase(s);    
@@ -181,8 +191,9 @@
             int charset=type.toString().indexOf(";charset=");
             if (charset>0)
             {
-                CACHE.put(type.toString().replace(";charset=","; charset="),type);
-                TYPES.put(type.toString().replace(";charset=","; charset="),type.asBuffer());
+                String alt=type.toString().replace(";charset=","; charset=");
+                CACHE.put(alt,type);
+                TYPES.put(alt,type.asBuffer());
             }
         }
 
@@ -292,8 +303,8 @@
 
     /* ------------------------------------------------------------ */
     /** Set a mime mapping
-     * @param extension
-     * @param type
+     * @param extension the extension
+     * @param type the mime type
      */
     public void addMimeMapping(String extension,String type)
     {
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/PathMap.java b/jetty-http/src/main/java/org/eclipse/jetty/http/PathMap.java
index 2c68dce..bb30c3b 100644
--- a/jetty-http/src/main/java/org/eclipse/jetty/http/PathMap.java
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/PathMap.java
@@ -18,48 +18,61 @@
 
 package org.eclipse.jetty.http;
 
+import java.util.AbstractSet;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
+import java.util.function.BiFunction;
 
 import org.eclipse.jetty.util.ArrayTernaryTrie;
+import org.eclipse.jetty.util.RegexSet;
 import org.eclipse.jetty.util.Trie;
 import org.eclipse.jetty.util.URIUtil;
 
-/* ------------------------------------------------------------ */
-/** URI path map to Object.
+/** 
+ * URI path map to Object.
+ * <p>
  * This mapping implements the path specification recommended
  * in the 2.2 Servlet API.
+ * </p>
  *
- * Path specifications can be of the following forms:<PRE>
+ * <p>
+ * Path specifications can be of the following forms:
+ * </p>
+ * <pre>
  * /foo/bar           - an exact path specification.
  * /foo/*             - a prefix path specification (must end '/*').
  * *.ext              - a suffix path specification.
  * /                  - the default path specification.
  * ""                 - the / path specification
- * </PRE>
- * Matching is performed in the following order <NL>
- * <LI>Exact match.
- * <LI>Longest prefix match.
- * <LI>Longest suffix match.
- * <LI>default.
- * </NL>
+ * </pre>
+ * 
+ * Matching is performed in the following order 
+ * <ol>
+ * <li>Exact match.</li>
+ * <li>Longest prefix match.</li>
+ * <li>Longest suffix match.</li>
+ * <li>default.</li>
+ * </ol>
+ * 
+ * <p>
  * Multiple path specifications can be mapped by providing a list of
  * specifications. By default this class uses characters ":," as path
  * separators, unless configured differently by calling the static
  * method @see PathMap#setPathSpecSeparators(String)
- * <P>
+ * <p>
  * Special characters within paths such as '?� and ';' are not treated specially
  * as it is assumed they would have been either encoded in the original URL or
  * stripped from the path.
- * <P>
+ * <p>
  * This class is not synchronized.  If concurrent modifications are
  * possible then it should be synchronized at a higher level.
- *
- *
+ * 
+ * @param <O> the Map.Entry value type 
  */
 public class PathMap<O> extends HashMap<String,O>
 {
@@ -114,11 +127,13 @@
     }
 
     /* --------------------------------------------------------------- */
-    /** Construct from dictionary PathMap.
+    /** 
+     * Construct from dictionary PathMap.
+     * @param dictMap the map representing the dictionary to build this PathMap from
      */
-    public PathMap(Map<String, ? extends O> m)
+    public PathMap(Map<String, ? extends O> dictMap)
     {
-        putAll(m);
+        putAll(dictMap);
     }
 
     /* --------------------------------------------------------------- */
@@ -382,20 +397,23 @@
 
     /* --------------------------------------------------------------- */
     /**
+     * @param pathSpec the path spec
+     * @param path the path
      * @return true if match.
      */
     public static boolean match(String pathSpec, String path)
-        throws IllegalArgumentException
     {
         return match(pathSpec, path, false);
     }
 
     /* --------------------------------------------------------------- */
     /**
+     * @param pathSpec the path spec
+     * @param path the path
+     * @param noDefault true to not handle the default path "/" special, false to allow matcher rules to run  
      * @return true if match.
      */
     public static boolean match(String pathSpec, String path, boolean noDefault)
-        throws IllegalArgumentException
     {
         if (pathSpec.length()==0)
             return "/".equals(path);
@@ -431,6 +449,8 @@
 
     /* --------------------------------------------------------------- */
     /** Return the portion of a path that matches a path spec.
+     * @param pathSpec the path spec
+     * @param path the path
      * @return null if no match at all.
      */
     public static String pathMatch(String pathSpec, String path)
@@ -459,6 +479,8 @@
 
     /* --------------------------------------------------------------- */
     /** Return the portion of a path that is after a path spec.
+     * @param pathSpec the path spec
+     * @param path the path
      * @return The path info string
      */
     public static String pathInfo(String pathSpec, String path)
@@ -569,4 +591,48 @@
             this.mapped = mapped;
         }
     }
+    
+    public static class PathSet extends AbstractSet<String>
+    {
+        public static final BiFunction<PathSet,String,Boolean> MATCHER=(s,e)->{return s.containsMatch(e);};
+        private final PathMap<Boolean> _map = new PathMap<>();
+        
+        @Override
+        public Iterator<String> iterator()
+        {
+            return _map.keySet().iterator();
+        }
+
+        @Override
+        public int size()
+        {
+            return _map.size();
+        }
+        
+        @Override
+        public boolean add(String item)
+        {
+            return _map.put(item,Boolean.TRUE)==null;
+        }
+        
+        @Override
+        public boolean remove(Object item)
+        {
+            return _map.remove(item)!=null;
+        }
+
+        @Override
+        public boolean contains(Object o) 
+        { 
+            return _map.containsKey(o); 
+        }
+        
+        
+        public boolean containsMatch(String s) 
+        { 
+            return _map.containsMatch(s); 
+        }
+        
+        
+    }
 }
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/PreEncodedHttpField.java b/jetty-http/src/main/java/org/eclipse/jetty/http/PreEncodedHttpField.java
new file mode 100644
index 0000000..16d4c6b
--- /dev/null
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/PreEncodedHttpField.java
@@ -0,0 +1,94 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.http;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ServiceLoader;
+
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+
+/* ------------------------------------------------------------ */
+/** Pre encoded HttpField.
+ * <p>A HttpField that will be cached and used many times can be created as 
+ * a {@link PreEncodedHttpField}, which will use the {@link HttpFieldPreEncoder}
+ * instances discovered by the {@link ServiceLoader} to pre-encode the header 
+ * for each version of HTTP in use.  This will save garbage 
+ * and CPU each time the field is encoded into a response.
+ * </p>
+ */
+public class PreEncodedHttpField extends HttpField
+{
+    private final static Logger LOG = Log.getLogger(PreEncodedHttpField.class);
+    private final static HttpFieldPreEncoder[] __encoders;
+    
+    static
+    { 
+        List<HttpFieldPreEncoder> encoders = new ArrayList<>();
+        Iterator<HttpFieldPreEncoder> iter = ServiceLoader.load(HttpFieldPreEncoder.class,PreEncodedHttpField.class.getClassLoader()).iterator();
+        while (iter.hasNext())
+        {
+            try
+            {
+                encoders.add(iter.next());
+            }
+            catch(Error|RuntimeException e)
+            {
+                LOG.debug(e);
+            }
+        }
+        // TODO avoid needing this catch all
+        if (encoders.size()==0)
+            encoders.add(new Http1FieldPreEncoder());
+        LOG.debug("HttpField encoders loaded: {}",encoders);
+        __encoders = encoders.toArray(new HttpFieldPreEncoder[encoders.size()]);
+    }
+    
+    private final byte[][] _encodedField=new byte[2][];
+
+    public PreEncodedHttpField(HttpHeader header,String name,String value)
+    {
+        super(header,name, value);
+        
+        for (HttpFieldPreEncoder e:__encoders)
+        {
+            _encodedField[e.getHttpVersion()==HttpVersion.HTTP_2?1:0]=e.getEncodedField(header,header.asString(),value);
+        }
+    }
+    
+    public PreEncodedHttpField(HttpHeader header,String value)
+    {
+        this(header,header.asString(),value);
+    }
+    
+    public PreEncodedHttpField(String name,String value)
+    {
+        this(null,name,value);
+    }
+    
+    public void putTo(ByteBuffer bufferInFillMode, HttpVersion version)
+    {
+        bufferInFillMode.put(_encodedField[version==HttpVersion.HTTP_2?1:0]);
+    }
+}
\ No newline at end of file
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/ResourceHttpContent.java b/jetty-http/src/main/java/org/eclipse/jetty/http/ResourceHttpContent.java
new file mode 100644
index 0000000..30d7ba5
--- /dev/null
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/ResourceHttpContent.java
@@ -0,0 +1,227 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.nio.channels.ReadableByteChannel;
+
+import org.eclipse.jetty.http.MimeTypes.Type;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.resource.Resource;
+
+
+/* ------------------------------------------------------------ */
+/** HttpContent created from a {@link Resource}.
+ * <p>The HttpContent is used to server static content that is not
+ * cached. So fields and values are only generated as need be an not 
+ * kept for reuse</p>
+ */
+public class ResourceHttpContent implements HttpContent
+{
+    final Resource _resource;
+    final String _contentType;
+    final int _maxBuffer;
+    HttpContent _gzip;
+    String _etag;
+
+    /* ------------------------------------------------------------ */
+    public ResourceHttpContent(final Resource resource, final String contentType)
+    {
+        this(resource,contentType,-1,null);
+    }
+
+    /* ------------------------------------------------------------ */
+    public ResourceHttpContent(final Resource resource, final String contentType, int maxBuffer)
+    {
+        this(resource,contentType,maxBuffer,null);
+    }
+    
+    /* ------------------------------------------------------------ */
+    public ResourceHttpContent(final Resource resource, final String contentType, int maxBuffer, HttpContent gzip)
+    {
+        _resource=resource;
+        _contentType=contentType;
+        _maxBuffer=maxBuffer;
+        _gzip=gzip;
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public String getContentTypeValue()
+    {
+        return _contentType;
+    }
+    
+    /* ------------------------------------------------------------ */
+    @Override
+    public HttpField getContentType()
+    {
+        return _contentType==null?null:new HttpField(HttpHeader.CONTENT_TYPE,_contentType);
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public HttpField getContentEncoding()
+    {
+        return null;
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public String getContentEncodingValue()
+    {
+        return null;
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public String getCharacterEncoding()
+    {
+        return _contentType==null?null:MimeTypes.getCharsetFromContentType(_contentType);
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public Type getMimeType()
+    {
+        return _contentType==null?null:MimeTypes.CACHE.get(MimeTypes.getContentTypeWithoutCharset(_contentType));
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public HttpField getLastModified()
+    {
+        long lm = _resource.lastModified();
+        return lm>=0?new HttpField(HttpHeader.LAST_MODIFIED,DateGenerator.formatDate(lm)):null;
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public String getLastModifiedValue()
+    {
+        long lm = _resource.lastModified();
+        return lm>=0?DateGenerator.formatDate(lm):null;
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public ByteBuffer getDirectBuffer()
+    {
+        if (_resource.length()<=0 || _maxBuffer<_resource.length())
+            return null;
+        try
+        {
+            return BufferUtil.toBuffer(_resource,true);
+        }
+        catch(IOException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    /* ------------------------------------------------------------ */
+    @Override
+    public HttpField getETag()
+    {
+        return new HttpField(HttpHeader.ETAG,getETagValue());
+    }
+    
+    /* ------------------------------------------------------------ */
+    @Override
+    public String getETagValue()
+    {
+        return _resource.getWeakETag();
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public ByteBuffer getIndirectBuffer()
+    {
+        if (_resource.length()<=0 || _maxBuffer<_resource.length())
+            return null;
+        try
+        {
+            return BufferUtil.toBuffer(_resource,false);
+        }
+        catch(IOException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public HttpField getContentLength()
+    {
+        long l=_resource.length();
+        return l==-1?null:new HttpField.LongValueHttpField(HttpHeader.CONTENT_LENGTH,_resource.length());
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public long getContentLengthValue()
+    {
+        return _resource.length();
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public InputStream getInputStream() throws IOException
+    {
+        return _resource.getInputStream();
+    }
+    
+    /* ------------------------------------------------------------ */
+    @Override
+    public ReadableByteChannel getReadableByteChannel() throws IOException
+    {
+        return _resource.getReadableByteChannel();
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public Resource getResource()
+    {
+        return _resource;
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public void release()
+    {
+        _resource.close();
+    }
+    
+    /* ------------------------------------------------------------ */
+    @Override
+    public String toString()
+    {
+        return String.format("%s@%x{r=%s,gz=%b}",this.getClass().getSimpleName(),hashCode(),_resource,_gzip!=null);
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public HttpContent getGzipContent()
+    {
+        return _gzip==null?null:new GzipHttpContent(this,_gzip);
+    }
+
+}
\ No newline at end of file
diff --git a/jetty-http/src/main/resources/META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder b/jetty-http/src/main/resources/META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder
new file mode 100644
index 0000000..92640bd
--- /dev/null
+++ b/jetty-http/src/main/resources/META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder
@@ -0,0 +1 @@
+org.eclipse.jetty.http.Http1FieldPreEncoder
\ No newline at end of file
diff --git a/jetty-http/src/main/resources/org/eclipse/jetty/http/encoding.properties b/jetty-http/src/main/resources/org/eclipse/jetty/http/encoding.properties
index 311c802..04fe87e 100644
--- a/jetty-http/src/main/resources/org/eclipse/jetty/http/encoding.properties
+++ b/jetty-http/src/main/resources/org/eclipse/jetty/http/encoding.properties
@@ -1,4 +1,5 @@
-text/html	= ISO-8859-1
-text/plain	= ISO-8859-1
-text/xml	= UTF-8
-text/json   = UTF-8
+text/html=utf-8
+text/plain=iso-8859-1
+text/xml=utf-8
+text/json=utf-8
+application/xhtml+xml=utf-8
\ No newline at end of file
diff --git a/jetty-http/src/main/resources/org/eclipse/jetty/http/mime.properties b/jetty-http/src/main/resources/org/eclipse/jetty/http/mime.properties
index 654454c..4cbd3b5 100644
--- a/jetty-http/src/main/resources/org/eclipse/jetty/http/mime.properties
+++ b/jetty-http/src/main/resources/org/eclipse/jetty/http/mime.properties
@@ -10,6 +10,7 @@
 avi=video/x-msvideo
 bcpio=application/x-bcpio
 bin=application/octet-stream
+bmp=image/bmp
 cab=application/x-cabinet
 cdf=application/x-netcdf
 class=application/java-vm
@@ -50,6 +51,7 @@
 java=text/plain
 jnlp=application/x-java-jnlp-file
 jpe=image/jpeg
+jp2=image/jpeg2000
 jpeg=image/jpeg
 jpg=image/jpeg
 js=application/javascript
@@ -112,6 +114,7 @@
 qml=text/x-qml
 qt=video/quicktime
 ra=audio/x-pn-realaudio
+rar=application/x-rar-compressed
 ram=audio/x-pn-realaudio
 ras=image/x-cmu-raster
 rdf=application/rdf+xml
@@ -169,6 +172,7 @@
 wrl=model/vrml
 wtls-ca-certificate=application/vnd.wap.wtls-ca-certificate
 xbm=image/x-xbitmap
+xcf=image/xcf
 xht=application/xhtml+xml
 xhtml=application/xhtml+xml
 xls=application/vnd.ms-excel
diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpFieldTest.java b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpFieldTest.java
new file mode 100644
index 0000000..d381de3
--- /dev/null
+++ b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpFieldTest.java
@@ -0,0 +1,171 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.util.BufferUtil;
+import org.junit.Test;
+
+public class HttpFieldTest
+{
+
+    @Test
+    public void testContainsSimple() throws Exception
+    {
+        HttpField field = new HttpField("name","somevalue");
+        assertTrue(field.contains("somevalue"));
+        assertFalse(field.contains("other"));
+        assertFalse(field.contains("some"));
+        assertFalse(field.contains("value"));
+        assertFalse(field.contains("v"));
+        assertFalse(field.contains(""));
+        assertFalse(field.contains(null));
+    }
+    
+    @Test
+    public void testCaseInsensitiveHashcode_KnownField() throws Exception
+    {
+        HttpField fieldFoo1 = new HttpField("Cookie","foo");
+        HttpField fieldFoo2 = new HttpField("cookie","foo");
+        
+        assertThat("Field hashcodes are case insensitive", fieldFoo1.hashCode(), is(fieldFoo2.hashCode()));
+    }
+    
+    @Test
+    public void testCaseInsensitiveHashcode_UnknownField() throws Exception
+    {
+        HttpField fieldFoo1 = new HttpField("X-Foo","bar");
+        HttpField fieldFoo2 = new HttpField("x-foo","bar");
+        
+        assertThat("Field hashcodes are case insensitive", fieldFoo1.hashCode(), is(fieldFoo2.hashCode()));
+    }
+
+    @Test
+    public void testContainsList() throws Exception
+    {
+        HttpField field = new HttpField("name",",aaa,bbb,ccc, ddd , e e, \"\\\"f,f\\\"\", ");
+        assertTrue(field.contains("aaa"));
+        assertTrue(field.contains("bbb"));
+        assertTrue(field.contains("ccc"));
+        assertTrue(field.contains("ddd"));
+        assertTrue(field.contains("e e"));
+        assertTrue(field.contains("\"f,f\""));
+        assertFalse(field.contains(""));
+        assertFalse(field.contains("aa"));
+        assertFalse(field.contains("bb"));
+        assertFalse(field.contains("cc"));
+        assertFalse(field.contains(null));
+    }
+    
+
+    @Test
+    public void testQualityContainsList() throws Exception
+    {
+        HttpField field;
+        
+        field = new HttpField("name","yes");
+        assertTrue(field.contains("yes"));
+        assertFalse(field.contains("no"));
+
+        field = new HttpField("name",",yes,");
+        assertTrue(field.contains("yes"));
+        assertFalse(field.contains("no"));
+        
+        field = new HttpField("name","other,yes,other");
+        assertTrue(field.contains("yes"));
+        assertFalse(field.contains("no"));
+        
+        field = new HttpField("name","other,  yes  ,other");
+        assertTrue(field.contains("yes"));
+        assertFalse(field.contains("no"));
+        
+        field = new HttpField("name","other,  y s  ,other");
+        assertTrue(field.contains("y s"));
+        assertFalse(field.contains("no"));
+
+        field = new HttpField("name","other,  \"yes\"  ,other");
+        assertTrue(field.contains("yes"));
+        assertFalse(field.contains("no"));
+        
+        field = new HttpField("name","other,  \"\\\"yes\\\"\"  ,other");
+        assertTrue(field.contains("\"yes\""));
+        assertFalse(field.contains("no"));
+        
+        field = new HttpField("name",";no,yes,;no");
+        assertTrue(field.contains("yes"));
+        assertFalse(field.contains("no"));
+
+        field = new HttpField("name","no;q=0,yes;q=1,no; q = 0");
+        assertTrue(field.contains("yes"));
+        assertFalse(field.contains("no"));
+        
+        field = new HttpField("name","no;q=0.0000,yes;q=0.0001,no; q = 0.00000");
+        assertTrue(field.contains("yes"));
+        assertFalse(field.contains("no"));
+       
+    }
+    
+    @Test
+    public void testValues()
+    {
+        String[] values = new HttpField("name","value").getValues();
+        assertEquals(1,values.length);
+        assertEquals("value",values[0]);
+        
+
+        values = new HttpField("name","a,b,c").getValues();
+        assertEquals(3,values.length);
+        assertEquals("a",values[0]);
+        assertEquals("b",values[1]);
+        assertEquals("c",values[2]);
+
+        values = new HttpField("name","a,\"x,y,z\",c").getValues();
+        assertEquals(3,values.length);
+        assertEquals("a",values[0]);
+        assertEquals("x,y,z",values[1]);
+        assertEquals("c",values[2]);
+        
+        values = new HttpField("name","a,\"x,\\\"p,q\\\",z\",c").getValues();
+        assertEquals(3,values.length);
+        assertEquals("a",values[0]);
+        assertEquals("x,\"p,q\",z",values[1]);
+        assertEquals("c",values[2]);
+        
+    }
+    
+    @Test
+    public void testCachedField()
+    {
+        PreEncodedHttpField field = new PreEncodedHttpField(HttpHeader.ACCEPT,"something");
+        ByteBuffer buf = BufferUtil.allocate(256);
+        BufferUtil.clearToFill(buf);
+        field.putTo(buf,HttpVersion.HTTP_1_0);
+        BufferUtil.flipToFlush(buf,0);
+        String s=BufferUtil.toString(buf);
+        
+        assertEquals("Accept: something\r\n",s);
+    }
+}
diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpFieldsTest.java b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpFieldsTest.java
index 8f88000..ae7200c 100644
--- a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpFieldsTest.java
+++ b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpFieldsTest.java
@@ -27,6 +27,9 @@
 
 import java.nio.ByteBuffer;
 import java.util.Enumeration;
+import java.util.List;
+import java.util.NoSuchElementException;
+
 import org.eclipse.jetty.util.BufferUtil;
 import org.hamcrest.Matchers;
 import org.junit.Assert;
@@ -45,9 +48,10 @@
         header.put("name0", "value:0");
         header.put("name1", "value1");
 
-        assertEquals("value:0",header.getStringField("name0"));
-        assertEquals("value1",header.getStringField("name1"));
-        assertNull(header.getStringField("name2"));
+        assertEquals(2,header.size());
+        assertEquals("value:0",header.get("name0"));
+        assertEquals("value1",header.get("name1"));
+        assertNull(header.get("name2"));
 
         int matches=0;
         Enumeration<String> e = header.getFieldNames();
@@ -65,6 +69,7 @@
         assertEquals(true, e.hasMoreElements());
         assertEquals(e.nextElement(), "value:0");
         assertEquals(false, e.hasMoreElements());
+        
     }
 
     @Test
@@ -96,10 +101,45 @@
         header.put("name0", "value0");
         header.put("name1", "value1");
 
-        assertEquals("value0",header.getStringField("name0"));
-        assertEquals("value0",header.getStringField("Name0"));
-        assertEquals("value1",header.getStringField("name1"));
-        assertEquals("value1",header.getStringField("Name1"));
+        assertEquals("value0",header.get("name0"));
+        assertEquals("value0",header.get("Name0"));
+        assertEquals("value1",header.get("name1"));
+        assertEquals("value1",header.get("Name1"));
+        assertEquals(null,header.get("Name2"));
+        
+        assertEquals("value0",header.getField("name0").getValue());
+        assertEquals("value0",header.getField("Name0").getValue());
+        assertEquals("value1",header.getField("name1").getValue());
+        assertEquals("value1",header.getField("Name1").getValue());
+        assertEquals(null,header.getField("Name2"));
+
+        assertEquals("value0",header.getField(0).getValue());
+        assertEquals("value1",header.getField(1).getValue());
+        try
+        {
+            header.getField(2);
+            Assert.fail();
+        }
+        catch(NoSuchElementException e)
+        {}        
+    }
+    
+    @Test
+    public void testGetKnown() throws Exception
+    {
+        HttpFields header = new HttpFields();
+
+        header.put("Connection", "value0");
+        header.put(HttpHeader.ACCEPT, "value1");
+
+        assertEquals("value0",header.get(HttpHeader.CONNECTION));
+        assertEquals("value1",header.get(HttpHeader.ACCEPT));
+        
+        assertEquals("value0",header.getField(HttpHeader.CONNECTION).getValue());
+        assertEquals("value1",header.getField(HttpHeader.ACCEPT).getValue());
+        
+        assertEquals(null,header.getField(HttpHeader.AGE));
+        assertEquals(null,header.get(HttpHeader.AGE));
     }
 
     @Test
@@ -150,16 +190,16 @@
         header.put("name1", "xxxxxx");
         header.put("name2", "value2");
 
-        assertEquals("value0",header.getStringField("name0"));
-        assertEquals("xxxxxx",header.getStringField("name1"));
-        assertEquals("value2",header.getStringField("name2"));
+        assertEquals("value0",header.get("name0"));
+        assertEquals("xxxxxx",header.get("name1"));
+        assertEquals("value2",header.get("name2"));
 
         header.put("name1", "value1");
 
-        assertEquals("value0",header.getStringField("name0"));
-        assertEquals("value1",header.getStringField("name1"));
-        assertEquals("value2",header.getStringField("name2"));
-        assertNull(header.getStringField("name3"));
+        assertEquals("value0",header.get("name0"));
+        assertEquals("value1",header.get("name1"));
+        assertEquals("value2",header.get("name2"));
+        assertNull(header.get("name3"));
 
         int matches=0;
         Enumeration<String> e = header.getFieldNames();
@@ -185,22 +225,22 @@
     @Test
     public void testRemovePut() throws Exception
     {
-        HttpFields header = new HttpFields();
+        HttpFields header = new HttpFields(1);
 
         header.put("name0", "value0");
         header.put("name1", "value1");
         header.put("name2", "value2");
 
-        assertEquals("value0",header.getStringField("name0"));
-        assertEquals("value1",header.getStringField("name1"));
-        assertEquals("value2",header.getStringField("name2"));
+        assertEquals("value0",header.get("name0"));
+        assertEquals("value1",header.get("name1"));
+        assertEquals("value2",header.get("name2"));
 
         header.remove("name1");
 
-        assertEquals("value0",header.getStringField("name0"));
-        assertNull(header.getStringField("name1"));
-        assertEquals("value2",header.getStringField("name2"));
-        assertNull(header.getStringField("name3"));
+        assertEquals("value0",header.get("name0"));
+        assertNull(header.get("name1"));
+        assertEquals("value2",header.get("name2"));
+        assertNull(header.get("name3"));
 
         int matches=0;
         Enumeration<String> e = header.getFieldNames();
@@ -229,16 +269,16 @@
         fields.add("name1", "valueA");
         fields.add("name2", "value2");
 
-        assertEquals("value0",fields.getStringField("name0"));
-        assertEquals("valueA",fields.getStringField("name1"));
-        assertEquals("value2",fields.getStringField("name2"));
+        assertEquals("value0",fields.get("name0"));
+        assertEquals("valueA",fields.get("name1"));
+        assertEquals("value2",fields.get("name2"));
 
         fields.add("name1", "valueB");
 
-        assertEquals("value0",fields.getStringField("name0"));
-        assertEquals("valueA",fields.getStringField("name1"));
-        assertEquals("value2",fields.getStringField("name2"));
-        assertNull(fields.getStringField("name3"));
+        assertEquals("value0",fields.get("name0"));
+        assertEquals("valueA",fields.get("name1"));
+        assertEquals("value2",fields.get("name2"));
+        assertNull(fields.get("name3"));
 
         int matches=0;
         Enumeration<String> e = fields.getFieldNames();
@@ -301,9 +341,29 @@
         assertEquals(true, e.hasMoreElements());
         assertEquals(e.nextElement(), "value1D");
         assertEquals(false, e.hasMoreElements());
-        
     }
 
+
+    @Test
+    public void testGetQualityValues() throws Exception
+    {
+        HttpFields fields = new HttpFields();
+
+        fields.put("some", "value");
+        fields.add("name", "zero;q=0.9,four;q=0.1");
+        fields.put("other", "value");
+        fields.add("name", "nothing;q=0");
+        fields.add("name", "one;q=0.4");
+        fields.add("name", "three;x=y;q=0.2;a=b,two;q=0.3");
+        
+        List<String> list = HttpFields.qualityList(fields.getValues("name",","));
+        assertEquals("zero",HttpFields.valueParameters(list.get(0),null));
+        assertEquals("one",HttpFields.valueParameters(list.get(1),null));
+        assertEquals("two",HttpFields.valueParameters(list.get(2),null));
+        assertEquals("three",HttpFields.valueParameters(list.get(3),null));
+        assertEquals("four",HttpFields.valueParameters(list.get(4),null));
+    }
+    
     @Test
     public void testDateFields() throws Exception
     {
@@ -343,7 +403,7 @@
         assertEquals(951825600000L,d5);
 
         fields.putDateField("D2",d1);
-        assertEquals("Fri, 31 Dec 1999 23:59:59 GMT",fields.getStringField("D2"));
+        assertEquals("Fri, 31 Dec 1999 23:59:59 GMT",fields.get("D2"));
     }
 
     @Test
@@ -352,16 +412,16 @@
         HttpFields fields = new HttpFields();
 
         fields.putDateField("Dzero",0);
-        assertEquals("Thu, 01 Jan 1970 00:00:00 GMT",fields.getStringField("Dzero"));
+        assertEquals("Thu, 01 Jan 1970 00:00:00 GMT",fields.get("Dzero"));
 
         fields.putDateField("Dminus",-1);
-        assertEquals("Wed, 31 Dec 1969 23:59:59 GMT",fields.getStringField("Dminus"));
+        assertEquals("Wed, 31 Dec 1969 23:59:59 GMT",fields.get("Dminus"));
 
         fields.putDateField("Dminus",-1000);
-        assertEquals("Wed, 31 Dec 1969 23:59:59 GMT",fields.getStringField("Dminus"));
+        assertEquals("Wed, 31 Dec 1969 23:59:59 GMT",fields.get("Dminus"));
 
         fields.putDateField("Dancient",Long.MIN_VALUE);
-        assertEquals("Sun, 02 Dec 55 16:47:04 GMT",fields.getStringField("Dancient"));
+        assertEquals("Sun, 02 Dec 55 16:47:04 GMT",fields.get("Dancient"));
     }
 
     @Test
@@ -371,15 +431,33 @@
 
         header.put("I1", "42");
         header.put("I2", " 43 99");
-        header.put("I3", "-44;");
+        header.put("I3", "-44");
         header.put("I4", " - 45abc");
         header.put("N1", " - ");
         header.put("N2", "xx");
 
         long i1=header.getLongField("I1");
-        long i2=header.getLongField("I2");
+        try
+        {
+            header.getLongField("I2");
+            assertTrue(false);
+        }
+        catch(NumberFormatException e)
+        {
+            assertTrue(true);
+        }
+            
         long i3=header.getLongField("I3");
-        long i4=header.getLongField("I4");
+        
+        try
+        {
+            header.getLongField("I4");
+            assertTrue(false);
+        }
+        catch(NumberFormatException e)
+        {
+            assertTrue(true);
+        }
 
         try{
             header.getLongField("N1");
@@ -400,14 +478,12 @@
         }
 
         assertEquals(42,i1);
-        assertEquals(43,i2);
         assertEquals(-44,i3);
-        assertEquals(-45,i4);
 
         header.putLongField("I5", 46);
         header.putLongField("I6",-47);
-        assertEquals("46",header.getStringField("I5"));
-        assertEquals("-47",header.getStringField("I6"));
+        assertEquals("46",header.get("I5"));
+        assertEquals("-47",header.get("I6"));
 
     }
 
@@ -416,20 +492,38 @@
     {
         HttpFields header = new HttpFields();
 
-        header.add("0", "");
-        header.add("1", ",");
-        header.add("2", ",,");
-        header.add("3", "abc");
-        header.add("4", "def");
-        header.add("5", "abc,def,hig");
-        header.add("6", "abc");
-        header.add("6", "def");
-        header.add("6", "hig");
+        header.add("n0", "");
+        header.add("n1", ",");
+        header.add("n2", ",,");
+        header.add("N3", "abc");
+        header.add("N4", "def");
+        header.add("n5", "abc,def,hig");
+        header.add("N6", "abc");
+        header.add("n6", "def");
+        header.add("N6", "hig");
+        header.add("n7", "abc ,  def;q=0.9  ,  hig");
+        header.add("n8", "abc ,  def;q=0  ,  hig");
+        header.add(HttpHeader.ACCEPT, "abc ,  def;q=0  ,  hig");
 
-        for (int i=0;i<7;i++)
+        for (int i=0;i<8;i++)
         {
-            assertFalse(""+i,header.contains(""+i,"xyz"));
-            assertEquals(""+i,i>=4,header.contains(""+i,"def"));
+            assertTrue(header.containsKey("n"+i));
+            assertTrue(header.containsKey("N"+i));
+            assertFalse(""+i,header.contains("n"+i,"xyz"));
+            assertEquals(""+i,i>=4,header.contains("n"+i,"def"));
         }
+        
+        
+        assertTrue(header.contains(new HttpField("N5","def")));
+        assertTrue(header.contains(new HttpField("accept","abc")));
+        assertTrue(header.contains(HttpHeader.ACCEPT,"abc"));
+        assertFalse(header.contains(new HttpField("N5","xyz")));
+        assertFalse(header.contains(new HttpField("N8","def")));
+        assertFalse(header.contains(HttpHeader.ACCEPT,"def"));
+        assertFalse(header.contains(HttpHeader.AGE,"abc"));
+        
+        assertFalse(header.containsKey("n11"));
+        
     }
+    
 }
diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java
index 0fc87e1..383bd12 100644
--- a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java
+++ b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java
@@ -29,16 +29,16 @@
 {
     public final static String[] connect={null,"keep-alive","close"};
 
-    class Info extends HttpGenerator.RequestInfo
+    class Info extends MetaData.Request
     {
         Info(String method,String uri)
         {
-            super(HttpVersion.HTTP_1_1,new HttpFields(),-1,method,uri);
+            super(method,new HttpURI(uri),HttpVersion.HTTP_1_1,new HttpFields(),-1);
         }
 
         public Info(String method,String uri, int contentLength)
         {
-            super(HttpVersion.HTTP_1_1,new HttpFields(),contentLength,method,uri);
+            super(method,new HttpURI(uri),HttpVersion.HTTP_1_1,new HttpFields(),contentLength);
         }
     }
 
@@ -54,8 +54,8 @@
         Assert.assertEquals(HttpGenerator.State.START, gen.getState());
 
         Info info = new Info("GET","/index.html");
-        info.getHttpFields().add("Host","something");
-        info.getHttpFields().add("User-Agent","test");
+        info.getFields().add("Host","something");
+        info.getFields().add("User-Agent","test");
         Assert.assertTrue(!gen.isChunking());
 
         result=gen.generateRequest(info,null,null,null, true);
@@ -94,8 +94,8 @@
         Assert.assertEquals(HttpGenerator.State.START, gen.getState());
 
         Info info = new Info("POST","/index.html");
-        info.getHttpFields().add("Host","something");
-        info.getHttpFields().add("User-Agent","test");
+        info.getFields().add("Host","something");
+        info.getFields().add("User-Agent","test");
 
         result=gen.generateRequest(info,null,null,content0, true);
         Assert.assertEquals(HttpGenerator.Result.NEED_HEADER, result);
@@ -140,8 +140,8 @@
         Assert.assertEquals(HttpGenerator.State.START, gen.getState());
 
         Info info = new Info("POST","/index.html");
-        info.getHttpFields().add("Host","something");
-        info.getHttpFields().add("User-Agent","test");
+        info.getFields().add("Host","something");
+        info.getFields().add("User-Agent","test");
 
         result=gen.generateRequest(info,null,null,content0, false);
         Assert.assertEquals(HttpGenerator.Result.NEED_HEADER, result);
@@ -212,8 +212,8 @@
         Assert.assertEquals(HttpGenerator.State.START, gen.getState());
 
         Info info = new Info("POST","/index.html",58);
-        info.getHttpFields().add("Host","something");
-        info.getHttpFields().add("User-Agent","test");
+        info.getFields().add("Host","something");
+        info.getFields().add("User-Agent","test");
 
         result=gen.generateRequest(info,null,null,content0, false);
         Assert.assertEquals(HttpGenerator.Result.NEED_HEADER, result);
diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorServerHTTPTest.java b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorServerHTTPTest.java
index 8ff3051..237e0c8 100644
--- a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorServerHTTPTest.java
+++ b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorServerHTTPTest.java
@@ -18,6 +18,13 @@
 
 package org.eclipse.jetty.http;
 
+import static org.hamcrest.Matchers.either;
+import static org.hamcrest.Matchers.equalTo;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -31,13 +38,6 @@
 import org.junit.runners.Parameterized.Parameter;
 import org.junit.runners.Parameterized.Parameters;
 
-import static org.hamcrest.Matchers.either;
-import static org.hamcrest.Matchers.equalTo;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
 @RunWith(Parameterized.class)
 public class HttpGeneratorServerHTTPTest
 {
@@ -145,7 +145,7 @@
             }
             ByteBuffer header = null;
             ByteBuffer chunk = null;
-            HttpGenerator.ResponseInfo info = null;
+            MetaData.Response info = null;
 
             loop:
             while (true)
@@ -157,12 +157,12 @@
                 // Generate
                 boolean last = !BufferUtil.hasContent(content);
 
-                HttpGenerator.Result result = gen.generateResponse(info, header, chunk, content, last);
+                HttpGenerator.Result result = gen.generateResponse(info, _head, header, chunk, content, last);
 
                 switch (result)
                 {
                     case NEED_INFO:
-                        info = new HttpGenerator.ResponseInfo(HttpVersion.fromVersion(version), _fields, _contentLength, _code, reason, _head);
+                        info = new MetaData.Response(HttpVersion.fromVersion(version), _code, reason, _fields, _contentLength);
                         continue;
 
                     case NEED_HEADER:
@@ -216,7 +216,7 @@
         }
     }
 
-    private class Handler implements HttpParser.ResponseHandler<ByteBuffer>
+    private class Handler implements HttpParser.ResponseHandler
     {
         @Override
         public boolean content(ByteBuffer ref)
@@ -247,9 +247,8 @@
         }
 
         @Override
-        public boolean parsedHeader(HttpField field)
+        public void parsedHeader(HttpField field)
         {
-            return false;
         }
 
         @Override
diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorServerTest.java b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorServerTest.java
index fc6d149..b53114e 100644
--- a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorServerTest.java
+++ b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorServerTest.java
@@ -18,19 +18,18 @@
 
 package org.eclipse.jetty.http;
 
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.http.HttpGenerator.ResponseInfo;
-import org.eclipse.jetty.util.BufferUtil;
-import org.junit.Assert;
-import org.junit.Test;
-
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.not;
 import static org.hamcrest.Matchers.startsWith;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.util.BufferUtil;
+import org.junit.Assert;
+import org.junit.Test;
+
 public class HttpGeneratorServerTest
 { 
     
@@ -46,9 +45,9 @@
         assertEquals(HttpGenerator.Result.NEED_INFO, result);
         assertEquals(HttpGenerator.State.START, gen.getState());
 
-        ResponseInfo info = new ResponseInfo(HttpVersion.HTTP_1_1, new HttpFields(), 10, 200, null, false);
-        info.getHttpFields().add("Content-Type", "test/data");
-        info.getHttpFields().add("Last-Modified", DateGenerator.__01Jan1970);
+        MetaData.Response info = new MetaData.Response(HttpVersion.HTTP_1_1, 200, null, new HttpFields(), 10);
+        info.getFields().add("Content-Type", "test/data");
+        info.getFields().add("Last-Modified", DateGenerator.__01Jan1970);
 
         result = gen.generateResponse(info, null, null, content, true);
         assertEquals(HttpGenerator.Result.NEED_HEADER, result);
@@ -81,9 +80,9 @@
 
         HttpGenerator gen = new HttpGenerator();
         
-        ResponseInfo info = new ResponseInfo(HttpVersion.HTTP_1_1, new HttpFields(), 10, 204, "Foo", false);
-        info.getHttpFields().add("Content-Type", "test/data");
-        info.getHttpFields().add("Last-Modified", DateGenerator.__01Jan1970);
+        MetaData.Response info = new MetaData.Response(HttpVersion.HTTP_1_1, 204, "Foo", new HttpFields(), 10);
+        info.getFields().add("Content-Type", "test/data");
+        info.getFields().add("Last-Modified", DateGenerator.__01Jan1970);
 
         HttpGenerator.Result result = gen.generateResponse(info, header, null, content, true);
      
@@ -118,9 +117,9 @@
         assertEquals(HttpGenerator.Result.NEED_INFO, result);
         assertEquals(HttpGenerator.State.START, gen.getState());
 
-        ResponseInfo info = new ResponseInfo(HttpVersion.HTTP_1_1, new HttpFields(), 10, 200, null, false);
-        info.getHttpFields().add("Content-Type", "test/data;\r\nextra=value");
-        info.getHttpFields().add("Last-Modified", DateGenerator.__01Jan1970);
+        MetaData.Response info = new MetaData.Response(HttpVersion.HTTP_1_1, 200, null, new HttpFields(), 10);
+        info.getFields().add("Content-Type", "test/data;\r\nextra=value");
+        info.getFields().add("Last-Modified", DateGenerator.__01Jan1970);
 
         result = gen.generateResponse(info, null, null, content, true);
         assertEquals(HttpGenerator.Result.NEED_HEADER, result);
@@ -150,11 +149,11 @@
     public void testSendServerXPoweredBy() throws Exception
     {
         ByteBuffer header = BufferUtil.allocate(8096);
-        ResponseInfo info = new ResponseInfo(HttpVersion.HTTP_1_1, new HttpFields(), -1, 200, null, false);
+        MetaData.Response info = new MetaData.Response(HttpVersion.HTTP_1_1, 200, null, new HttpFields(), -1);
         HttpFields fields = new HttpFields();
         fields.add(HttpHeader.SERVER, "SomeServer");
         fields.add(HttpHeader.X_POWERED_BY, "SomePower");
-        ResponseInfo infoF = new ResponseInfo(HttpVersion.HTTP_1_1, fields, -1, 200, null, false);
+        MetaData.Response infoF = new MetaData.Response(HttpVersion.HTTP_1_1, 200, null, fields, -1);
         String head;
 
         HttpGenerator gen = new HttpGenerator(true, true);
@@ -205,8 +204,8 @@
         assertEquals(HttpGenerator.Result.NEED_INFO, result);
         assertEquals(HttpGenerator.State.START, gen.getState());
 
-        ResponseInfo info = new ResponseInfo(HttpVersion.HTTP_1_1, new HttpFields(), -1, 200, null, false);
-        info.getHttpFields().add("Last-Modified", DateGenerator.__01Jan1970);
+        MetaData.Response info = new MetaData.Response(HttpVersion.HTTP_1_1, 200, null, new HttpFields(), -1);
+        info.getFields().add("Last-Modified", DateGenerator.__01Jan1970);
 
         result = gen.generateResponse(info, null, null, null, true);
         assertEquals(HttpGenerator.Result.NEED_HEADER, result);
@@ -238,10 +237,10 @@
         assertEquals(HttpGenerator.Result.NEED_INFO, result);
         assertEquals(HttpGenerator.State.START, gen.getState());
 
-        ResponseInfo info = new ResponseInfo(HttpVersion.HTTP_1_1, new HttpFields(), -1, 101, null, false);
-        info.getHttpFields().add("Upgrade", "WebSocket");
-        info.getHttpFields().add("Connection", "Upgrade");
-        info.getHttpFields().add("Sec-WebSocket-Accept", "123456789==");
+        MetaData.Response info = new MetaData.Response(HttpVersion.HTTP_1_1, 101, null, new HttpFields(), -1);
+        info.getFields().add("Upgrade", "WebSocket");
+        info.getFields().add("Connection", "Upgrade");
+        info.getFields().add("Sec-WebSocket-Accept", "123456789==");
 
         result = gen.generateResponse(info, header, null, null, true);
         assertEquals(HttpGenerator.Result.FLUSH, result);
@@ -273,8 +272,8 @@
         assertEquals(HttpGenerator.Result.NEED_INFO, result);
         assertEquals(HttpGenerator.State.START, gen.getState());
 
-        ResponseInfo info = new ResponseInfo(HttpVersion.HTTP_1_1, new HttpFields(), -1, 200, null, false);
-        info.getHttpFields().add("Last-Modified", DateGenerator.__01Jan1970);
+        MetaData.Response info = new MetaData.Response(HttpVersion.HTTP_1_1, 200, null, new HttpFields(), -1);
+        info.getFields().add("Last-Modified", DateGenerator.__01Jan1970);
         result = gen.generateResponse(info, null, null, content0, false);
         assertEquals(HttpGenerator.Result.NEED_HEADER, result);
         assertEquals(HttpGenerator.State.START, gen.getState());
@@ -333,8 +332,8 @@
         assertEquals(HttpGenerator.Result.NEED_INFO, result);
         assertEquals(HttpGenerator.State.START, gen.getState());
 
-        ResponseInfo info = new ResponseInfo(HttpVersion.HTTP_1_1, new HttpFields(), 59, 200, null, false);
-        info.getHttpFields().add("Last-Modified", DateGenerator.__01Jan1970);
+        MetaData.Response info = new MetaData.Response(HttpVersion.HTTP_1_1, 200, null, new HttpFields(), 59);
+        info.getFields().add("Last-Modified", DateGenerator.__01Jan1970);
         result = gen.generateResponse(info, null, null, content0, false);
         assertEquals(HttpGenerator.Result.NEED_HEADER, result);
         assertEquals(HttpGenerator.State.START, gen.getState());
@@ -396,8 +395,8 @@
         assertEquals(HttpGenerator.Result.NEED_INFO, result);
         assertEquals(HttpGenerator.State.START, gen.getState());
 
-        ResponseInfo info = new ResponseInfo(HttpVersion.HTTP_1_1, new HttpFields(), 59, 200, null, false);
-        info.getHttpFields().add("Last-Modified", DateGenerator.__01Jan1970);
+        MetaData.Response info = new MetaData.Response(HttpVersion.HTTP_1_1, 200, null, new HttpFields(), 59);
+        info.getFields().add("Last-Modified", DateGenerator.__01Jan1970);
         result = gen.generateResponse(info, null, null, content0, false);
         assertEquals(HttpGenerator.Result.NEED_HEADER, result);
         assertEquals(HttpGenerator.State.START, gen.getState());
@@ -441,7 +440,7 @@
         fields.put(HttpHeader.CONNECTION, HttpHeaderValue.KEEP_ALIVE);
         String customValue = "test";
         fields.add(HttpHeader.CONNECTION, customValue);
-        ResponseInfo info = new ResponseInfo(HttpVersion.HTTP_1_0, fields, -1, 200, "OK", false);
+        MetaData.Response info = new MetaData.Response(HttpVersion.HTTP_1_0, 200, "OK", fields, -1);
         ByteBuffer header = BufferUtil.allocate(4096);
         HttpGenerator.Result result = generator.generateResponse(info, header, null, null, true);
         Assert.assertSame(HttpGenerator.Result.FLUSH, result);
diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java
index 7f65619..e49ad3e 100644
--- a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java
+++ b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java
@@ -18,7 +18,11 @@
 
 package org.eclipse.jetty.http;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
@@ -42,6 +46,7 @@
      * Parse until {@link State#END} state.
      * If the parser is already in the END state, then it is {@link HttpParser#reset()} and re-parsed.
      * @param parser The parser to test
+     * @param buffer the buffer to parse
      * @throws IllegalStateException If the buffers have already been partially parsed.
      */
     public static void parseAll(HttpParser parser, ByteBuffer buffer)
@@ -86,7 +91,7 @@
     {
         ByteBuffer buffer= BufferUtil.toBuffer("POST /mock/127.0.0.1 HTTP/1.1\015\012" + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
         assertEquals("POST", _methodOrVersion);
@@ -100,7 +105,7 @@
     {
         ByteBuffer buffer= BufferUtil.toBuffer("POST /foo HTTP/1.0\015\012" + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
         assertEquals("POST", _methodOrVersion);
@@ -115,13 +120,11 @@
         ByteBuffer buffer= BufferUtil.toBuffer("GET /999\015\012");
 
         _versionOrReason= null;
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
-        assertEquals("GET", _methodOrVersion);
-        assertEquals("/999", _uriOrStatus);
-        assertEquals(null, _versionOrReason);
-        assertEquals(-1, _headers);
+        
+        assertEquals("HTTP/0.9 not supported", _bad);
     }
 
     @Test
@@ -130,13 +133,10 @@
         ByteBuffer buffer= BufferUtil.toBuffer("POST /222  \015\012");
 
         _versionOrReason= null;
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
-        assertEquals("POST", _methodOrVersion);
-        assertEquals("/222", _uriOrStatus);
-        assertEquals(null, _versionOrReason);
-        assertEquals(-1, _headers);
+        assertEquals("HTTP/0.9 not supported", _bad);
     }
 
     @Test
@@ -144,7 +144,7 @@
     {
         ByteBuffer buffer= BufferUtil.toBuffer("POST /fo\u0690 HTTP/1.0\015\012" + "\015\012",StandardCharsets.UTF_8);
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
         assertEquals("POST", _methodOrVersion);
@@ -158,7 +158,7 @@
     {
         ByteBuffer buffer= BufferUtil.toBuffer("POST /foo?param=\u0690 HTTP/1.0\015\012" + "\015\012",StandardCharsets.UTF_8);
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
         assertEquals("POST", _methodOrVersion);
@@ -172,7 +172,7 @@
     {
         ByteBuffer buffer= BufferUtil.toBuffer("POST /123456789abcdef/123456789abcdef/123456789abcdef/123456789abcdef/123456789abcdef/123456789abcdef/123456789abcdef/123456789abcdef/123456789abcdef/123456789abcdef/123456789abcdef/123456789abcdef/123456789abcdef/123456789abcdef/123456789abcdef/123456789abcdef/ HTTP/1.0\015\012" + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
         assertEquals("POST", _methodOrVersion);
@@ -185,7 +185,7 @@
     public void testConnect() throws Exception
     {
         ByteBuffer buffer= BufferUtil.toBuffer("CONNECT 192.168.1.2:80 HTTP/1.1\015\012" + "\015\012");
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
         assertEquals("CONNECT", _methodOrVersion);
@@ -203,7 +203,7 @@
                 "Connection: close\015\012" +
                 "\015\012");
         
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
 
@@ -218,6 +218,102 @@
         assertEquals("close", _val[1]);
         assertEquals(1, _headers);
     }
+    
+    @Test
+    public void test7230NoContinuations() throws Exception
+    {
+        ByteBuffer buffer= BufferUtil.toBuffer(
+                "GET / HTTP/1.0\015\012" +
+                "Host: localhost\015\012" +
+                "Name: value\015\012" +
+                " extra\015\012" +
+                "\015\012");
+        
+        HttpParser.RequestHandler handler  = new Handler();
+        HttpParser parser= new HttpParser(handler);
+        parseAll(parser,buffer);
+
+        Assert.assertThat(_bad,Matchers.notNullValue());
+        Assert.assertThat(_bad,Matchers.containsString("Bad Continuation"));
+    }
+
+    
+    @Test
+    public void test7230NoWhiteSpaceInName() throws Exception
+    {
+        ByteBuffer buffer= BufferUtil.toBuffer(
+                "GET / HTTP/1.0\015\012" +
+                "Host: localhost\015\012" +
+                " Name: value\015\012" +
+                "\015\012");
+        
+        HttpParser.RequestHandler handler  = new Handler();
+        HttpParser parser= new HttpParser(handler);
+        parseAll(parser,buffer);
+
+        Assert.assertThat(_bad,Matchers.notNullValue());
+        Assert.assertThat(_bad,Matchers.containsString("Bad"));
+        
+        init();
+        buffer= BufferUtil.toBuffer(
+                "GET / HTTP/1.0\015\012" +
+                "Host: localhost\015\012" +
+                "N ame: value\015\012" +
+                "\015\012");
+        
+        handler  = new Handler();
+        parser= new HttpParser(handler);
+        parseAll(parser,buffer);
+
+        Assert.assertThat(_bad,Matchers.containsString("Illegal character"));
+        
+
+        init();
+        buffer= BufferUtil.toBuffer(
+                "GET / HTTP/1.0\015\012" +
+                "Host: localhost\015\012" +
+                "Name : value\015\012" +
+                "\015\012");
+        
+        handler  = new Handler();
+        parser= new HttpParser(handler);
+        parseAll(parser,buffer);
+
+        Assert.assertThat(_bad,Matchers.containsString("Illegal character"));
+        
+    }
+    
+
+    @Test
+    public void testNoValue() throws Exception
+    {
+        ByteBuffer buffer= BufferUtil.toBuffer(
+                "GET / HTTP/1.0\015\012" +
+                "Host: localhost\015\012" +
+                "Name0: \015\012"+
+                "Name1: \015\012"+
+                "Connection: close\015\012" +
+                "\015\012");
+        
+        HttpParser.RequestHandler handler  = new Handler();
+        HttpParser parser= new HttpParser(handler);
+        parseAll(parser,buffer);
+
+        assertTrue(_headerCompleted);
+        assertTrue(_messageCompleted);
+        assertEquals("GET", _methodOrVersion);
+        assertEquals("/", _uriOrStatus);
+        assertEquals("HTTP/1.0", _versionOrReason);
+        assertEquals("Host", _hdr[0]);
+        assertEquals("localhost", _val[0]);
+        assertEquals("Name0", _hdr[1]);
+        assertEquals(null, _val[1]);
+        assertEquals("Name1", _hdr[2]);
+        assertEquals(null, _val[2]);
+        assertEquals("Connection", _hdr[3]);
+        assertEquals("close", _val[3]);
+        assertEquals(3, _headers);
+    }
 
     @Test
     public void testHeaderParseDirect() throws Exception
@@ -226,13 +322,11 @@
                 "GET / HTTP/1.0\015\012" +
                         "Host: localhost\015\012" +
                         "Header1: value1\015\012" +
-                        "Header 2  :   value 2a  \015\012" +
-                        "    value 2b  \015\012" +
-                        "Header3: \015\012" +
-                        "Header4 \015\012" +
-                        "  value4\015\012" +
-                        "Server5 : notServer\015\012" +
-                        "Host Header: notHost\015\012" +
+                        "Header2:   value 2a  \015\012" +
+                        "Header3: 3\015\012" +
+                        "Header4:value4\015\012" +
+                        "Server5: notServer\015\012" +
+                        "HostHeader: notHost\015\012" +
                         "Connection: close\015\012" +
                         "Accept-Encoding: gzip, deflated\015\012" +
                         "Accept: unknown\015\012" +
@@ -242,7 +336,7 @@
         BufferUtil.put(b0,buffer);
         BufferUtil.flipToFlush(buffer,pos);
         
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
 
@@ -253,15 +347,15 @@
         assertEquals("localhost", _val[0]);
         assertEquals("Header1", _hdr[1]);
         assertEquals("value1", _val[1]);
-        assertEquals("Header 2", _hdr[2]);
-        assertEquals("value 2a value 2b", _val[2]);
+        assertEquals("Header2", _hdr[2]);
+        assertEquals("value 2a", _val[2]);
         assertEquals("Header3", _hdr[3]);
-        assertEquals(null, _val[3]);
+        assertEquals("3", _val[3]);
         assertEquals("Header4", _hdr[4]);
         assertEquals("value4", _val[4]);
         assertEquals("Server5", _hdr[5]);
         assertEquals("notServer", _val[5]);
-        assertEquals("Host Header", _hdr[6]);
+        assertEquals("HostHeader", _hdr[6]);
         assertEquals("notHost", _val[6]);
         assertEquals("Connection", _hdr[7]);
         assertEquals("close", _val[7]);
@@ -279,18 +373,16 @@
                 "GET / HTTP/1.0\015\012" +
                         "Host: localhost\015\012" +
                         "Header1: value1\015\012" +
-                        "Header 2  :   value 2a  \015\012" +
-                        "    value 2b  \015\012" +
-                        "Header3: \015\012" +
-                        "Header4 \015\012" +
-                        "  value4\015\012" +
-                        "Server5 : notServer\015\012" +
-                        "Host Header: notHost\015\012" +
+                        "Header2:   value 2a  \015\012" +
+                        "Header3: 3\015\012" +
+                        "Header4:value4\015\012" +
+                        "Server5: notServer\015\012" +
+                        "HostHeader: notHost\015\012" +
                         "Connection: close\015\012" +
                         "Accept-Encoding: gzip, deflated\015\012" +
                         "Accept: unknown\015\012" +
                 "\015\012");
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
 
@@ -301,15 +393,15 @@
         assertEquals("localhost", _val[0]);
         assertEquals("Header1", _hdr[1]);
         assertEquals("value1", _val[1]);
-        assertEquals("Header 2", _hdr[2]);
-        assertEquals("value 2a value 2b", _val[2]);
+        assertEquals("Header2", _hdr[2]);
+        assertEquals("value 2a", _val[2]);
         assertEquals("Header3", _hdr[3]);
-        assertEquals(null, _val[3]);
+        assertEquals("3", _val[3]);
         assertEquals("Header4", _hdr[4]);
         assertEquals("value4", _val[4]);
         assertEquals("Server5", _hdr[5]);
         assertEquals("notServer", _val[5]);
-        assertEquals("Host Header", _hdr[6]);
+        assertEquals("HostHeader", _hdr[6]);
         assertEquals("notHost", _val[6]);
         assertEquals("Connection", _hdr[7]);
         assertEquals("close", _val[7]);
@@ -329,18 +421,16 @@
                 "GET / HTTP/1.0\n" +
                         "Host: localhost\n" +
                         "Header1: value1\n" +
-                        "Header 2  :   value 2a  \n" +
-                        "    value 2b  \n" +
-                        "Header3: \n" +
-                        "Header4 \n" +
-                        "  value4\n" +
-                        "Server5 : notServer\n" +
-                        "Host Header: notHost\n" +
+                        "Header2:   value 2a value 2b  \n" +
+                        "Header3: 3\n" +
+                        "Header4:value4\n" +
+                        "Server5: notServer\n" +
+                        "HostHeader: notHost\n" +
                         "Connection: close\n" +
                         "Accept-Encoding: gzip, deflated\n" +
                         "Accept: unknown\n" +
                 "\n");
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
 
@@ -351,15 +441,15 @@
         assertEquals("localhost", _val[0]);
         assertEquals("Header1", _hdr[1]);
         assertEquals("value1", _val[1]);
-        assertEquals("Header 2", _hdr[2]);
+        assertEquals("Header2", _hdr[2]);
         assertEquals("value 2a value 2b", _val[2]);
         assertEquals("Header3", _hdr[3]);
-        assertEquals(null, _val[3]);
+        assertEquals("3", _val[3]);
         assertEquals("Header4", _hdr[4]);
         assertEquals("value4", _val[4]);
         assertEquals("Server5", _hdr[5]);
         assertEquals("notServer", _val[5]);
-        assertEquals("Host Header", _hdr[6]);
+        assertEquals("HostHeader", _hdr[6]);
         assertEquals("notHost", _val[6]);
         assertEquals("Connection", _hdr[7]);
         assertEquals("close", _val[7]);
@@ -379,7 +469,7 @@
                         "Name1: \"value\t1\"\n" +
                         "Name2: \"value\t2A\",\"value,2B\"\t\n" +
                 "\n");
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
 
@@ -408,7 +498,7 @@
         BufferUtil.put(BufferUtil.toBuffer("  \r\n\r\n"),buffer);
         BufferUtil.flipToFlush(buffer,0);
                     
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
 
@@ -429,7 +519,7 @@
         ByteBuffer buffer= BufferUtil.toBuffer(
             "G\u00e6T / HTTP/1.0\r\nHeader0: value0\r\n\n\n");
         
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
         assertThat(_bad,Matchers.notNullValue());
@@ -441,7 +531,7 @@
         ByteBuffer buffer= BufferUtil.toBuffer(
             "GET / H\u00e6P/1.0\r\nHeader0: value0\r\n\n\n");
         
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
         assertThat(_bad,Matchers.notNullValue());
@@ -454,7 +544,7 @@
         ByteBuffer buffer= BufferUtil.toBuffer(
             "GET / HTTP/1.0\r\nH\u00e6der0: value0\r\n\n\n");
         
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
         assertThat(_bad,Matchers.notNullValue());
@@ -469,7 +559,7 @@
             "Header: value\talternate\r\n" +
             "\n\n");
         
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
         
@@ -490,7 +580,7 @@
                 "HOST: localhost\015\012" +
                 "cOnNeCtIoN: ClOsE\015\012"+
                 "\015\012");
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler,-1,false);
         parseAll(parser,buffer);
 
@@ -512,7 +602,7 @@
                 "HOST: localhost\015\012" +
                 "cOnNeCtIoN: ClOsE\015\012"+
                 "\015\012");
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler,-1,true);
         parseAll(parser,buffer);
 
@@ -533,11 +623,9 @@
                 "XXXXSPLIT / HTTP/1.0\015\012" +
                     "Host: localhost\015\012" +
                     "Header1: value1\015\012" +
-                    "Header2  :   value 2a  \015\012" +
-                    "                    value 2b  \015\012" +
-                    "Header3: \015\012" +
-                    "Header4 \015\012" +
-                    "  value4\015\012" +
+                    "Header2:   value 2a  \015\012" +
+                    "Header3: 3\015\012" +
+                    "Header4:value4\015\012" +
                     "Server5: notServer\015\012" +
                     "\015\012ZZZZ");
         buffer.position(2);
@@ -546,7 +634,7 @@
 
         for (int i=0;i<buffer.capacity()-4;i++)
         {
-            HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+            HttpParser.RequestHandler handler  = new Handler();
             HttpParser parser= new HttpParser(handler);
 
             // System.err.println(BufferUtil.toDetailString(buffer));
@@ -571,9 +659,9 @@
             assertEquals("Header1", _hdr[1]);
             assertEquals("value1", _val[1]);
             assertEquals("Header2", _hdr[2]);
-            assertEquals("value 2a value 2b", _val[2]);
+            assertEquals("value 2a", _val[2]);
             assertEquals("Header3", _hdr[3]);
-            assertEquals(null, _val[3]);
+            assertEquals("3", _val[3]);
             assertEquals("Header4", _hdr[4]);
             assertEquals("value4", _val[4]);
             assertEquals("Server5", _hdr[5]);
@@ -597,7 +685,7 @@
                         + "ABCDEFGHIJKLMNOPQRSTUVWXYZ\015\012"
                         + "0\015\012"
                         + "\015\012");
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
 
@@ -616,7 +704,7 @@
     @Test
     public void testStartEOF() throws Exception
     {
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.atEOF();
         parser.parseNext(BufferUtil.EMPTY_BUFFER);
@@ -633,7 +721,7 @@
                         + "Content-Length: 20\015\012"
                         + "\015\012"
                         + "0123456789");
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.atEOF();
         parseAll(parser,buffer);
@@ -656,7 +744,7 @@
                         + "\015\012"
                         + "a;\015\012"
                         + "0123456789\015\012");
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.atEOF();
         parseAll(parser,buffer);
@@ -704,7 +792,7 @@
                         + "\015\012"
                         + "0123456789\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
         assertEquals("GET", _methodOrVersion);
@@ -772,7 +860,7 @@
                         + "0123456789\015\012");
 
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer0);
         parser.atEOF();
@@ -818,7 +906,7 @@
                         + "\015\012"
                         + "0123456789\015\012");
 
-        HttpParser.ResponseHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.ResponseHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
         assertEquals("HTTP/1.1", _methodOrVersion);
@@ -837,7 +925,7 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.ResponseHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.ResponseHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
         assertEquals("HTTP/1.1", _methodOrVersion);
@@ -861,7 +949,7 @@
                         + "\015\012"
                         + "0123456789\015\012");
 
-        HttpParser.ResponseHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.ResponseHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
         assertEquals("HTTP/1.1", _methodOrVersion);
@@ -894,7 +982,7 @@
                         + "\015\012"
                         + "0123456789\015\012");
 
-        HttpParser.ResponseHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.ResponseHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
         assertEquals("HTTP/1.1", _methodOrVersion);
@@ -915,7 +1003,7 @@
                         + "\015\012"
                         + "0123456789\015\012");
 
-        HttpParser.ResponseHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.ResponseHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
         assertEquals("HTTP/1.1", _methodOrVersion);
@@ -935,7 +1023,7 @@
                         + "\015\012"
                         + "0123456789\015\012");
 
-        HttpParser.ResponseHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.ResponseHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.atEOF();
         parser.parseNext(buffer);
@@ -957,7 +1045,7 @@
                         + "Content-Length: 10\015\012"
                         + "\015\012");
 
-        HttpParser.ResponseHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.ResponseHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
         assertEquals("HTTP/1.1", _methodOrVersion);
@@ -976,7 +1064,7 @@
                         + "Transfer-Encoding: chunked\015\012"
                         + "\015\012");
 
-        HttpParser.ResponseHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.ResponseHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
         assertEquals("HTTP/1.1", _methodOrVersion);
@@ -999,7 +1087,7 @@
                         + "HTTP/1.1 400 OK\015\012");  // extra data causes close ??
 
 
-        HttpParser.ResponseHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.ResponseHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
 
         parser.parseNext(buffer);
@@ -1009,11 +1097,15 @@
         assertEquals(null,_content);
         assertTrue(_headerCompleted);
         assertTrue(_messageCompleted);
-
+        
+        parser.close();
         parser.reset();
         parser.parseNext(buffer);
         assertFalse(buffer.hasRemaining());
-        assertTrue(parser.isClosed());
+        assertEquals(HttpParser.State.CLOSE,parser.getState());
+        parser.atEOF();
+        parser.parseNext(BufferUtil.EMPTY_BUFFER);
+        assertEquals(HttpParser.State.CLOSED,parser.getState());
     }
     
     
@@ -1027,13 +1119,16 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
 
         parser.parseNext(buffer);
         assertEquals(null,_methodOrVersion);
         assertEquals("No URI",_bad);
         assertFalse(buffer.hasRemaining());
+        assertEquals(HttpParser.State.CLOSE,parser.getState());
+        parser.atEOF();
+        parser.parseNext(BufferUtil.EMPTY_BUFFER);
         assertEquals(HttpParser.State.CLOSED,parser.getState());
     }
 
@@ -1047,13 +1142,16 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
 
         parser.parseNext(buffer);
         assertEquals(null,_methodOrVersion);
         assertEquals("No URI",_bad);
         assertFalse(buffer.hasRemaining());
+        assertEquals(HttpParser.State.CLOSE,parser.getState());
+        parser.atEOF();
+        parser.parseNext(BufferUtil.EMPTY_BUFFER);
         assertEquals(HttpParser.State.CLOSED,parser.getState());
     }
 
@@ -1066,14 +1164,18 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.ResponseHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.ResponseHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
 
         parser.parseNext(buffer);
         assertEquals(null,_methodOrVersion);
         assertEquals("Unknown Version",_bad);
         assertFalse(buffer.hasRemaining());
+        assertEquals(HttpParser.State.CLOSE,parser.getState());
+        parser.atEOF();
+        parser.parseNext(BufferUtil.EMPTY_BUFFER);
         assertEquals(HttpParser.State.CLOSED,parser.getState());
+        
     }
 
     @Test
@@ -1085,13 +1187,16 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.ResponseHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.ResponseHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
 
         parser.parseNext(buffer);
         assertEquals(null,_methodOrVersion);
         assertEquals("No Status",_bad);
         assertFalse(buffer.hasRemaining());
+        assertEquals(HttpParser.State.CLOSE,parser.getState());
+        parser.atEOF();
+        parser.parseNext(BufferUtil.EMPTY_BUFFER);
         assertEquals(HttpParser.State.CLOSED,parser.getState());
     }
 
@@ -1104,13 +1209,16 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.ResponseHandler<ByteBuffer> handler = new Handler();
+        HttpParser.ResponseHandler handler = new Handler();
         HttpParser parser= new HttpParser(handler);
         
         parser.parseNext(buffer);
         assertEquals(null,_methodOrVersion);
         assertEquals("No Status",_bad);
         assertFalse(buffer.hasRemaining());
+        assertEquals(HttpParser.State.CLOSE,parser.getState());
+        parser.atEOF();
+        parser.parseNext(BufferUtil.EMPTY_BUFFER);
         assertEquals(HttpParser.State.CLOSED,parser.getState());
     }
 
@@ -1123,14 +1231,17 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler = new Handler();
+        HttpParser.RequestHandler handler = new Handler();
         HttpParser parser= new HttpParser(handler);
 
         parser.parseNext(buffer);
         assertEquals(null,_methodOrVersion);
         assertEquals("Unknown Version",_bad);
         assertFalse(buffer.hasRemaining());
-        assertEquals(HttpParser.State.CLOSED,parser.getState()); 
+        assertEquals(HttpParser.State.CLOSE,parser.getState());
+        parser.atEOF();
+        parser.parseNext(BufferUtil.EMPTY_BUFFER);
+        assertEquals(HttpParser.State.CLOSED,parser.getState());
         
         buffer= BufferUtil.toBuffer(
             "GET / HTTP/1.01\015\012"
@@ -1145,6 +1256,9 @@
         assertEquals(null,_methodOrVersion);
         assertEquals("Unknown Version",_bad);
         assertFalse(buffer.hasRemaining());
+        assertEquals(HttpParser.State.CLOSE,parser.getState());
+        parser.atEOF();
+        parser.parseNext(BufferUtil.EMPTY_BUFFER);
         assertEquals(HttpParser.State.CLOSED,parser.getState());
     }
     
@@ -1157,12 +1271,15 @@
                         + "Connection: close\r"
                         + "\r");
 
-        HttpParser.RequestHandler<ByteBuffer> handler = new Handler();
+        HttpParser.RequestHandler handler = new Handler();
         HttpParser parser= new HttpParser(handler);
 
         parser.parseNext(buffer);
         assertEquals("Bad EOL",_bad);
         assertFalse(buffer.hasRemaining());
+        assertEquals(HttpParser.State.CLOSE,parser.getState());
+        parser.atEOF();
+        parser.parseNext(BufferUtil.EMPTY_BUFFER);
         assertEquals(HttpParser.State.CLOSED,parser.getState());
 
 
@@ -1178,6 +1295,9 @@
         parser.parseNext(buffer);
         assertEquals("Bad EOL",_bad);
         assertFalse(buffer.hasRemaining());
+        assertEquals(HttpParser.State.CLOSE,parser.getState());
+        parser.atEOF();
+        parser.parseNext(BufferUtil.EMPTY_BUFFER);
         assertEquals(HttpParser.State.CLOSED,parser.getState());
     }
     
@@ -1193,13 +1313,16 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
 
         parser.parseNext(buffer);
         assertEquals("GET",_methodOrVersion);
         assertEquals("Bad Content-Length",_bad);
         assertFalse(buffer.hasRemaining());
+        assertEquals(HttpParser.State.CLOSE,parser.getState());
+        parser.atEOF();
+        parser.parseNext(BufferUtil.EMPTY_BUFFER);
         assertEquals(HttpParser.State.CLOSED,parser.getState());
     }
 
@@ -1212,13 +1335,16 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
 
         parser.parseNext(buffer);
         assertEquals("GET",_methodOrVersion);
         assertEquals("Bad Content-Length",_bad);
         assertFalse(buffer.hasRemaining());
+        assertEquals(HttpParser.State.CLOSE,parser.getState());
+        parser.atEOF();
+        parser.parseNext(BufferUtil.EMPTY_BUFFER);
         assertEquals(HttpParser.State.CLOSED,parser.getState());
     }
 
@@ -1231,13 +1357,16 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
 
         parser.parseNext(buffer);
         assertEquals("GET",_methodOrVersion);
         assertEquals("Bad Content-Length",_bad);
         assertFalse(buffer.hasRemaining());
+        assertEquals(HttpParser.State.CLOSE,parser.getState());
+        parser.atEOF();
+        parser.parseNext(BufferUtil.EMPTY_BUFFER);
         assertEquals(HttpParser.State.CLOSED,parser.getState());
     }
     
@@ -1250,7 +1379,7 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
         assertEquals("host",_host);
@@ -1265,7 +1394,7 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
         assertEquals("No Host",_bad);
@@ -1280,7 +1409,7 @@
                 "GET http://host/ HTTP/1.0\015\012"
                         + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
         Assert.assertNull(_bad);
@@ -1296,7 +1425,7 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
         assertEquals("No Host",_bad);
@@ -1311,7 +1440,7 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
         assertEquals("192.168.0.1",_host);
@@ -1327,7 +1456,7 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
         assertEquals("[::1]",_host);
@@ -1343,10 +1472,10 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
-        assertEquals("Bad IPv6 Host header",_bad);
+        Assert.assertThat(_bad,Matchers.containsString("Bad"));
     }
     
     @Test
@@ -1358,7 +1487,7 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
         assertEquals("myhost",_host);
@@ -1370,14 +1499,14 @@
     {
         ByteBuffer buffer= BufferUtil.toBuffer(
                 "GET / HTTP/1.1\015\012"
-                        + "Host: myhost:xxx\015\012"
+                        + "Host: myhost:testBadPort\015\012"
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
-        assertEquals("Bad Host header",_bad);
+        Assert.assertThat(_bad,Matchers.containsString("Bad Host"));
     }
 
     @Test
@@ -1389,7 +1518,7 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
         assertEquals("192.168.0.1",_host);
@@ -1405,7 +1534,7 @@
                         + "Connection: close\015\012"
                         + "\015\012");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
         assertEquals("[::1]",_host);
@@ -1420,7 +1549,7 @@
             "Host: www.smh.com.au\r\n"+
             "\r\n");
         
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
         assertEquals("www.smh.com.au",parser.getFieldCache().get("Host: www.smh.com.au").getValue());
@@ -1435,63 +1564,6 @@
     }
 
     @Test
-    public void testProxyProtocol() throws Exception
-    {
-        ByteBuffer buffer=BufferUtil
-            .toBuffer("PROXY TCP4 107.47.45.254 10.0.1.116 27689 80\015\012"
-                +"GET / HTTP/1.1\015\012"
-                +"Host: localhost \015\012"
-                +"Connection: close\015\012"+"\015\012"+"\015\012");
-
-        Handler handler=new Handler();
-        HttpParser parser=new HttpParser((HttpParser.RequestHandler)handler);
-        parseAll(parser, buffer);
-
-        assertTrue(_headerCompleted);
-        assertTrue(_messageCompleted);
-        assertEquals("GET", _methodOrVersion);
-        assertEquals("/", _uriOrStatus);
-        assertEquals("HTTP/1.1", _versionOrReason);
-        assertEquals("PROXY TCP4 107.47.45.254 10.0.1.116 27689 80", handler._proxy);
-        assertEquals("Host", _hdr[0]);
-        assertEquals("localhost", _val[0]);
-        assertEquals("Connection", _hdr[1]);
-        assertEquals("close", _val[1]);
-        assertEquals(1, _headers);
-    }
-
-    @Test
-    public void testSplitProxyHeaderParseTest() throws Exception
-    {
-        Handler handler=new Handler();
-        HttpParser parser=new HttpParser((HttpParser.RequestHandler)handler);
-
-        ByteBuffer buffer=BufferUtil.toBuffer("PROXY TCP4 207.47.45.254 10.0.1.116 27689 80\015\012");
-        parser.parseNext(buffer);
-
-        buffer=BufferUtil.toBuffer(
-            "GET / HTTP/1.1\015\012"
-                +"Host: localhost \015\012"
-                +"Connection: close\015\012"
-                +"\015\012"
-                +"\015\012");
-
-        parser.parseNext(buffer);
-        assertTrue(_headerCompleted);
-        assertTrue(_messageCompleted);
-        assertEquals("GET", _methodOrVersion);
-        assertEquals("/", _uriOrStatus);
-        assertEquals("HTTP/1.1", _versionOrReason);
-        assertEquals("PROXY TCP4 207.47.45.254 10.0.1.116 27689 80", handler._proxy);
-        assertEquals("Host", _hdr[0]);
-        assertEquals("localhost", _val[0]);
-        assertEquals("Connection", _hdr[1]);
-        assertEquals("close", _val[1]);
-        assertEquals(1, _headers);
-    }
-    
-
-    @Test
     public void testFolded() throws Exception
     {
         ByteBuffer buffer= BufferUtil.toBuffer(
@@ -1502,22 +1574,12 @@
                 "\taction=\"xxx\" \015\012" +
                 "\015\012");
         
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
 
-        assertTrue(_headerCompleted);
-        assertTrue(_messageCompleted);
-        assertEquals("GET", _methodOrVersion);
-        assertEquals("/", _uriOrStatus);
-        assertEquals("HTTP/1.0", _versionOrReason);
-        assertEquals("Host", _hdr[0]);
-        assertEquals("localhost", _val[0]);
-        assertEquals("Connection", _hdr[1]);
-        assertEquals("close", _val[1]);
-        assertEquals("Content-Type", _hdr[2]);
-        assertEquals("application/soap+xml; charset=utf-8; action=\"xxx\"", _val[2]);
-        assertEquals(2, _headers);
+        assertFalse(_headerCompleted);
+        assertEquals(_bad, "Bad Continuation");
     }
 
     
@@ -1533,7 +1595,7 @@
                 "Accept: unknown\r\n" + 
                 "\r\n");
 
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parser.parseNext(buffer);
 
@@ -1560,7 +1622,7 @@
                 "SM\015\012"+
                 "\015\012");
         
-        HttpParser.RequestHandler<ByteBuffer> handler  = new Handler();
+        HttpParser.RequestHandler handler  = new Handler();
         HttpParser parser= new HttpParser(handler);
         parseAll(parser,buffer);
 
@@ -1605,7 +1667,7 @@
     private boolean _headerCompleted;
     private boolean _messageCompleted;
 
-    private class Handler implements HttpParser.RequestHandler<ByteBuffer>, HttpParser.ResponseHandler<ByteBuffer>, HttpParser.ProxyHandler
+    private class Handler implements HttpParser.RequestHandler, HttpParser.ResponseHandler
     {
         private HttpFields fields;
         String _proxy;
@@ -1623,14 +1685,14 @@
         }
 
         @Override
-        public boolean startRequest(HttpMethod httpMethod, String method, ByteBuffer uri, HttpVersion version)
+        public boolean startRequest(String method, String uri, HttpVersion version)
         {
             _fields.clear();
             _headers= -1;
             _hdr= new String[10];
             _val= new String[10];
             _methodOrVersion= method;
-            _uriOrStatus= BufferUtil.toUTF8String(uri);
+            _uriOrStatus= uri.toString();
             _versionOrReason= version==null?null:version.asString();
 
             fields=new HttpFields();
@@ -1641,21 +1703,19 @@
         }
 
         @Override
-        public boolean parsedHeader(HttpField field)
+        public void parsedHeader(HttpField field)
         {
             _fields.add(field);
             //System.err.println("header "+name+": "+value);
             _hdr[++_headers]= field.getName();
             _val[_headers]= field.getValue();
-            return false;
-        }
-
-        @Override
-        public boolean parsedHostHeader(String host,int port)
-        {
-            _host=host;
-            _port=port;
-            return false;
+            
+            if (field instanceof HostPortHttpField)
+            {
+                HostPortHttpField hpfield = (HostPortHttpField)field;
+                _host=hpfield.getHost();
+                _port=hpfield.getPort();
+            }
         }
 
         @Override
@@ -1716,11 +1776,5 @@
         {
             return 512;
         }
-
-        @Override
-        public void proxied(String protocol, String sAddr, String dAddr, int sPort, int dPort)
-        {
-            _proxy="PROXY "+protocol+" "+sAddr+" "+dAddr+" "+sPort+" "+dPort;
-        }
     }
 }
diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpTester.java b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpTester.java
new file mode 100644
index 0000000..c901205
--- /dev/null
+++ b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpTester.java
@@ -0,0 +1,358 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.StringUtil;
+
+public class HttpTester
+{
+    private HttpTester()
+    {
+    }
+
+    public static Request newRequest()
+    {
+        return new Request();
+    }
+
+    public static Request parseRequest(String request)
+    {
+        Request r=new Request();
+        HttpParser parser =new HttpParser(r);
+        parser.parseNext(BufferUtil.toBuffer(request));
+        return r;
+    }
+
+    public static Request parseRequest(ByteBuffer request)
+    {
+        Request r=new Request();
+        HttpParser parser =new HttpParser(r);
+        parser.parseNext(request);
+        return r;
+    }
+
+    public static Response parseResponse(String response)
+    {
+        Response r=new Response();
+        HttpParser parser =new HttpParser(r);
+        parser.parseNext(BufferUtil.toBuffer(response));
+        return r;
+    }
+
+    public static Response parseResponse(ByteBuffer response)
+    {
+        Response r=new Response();
+        HttpParser parser =new HttpParser(r);
+        parser.parseNext(response);
+        return r;
+    }
+
+
+    public abstract static class Message extends HttpFields implements HttpParser.HttpHandler
+    {
+        ByteArrayOutputStream _content;
+        HttpVersion _version=HttpVersion.HTTP_1_0;
+
+        public HttpVersion getVersion()
+        {
+            return _version;
+        }
+
+        public void setVersion(String version)
+        {
+            setVersion(HttpVersion.CACHE.get(version));
+        }
+
+        public void setVersion(HttpVersion version)
+        {
+            _version=version;
+        }
+
+        public void setContent(byte[] bytes)
+        {
+            try
+            {
+                _content=new ByteArrayOutputStream();
+                _content.write(bytes);
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+        }
+
+        public void setContent(String content)
+        {
+            try
+            {
+                _content=new ByteArrayOutputStream();
+                _content.write(StringUtil.getBytes(content));
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+        }
+
+        public void setContent(ByteBuffer content)
+        {
+            try
+            {
+                _content=new ByteArrayOutputStream();
+                _content.write(BufferUtil.toArray(content));
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+        }
+        @Override
+        public void parsedHeader(HttpField field)
+        {
+            put(field.getName(),field.getValue());
+        }
+
+        @Override
+        public boolean messageComplete()
+        {
+            return true;
+        }
+
+        @Override
+        public boolean headerComplete()
+        {
+            _content=new ByteArrayOutputStream();
+            return false;
+        }
+
+        @Override
+        public void earlyEOF()
+        {
+        }
+
+        @Override
+        public boolean content(ByteBuffer ref)
+        {
+            try
+            {
+                _content.write(BufferUtil.toArray(ref));
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+            return false;
+        }
+
+        @Override
+        public void badMessage(int status, String reason)
+        {
+            throw new RuntimeException(reason);
+        }
+
+        public ByteBuffer generate()
+        {
+            try
+            {
+                HttpGenerator generator = new HttpGenerator();
+                MetaData info = getInfo();
+                // System.err.println(info.getClass());
+                // System.err.println(info);
+
+                ByteArrayOutputStream out = new ByteArrayOutputStream();
+                ByteBuffer header=null;
+                ByteBuffer chunk=null;
+                ByteBuffer content=_content==null?null:ByteBuffer.wrap(_content.toByteArray());
+
+
+                loop: while(!generator.isEnd())
+                {
+                    HttpGenerator.Result result =  info instanceof MetaData.Request
+                        ?generator.generateRequest((MetaData.Request)info,header,chunk,content,true)
+                        :generator.generateResponse((MetaData.Response)info,false,header,chunk,content,true);
+                    switch(result)
+                    {
+                        case NEED_HEADER:
+                            header=BufferUtil.allocate(8192);
+                            continue;
+
+                        case NEED_CHUNK:
+                            chunk=BufferUtil.allocate(HttpGenerator.CHUNK_SIZE);
+                            continue;
+
+                        case NEED_INFO:
+                            throw new IllegalStateException();
+
+                        case FLUSH:
+                            if (BufferUtil.hasContent(header))
+                            {
+                                out.write(BufferUtil.toArray(header));
+                                BufferUtil.clear(header);
+                            }
+                            if (BufferUtil.hasContent(chunk))
+                            {
+                                out.write(BufferUtil.toArray(chunk));
+                                BufferUtil.clear(chunk);
+                            }
+                            if (BufferUtil.hasContent(content))
+                            {
+                                out.write(BufferUtil.toArray(content));
+                                BufferUtil.clear(content);
+                            }
+                            break;
+
+                        case SHUTDOWN_OUT:
+                            break loop;
+                    }
+                }
+
+                return ByteBuffer.wrap(out.toByteArray());
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+
+        }
+        abstract public MetaData getInfo();
+
+        @Override
+        public int getHeaderCacheSize()
+        {
+            return 0;
+        }
+
+    }
+
+    public static class Request extends Message implements HttpParser.RequestHandler
+    {
+        private String _method;
+        private String _uri;
+
+        @Override
+        public boolean startRequest(String method, String uri, HttpVersion version)
+        {
+            _method=method;
+            _uri=uri.toString();
+            _version=version;
+            return false;
+        }
+
+        public String getMethod()
+        {
+            return _method;
+        }
+
+        public String getUri()
+        {
+            return _uri;
+        }
+
+        public void setMethod(String method)
+        {
+            _method=method;
+        }
+
+        public void setURI(String uri)
+        {
+            _uri=uri;
+        }
+
+        @Override
+        public MetaData.Request getInfo()
+        {
+            return new MetaData.Request(_method,new HttpURI(_uri),_version,this,_content==null?0:_content.size());
+        }
+
+        @Override
+        public String toString()
+        {
+            return String.format("%s %s %s\n%s\n",_method,_uri,_version,super.toString());
+        }
+
+        public void setHeader(String name, String value)
+        {
+            put(name,value);
+        }
+    }
+
+    public static class Response extends Message implements HttpParser.ResponseHandler
+    {
+        private int _status;
+        private String _reason;
+
+        @Override
+        public boolean startResponse(HttpVersion version, int status, String reason)
+        {
+            _version=version;
+            _status=status;
+            _reason=reason;
+            return false;
+        }
+
+        public int getStatus()
+        {
+            return _status;
+        }
+
+        public String getReason()
+        {
+            return _reason;
+        }
+
+        public byte[] getContentBytes()
+        {
+            if (_content==null)
+                return null;
+            return _content.toByteArray();
+        }
+
+        public String getContent()
+        {
+            if (_content==null)
+                return null;
+            byte[] bytes=_content.toByteArray();
+
+            String content_type=get(HttpHeader.CONTENT_TYPE);
+            String encoding=MimeTypes.getCharsetFromContentType(content_type);
+            Charset charset=encoding==null?StandardCharsets.UTF_8:Charset.forName(encoding);
+
+            return new String(bytes,charset);
+        }
+
+        @Override
+        public MetaData.Response getInfo()
+        {
+            return new MetaData.Response(_version,_status,_reason,this,_content==null?-1:_content.size());
+        }
+
+        @Override
+        public String toString()
+        {
+            return String.format("%s %s %s\n%s\n",_version,_status,_reason,super.toString());
+        }
+    }
+}
diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpURIParseTest.java b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpURIParseTest.java
new file mode 100644
index 0000000..232b5de
--- /dev/null
+++ b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpURIParseTest.java
@@ -0,0 +1,275 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.http;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+import static org.junit.Assume.*;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.jetty.util.URIUtil;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+
+@RunWith(Parameterized.class)
+public class HttpURIParseTest
+{
+    @Parameters(name="{0}")
+    public static List<String[]> data()
+    {
+        String[][] tests = {
+
+        // Nothing but path 
+        {"path",null,null,"-1","path",null,null,null},
+        {"path/path",null,null,"-1","path/path",null,null,null},
+        {"%65ncoded/path",null,null,"-1","%65ncoded/path",null,null,null},
+                
+        // Basic path reference     
+        {"/path/to/context",null,null,"-1","/path/to/context",null,null,null},
+        
+        // Basic with encoded query 
+        {"http://example.com/path/to/context;param?query=%22value%22#fragment","http","example.com","-1","/path/to/context;param","param","query=%22value%22","fragment"},
+        {"http://[::1]/path/to/context;param?query=%22value%22#fragment","http","[::1]","-1","/path/to/context;param","param","query=%22value%22","fragment"},
+        
+        // Basic with parameters and query
+        {"http://example.com:8080/path/to/context;param?query=%22value%22#fragment","http","example.com","8080","/path/to/context;param","param","query=%22value%22","fragment"},
+        {"http://[::1]:8080/path/to/context;param?query=%22value%22#fragment","http","[::1]","8080","/path/to/context;param","param","query=%22value%22","fragment"},
+        
+        // Path References
+        {"/path/info",null,null,null,"/path/info",null,null,null},
+        {"/path/info#fragment",null,null,null,"/path/info",null,null,"fragment"},
+        {"/path/info?query",null,null,null,"/path/info",null,"query",null},
+        {"/path/info?query#fragment",null,null,null,"/path/info",null,"query","fragment"},
+        {"/path/info;param",null,null,null,"/path/info;param","param",null,null},
+        {"/path/info;param#fragment",null,null,null,"/path/info;param","param",null,"fragment"},
+        {"/path/info;param?query",null,null,null,"/path/info;param","param","query",null},
+        {"/path/info;param?query#fragment",null,null,null,"/path/info;param","param","query","fragment"},
+        
+        // Protocol Less (aka scheme-less) URIs
+        {"//host/path/info",null,"host",null,"/path/info",null,null,null},
+        {"//user@host/path/info",null,"host",null,"/path/info",null,null,null},
+        {"//user@host:8080/path/info",null,"host","8080","/path/info",null,null,null},
+        {"//host:8080/path/info",null,"host","8080","/path/info",null,null,null},
+        
+        // Host Less 
+        {"http:/path/info","http",null,null,"/path/info",null,null,null},
+        {"http:/path/info#fragment","http",null,null,"/path/info",null,null,"fragment"},
+        {"http:/path/info?query","http",null,null,"/path/info",null,"query",null},
+        {"http:/path/info?query#fragment","http",null,null,"/path/info",null,"query","fragment"},
+        {"http:/path/info;param","http",null,null,"/path/info;param","param",null,null},
+        {"http:/path/info;param#fragment","http",null,null,"/path/info;param","param",null,"fragment"},
+        {"http:/path/info;param?query","http",null,null,"/path/info;param","param","query",null},
+        {"http:/path/info;param?query#fragment","http",null,null,"/path/info;param","param","query","fragment"},
+        
+        // Everything and the kitchen sink
+        {"http://user@host:8080/path/info;param?query#fragment","http","host","8080","/path/info;param","param","query","fragment"},
+        {"xxxxx://user@host:8080/path/info;param?query#fragment","xxxxx","host","8080","/path/info;param","param","query","fragment"},
+        
+        // No host, parameter with no content
+        {"http:///;?#","http",null,null,"/;","","",""},
+        
+        // Path with query that has no value
+        {"/path/info?a=?query",null,null,null,"/path/info",null,"a=?query",null},
+        
+        // Path with query alt syntax
+        {"/path/info?a=;query",null,null,null,"/path/info",null,"a=;query",null},
+        
+        // Scheme-less, with host and port (overlapping with path)
+        {"//host:8080//",null,"host","8080","//",null,null,null},
+        
+        // File reference
+        {"file:///path/info","file",null,null,"/path/info",null,null,null},
+        {"file:/path/info","file",null,null,"/path/info",null,null,null},
+        
+        // Bad URI (no scheme, no host, no path) 
+        {"//",null,null,null,null,null,null,null},
+        
+        // Simple localhost references
+        {"http://localhost/","http","localhost",null,"/",null,null,null},
+        {"http://localhost:8080/", "http", "localhost","8080","/", null, null,null},
+        {"http://localhost/?x=y", "http", "localhost",null,"/", null,"x=y",null},
+        
+        // Simple path with parameter 
+        {"/;param",null, null,null,"/;param", "param",null,null},
+        {";param",null, null,null,";param", "param",null,null},
+        
+        // Simple path with query
+        {"/?x=y",null, null,null,"/", null,"x=y",null},
+        {"/?abc=test",null, null,null,"/", null,"abc=test",null},
+        
+        // Simple path with fragment
+        {"/#fragment",null, null,null,"/", null,null,"fragment"},
+        
+        // Simple IPv4 host with port (default path)
+        {"http://192.0.0.1:8080/","http","192.0.0.1","8080","/",null,null,null},
+        
+        // Simple IPv6 host with port (default path)
+        
+        {"http://[2001:db8::1]:8080/","http","[2001:db8::1]","8080","/",null,null,null},
+        // IPv6 authenticated host with port (default path)
+        
+        {"http://user@[2001:db8::1]:8080/","http","[2001:db8::1]","8080","/",null,null,null},
+        
+        // Simple IPv6 host no port (default path)
+        {"http://[2001:db8::1]/","http","[2001:db8::1]",null,"/",null,null,null},
+        
+        // Scheme-less IPv6, host with port (default path)
+        {"//[2001:db8::1]:8080/",null,"[2001:db8::1]","8080","/",null,null,null},
+        
+        // Interpreted as relative path of "*" (no host/port/scheme/query/fragment)
+        {"*",null,null,null,"*",null, null,null},
+
+        // Path detection Tests (seen from JSP/JSTL and <c:url> use
+        {"http://host:8080/path/info?q1=v1&q2=v2","http","host","8080","/path/info",null,"q1=v1&q2=v2",null},
+        {"/path/info?q1=v1&q2=v2",null,null,null,"/path/info",null,"q1=v1&q2=v2",null},
+        {"/info?q1=v1&q2=v2",null,null,null,"/info",null,"q1=v1&q2=v2",null},
+        {"info?q1=v1&q2=v2",null,null,null,"info",null,"q1=v1&q2=v2",null},
+        {"info;q1=v1?q2=v2",null,null,null,"info;q1=v1","q1=v1","q2=v2",null},
+        
+        // Path-less, query only (seen from JSP/JSTL and <c:url> use
+        {"?q1=v1&q2=v2",null,null,null,"",null,"q1=v1&q2=v2",null}
+        };
+        
+        return Arrays.asList(tests);
+    }
+    
+    @Parameter(0)
+    public String input;
+
+    @Parameter(1)
+    public String scheme;
+    
+    @Parameter(2)
+    public String host;
+    
+    @Parameter(3)
+    public String port;
+
+    @Parameter(4)
+    public String path;
+    
+    @Parameter(5)
+    public String param;
+    
+    @Parameter(6)
+    public String query;
+    
+    @Parameter(7)
+    public String fragment;
+    
+    @Test
+    public void testParseString() throws Exception
+    {
+        HttpURI httpUri = new HttpURI(input);
+        
+        try
+        {
+            new URI(input);
+            // URI is valid (per java.net.URI parsing)
+            
+            // Test case sanity check
+            assertThat("[" + input + "] expected path (test case) cannot be null",path,notNullValue());
+
+            // Assert expectations
+            assertThat("[" + input + "] .scheme",httpUri.getScheme(),is(scheme));
+            assertThat("[" + input + "] .host",httpUri.getHost(),is(host));
+            assertThat("[" + input + "] .port",httpUri.getPort(),is(port == null ? -1 : Integer.parseInt(port)));
+            assertThat("[" + input + "] .path",httpUri.getPath(),is(path));
+            assertThat("[" + input + "] .param",httpUri.getParam(),is(param));
+            assertThat("[" + input + "] .query",httpUri.getQuery(),is(query));
+            assertThat("[" + input + "] .fragment",httpUri.getFragment(),is(fragment));
+            assertThat("[" + input + "] .toString",httpUri.toString(),is(input));
+        }
+        catch (URISyntaxException e)
+        {
+            // Assert HttpURI values for invalid URI (such as "//")
+            assertThat("[" + input + "] .scheme",httpUri.getScheme(),is(nullValue()));
+            assertThat("[" + input + "] .host",httpUri.getHost(),is(nullValue()));
+            assertThat("[" + input + "] .port",httpUri.getPort(),is(-1));
+            assertThat("[" + input + "] .path",httpUri.getPath(),is(nullValue()));
+            assertThat("[" + input + "] .param",httpUri.getParam(),is(nullValue()));
+            assertThat("[" + input + "] .query",httpUri.getQuery(),is(nullValue()));
+            assertThat("[" + input + "] .fragment",httpUri.getFragment(),is(nullValue()));
+        }
+    }
+    
+    @Test
+    public void testParseURI() throws Exception
+    {
+        URI javaUri = null;
+        try
+        {
+            javaUri = new URI(input);
+            assumeNotNull(javaUri);
+        }
+        catch (URISyntaxException e)
+        {
+            // Ignore, as URI is invalid anyway
+            assumeNoException(e);
+        }
+        
+        HttpURI httpUri = new HttpURI(javaUri);
+
+        assertThat("[" + input + "] .scheme",httpUri.getScheme(),is(scheme));
+        assertThat("[" + input + "] .host",httpUri.getHost(),is(host));
+        assertThat("[" + input + "] .port",httpUri.getPort(),is(port == null ? -1 : Integer.parseInt(port)));
+        assertThat("[" + input + "] .path",httpUri.getPath(),is(path));
+        assertThat("[" + input + "] .param",httpUri.getParam(),is(param));
+        assertThat("[" + input + "] .query",httpUri.getQuery(),is(query));
+        assertThat("[" + input + "] .fragment",httpUri.getFragment(),is(fragment));
+        
+        assertThat("[" + input + "] .toString",httpUri.toString(),is(input));
+    }
+    
+    @Test
+    public void testCompareToJavaNetURI() throws Exception
+    {
+        URI javaUri = null;
+        try
+        {
+            javaUri = new URI(input);
+            assumeNotNull(javaUri);
+        }
+        catch (URISyntaxException e)
+        {
+            // Ignore, as URI is invalid anyway
+            assumeNoException(e);
+        }
+        
+        HttpURI httpUri = new HttpURI(javaUri);
+        
+        assertThat("[" + input + "] .scheme",httpUri.getScheme(),is(javaUri.getScheme()));
+        assertThat("[" + input + "] .host",httpUri.getHost(),is(javaUri.getHost()));
+        assertThat("[" + input + "] .port",httpUri.getPort(),is(javaUri.getPort()));
+        assertThat("[" + input + "] .path",httpUri.getPath(),is(javaUri.getRawPath()));
+        // Not Relevant for java.net.URI -- assertThat("["+input+"] .param", httpUri.getParam(), is(param));
+        assertThat("[" + input + "] .query",httpUri.getQuery(),is(javaUri.getRawQuery()));
+        assertThat("[" + input + "] .fragment",httpUri.getFragment(),is(javaUri.getFragment()));
+        assertThat("[" + input + "] .toString",httpUri.toString(),is(javaUri.toASCIIString()));
+    }
+}
\ No newline at end of file
diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpURITest.java b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpURITest.java
index 419bb3d..9771b5c 100644
--- a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpURITest.java
+++ b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpURITest.java
@@ -19,61 +19,172 @@
 
 package org.eclipse.jetty.http;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
-import java.net.URI;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 
+import org.eclipse.jetty.util.MultiMap;
+import org.eclipse.jetty.util.Utf8Appendable;
+import org.junit.Assert;
 import org.junit.Test;
 
-
-/* ------------------------------------------------------------ */
 public class HttpURITest
 {
-    String[][] tests=
-    {
-        {"/path/to/context",null,null,"-1","/path/to/context",null,null,null},
-        {"http://example.com/path/to/context;param?query=%22value%22#fragment","http","example.com","-1","/path/to/context","param","query=%22value%22","fragment"},
-        {"http://[::1]/path/to/context;param?query=%22value%22#fragment","http","[::1]","-1","/path/to/context","param","query=%22value%22","fragment"},
-        {"http://example.com:8080/path/to/context;param?query=%22value%22#fragment","http","example.com","8080","/path/to/context","param","query=%22value%22","fragment"},
-        {"http://[::1]:8080/path/to/context;param?query=%22value%22#fragment","http","[::1]","8080","/path/to/context","param","query=%22value%22","fragment"},
-    };
-    
-    public static int
-    INPUT=0,SCHEME=1,HOST=2,PORT=3,PATH=4,PARAM=5,QUERY=6,FRAGMENT=7;
-
-    /* ------------------------------------------------------------ */
     @Test
-    public void testFromString() throws Exception
+    public void testInvalidAddress() throws Exception
     {
-        for (String[] test:tests)
-        {
-            HttpURI uri = new HttpURI(test[INPUT]);
+        assertInvalidURI("http://[ffff::1:8080/", "Invalid URL; no closing ']' -- should throw exception");
+        assertInvalidURI("**", "only '*', not '**'");
+        assertInvalidURI("*/", "only '*', not '*/'");
+    }
 
-            assertEquals(test[SCHEME], uri.getScheme());
-            assertEquals(test[HOST], uri.getHost());
-            assertEquals(Integer.parseInt(test[PORT]), uri.getPort());
-            assertEquals(test[PATH], uri.getPath());
-            assertEquals(test[PARAM], uri.getParam());
-            assertEquals(test[QUERY], uri.getQuery());
-            assertEquals(test[FRAGMENT], uri.getFragment());
+    private void assertInvalidURI(String invalidURI, String message)
+    {
+        HttpURI uri = new HttpURI();
+        try
+        {
+            uri.parse(invalidURI);
+            fail(message);
+        }
+        catch (IllegalArgumentException e)
+        {
+            assertTrue(true);
         }
     }
 
-    /* ------------------------------------------------------------ */
     @Test
-    public void testFromURI() throws Exception
+    public void testUnicodeErrors() throws UnsupportedEncodingException
     {
-        for (String[] test:tests)
+        String uri="http://server/path?invalid=data%uXXXXhere%u000";
+        try
         {
-            HttpURI uri = new HttpURI(new URI(test[INPUT]));
-
-            assertEquals(test[SCHEME], uri.getScheme());
-            assertEquals(test[HOST], uri.getHost());
-            assertEquals(Integer.parseInt(test[PORT]), uri.getPort());
-            assertEquals(test[PATH], uri.getPath());
-            assertEquals(test[PARAM], uri.getParam());
-            assertEquals(test[QUERY], uri.getQuery());
-            assertEquals(test[FRAGMENT], uri.getFragment());
+            URLDecoder.decode(uri,"UTF-8");
+            Assert.assertTrue(false);
         }
+        catch (IllegalArgumentException e)
+        {
+        }
+
+        HttpURI huri=new HttpURI(uri);
+        MultiMap<String> params = new MultiMap<>();
+        huri.decodeQueryTo(params);
+        assertEquals("data"+Utf8Appendable.REPLACEMENT+"here"+Utf8Appendable.REPLACEMENT,params.getValue("invalid",0));
+
+        huri=new HttpURI(uri);
+        params = new MultiMap<>();
+        huri.decodeQueryTo(params,StandardCharsets.UTF_8);
+        assertEquals("data"+Utf8Appendable.REPLACEMENT+"here"+Utf8Appendable.REPLACEMENT,params.getValue("invalid",0));
+
+    }
+
+    @Test
+    public void testExtB() throws Exception
+    {
+        for (String value: new String[]{"a","abcdABCD","\u00C0","\u697C","\uD869\uDED5","\uD840\uDC08"} )
+        {
+            HttpURI uri = new HttpURI("/path?value="+URLEncoder.encode(value,"UTF-8"));
+
+            MultiMap<String> parameters = new MultiMap<>();
+            uri.decodeQueryTo(parameters,StandardCharsets.UTF_8);
+            assertEquals(value,parameters.getString("value"));
+        }
+    }
+    
+
+    @Test
+    public void testParams() throws Exception
+    {
+        HttpURI uri = new HttpURI("/foo/bar");
+        assertEquals("/foo/bar",uri.getPath());
+        assertEquals("/foo/bar",uri.getDecodedPath());
+        assertEquals(null,uri.getParam());
+        
+        uri = new HttpURI("/foo/bar;jsessionid=12345");
+        assertEquals("/foo/bar;jsessionid=12345",uri.getPath());
+        assertEquals("/foo/bar",uri.getDecodedPath());
+        assertEquals("jsessionid=12345",uri.getParam());
+        
+        uri = new HttpURI("/foo;abc=123/bar;jsessionid=12345");
+        assertEquals("/foo;abc=123/bar;jsessionid=12345",uri.getPath());
+        assertEquals("/foo/bar",uri.getDecodedPath());
+        assertEquals("jsessionid=12345",uri.getParam());
+        
+        uri = new HttpURI("/foo;abc=123/bar;jsessionid=12345?name=value");
+        assertEquals("/foo;abc=123/bar;jsessionid=12345",uri.getPath());
+        assertEquals("/foo/bar",uri.getDecodedPath());
+        assertEquals("jsessionid=12345",uri.getParam());
+        
+        uri = new HttpURI("/foo;abc=123/bar;jsessionid=12345#target");
+        assertEquals("/foo;abc=123/bar;jsessionid=12345",uri.getPath());
+        assertEquals("/foo/bar",uri.getDecodedPath());
+        assertEquals("jsessionid=12345",uri.getParam());
+    }
+    
+    @Test
+    public void testMutableURI()
+    {
+        HttpURI uri = new HttpURI("/foo/bar");
+        assertEquals("/foo/bar",uri.toString());
+        assertEquals("/foo/bar",uri.getPath());
+        assertEquals("/foo/bar",uri.getDecodedPath());
+
+        uri.setScheme("http");
+        assertEquals("http:/foo/bar",uri.toString());
+        assertEquals("/foo/bar",uri.getPath());
+        assertEquals("/foo/bar",uri.getDecodedPath());
+
+        uri.setAuthority("host",0);
+        assertEquals("http://host/foo/bar",uri.toString());
+        assertEquals("/foo/bar",uri.getPath());
+        assertEquals("/foo/bar",uri.getDecodedPath());
+
+        uri.setAuthority("host",8888);
+        assertEquals("http://host:8888/foo/bar",uri.toString());
+        assertEquals("/foo/bar",uri.getPath());
+        assertEquals("/foo/bar",uri.getDecodedPath());
+        
+        uri.setPathQuery("/f%30%30;p0/bar;p1;p2");
+        assertEquals("http://host:8888/f%30%30;p0/bar;p1;p2",uri.toString());
+        assertEquals("/f%30%30;p0/bar;p1;p2",uri.getPath());
+        assertEquals("/f00/bar",uri.getDecodedPath());
+        assertEquals("p2",uri.getParam());
+        assertEquals(null,uri.getQuery());
+        
+        uri.setPathQuery("/f%30%30;p0/bar;p1;p2?name=value");
+        assertEquals("http://host:8888/f%30%30;p0/bar;p1;p2?name=value",uri.toString());
+        assertEquals("/f%30%30;p0/bar;p1;p2",uri.getPath());
+        assertEquals("/f00/bar",uri.getDecodedPath());
+        assertEquals("p2",uri.getParam());
+        assertEquals("name=value",uri.getQuery());
+        
+        uri.setQuery("other=123456");
+        assertEquals("http://host:8888/f%30%30;p0/bar;p1;p2?other=123456",uri.toString());
+        assertEquals("/f%30%30;p0/bar;p1;p2",uri.getPath());
+        assertEquals("/f00/bar",uri.getDecodedPath());
+        assertEquals("p2",uri.getParam());
+        assertEquals("other=123456",uri.getQuery());
+    }
+
+    @Test
+    public void testSchemeAndOrAuthority() throws Exception
+    {
+        HttpURI uri = new HttpURI("/path/info");
+        assertEquals("/path/info",uri.toString());
+        
+        uri.setAuthority("host",0);
+        assertEquals("//host/path/info",uri.toString());
+        
+        uri.setAuthority("host",8888);
+        assertEquals("//host:8888/path/info",uri.toString());
+        
+        uri.setScheme("http");
+        assertEquals("http://host:8888/path/info",uri.toString());
+        
+        uri.setAuthority(null,0);
+        assertEquals("http:/path/info",uri.toString());
+        
     }
 }
diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/MimeTypesTest.java b/jetty-http/src/test/java/org/eclipse/jetty/http/MimeTypesTest.java
index 493ee75..8e4935b 100644
--- a/jetty-http/src/test/java/org/eclipse/jetty/http/MimeTypesTest.java
+++ b/jetty-http/src/test/java/org/eclipse/jetty/http/MimeTypesTest.java
@@ -90,9 +90,9 @@
         assertEquals("abc",MimeTypes.getCharsetFromContentType("foo/bar other = param ; charset = abc"));
         assertEquals("abc",MimeTypes.getCharsetFromContentType("foo/bar other = param ; charset = \"abc\" ; some=else"));
         assertEquals(null,MimeTypes.getCharsetFromContentType("foo/bar"));
-        assertEquals("UTF-8",MimeTypes.getCharsetFromContentType("foo/bar;charset=uTf8"));
-        assertEquals("UTF-8",MimeTypes.getCharsetFromContentType("foo/bar;other=\"charset=abc\";charset=uTf8"));
-        assertEquals("UTF-8",MimeTypes.getCharsetFromContentType("text/html;charset=utf-8"));
+        assertEquals("utf-8",MimeTypes.getCharsetFromContentType("foo/bar;charset=uTf8"));
+        assertEquals("utf-8",MimeTypes.getCharsetFromContentType("foo/bar;other=\"charset=abc\";charset=uTf8"));
+        assertEquals("utf-8",MimeTypes.getCharsetFromContentType("text/html;charset=utf-8"));
 
     }
 
diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/PathMapTest.java b/jetty-http/src/test/java/org/eclipse/jetty/http/PathMapTest.java
index d9f706e..19f798a 100644
--- a/jetty-http/src/test/java/org/eclipse/jetty/http/PathMapTest.java
+++ b/jetty-http/src/test/java/org/eclipse/jetty/http/PathMapTest.java
@@ -22,7 +22,6 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -146,6 +145,7 @@
 
     /**
      * See JIRA issue: JETTY-88.
+     * @throws Exception failed test
      */
     @Test
     public void testPathMappingsOnlyMatchOnDirectoryNames() throws Exception
diff --git a/jetty-http2/http2-alpn-tests/pom.xml b/jetty-http2/http2-alpn-tests/pom.xml
new file mode 100644
index 0000000..1ef6e1e
--- /dev/null
+++ b/jetty-http2/http2-alpn-tests/pom.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.eclipse.jetty.http2</groupId>
+        <artifactId>http2-parent</artifactId>
+        <version>9.3.6-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>http2-alpn-tests</artifactId>
+    <name>Jetty :: HTTP2 :: ALPN Tests</name>
+
+    <properties>
+        <bundle-symbolic-name>${project.groupId}.alpn.tests</bundle-symbolic-name>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>copy</goal>
+                        </goals>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>org.mortbay.jetty.alpn</groupId>
+                                    <artifactId>alpn-boot</artifactId>
+                                    <version>${alpn.version}</version>
+                                    <type>jar</type>
+                                    <overWrite>false</overWrite>
+                                    <outputDirectory>${project.build.directory}/alpn</outputDirectory>
+                                </artifactItem>
+                            </artifactItems>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <argLine>-Xbootclasspath/p:${project.build.directory}/alpn/alpn-boot-${alpn.version}.jar</argLine>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.eclipse.jetty.alpn</groupId>
+            <artifactId>alpn-api</artifactId>
+            <version>${alpn.api.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-alpn-server</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-server</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty.http2</groupId>
+            <artifactId>http2-server</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty.toolchain</groupId>
+            <artifactId>jetty-test-helper</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    
+</project>
diff --git a/jetty-http2/http2-alpn-tests/src/test/java/org/eclipse/jetty/http2/alpn/tests/ALPNNegotiationTest.java b/jetty-http2/http2-alpn-tests/src/test/java/org/eclipse/jetty/http2/alpn/tests/ALPNNegotiationTest.java
new file mode 100644
index 0000000..d09ba25
--- /dev/null
+++ b/jetty-http2/http2-alpn-tests/src/test/java/org/eclipse/jetty/http2/alpn/tests/ALPNNegotiationTest.java
@@ -0,0 +1,312 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.alpn.tests;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLSocket;
+
+import org.eclipse.jetty.alpn.ALPN;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ALPNNegotiationTest extends AbstractALPNTest
+{
+    @Test
+    public void testGentleCloseDuringHandshake() throws Exception
+    {
+        InetSocketAddress address = prepare();
+        SslContextFactory sslContextFactory = newSslContextFactory();
+        sslContextFactory.start();
+        SSLEngine sslEngine = sslContextFactory.newSSLEngine(address);
+        sslEngine.setUseClientMode(true);
+        ALPN.put(sslEngine, new ALPN.ClientProvider()
+        {
+            @Override
+            public void unsupported()
+            {
+            }
+
+            @Override
+            public List<String> protocols()
+            {
+                return Arrays.asList("h2");
+            }
+
+            @Override
+            public void selected(String protocol)
+            {
+            }
+        });
+        sslEngine.beginHandshake();
+
+        ByteBuffer encrypted = ByteBuffer.allocate(sslEngine.getSession().getPacketBufferSize());
+        sslEngine.wrap(BufferUtil.EMPTY_BUFFER, encrypted);
+        encrypted.flip();
+
+        try (SocketChannel channel = SocketChannel.open(address))
+        {
+            // Send ClientHello, immediately followed by TLS Close Alert and then by FIN
+            channel.write(encrypted);
+            sslEngine.closeOutbound();
+            encrypted.clear();
+            sslEngine.wrap(BufferUtil.EMPTY_BUFFER, encrypted);
+            encrypted.flip();
+            channel.write(encrypted);
+            channel.shutdownOutput();
+
+            // Read ServerHello from server
+            encrypted.clear();
+            int read = channel.read(encrypted);
+            encrypted.flip();
+            Assert.assertTrue(read > 0);
+            // Cannot decrypt, as the SSLEngine has been already closed
+
+            // Now if we read more, we should either read the TLS Close Alert, or directly -1
+            encrypted.clear();
+            read = channel.read(encrypted);
+            // Sending a TLS Close Alert during handshake results in an exception when
+            // unwrapping that the server react to by closing the connection abruptly.
+            Assert.assertTrue(read < 0);
+        }
+    }
+
+    @Test
+    public void testAbruptCloseDuringHandshake() throws Exception
+    {
+        InetSocketAddress address = prepare();
+        SslContextFactory sslContextFactory = newSslContextFactory();
+        sslContextFactory.start();
+        SSLEngine sslEngine = sslContextFactory.newSSLEngine(address);
+        sslEngine.setUseClientMode(true);
+        ALPN.put(sslEngine, new ALPN.ClientProvider()
+        {
+            @Override
+            public void unsupported()
+            {
+            }
+
+            @Override
+            public List<String> protocols()
+            {
+                return Arrays.asList("h2");
+            }
+
+            @Override
+            public void selected(String s)
+            {
+            }
+        });
+        sslEngine.beginHandshake();
+
+        ByteBuffer encrypted = ByteBuffer.allocate(sslEngine.getSession().getPacketBufferSize());
+        sslEngine.wrap(BufferUtil.EMPTY_BUFFER, encrypted);
+        encrypted.flip();
+
+        try (SocketChannel channel = SocketChannel.open(address))
+        {
+            // Send ClientHello, immediately followed by FIN (no TLS Close Alert)
+            channel.write(encrypted);
+            channel.shutdownOutput();
+
+            // Read ServerHello from server
+            encrypted.clear();
+            int read = channel.read(encrypted);
+            encrypted.flip();
+            Assert.assertTrue(read > 0);
+            ByteBuffer decrypted = ByteBuffer.allocate(sslEngine.getSession().getApplicationBufferSize());
+            sslEngine.unwrap(encrypted, decrypted);
+
+            // Now if we read more, we should either read the TLS Close Alert, or directly -1
+            encrypted.clear();
+            read = channel.read(encrypted);
+            // Since we have close the connection abruptly, the server also does so
+            Assert.assertTrue(read < 0);
+        }
+    }
+
+    @Test
+    public void testClientAdvertisingHTTPServerSpeaksHTTP() throws Exception
+    {
+        InetSocketAddress address = prepare();
+
+        SslContextFactory sslContextFactory = newSslContextFactory();
+        sslContextFactory.start();
+        SSLContext sslContext = sslContextFactory.getSslContext();
+
+        try (SSLSocket client = (SSLSocket)sslContext.getSocketFactory().createSocket(address.getAddress(), address.getPort()))
+        {
+            client.setUseClientMode(true);
+            client.setSoTimeout(5000);
+
+            ALPN.put(client, new ALPN.ClientProvider()
+            {
+                @Override
+                public void unsupported()
+                {
+                }
+
+                @Override
+                public List<String> protocols()
+                {
+                    return Arrays.asList("http/1.1");
+                }
+
+                @Override
+                public void selected(String protocol)
+                {
+                    Assert.assertEquals("http/1.1", protocol);
+                }
+            });
+
+            client.startHandshake();
+
+            // Verify that the server really speaks http/1.1
+
+            OutputStream output = client.getOutputStream();
+            output.write(("" +
+                    "GET / HTTP/1.1\r\n" +
+                    "Host: localhost:" + address.getPort() + "\r\n" +
+                    "\r\n" +
+                    "").getBytes(StandardCharsets.UTF_8));
+            output.flush();
+
+            InputStream input = client.getInputStream();
+            BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
+            String line = reader.readLine();
+            Assert.assertTrue(line.contains(" 404 "));
+        }
+    }
+
+    @Test
+    public void testClientAdvertisingMultipleProtocolsServerSpeaksHTTPWhenNegotiated() throws Exception
+    {
+        InetSocketAddress address = prepare();
+
+        SslContextFactory sslContextFactory = newSslContextFactory();
+        sslContextFactory.start();
+        SSLContext sslContext = sslContextFactory.getSslContext();
+        try (SSLSocket client = (SSLSocket)sslContext.getSocketFactory().createSocket(address.getAddress(), address.getPort()))
+        {
+            client.setUseClientMode(true);
+            client.setSoTimeout(5000);
+
+            ALPN.put(client, new ALPN.ClientProvider()
+            {
+                @Override
+                public void unsupported()
+                {
+                }
+
+                @Override
+                public List<String> protocols()
+                {
+                    return Arrays.asList("unknown/1.0", "http/1.1");
+                }
+
+                @Override
+                public void selected(String protocol)
+                {
+                    Assert.assertEquals("http/1.1", protocol);
+                }
+            });
+
+            client.startHandshake();
+
+            // Verify that the server really speaks http/1.1
+
+            OutputStream output = client.getOutputStream();
+            output.write(("" +
+                    "GET / HTTP/1.1\r\n" +
+                    "Host: localhost:" + address.getPort() + "\r\n" +
+                    "\r\n" +
+                    "").getBytes(StandardCharsets.UTF_8));
+            output.flush();
+
+            InputStream input = client.getInputStream();
+            BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
+            String line = reader.readLine();
+            Assert.assertTrue(line.contains(" 404 "));
+        }
+    }
+
+    @Test
+    public void testClientNotSupportingALPNServerSpeaksDefaultProtocol() throws Exception
+    {
+        InetSocketAddress address = prepare();
+
+        SslContextFactory sslContextFactory = newSslContextFactory();
+        sslContextFactory.start();
+        SSLContext sslContext = sslContextFactory.getSslContext();
+        try (SSLSocket client = (SSLSocket)sslContext.getSocketFactory().createSocket(address.getAddress(), address.getPort()))
+        {
+            client.setUseClientMode(true);
+            client.setSoTimeout(5000);
+
+            ALPN.put(client, new ALPN.ClientProvider()
+            {
+                @Override
+                public void unsupported()
+                {
+                }
+
+                @Override
+                public List<String> protocols()
+                {
+                    return null;
+                }
+
+                @Override
+                public void selected(String s)
+                {
+                }
+            });
+
+            client.startHandshake();
+
+            // Verify that the server really speaks http/1.1
+
+            OutputStream output = client.getOutputStream();
+            output.write(("" +
+                    "GET / HTTP/1.1\r\n" +
+                    "Host: localhost:" + address.getPort() + "\r\n" +
+                    "\r\n" +
+                    "").getBytes(StandardCharsets.UTF_8));
+            output.flush();
+
+            InputStream input = client.getInputStream();
+            BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
+            String line = reader.readLine();
+            Assert.assertTrue(line.contains(" 404 "));
+        }
+    }
+}
diff --git a/jetty-http2/http2-alpn-tests/src/test/java/org/eclipse/jetty/http2/alpn/tests/AbstractALPNTest.java b/jetty-http2/http2-alpn-tests/src/test/java/org/eclipse/jetty/http2/alpn/tests/AbstractALPNTest.java
new file mode 100644
index 0000000..ce4d462
--- /dev/null
+++ b/jetty-http2/http2-alpn-tests/src/test/java/org/eclipse/jetty/http2/alpn/tests/AbstractALPNTest.java
@@ -0,0 +1,93 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.alpn.tests;
+
+import java.net.InetSocketAddress;
+
+import org.eclipse.jetty.alpn.ALPN;
+import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
+import org.eclipse.jetty.http2.HTTP2Cipher;
+import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.toolchain.test.JDK;
+import org.eclipse.jetty.toolchain.test.TestTracker;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.junit.After;
+import org.junit.Assume;
+import org.junit.Before;
+import org.junit.Rule;
+
+public class AbstractALPNTest
+{
+    @Rule
+    public final TestTracker tracker = new TestTracker();
+    protected Server server;
+    protected ServerConnector connector;
+
+    @Before
+    public void before()
+    {
+        // The mandatory cipher needed to run HTTP/2
+        // over TLS is only available in JDK 8.
+        Assume.assumeTrue(JDK.IS_8);
+    }
+
+    protected InetSocketAddress prepare() throws Exception
+    {
+        server = new Server();
+        HttpConfiguration httpConfiguration = new HttpConfiguration();
+        HttpConnectionFactory h1 = new HttpConnectionFactory(httpConfiguration);
+        HTTP2ServerConnectionFactory h2 = new HTTP2ServerConnectionFactory(httpConfiguration);
+        ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory();
+        alpn.setDefaultProtocol(h1.getProtocol());
+        
+        connector = new ServerConnector(server, newSslContextFactory(), alpn, h1, h2);
+        connector.setPort(0);
+        connector.setIdleTimeout(30000);
+        server.addConnector(connector);
+        server.start();
+
+        ALPN.debug = true;
+
+        return new InetSocketAddress("localhost", connector.getLocalPort());
+    }
+
+    protected SslContextFactory newSslContextFactory()
+    {
+        SslContextFactory sslContextFactory = new SslContextFactory();
+        sslContextFactory.setKeyStorePath("src/test/resources/keystore.jks");
+        sslContextFactory.setKeyStorePassword("storepwd");
+        sslContextFactory.setTrustStorePath("src/test/resources/truststore.jks");
+        sslContextFactory.setTrustStorePassword("storepwd");
+        sslContextFactory.setIncludeProtocols("TLSv1.2");
+        // The mandatory HTTP/2 cipher.
+        sslContextFactory.setIncludeCipherSuites("TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256");
+        return sslContextFactory;
+    }
+
+    @After
+    public void dispose() throws Exception
+    {
+        if (server != null)
+            server.stop();
+    }
+}
diff --git a/jetty-http2/http2-alpn-tests/src/test/resources/jetty-logging.properties b/jetty-http2/http2-alpn-tests/src/test/resources/jetty-logging.properties
new file mode 100644
index 0000000..29a0dfa
--- /dev/null
+++ b/jetty-http2/http2-alpn-tests/src/test/resources/jetty-logging.properties
@@ -0,0 +1,3 @@
+org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
+org.eclipse.jetty.alpn.LEVEL=DEBUG
+org.eclipse.jetty.http2.LEVEL=DEBUG
diff --git a/jetty-spdy/spdy-alpn-tests/src/test/resources/keystore.jks b/jetty-http2/http2-alpn-tests/src/test/resources/keystore.jks
similarity index 100%
rename from jetty-spdy/spdy-alpn-tests/src/test/resources/keystore.jks
rename to jetty-http2/http2-alpn-tests/src/test/resources/keystore.jks
Binary files differ
diff --git a/jetty-spdy/spdy-alpn-tests/src/test/resources/truststore.jks b/jetty-http2/http2-alpn-tests/src/test/resources/truststore.jks
similarity index 100%
rename from jetty-spdy/spdy-alpn-tests/src/test/resources/truststore.jks
rename to jetty-http2/http2-alpn-tests/src/test/resources/truststore.jks
Binary files differ
diff --git a/jetty-http2/http2-client/pom.xml b/jetty-http2/http2-client/pom.xml
new file mode 100644
index 0000000..29c54c5
--- /dev/null
+++ b/jetty-http2/http2-client/pom.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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/xsd/maven-4.0.0.xsd">
+  <parent>
+    <groupId>org.eclipse.jetty.http2</groupId>
+    <artifactId>http2-parent</artifactId>
+    <version>9.3.6-SNAPSHOT</version>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>http2-client</artifactId>
+  <name>Jetty :: HTTP2 :: Client</name>
+
+ <properties>
+    <bundle-symbolic-name>${project.groupId}.client</bundle-symbolic-name>
+  </properties>
+
+  <build>
+  </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.eclipse.jetty.http2</groupId>
+            <artifactId>http2-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-alpn-client</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.eclipse.jetty.toolchain</groupId>
+            <artifactId>jetty-test-helper</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-server</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-servlet</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-servlets</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-proxy</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty.http2</groupId>
+            <artifactId>http2-server</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2Client.java b/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2Client.java
new file mode 100644
index 0000000..6256a6d
--- /dev/null
+++ b/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2Client.java
@@ -0,0 +1,353 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.SocketChannel;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Executor;
+
+import org.eclipse.jetty.alpn.client.ALPNClientConnectionFactory;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.ClientConnectionFactory;
+import org.eclipse.jetty.io.Connection;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.ManagedSelector;
+import org.eclipse.jetty.io.MappedByteBufferPool;
+import org.eclipse.jetty.io.SelectChannelEndPoint;
+import org.eclipse.jetty.io.SelectorManager;
+import org.eclipse.jetty.io.ssl.SslClientConnectionFactory;
+import org.eclipse.jetty.util.Promise;
+import org.eclipse.jetty.util.component.ContainerLifeCycle;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.eclipse.jetty.util.thread.ScheduledExecutorScheduler;
+import org.eclipse.jetty.util.thread.Scheduler;
+
+/**
+ * <p>{@link HTTP2Client} provides an asynchronous, non-blocking implementation
+ * to send HTTP/2 frames to a server.</p>
+ * <p>Typical usage:</p>
+ * <pre>
+ * // Create and start HTTP2Client.
+ * HTTP2Client client = new HTTP2Client();
+ * SslContextFactory sslContextFactory = new SslContextFactory();
+ * client.addBean(sslContextFactory);
+ * client.start();
+ *
+ * // Connect to host.
+ * String host = "webtide.com";
+ * int port = 443;
+ *
+ * FuturePromise&lt;Session&gt; sessionPromise = new FuturePromise&lt;&gt;();
+ * client.connect(sslContextFactory, new InetSocketAddress(host, port), new ServerSessionListener.Adapter(), sessionPromise);
+ *
+ * // Obtain the client Session object.
+ * Session session = sessionPromise.get(5, TimeUnit.SECONDS);
+ *
+ * // Prepare the HTTP request headers.
+ * HttpFields requestFields = new HttpFields();
+ * requestFields.put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION);
+ * // Prepare the HTTP request object.
+ * MetaData.Request request = new MetaData.Request("PUT", new HttpURI("https://" + host + ":" + port + "/"), HttpVersion.HTTP_2, requestFields);
+ * // Create the HTTP/2 HEADERS frame representing the HTTP request.
+ * HeadersFrame headersFrame = new HeadersFrame(request, null, false);
+ *
+ * // Prepare the listener to receive the HTTP response frames.
+ * Stream.Listener responseListener = new new Stream.Listener.Adapter()
+ * {
+ *      &#64;Override
+ *      public void onHeaders(Stream stream, HeadersFrame frame)
+ *      {
+ *          System.err.println(frame);
+ *      }
+ *
+ *      &#64;Override
+ *      public void onData(Stream stream, DataFrame frame, Callback callback)
+ *      {
+ *          System.err.println(frame);
+ *          callback.succeeded();
+ *      }
+ * };
+ *
+ * // Send the HEADERS frame to create a stream.
+ * FuturePromise&lt;Stream&gt; streamPromise = new FuturePromise&lt;&gt;();
+ * session.newStream(headersFrame, streamPromise, responseListener);
+ * Stream stream = streamPromise.get(5, TimeUnit.SECONDS);
+ *
+ * // Use the Stream object to send request content, if any, using a DATA frame.
+ * ByteBuffer content = ...;
+ * DataFrame requestContent = new DataFrame(stream.getId(), content, true);
+ * stream.data(requestContent, Callback.Adapter.INSTANCE);
+ *
+ * // When done, stop the client.
+ * client.stop();
+ * </pre>
+ */
+public class HTTP2Client extends ContainerLifeCycle
+{
+    private Executor executor;
+    private Scheduler scheduler;
+    private ByteBufferPool bufferPool;
+    private ClientConnectionFactory connectionFactory;
+    private SelectorManager selector;
+    private int selectors = 1;
+    private long idleTimeout = 30000;
+    private long connectTimeout = 10000;
+    private List<String> protocols = Arrays.asList("h2", "h2-17", "h2-16", "h2-15", "h2-14");
+
+    @Override
+    protected void doStart() throws Exception
+    {
+        if (executor == null)
+            setExecutor(new QueuedThreadPool());
+
+        if (scheduler == null)
+            setScheduler(new ScheduledExecutorScheduler());
+
+        if (bufferPool == null)
+            setByteBufferPool(new MappedByteBufferPool());
+
+        if (connectionFactory == null)
+        {
+            HTTP2ClientConnectionFactory h2 = new HTTP2ClientConnectionFactory();
+            ALPNClientConnectionFactory alpn = new ALPNClientConnectionFactory(getExecutor(), h2, getProtocols());
+            setClientConnectionFactory((endPoint, context) ->
+            {
+                ClientConnectionFactory factory = h2;
+                SslContextFactory sslContextFactory = (SslContextFactory)context.get(SslClientConnectionFactory.SSL_CONTEXT_FACTORY_CONTEXT_KEY);
+                if (sslContextFactory != null)
+                    factory = new SslClientConnectionFactory(sslContextFactory, getByteBufferPool(), getExecutor(), alpn);
+                return factory.newConnection(endPoint, context);
+            });
+        }
+
+        if (selector == null)
+        {
+            selector = newSelectorManager();
+            addBean(selector);
+        }
+        selector.setConnectTimeout(getConnectTimeout());
+
+        super.doStart();
+    }
+
+    protected SelectorManager newSelectorManager()
+    {
+        return new ClientSelectorManager(getExecutor(), getScheduler(), getSelectors());
+    }
+
+    public Executor getExecutor()
+    {
+        return executor;
+    }
+
+    public void setExecutor(Executor executor)
+    {
+        this.updateBean(this.executor, executor);
+        this.executor = executor;
+    }
+
+    public Scheduler getScheduler()
+    {
+        return scheduler;
+    }
+
+    public void setScheduler(Scheduler scheduler)
+    {
+        this.updateBean(this.scheduler, scheduler);
+        this.scheduler = scheduler;
+    }
+
+    public ByteBufferPool getByteBufferPool()
+    {
+        return bufferPool;
+    }
+
+    public void setByteBufferPool(ByteBufferPool bufferPool)
+    {
+        this.updateBean(this.bufferPool, bufferPool);
+        this.bufferPool = bufferPool;
+    }
+
+    public ClientConnectionFactory getClientConnectionFactory()
+    {
+        return connectionFactory;
+    }
+
+    public void setClientConnectionFactory(ClientConnectionFactory connectionFactory)
+    {
+        this.updateBean(this.connectionFactory, connectionFactory);
+        this.connectionFactory = connectionFactory;
+    }
+
+    public int getSelectors()
+    {
+        return selectors;
+    }
+
+    public void setSelectors(int selectors)
+    {
+        this.selectors = selectors;
+    }
+
+    public long getIdleTimeout()
+    {
+        return idleTimeout;
+    }
+
+    public void setIdleTimeout(long idleTimeout)
+    {
+        this.idleTimeout = idleTimeout;
+    }
+
+    public long getConnectTimeout()
+    {
+        return connectTimeout;
+    }
+
+    public void setConnectTimeout(long connectTimeout)
+    {
+        this.connectTimeout = connectTimeout;
+        SelectorManager selector = this.selector;
+        if (selector != null)
+            selector.setConnectTimeout(connectTimeout);
+    }
+
+    public List<String> getProtocols()
+    {
+        return protocols;
+    }
+
+    public void setProtocols(List<String> protocols)
+    {
+        this.protocols = protocols;
+    }
+
+    public void connect(InetSocketAddress address, Session.Listener listener, Promise<Session> promise)
+    {
+        connect(null, address, listener, promise);
+    }
+
+    public void connect(SslContextFactory sslContextFactory, InetSocketAddress address, Session.Listener listener, Promise<Session> promise)
+    {
+        connect(sslContextFactory, address, listener, promise, null);
+    }
+
+    public void connect(SslContextFactory sslContextFactory, InetSocketAddress address, Session.Listener listener, Promise<Session> promise, Map<String, Object> context)
+    {
+        try
+        {
+            SocketChannel channel = SocketChannel.open();
+            configure(channel);
+            channel.configureBlocking(false);
+            context = contextFrom(sslContextFactory, address, listener, promise, context);
+            if (channel.connect(address))
+                selector.accept(channel, context);
+            else
+                selector.connect(channel, context);
+        }
+        catch (Throwable x)
+        {
+            promise.failed(x);
+        }
+    }
+
+    public void accept(SslContextFactory sslContextFactory, SocketChannel channel, Session.Listener listener, Promise<Session> promise)
+    {
+        try
+        {
+            if (!channel.isConnected())
+                throw new IllegalStateException("SocketChannel must be connected");
+            channel.configureBlocking(false);
+            Map<String, Object> context = contextFrom(sslContextFactory, (InetSocketAddress)channel.getRemoteAddress(), listener, promise, null);
+            selector.accept(channel, context);
+        }
+        catch (Throwable x)
+        {
+            promise.failed(x);
+        }
+    }
+
+    private Map<String, Object> contextFrom(SslContextFactory sslContextFactory, InetSocketAddress address, Session.Listener listener, Promise<Session> promise, Map<String, Object> context)
+    {
+        if (context == null)
+            context = new HashMap<>();
+        context.put(HTTP2ClientConnectionFactory.CLIENT_CONTEXT_KEY, this);
+        context.put(HTTP2ClientConnectionFactory.SESSION_LISTENER_CONTEXT_KEY, listener);
+        context.put(HTTP2ClientConnectionFactory.SESSION_PROMISE_CONTEXT_KEY, promise);
+        if (sslContextFactory != null)
+            context.put(SslClientConnectionFactory.SSL_CONTEXT_FACTORY_CONTEXT_KEY, sslContextFactory);
+        context.put(SslClientConnectionFactory.SSL_PEER_HOST_CONTEXT_KEY, address.getHostString());
+        context.put(SslClientConnectionFactory.SSL_PEER_PORT_CONTEXT_KEY, address.getPort());
+        return context;
+    }
+
+    protected void configure(SocketChannel channel) throws IOException
+    {
+        channel.socket().setTcpNoDelay(true);
+    }
+
+    private class ClientSelectorManager extends SelectorManager
+    {
+        private ClientSelectorManager(Executor executor, Scheduler scheduler, int selectors)
+        {
+            super(executor, scheduler, selectors);
+        }
+
+        @Override
+        protected EndPoint newEndPoint(SocketChannel channel, ManagedSelector selector, SelectionKey selectionKey) throws IOException
+        {
+            return new SelectChannelEndPoint(channel, selector, selectionKey, getScheduler(), getIdleTimeout());
+        }
+
+        @Override
+        public Connection newConnection(SocketChannel channel, EndPoint endpoint, Object attachment) throws IOException
+        {
+            @SuppressWarnings("unchecked")
+            Map<String, Object> context = (Map<String, Object>)attachment;
+            context.put(HTTP2ClientConnectionFactory.BYTE_BUFFER_POOL_CONTEXT_KEY, getByteBufferPool());
+            context.put(HTTP2ClientConnectionFactory.EXECUTOR_CONTEXT_KEY, getExecutor());
+            context.put(HTTP2ClientConnectionFactory.SCHEDULER_CONTEXT_KEY, getScheduler());
+            return getClientConnectionFactory().newConnection(endpoint, context);
+        }
+
+        @Override
+        protected void connectionFailed(SocketChannel channel, Throwable failure, Object attachment)
+        {
+            @SuppressWarnings("unchecked")
+            Map<String, Object> context = (Map<String, Object>)attachment;
+            if (LOG.isDebugEnabled())
+            {
+                Object host = context.get(SslClientConnectionFactory.SSL_PEER_HOST_CONTEXT_KEY);
+                Object port = context.get(SslClientConnectionFactory.SSL_PEER_PORT_CONTEXT_KEY);
+                LOG.debug("Could not connect to {}:{}", host, port);
+            }
+            @SuppressWarnings("unchecked")
+            Promise<Session> promise = (Promise<Session>)context.get(HTTP2ClientConnectionFactory.SESSION_PROMISE_CONTEXT_KEY);
+            promise.failed(failure);
+        }
+    }
+}
diff --git a/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2ClientConnectionFactory.java b/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2ClientConnectionFactory.java
new file mode 100644
index 0000000..eda74e3
--- /dev/null
+++ b/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2ClientConnectionFactory.java
@@ -0,0 +1,141 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Map;
+import java.util.concurrent.Executor;
+
+import org.eclipse.jetty.http2.BufferingFlowControlStrategy;
+import org.eclipse.jetty.http2.FlowControlStrategy;
+import org.eclipse.jetty.http2.HTTP2Connection;
+import org.eclipse.jetty.http2.ISession;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.frames.PrefaceFrame;
+import org.eclipse.jetty.http2.frames.SettingsFrame;
+import org.eclipse.jetty.http2.frames.WindowUpdateFrame;
+import org.eclipse.jetty.http2.generator.Generator;
+import org.eclipse.jetty.http2.parser.Parser;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.ClientConnectionFactory;
+import org.eclipse.jetty.io.Connection;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.Promise;
+import org.eclipse.jetty.util.thread.Scheduler;
+
+public class HTTP2ClientConnectionFactory implements ClientConnectionFactory
+{
+    public static final String CLIENT_CONTEXT_KEY = "http2.client";
+    public static final String BYTE_BUFFER_POOL_CONTEXT_KEY = "http2.client.byteBufferPool";
+    public static final String EXECUTOR_CONTEXT_KEY = "http2.client.executor";
+    public static final String SCHEDULER_CONTEXT_KEY = "http2.client.scheduler";
+    public static final String SESSION_LISTENER_CONTEXT_KEY = "http2.client.sessionListener";
+    public static final String SESSION_PROMISE_CONTEXT_KEY = "http2.client.sessionPromise";
+
+    private int initialSessionRecvWindow = FlowControlStrategy.DEFAULT_WINDOW_SIZE;
+
+    @Override
+    public Connection newConnection(EndPoint endPoint, Map<String, Object> context) throws IOException
+    {
+        HTTP2Client client = (HTTP2Client)context.get(CLIENT_CONTEXT_KEY);
+        ByteBufferPool byteBufferPool = (ByteBufferPool)context.get(BYTE_BUFFER_POOL_CONTEXT_KEY);
+        Executor executor = (Executor)context.get(EXECUTOR_CONTEXT_KEY);
+        Scheduler scheduler = (Scheduler)context.get(SCHEDULER_CONTEXT_KEY);
+        Session.Listener listener = (Session.Listener)context.get(SESSION_LISTENER_CONTEXT_KEY);
+        @SuppressWarnings("unchecked")
+        Promise<Session> promise = (Promise<Session>)context.get(SESSION_PROMISE_CONTEXT_KEY);
+
+        Generator generator = new Generator(byteBufferPool);
+        FlowControlStrategy flowControl = newFlowControlStrategy();
+        HTTP2ClientSession session = new HTTP2ClientSession(scheduler, endPoint, generator, listener, flowControl);
+        Parser parser = new Parser(byteBufferPool, session, 4096, 8192);
+        return new HTTP2ClientConnection(client, byteBufferPool, executor, endPoint, parser, session, 8192, promise, listener);
+    }
+
+    protected FlowControlStrategy newFlowControlStrategy()
+    {
+        return new BufferingFlowControlStrategy(0.5F);
+    }
+
+    public int getInitialSessionRecvWindow()
+    {
+        return initialSessionRecvWindow;
+    }
+
+    public void setInitialSessionRecvWindow(int initialSessionRecvWindow)
+    {
+        this.initialSessionRecvWindow = initialSessionRecvWindow;
+    }
+
+    private class HTTP2ClientConnection extends HTTP2Connection implements Callback
+    {
+        private final HTTP2Client client;
+        private final Promise<Session> promise;
+        private final Session.Listener listener;
+
+        public HTTP2ClientConnection(HTTP2Client client, ByteBufferPool byteBufferPool, Executor executor, EndPoint endpoint, Parser parser, ISession session, int bufferSize, Promise<Session> promise, Session.Listener listener)
+        {
+            super(byteBufferPool, executor, endpoint, parser, session, bufferSize);
+            this.client = client;
+            this.promise = promise;
+            this.listener = listener;
+        }
+
+        @Override
+        public void onOpen()
+        {
+            Map<Integer, Integer> settings = listener.onPreface(getSession());
+            if (settings == null)
+                settings = Collections.emptyMap();
+
+            PrefaceFrame prefaceFrame = new PrefaceFrame();
+            SettingsFrame settingsFrame = new SettingsFrame(settings, false);
+            ISession session = getSession();
+            int windowDelta = getInitialSessionRecvWindow() - FlowControlStrategy.DEFAULT_WINDOW_SIZE;
+            if (windowDelta > 0)
+            {
+                session.updateRecvWindow(windowDelta);
+                session.frames(null, this, prefaceFrame, settingsFrame, new WindowUpdateFrame(0, windowDelta));
+            }
+            else
+            {
+                session.frames(null, this, prefaceFrame, settingsFrame);
+            }
+            // Only start reading from server after we have sent the client preface,
+            // otherwise we risk to read the server preface (a SETTINGS frame) and
+            // reply to that before we have the chance to send the client preface.
+            super.onOpen();
+        }
+
+        @Override
+        public void succeeded()
+        {
+            promise.succeeded(getSession());
+        }
+
+        @Override
+        public void failed(Throwable x)
+        {
+            close();
+            promise.failed(x);
+        }
+    }
+}
diff --git a/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2ClientSession.java b/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2ClientSession.java
new file mode 100644
index 0000000..3822d25
--- /dev/null
+++ b/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2ClientSession.java
@@ -0,0 +1,116 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import org.eclipse.jetty.http2.FlowControlStrategy;
+import org.eclipse.jetty.http2.HTTP2Session;
+import org.eclipse.jetty.http2.IStream;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PushPromiseFrame;
+import org.eclipse.jetty.http2.generator.Generator;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.Scheduler;
+
+public class HTTP2ClientSession extends HTTP2Session
+{
+    private static final Logger LOG = Log.getLogger(HTTP2ClientSession.class);
+
+    public HTTP2ClientSession(Scheduler scheduler, EndPoint endPoint, Generator generator, Listener listener, FlowControlStrategy flowControl)
+    {
+        super(scheduler, endPoint, generator, listener, flowControl, 1);
+    }
+
+    @Override
+    public void onHeaders(HeadersFrame frame)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Received {}", frame);
+
+        int streamId = frame.getStreamId();
+        IStream stream = getStream(streamId);
+        if (stream == null)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Ignoring {}, stream #{} not found", frame, streamId);
+        }
+        else
+        {
+            stream.process(frame, Callback.NOOP);
+            notifyHeaders(stream, frame);
+        }
+    }
+
+    private void notifyHeaders(IStream stream, HeadersFrame frame)
+    {
+        Stream.Listener listener = stream.getListener();
+        if (listener == null)
+            return;
+        try
+        {
+            listener.onHeaders(stream, frame);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    @Override
+    public void onPushPromise(PushPromiseFrame frame)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Received {}", frame);
+
+        int streamId = frame.getStreamId();
+        int pushStreamId = frame.getPromisedStreamId();
+        IStream stream = getStream(streamId);
+        if (stream == null)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Ignoring {}, stream #{} not found", frame, streamId);
+        }
+        else
+        {
+            IStream pushStream = createRemoteStream(pushStreamId);
+            pushStream.process(frame, Callback.NOOP);
+            Stream.Listener listener = notifyPush(stream, pushStream, frame);
+            pushStream.setListener(listener);
+        }
+    }
+
+    private Stream.Listener notifyPush(IStream stream, IStream pushStream, PushPromiseFrame frame)
+    {
+        Stream.Listener listener = stream.getListener();
+        if (listener == null)
+            return null;
+        try
+        {
+            return listener.onPush(pushStream, frame);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+            return null;
+        }
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/AbstractTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/AbstractTest.java
new file mode 100644
index 0000000..7bc4179
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/AbstractTest.java
@@ -0,0 +1,129 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.net.InetSocketAddress;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.http.HttpServlet;
+
+import org.eclipse.jetty.http.HostPortHttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpScheme;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
+import org.eclipse.jetty.http2.server.RawHTTP2ServerConnectionFactory;
+import org.eclipse.jetty.server.ConnectionFactory;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.toolchain.test.TestTracker;
+import org.eclipse.jetty.util.FuturePromise;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.junit.After;
+import org.junit.Rule;
+
+public class AbstractTest
+{
+    @Rule
+    public TestTracker tracker = new TestTracker();
+    protected ServerConnector connector;
+    protected String servletPath = "/test";
+    protected HTTP2Client client;
+    protected Server server;
+
+    protected void start(HttpServlet servlet) throws Exception
+    {
+        prepareServer(new HTTP2ServerConnectionFactory(new HttpConfiguration()));
+        ServletContextHandler context = new ServletContextHandler(server, "/", true, false);
+        context.addServlet(new ServletHolder(servlet), servletPath + "/*");
+        customizeContext(context);
+        server.start();
+
+        prepareClient();
+        client.start();
+    }
+
+    protected void customizeContext(ServletContextHandler context)
+    {
+    }
+
+    protected void start(ServerSessionListener listener) throws Exception
+    {
+        prepareServer(new RawHTTP2ServerConnectionFactory(new HttpConfiguration(), listener));
+        server.start();
+
+        prepareClient();
+        client.start();
+    }
+
+    protected void prepareServer(ConnectionFactory... connectionFactories)
+    {
+        QueuedThreadPool serverExecutor = new QueuedThreadPool();
+        serverExecutor.setName("server");
+        server = new Server(serverExecutor);
+        connector = new ServerConnector(server, 1, 1, connectionFactories);
+        server.addConnector(connector);
+    }
+
+    private void prepareClient()
+    {
+        client = new HTTP2Client();
+        QueuedThreadPool clientExecutor = new QueuedThreadPool();
+        clientExecutor.setName("client");
+        client.setExecutor(clientExecutor);
+    }
+
+    protected Session newClient(Session.Listener listener) throws Exception
+    {
+        String host = "localhost";
+        int port = connector.getLocalPort();
+        InetSocketAddress address = new InetSocketAddress(host, port);
+        FuturePromise<Session> promise = new FuturePromise<>();
+        client.connect(address, listener, promise);
+        return promise.get(5, TimeUnit.SECONDS);
+    }
+
+    protected MetaData.Request newRequest(String method, HttpFields fields)
+    {
+        return newRequest(method, "", fields);
+    }
+
+    protected MetaData.Request newRequest(String method, String pathInfo, HttpFields fields)
+    {
+        String host = "localhost";
+        int port = connector.getLocalPort();
+        String authority = host + ":" + port;
+        return new MetaData.Request(method, HttpScheme.HTTP, new HostPortHttpField(authority), servletPath + pathInfo, HttpVersion.HTTP_2, fields);
+    }
+
+    @After
+    public void dispose() throws Exception
+    {
+        if (client != null)
+            client.stop();
+        if (server != null)
+            server.stop();
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/AsyncIOTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/AsyncIOTest.java
new file mode 100644
index 0000000..8a1aaa5
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/AsyncIOTest.java
@@ -0,0 +1,248 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.nio.ByteBuffer;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.ReadListener;
+import javax.servlet.ServletException;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.FuturePromise;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class AsyncIOTest extends AbstractTest
+{
+    @Test
+    public void testLastContentAvailableBeforeService() throws Exception
+    {
+        start(new HttpServlet()
+        {
+            @Override
+            protected void service(final HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                // Wait for the data to fully arrive.
+                sleep(1000);
+
+                final AsyncContext asyncContext = request.startAsync();
+                asyncContext.setTimeout(0);
+                request.getInputStream().setReadListener(new EmptyReadListener()
+                {
+                    @Override
+                    public void onDataAvailable() throws IOException
+                    {
+                        ServletInputStream input = request.getInputStream();
+                        while (input.isReady())
+                        {
+                            int read = input.read();
+                            if (read < 0)
+                                break;
+                        }
+                        if (input.isFinished())
+                            asyncContext.complete();
+                    }
+                });
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+
+        HttpFields fields = new HttpFields();
+        MetaData.Request metaData = newRequest("GET", fields);
+        HeadersFrame frame = new HeadersFrame(metaData, null, false);
+        final CountDownLatch latch = new CountDownLatch(1);
+        FuturePromise<Stream> promise = new FuturePromise<>();
+        session.newStream(frame, promise, new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                if (frame.isEndStream())
+                    latch.countDown();
+            }
+        });
+        Stream stream = promise.get(5, TimeUnit.SECONDS);
+        stream.data(new DataFrame(stream.getId(), ByteBuffer.allocate(16), true), Callback.NOOP);
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testLastContentAvailableAfterServiceReturns() throws Exception
+    {
+        start(new HttpServlet()
+        {
+            @Override
+            protected void service(final HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                final AsyncContext asyncContext = request.startAsync();
+                asyncContext.setTimeout(0);
+                request.getInputStream().setReadListener(new EmptyReadListener()
+                {
+                    @Override
+                    public void onDataAvailable() throws IOException
+                    {
+                        ServletInputStream input = request.getInputStream();
+                        while (input.isReady())
+                        {
+                            int read = input.read();
+                            if (read < 0)
+                                break;
+                        }
+                        if (input.isFinished())
+                            asyncContext.complete();
+                    }
+                });
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+
+        HttpFields fields = new HttpFields();
+        MetaData.Request metaData = newRequest("GET", fields);
+        HeadersFrame frame = new HeadersFrame(metaData, null, false);
+        final CountDownLatch latch = new CountDownLatch(1);
+        FuturePromise<Stream> promise = new FuturePromise<>();
+        session.newStream(frame, promise, new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                if (frame.isEndStream())
+                    latch.countDown();
+            }
+        });
+        Stream stream = promise.get(5, TimeUnit.SECONDS);
+
+        // Wait until service() returns.
+        Thread.sleep(1000);
+        stream.data(new DataFrame(stream.getId(), ByteBuffer.allocate(16), true), Callback.NOOP);
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testSomeContentAvailableAfterServiceReturns() throws Exception
+    {
+        final AtomicInteger count = new AtomicInteger();
+        start(new HttpServlet()
+        {
+            @Override
+            protected void service(final HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                final AsyncContext asyncContext = request.startAsync();
+                asyncContext.setTimeout(0);
+                request.getInputStream().setReadListener(new EmptyReadListener()
+                {
+                    @Override
+                    public void onDataAvailable() throws IOException
+                    {
+                        count.incrementAndGet();
+                        ServletInputStream input = request.getInputStream();
+                        while (input.isReady())
+                        {
+                            int read = input.read();
+                            if (read < 0)
+                                break;
+                        }
+                        if (input.isFinished())
+                            asyncContext.complete();
+                    }
+                });
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+
+        HttpFields fields = new HttpFields();
+        MetaData.Request metaData = newRequest("GET", fields);
+        HeadersFrame frame = new HeadersFrame(metaData, null, false);
+        final CountDownLatch latch = new CountDownLatch(1);
+        FuturePromise<Stream> promise = new FuturePromise<>();
+        session.newStream(frame, promise, new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                if (frame.isEndStream())
+                    latch.countDown();
+            }
+        });
+        Stream stream = promise.get(5, TimeUnit.SECONDS);
+
+        // Wait until service() returns.
+        Thread.sleep(1000);
+        stream.data(new DataFrame(stream.getId(), ByteBuffer.allocate(1), false), Callback.NOOP);
+
+        // Wait until onDataAvailable() returns.
+        Thread.sleep(1000);
+        stream.data(new DataFrame(stream.getId(), ByteBuffer.allocate(1), true), Callback.NOOP);
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+        // Make sure onDataAvailable() has been called twice
+        Assert.assertEquals(2, count.get());
+    }
+
+    private static void sleep(long ms) throws InterruptedIOException
+    {
+        try
+        {
+            Thread.sleep(ms);
+        }
+        catch (InterruptedException x)
+        {
+            throw new InterruptedIOException();
+        }
+    }
+
+    private static class EmptyReadListener implements ReadListener
+    {
+        @Override
+        public void onDataAvailable() throws IOException
+        {
+        }
+
+        @Override
+        public void onAllDataRead() throws IOException
+        {
+        }
+
+        @Override
+        public void onError(Throwable t)
+        {
+        }
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/BufferingFlowControlStrategyTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/BufferingFlowControlStrategyTest.java
new file mode 100644
index 0000000..07b6419
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/BufferingFlowControlStrategyTest.java
@@ -0,0 +1,31 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import org.eclipse.jetty.http2.BufferingFlowControlStrategy;
+import org.eclipse.jetty.http2.FlowControlStrategy;
+
+public class BufferingFlowControlStrategyTest extends FlowControlStrategyTest
+{
+    @Override
+    protected FlowControlStrategy newFlowControlStrategy()
+    {
+        return new BufferingFlowControlStrategy(0.5F);
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/Client.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/Client.java
new file mode 100644
index 0000000..ffefc8c
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/Client.java
@@ -0,0 +1,94 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.net.InetSocketAddress;
+import java.util.concurrent.Phaser;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpURI;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PushPromiseFrame;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.FuturePromise;
+import org.eclipse.jetty.util.Jetty;
+import org.eclipse.jetty.util.Promise;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+
+public class Client
+{
+    public static void main(String[] args) throws Exception
+    {
+        HTTP2Client client = new HTTP2Client();
+        SslContextFactory sslContextFactory = new SslContextFactory();
+        client.addBean(sslContextFactory);
+        client.start();
+
+        String host = "webtide.com";
+        int port = 443;
+
+        FuturePromise<Session> sessionPromise = new FuturePromise<>();
+        client.connect(sslContextFactory, new InetSocketAddress(host, port), new ServerSessionListener.Adapter(), sessionPromise);
+        Session session = sessionPromise.get(5, TimeUnit.SECONDS);
+
+        HttpFields requestFields = new HttpFields();
+        requestFields.put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION);
+        MetaData.Request metaData = new MetaData.Request("GET", new HttpURI("https://" + host + ":" + port + "/"), HttpVersion.HTTP_2, requestFields);
+        HeadersFrame headersFrame = new HeadersFrame(metaData, null, true);
+        final Phaser phaser = new Phaser(2);
+        session.newStream(headersFrame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                System.err.println(frame);
+                if (frame.isEndStream())
+                    phaser.arrive();
+            }
+
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                System.err.println(frame);
+                callback.succeeded();
+                if (frame.isEndStream())
+                    phaser.arrive();
+            }
+
+            @Override
+            public Stream.Listener onPush(Stream stream, PushPromiseFrame frame)
+            {
+                System.err.println(frame);
+                phaser.register();
+                return this;
+            }
+        });
+
+        phaser.awaitAdvanceInterruptibly(phaser.arrive(), 5, TimeUnit.SECONDS);
+
+        client.stop();
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/ConnectTimeoutTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/ConnectTimeoutTest.java
new file mode 100644
index 0000000..eb66174
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/ConnectTimeoutTest.java
@@ -0,0 +1,90 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.net.SocketTimeoutException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.util.Promise;
+import org.junit.Assert;
+import org.junit.Assume;
+import org.junit.Test;
+
+public class ConnectTimeoutTest extends AbstractTest
+{
+    @Test
+    public void testConnectTimeout() throws Exception
+    {
+        final String host = "10.255.255.1";
+        final int port = 80;
+        int connectTimeout = 1000;
+        assumeConnectTimeout(host, port, connectTimeout);
+
+        start(new ServerSessionListener.Adapter());
+        client.setConnectTimeout(connectTimeout);
+
+        InetSocketAddress address = new InetSocketAddress(host, port);
+        final CountDownLatch latch = new CountDownLatch(1);
+        client.connect(address, new Session.Listener.Adapter(), new Promise.Adapter<Session>()
+        {
+            @Override
+            public void failed(Throwable x)
+            {
+                Assert.assertTrue(x instanceof SocketTimeoutException);
+                latch.countDown();
+            }
+        });
+
+        Assert.assertTrue(latch.await(2 * connectTimeout, TimeUnit.MILLISECONDS));
+    }
+
+    private void assumeConnectTimeout(String host, int port, int connectTimeout) throws IOException
+    {
+        boolean socketTimeout = false;
+        
+        try (Socket socket = new Socket())
+        {
+            // Try to connect to a private address in the 10.x.y.z range.
+            // These addresses are usually not routed, so an attempt to
+            // connect to them will hang the connection attempt, which is
+            // what we want to simulate in this test.
+            socket.connect(new InetSocketAddress(host, port), connectTimeout);
+        }
+        catch (SocketTimeoutException x)
+        {
+            // We expect a timeout during connect, allow test to continue.
+            socketTimeout = true;
+        }
+        catch (Throwable x)
+        {
+            // Dump stacktrace when there is an unexpected test failure
+            // Useful when debugging
+            x.printStackTrace(System.err);
+        }
+        
+        // Abort the test if we can connect.
+        Assume.assumeTrue("Should have seen connect timeout",socketTimeout);
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/EmptyHttpServlet.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/EmptyHttpServlet.java
new file mode 100644
index 0000000..ad24857
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/EmptyHttpServlet.java
@@ -0,0 +1,34 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class EmptyHttpServlet extends HttpServlet
+{
+    @Override
+    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    {
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/FlowControlStrategyTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/FlowControlStrategyTest.java
new file mode 100644
index 0000000..5ea9230
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/FlowControlStrategyTest.java
@@ -0,0 +1,975 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Exchanger;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.eclipse.jetty.http.HostPortHttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpScheme;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.FlowControlStrategy;
+import org.eclipse.jetty.http2.HTTP2Session;
+import org.eclipse.jetty.http2.HTTP2Stream;
+import org.eclipse.jetty.http2.ISession;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.GoAwayFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.ResetFrame;
+import org.eclipse.jetty.http2.frames.SettingsFrame;
+import org.eclipse.jetty.http2.server.RawHTTP2ServerConnectionFactory;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.toolchain.test.TestTracker;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.FutureCallback;
+import org.eclipse.jetty.util.FuturePromise;
+import org.eclipse.jetty.util.Promise;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+
+public abstract class FlowControlStrategyTest
+{
+    @Rule
+    public TestTracker tracker = new TestTracker();
+    protected ServerConnector connector;
+    protected HTTP2Client client;
+    protected Server server;
+
+    protected abstract FlowControlStrategy newFlowControlStrategy();
+
+    protected void start(ServerSessionListener listener) throws Exception
+    {
+        QueuedThreadPool serverExecutor = new QueuedThreadPool();
+        serverExecutor.setName("server");
+        server = new Server(serverExecutor);
+        connector = new ServerConnector(server, new RawHTTP2ServerConnectionFactory(new HttpConfiguration(), listener)
+        {
+            @Override
+            protected FlowControlStrategy newFlowControlStrategy()
+            {
+                return FlowControlStrategyTest.this.newFlowControlStrategy();
+            }
+        });
+        server.addConnector(connector);
+        server.start();
+
+        client = new HTTP2Client();
+        QueuedThreadPool clientExecutor = new QueuedThreadPool();
+        clientExecutor.setName("client");
+        client.setExecutor(clientExecutor);
+        client.setClientConnectionFactory(new HTTP2ClientConnectionFactory()
+        {
+            @Override
+            protected FlowControlStrategy newFlowControlStrategy()
+            {
+                return FlowControlStrategyTest.this.newFlowControlStrategy();
+            }
+        });
+        client.start();
+    }
+
+    protected Session newClient(Session.Listener listener) throws Exception
+    {
+        String host = "localhost";
+        int port = connector.getLocalPort();
+        InetSocketAddress address = new InetSocketAddress(host, port);
+        FuturePromise<Session> promise = new FuturePromise<>();
+        client.connect(address, listener, promise);
+        return promise.get(5, TimeUnit.SECONDS);
+    }
+
+    protected MetaData.Request newRequest(String method, HttpFields fields)
+    {
+        String host = "localhost";
+        int port = connector.getLocalPort();
+        String authority = host + ":" + port;
+        return new MetaData.Request(method, HttpScheme.HTTP, new HostPortHttpField(authority), "/", HttpVersion.HTTP_2, fields);
+    }
+
+    @After
+    public void dispose() throws Exception
+    {
+        // Allow WINDOW_UPDATE frames to be sent/received to avoid exception stack traces.
+        Thread.sleep(1000);
+        client.stop();
+        server.stop();
+    }
+
+    @Test
+    public void testWindowSizeUpdates() throws Exception
+    {
+        final CountDownLatch prefaceLatch = new CountDownLatch(1);
+        final CountDownLatch stream1Latch = new CountDownLatch(1);
+        final CountDownLatch stream2Latch = new CountDownLatch(1);
+        final CountDownLatch settingsLatch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Map<Integer, Integer> onPreface(Session session)
+            {
+                HTTP2Session serverSession = (HTTP2Session)session;
+                Assert.assertEquals(FlowControlStrategy.DEFAULT_WINDOW_SIZE, serverSession.getSendWindow());
+                Assert.assertEquals(FlowControlStrategy.DEFAULT_WINDOW_SIZE, serverSession.getRecvWindow());
+                prefaceLatch.countDown();
+                return null;
+            }
+
+            @Override
+            public void onSettings(Session session, SettingsFrame frame)
+            {
+                for (Stream stream : session.getStreams())
+                {
+                    HTTP2Stream serverStream = (HTTP2Stream)stream;
+                    Assert.assertEquals(0, serverStream.getSendWindow());
+                    Assert.assertEquals(FlowControlStrategy.DEFAULT_WINDOW_SIZE, serverStream.getRecvWindow());
+                }
+                settingsLatch.countDown();
+            }
+
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                HTTP2Stream serverStream = (HTTP2Stream)stream;
+                MetaData.Request request = (MetaData.Request)frame.getMetaData();
+                if ("GET".equalsIgnoreCase(request.getMethod()))
+                {
+                    Assert.assertEquals(FlowControlStrategy.DEFAULT_WINDOW_SIZE, serverStream.getSendWindow());
+                    Assert.assertEquals(FlowControlStrategy.DEFAULT_WINDOW_SIZE, serverStream.getRecvWindow());
+                    stream1Latch.countDown();
+                }
+                else
+                {
+                    Assert.assertEquals(0, serverStream.getSendWindow());
+                    Assert.assertEquals(FlowControlStrategy.DEFAULT_WINDOW_SIZE, serverStream.getRecvWindow());
+                    stream2Latch.countDown();
+                }
+                return null;
+            }
+        });
+
+        HTTP2Session clientSession = (HTTP2Session)newClient(new Session.Listener.Adapter());
+
+        Assert.assertEquals(FlowControlStrategy.DEFAULT_WINDOW_SIZE, clientSession.getSendWindow());
+        Assert.assertEquals(FlowControlStrategy.DEFAULT_WINDOW_SIZE, clientSession.getRecvWindow());
+        Assert.assertTrue(prefaceLatch.await(5, TimeUnit.SECONDS));
+
+        MetaData.Request request1 = newRequest("GET", new HttpFields());
+        FuturePromise<Stream> promise1 = new FuturePromise<>();
+        clientSession.newStream(new HeadersFrame(request1, null, true), promise1, new Stream.Listener.Adapter());
+        HTTP2Stream clientStream1 = (HTTP2Stream)promise1.get(5, TimeUnit.SECONDS);
+
+        Assert.assertEquals(FlowControlStrategy.DEFAULT_WINDOW_SIZE, clientStream1.getSendWindow());
+        Assert.assertEquals(FlowControlStrategy.DEFAULT_WINDOW_SIZE, clientStream1.getRecvWindow());
+        Assert.assertTrue(stream1Latch.await(5, TimeUnit.SECONDS));
+
+        // Send a SETTINGS frame that changes the window size.
+        // This tells the server that its stream send window must be updated,
+        // so on the client it's the receive window that must be updated.
+        Map<Integer, Integer> settings = new HashMap<>();
+        settings.put(SettingsFrame.INITIAL_WINDOW_SIZE, 0);
+        SettingsFrame frame = new SettingsFrame(settings, false);
+        FutureCallback callback = new FutureCallback();
+        clientSession.settings(frame, callback);
+        callback.get(5, TimeUnit.SECONDS);
+
+        Assert.assertEquals(FlowControlStrategy.DEFAULT_WINDOW_SIZE, clientStream1.getSendWindow());
+        Assert.assertEquals(0, clientStream1.getRecvWindow());
+        settingsLatch.await(5, TimeUnit.SECONDS);
+
+        // Now create a new stream, it must pick up the new value.
+        MetaData.Request request2 = newRequest("POST", new HttpFields());
+        FuturePromise<Stream> promise2 = new FuturePromise<>();
+        clientSession.newStream(new HeadersFrame(request2, null, true), promise2, new Stream.Listener.Adapter());
+        HTTP2Stream clientStream2 = (HTTP2Stream)promise2.get(5, TimeUnit.SECONDS);
+
+        Assert.assertEquals(FlowControlStrategy.DEFAULT_WINDOW_SIZE, clientStream2.getSendWindow());
+        Assert.assertEquals(0, clientStream2.getRecvWindow());
+        Assert.assertTrue(stream2Latch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testFlowControlWithConcurrentSettings() throws Exception
+    {
+        // Initial window is 64 KiB. We allow the client to send 1024 B
+        // then we change the window to 512 B. At this point, the client
+        // must stop sending data (although the initial window allows it).
+
+        final int size = 512;
+        // We get 3 data frames: the first of 1024 and 2 of 512 each
+        // after the flow control window has been reduced.
+        final CountDownLatch dataLatch = new CountDownLatch(3);
+        final AtomicReference<Callback> callbackRef = new AtomicReference<>();
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame requestFrame)
+            {
+                HttpFields fields = new HttpFields();
+                MetaData.Response response = new MetaData.Response(HttpVersion.HTTP_2, 200, fields);
+                HeadersFrame responseFrame = new HeadersFrame(stream.getId(), response, null, true);
+                stream.headers(responseFrame, Callback.NOOP);
+
+                return new Stream.Listener.Adapter()
+                {
+                    private final AtomicInteger dataFrames = new AtomicInteger();
+
+                    @Override
+                    public void onData(Stream stream, DataFrame frame, Callback callback)
+                    {
+                        dataLatch.countDown();
+                        int dataFrameCount = dataFrames.incrementAndGet();
+                        if (dataFrameCount == 1)
+                        {
+                            callbackRef.set(callback);
+                            Map<Integer, Integer> settings = new HashMap<>();
+                            settings.put(SettingsFrame.INITIAL_WINDOW_SIZE, size);
+                            stream.getSession().settings(new SettingsFrame(settings, false), Callback.NOOP);
+                            // Do not succeed the callback here.
+                        }
+                        else if (dataFrameCount > 1)
+                        {
+                            // Consume the data.
+                            callback.succeeded();
+                        }
+                    }
+                };
+            }
+        });
+
+        // Two SETTINGS frames, the initial one and the one we send from the server.
+        final CountDownLatch settingsLatch = new CountDownLatch(2);
+        Session session = newClient(new Session.Listener.Adapter()
+        {
+            @Override
+            public void onSettings(Session session, SettingsFrame frame)
+            {
+                settingsLatch.countDown();
+            }
+        });
+
+        MetaData.Request request = newRequest("POST", new HttpFields());
+        FuturePromise<Stream> promise = new FuturePromise<>();
+        session.newStream(new HeadersFrame(request, null, false), promise, new Stream.Listener.Adapter());
+        Stream stream = promise.get(5, TimeUnit.SECONDS);
+
+        // Send first chunk that exceeds the window.
+        stream.data(new DataFrame(stream.getId(), ByteBuffer.allocate(size * 2), false), Callback.NOOP);
+        settingsLatch.await(5, TimeUnit.SECONDS);
+
+        // Send the second chunk of data, must not arrive since we're flow control stalled on the client.
+        stream.data(new DataFrame(stream.getId(), ByteBuffer.allocate(size * 2), true), Callback.NOOP);
+        Assert.assertFalse(dataLatch.await(1, TimeUnit.SECONDS));
+
+        // Consume the data arrived to server, this will resume flow control on the client.
+        callbackRef.get().succeeded();
+
+        Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testServerFlowControlOneBigWrite() throws Exception
+    {
+        final int windowSize = 1536;
+        final int length = 5 * windowSize;
+        final CountDownLatch settingsLatch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public void onSettings(Session session, SettingsFrame frame)
+            {
+                settingsLatch.countDown();
+            }
+
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame requestFrame)
+            {
+                MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                HeadersFrame responseFrame = new HeadersFrame(stream.getId(), metaData, null, false);
+                stream.headers(responseFrame, Callback.NOOP);
+
+                DataFrame dataFrame = new DataFrame(stream.getId(), ByteBuffer.allocate(length), true);
+                stream.data(dataFrame, Callback.NOOP);
+                return null;
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+
+        Map<Integer, Integer> settings = new HashMap<>();
+        settings.put(SettingsFrame.INITIAL_WINDOW_SIZE, windowSize);
+        session.settings(new SettingsFrame(settings, false), Callback.NOOP);
+
+        Assert.assertTrue(settingsLatch.await(5, TimeUnit.SECONDS));
+
+        final CountDownLatch dataLatch = new CountDownLatch(1);
+        final Exchanger<Callback> exchanger = new Exchanger<>();
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(metaData, null, true);
+        session.newStream(requestFrame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            private AtomicInteger dataFrames = new AtomicInteger();
+
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                try
+                {
+                    int dataFrames = this.dataFrames.incrementAndGet();
+                    if (dataFrames == 1 || dataFrames == 2)
+                    {
+                        // Do not consume the data frame.
+                        // We should then be flow-control stalled.
+                        exchanger.exchange(callback);
+                    }
+                    else if (dataFrames == 3 || dataFrames == 4 || dataFrames == 5)
+                    {
+                        // Consume totally.
+                        callback.succeeded();
+                        if (frame.isEndStream())
+                            dataLatch.countDown();
+                    }
+                    else
+                    {
+                        Assert.fail();
+                    }
+                }
+                catch (InterruptedException x)
+                {
+                    callback.failed(x);
+                }
+            }
+        });
+
+        Callback callback = exchanger.exchange(null, 5, TimeUnit.SECONDS);
+        checkThatWeAreFlowControlStalled(exchanger);
+
+        // Consume the first chunk.
+        callback.succeeded();
+
+        callback = exchanger.exchange(null, 5, TimeUnit.SECONDS);
+        checkThatWeAreFlowControlStalled(exchanger);
+
+        // Consume the second chunk.
+        callback.succeeded();
+
+        Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testClientFlowControlOneBigWrite() throws Exception
+    {
+        final int windowSize = 1536;
+        final Exchanger<Callback> exchanger = new Exchanger<>();
+        final CountDownLatch settingsLatch = new CountDownLatch(1);
+        final CountDownLatch dataLatch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Map<Integer, Integer> onPreface(Session session)
+            {
+                Map<Integer, Integer> settings = new HashMap<>();
+                settings.put(SettingsFrame.INITIAL_WINDOW_SIZE, windowSize);
+                return settings;
+            }
+
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame requestFrame)
+            {
+                MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                HeadersFrame responseFrame = new HeadersFrame(stream.getId(), metaData, null, false);
+                stream.headers(responseFrame, Callback.NOOP);
+                return new Stream.Listener.Adapter()
+                {
+                    private AtomicInteger dataFrames = new AtomicInteger();
+
+                    @Override
+                    public void onData(Stream stream, DataFrame frame, Callback callback)
+                    {
+                        try
+                        {
+                            int dataFrames = this.dataFrames.incrementAndGet();
+                            if (dataFrames == 1 || dataFrames == 2)
+                            {
+                                // Do not consume the data frame.
+                                // We should then be flow-control stalled.
+                                exchanger.exchange(callback);
+                            }
+                            else if (dataFrames == 3 || dataFrames == 4 || dataFrames == 5)
+                            {
+                                // Consume totally.
+                                callback.succeeded();
+                                if (frame.isEndStream())
+                                    dataLatch.countDown();
+                            }
+                            else
+                            {
+                                Assert.fail();
+                            }
+                        }
+                        catch (InterruptedException x)
+                        {
+                            callback.failed(x);
+                        }
+                    }
+                };
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter()
+        {
+            @Override
+            public void onSettings(Session session, SettingsFrame frame)
+            {
+                settingsLatch.countDown();
+            }
+        });
+
+        Assert.assertTrue(settingsLatch.await(5, TimeUnit.SECONDS));
+
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(metaData, null, false);
+        FuturePromise<Stream> streamPromise = new FuturePromise<>();
+        session.newStream(requestFrame, streamPromise, null);
+        Stream stream = streamPromise.get(5, TimeUnit.SECONDS);
+
+        final int length = 5 * windowSize;
+        DataFrame dataFrame = new DataFrame(stream.getId(), ByteBuffer.allocate(length), true);
+        stream.data(dataFrame, Callback.NOOP);
+
+        Callback callback = exchanger.exchange(null, 5, TimeUnit.SECONDS);
+        checkThatWeAreFlowControlStalled(exchanger);
+
+        // Consume the first chunk.
+        callback.succeeded();
+
+        callback = exchanger.exchange(null, 5, TimeUnit.SECONDS);
+        checkThatWeAreFlowControlStalled(exchanger);
+
+        // Consume the second chunk.
+        callback.succeeded();
+
+        Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    private void checkThatWeAreFlowControlStalled(Exchanger<Callback> exchanger) throws Exception
+    {
+        try
+        {
+            exchanger.exchange(null, 1, TimeUnit.SECONDS);
+            Assert.fail();
+        }
+        catch (TimeoutException x)
+        {
+            // Expected.
+        }
+    }
+
+    @Test
+    public void testSessionStalledStallsNewStreams() throws Exception
+    {
+        final int windowSize = 1024;
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame requestFrame)
+            {
+                MetaData.Request request = (MetaData.Request)requestFrame.getMetaData();
+                if ("POST".equalsIgnoreCase(request.getMethod()))
+                {
+                    // Send data to consume most of the session window.
+                    ByteBuffer data = ByteBuffer.allocate(FlowControlStrategy.DEFAULT_WINDOW_SIZE - windowSize);
+                    DataFrame dataFrame = new DataFrame(stream.getId(), data, true);
+                    stream.data(dataFrame, Callback.NOOP);
+                    return null;
+                }
+                else
+                {
+                    // For every stream, send down half the window size of data.
+                    MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                    HeadersFrame responseFrame = new HeadersFrame(stream.getId(), metaData, null, false);
+                    stream.headers(responseFrame, Callback.NOOP);
+                    DataFrame dataFrame = new DataFrame(stream.getId(), ByteBuffer.allocate(windowSize / 2), true);
+                    stream.data(dataFrame, Callback.NOOP);
+                    return null;
+                }
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+
+        // First request is just to consume most of the session window.
+        final List<Callback> callbacks1 = new ArrayList<>();
+        final CountDownLatch prepareLatch = new CountDownLatch(1);
+        MetaData.Request request1 = newRequest("POST", new HttpFields());
+        session.newStream(new HeadersFrame(request1, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                // Do not consume the data to reduce the session window.
+                callbacks1.add(callback);
+                if (frame.isEndStream())
+                    prepareLatch.countDown();
+            }
+        });
+        Assert.assertTrue(prepareLatch.await(5, TimeUnit.SECONDS));
+
+        // Second request will consume half of the remaining the session window.
+        MetaData.Request request2 = newRequest("GET", new HttpFields());
+        session.newStream(new HeadersFrame(request2, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                // Do not consume it to stall flow control.
+            }
+        });
+
+        // Third request will consume the whole session window, which is now stalled.
+        // A fourth request will not be able to receive data.
+        MetaData.Request request3 = newRequest("GET", new HttpFields());
+        session.newStream(new HeadersFrame(request3, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                // Do not consume it to stall flow control.
+            }
+        });
+
+        // Fourth request is now stalled.
+        final CountDownLatch latch = new CountDownLatch(1);
+        MetaData.Request request4 = newRequest("GET", new HttpFields());
+        session.newStream(new HeadersFrame(request4, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                callback.succeeded();
+                if (frame.isEndStream())
+                    latch.countDown();
+            }
+        });
+
+        // Verify that the data does not arrive because the server session is stalled.
+        Assert.assertFalse(latch.await(1, TimeUnit.SECONDS));
+
+        // Consume the data of the first response.
+        // This will open up the session window, allowing the fourth stream to send data.
+        for (Callback callback : callbacks1)
+            callback.succeeded();
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testServerSendsBigContent() throws Exception
+    {
+        final byte[] data = new byte[1024 * 1024];
+        new Random().nextBytes(data);
+
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame requestFrame)
+            {
+                MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                HeadersFrame responseFrame = new HeadersFrame(stream.getId(), metaData, null, false);
+                stream.headers(responseFrame, Callback.NOOP);
+                DataFrame dataFrame = new DataFrame(stream.getId(), ByteBuffer.wrap(data), true);
+                stream.data(dataFrame, Callback.NOOP);
+                return null;
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(metaData, null, true);
+        final byte[] bytes = new byte[data.length];
+        final CountDownLatch latch = new CountDownLatch(1);
+        session.newStream(requestFrame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            private int received;
+
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                int remaining = frame.remaining();
+                frame.getData().get(bytes, received, remaining);
+                this.received += remaining;
+                callback.succeeded();
+                if (frame.isEndStream())
+                    latch.countDown();
+            }
+        });
+
+        Assert.assertTrue(latch.await(15, TimeUnit.SECONDS));
+        Assert.assertArrayEquals(data, bytes);
+    }
+
+    @Test
+    public void testServerTwoDataFramesWithStalledStream() throws Exception
+    {
+        // Frames in queue = DATA1, DATA2.
+        // Server writes part of DATA1, then stalls.
+        // A window update unstalls the session, verify that the data is correctly sent.
+
+        Random random = new Random();
+        final byte[] chunk1 = new byte[1024];
+        random.nextBytes(chunk1);
+        final byte[] chunk2 = new byte[2048];
+        random.nextBytes(chunk2);
+
+        // Two SETTINGS frames: the initial after the preface,
+        // and the explicit where we set the stream window size to zero.
+        final AtomicReference<CountDownLatch> settingsLatch = new AtomicReference<>(new CountDownLatch(2));
+        final CountDownLatch dataLatch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public void onSettings(Session session, SettingsFrame frame)
+            {
+                settingsLatch.get().countDown();
+            }
+
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                stream.data(new DataFrame(stream.getId(), ByteBuffer.wrap(chunk1), false), Callback.NOOP);
+                stream.data(new DataFrame(stream.getId(), ByteBuffer.wrap(chunk2), true), Callback.NOOP);
+                dataLatch.countDown();
+                return null;
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+        Map<Integer, Integer> settings = new HashMap<>();
+        settings.put(SettingsFrame.INITIAL_WINDOW_SIZE, 0);
+        session.settings(new SettingsFrame(settings, false), Callback.NOOP);
+        Assert.assertTrue(settingsLatch.get().await(5, TimeUnit.SECONDS));
+
+        byte[] content = new byte[chunk1.length + chunk2.length];
+        final ByteBuffer buffer = ByteBuffer.wrap(content);
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(metaData, null, true);
+        final CountDownLatch responseLatch = new CountDownLatch(1);
+        session.newStream(requestFrame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                buffer.put(frame.getData());
+                callback.succeeded();
+                if (frame.isEndStream())
+                    responseLatch.countDown();
+            }
+        });
+        Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
+
+        // Now we have the 2 DATA frames queued in the server.
+
+        // Unstall the stream window.
+        settingsLatch.set(new CountDownLatch(1));
+        settings.clear();
+        settings.put(SettingsFrame.INITIAL_WINDOW_SIZE, chunk1.length / 2);
+        session.settings(new SettingsFrame(settings, false), Callback.NOOP);
+        Assert.assertTrue(settingsLatch.get().await(5, TimeUnit.SECONDS));
+
+        Assert.assertTrue(responseLatch.await(5, TimeUnit.SECONDS));
+
+        // Check that the data is sent correctly.
+        byte[] expected = new byte[content.length];
+        System.arraycopy(chunk1, 0, expected, 0, chunk1.length);
+        System.arraycopy(chunk2, 0, expected, chunk1.length, chunk2.length);
+        Assert.assertArrayEquals(expected, content);
+    }
+
+    @Test
+    public void testClientSendingInitialSmallWindow() throws Exception
+    {
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                MetaData metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                HeadersFrame responseFrame = new HeadersFrame(stream.getId(), metaData, null, false);
+                stream.headers(responseFrame, Callback.NOOP);
+                return new Stream.Listener.Adapter()
+                {
+                    @Override
+                    public void onData(Stream stream, DataFrame frame, Callback callback)
+                    {
+                        // Since we echo back the data
+                        // asynchronously we must copy it.
+                        ByteBuffer data = frame.getData();
+                        ByteBuffer copy = ByteBuffer.allocateDirect(data.remaining());
+                        copy.put(data).flip();
+                        stream.data(new DataFrame(stream.getId(), copy, frame.isEndStream()), callback);
+                    }
+                };
+            }
+        });
+
+        final int initialWindow = 16;
+        Session session = newClient(new Session.Listener.Adapter()
+        {
+            @Override
+            public Map<Integer, Integer> onPreface(Session session)
+            {
+                Map<Integer, Integer> settings = new HashMap<>();
+                settings.put(SettingsFrame.INITIAL_WINDOW_SIZE, initialWindow);
+                return settings;
+            }
+        });
+
+        byte[] requestData = new byte[initialWindow * 4];
+        new Random().nextBytes(requestData);
+
+        byte[] responseData = new byte[requestData.length];
+        final ByteBuffer responseContent = ByteBuffer.wrap(responseData);
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(metaData, null, false);
+        FuturePromise<Stream> streamPromise = new FuturePromise<>();
+        final CountDownLatch latch = new CountDownLatch(1);
+        session.newStream(requestFrame, streamPromise, new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                responseContent.put(frame.getData());
+                callback.succeeded();
+                if (frame.isEndStream())
+                    latch.countDown();
+            }
+        });
+        Stream stream = streamPromise.get(5, TimeUnit.SECONDS);
+
+        ByteBuffer requestContent = ByteBuffer.wrap(requestData);
+        DataFrame dataFrame = new DataFrame(stream.getId(), requestContent, true);
+        stream.data(dataFrame, Callback.NOOP);
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+
+        responseContent.flip();
+        Assert.assertArrayEquals(requestData, responseData);
+    }
+
+    @Test
+    public void testClientExceedingSessionWindow() throws Exception
+    {
+        // On server, we don't consume the data.
+        start(new ServerSessionListener.Adapter());
+
+        final CountDownLatch closeLatch = new CountDownLatch(1);
+        Session session = newClient(new Session.Listener.Adapter()
+        {
+            @Override
+            public void onClose(Session session, GoAwayFrame frame)
+            {
+                if (frame.getError() == ErrorCode.FLOW_CONTROL_ERROR.code)
+                    closeLatch.countDown();
+            }
+        });
+
+        // Consume the whole session and stream window.
+        MetaData.Request metaData = newRequest("POST", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(metaData, null, false);
+        FuturePromise<Stream> streamPromise = new FuturePromise<>();
+        session.newStream(requestFrame, streamPromise, new Stream.Listener.Adapter());
+        Stream stream = streamPromise.get(5, TimeUnit.SECONDS);
+        ByteBuffer data = ByteBuffer.allocate(FlowControlStrategy.DEFAULT_WINDOW_SIZE);
+        final CountDownLatch dataLatch = new CountDownLatch(1);
+        stream.data(new DataFrame(stream.getId(), data, false), new Callback.NonBlocking()
+        {
+            @Override
+            public void succeeded()
+            {
+                dataLatch.countDown();
+            }
+        });
+        Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
+
+        // The following "sneaky" write may clash with the write
+        // of the reply SETTINGS frame sent by the client in
+        // response to the server SETTINGS frame.
+        // It is not enough to use a latch on the server to
+        // wait for the reply frame, since the client may have
+        // sent the bytes, but not yet be ready to write again.
+        Thread.sleep(1000);
+
+        // Now the client is supposed to not send more frames.
+        // If it does, the connection must be closed.
+        HTTP2Session http2Session = (HTTP2Session)session;
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(connector.getByteBufferPool());
+        ByteBuffer extraData = ByteBuffer.allocate(1024);
+        http2Session.getGenerator().data(lease, new DataFrame(stream.getId(), extraData, true), extraData.remaining());
+        List<ByteBuffer> buffers = lease.getByteBuffers();
+        http2Session.getEndPoint().write(Callback.NOOP, buffers.toArray(new ByteBuffer[buffers.size()]));
+
+        // Expect the connection to be closed.
+        Assert.assertTrue(closeLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testClientExceedingStreamWindow() throws Exception
+    {
+        // On server, we don't consume the data.
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Map<Integer, Integer> onPreface(Session session)
+            {
+                // Enlarge the session window.
+                ((ISession)session).updateRecvWindow(FlowControlStrategy.DEFAULT_WINDOW_SIZE);
+                return super.onPreface(session);
+            }
+        });
+
+        final CountDownLatch closeLatch = new CountDownLatch(1);
+        Session session = newClient(new Session.Listener.Adapter()
+        {
+            @Override
+            public void onClose(Session session, GoAwayFrame frame)
+            {
+                if (frame.getError() == ErrorCode.FLOW_CONTROL_ERROR.code)
+                    closeLatch.countDown();
+            }
+        });
+
+        // Consume the whole stream window.
+        MetaData.Request metaData = newRequest("POST", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(metaData, null, false);
+        FuturePromise<Stream> streamPromise = new FuturePromise<>();
+        session.newStream(requestFrame, streamPromise, new Stream.Listener.Adapter());
+        Stream stream = streamPromise.get(5, TimeUnit.SECONDS);
+        ByteBuffer data = ByteBuffer.allocate(FlowControlStrategy.DEFAULT_WINDOW_SIZE);
+        final CountDownLatch dataLatch = new CountDownLatch(1);
+        stream.data(new DataFrame(stream.getId(), data, false), new Callback.NonBlocking()
+        {
+            @Override
+            public void succeeded()
+            {
+                dataLatch.countDown();
+            }
+        });
+        Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
+
+        // Wait for a while before doing the "sneaky" write
+        // below, see comments in the previous test case.
+        Thread.sleep(1000);
+
+        // Now the client is supposed to not send more frames.
+        // If it does, the connection must be closed.
+        HTTP2Session http2Session = (HTTP2Session)session;
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(connector.getByteBufferPool());
+        ByteBuffer extraData = ByteBuffer.allocate(1024);
+        http2Session.getGenerator().data(lease, new DataFrame(stream.getId(), extraData, true), extraData.remaining());
+        List<ByteBuffer> buffers = lease.getByteBuffers();
+        http2Session.getEndPoint().write(Callback.NOOP, buffers.toArray(new ByteBuffer[buffers.size()]));
+
+        // Expect the connection to be closed.
+        Assert.assertTrue(closeLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testFlowControlWhenServerResetsStream() throws Exception
+    {
+        // On server, don't consume the data and immediately reset.
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                MetaData.Request request = (MetaData.Request)frame.getMetaData();
+
+                if (HttpMethod.GET.is(request.getMethod()))
+                    return new Stream.Listener.Adapter();
+
+                return new Stream.Listener.Adapter()
+                {
+                    @Override
+                    public void onData(Stream stream, DataFrame frame, Callback callback)
+                    {
+                        // Fail the callback to enlarge the session window.
+                        // More data frames will be discarded because the
+                        // stream is reset, and automatically consumed to
+                        // keep the session window large for other streams.
+                        callback.failed(new Throwable());
+                        stream.reset(new ResetFrame(stream.getId(), ErrorCode.CANCEL_STREAM_ERROR.code), Callback.NOOP);
+                    }
+                };
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+        MetaData.Request metaData = newRequest("POST", new HttpFields());
+        HeadersFrame frame = new HeadersFrame(metaData, null, false);
+        FuturePromise<Stream> streamPromise = new FuturePromise<>();
+        final CountDownLatch resetLatch = new CountDownLatch(1);
+        session.newStream(frame, streamPromise, new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onReset(Stream stream, ResetFrame frame)
+            {
+                resetLatch.countDown();
+            }
+        });
+        Stream stream = streamPromise.get(5, TimeUnit.SECONDS);
+
+        // Perform a big upload that will stall the flow control windows.
+        ByteBuffer data = ByteBuffer.allocate(5 * FlowControlStrategy.DEFAULT_WINDOW_SIZE);
+        final CountDownLatch dataLatch = new CountDownLatch(1);
+        stream.data(new DataFrame(stream.getId(), data, true), new Callback.NonBlocking()
+        {
+            @Override
+            public void failed(Throwable x)
+            {
+                dataLatch.countDown();
+            }
+        });
+
+        Assert.assertTrue(resetLatch.await(5, TimeUnit.SECONDS));
+        Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/HTTP2Test.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/HTTP2Test.java
new file mode 100644
index 0000000..03ad6b2
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/HTTP2Test.java
@@ -0,0 +1,288 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.util.Random;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.HostPortHttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpScheme;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.GoAwayFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.Jetty;
+import org.eclipse.jetty.util.Promise;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class HTTP2Test extends AbstractTest
+{
+    @Test
+    public void testRequestNoContentResponseNoContent() throws Exception
+    {
+        start(new EmptyHttpServlet());
+
+        Session session = newClient(new Session.Listener.Adapter());
+
+        HttpFields fields = new HttpFields();
+        MetaData.Request metaData = newRequest("GET", fields);
+        HeadersFrame frame = new HeadersFrame(metaData, null, true);
+        final CountDownLatch latch = new CountDownLatch(1);
+        session.newStream(frame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                Assert.assertTrue(stream.getId() > 0);
+
+                Assert.assertTrue(frame.isEndStream());
+                Assert.assertEquals(stream.getId(), frame.getStreamId());
+                Assert.assertTrue(frame.getMetaData().isResponse());
+                MetaData.Response response = (MetaData.Response)frame.getMetaData();
+                Assert.assertEquals(200, response.getStatus());
+
+                latch.countDown();
+            }
+        });
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testRequestNoContentResponseContent() throws Exception
+    {
+        final byte[] content = "Hello World!".getBytes(StandardCharsets.UTF_8);
+        start(new HttpServlet()
+        {
+            @Override
+            protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+            {
+                resp.getOutputStream().write(content);
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+
+        HttpFields fields = new HttpFields();
+        MetaData.Request metaData = newRequest("GET", fields);
+        HeadersFrame frame = new HeadersFrame(metaData, null, true);
+        final CountDownLatch latch = new CountDownLatch(2);
+        session.newStream(frame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                Assert.assertTrue(stream.getId() > 0);
+
+                Assert.assertFalse(frame.isEndStream());
+                Assert.assertEquals(stream.getId(), frame.getStreamId());
+                Assert.assertTrue(frame.getMetaData().isResponse());
+                MetaData.Response response = (MetaData.Response)frame.getMetaData();
+                Assert.assertEquals(200, response.getStatus());
+
+                latch.countDown();
+            }
+
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                Assert.assertTrue(frame.isEndStream());
+                Assert.assertEquals(ByteBuffer.wrap(content), frame.getData());
+
+                callback.succeeded();
+                latch.countDown();
+            }
+        });
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testMultipleRequests() throws Exception
+    {
+        final String downloadBytes = "X-Download";
+        start(new HttpServlet()
+        {
+            @Override
+            protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                int download = request.getIntHeader(downloadBytes);
+                byte[] content = new byte[download];
+                new Random().nextBytes(content);
+                response.getOutputStream().write(content);
+            }
+        });
+
+        int requests = 20;
+        Session session = newClient(new Session.Listener.Adapter());
+
+        Random random = new Random();
+        HttpFields fields = new HttpFields();
+        fields.putLongField(downloadBytes, random.nextInt(128 * 1024));
+        fields.put("User-Agent", "HTTP2Client/" + Jetty.VERSION);
+        MetaData.Request metaData = newRequest("GET", fields);
+        HeadersFrame frame = new HeadersFrame(metaData, null, true);
+        final CountDownLatch latch = new CountDownLatch(requests);
+        for (int i = 0; i < requests; ++i)
+        {
+            session.newStream(frame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
+            {
+                @Override
+                public void onData(Stream stream, DataFrame frame, Callback callback)
+                {
+                    callback.succeeded();
+                    if (frame.isEndStream())
+                        latch.countDown();
+                }
+            });
+        }
+
+        Assert.assertTrue(latch.await(requests, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testCustomResponseCode() throws Exception
+    {
+        final int status = 475;
+        start(new HttpServlet()
+        {
+            @Override
+            protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                response.setStatus(status);
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+        HttpFields fields = new HttpFields();
+        MetaData.Request metaData = newRequest("GET", fields);
+        HeadersFrame frame = new HeadersFrame(metaData, null, true);
+        final CountDownLatch latch = new CountDownLatch(1);
+        session.newStream(frame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                MetaData.Response response = (MetaData.Response)frame.getMetaData();
+                Assert.assertEquals(status, response.getStatus());
+                if (frame.isEndStream())
+                    latch.countDown();
+            }
+        });
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testHostHeader() throws Exception
+    {
+        final String host = "fooBar";
+        final int port = 1313;
+        final String authority = host + ":" + port;
+        start(new HttpServlet()
+        {
+            @Override
+            protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                Assert.assertEquals(host, request.getServerName());
+                Assert.assertEquals(port, request.getServerPort());
+                Assert.assertEquals(authority, request.getHeader("Host"));
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+        HostPortHttpField hostHeader = new HostPortHttpField(authority);
+        MetaData.Request metaData = new MetaData.Request("GET", HttpScheme.HTTP, hostHeader, servletPath, HttpVersion.HTTP_2, new HttpFields());
+        HeadersFrame frame = new HeadersFrame(metaData, null, true);
+        final CountDownLatch latch = new CountDownLatch(1);
+        session.newStream(frame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                MetaData.Response response = (MetaData.Response)frame.getMetaData();
+                Assert.assertEquals(200, response.getStatus());
+                if (frame.isEndStream())
+                    latch.countDown();
+            }
+        });
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testServerSendsGoAwayOnStop() throws Exception
+    {
+        start(new ServerSessionListener.Adapter());
+
+        CountDownLatch closeLatch = new CountDownLatch(1);
+        newClient(new Session.Listener.Adapter()
+        {
+            @Override
+            public void onClose(Session session, GoAwayFrame frame)
+            {
+                closeLatch.countDown();
+            }
+        });
+
+        Thread.sleep(1000);
+
+        server.stop();
+
+        Assert.assertTrue(closeLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testClientSendsGoAwayOnStop() throws Exception
+    {
+        CountDownLatch closeLatch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public void onClose(Session session, GoAwayFrame frame)
+            {
+                closeLatch.countDown();
+            }
+        });
+
+        newClient(new Session.Listener.Adapter());
+
+        Thread.sleep(1000);
+
+        client.stop();
+
+        Assert.assertTrue(closeLatch.await(5, TimeUnit.SECONDS));
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/IdleTimeoutTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/IdleTimeoutTest.java
new file mode 100644
index 0000000..f03a3f6
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/IdleTimeoutTest.java
@@ -0,0 +1,536 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.http2.client;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.HTTP2Session;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.GoAwayFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.ResetFrame;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.FuturePromise;
+import org.eclipse.jetty.util.Promise;
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.hamcrest.core.IsInstanceOf.instanceOf;
+import static org.junit.Assert.assertThat;
+
+public class IdleTimeoutTest extends AbstractTest
+{
+    private final int idleTimeout = 1000;
+
+    @Test
+    public void testServerEnforcingIdleTimeout() throws Exception
+    {
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame requestFrame)
+            {
+                stream.setIdleTimeout(10 * idleTimeout);
+                MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                HeadersFrame responseFrame = new HeadersFrame(stream.getId(), metaData, null, true);
+                stream.headers(responseFrame, Callback.NOOP);
+                return null;
+            }
+        });
+        connector.setIdleTimeout(idleTimeout);
+
+        final CountDownLatch latch = new CountDownLatch(1);
+        Session session = newClient(new Session.Listener.Adapter()
+        {
+            @Override
+            public void onClose(Session session, GoAwayFrame frame)
+            {
+                if (session.isClosed() && ((HTTP2Session)session).isDisconnected())
+                    latch.countDown();
+            }
+        });
+
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(metaData, null, true);
+        session.newStream(requestFrame, new Promise.Adapter<Stream>()
+        {
+            @Override
+            public void succeeded(Stream stream)
+            {
+                stream.setIdleTimeout(10 * idleTimeout);
+            }
+        }, new Stream.Listener.Adapter());
+
+        Assert.assertTrue(latch.await(2 * idleTimeout, TimeUnit.MILLISECONDS));
+
+        sleep(1000);
+    }
+
+    @Test
+    public void testServerEnforcingIdleTimeoutWithUnrespondedStream() throws Exception
+    {
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                stream.setIdleTimeout(10 * idleTimeout);
+                return null;
+            }
+        });
+        connector.setIdleTimeout(idleTimeout);
+
+        final CountDownLatch latch = new CountDownLatch(1);
+        Session session = newClient(new Session.Listener.Adapter()
+        {
+            @Override
+            public void onClose(Session session, GoAwayFrame frame)
+            {
+                if (session.isClosed() && ((HTTP2Session)session).isDisconnected())
+                    latch.countDown();
+            }
+        });
+
+        // The request is not replied, and the server should idle timeout.
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(metaData, null, true);
+        session.newStream(requestFrame, new Promise.Adapter<Stream>()
+        {
+            @Override
+            public void succeeded(Stream stream)
+            {
+                stream.setIdleTimeout(10 * idleTimeout);
+            }
+        }, new Stream.Listener.Adapter());
+
+        Assert.assertTrue(latch.await(2 * idleTimeout, TimeUnit.MILLISECONDS));
+    }
+
+    @Test
+    public void testServerNotEnforcingIdleTimeoutWithinCallback() throws Exception
+    {
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                stream.setIdleTimeout(10 * idleTimeout);
+                // Stay in the callback for more than idleTimeout,
+                // but not for an integer number of idle timeouts,
+                // to avoid a race where the idle timeout fires
+                // again before we can send the headers to the client.
+                sleep(idleTimeout + idleTimeout / 2);
+                MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                HeadersFrame responseFrame = new HeadersFrame(stream.getId(), metaData, null, true);
+                stream.headers(responseFrame, Callback.NOOP);
+                return null;
+            }
+        });
+        connector.setIdleTimeout(idleTimeout);
+
+        final CountDownLatch closeLatch = new CountDownLatch(1);
+        Session session = newClient(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public void onClose(Session session, GoAwayFrame frame)
+            {
+                closeLatch.countDown();
+            }
+        });
+
+        final CountDownLatch replyLatch = new CountDownLatch(1);
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(metaData, null, true);
+        session.newStream(requestFrame, new Promise.Adapter<Stream>()
+        {
+            @Override
+            public void succeeded(Stream stream)
+            {
+                stream.setIdleTimeout(10 * idleTimeout);
+            }
+        }, new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                replyLatch.countDown();
+            }
+        });
+
+        Assert.assertTrue(replyLatch.await(3 * idleTimeout, TimeUnit.MILLISECONDS));
+
+        // Just make sure onClose() has never been called, but don't wait too much
+        Assert.assertFalse(closeLatch.await(idleTimeout / 2, TimeUnit.MILLISECONDS));
+    }
+
+    @Test
+    public void testClientEnforcingIdleTimeout() throws Exception
+    {
+        final CountDownLatch closeLatch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                stream.setIdleTimeout(10 * idleTimeout);
+                MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                HeadersFrame responseFrame = new HeadersFrame(stream.getId(), metaData, null, true);
+                stream.headers(responseFrame, Callback.NOOP);
+                return null;
+            }
+
+            @Override
+            public void onClose(Session session, GoAwayFrame frame)
+            {
+                if (session.isClosed() && ((HTTP2Session)session).isDisconnected())
+                    closeLatch.countDown();
+            }
+        });
+        client.setIdleTimeout(idleTimeout);
+
+        Session session = newClient(new Session.Listener.Adapter());
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(metaData, null, true);
+        session.newStream(requestFrame, new Promise.Adapter<Stream>()
+        {
+            @Override
+            public void succeeded(Stream stream)
+            {
+                stream.setIdleTimeout(10 * idleTimeout);
+            }
+        }, new Stream.Listener.Adapter());
+
+        Assert.assertTrue(closeLatch.await(2 * idleTimeout, TimeUnit.MILLISECONDS));
+        Assert.assertTrue(session.isClosed());
+    }
+
+    @Test
+    public void testClientEnforcingIdleTimeoutWithUnrespondedStream() throws Exception
+    {
+        final CountDownLatch closeLatch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                stream.setIdleTimeout(10 * idleTimeout);
+                return null;
+            }
+
+            @Override
+            public void onClose(Session session, GoAwayFrame frame)
+            {
+                if (session.isClosed() && ((HTTP2Session)session).isDisconnected())
+                    closeLatch.countDown();
+            }
+        });
+        client.setIdleTimeout(idleTimeout);
+
+        Session session = newClient(new Session.Listener.Adapter());
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(metaData, null, true);
+        session.newStream(requestFrame, new Promise.Adapter<Stream>()
+        {
+            @Override
+            public void succeeded(Stream stream)
+            {
+                stream.setIdleTimeout(10 * idleTimeout);
+            }
+        }, new Stream.Listener.Adapter());
+
+        Assert.assertTrue(closeLatch.await(2 * idleTimeout, TimeUnit.MILLISECONDS));
+    }
+
+    @Test
+    public void testClientNotEnforcingIdleTimeoutWithinCallback() throws Exception
+    {
+        final CountDownLatch closeLatch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                stream.setIdleTimeout(10 * idleTimeout);
+                MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                HeadersFrame responseFrame = new HeadersFrame(stream.getId(), metaData, null, true);
+                stream.headers(responseFrame, Callback.NOOP);
+                return null;
+            }
+
+            @Override
+            public void onClose(Session session, GoAwayFrame frame)
+            {
+                closeLatch.countDown();
+            }
+        });
+        client.setIdleTimeout(idleTimeout);
+
+        Session session = newClient(new Session.Listener.Adapter());
+
+        final CountDownLatch replyLatch = new CountDownLatch(1);
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(metaData, null, true);
+        session.newStream(requestFrame, new Promise.Adapter<Stream>()
+        {
+            @Override
+            public void succeeded(Stream stream)
+            {
+                stream.setIdleTimeout(10 * idleTimeout);
+            }
+        }, new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                // Stay in the callback for more than idleTimeout,
+                // but not for an integer number of idle timeouts,
+                // to avoid that the idle timeout fires again.
+                sleep(idleTimeout + idleTimeout / 2);
+                replyLatch.countDown();
+            }
+        });
+
+        Assert.assertFalse(closeLatch.await(2 * idleTimeout, TimeUnit.MILLISECONDS));
+        Assert.assertTrue(replyLatch.await(3 * idleTimeout, TimeUnit.MILLISECONDS));
+    }
+
+    @Test
+    public void testClientEnforcingStreamIdleTimeout() throws Exception
+    {
+        final int idleTimeout = 1000;
+        start(new HttpServlet()
+        {
+            @Override
+            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+            {
+                sleep(2 * idleTimeout);
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+
+        final CountDownLatch dataLatch = new CountDownLatch(1);
+        final CountDownLatch timeoutLatch = new CountDownLatch(1);
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(metaData, null, true);
+        session.newStream(requestFrame, new Promise.Adapter<Stream>()
+        {
+            @Override
+            public void succeeded(Stream stream)
+            {
+                stream.setIdleTimeout(idleTimeout);
+            }
+        }, new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                dataLatch.countDown();
+            }
+
+            @Override
+            public void onTimeout(Stream stream, Throwable x)
+            {
+                assertThat(x, instanceOf(TimeoutException.class));
+                timeoutLatch.countDown();
+            }
+        });
+
+        Assert.assertTrue(timeoutLatch.await(5, TimeUnit.SECONDS));
+        // We must not receive any DATA frame.
+        Assert.assertFalse(dataLatch.await(2 * idleTimeout, TimeUnit.MILLISECONDS));
+        // Stream must be gone.
+        Assert.assertTrue(session.getStreams().isEmpty());
+        // Session must not be closed, nor disconnected.
+        Assert.assertFalse(session.isClosed());
+        Assert.assertFalse(((HTTP2Session)session).isDisconnected());
+    }
+
+    @Test
+    public void testServerEnforcingStreamIdleTimeout() throws Exception
+    {
+        final CountDownLatch timeoutLatch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                stream.setIdleTimeout(idleTimeout);
+                return new Stream.Listener.Adapter()
+                {
+                    @Override
+                    public void onTimeout(Stream stream, Throwable x)
+                    {
+                        timeoutLatch.countDown();
+                    }
+                };
+            }
+        });
+
+        final CountDownLatch resetLatch = new CountDownLatch(1);
+        Session session = newClient(new Session.Listener.Adapter());
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        // Stream does not end here, but we won't send any DATA frame.
+        HeadersFrame requestFrame = new HeadersFrame(metaData, null, false);
+        session.newStream(requestFrame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onReset(Stream stream, ResetFrame frame)
+            {
+                resetLatch.countDown();
+            }
+        });
+
+        Assert.assertTrue(timeoutLatch.await(5, TimeUnit.SECONDS));
+        Assert.assertTrue(resetLatch.await(5, TimeUnit.SECONDS));
+        // Stream must be gone.
+        Assert.assertTrue(session.getStreams().isEmpty());
+        // Session must not be closed, nor disconnected.
+        Assert.assertFalse(session.isClosed());
+        Assert.assertFalse(((HTTP2Session)session).isDisconnected());
+    }
+
+    @Test
+    public void testStreamIdleTimeoutIsNotEnforcedWhenReceiving() throws Exception
+    {
+        final CountDownLatch timeoutLatch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                stream.setIdleTimeout(idleTimeout);
+                return new Stream.Listener.Adapter()
+                {
+                    @Override
+                    public void onTimeout(Stream stream, Throwable x)
+                    {
+                        timeoutLatch.countDown();
+                    }
+                };
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(metaData, null, false);
+        FuturePromise<Stream> promise = new FuturePromise<>();
+        session.newStream(requestFrame, promise, new Stream.Listener.Adapter());
+        final Stream stream = promise.get(5, TimeUnit.SECONDS);
+
+        sleep(idleTimeout / 2);
+        final CountDownLatch dataLatch = new CountDownLatch(1);
+        stream.data(new DataFrame(stream.getId(), ByteBuffer.allocate(1), false), new Callback()
+        {
+            private int sends;
+
+            @Override
+            public void succeeded()
+            {
+                sleep(idleTimeout / 2);
+                final boolean last = ++sends == 2;
+                stream.data(new DataFrame(stream.getId(), ByteBuffer.allocate(1), last), !last ? this : new Callback.NonBlocking()
+                {
+                    @Override
+                    public void succeeded()
+                    {
+                        dataLatch.countDown();
+                    }
+                });
+            }
+        });
+
+        Assert.assertTrue(dataLatch.await(2 * idleTimeout, TimeUnit.MILLISECONDS));
+        Assert.assertFalse(timeoutLatch.await(0, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testStreamIdleTimeoutIsNotEnforcedWhenSending() throws Exception
+    {
+        final CountDownLatch resetLatch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                MetaData.Response response = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                stream.headers(new HeadersFrame(stream.getId(), response, null, true), Callback.NOOP);
+                return null;
+            }
+
+            @Override
+            public void onReset(Session session, ResetFrame frame)
+            {
+                resetLatch.countDown();
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(metaData, null, false);
+        FuturePromise<Stream> promise = new FuturePromise<Stream>()
+        {
+            @Override
+            public void succeeded(Stream stream)
+            {
+                stream.setIdleTimeout(idleTimeout);
+                super.succeeded(stream);
+            }
+        };
+        session.newStream(requestFrame, promise, new Stream.Listener.Adapter());
+        final Stream stream = promise.get(5, TimeUnit.SECONDS);
+
+        sleep(idleTimeout / 2);
+        stream.data(new DataFrame(stream.getId(), ByteBuffer.allocate(1), false), Callback.NOOP);
+        sleep(idleTimeout / 2);
+        stream.data(new DataFrame(stream.getId(), ByteBuffer.allocate(1), false), Callback.NOOP);
+        sleep(idleTimeout / 2);
+        stream.data(new DataFrame(stream.getId(), ByteBuffer.allocate(1), true), Callback.NOOP);
+
+        Assert.assertFalse(resetLatch.await(0, TimeUnit.SECONDS));
+    }
+
+    private void sleep(long value)
+    {
+        try
+        {
+            TimeUnit.MILLISECONDS.sleep(value);
+        }
+        catch (InterruptedException x)
+        {
+            Assert.fail();
+        }
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PingTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PingTest.java
new file mode 100644
index 0000000..4f03182
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PingTest.java
@@ -0,0 +1,58 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.util.Random;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.frames.PingFrame;
+import org.eclipse.jetty.util.Callback;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class PingTest extends AbstractTest
+{
+    @Test
+    public void testPing() throws Exception
+    {
+        start(new ServerSessionListener.Adapter());
+
+        final byte[] payload = new byte[8];
+        new Random().nextBytes(payload);
+        final CountDownLatch latch = new CountDownLatch(1);
+        Session session = newClient(new Session.Listener.Adapter()
+        {
+            @Override
+            public void onPing(Session session, PingFrame frame)
+            {
+                Assert.assertTrue(frame.isReply());
+                Assert.assertArrayEquals(payload, frame.getPayload());
+                latch.countDown();
+            }
+        });
+
+        PingFrame frame = new PingFrame(payload, false);
+        session.ping(frame, Callback.NOOP);
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PrefaceTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PrefaceTest.java
new file mode 100644
index 0000000..9f353ad
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PrefaceTest.java
@@ -0,0 +1,327 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PingFrame;
+import org.eclipse.jetty.http2.frames.PrefaceFrame;
+import org.eclipse.jetty.http2.frames.SettingsFrame;
+import org.eclipse.jetty.http2.generator.Generator;
+import org.eclipse.jetty.http2.parser.Parser;
+import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.MappedByteBufferPool;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.util.ArrayQueue;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.Promise;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class PrefaceTest extends AbstractTest
+{
+    @Test
+    public void testServerPrefaceReplySentAfterClientPreface() throws Exception
+    {
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public void onAccept(Session session)
+            {
+                // Send the server preface from here.
+                session.settings(new SettingsFrame(new HashMap<>(), false), Callback.NOOP);
+            }
+
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                HeadersFrame responseFrame = new HeadersFrame(stream.getId(), metaData, null, true);
+                stream.headers(responseFrame, Callback.NOOP);
+                return null;
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter()
+        {
+            @Override
+            public Map<Integer, Integer> onPreface(Session session)
+            {
+                try
+                {
+                    // Wait for the server preface (a SETTINGS frame) to
+                    // arrive on the client, and for its reply to be sent.
+                    Thread.sleep(1000);
+                    return null;
+                }
+                catch (InterruptedException x)
+                {
+                    x.printStackTrace();
+                    return null;
+                }
+            }
+        });
+
+        CountDownLatch latch = new CountDownLatch(1);
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(metaData, null, true);
+        session.newStream(requestFrame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                if (frame.isEndStream())
+                    latch.countDown();
+            }
+        });
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testClientPrefaceReplySentAfterServerPreface() throws Exception
+    {
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Map<Integer, Integer> onPreface(Session session)
+            {
+                Map<Integer, Integer> settings = new HashMap<>();
+                settings.put(SettingsFrame.MAX_CONCURRENT_STREAMS, 128);
+                return settings;
+            }
+
+            @Override
+            public void onPing(Session session, PingFrame frame)
+            {
+                session.close(ErrorCode.NO_ERROR.code, null, Callback.NOOP);
+            }
+        });
+
+        ByteBufferPool byteBufferPool = client.getByteBufferPool();
+        try (SocketChannel socket = SocketChannel.open())
+        {
+            socket.connect(new InetSocketAddress("localhost", connector.getLocalPort()));
+
+            Generator generator = new Generator(byteBufferPool);
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            generator.control(lease, new PrefaceFrame());
+            Map<Integer, Integer> clientSettings = new HashMap<>();
+            clientSettings.put(SettingsFrame.ENABLE_PUSH, 0);
+            generator.control(lease, new SettingsFrame(clientSettings, false));
+            // The PING frame just to make sure the client stops reading.
+            generator.control(lease, new PingFrame(true));
+
+            List<ByteBuffer> buffers = lease.getByteBuffers();
+            socket.write(buffers.toArray(new ByteBuffer[buffers.size()]));
+
+            Queue<SettingsFrame> settings = new ArrayQueue<>();
+            Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+            {
+                @Override
+                public void onSettings(SettingsFrame frame)
+                {
+                    settings.offer(frame);
+                }
+            }, 4096, 8192);
+
+            ByteBuffer buffer = byteBufferPool.acquire(1024, true);
+            while (true)
+            {
+                int read = socket.read(buffer);
+                buffer.flip();
+                if (read < 0)
+                    break;
+                parser.parse(buffer);
+                buffer.clear();
+            }
+
+            Assert.assertEquals(2, settings.size());
+            SettingsFrame frame1 = settings.poll();
+            Assert.assertFalse(frame1.isReply());
+            SettingsFrame frame2 = settings.poll();
+            Assert.assertTrue(frame2.isReply());
+        }
+    }
+
+    @Test
+    public void testOnPrefaceNotifiedForStandardUpgrade() throws Exception
+    {
+        Integer maxConcurrentStreams = 128;
+        AtomicReference<CountDownLatch> serverPrefaceLatch = new AtomicReference<>(new CountDownLatch(1));
+        AtomicReference<CountDownLatch> serverSettingsLatch = new AtomicReference<>(new CountDownLatch(1));
+        HttpConfiguration config = new HttpConfiguration();
+        prepareServer(new HttpConnectionFactory(config), new HTTP2CServerConnectionFactory(config)
+        {
+            @Override
+            protected ServerSessionListener newSessionListener(Connector connector, EndPoint endPoint)
+            {
+                return new ServerSessionListener.Adapter()
+                {
+                    @Override
+                    public Map<Integer, Integer> onPreface(Session session)
+                    {
+                        Map<Integer, Integer> serverSettings = new HashMap<>();
+                        serverSettings.put(SettingsFrame.MAX_CONCURRENT_STREAMS, maxConcurrentStreams);
+                        serverPrefaceLatch.get().countDown();
+                        return serverSettings;
+                    }
+
+                    @Override
+                    public void onSettings(Session session, SettingsFrame frame)
+                    {
+                        serverSettingsLatch.get().countDown();
+                    }
+
+                    @Override
+                    public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+                    {
+                        MetaData.Response response = new MetaData.Response(HttpVersion.HTTP_2, HttpStatus.OK_200, new HttpFields());
+                        stream.headers(new HeadersFrame(stream.getId(), response, null, true), Callback.NOOP);
+                        return null;
+                    }
+                };
+            }
+        });
+        server.start();
+
+        ByteBufferPool byteBufferPool = new MappedByteBufferPool();
+        try (SocketChannel socket = SocketChannel.open())
+        {
+            socket.connect(new InetSocketAddress("localhost", connector.getLocalPort()));
+
+            String upgradeRequest = "" +
+                    "GET /one HTTP/1.1\r\n" +
+                    "Host: localhost\r\n" +
+                    "Connection: Upgrade, HTTP2-Settings\r\n" +
+                    "Upgrade: h2c\r\n" +
+                    "HTTP2-Settings: \r\n" +
+                    "\r\n";
+            ByteBuffer upgradeBuffer = ByteBuffer.wrap(upgradeRequest.getBytes(StandardCharsets.ISO_8859_1));
+            socket.write(upgradeBuffer);
+
+            // Make sure onPreface() is called on server.
+            Assert.assertTrue(serverPrefaceLatch.get().await(5, TimeUnit.SECONDS));
+            Assert.assertTrue(serverSettingsLatch.get().await(5, TimeUnit.SECONDS));
+
+            // The 101 response is the reply to the client preface SETTINGS frame.
+            ByteBuffer buffer = byteBufferPool.acquire(1024, true);
+            http1: while (true)
+            {
+                buffer.clear();
+                int read = socket.read(buffer);
+                buffer.flip();
+                if (read < 0)
+                    Assert.fail();
+
+                int crlfs = 0;
+                while (buffer.hasRemaining())
+                {
+                    byte b = buffer.get();
+                    if (b == '\r' || b == '\n')
+                        ++crlfs;
+                    else
+                        crlfs = 0;
+                    if (crlfs == 4)
+                        break http1;
+                }
+            }
+
+            // Reset the latches on server.
+            serverPrefaceLatch.set(new CountDownLatch(1));
+            serverSettingsLatch.set(new CountDownLatch(1));
+
+            // After the 101, the client must send the connection preface.
+            Generator generator = new Generator(byteBufferPool);
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            generator.control(lease, new PrefaceFrame());
+            Map<Integer, Integer> clientSettings = new HashMap<>();
+            clientSettings.put(SettingsFrame.ENABLE_PUSH, 1);
+            generator.control(lease, new SettingsFrame(clientSettings, false));
+            List<ByteBuffer> buffers = lease.getByteBuffers();
+            socket.write(buffers.toArray(new ByteBuffer[buffers.size()]));
+
+            // However, we should not call onPreface() again.
+            Assert.assertFalse(serverPrefaceLatch.get().await(1, TimeUnit.SECONDS));
+            // Although we should notify of the SETTINGS frame.
+            Assert.assertTrue(serverSettingsLatch.get().await(5, TimeUnit.SECONDS));
+
+            CountDownLatch clientSettingsLatch = new CountDownLatch(1);
+            AtomicBoolean responded = new AtomicBoolean();
+            Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+            {
+                @Override
+                public void onSettings(SettingsFrame frame)
+                {
+                    if (frame.isReply())
+                        return;
+                    Assert.assertEquals(maxConcurrentStreams, frame.getSettings().get(SettingsFrame.MAX_CONCURRENT_STREAMS));
+                    clientSettingsLatch.countDown();
+                }
+
+                @Override
+                public void onHeaders(HeadersFrame frame)
+                {
+                    if (frame.isEndStream())
+                        responded.set(true);
+                }
+            }, 4096, 8192);
+
+            // HTTP/2 parsing.
+            while (true)
+            {
+                parser.parse(buffer);
+                if (responded.get())
+                    break;
+
+                buffer.clear();
+                int read = socket.read(buffer);
+                buffer.flip();
+                if (read < 0)
+                    Assert.fail();
+            }
+
+            Assert.assertTrue(clientSettingsLatch.await(5, TimeUnit.SECONDS));
+        }
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PriorityTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PriorityTest.java
new file mode 100644
index 0000000..100dc7a
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PriorityTest.java
@@ -0,0 +1,184 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PriorityFrame;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.FuturePromise;
+import org.eclipse.jetty.util.Promise;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class PriorityTest extends AbstractTest
+{
+    @Test
+    public void testPriorityBeforeHeaders() throws Exception
+    {
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                HeadersFrame responseFrame = new HeadersFrame(stream.getId(), metaData, null, true);
+                stream.headers(responseFrame, Callback.NOOP);
+                return null;
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+        int streamId = session.priority(new PriorityFrame(0, 13, false), Callback.NOOP);
+        Assert.assertTrue(streamId > 0);
+
+        CountDownLatch latch = new CountDownLatch(2);
+        MetaData metaData = newRequest("GET", new HttpFields());
+        HeadersFrame headersFrame = new HeadersFrame(streamId, metaData, null, true);
+        session.newStream(headersFrame, new Promise.Adapter<Stream>()
+        {
+            @Override
+            public void succeeded(Stream result)
+            {
+                Assert.assertEquals(streamId, result.getId());
+                latch.countDown();
+            }
+        }, new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                if (frame.isEndStream())
+                    latch.countDown();
+            }
+        });
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testPriorityAfterHeaders() throws Exception
+    {
+        CountDownLatch beforeRequests = new CountDownLatch(1);
+        CountDownLatch afterRequests = new CountDownLatch(2);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                try
+                {
+                    beforeRequests.await(5, TimeUnit.SECONDS);
+                    MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                    HeadersFrame responseFrame = new HeadersFrame(stream.getId(), metaData, null, true);
+                    stream.headers(responseFrame, Callback.NOOP);
+                    afterRequests.countDown();
+                    return null;
+                }
+                catch (InterruptedException x)
+                {
+                    x.printStackTrace();
+                    return null;
+                }
+            }
+        });
+
+        CountDownLatch responses = new CountDownLatch(2);
+        Stream.Listener.Adapter listener = new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                if (frame.isEndStream())
+                    responses.countDown();
+            }
+        };
+
+        Session session = newClient(new Session.Listener.Adapter());
+        MetaData metaData1 = newRequest("GET", "/one", new HttpFields());
+        HeadersFrame headersFrame1 = new HeadersFrame(metaData1, null, true);
+        FuturePromise<Stream> promise1 = new FuturePromise<>();
+        session.newStream(headersFrame1, promise1, listener);
+        Stream stream1 = promise1.get(5, TimeUnit.SECONDS);
+
+        MetaData metaData2 = newRequest("GET", "/two", new HttpFields());
+        HeadersFrame headersFrame2 = new HeadersFrame(metaData2, null, true);
+        FuturePromise<Stream> promise2 = new FuturePromise<>();
+        session.newStream(headersFrame2, promise2, listener);
+        Stream stream2 = promise2.get(5, TimeUnit.SECONDS);
+
+        int streamId = session.priority(new PriorityFrame(stream1.getId(), stream2.getId(), 13, false), Callback.NOOP);
+        Assert.assertEquals(stream1.getId(), streamId);
+
+        // Give time to the PRIORITY frame to arrive to server.
+        Thread.sleep(1000);
+        beforeRequests.countDown();
+
+        Assert.assertTrue(afterRequests.await(5, TimeUnit.SECONDS));
+        Assert.assertTrue(responses.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testHeadersWithPriority() throws Exception
+    {
+        PriorityFrame priorityFrame = new PriorityFrame(13, 200, true);
+        CountDownLatch latch = new CountDownLatch(2);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                PriorityFrame priority = frame.getPriority();
+                Assert.assertNotNull(priority);
+                Assert.assertEquals(priorityFrame.getParentStreamId(), priority.getParentStreamId());
+                Assert.assertEquals(priorityFrame.getWeight(), priority.getWeight());
+                Assert.assertEquals(priorityFrame.isExclusive(), priority.isExclusive());
+                latch.countDown();
+
+                MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                HeadersFrame responseFrame = new HeadersFrame(stream.getId(), metaData, null, true);
+                stream.headers(responseFrame, Callback.NOOP);
+                return null;
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+        MetaData metaData = newRequest("GET", "/one", new HttpFields());
+        HeadersFrame headersFrame = new HeadersFrame(metaData, priorityFrame, true);
+        session.newStream(headersFrame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                if (frame.isEndStream())
+                    latch.countDown();
+            }
+        });
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/ProxyProtocolTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/ProxyProtocolTest.java
new file mode 100644
index 0000000..650cc26
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/ProxyProtocolTest.java
@@ -0,0 +1,121 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+import java.nio.charset.StandardCharsets;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.http.HttpURI;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory;
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.ProxyConnectionFactory;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.eclipse.jetty.util.FuturePromise;
+import org.eclipse.jetty.util.Promise;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ProxyProtocolTest
+{
+    private Server server;
+    private ServerConnector connector;
+    private HTTP2Client client;
+
+    public void startServer(Handler handler) throws Exception
+    {
+        server = new Server();
+        HttpConfiguration configuration = new HttpConfiguration();
+        connector = new ServerConnector(server, new ProxyConnectionFactory(), new HTTP2CServerConnectionFactory(configuration));
+        server.addConnector(connector);
+        server.setHandler(handler);
+
+        client = new HTTP2Client();
+        server.addBean(client, true);
+
+        server.start();
+    }
+
+    @After
+    public void dispose() throws Exception
+    {
+        if (server != null)
+            server.stop();
+    }
+
+    @Test
+    public void test_PROXY_GET() throws Exception
+    {
+        startServer(new AbstractHandler()
+        {
+            @Override
+            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+            {
+                baseRequest.setHandled(true);
+            }
+        });
+
+        String request1 = "PROXY TCP4 1.2.3.4 5.6.7.8 1111 2222\r\n";
+        SocketChannel channel = SocketChannel.open();
+        channel.connect(new InetSocketAddress("localhost", connector.getLocalPort()));
+        channel.write(ByteBuffer.wrap(request1.getBytes(StandardCharsets.UTF_8)));
+
+        FuturePromise<Session> promise = new FuturePromise<>();
+        client.accept(null, channel, new Session.Listener.Adapter(), promise);
+        Session session = promise.get(5, TimeUnit.SECONDS);
+
+        HttpFields fields = new HttpFields();
+        String uri = "http://localhost:" + connector.getLocalPort() + "/";
+        MetaData.Request metaData = new MetaData.Request("GET", new HttpURI(uri), HttpVersion.HTTP_2, fields);
+        HeadersFrame frame = new HeadersFrame(metaData, null, true);
+        CountDownLatch latch = new CountDownLatch(1);
+        session.newStream(frame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                MetaData.Response response = (MetaData.Response)frame.getMetaData();
+                Assert.assertEquals(HttpStatus.OK_200, response.getStatus());
+                if (frame.isEndStream())
+                    latch.countDown();
+            }
+        });
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/ProxyTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/ProxyTest.java
new file mode 100644
index 0000000..8a06ee3
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/ProxyTest.java
@@ -0,0 +1,196 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.client.api.Request;
+import org.eclipse.jetty.http.HostPortHttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpScheme;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
+import org.eclipse.jetty.proxy.AsyncProxyServlet;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.toolchain.test.TestTracker;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.FuturePromise;
+import org.eclipse.jetty.util.Promise;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class ProxyTest
+{
+    @Rule
+    public final TestTracker tracker = new TestTracker();
+    private HTTP2Client client;
+    private Server proxy;
+    private ServerConnector proxyConnector;
+    private Server server;
+    private ServerConnector serverConnector;
+
+    private void startServer(HttpServlet servlet) throws Exception
+    {
+        QueuedThreadPool serverPool = new QueuedThreadPool();
+        serverPool.setName("server");
+        server = new Server(serverPool);
+        serverConnector = new ServerConnector(server);
+        server.addConnector(serverConnector);
+
+        ServletContextHandler appCtx = new ServletContextHandler(server, "/", true, false);
+        ServletHolder appServletHolder = new ServletHolder(servlet);
+        appCtx.addServlet(appServletHolder, "/*");
+
+        server.start();
+    }
+
+    private void startProxy(HttpServlet proxyServlet, Map<String, String> initParams) throws Exception
+    {
+        QueuedThreadPool proxyPool = new QueuedThreadPool();
+        proxyPool.setName("proxy");
+        proxy = new Server(proxyPool);
+
+        HttpConfiguration configuration = new HttpConfiguration();
+        configuration.setSendDateHeader(false);
+        configuration.setSendServerVersion(false);
+        String value = initParams.get("outputBufferSize");
+        if (value != null)
+            configuration.setOutputBufferSize(Integer.valueOf(value));
+        proxyConnector = new ServerConnector(proxy, new HTTP2ServerConnectionFactory(configuration));
+        proxy.addConnector(proxyConnector);
+
+        ServletContextHandler proxyContext = new ServletContextHandler(proxy, "/", true, false);
+        ServletHolder proxyServletHolder = new ServletHolder(proxyServlet);
+        proxyServletHolder.setInitParameters(initParams);
+        proxyContext.addServlet(proxyServletHolder, "/*");
+
+        proxy.start();
+    }
+
+    private void startClient() throws Exception
+    {
+        QueuedThreadPool clientExecutor = new QueuedThreadPool();
+        clientExecutor.setName("client");
+        client = new HTTP2Client();
+        client.setExecutor(clientExecutor);
+        client.start();
+    }
+
+    private Session newClient(Session.Listener listener) throws Exception
+    {
+        String host = "localhost";
+        int port = proxyConnector.getLocalPort();
+        InetSocketAddress address = new InetSocketAddress(host, port);
+        FuturePromise<Session> promise = new FuturePromise<>();
+        client.connect(address, listener, promise);
+        return promise.get(5, TimeUnit.SECONDS);
+    }
+
+    private MetaData.Request newRequest(String method, String path, HttpFields fields)
+    {
+        String host = "localhost";
+        int port = proxyConnector.getLocalPort();
+        String authority = host + ":" + port;
+        return new MetaData.Request(method, HttpScheme.HTTP, new HostPortHttpField(authority), path, HttpVersion.HTTP_2, fields);
+    }
+
+    @After
+    public void dispose() throws Exception
+    {
+        client.stop();
+        proxy.stop();
+        server.stop();
+    }
+
+    @Test
+    public void testServerBigDownloadSlowClient() throws Exception
+    {
+        final CountDownLatch serverLatch = new CountDownLatch(1);
+        final byte[] content = new byte[1024 * 1024];
+        startServer(new HttpServlet()
+        {
+            @Override
+            protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                response.getOutputStream().write(content);
+                serverLatch.countDown();
+            }
+        });
+        Map<String, String> params = new HashMap<>();
+        params.put("proxyTo", "http://localhost:" + serverConnector.getLocalPort());
+        startProxy(new AsyncProxyServlet.Transparent()
+        {
+            @Override
+            protected void sendProxyRequest(HttpServletRequest clientRequest, HttpServletResponse proxyResponse, Request proxyRequest)
+            {
+                proxyRequest.version(HttpVersion.HTTP_1_1);
+                super.sendProxyRequest(clientRequest, proxyResponse, proxyRequest);
+            }
+        }, params);
+        startClient();
+
+        final CountDownLatch clientLatch = new CountDownLatch(1);
+        Session session = newClient(new Session.Listener.Adapter());
+        MetaData.Request metaData = newRequest("GET", "/", new HttpFields());
+        HeadersFrame frame = new HeadersFrame(metaData, null, true);
+        session.newStream(frame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                try
+                {
+                    TimeUnit.MILLISECONDS.sleep(1);
+                    callback.succeeded();
+                    if (frame.isEndStream())
+                        clientLatch.countDown();
+                }
+                catch (InterruptedException x)
+                {
+                    callback.failed(x);
+                }
+            }
+        });
+
+        Assert.assertTrue(serverLatch.await(15, TimeUnit.SECONDS));
+        Assert.assertTrue(clientLatch.await(15, TimeUnit.SECONDS));
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PushCacheFilterTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PushCacheFilterTest.java
new file mode 100644
index 0000000..1037b3b
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/PushCacheFilterTest.java
@@ -0,0 +1,727 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.EnumSet;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.DispatcherType;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PushPromiseFrame;
+import org.eclipse.jetty.http2.frames.ResetFrame;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlets.PushCacheFilter;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.Promise;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class PushCacheFilterTest extends AbstractTest
+{
+    @Override
+    protected void customizeContext(ServletContextHandler context)
+    {
+        context.addFilter(PushCacheFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
+    }
+
+    @Test
+    public void testPush() throws Exception
+    {
+        final String primaryResource = "/primary.html";
+        final String secondaryResource = "/secondary.png";
+        final byte[] secondaryData = "SECONDARY".getBytes("UTF-8");
+        start(new HttpServlet()
+        {
+            @Override
+            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+            {
+                String requestURI = req.getRequestURI();
+                ServletOutputStream output = resp.getOutputStream();
+                if (requestURI.endsWith(primaryResource))
+                    output.print("<html><head></head><body>PRIMARY</body></html>");
+                else if (requestURI.endsWith(secondaryResource))
+                    output.write(secondaryData);
+            }
+        });
+
+        final Session session = newClient(new Session.Listener.Adapter());
+
+        // Request for the primary and secondary resource to build the cache.
+        final String referrerURI = "http://localhost:" + connector.getLocalPort() + servletPath + primaryResource;
+        HttpFields primaryFields = new HttpFields();
+        MetaData.Request primaryRequest = newRequest("GET", primaryResource, primaryFields);
+        final CountDownLatch warmupLatch = new CountDownLatch(1);
+        session.newStream(new HeadersFrame(primaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                callback.succeeded();
+                if (frame.isEndStream())
+                {
+                    // Request for the secondary resource.
+                    HttpFields secondaryFields = new HttpFields();
+                    secondaryFields.put(HttpHeader.REFERER, referrerURI);
+                    MetaData.Request secondaryRequest = newRequest("GET", secondaryResource, secondaryFields);
+                    session.newStream(new HeadersFrame(secondaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+                    {
+                        @Override
+                        public void onData(Stream stream, DataFrame frame, Callback callback)
+                        {
+                            warmupLatch.countDown();
+                        }
+                    });
+                }
+            }
+        });
+        Assert.assertTrue(warmupLatch.await(5, TimeUnit.SECONDS));
+
+        // Request again the primary resource, we should get the secondary resource pushed.
+        primaryRequest = newRequest("GET", primaryResource, primaryFields);
+        final CountDownLatch primaryResponseLatch = new CountDownLatch(1);
+        final CountDownLatch pushLatch = new CountDownLatch(1);
+        session.newStream(new HeadersFrame(primaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public Stream.Listener onPush(Stream stream, PushPromiseFrame frame)
+            {
+                return new Adapter()
+                {
+                    @Override
+                    public void onData(Stream stream, DataFrame frame, Callback callback)
+                    {
+                        callback.succeeded();
+                        if (frame.isEndStream())
+                            pushLatch.countDown();
+                    }
+                };
+            }
+
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                callback.succeeded();
+                if (frame.isEndStream())
+                    primaryResponseLatch.countDown();
+            }
+        });
+        Assert.assertTrue(pushLatch.await(5, TimeUnit.SECONDS));
+        Assert.assertTrue(primaryResponseLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testPushReferrerNoPath() throws Exception
+    {
+        final String primaryResource = "/primary.html";
+        final String secondaryResource = "/secondary.png";
+        final byte[] secondaryData = "SECONDARY".getBytes("UTF-8");
+        start(new HttpServlet()
+        {
+            @Override
+            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+            {
+                String requestURI = req.getRequestURI();
+                ServletOutputStream output = resp.getOutputStream();
+                if (requestURI.endsWith(primaryResource))
+                    output.print("<html><head></head><body>PRIMARY</body></html>");
+                else if (requestURI.endsWith(secondaryResource))
+                    output.write(secondaryData);
+            }
+        });
+
+        final Session session = newClient(new Session.Listener.Adapter());
+
+        // Request for the primary and secondary resource to build the cache.
+        // The referrerURI does not point to the primary resource, so there will be no
+        // resource association with the primary resource and therefore won't be pushed.
+        final String referrerURI = "http://localhost:" + connector.getLocalPort();
+        HttpFields primaryFields = new HttpFields();
+        MetaData.Request primaryRequest = newRequest("GET", primaryResource, primaryFields);
+        final CountDownLatch warmupLatch = new CountDownLatch(1);
+        session.newStream(new HeadersFrame(primaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                callback.succeeded();
+                if (frame.isEndStream())
+                {
+                    // Request for the secondary resource.
+                    HttpFields secondaryFields = new HttpFields();
+                    secondaryFields.put(HttpHeader.REFERER, referrerURI);
+                    MetaData.Request secondaryRequest = newRequest("GET", secondaryResource, secondaryFields);
+                    session.newStream(new HeadersFrame(secondaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+                    {
+                        @Override
+                        public void onData(Stream stream, DataFrame frame, Callback callback)
+                        {
+                            warmupLatch.countDown();
+                        }
+                    });
+                }
+            }
+        });
+        Assert.assertTrue(warmupLatch.await(5, TimeUnit.SECONDS));
+
+        // Request again the primary resource, we should not get the secondary resource pushed.
+        primaryRequest = newRequest("GET", primaryResource, primaryFields);
+        final CountDownLatch primaryResponseLatch = new CountDownLatch(1);
+        final CountDownLatch pushLatch = new CountDownLatch(1);
+        session.newStream(new HeadersFrame(primaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public Stream.Listener onPush(Stream stream, PushPromiseFrame frame)
+            {
+                return new Adapter()
+                {
+                    @Override
+                    public void onData(Stream stream, DataFrame frame, Callback callback)
+                    {
+                        callback.succeeded();
+                        if (frame.isEndStream())
+                            pushLatch.countDown();
+                    }
+                };
+            }
+
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                callback.succeeded();
+                if (frame.isEndStream())
+                    primaryResponseLatch.countDown();
+            }
+        });
+        Assert.assertFalse(pushLatch.await(1, TimeUnit.SECONDS));
+        Assert.assertTrue(primaryResponseLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testPushIsReset() throws Exception
+    {
+        final String primaryResource = "/primary.html";
+        final String secondaryResource = "/secondary.png";
+        final byte[] secondaryData = "SECONDARY".getBytes("UTF-8");
+        start(new HttpServlet()
+        {
+            @Override
+            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+            {
+                String requestURI = req.getRequestURI();
+                ServletOutputStream output = resp.getOutputStream();
+                if (requestURI.endsWith(primaryResource))
+                    output.print("<html><head></head><body>PRIMARY</body></html>");
+                else if (requestURI.endsWith(secondaryResource))
+                    output.write(secondaryData);
+            }
+        });
+
+        final Session session = newClient(new Session.Listener.Adapter());
+
+        // Request for the primary and secondary resource to build the cache.
+        final String primaryURI = "http://localhost:" + connector.getLocalPort() + servletPath + primaryResource;
+        HttpFields primaryFields = new HttpFields();
+        MetaData.Request primaryRequest = newRequest("GET", primaryResource, primaryFields);
+        final CountDownLatch warmupLatch = new CountDownLatch(1);
+        session.newStream(new HeadersFrame(primaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                callback.succeeded();
+                if (frame.isEndStream())
+                {
+                    // Request for the secondary resource.
+                    HttpFields secondaryFields = new HttpFields();
+                    secondaryFields.put(HttpHeader.REFERER, primaryURI);
+                    MetaData.Request secondaryRequest = newRequest("GET", secondaryResource, secondaryFields);
+                    session.newStream(new HeadersFrame(secondaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+                    {
+                        @Override
+                        public void onData(Stream stream, DataFrame frame, Callback callback)
+                        {
+                            warmupLatch.countDown();
+                        }
+                    });
+                }
+            }
+        });
+        Assert.assertTrue(warmupLatch.await(5, TimeUnit.SECONDS));
+
+        // Request again the primary resource, we should get the secondary resource pushed.
+        primaryRequest = newRequest("GET", primaryResource, primaryFields);
+        final CountDownLatch primaryResponseLatch = new CountDownLatch(1);
+        final CountDownLatch pushLatch = new CountDownLatch(1);
+        session.newStream(new HeadersFrame(primaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public Stream.Listener onPush(Stream stream, PushPromiseFrame frame)
+            {
+                // Reset the stream as soon as we see the push.
+                ResetFrame resetFrame = new ResetFrame(stream.getId(), ErrorCode.REFUSED_STREAM_ERROR.code);
+                stream.reset(resetFrame, Callback.NOOP);
+                return new Adapter()
+                {
+                    @Override
+                    public void onData(Stream stream, DataFrame frame, Callback callback)
+                    {
+                        pushLatch.countDown();
+                    }
+                };
+            }
+
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                callback.succeeded();
+                if (frame.isEndStream())
+                    primaryResponseLatch.countDown();
+            }
+        });
+        // We should not receive pushed data that we reset.
+        Assert.assertFalse(pushLatch.await(1, TimeUnit.SECONDS));
+        Assert.assertTrue(primaryResponseLatch.await(5, TimeUnit.SECONDS));
+
+        // Make sure the session is sane by requesting the secondary resource.
+        HttpFields secondaryFields = new HttpFields();
+        secondaryFields.put(HttpHeader.REFERER, primaryURI);
+        MetaData.Request secondaryRequest = newRequest("GET", secondaryResource, secondaryFields);
+        final CountDownLatch secondaryResponseLatch = new CountDownLatch(1);
+        session.newStream(new HeadersFrame(secondaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                if (frame.isEndStream())
+                    secondaryResponseLatch.countDown();
+            }
+        });
+        Assert.assertTrue(secondaryResponseLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testPushWithoutPrimaryResponseContent() throws Exception
+    {
+        final String primaryResource = "/primary.html";
+        final String secondaryResource = "/secondary.png";
+        start(new HttpServlet()
+        {
+            @Override
+            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                String requestURI = request.getRequestURI();
+                final ServletOutputStream output = response.getOutputStream();
+                if (requestURI.endsWith(secondaryResource))
+                    output.write("SECONDARY".getBytes(StandardCharsets.UTF_8));
+            }
+        });
+
+        final Session session = newClient(new Session.Listener.Adapter());
+
+        // Request for the primary and secondary resource to build the cache.
+        final String primaryURI = "http://localhost:" + connector.getLocalPort() + servletPath + primaryResource;
+        HttpFields primaryFields = new HttpFields();
+        MetaData.Request primaryRequest = newRequest("GET", primaryResource, primaryFields);
+        final CountDownLatch warmupLatch = new CountDownLatch(1);
+        session.newStream(new HeadersFrame(primaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                if (frame.isEndStream())
+                {
+                    // Request for the secondary resource.
+                    HttpFields secondaryFields = new HttpFields();
+                    secondaryFields.put(HttpHeader.REFERER, primaryURI);
+                    MetaData.Request secondaryRequest = newRequest("GET", secondaryResource, secondaryFields);
+                    session.newStream(new HeadersFrame(secondaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+                    {
+                        @Override
+                        public void onData(Stream stream, DataFrame frame, Callback callback)
+                        {
+                            warmupLatch.countDown();
+                        }
+                    });
+                }
+            }
+        });
+        Assert.assertTrue(warmupLatch.await(5, TimeUnit.SECONDS));
+
+        Thread.sleep(1000);
+
+        // Request again the primary resource, we should get the secondary resource pushed.
+        primaryRequest = newRequest("GET", primaryResource, primaryFields);
+        final CountDownLatch primaryResponseLatch = new CountDownLatch(1);
+        final CountDownLatch pushLatch = new CountDownLatch(1);
+        session.newStream(new HeadersFrame(primaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                if (frame.isEndStream())
+                    primaryResponseLatch.countDown();
+            }
+
+            @Override
+            public Stream.Listener onPush(Stream stream, PushPromiseFrame frame)
+            {
+                return new Adapter()
+                {
+                    @Override
+                    public void onData(Stream stream, DataFrame frame, Callback callback)
+                    {
+                        callback.succeeded();
+                        if (frame.isEndStream())
+                            pushLatch.countDown();
+                    }
+                };
+            }
+        });
+        Assert.assertTrue(pushLatch.await(5, TimeUnit.SECONDS));
+        Assert.assertTrue(primaryResponseLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testRecursivePush() throws Exception
+    {
+        final String primaryResource = "/primary.html";
+        final String secondaryResource = "/secondary.css";
+        final String tertiaryResource = "/tertiary.png";
+        start(new HttpServlet()
+        {
+            @Override
+            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                String requestURI = request.getRequestURI();
+                final ServletOutputStream output = response.getOutputStream();
+                if (requestURI.endsWith(primaryResource))
+                    output.print("<html><head></head><body>PRIMARY</body></html>");
+                else if (requestURI.endsWith(secondaryResource))
+                    output.print("body { background-image: url(\"" + tertiaryResource + "\"); }");
+                if (requestURI.endsWith(tertiaryResource))
+                    output.write("TERTIARY".getBytes(StandardCharsets.UTF_8));
+            }
+        });
+
+        final Session session = newClient(new Session.Listener.Adapter());
+
+        // Request for the primary, secondary and tertiary resource to build the cache.
+        final String primaryURI = "http://localhost:" + connector.getLocalPort() + servletPath + primaryResource;
+        HttpFields primaryFields = new HttpFields();
+        MetaData.Request primaryRequest = newRequest("GET", primaryResource, primaryFields);
+        final CountDownLatch warmupLatch = new CountDownLatch(1);
+        session.newStream(new HeadersFrame(primaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                callback.succeeded();
+                if (frame.isEndStream())
+                {
+                    // Request for the secondary resource.
+                    final String secondaryURI = "http://localhost:" + connector.getLocalPort() + servletPath + secondaryResource;
+                    HttpFields secondaryFields = new HttpFields();
+                    secondaryFields.put(HttpHeader.REFERER, primaryURI);
+                    MetaData.Request secondaryRequest = newRequest("GET", secondaryResource, secondaryFields);
+                    session.newStream(new HeadersFrame(secondaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+                    {
+                        @Override
+                        public void onData(Stream stream, DataFrame frame, Callback callback)
+                        {
+                            callback.succeeded();
+                            if (frame.isEndStream())
+                            {
+                                // Request for the tertiary resource.
+                                HttpFields tertiaryFields = new HttpFields();
+                                tertiaryFields.put(HttpHeader.REFERER, secondaryURI);
+                                MetaData.Request tertiaryRequest = newRequest("GET", tertiaryResource, tertiaryFields);
+                                session.newStream(new HeadersFrame(tertiaryRequest, null, true), new Promise.Adapter<>(), new Adapter()
+                                {
+                                    @Override
+                                    public void onData(Stream stream, DataFrame frame, Callback callback)
+                                    {
+                                        if (frame.isEndStream())
+                                            warmupLatch.countDown();
+                                    }
+                                });
+                            }
+                        }
+                    });
+                }
+            }
+        });
+        Assert.assertTrue(warmupLatch.await(5, TimeUnit.SECONDS));
+
+        Thread.sleep(1000);
+
+        // Request again the primary resource, we should get the secondary and tertiary resource pushed.
+        primaryRequest = newRequest("GET", primaryResource, primaryFields);
+        final CountDownLatch primaryResponseLatch = new CountDownLatch(1);
+        final CountDownLatch pushLatch = new CountDownLatch(2);
+        session.newStream(new HeadersFrame(primaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                if (frame.isEndStream())
+                    primaryResponseLatch.countDown();
+            }
+
+            @Override
+            public Stream.Listener onPush(Stream stream, PushPromiseFrame frame)
+            {
+                return new Adapter()
+                {
+                    @Override
+                    public void onData(Stream stream, DataFrame frame, Callback callback)
+                    {
+                        callback.succeeded();
+                        if (frame.isEndStream())
+                            pushLatch.countDown();
+                    }
+
+                    @Override
+                    public Stream.Listener onPush(Stream stream, PushPromiseFrame frame)
+                    {
+                        return this;
+                    }
+                };
+            }
+        });
+        Assert.assertTrue(pushLatch.await(5, TimeUnit.SECONDS));
+        Assert.assertTrue(primaryResponseLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testSelfPush() throws Exception
+    {
+        // The test case is that of a login page, for example.
+        // When the user sends the credentials to the login page,
+        // the login may fail and redirect to the same login page,
+        // perhaps with different query parameters.
+        // In this case a request for the login page will push
+        // the login page itself, which will generate the pushed
+        // request for the login page, which will push the login
+        // page itself, etc. which is not the desired behavior.
+
+        final String primaryResource = "/login.html";
+        start(new HttpServlet()
+        {
+            @Override
+            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                ServletOutputStream output = response.getOutputStream();
+                String credentials = request.getParameter("credentials");
+                if (credentials == null)
+                {
+                    output.print("<html><head></head><body>LOGIN</body></html>");
+                }
+                else if ("secret".equals(credentials))
+                {
+                    output.print("<html><head></head><body>OK</body></html>");
+                }
+                else
+                {
+                    response.setStatus(HttpStatus.TEMPORARY_REDIRECT_307);
+                    response.setHeader(HttpHeader.LOCATION.asString(), primaryResource);
+                }
+            }
+        });
+        final String primaryURI = "http://localhost:" + connector.getLocalPort() + servletPath + primaryResource;
+
+        final Session session = newClient(new Session.Listener.Adapter());
+
+        // Login with the wrong credentials, causing a redirect to self.
+        HttpFields primaryFields = new HttpFields();
+        MetaData.Request primaryRequest = newRequest("GET", primaryResource + "?credentials=wrong", primaryFields);
+        final CountDownLatch warmupLatch = new CountDownLatch(1);
+        session.newStream(new HeadersFrame(primaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                if (frame.isEndStream())
+                {
+                    MetaData.Response response = (MetaData.Response)frame.getMetaData();
+                    if (response.getStatus() == HttpStatus.TEMPORARY_REDIRECT_307)
+                    {
+                        // Follow the redirect.
+                        String location = response.getFields().get(HttpHeader.LOCATION);
+                        HttpFields redirectFields = new HttpFields();
+                        redirectFields.put(HttpHeader.REFERER, primaryURI);
+                        MetaData.Request redirectRequest = newRequest("GET", location, redirectFields);
+                        session.newStream(new HeadersFrame(redirectRequest, null, true), new Promise.Adapter<>(), new Adapter()
+                        {
+                            @Override
+                            public void onData(Stream stream, DataFrame frame, Callback callback)
+                            {
+                                if (frame.isEndStream())
+                                    warmupLatch.countDown();
+                            }
+                        });
+                    }
+                }
+            }
+        });
+        Assert.assertTrue(warmupLatch.await(5, TimeUnit.SECONDS));
+
+        Thread.sleep(1000);
+
+        // Login with the right credentials, there must be no push.
+        primaryRequest = newRequest("GET", primaryResource + "?credentials=secret", primaryFields);
+        final CountDownLatch primaryResponseLatch = new CountDownLatch(1);
+        final CountDownLatch pushLatch = new CountDownLatch(1);
+        session.newStream(new HeadersFrame(primaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                if (frame.isEndStream())
+                    primaryResponseLatch.countDown();
+            }
+
+            @Override
+            public Stream.Listener onPush(Stream stream, PushPromiseFrame frame)
+            {
+                pushLatch.countDown();
+                return null;
+            }
+        });
+        Assert.assertFalse(pushLatch.await(1, TimeUnit.SECONDS));
+        Assert.assertTrue(primaryResponseLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testPushWithQueryParameters() throws Exception
+    {
+        String name = "foo";
+        String value = "bar";
+        final String primaryResource = "/primary.html";
+        final String secondaryResource = "/secondary.html?" + name + "=" + value;
+        start(new HttpServlet()
+        {
+            @Override
+            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                String requestURI = request.getRequestURI();
+                if (requestURI.endsWith(primaryResource))
+                {
+                    response.setStatus(HttpStatus.OK_200);
+                }
+                else if (requestURI.endsWith(secondaryResource))
+                {
+                    String param = request.getParameter(name);
+                    if (param == null)
+                        response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR_500);
+                    else
+                        response.setStatus(HttpStatus.OK_200);
+                }
+            }
+        });
+
+        final Session session = newClient(new Session.Listener.Adapter());
+
+        // Request for the primary and secondary resource to build the cache.
+        final String primaryURI = "http://localhost:" + connector.getLocalPort() + servletPath + primaryResource;
+        HttpFields primaryFields = new HttpFields();
+        MetaData.Request primaryRequest = newRequest("GET", primaryResource, primaryFields);
+        final CountDownLatch warmupLatch = new CountDownLatch(1);
+        session.newStream(new HeadersFrame(primaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                if (frame.isEndStream())
+                {
+                    // Request for the secondary resource.
+                    HttpFields secondaryFields = new HttpFields();
+                    secondaryFields.put(HttpHeader.REFERER, primaryURI);
+                    MetaData.Request secondaryRequest = newRequest("GET", secondaryResource, secondaryFields);
+                    session.newStream(new HeadersFrame(secondaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+                    {
+                        @Override
+                        public void onHeaders(Stream stream, HeadersFrame frame)
+                        {
+                            if (frame.isEndStream())
+                                warmupLatch.countDown();
+                        }
+                    });
+                }
+            }
+        });
+        Assert.assertTrue(warmupLatch.await(5, TimeUnit.SECONDS));
+
+        Thread.sleep(1000);
+
+        // Request again the primary resource, we should get the secondary resource pushed.
+        primaryRequest = newRequest("GET", primaryResource, primaryFields);
+        final CountDownLatch primaryResponseLatch = new CountDownLatch(1);
+        final CountDownLatch pushLatch = new CountDownLatch(1);
+        session.newStream(new HeadersFrame(primaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public Stream.Listener onPush(Stream stream, PushPromiseFrame frame)
+            {
+                MetaData metaData = frame.getMetaData();
+                Assert.assertTrue(metaData instanceof MetaData.Request);
+                MetaData.Request pushedRequest = (MetaData.Request)metaData;
+                Assert.assertEquals(servletPath + secondaryResource, pushedRequest.getURI().getPathQuery());
+                return new Adapter()
+                {
+                    @Override
+                    public void onHeaders(Stream stream, HeadersFrame frame)
+                    {
+                        if (frame.isEndStream())
+                        {
+                            MetaData.Response response = (MetaData.Response)frame.getMetaData();
+                            if (response.getStatus() == HttpStatus.OK_200)
+                                pushLatch.countDown();
+                        }
+                    }
+                };
+            }
+
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                if (frame.isEndStream())
+                    primaryResponseLatch.countDown();
+            }
+        });
+        Assert.assertTrue(pushLatch.await(5, TimeUnit.SECONDS));
+        Assert.assertTrue(primaryResponseLatch.await(5, TimeUnit.SECONDS));
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/SessionFailureTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/SessionFailureTest.java
new file mode 100644
index 0000000..ff08e0a
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/SessionFailureTest.java
@@ -0,0 +1,123 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http2.HTTP2Session;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.Promise;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SessionFailureTest extends AbstractTest
+{
+    @Test
+    public void testWrongPreface() throws Exception
+    {
+        final CountDownLatch latch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public void onFailure(Session session, Throwable failure)
+            {
+                latch.countDown();
+            }
+        });
+
+        try (Socket socket = new Socket("localhost", connector.getLocalPort()))
+        {
+            // Preface starts with byte 0x50, send something different.
+            OutputStream output = socket.getOutputStream();
+            output.write(0x0);
+            output.flush();
+
+            Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+
+            // The server will reply with a GOAWAY frame, and then shutdown.
+            // Read until EOF.
+            socket.setSoTimeout(1000);
+            InputStream input = socket.getInputStream();
+            while (true)
+            {
+                if (input.read() < 0)
+                    break;
+            }
+        }
+    }
+
+    @Test
+    public void testWriteFailure() throws Exception
+    {
+        final CountDownLatch writeLatch = new CountDownLatch(1);
+        final CountDownLatch serverFailureLatch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                // Forcibly close the connection.
+                ((HTTP2Session)stream.getSession()).getEndPoint().close();
+                // Now try to write something: it should fail.
+                stream.headers(frame, new Callback()
+                {
+                    @Override
+                    public void failed(Throwable x)
+                    {
+                        writeLatch.countDown();
+                    }
+                });
+                return null;
+            }
+
+            @Override
+            public void onFailure(Session session, Throwable failure)
+            {
+                serverFailureLatch.countDown();
+            }
+        });
+
+        final CountDownLatch clientFailureLatch = new CountDownLatch(1);
+        Session session = newClient(new Session.Listener.Adapter()
+        {
+            @Override
+            public void onFailure(Session session, Throwable failure)
+            {
+                clientFailureLatch.countDown();
+            }
+        });
+        HeadersFrame frame = new HeadersFrame(newRequest("GET", new HttpFields()), null, true);
+        Promise<Stream> promise = new Promise.Adapter<>();
+        session.newStream(frame, promise, null);
+
+        Assert.assertTrue(writeLatch.await(5, TimeUnit.SECONDS));
+        Assert.assertTrue(serverFailureLatch.await(5, TimeUnit.SECONDS));
+        Assert.assertTrue(clientFailureLatch.await(5, TimeUnit.SECONDS));
+        Assert.assertFalse(((HTTP2Session)session).getEndPoint().isOpen());
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/SimpleFlowControlStrategyTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/SimpleFlowControlStrategyTest.java
new file mode 100644
index 0000000..1de955d
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/SimpleFlowControlStrategyTest.java
@@ -0,0 +1,31 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import org.eclipse.jetty.http2.FlowControlStrategy;
+import org.eclipse.jetty.http2.SimpleFlowControlStrategy;
+
+public class SimpleFlowControlStrategyTest extends FlowControlStrategyTest
+{
+    @Override
+    protected FlowControlStrategy newFlowControlStrategy()
+    {
+        return new SimpleFlowControlStrategy();
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamCloseTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamCloseTest.java
new file mode 100644
index 0000000..8a86944
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamCloseTest.java
@@ -0,0 +1,345 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.HTTP2Session;
+import org.eclipse.jetty.http2.HTTP2Stream;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PushPromiseFrame;
+import org.eclipse.jetty.http2.frames.ResetFrame;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.FuturePromise;
+import org.eclipse.jetty.util.Promise;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StreamCloseTest extends AbstractTest
+{
+    @Test
+    public void testRequestClosedRemotelyClosesStream() throws Exception
+    {
+        final CountDownLatch latch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                Assert.assertTrue(((HTTP2Stream)stream).isRemotelyClosed());
+                latch.countDown();
+                return null;
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+        HeadersFrame frame = new HeadersFrame(newRequest("GET", new HttpFields()), null, true);
+        FuturePromise<Stream> promise = new FuturePromise<>();
+        session.newStream(frame, promise, null);
+        Stream stream = promise.get(5, TimeUnit.SECONDS);
+        Assert.assertTrue(((HTTP2Stream)stream).isLocallyClosed());
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testRequestClosedResponseClosedClosesStream() throws Exception
+    {
+        final CountDownLatch latch = new CountDownLatch(2);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(final Stream stream, HeadersFrame frame)
+            {
+                MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                HeadersFrame response = new HeadersFrame(stream.getId(), metaData, null, true);
+                stream.headers(response, new Callback()
+                {
+                    @Override
+                    public void succeeded()
+                    {
+                        Assert.assertTrue(stream.isClosed());
+                        Assert.assertEquals(0, stream.getSession().getStreams().size());
+                        latch.countDown();
+                    }
+                });
+                return null;
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+        HeadersFrame frame = new HeadersFrame(newRequest("GET", new HttpFields()), null, true);
+        FuturePromise<Stream> promise = new FuturePromise<>();
+        session.newStream(frame, promise, new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                // The stream promise may not be notified yet here.
+                latch.countDown();
+            }
+        });
+        Stream stream = promise.get(5, TimeUnit.SECONDS);
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+        Assert.assertTrue(stream.isClosed());
+    }
+
+    @Test
+    public void testRequestDataClosedResponseDataClosedClosesStream() throws Exception
+    {
+        final CountDownLatch serverDataLatch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                HeadersFrame response = new HeadersFrame(stream.getId(), metaData, null, false);
+                stream.headers(response, Callback.NOOP);
+                return new Stream.Listener.Adapter()
+                {
+                    @Override
+                    public void onData(final Stream stream, DataFrame frame, final Callback callback)
+                    {
+                        Assert.assertTrue(((HTTP2Stream)stream).isRemotelyClosed());
+                        stream.data(frame, new Callback()
+                        {
+                            @Override
+                            public void succeeded()
+                            {
+                                Assert.assertTrue(stream.isClosed());
+                                Assert.assertEquals(0, stream.getSession().getStreams().size());
+                                callback.succeeded();
+                                serverDataLatch.countDown();
+                            }
+                        });
+                    }
+                };
+            }
+        });
+
+        final CountDownLatch completeLatch = new CountDownLatch(1);
+        Session session = newClient(new Session.Listener.Adapter());
+        HeadersFrame frame = new HeadersFrame(newRequest("GET", new HttpFields()), null, false);
+        FuturePromise<Stream> promise = new FuturePromise<>();
+        session.newStream(frame, promise, new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                // The sent data callback may not be notified yet here.
+                completeLatch.countDown();
+            }
+        });
+        final Stream stream = promise.get(5, TimeUnit.SECONDS);
+        Assert.assertFalse(stream.isClosed());
+        Assert.assertFalse(((HTTP2Stream)stream).isLocallyClosed());
+
+        final CountDownLatch clientDataLatch = new CountDownLatch(1);
+        stream.data(new DataFrame(stream.getId(), ByteBuffer.wrap(new byte[512]), true), new Callback()
+        {
+            @Override
+            public void succeeded()
+            {
+                // Here the stream may be just locally closed or fully closed.
+                clientDataLatch.countDown();
+            }
+        });
+
+        Assert.assertTrue(clientDataLatch.await(5, TimeUnit.SECONDS));
+        Assert.assertTrue(serverDataLatch.await(5, TimeUnit.SECONDS));
+        Assert.assertTrue(completeLatch.await(5, TimeUnit.SECONDS));
+        Assert.assertTrue(stream.isClosed());
+        Assert.assertEquals(0, stream.getSession().getStreams().size());
+    }
+
+    @Test
+    public void testPushedStreamIsClosed() throws Exception
+    {
+        final CountDownLatch serverLatch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                PushPromiseFrame pushFrame = new PushPromiseFrame(stream.getId(), 0, newRequest("GET", new HttpFields()));
+                stream.push(pushFrame, new Promise.Adapter<Stream>()
+                {
+                    @Override
+                    public void succeeded(final Stream pushedStream)
+                    {
+                        // When created, pushed stream must be implicitly remotely closed.
+                        Assert.assertTrue(((HTTP2Stream)pushedStream).isRemotelyClosed());
+                        // Send some data with endStream = true.
+                        pushedStream.data(new DataFrame(pushedStream.getId(), ByteBuffer.allocate(16), true), new Callback()
+                        {
+                            @Override
+                            public void succeeded()
+                            {
+                                Assert.assertTrue(pushedStream.isClosed());
+                                serverLatch.countDown();
+                            }
+                        });
+                    }
+                }, new Stream.Listener.Adapter());
+                HeadersFrame response = new HeadersFrame(stream.getId(), new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields()), null, true);
+                stream.headers(response, Callback.NOOP);
+                return null;
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+        HeadersFrame frame = new HeadersFrame(newRequest("GET", new HttpFields()), null, true);
+        final CountDownLatch clientLatch = new CountDownLatch(1);
+        session.newStream(frame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public Stream.Listener onPush(Stream pushedStream, PushPromiseFrame frame)
+            {
+                Assert.assertTrue(((HTTP2Stream)pushedStream).isLocallyClosed());
+                return new Adapter()
+                {
+                    @Override
+                    public void onData(Stream pushedStream, DataFrame frame, Callback callback)
+                    {
+                        Assert.assertTrue(pushedStream.isClosed());
+                        callback.succeeded();
+                        clientLatch.countDown();
+                    }
+                };
+            }
+        });
+
+        Assert.assertTrue(serverLatch.await(5, TimeUnit.SECONDS));
+        Assert.assertTrue(clientLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testPushedStreamResetIsClosed() throws Exception
+    {
+        final CountDownLatch serverLatch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(final Stream stream, HeadersFrame frame)
+            {
+                PushPromiseFrame pushFrame = new PushPromiseFrame(stream.getId(), 0, newRequest("GET", new HttpFields()));
+                stream.push(pushFrame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
+                {
+                    @Override
+                    public void onReset(Stream pushedStream, ResetFrame frame)
+                    {
+                        Assert.assertTrue(pushedStream.isReset());
+                        Assert.assertTrue(pushedStream.isClosed());
+                        HeadersFrame response = new HeadersFrame(stream.getId(), new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields()), null, true);
+                        stream.headers(response, Callback.NOOP);
+                        serverLatch.countDown();
+                    }
+                });
+                return null;
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+        HeadersFrame frame = new HeadersFrame(newRequest("GET", new HttpFields()), null, true);
+        final CountDownLatch clientLatch = new CountDownLatch(2);
+        session.newStream(frame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public Stream.Listener onPush(final Stream pushedStream, PushPromiseFrame frame)
+            {
+                pushedStream.reset(new ResetFrame(pushedStream.getId(), ErrorCode.REFUSED_STREAM_ERROR.code), new Callback()
+                {
+                    @Override
+                    public void succeeded()
+                    {
+                        Assert.assertTrue(pushedStream.isReset());
+                        Assert.assertTrue(pushedStream.isClosed());
+                        clientLatch.countDown();
+                    }
+                });
+                return null;
+            }
+
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                clientLatch.countDown();
+            }
+        });
+
+        Assert.assertTrue(serverLatch.await(5, TimeUnit.SECONDS));
+        Assert.assertTrue(clientLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testFailedSessionClosesIdleStream() throws Exception
+    {
+        final CountDownLatch latch = new CountDownLatch(1);
+        final List<Stream> streams = new ArrayList<>();
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                streams.add(stream);
+                MetaData.Request request = (MetaData.Request)frame.getMetaData();
+                if ("GET".equals(request.getMethod()))
+                {
+                    ((HTTP2Session)stream.getSession()).getEndPoint().close();
+                    // Try to write something to force an error.
+                    stream.data(new DataFrame(stream.getId(), ByteBuffer.allocate(1024), true), Callback.NOOP);
+                }
+                return null;
+            }
+
+            @Override
+            public void onFailure(Session session, Throwable failure)
+            {
+                Assert.assertEquals(0, session.getStreams().size());
+                for (Stream stream : streams)
+                    Assert.assertTrue(stream.isClosed());
+                latch.countDown();
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+
+        // First stream will be idle on server.
+        HeadersFrame request1 = new HeadersFrame(newRequest("HEAD", new HttpFields()), null, true);
+        session.newStream(request1, new Promise.Adapter<>(), new Stream.Listener.Adapter());
+
+        // Second stream will fail on server.
+        HeadersFrame request2 = new HeadersFrame(newRequest("GET", new HttpFields()), null, true);
+        session.newStream(request2, new Promise.Adapter<>(), new Stream.Listener.Adapter());
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamCountTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamCountTest.java
new file mode 100644
index 0000000..2072e1b
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamCountTest.java
@@ -0,0 +1,188 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.HTTP2Session;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.ResetFrame;
+import org.eclipse.jetty.http2.frames.SettingsFrame;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.FuturePromise;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StreamCountTest extends AbstractTest
+{
+    @Test
+    public void testServerAllowsOneStreamEnforcedByClient() throws Exception
+    {
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Map<Integer, Integer> onPreface(Session session)
+            {
+                Map<Integer, Integer> settings = new HashMap<>();
+                settings.put(SettingsFrame.MAX_CONCURRENT_STREAMS, 1);
+                return settings;
+            }
+
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                return new Stream.Listener.Adapter()
+                {
+                    @Override
+                    public void onData(Stream stream, DataFrame frame, Callback callback)
+                    {
+                        if (frame.isEndStream())
+                        {
+                            HttpFields fields = new HttpFields();
+                            MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, fields);
+                            stream.headers(new HeadersFrame(stream.getId(), metaData, null, true), callback);
+                        }
+                    }
+                };
+            }
+        });
+
+        final CountDownLatch settingsLatch = new CountDownLatch(1);
+        Session session = newClient(new Session.Listener.Adapter()
+        {
+            @Override
+            public void onSettings(Session session, SettingsFrame frame)
+            {
+                settingsLatch.countDown();
+            }
+        });
+
+        Assert.assertTrue(settingsLatch.await(5, TimeUnit.SECONDS));
+
+        HttpFields fields = new HttpFields();
+        MetaData.Request metaData = newRequest("GET", fields);
+        HeadersFrame frame1 = new HeadersFrame(metaData, null, false);
+        FuturePromise<Stream> streamPromise1 = new FuturePromise<>();
+        final CountDownLatch responseLatch = new CountDownLatch(1);
+        session.newStream(frame1, streamPromise1, new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                if (frame.isEndStream())
+                    responseLatch.countDown();
+            }
+        });
+        Stream stream1 = streamPromise1.get(5, TimeUnit.SECONDS);
+
+        HeadersFrame frame2 = new HeadersFrame(metaData, null, false);
+        FuturePromise<Stream> streamPromise2 = new FuturePromise<>();
+        session.newStream(frame2, streamPromise2, new Stream.Listener.Adapter());
+
+        try
+        {
+            streamPromise2.get(5, TimeUnit.SECONDS);
+            Assert.fail();
+        }
+        catch (ExecutionException x)
+        {
+            // Expected
+        }
+
+        stream1.data(new DataFrame(stream1.getId(), BufferUtil.EMPTY_BUFFER, true), Callback.NOOP);
+        Assert.assertTrue(responseLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testServerAllowsOneStreamEnforcedByServer() throws Exception
+    {
+        final CountDownLatch resetLatch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                HTTP2Session session = (HTTP2Session)stream.getSession();
+                session.setMaxRemoteStreams(1);
+
+                return new Stream.Listener.Adapter()
+                {
+                    @Override
+                    public void onData(Stream stream, DataFrame frame, Callback callback)
+                    {
+                        if (frame.isEndStream())
+                        {
+                            HttpFields fields = new HttpFields();
+                            MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, fields);
+                            stream.headers(new HeadersFrame(stream.getId(), metaData, null, true), callback);
+                        }
+                    }
+                };
+            }
+        });
+
+        Session session = newClient(new Session.Listener.Adapter());
+
+        HttpFields fields = new HttpFields();
+        MetaData.Request metaData = newRequest("GET", fields);
+        HeadersFrame frame1 = new HeadersFrame(metaData, null, false);
+        FuturePromise<Stream> streamPromise1 = new FuturePromise<>();
+        final CountDownLatch responseLatch = new CountDownLatch(1);
+        session.newStream(frame1, streamPromise1, new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                if (frame.isEndStream())
+                    responseLatch.countDown();
+            }
+        });
+
+        Stream stream1 = streamPromise1.get(5, TimeUnit.SECONDS);
+
+        HeadersFrame frame2 = new HeadersFrame(metaData, null, false);
+        FuturePromise<Stream> streamPromise2 = new FuturePromise<>();
+        session.newStream(frame2, streamPromise2, new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onReset(Stream stream, ResetFrame frame)
+            {
+                resetLatch.countDown();
+            }
+        });
+
+        streamPromise2.get(5, TimeUnit.SECONDS);
+        Assert.assertTrue(resetLatch.await(5, TimeUnit.SECONDS));
+
+        stream1.data(new DataFrame(stream1.getId(), BufferUtil.EMPTY_BUFFER, true), Callback.NOOP);
+        Assert.assertTrue(responseLatch.await(5, TimeUnit.SECONDS));
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamResetTest.java b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamResetTest.java
new file mode 100644
index 0000000..7e5d60e
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/java/org/eclipse/jetty/http2/client/StreamResetTest.java
@@ -0,0 +1,351 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client;
+
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.ResetFrame;
+import org.eclipse.jetty.server.HttpOutput;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.FutureCallback;
+import org.eclipse.jetty.util.FuturePromise;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StreamResetTest extends AbstractTest
+{
+    @Test
+    public void testStreamSendingResetIsRemoved() throws Exception
+    {
+        start(new ServerSessionListener.Adapter());
+
+        Session client = newClient(new Session.Listener.Adapter());
+        MetaData.Request request = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(request, null, false);
+        FuturePromise<Stream> promise = new FuturePromise<>();
+        client.newStream(requestFrame, promise, new Stream.Listener.Adapter());
+        Stream stream = promise.get(5, TimeUnit.SECONDS);
+        ResetFrame resetFrame = new ResetFrame(stream.getId(), ErrorCode.CANCEL_STREAM_ERROR.code);
+        FutureCallback resetCallback = new FutureCallback();
+        stream.reset(resetFrame, resetCallback);
+        resetCallback.get(5, TimeUnit.SECONDS);
+        // After reset the stream should be gone.
+        Assert.assertEquals(0, client.getStreams().size());
+    }
+
+    @Test
+    public void testStreamReceivingResetIsRemoved() throws Exception
+    {
+        final AtomicReference<Stream> streamRef = new AtomicReference<>();
+        final CountDownLatch resetLatch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                return new Stream.Listener.Adapter()
+                {
+                    @Override
+                    public void onReset(Stream stream, ResetFrame frame)
+                    {
+                        Assert.assertNotNull(stream);
+                        Assert.assertTrue(stream.isReset());
+                        streamRef.set(stream);
+                        resetLatch.countDown();
+                    }
+                };
+            }
+        });
+
+        Session client = newClient(new Session.Listener.Adapter());
+        MetaData.Request request = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame = new HeadersFrame(request, null, false);
+        FuturePromise<Stream> promise = new FuturePromise<>();
+        client.newStream(requestFrame, promise, new Stream.Listener.Adapter());
+        Stream stream = promise.get(5, TimeUnit.SECONDS);
+        ResetFrame resetFrame = new ResetFrame(stream.getId(), ErrorCode.CANCEL_STREAM_ERROR.code);
+        stream.reset(resetFrame, Callback.NOOP);
+
+        Assert.assertTrue(resetLatch.await(5, TimeUnit.SECONDS));
+
+        // Wait a while to let the server remove the
+        // stream after returning from onReset().
+        Thread.sleep(1000);
+
+        Stream serverStream = streamRef.get();
+        Assert.assertEquals(0, serverStream.getSession().getStreams().size());
+    }
+
+    @Test
+    public void testStreamResetDoesNotCloseConnection() throws Exception
+    {
+        final CountDownLatch serverResetLatch = new CountDownLatch(1);
+        final CountDownLatch serverDataLatch = new CountDownLatch(1);
+        start(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame requestFrame)
+            {
+                MetaData.Response response = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                HeadersFrame responseFrame = new HeadersFrame(stream.getId(), response, null, false);
+                stream.headers(responseFrame, Callback.NOOP);
+                return new Stream.Listener.Adapter()
+                {
+                    @Override
+                    public void onData(Stream stream, DataFrame frame, Callback callback)
+                    {
+                        callback.succeeded();
+                        stream.data(new DataFrame(stream.getId(), ByteBuffer.allocate(16), true), Callback.NOOP);
+                        serverDataLatch.countDown();
+                    }
+
+                    @Override
+                    public void onReset(Stream stream, ResetFrame frame)
+                    {
+                        // Simulate that there is pending data to send.
+                        stream.data(new DataFrame(stream.getId(), ByteBuffer.allocate(16), true), new Callback()
+                        {
+                            @Override
+                            public void failed(Throwable x)
+                            {
+                                serverResetLatch.countDown();
+                            }
+                        });
+                    }
+                };
+            }
+        });
+
+        Session client = newClient(new Session.Listener.Adapter());
+        MetaData.Request request1 = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame1 = new HeadersFrame(request1, null, false);
+        FuturePromise<Stream> promise1 = new FuturePromise<>();
+        final CountDownLatch stream1HeadersLatch = new CountDownLatch(1);
+        final CountDownLatch stream1DataLatch = new CountDownLatch(1);
+        client.newStream(requestFrame1, promise1, new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                stream1HeadersLatch.countDown();
+            }
+
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                stream1DataLatch.countDown();
+            }
+        });
+        Stream stream1 = promise1.get(5, TimeUnit.SECONDS);
+        Assert.assertTrue(stream1HeadersLatch.await(5, TimeUnit.SECONDS));
+
+        MetaData.Request request2 = newRequest("GET", new HttpFields());
+        HeadersFrame requestFrame2 = new HeadersFrame(request2, null, false);
+        FuturePromise<Stream> promise2 = new FuturePromise<>();
+        final CountDownLatch stream2DataLatch = new CountDownLatch(1);
+        client.newStream(requestFrame2, promise2, new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                stream2DataLatch.countDown();
+            }
+        });
+        Stream stream2 = promise2.get(5, TimeUnit.SECONDS);
+
+        ResetFrame resetFrame = new ResetFrame(stream1.getId(), ErrorCode.CANCEL_STREAM_ERROR.code);
+        stream1.reset(resetFrame, Callback.NOOP);
+
+        Assert.assertTrue(serverResetLatch.await(5, TimeUnit.SECONDS));
+        // Stream MUST NOT receive data sent by server after reset.
+        Assert.assertFalse(stream1DataLatch.await(1, TimeUnit.SECONDS));
+
+        // The other stream should still be working.
+        stream2.data(new DataFrame(stream2.getId(), ByteBuffer.allocate(16), true), Callback.NOOP);
+        Assert.assertTrue(serverDataLatch.await(5, TimeUnit.SECONDS));
+        Assert.assertTrue(stream2DataLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testBlockingWriteAfterStreamReceivingReset() throws Exception
+    {
+        final CountDownLatch resetLatch = new CountDownLatch(1);
+        final CountDownLatch dataLatch = new CountDownLatch(1);
+        start(new HttpServlet()
+        {
+            @Override
+            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                Charset charset = StandardCharsets.UTF_8;
+                byte[] data = "AFTER RESET".getBytes(charset);
+
+                response.setStatus(200);
+                response.setContentType("text/plain;charset=" + charset.name());
+                response.setContentLength(data.length*10);
+                response.flushBuffer();
+
+                try
+                {
+                    // Wait for the reset to happen.
+                    Assert.assertTrue(resetLatch.await(5, TimeUnit.SECONDS));
+                }
+                catch (InterruptedException x)
+                {
+                    throw new InterruptedIOException();
+                }
+
+                try
+                {
+                    // Write some content after the stream has
+                    // been reset, it should throw an exception.
+                    for (int i=0;i<10;i++)
+                    {
+                        Thread.sleep(500);
+                        response.getOutputStream().write(data);
+                        response.flushBuffer();
+                    }
+                }
+                catch (InterruptedException x)
+                {
+
+                }
+                catch (IOException x)
+                {
+                    dataLatch.countDown();
+                }
+            }
+        });
+
+        Session client = newClient(new Session.Listener.Adapter());
+        MetaData.Request request = newRequest("GET", new HttpFields());
+        HeadersFrame frame = new HeadersFrame(request, null, true);
+        client.newStream(frame, new FuturePromise<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                stream.reset(new ResetFrame(stream.getId(), ErrorCode.CANCEL_STREAM_ERROR.code), Callback.NOOP);
+                resetLatch.countDown();
+            }
+        });
+
+        Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testAsyncWriteAfterStreamReceivingReset() throws Exception
+    {
+        final CountDownLatch resetLatch = new CountDownLatch(1);
+        final CountDownLatch dataLatch = new CountDownLatch(1);
+        start(new HttpServlet()
+        {
+            @Override
+            protected void doGet(HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
+            {
+                Charset charset = StandardCharsets.UTF_8;
+                final ByteBuffer data = ByteBuffer.wrap("AFTER RESET".getBytes(charset));
+
+                response.setStatus(200);
+                response.setContentType("text/plain;charset=" + charset.name());
+                response.setContentLength(data.remaining());
+                response.flushBuffer();
+
+                try
+                {
+                    // Wait for the reset to happen.
+                    Assert.assertTrue(resetLatch.await(5, TimeUnit.SECONDS));
+                    // Wait for the reset to arrive to the server and be processed.
+                    Thread.sleep(1000);
+                }
+                catch (InterruptedException x)
+                {
+                    throw new InterruptedIOException();
+                }
+
+                // Write some content asynchronously after the stream has been reset.
+                final AsyncContext context = request.startAsync();
+                new Thread()
+                {
+                    @Override
+                    public void run()
+                    {
+                        try
+                        {
+                            // Wait for the request thread to exit
+                            // doGet() so this is really asynchronous.
+                            Thread.sleep(1000);
+
+                            HttpOutput output = (HttpOutput)response.getOutputStream();
+                            output.sendContent(data, new Callback()
+                            {
+                                @Override
+                                public void failed(Throwable x)
+                                {
+                                    context.complete();
+                                    dataLatch.countDown();
+                                }
+                            });
+                        }
+                        catch (Throwable x)
+                        {
+                            x.printStackTrace();
+                        }
+                    }
+                }.start();
+            }
+        });
+
+        Session client = newClient(new Session.Listener.Adapter());
+        MetaData.Request request = newRequest("GET", new HttpFields());
+        HeadersFrame frame = new HeadersFrame(request, null, true);
+        client.newStream(frame, new FuturePromise<>(), new Stream.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+                stream.reset(new ResetFrame(stream.getId(), ErrorCode.CANCEL_STREAM_ERROR.code), Callback.NOOP);
+                resetLatch.countDown();
+            }
+        });
+
+        Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
+    }
+}
diff --git a/jetty-http2/http2-client/src/test/resources/jetty-logging.properties b/jetty-http2/http2-client/src/test/resources/jetty-logging.properties
new file mode 100644
index 0000000..b7185f0
--- /dev/null
+++ b/jetty-http2/http2-client/src/test/resources/jetty-logging.properties
@@ -0,0 +1,4 @@
+org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
+org.eclipse.jetty.http2.hpack.LEVEL=INFO
+#org.eclipse.jetty.http2.LEVEL=DEBUG
+#org.eclipse.jetty.servlets.LEVEL=DEBUG
diff --git a/jetty-http2/http2-common/pom.xml b/jetty-http2/http2-common/pom.xml
new file mode 100644
index 0000000..aeed3ca
--- /dev/null
+++ b/jetty-http2/http2-common/pom.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+    <groupId>org.eclipse.jetty.http2</groupId>
+    <artifactId>http2-parent</artifactId>
+    <version>9.3.6-SNAPSHOT</version>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>http2-common</artifactId>
+  <name>Jetty :: HTTP2 :: Common</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.eclipse.jetty.http2</groupId>
+      <artifactId>http2-hpack</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.toolchain</groupId>
+      <artifactId>jetty-test-helper</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+ <properties>
+   <bundle-symbolic-name>${project.groupId}.common</bundle-symbolic-name>
+ </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+          <groupId>org.apache.felix</groupId>
+          <artifactId>maven-bundle-plugin</artifactId>
+          <extensions>true</extensions>
+          <executions>
+              <execution>
+                  <goals>
+                      <goal>manifest</goal>
+                  </goals>
+                  <configuration>
+                      <instructions>
+                          <Export-Package>org.eclipse.jetty.http2.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}";</Export-Package>
+                      </instructions>
+                    </configuration>
+                 </execution>
+            </executions>
+      </plugin>
+   </plugins>
+  </build>
+
+</project>
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/AbstractFlowControlStrategy.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/AbstractFlowControlStrategy.java
new file mode 100644
index 0000000..5145ad9
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/AbstractFlowControlStrategy.java
@@ -0,0 +1,169 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2;
+
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.frames.WindowUpdateFrame;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+public abstract class AbstractFlowControlStrategy implements FlowControlStrategy
+{
+    protected static final Logger LOG = Log.getLogger(FlowControlStrategy.class);
+
+    private int initialStreamSendWindow;
+    private int initialStreamRecvWindow;
+
+    public AbstractFlowControlStrategy(int initialStreamSendWindow)
+    {
+        this.initialStreamSendWindow = initialStreamSendWindow;
+        this.initialStreamRecvWindow = DEFAULT_WINDOW_SIZE;
+    }
+
+    protected int getInitialStreamSendWindow()
+    {
+        return initialStreamSendWindow;
+    }
+
+    protected int getInitialStreamRecvWindow()
+    {
+        return initialStreamRecvWindow;
+    }
+
+    @Override
+    public void onStreamCreated(IStream stream, boolean local)
+    {
+        stream.updateSendWindow(initialStreamSendWindow);
+        stream.updateRecvWindow(initialStreamRecvWindow);
+    }
+
+    @Override
+    public void onStreamDestroyed(IStream stream, boolean local)
+    {
+    }
+
+    @Override
+    public void updateInitialStreamWindow(ISession session, int initialStreamWindow, boolean local)
+    {
+        int previousInitialStreamWindow;
+        if (local)
+        {
+            previousInitialStreamWindow = getInitialStreamRecvWindow();
+            this.initialStreamRecvWindow = initialStreamWindow;
+        }
+        else
+        {
+            previousInitialStreamWindow = getInitialStreamSendWindow();
+            this.initialStreamSendWindow = initialStreamWindow;
+        }
+        int delta = initialStreamWindow - previousInitialStreamWindow;
+
+        // SPEC: updates of the initial window size only affect stream windows, not session's.
+        for (Stream stream : session.getStreams())
+        {
+            if (local)
+            {
+                ((IStream)stream).updateRecvWindow(delta);
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Updated initial stream recv window {} -> {} for {}", previousInitialStreamWindow, initialStreamWindow, stream);
+            }
+            else
+            {
+                session.onWindowUpdate((IStream)stream, new WindowUpdateFrame(stream.getId(), delta));
+            }
+        }
+    }
+
+    @Override
+    public void onWindowUpdate(ISession session, IStream stream, WindowUpdateFrame frame)
+    {
+        int delta = frame.getWindowDelta();
+        if (frame.getStreamId() > 0)
+        {
+            // The stream may have been removed concurrently.
+            if (stream != null)
+            {
+                int oldSize = stream.updateSendWindow(delta);
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Updated stream send window {} -> {} for {}", oldSize, oldSize + delta, stream);
+            }
+        }
+        else
+        {
+            int oldSize = session.updateSendWindow(delta);
+            if (LOG.isDebugEnabled())
+                LOG.debug("Updated session send window {} -> {} for {}", oldSize, oldSize + delta, session);
+        }
+    }
+
+    @Override
+    public void onDataReceived(ISession session, IStream stream, int length)
+    {
+        int oldSize = session.updateRecvWindow(-length);
+        if (LOG.isDebugEnabled())
+            LOG.debug("Data received, updated session recv window {} -> {} for {}", oldSize, oldSize - length, session);
+
+        if (stream != null)
+        {
+            oldSize = stream.updateRecvWindow(-length);
+            if (LOG.isDebugEnabled())
+                LOG.debug("Data received, updated stream recv window {} -> {} for {}", oldSize, oldSize - length, stream);
+        }
+    }
+
+    @Override
+    public void windowUpdate(ISession session, IStream stream, WindowUpdateFrame frame)
+    {
+    }
+
+    @Override
+    public void onDataSending(IStream stream, int length)
+    {
+        if (length == 0)
+            return;
+
+        ISession session = stream.getSession();
+        int oldSize = session.updateSendWindow(-length);
+        if (LOG.isDebugEnabled())
+            LOG.debug("Updated session send window {} -> {} for {}", oldSize, oldSize - length, session);
+
+        oldSize = stream.updateSendWindow(-length);
+        if (LOG.isDebugEnabled())
+            LOG.debug("Updated stream send window {} -> {} for {}", oldSize, oldSize - length, stream);
+    }
+
+    @Override
+    public void onDataSent(IStream stream, int length)
+    {
+    }
+
+    @Override
+    public void onSessionStalled(ISession session)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Session stalled {}", session);
+    }
+
+    @Override
+    public void onStreamStalled(IStream stream)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Stream stalled {}", stream);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/BufferingFlowControlStrategy.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/BufferingFlowControlStrategy.java
new file mode 100644
index 0000000..5d851a1
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/BufferingFlowControlStrategy.java
@@ -0,0 +1,185 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.WindowUpdateFrame;
+import org.eclipse.jetty.util.Atomics;
+import org.eclipse.jetty.util.Callback;
+
+/**
+ * <p>A flow control strategy that accumulates updates and emits window control
+ * frames when the accumulated value reaches a threshold.</p>
+ * <p>The sender flow control window is represented in the receiver as two
+ * buckets: a bigger bucket, initially full, that is drained when data is
+ * received, and a smaller bucket, initially empty, that is filled when data is
+ * consumed. Only the smaller bucket can refill the bigger bucket.</p>
+ * <p>The smaller bucket is defined as a fraction of the bigger bucket.</p>
+ * <p>For a more visual representation, see the
+ * <a href="http://en.wikipedia.org/wiki/Shishi-odoshi">rocking bamboo fountain</a>.</p>
+ * <p>The algorithm works in this way.</p>
+ * <p>The initial bigger bucket (BB) capacity is 100, and let's imagine the smaller
+ * bucket (SB) being 40% of the bigger bucket: 40.</p>
+ * <p>The receiver receives a data frame of 60, so now BB=40; the data frame is
+ * passed to the application that consumes 25, so now SB=25. Since SB is not full,
+ * no window control frames are emitted.</p>
+ * <p>The application consumes other 20, so now SB=45. Since SB is full, its 45
+ * are transferred to BB, which is now BB=85, and a window control frame is sent
+ * with delta=45.</p>
+ * <p>The application consumes the remaining 15, so now SB=15, and no window
+ * control frame is emitted.</p>
+ */
+public class BufferingFlowControlStrategy extends AbstractFlowControlStrategy
+{
+    private final AtomicInteger maxSessionRecvWindow = new AtomicInteger(DEFAULT_WINDOW_SIZE);
+    private final AtomicInteger sessionLevel = new AtomicInteger();
+    private final Map<IStream, AtomicInteger> streamLevels = new ConcurrentHashMap<>();
+    private final float bufferRatio;
+
+    public BufferingFlowControlStrategy(float bufferRatio)
+    {
+        this(DEFAULT_WINDOW_SIZE, bufferRatio);
+    }
+
+    public BufferingFlowControlStrategy(int initialStreamSendWindow, float bufferRatio)
+    {
+        super(initialStreamSendWindow);
+        this.bufferRatio = bufferRatio;
+    }
+
+    @Override
+    public void onStreamCreated(IStream stream, boolean local)
+    {
+        super.onStreamCreated(stream, local);
+        streamLevels.put(stream, new AtomicInteger());
+    }
+
+    @Override
+    public void onStreamDestroyed(IStream stream, boolean local)
+    {
+        streamLevels.remove(stream);
+        super.onStreamDestroyed(stream, local);
+    }
+
+    @Override
+    public void onDataConsumed(ISession session, IStream stream, int length)
+    {
+        if (length <= 0)
+            return;
+
+        WindowUpdateFrame windowFrame = null;
+        int level = sessionLevel.addAndGet(length);
+        int maxLevel = (int)(maxSessionRecvWindow.get() * bufferRatio);
+        if (level > maxLevel)
+        {
+            level = sessionLevel.getAndSet(0);
+            session.updateRecvWindow(level);
+            if (LOG.isDebugEnabled())
+                LOG.debug("Data consumed, updated session recv window by {}/{} for {}", level, maxLevel, session);
+            windowFrame = new WindowUpdateFrame(0, level);
+        }
+        else
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Data consumed, session recv window level {}/{} for {}", level, maxLevel, session);
+        }
+
+        Frame[] windowFrames = Frame.EMPTY_ARRAY;
+        if (stream != null)
+        {
+            if (stream.isClosed())
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Data consumed, ignoring update stream recv window by {} for closed {}", length, stream);
+            }
+            else
+            {
+                AtomicInteger streamLevel = streamLevels.get(stream);
+                if (streamLevel != null)
+                {
+                    level = streamLevel.addAndGet(length);
+                    maxLevel = (int)(getInitialStreamRecvWindow() * bufferRatio);
+                    if (level > maxLevel)
+                    {
+                        level = streamLevel.getAndSet(0);
+                        stream.updateRecvWindow(level);
+                        if (LOG.isDebugEnabled())
+                            LOG.debug("Data consumed, updated stream recv window by {}/{} for {}", level, maxLevel, stream);
+                        WindowUpdateFrame frame = new WindowUpdateFrame(stream.getId(), level);
+                        if (windowFrame == null)
+                            windowFrame = frame;
+                        else
+                            windowFrames = new Frame[]{frame};
+                    }
+                    else
+                    {
+                        if (LOG.isDebugEnabled())
+                            LOG.debug("Data consumed, stream recv window level {}/{} for {}", level, maxLevel, session);
+                    }
+                }
+            }
+        }
+
+        if (windowFrame != null)
+            session.frames(stream, Callback.NOOP, windowFrame, windowFrames);
+    }
+
+    @Override
+    public void windowUpdate(ISession session, IStream stream, WindowUpdateFrame frame)
+    {
+        super.windowUpdate(session, stream, frame);
+
+        // Window updates cannot be negative.
+        // The SettingsFrame.INITIAL_WINDOW_SIZE setting
+        // only influences the *stream* window size.
+        // Therefore the session window can only be enlarged,
+        // and here we keep track of its max value.
+
+        // Updating the max session recv window is done here
+        // so that if a peer decides to send an unilateral
+        // window update to enlarge the session window,
+        // without the corresponding data consumption, here
+        // we can track it.
+        // Note that it is not perfect, since there is a time
+        // window between the session recv window being updated
+        // before the window update frame is sent, and the
+        // invocation of this method: in between data may arrive
+        // and reduce the session recv window size.
+        // But eventually the max value will be seen.
+
+        // Note that we cannot avoid the time window described
+        // above by updating the session recv window from here
+        // because there is a race between the sender and the
+        // receiver: the sender may receive a window update and
+        // send more data, while this method has not yet been
+        // invoked; when the data is received the session recv
+        // window may become negative and the connection will
+        // be closed (per specification).
+
+        if (frame.getStreamId() == 0)
+        {
+            int sessionWindow = session.updateRecvWindow(0);
+            Atomics.updateMax(maxSessionRecvWindow, sessionWindow);
+        }
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/CloseState.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/CloseState.java
new file mode 100644
index 0000000..8b12fc9
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/CloseState.java
@@ -0,0 +1,24 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2;
+
+public enum CloseState
+{
+    NOT_CLOSED, LOCALLY_CLOSED, REMOTELY_CLOSED, CLOSED
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/ErrorCode.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/ErrorCode.java
new file mode 100644
index 0000000..b4ca76c
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/ErrorCode.java
@@ -0,0 +1,58 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public enum ErrorCode
+{
+    NO_ERROR(0),
+    PROTOCOL_ERROR(1),
+    INTERNAL_ERROR(2),
+    FLOW_CONTROL_ERROR(3),
+    SETTINGS_TIMEOUT_ERROR(4),
+    STREAM_CLOSED_ERROR(5),
+    FRAME_SIZE_ERROR(6),
+    REFUSED_STREAM_ERROR(7),
+    CANCEL_STREAM_ERROR(8),
+    COMPRESSION_ERROR(9),
+    HTTP_CONNECT_ERROR(10),
+    ENHANCE_YOUR_CALM_ERROR(11),
+    INADEQUATE_SECURITY_ERROR(12),
+    HTTP_1_1_REQUIRED_ERROR(13);
+
+    public final int code;
+
+    private ErrorCode(int code)
+    {
+        this.code = code;
+        Codes.codes.put(code, this);
+    }
+
+    public static ErrorCode from(int error)
+    {
+        return Codes.codes.get(error);
+    }
+
+    private static class Codes
+    {
+        private static final Map<Integer, ErrorCode> codes = new HashMap<>();
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/Flags.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/Flags.java
new file mode 100644
index 0000000..9961216
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/Flags.java
@@ -0,0 +1,29 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2;
+
+public interface Flags
+{
+    public static final int NONE = 0x00;
+    public static final int END_STREAM = 0x01;
+    public static final int ACK = 0x01;
+    public static final int END_HEADERS = 0x04;
+    public static final int PADDING = 0x08;
+    public static final int PRIORITY = 0x20;
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/FlowControlStrategy.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/FlowControlStrategy.java
new file mode 100644
index 0000000..b5847ae
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/FlowControlStrategy.java
@@ -0,0 +1,48 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2;
+
+import org.eclipse.jetty.http2.frames.WindowUpdateFrame;
+
+public interface FlowControlStrategy
+{
+    public static int DEFAULT_WINDOW_SIZE = 65535;
+
+    public void onStreamCreated(IStream stream, boolean local);
+
+    public void onStreamDestroyed(IStream stream, boolean local);
+
+    public void updateInitialStreamWindow(ISession session, int initialStreamWindow, boolean local);
+
+    public void onWindowUpdate(ISession session, IStream stream, WindowUpdateFrame frame);
+
+    public void onDataReceived(ISession session, IStream stream, int length);
+
+    public void onDataConsumed(ISession session, IStream stream, int length);
+
+    public void windowUpdate(ISession session, IStream stream, WindowUpdateFrame frame);
+
+    public void onDataSending(IStream stream, int length);
+
+    public void onDataSent(IStream stream, int length);
+
+    public void onSessionStalled(ISession session);
+
+    public void onStreamStalled(IStream stream);
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Cipher.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Cipher.java
new file mode 100644
index 0000000..539c379
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Cipher.java
@@ -0,0 +1,356 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2;
+
+import java.util.Comparator;
+
+import org.eclipse.jetty.util.ArrayTrie;
+import org.eclipse.jetty.util.Trie;
+
+public class HTTP2Cipher
+{
+    public static final Comparator<String> COMPARATOR = new CipherComparator();
+
+    private final static Trie<Boolean> __blackProtocols = new ArrayTrie<>(6*5);
+    private final static Trie<Boolean> __blackCiphers = new ArrayTrie<>(275*40);
+
+    static
+    {
+        for (String p : new String[]
+        {
+                "TLSv1.2","TLSv1.1", "TLSv1", "SSL", "SSLv2", "SSLv3"
+        })
+        {
+            __blackProtocols.put(p,Boolean.TRUE);
+        }
+
+        for (String c : new String[]
+        {
+            "TLS_NULL_WITH_NULL_NULL",
+            "TLS_RSA_WITH_NULL_MD5",
+            "TLS_RSA_WITH_NULL_SHA",
+            "TLS_RSA_EXPORT_WITH_RC4_40_MD5",
+            "TLS_RSA_WITH_RC4_128_MD5",
+            "TLS_RSA_WITH_RC4_128_SHA",
+            "TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5",
+            "TLS_RSA_WITH_IDEA_CBC_SHA",
+            "TLS_RSA_EXPORT_WITH_DES40_CBC_SHA",
+            "TLS_RSA_WITH_DES_CBC_SHA",
+            "TLS_RSA_WITH_3DES_EDE_CBC_SHA",
+            "TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA",
+            "TLS_DH_DSS_WITH_DES_CBC_SHA",
+            "TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA",
+            "TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA",
+            "TLS_DH_RSA_WITH_DES_CBC_SHA",
+            "TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA",
+            "TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA",
+            "TLS_DHE_DSS_WITH_DES_CBC_SHA",
+            "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA",
+            "TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
+            "TLS_DHE_RSA_WITH_DES_CBC_SHA",
+            "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA",
+            "TLS_DH_anon_EXPORT_WITH_RC4_40_MD5",
+            "TLS_DH_anon_WITH_RC4_128_MD5",
+            "TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA",
+            "TLS_DH_anon_WITH_DES_CBC_SHA",
+            "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA",
+            "TLS_KRB5_WITH_DES_CBC_SHA",
+            "TLS_KRB5_WITH_3DES_EDE_CBC_SHA",
+            "TLS_KRB5_WITH_RC4_128_SHA",
+            "TLS_KRB5_WITH_IDEA_CBC_SHA",
+            "TLS_KRB5_WITH_DES_CBC_MD5",
+            "TLS_KRB5_WITH_3DES_EDE_CBC_MD5",
+            "TLS_KRB5_WITH_RC4_128_MD5",
+            "TLS_KRB5_WITH_IDEA_CBC_MD5",
+            "TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA",
+            "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA",
+            "TLS_KRB5_EXPORT_WITH_RC4_40_SHA",
+            "TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5",
+            "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5",
+            "TLS_KRB5_EXPORT_WITH_RC4_40_MD5",
+            "TLS_PSK_WITH_NULL_SHA",
+            "TLS_DHE_PSK_WITH_NULL_SHA",
+            "TLS_RSA_PSK_WITH_NULL_SHA",
+            "TLS_RSA_WITH_AES_128_CBC_SHA",
+            "TLS_DH_DSS_WITH_AES_128_CBC_SHA",
+            "TLS_DH_RSA_WITH_AES_128_CBC_SHA",
+            "TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
+            "TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
+            "TLS_DH_anon_WITH_AES_128_CBC_SHA",
+            "TLS_RSA_WITH_AES_256_CBC_SHA",
+            "TLS_DH_DSS_WITH_AES_256_CBC_SHA",
+            "TLS_DH_RSA_WITH_AES_256_CBC_SHA",
+            "TLS_DHE_DSS_WITH_AES_256_CBC_SHA",
+            "TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
+            "TLS_DH_anon_WITH_AES_256_CBC_SHA",
+            "TLS_RSA_WITH_NULL_SHA256",
+            "TLS_RSA_WITH_AES_128_CBC_SHA256",
+            "TLS_RSA_WITH_AES_256_CBC_SHA256",
+            "TLS_DH_DSS_WITH_AES_128_CBC_SHA256",
+            "TLS_DH_RSA_WITH_AES_128_CBC_SHA256",
+            "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256",
+            "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA",
+            "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA",
+            "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA",
+            "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA",
+            "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA",
+            "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA",
+            "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",
+            "TLS_DH_DSS_WITH_AES_256_CBC_SHA256",
+            "TLS_DH_RSA_WITH_AES_256_CBC_SHA256",
+            "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256",
+            "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",
+            "TLS_DH_anon_WITH_AES_128_CBC_SHA256",
+            "TLS_DH_anon_WITH_AES_256_CBC_SHA256",
+            "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA",
+            "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA",
+            "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA",
+            "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA",
+            "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA",
+            "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA",
+            "TLS_PSK_WITH_RC4_128_SHA",
+            "TLS_PSK_WITH_3DES_EDE_CBC_SHA",
+            "TLS_PSK_WITH_AES_128_CBC_SHA",
+            "TLS_PSK_WITH_AES_256_CBC_SHA",
+            "TLS_DHE_PSK_WITH_RC4_128_SHA",
+            "TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA",
+            "TLS_DHE_PSK_WITH_AES_128_CBC_SHA",
+            "TLS_DHE_PSK_WITH_AES_256_CBC_SHA",
+            "TLS_RSA_PSK_WITH_RC4_128_SHA",
+            "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA",
+            "TLS_RSA_PSK_WITH_AES_128_CBC_SHA",
+            "TLS_RSA_PSK_WITH_AES_256_CBC_SHA",
+            "TLS_RSA_WITH_SEED_CBC_SHA",
+            "TLS_DH_DSS_WITH_SEED_CBC_SHA",
+            "TLS_DH_RSA_WITH_SEED_CBC_SHA",
+            "TLS_DHE_DSS_WITH_SEED_CBC_SHA",
+            "TLS_DHE_RSA_WITH_SEED_CBC_SHA",
+            "TLS_DH_anon_WITH_SEED_CBC_SHA",
+            "TLS_RSA_WITH_AES_128_GCM_SHA256",
+            "TLS_RSA_WITH_AES_256_GCM_SHA384",
+            "TLS_DH_RSA_WITH_AES_128_GCM_SHA256",
+            "TLS_DH_RSA_WITH_AES_256_GCM_SHA384",
+            "TLS_DH_DSS_WITH_AES_128_GCM_SHA256",
+            "TLS_DH_DSS_WITH_AES_256_GCM_SHA384",
+            "TLS_DH_anon_WITH_AES_128_GCM_SHA256",
+            "TLS_DH_anon_WITH_AES_256_GCM_SHA384",
+            "TLS_PSK_WITH_AES_128_GCM_SHA256",
+            "TLS_PSK_WITH_AES_256_GCM_SHA384",
+            "TLS_RSA_PSK_WITH_AES_128_GCM_SHA256",
+            "TLS_RSA_PSK_WITH_AES_256_GCM_SHA384",
+            "TLS_PSK_WITH_AES_128_CBC_SHA256",
+            "TLS_PSK_WITH_AES_256_CBC_SHA384",
+            "TLS_PSK_WITH_NULL_SHA256",
+            "TLS_PSK_WITH_NULL_SHA384",
+            "TLS_DHE_PSK_WITH_AES_128_CBC_SHA256",
+            "TLS_DHE_PSK_WITH_AES_256_CBC_SHA384",
+            "TLS_DHE_PSK_WITH_NULL_SHA256",
+            "TLS_DHE_PSK_WITH_NULL_SHA384",
+            "TLS_RSA_PSK_WITH_AES_128_CBC_SHA256",
+            "TLS_RSA_PSK_WITH_AES_256_CBC_SHA384",
+            "TLS_RSA_PSK_WITH_NULL_SHA256",
+            "TLS_RSA_PSK_WITH_NULL_SHA384",
+            "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256",
+            "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256",
+            "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256",
+            "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256",
+            "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256",
+            "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256",
+            "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256",
+            "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256",
+            "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256",
+            "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256",
+            "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256",
+            "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256",
+            "TLS_EMPTY_RENEGOTIATION_INFO_SCSV",
+            "TLS_ECDH_ECDSA_WITH_NULL_SHA",
+            "TLS_ECDH_ECDSA_WITH_RC4_128_SHA",
+            "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA",
+            "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA",
+            "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA",
+            "TLS_ECDHE_ECDSA_WITH_NULL_SHA",
+            "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
+            "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA",
+            "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
+            "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
+            "TLS_ECDH_RSA_WITH_NULL_SHA",
+            "TLS_ECDH_RSA_WITH_RC4_128_SHA",
+            "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA",
+            "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA",
+            "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA",
+            "TLS_ECDHE_RSA_WITH_NULL_SHA",
+            "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
+            "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
+            "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
+            "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
+            "TLS_ECDH_anon_WITH_NULL_SHA",
+            "TLS_ECDH_anon_WITH_RC4_128_SHA",
+            "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA",
+            "TLS_ECDH_anon_WITH_AES_128_CBC_SHA",
+            "TLS_ECDH_anon_WITH_AES_256_CBC_SHA",
+            "TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA",
+            "TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA",
+            "TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA",
+            "TLS_SRP_SHA_WITH_AES_128_CBC_SHA",
+            "TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA",
+            "TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA",
+            "TLS_SRP_SHA_WITH_AES_256_CBC_SHA",
+            "TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA",
+            "TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA",
+            "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
+            "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",
+            "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256",
+            "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384",
+            "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
+            "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",
+            "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256",
+            "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384",
+            "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256",
+            "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384",
+            "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256",
+            "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384",
+            "TLS_ECDHE_PSK_WITH_RC4_128_SHA",
+            "TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA",
+            "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA",
+            "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA",
+            "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256",
+            "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384",
+            "TLS_ECDHE_PSK_WITH_NULL_SHA",
+            "TLS_ECDHE_PSK_WITH_NULL_SHA256",
+            "TLS_ECDHE_PSK_WITH_NULL_SHA384",
+            "TLS_RSA_WITH_ARIA_128_CBC_SHA256",
+            "TLS_RSA_WITH_ARIA_256_CBC_SHA384",
+            "TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256",
+            "TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384",
+            "TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256",
+            "TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384",
+            "TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256",
+            "TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384",
+            "TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256",
+            "TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384",
+            "TLS_DH_anon_WITH_ARIA_128_CBC_SHA256",
+            "TLS_DH_anon_WITH_ARIA_256_CBC_SHA384",
+            "TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256",
+            "TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384",
+            "TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256",
+            "TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384",
+            "TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256",
+            "TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384",
+            "TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256",
+            "TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384",
+            "TLS_RSA_WITH_ARIA_128_GCM_SHA256",
+            "TLS_RSA_WITH_ARIA_256_GCM_SHA384",
+            "TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256",
+            "TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384",
+            "TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256",
+            "TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384",
+            "TLS_DH_anon_WITH_ARIA_128_GCM_SHA256",
+            "TLS_DH_anon_WITH_ARIA_256_GCM_SHA384",
+            "TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256",
+            "TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384",
+            "TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256",
+            "TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384",
+            "TLS_PSK_WITH_ARIA_128_CBC_SHA256",
+            "TLS_PSK_WITH_ARIA_256_CBC_SHA384",
+            "TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256",
+            "TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384",
+            "TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256",
+            "TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384",
+            "TLS_PSK_WITH_ARIA_128_GCM_SHA256",
+            "TLS_PSK_WITH_ARIA_256_GCM_SHA384",
+            "TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256",
+            "TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384",
+            "TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256",
+            "TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384",
+            "TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256",
+            "TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384",
+            "TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256",
+            "TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384",
+            "TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256",
+            "TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384",
+            "TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256",
+            "TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384",
+            "TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256",
+            "TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384",
+            "TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256",
+            "TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384",
+            "TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256",
+            "TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384",
+            "TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256",
+            "TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384",
+            "TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256",
+            "TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384",
+            "TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256",
+            "TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384",
+            "TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256",
+            "TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384",
+            "TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256",
+            "TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384",
+            "TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256",
+            "TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384",
+            "TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256",
+            "TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384",
+            "TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256",
+            "TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384",
+            "TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256",
+            "TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384",
+            "TLS_RSA_WITH_AES_128_CCM",
+            "TLS_RSA_WITH_AES_256_CCM",
+            "TLS_RSA_WITH_AES_128_CCM_8",
+            "TLS_RSA_WITH_AES_256_CCM_8",
+            "TLS_PSK_WITH_AES_128_CCM",
+            "TLS_PSK_WITH_AES_256_CCM",
+            "TLS_PSK_WITH_AES_128_CCM_8",
+            "TLS_PSK_WITH_AES_256_CCM_8"
+        })
+        {
+            __blackCiphers.put(c,Boolean.TRUE);
+        }
+    }
+
+    public static boolean isBlackListProtocol(String tlsProtocol)
+    {
+        Boolean b = __blackProtocols.get(tlsProtocol);
+        return b != null && b;
+    }
+
+    public static boolean isBlackListCipher(String tlsCipher)
+    {
+        Boolean b = __blackCiphers.get(tlsCipher);
+        return b != null && b;
+    }
+
+    /**
+     * Comparator that orders non blacklisted ciphers before blacklisted ones.
+     */
+    public static class CipherComparator implements Comparator<String>
+    {
+        @Override
+        public int compare(String c1, String c2)
+        {
+            boolean b1=isBlackListCipher(c1);
+            boolean b2=isBlackListCipher(c2);
+            if (b1==b2)
+                return 0;
+            if (b1)
+                return 1;
+            return -1;
+        }
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java
new file mode 100644
index 0000000..48d5d9c
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java
@@ -0,0 +1,207 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.Queue;
+import java.util.concurrent.Executor;
+
+import org.eclipse.jetty.http2.parser.Parser;
+import org.eclipse.jetty.io.AbstractConnection;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.ConcurrentArrayQueue;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.ExecutionStrategy;
+
+public class HTTP2Connection extends AbstractConnection
+{
+    protected static final Logger LOG = Log.getLogger(HTTP2Connection.class);
+
+    private final Queue<Runnable> tasks = new ConcurrentArrayQueue<>();
+    private final ByteBufferPool byteBufferPool;
+    private final Parser parser;
+    private final ISession session;
+    private final int bufferSize;
+    private final HTTP2Producer producer = new HTTP2Producer();
+    private final ExecutionStrategy executionStrategy;
+
+    public HTTP2Connection(ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, Parser parser, ISession session, int bufferSize)
+    {
+        super(endPoint, executor);
+        this.byteBufferPool = byteBufferPool;
+        this.parser = parser;
+        this.session = session;
+        this.bufferSize = bufferSize;
+        this.executionStrategy = ExecutionStrategy.Factory.instanceFor(producer, executor);
+    }
+
+    public ISession getSession()
+    {
+        return session;
+    }
+
+
+    protected Parser getParser()
+    {
+        return parser;
+    }
+
+    protected void setInputBuffer(ByteBuffer buffer)
+    {
+        producer.buffer = buffer;
+    }
+
+    @Override
+    public void onOpen()
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("HTTP2 Open {} ", this);
+        super.onOpen();
+        executionStrategy.execute();
+    }
+
+    @Override
+    public void onClose()
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("HTTP2 Close {} ", this);
+        super.onClose();
+    }
+
+    @Override
+    public void onFillable()
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("HTTP2 onFillable {} ", this);
+        executionStrategy.execute();
+    }
+
+    private int fill(EndPoint endPoint, ByteBuffer buffer)
+    {
+        try
+        {
+            if (endPoint.isInputShutdown())
+                return -1;
+            return endPoint.fill(buffer);
+        }
+        catch (IOException x)
+        {
+            LOG.debug("Could not read from " + endPoint, x);
+            return -1;
+        }
+    }
+
+    @Override
+    protected boolean onReadTimeout()
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Idle timeout {}ms expired on {}", getEndPoint().getIdleTimeout(), this);
+        session.onIdleTimeout();
+        return false;
+    }
+
+    protected void offerTask(Runnable task, boolean dispatch)
+    {
+        tasks.offer(task);
+        if (dispatch)
+            executionStrategy.dispatch();
+        else
+            executionStrategy.execute();
+    }
+
+    @Override
+    public void close()
+    {
+        // We don't call super from here, otherwise we close the
+        // endPoint and we're not able to read or write anymore.
+        session.close(ErrorCode.NO_ERROR.code, "close", Callback.NOOP);
+    }
+
+    protected class HTTP2Producer implements ExecutionStrategy.Producer
+    {
+        private ByteBuffer buffer;
+
+        @Override
+        public Runnable produce()
+        {
+            Runnable task = tasks.poll();
+            if (LOG.isDebugEnabled())
+                LOG.debug("Dequeued task {}", task);
+            if (task != null)
+                return task;
+
+            if (isFillInterested())
+                return null;
+
+            if (buffer == null)
+                buffer = byteBufferPool.acquire(bufferSize, false); // TODO: make directness customizable
+            boolean looping = BufferUtil.hasContent(buffer);
+            while (true)
+            {
+                if (looping)
+                {
+                    while (buffer.hasRemaining())
+                        parser.parse(buffer);
+
+                    task = tasks.poll();
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Dequeued task {}", task);
+                    if (task != null)
+                    {
+                        release();
+                        return task;
+                    }
+                }
+
+                int filled = fill(getEndPoint(), buffer);
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Filled {} bytes", filled);
+
+                if (filled == 0)
+                {
+                    release();
+                    fillInterested();
+                    return null;
+                }
+                else if (filled < 0)
+                {
+                    release();
+                    session.onShutdown();
+                    return null;
+                }
+
+                looping = true;
+            }
+        }
+
+        private void release()
+        {
+            if (buffer != null && !buffer.hasRemaining())
+            {
+                byteBufferPool.release(buffer);
+                buffer = null;
+            }
+        }
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Flusher.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Flusher.java
new file mode 100644
index 0000000..f30238d
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Flusher.java
@@ -0,0 +1,413 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2;
+
+import java.nio.ByteBuffer;
+import java.nio.channels.ClosedChannelException;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.WindowUpdateFrame;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.EofException;
+import org.eclipse.jetty.util.ArrayQueue;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.IteratingCallback;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+public class HTTP2Flusher extends IteratingCallback
+{
+    private static final Logger LOG = Log.getLogger(HTTP2Flusher.class);
+
+    private final Queue<WindowEntry> windows = new ArrayDeque<>();
+    private final ArrayQueue<Entry> frames = new ArrayQueue<>(ArrayQueue.DEFAULT_CAPACITY, ArrayQueue.DEFAULT_GROWTH, this);
+    private final Map<IStream, Integer> streams = new HashMap<>();
+    private final List<Entry> resets = new ArrayList<>();
+    private final List<Entry> actives = new ArrayList<>();
+    private final Queue<Entry> completes = new ArrayDeque<>();
+    private final HTTP2Session session;
+    private final ByteBufferPool.Lease lease;
+
+    public HTTP2Flusher(HTTP2Session session)
+    {
+        this.session = session;
+        this.lease = new ByteBufferPool.Lease(session.getGenerator().getByteBufferPool());
+    }
+
+    public void window(IStream stream, WindowUpdateFrame frame)
+    {
+        boolean added = false;
+        synchronized (this)
+        {
+            if (!isClosed())
+                added = windows.offer(new WindowEntry(stream, frame));
+        }
+        // Flush stalled data.
+        if (added)
+            iterate();
+    }
+
+    public boolean prepend(Entry entry)
+    {
+        boolean fail = false;
+        synchronized (this)
+        {
+            if (isClosed())
+            {
+                fail = true;
+            }
+            else
+            {
+                frames.add(0, entry);
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Prepended {}, frames={}", entry, frames.size());
+            }
+        }
+        if (fail)
+            closed(entry, new ClosedChannelException());
+        return !fail;
+    }
+
+    public boolean append(Entry entry)
+    {
+        boolean fail = false;
+        synchronized (this)
+        {
+            if (isClosed())
+            {
+                fail = true;
+            }
+            else
+            {
+                frames.offer(entry);
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Appended {}, frames={}", entry, frames.size());
+            }
+        }
+        if (fail)
+            closed(entry, new ClosedChannelException());
+        return !fail;
+    }
+
+    private Entry remove(int index)
+    {
+        synchronized (this)
+        {
+            if (index == 0)
+                return frames.pollUnsafe();
+            else
+                return frames.remove(index);
+        }
+    }
+
+    public int getQueueSize()
+    {
+        synchronized (this)
+        {
+            return frames.size();
+        }
+    }
+
+    @Override
+    protected Action process() throws Exception
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Flushing {}", session);
+
+        synchronized (this)
+        {
+            // First thing, update the window sizes, so we can
+            // reason about the frames to remove from the queue.
+            while (!windows.isEmpty())
+            {
+                WindowEntry entry = windows.poll();
+                entry.perform();
+            }
+
+            // Now the window sizes cannot change.
+            // Window updates that happen concurrently will
+            // be queued and processed on the next iteration.
+            int sessionWindow = session.getSendWindow();
+
+            int index = 0;
+            int size = frames.size();
+            while (index < size)
+            {
+                Entry entry = frames.get(index);
+                IStream stream = entry.stream;
+
+                // If the stream has been reset, don't send the frame.
+                if (stream != null && stream.isReset() && !entry.isProtocol())
+                {
+                    remove(index);
+                    --size;
+                    resets.add(entry);
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Gathered for reset {}", entry);
+                    continue;
+                }
+
+                // Check if the frame fits in the flow control windows.
+                int remaining = entry.dataRemaining();
+                if (remaining > 0)
+                {
+                    FlowControlStrategy flowControl = session.getFlowControlStrategy();
+                    if (sessionWindow <= 0)
+                    {
+                        flowControl.onSessionStalled(session);
+                        ++index;
+                        // There may be *non* flow controlled frames to send.
+                        continue;
+                    }
+
+                    if (stream != null)
+                    {
+                        // The stream may have a smaller window than the session.
+                        Integer streamWindow = streams.get(stream);
+                        if (streamWindow == null)
+                        {
+                            streamWindow = stream.updateSendWindow(0);
+                            streams.put(stream, streamWindow);
+                        }
+
+                        // Is it a frame belonging to an already stalled stream ?
+                        if (streamWindow <= 0)
+                        {
+                            flowControl.onStreamStalled(stream);
+                            ++index;
+                            // There may be *non* flow controlled frames to send.
+                            continue;
+                        }
+                    }
+
+                    // The frame fits both flow control windows, reduce them.
+                    sessionWindow -= remaining;
+                    if (stream != null)
+                        streams.put(stream, streams.get(stream) - remaining);
+                }
+
+                // The frame will be written, remove it from the queue.
+                remove(index);
+                --size;
+                actives.add(entry);
+
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Gathered for write {}", entry);
+            }
+            streams.clear();
+        }
+
+        // Perform resets outside the sync block.
+        for (int i = 0; i < resets.size(); ++i)
+        {
+            Entry entry = resets.get(i);
+            entry.reset();
+        }
+        resets.clear();
+
+        if (actives.isEmpty())
+        {
+            if (isClosed())
+                abort(new ClosedChannelException());
+
+            if (LOG.isDebugEnabled())
+                LOG.debug("Flushed {}", session);
+
+            return Action.IDLE;
+        }
+
+        for (int i = 0; i < actives.size(); ++i)
+        {
+            Entry entry = actives.get(i);
+            Throwable failure = entry.generate(lease);
+            if (failure != null)
+            {
+                // Failure to generate the entry is catastrophic.
+                failed(failure);
+                return Action.SUCCEEDED;
+            }
+        }
+
+        List<ByteBuffer> byteBuffers = lease.getByteBuffers();
+        if (LOG.isDebugEnabled())
+            LOG.debug("Writing {} buffers ({} bytes) for {} frames {}", byteBuffers.size(), lease.getTotalLength(), actives.size(), actives);
+        session.getEndPoint().write(this, byteBuffers.toArray(new ByteBuffer[byteBuffers.size()]));
+        return Action.SCHEDULED;
+    }
+
+    @Override
+    public void succeeded()
+    {
+        lease.recycle();
+
+        // Transfer active items to avoid reentrancy.
+        for (int i = 0; i < actives.size(); ++i)
+            completes.add(actives.get(i));
+        actives.clear();
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("Written {} frames for {}", completes.size(), completes);
+
+        // Drain the frames one by one to avoid reentrancy.
+        while (!completes.isEmpty())
+        {
+            Entry entry = completes.poll();
+            entry.succeeded();
+        }
+
+        super.succeeded();
+    }
+
+    @Override
+    protected void onCompleteSuccess()
+    {
+        throw new IllegalStateException();
+    }
+
+    @Override
+    protected void onCompleteFailure(Throwable x)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Failed", x);
+
+        lease.recycle();
+
+        // Transfer active items to avoid reentrancy.
+        for (int i = 0; i < actives.size(); ++i)
+            completes.add(actives.get(i));
+        actives.clear();
+
+        // Drain the frames one by one to avoid reentrancy.
+        while (!completes.isEmpty())
+        {
+            Entry entry = completes.poll();
+            entry.failed(x);
+        }
+
+        abort(x);
+    }
+
+    private void abort(Throwable x)
+    {
+        Queue<Entry> queued;
+        synchronized (this)
+        {
+            queued = new ArrayDeque<>(frames);
+            frames.clear();
+        }
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("Aborting, queued={}", queued.size());
+
+        for (Entry entry : queued)
+            closed(entry, x);
+
+        session.abort(x);
+    }
+
+    private void closed(Entry entry, Throwable failure)
+    {
+        entry.failed(failure);
+    }
+
+    public static abstract class Entry implements Callback
+    {
+        protected final Frame frame;
+        protected final IStream stream;
+        protected final Callback callback;
+
+        protected Entry(Frame frame, IStream stream, Callback callback)
+        {
+            this.frame = frame;
+            this.stream = stream;
+            this.callback = callback;
+        }
+
+        public int dataRemaining()
+        {
+            return 0;
+        }
+
+        public Throwable generate(ByteBufferPool.Lease lease)
+        {
+            return null;
+        }
+
+        public void reset()
+        {
+            failed(new EofException("reset"));
+        }
+
+        @Override
+        public void failed(Throwable x)
+        {
+            if (stream != null)
+            {
+                stream.close();
+                stream.getSession().removeStream(stream, true);
+            }
+            callback.failed(x);
+        }
+
+        public boolean isProtocol()
+        {
+            switch (frame.getType())
+            {
+                case PRIORITY:
+                case RST_STREAM:
+                case GO_AWAY:
+                case WINDOW_UPDATE:
+                case DISCONNECT:
+                    return true;
+                default:
+                    return false;
+            }
+        }
+
+        @Override
+        public String toString()
+        {
+            return frame.toString();
+        }
+    }
+
+    private class WindowEntry
+    {
+        private final IStream stream;
+        private final WindowUpdateFrame frame;
+
+        public WindowEntry(IStream stream, WindowUpdateFrame frame)
+        {
+            this.stream = stream;
+            this.frame = frame;
+        }
+
+        public void perform()
+        {
+            FlowControlStrategy flowControl = session.getFlowControlStrategy();
+            flowControl.onWindowUpdate(session, stream, frame);
+        }
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Session.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Session.java
new file mode 100644
index 0000000..17b6e0b
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Session.java
@@ -0,0 +1,1205 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2;
+
+import java.io.IOException;
+import java.nio.channels.ClosedChannelException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.DisconnectFrame;
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.FrameType;
+import org.eclipse.jetty.http2.frames.GoAwayFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PingFrame;
+import org.eclipse.jetty.http2.frames.PriorityFrame;
+import org.eclipse.jetty.http2.frames.PushPromiseFrame;
+import org.eclipse.jetty.http2.frames.ResetFrame;
+import org.eclipse.jetty.http2.frames.SettingsFrame;
+import org.eclipse.jetty.http2.frames.WindowUpdateFrame;
+import org.eclipse.jetty.http2.generator.Generator;
+import org.eclipse.jetty.http2.parser.Parser;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.util.Atomics;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.CountingCallback;
+import org.eclipse.jetty.util.Promise;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.Scheduler;
+
+public abstract class HTTP2Session implements ISession, Parser.Listener
+{
+    private static final Logger LOG = Log.getLogger(HTTP2Session.class);
+
+    private final ConcurrentMap<Integer, IStream> streams = new ConcurrentHashMap<>();
+    private final AtomicInteger streamIds = new AtomicInteger();
+    private final AtomicInteger lastStreamId = new AtomicInteger();
+    private final AtomicInteger localStreamCount = new AtomicInteger();
+    private final AtomicInteger remoteStreamCount = new AtomicInteger();
+    private final AtomicInteger sendWindow = new AtomicInteger();
+    private final AtomicInteger recvWindow = new AtomicInteger();
+    private final AtomicReference<CloseState> closed = new AtomicReference<>(CloseState.NOT_CLOSED);
+    private final Scheduler scheduler;
+    private final EndPoint endPoint;
+    private final Generator generator;
+    private final Listener listener;
+    private final FlowControlStrategy flowControl;
+    private final HTTP2Flusher flusher;
+    private int maxLocalStreams;
+    private int maxRemoteStreams;
+    private long streamIdleTimeout;
+    private boolean pushEnabled;
+
+    public HTTP2Session(Scheduler scheduler, EndPoint endPoint, Generator generator, Listener listener, FlowControlStrategy flowControl, int initialStreamId)
+    {
+        this.scheduler = scheduler;
+        this.endPoint = endPoint;
+        this.generator = generator;
+        this.listener = listener;
+        this.flowControl = flowControl;
+        this.flusher = new HTTP2Flusher(this);
+        this.maxLocalStreams = -1;
+        this.maxRemoteStreams = -1;
+        this.streamIds.set(initialStreamId);
+        this.streamIdleTimeout = endPoint.getIdleTimeout();
+        this.sendWindow.set(FlowControlStrategy.DEFAULT_WINDOW_SIZE);
+        this.recvWindow.set(FlowControlStrategy.DEFAULT_WINDOW_SIZE);
+        this.pushEnabled = true; // SPEC: by default, push is enabled.
+    }
+
+    public FlowControlStrategy getFlowControlStrategy()
+    {
+        return flowControl;
+    }
+
+    public int getMaxLocalStreams()
+    {
+        return maxLocalStreams;
+    }
+
+    public void setMaxLocalStreams(int maxLocalStreams)
+    {
+        this.maxLocalStreams = maxLocalStreams;
+    }
+
+    public int getMaxRemoteStreams()
+    {
+        return maxRemoteStreams;
+    }
+
+    public void setMaxRemoteStreams(int maxRemoteStreams)
+    {
+        this.maxRemoteStreams = maxRemoteStreams;
+    }
+
+    public long getStreamIdleTimeout()
+    {
+        return streamIdleTimeout;
+    }
+
+    public void setStreamIdleTimeout(long streamIdleTimeout)
+    {
+        this.streamIdleTimeout = streamIdleTimeout;
+    }
+
+    public EndPoint getEndPoint()
+    {
+        return endPoint;
+    }
+
+    public Generator getGenerator()
+    {
+        return generator;
+    }
+
+    @Override
+    public void onData(final DataFrame frame)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Received {}", frame);
+
+        int streamId = frame.getStreamId();
+        final IStream stream = getStream(streamId);
+
+        // SPEC: the session window must be updated even if the stream is null.
+        // The flow control length includes the padding bytes.
+        final int flowControlLength = frame.remaining() + frame.padding();
+        flowControl.onDataReceived(this, stream, flowControlLength);
+
+        if (stream != null)
+        {
+            if (getRecvWindow() < 0)
+            {
+                close(ErrorCode.FLOW_CONTROL_ERROR.code, "session_window_exceeded", Callback.NOOP);
+            }
+            else
+            {
+                stream.process(frame, new Callback()
+                {
+                    @Override
+                    public void succeeded()
+                    {
+                        flowControl.onDataConsumed(HTTP2Session.this, stream, flowControlLength);
+                    }
+
+                    @Override
+                    public void failed(Throwable x)
+                    {
+                        // Consume also in case of failures, to free the
+                        // session flow control window for other streams.
+                        flowControl.onDataConsumed(HTTP2Session.this, stream, flowControlLength);
+                    }
+                });
+            }
+        }
+        else
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Ignoring {}, stream #{} not found", frame, streamId);
+            // We must enlarge the session flow control window,
+            // otherwise other requests will be stalled.
+            flowControl.onDataConsumed(this, null, flowControlLength);
+        }
+    }
+
+    @Override
+    public abstract void onHeaders(HeadersFrame frame);
+
+    @Override
+    public void onPriority(PriorityFrame frame)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Received {}", frame);
+    }
+
+    @Override
+    public void onReset(ResetFrame frame)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Received {}", frame);
+
+        IStream stream = getStream(frame.getStreamId());
+        if (stream != null)
+            stream.process(frame, Callback.NOOP);
+        else
+            notifyReset(this, frame);
+    }
+
+    @Override
+    public void onSettings(SettingsFrame frame)
+    {
+        // SPEC: SETTINGS frame MUST be replied.
+        onSettings(frame, true);
+    }
+
+    public void onSettings(SettingsFrame frame, boolean reply)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Received {}", frame);
+
+        if (frame.isReply())
+            return;
+
+        // Iterate over all settings
+        for (Map.Entry<Integer, Integer> entry : frame.getSettings().entrySet())
+        {
+            int key = entry.getKey();
+            int value = entry.getValue();
+            switch (key)
+            {
+                case SettingsFrame.HEADER_TABLE_SIZE:
+                {
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Update HPACK header table size to {}", value);
+                    generator.setHeaderTableSize(value);
+                    break;
+                }
+                case SettingsFrame.ENABLE_PUSH:
+                {
+                    // SPEC: check the value is sane.
+                    if (value != 0 && value != 1)
+                    {
+                        onConnectionFailure(ErrorCode.PROTOCOL_ERROR.code, "invalid_settings_enable_push");
+                        return;
+                    }
+                    pushEnabled = value == 1;
+                    break;
+                }
+                case SettingsFrame.MAX_CONCURRENT_STREAMS:
+                {
+                    maxLocalStreams = value;
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Update max local concurrent streams to {}", maxLocalStreams);
+                    break;
+                }
+                case SettingsFrame.INITIAL_WINDOW_SIZE:
+                {
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Update initial window size to {}", value);
+                    flowControl.updateInitialStreamWindow(this, value, false);
+                    break;
+                }
+                case SettingsFrame.MAX_FRAME_SIZE:
+                {
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Update max frame size to {}", value);
+                    // SPEC: check the max frame size is sane.
+                    if (value < Frame.DEFAULT_MAX_LENGTH || value > Frame.MAX_MAX_LENGTH)
+                    {
+                        onConnectionFailure(ErrorCode.PROTOCOL_ERROR.code, "invalid_settings_max_frame_size");
+                        return;
+                    }
+                    generator.setMaxFrameSize(value);
+                    break;
+                }
+                case SettingsFrame.MAX_HEADER_LIST_SIZE:
+                {
+                    // TODO implement
+                    LOG.warn("NOT IMPLEMENTED max header list size to {}", value);
+                    break;
+                }
+                default:
+                {
+                    LOG.debug("Unknown setting {}:{}", key, value);
+                    break;
+                }
+            }
+        }
+        notifySettings(this, frame);
+
+        if (reply)
+        {
+            SettingsFrame replyFrame = new SettingsFrame(Collections.<Integer, Integer>emptyMap(), true);
+            settings(replyFrame, Callback.NOOP);
+        }
+    }
+
+    @Override
+    public void onPing(PingFrame frame)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Received {}", frame);
+
+        if (frame.isReply())
+        {
+            notifyPing(this, frame);
+        }
+        else
+        {
+            PingFrame reply = new PingFrame(frame.getPayload(), true);
+            control(null, Callback.NOOP, reply);
+        }
+    }
+
+    /**
+     * This method is called when receiving a GO_AWAY from the other peer.
+     * We check the close state to act appropriately:
+     *
+     * * NOT_CLOSED: we move to REMOTELY_CLOSED and queue a disconnect, so
+     *   that the content of the queue is written, and then the connection
+     *   closed. We notify the application after being terminated.
+     *   See <code>HTTP2Session.ControlEntry#succeeded()</code>
+     *
+     * * In all other cases, we do nothing since other methods are already
+     *   performing their actions.
+     *
+     * @param frame the GO_AWAY frame that has been received.
+     * @see #close(int, String, Callback)
+     * @see #onShutdown()
+     * @see #onIdleTimeout()
+     */
+    @Override
+    public void onGoAway(final GoAwayFrame frame)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Received {}", frame);
+
+        while (true)
+        {
+            CloseState current = closed.get();
+            switch (current)
+            {
+                case NOT_CLOSED:
+                {
+                    if (closed.compareAndSet(current, CloseState.REMOTELY_CLOSED))
+                    {
+                        // We received a GO_AWAY, so try to write
+                        // what's in the queue and then disconnect.
+                        control(null, new Callback()
+                        {
+                            @Override
+                            public void succeeded()
+                            {
+                                notifyClose(HTTP2Session.this, frame);
+                            }
+
+                            @Override
+                            public void failed(Throwable x)
+                            {
+                                notifyClose(HTTP2Session.this, frame);
+                            }
+                        }, new DisconnectFrame());
+                        return;
+                    }
+                    break;
+                }
+                default:
+                {
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Ignored {}, already closed", frame);
+                    return;
+                }
+            }
+        }
+    }
+
+    @Override
+    public void onWindowUpdate(WindowUpdateFrame frame)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Received {}", frame);
+
+        int streamId = frame.getStreamId();
+        if (streamId > 0)
+        {
+            IStream stream = getStream(streamId);
+            if (stream != null)
+                onWindowUpdate(stream, frame);
+        }
+        else
+        {
+            onWindowUpdate(null, frame);
+        }
+    }
+
+    @Override
+    public void onConnectionFailure(int error, String reason)
+    {
+        close(error, reason, Callback.NOOP);
+        notifyFailure(this, new IOException(String.format("%d/%s", error, reason)));
+    }
+
+    @Override
+    public void newStream(HeadersFrame frame, Promise<Stream> promise, Stream.Listener listener)
+    {
+        // Synchronization is necessary to atomically create
+        // the stream id and enqueue the frame to be sent.
+        boolean queued;
+        synchronized (this)
+        {
+            int streamId = frame.getStreamId();
+            if (streamId <= 0)
+            {
+                streamId = streamIds.getAndAdd(2);
+                PriorityFrame priority = frame.getPriority();
+                priority = priority == null ? null : new PriorityFrame(streamId, priority.getParentStreamId(),
+                        priority.getWeight(), priority.isExclusive());
+                frame = new HeadersFrame(streamId, frame.getMetaData(), priority, frame.isEndStream());
+            }
+            final IStream stream = createLocalStream(streamId, promise);
+            if (stream == null)
+                return;
+            stream.setListener(listener);
+
+            ControlEntry entry = new ControlEntry(frame, stream, new PromiseCallback<>(promise, stream));
+            queued = flusher.append(entry);
+        }
+        // Iterate outside the synchronized block.
+        if (queued)
+            flusher.iterate();
+    }
+
+    @Override
+    public int priority(PriorityFrame frame, Callback callback)
+    {
+        int streamId = frame.getStreamId();
+        IStream stream = streams.get(streamId);
+        if (stream == null)
+        {
+            streamId = streamIds.getAndAdd(2);
+            frame = new PriorityFrame(streamId, frame.getParentStreamId(),
+                    frame.getWeight(), frame.isExclusive());
+        }
+        control(stream, callback, frame);
+        return streamId;
+    }
+
+    @Override
+    public void push(IStream stream, Promise<Stream> promise, PushPromiseFrame frame, Stream.Listener listener)
+    {
+        // Synchronization is necessary to atomically create
+        // the stream id and enqueue the frame to be sent.
+        boolean queued;
+        synchronized (this)
+        {
+            int streamId = streamIds.getAndAdd(2);
+            frame = new PushPromiseFrame(frame.getStreamId(), streamId, frame.getMetaData());
+
+            final IStream pushStream = createLocalStream(streamId, promise);
+            if (pushStream == null)
+                return;
+            pushStream.setListener(listener);
+
+            ControlEntry entry = new ControlEntry(frame, pushStream, new PromiseCallback<>(promise, pushStream));
+            queued = flusher.append(entry);
+        }
+        // Iterate outside the synchronized block.
+        if (queued)
+            flusher.iterate();
+    }
+
+
+    @Override
+    public void settings(SettingsFrame frame, Callback callback)
+    {
+        control(null, callback, frame);
+    }
+
+    @Override
+    public void ping(PingFrame frame, Callback callback)
+    {
+        if (frame.isReply())
+            callback.failed(new IllegalArgumentException());
+        else
+            control(null, callback, frame);
+    }
+
+    protected void reset(ResetFrame frame, Callback callback)
+    {
+        control(getStream(frame.getStreamId()), callback, frame);
+    }
+
+    /**
+     * Invoked internally and by applications to send a GO_AWAY frame to the
+     * other peer. We check the close state to act appropriately:
+     *
+     * * NOT_CLOSED: we move to LOCALLY_CLOSED and queue a GO_AWAY. When the
+     *   GO_AWAY has been written, it will only cause the output to be shut
+     *   down (not the connection closed), so that the application can still
+     *   read frames arriving from the other peer.
+     *   Ideally the other peer will notice the GO_AWAY and close the connection.
+     *   When that happen, we close the connection from {@link #onShutdown()}.
+     *   Otherwise, the idle timeout mechanism will close the connection, see
+     *   {@link #onIdleTimeout()}.
+     *
+     * * In all other cases, we do nothing since other methods are already
+     *   performing their actions.
+     *
+     * @param error the error code
+     * @param reason the reason
+     * @param callback the callback to invoke when the operation is complete
+     * @see #onGoAway(GoAwayFrame)
+     * @see #onShutdown()
+     * @see #onIdleTimeout()
+     */
+    @Override
+    public boolean close(int error, String reason, Callback callback)
+    {
+        while (true)
+        {
+            CloseState current = closed.get();
+            switch (current)
+            {
+                case NOT_CLOSED:
+                {
+                    if (closed.compareAndSet(current, CloseState.LOCALLY_CLOSED))
+                    {
+                        byte[] payload = reason == null ? null : reason.getBytes(StandardCharsets.UTF_8);
+                        GoAwayFrame frame = new GoAwayFrame(lastStreamId.get(), error, payload);
+                        control(null, callback, frame);
+                        return true;
+                    }
+                    break;
+                }
+                default:
+                {
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Ignoring close {}/{}, already closed", error, reason);
+                    callback.succeeded();
+                    return false;
+                }
+            }
+        }
+    }
+
+    @Override
+    public boolean isClosed()
+    {
+        return closed.get() != CloseState.NOT_CLOSED;
+    }
+
+    private void control(IStream stream, Callback callback, Frame frame)
+    {
+        frames(stream, callback, frame, Frame.EMPTY_ARRAY);
+    }
+
+    @Override
+    public void frames(IStream stream, Callback callback, Frame frame, Frame... frames)
+    {
+        // We want to generate as late as possible to allow re-prioritization;
+        // generation will happen while processing the entries.
+
+        // The callback needs to be notified only when the last frame completes.
+
+        int length = frames.length;
+        if (length == 0)
+        {
+            frame(new ControlEntry(frame, stream, callback), true);
+        }
+        else
+        {
+            callback = new CountingCallback(callback, 1 + length);
+            frame(new ControlEntry(frame, stream, callback), false);
+            for (int i = 1; i <= length; ++i)
+                frame(new ControlEntry(frames[i - 1], stream, callback), i == length);
+        }
+    }
+
+    @Override
+    public void data(IStream stream, Callback callback, DataFrame frame)
+    {
+        // We want to generate as late as possible to allow re-prioritization.
+        frame(new DataEntry(frame, stream, callback), true);
+    }
+
+    private void frame(HTTP2Flusher.Entry entry, boolean flush)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Sending {}", entry.frame);
+        // Ping frames are prepended to process them as soon as possible.
+        boolean queued = entry.frame.getType() == FrameType.PING ? flusher.prepend(entry) : flusher.append(entry);
+        if (queued && flush)
+            flusher.iterate();
+    }
+
+    protected IStream createLocalStream(int streamId, Promise<Stream> promise)
+    {
+        while (true)
+        {
+            int localCount = localStreamCount.get();
+            int maxCount = maxLocalStreams;
+            if (maxCount >= 0 && localCount >= maxCount)
+            {
+                promise.failed(new IllegalStateException("Max local stream count " + maxCount + " exceeded"));
+                return null;
+            }
+            if (localStreamCount.compareAndSet(localCount, localCount + 1))
+                break;
+        }
+
+        IStream stream = newStream(streamId);
+        if (streams.putIfAbsent(streamId, stream) == null)
+        {
+            stream.setIdleTimeout(getStreamIdleTimeout());
+            flowControl.onStreamCreated(stream, true);
+            if (LOG.isDebugEnabled())
+                LOG.debug("Created local {}", stream);
+            return stream;
+        }
+        else
+        {
+            promise.failed(new IllegalStateException("Duplicate stream " + streamId));
+            return null;
+        }
+    }
+
+    protected IStream createRemoteStream(int streamId)
+    {
+        // SPEC: exceeding max concurrent streams is treated as stream error.
+        while (true)
+        {
+            int remoteCount = remoteStreamCount.get();
+            int maxCount = getMaxRemoteStreams();
+            if (maxCount >= 0 && remoteCount >= maxCount)
+            {
+                reset(new ResetFrame(streamId, ErrorCode.REFUSED_STREAM_ERROR.code), Callback.NOOP);
+                return null;
+            }
+            if (remoteStreamCount.compareAndSet(remoteCount, remoteCount + 1))
+                break;
+        }
+
+        IStream stream = newStream(streamId);
+
+        // SPEC: duplicate stream is treated as connection error.
+        if (streams.putIfAbsent(streamId, stream) == null)
+        {
+            updateLastStreamId(streamId);
+            stream.setIdleTimeout(getStreamIdleTimeout());
+            flowControl.onStreamCreated(stream, false);
+            if (LOG.isDebugEnabled())
+                LOG.debug("Created remote {}", stream);
+            return stream;
+        }
+        else
+        {
+            close(ErrorCode.PROTOCOL_ERROR.code, "duplicate_stream", Callback.NOOP);
+            return null;
+        }
+    }
+
+    protected IStream newStream(int streamId)
+    {
+        return new HTTP2Stream(scheduler, this, streamId);
+    }
+
+    @Override
+    public void removeStream(IStream stream, boolean local)
+    {
+        IStream removed = streams.remove(stream.getId());
+        if (removed != null)
+        {
+            assert removed == stream;
+
+            if (local)
+                localStreamCount.decrementAndGet();
+            else
+                remoteStreamCount.decrementAndGet();
+
+            flowControl.onStreamDestroyed(stream, local);
+
+            if (LOG.isDebugEnabled())
+                LOG.debug("Removed {}", stream);
+        }
+    }
+
+    @Override
+    public Collection<Stream> getStreams()
+    {
+        List<Stream> result = new ArrayList<>();
+        result.addAll(streams.values());
+        return result;
+    }
+
+    @Override
+    public IStream getStream(int streamId)
+    {
+        return streams.get(streamId);
+    }
+
+    public int getSendWindow()
+    {
+        return sendWindow.get();
+    }
+
+    public int getRecvWindow()
+    {
+        return recvWindow.get();
+    }
+
+    @Override
+    public int updateSendWindow(int delta)
+    {
+        return sendWindow.getAndAdd(delta);
+    }
+
+    @Override
+    public int updateRecvWindow(int delta)
+    {
+        return recvWindow.getAndAdd(delta);
+    }
+
+    @Override
+    public void onWindowUpdate(IStream stream, WindowUpdateFrame frame)
+    {
+        // WindowUpdateFrames arrive concurrently with writes.
+        // Increasing (or reducing) the window size concurrently
+        // with writes requires coordination with the flusher, that
+        // decides how many frames to write depending on the available
+        // window sizes. If the window sizes vary concurrently, the
+        // flusher may take non-optimal or wrong decisions.
+        // Here, we "queue" window updates to the flusher, so it will
+        // be the only component responsible for window updates, for
+        // both increments and reductions.
+        flusher.window(stream, frame);
+    }
+
+    @Override
+    public boolean isPushEnabled()
+    {
+        return pushEnabled;
+    }
+
+    /**
+     * A typical close by a remote peer involves a GO_AWAY frame followed by TCP FIN.
+     * This method is invoked when the TCP FIN is received, or when an exception is
+     * thrown while reading, and we check the close state to act appropriately:
+     *
+     * * NOT_CLOSED: means that the remote peer did not send a GO_AWAY (abrupt close)
+     *   or there was an exception while reading, and therefore we terminate.
+     *
+     * * LOCALLY_CLOSED: we have sent the GO_AWAY to the remote peer, which received
+     *   it and closed the connection; we queue a disconnect to close the connection
+     *   on the local side.
+     *   The GO_AWAY just shutdown the output, so we need this step to make sure the
+     *   connection is closed. See {@link #close(int, String, Callback)}.
+     *
+     * * REMOTELY_CLOSED: we received the GO_AWAY, and the TCP FIN afterwards, so we
+     *   do nothing since the handling of the GO_AWAY will take care of closing the
+     *   connection. See {@link #onGoAway(GoAwayFrame)}.
+     *
+     * @see #onGoAway(GoAwayFrame)
+     * @see #close(int, String, Callback)
+     * @see #onIdleTimeout()
+     */
+    @Override
+    public void onShutdown()
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Shutting down {}", this);
+
+        switch (closed.get())
+        {
+            case NOT_CLOSED:
+            {
+                // The other peer did not send a GO_AWAY, no need to be gentle.
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Abrupt close for {}", this);
+                abort(new ClosedChannelException());
+                break;
+            }
+            case LOCALLY_CLOSED:
+            {
+                // We have closed locally, and only shutdown
+                // the output; now queue a disconnect.
+                control(null, Callback.NOOP, new DisconnectFrame());
+                break;
+            }
+            case REMOTELY_CLOSED:
+            {
+                // Nothing to do, the GO_AWAY frame we
+                // received will close the connection.
+                break;
+            }
+            default:
+            {
+                break;
+            }
+        }
+    }
+
+    /**
+     * This method is invoked when the idle timeout triggers. We check the close state
+     * to act appropriately:
+     *
+     * * NOT_CLOSED: it's a real idle timeout, we just initiate a close, see
+     *   {@link #close(int, String, Callback)}.
+     *
+     * * LOCALLY_CLOSED: we have sent a GO_AWAY and only shutdown the output, but the
+     *   other peer did not close the connection so we never received the TCP FIN, and
+     *   therefore we terminate.
+     *
+     * * REMOTELY_CLOSED: the other peer sent us a GO_AWAY, we should have queued a
+     *   disconnect, but for some reason it was not processed (for example, queue was
+     *   stuck because of TCP congestion), therefore we terminate.
+     *   See {@link #onGoAway(GoAwayFrame)}.
+     *
+     * @see #onGoAway(GoAwayFrame)
+     * @see #close(int, String, Callback)
+     * @see #onShutdown()
+     */
+    @Override
+    public void onIdleTimeout()
+    {
+        switch (closed.get())
+        {
+            case NOT_CLOSED:
+            {
+                // Real idle timeout, just close.
+                close(ErrorCode.NO_ERROR.code, "idle_timeout", Callback.NOOP);
+                break;
+            }
+            case LOCALLY_CLOSED:
+            case REMOTELY_CLOSED:
+            {
+                abort(new TimeoutException());
+                break;
+            }
+            default:
+            {
+                break;
+            }
+        }
+    }
+
+    @Override
+    public void onFrame(Frame frame)
+    {
+        onConnectionFailure(ErrorCode.PROTOCOL_ERROR.code, "upgrade");
+    }
+
+    public void disconnect()
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Disconnecting {}", this);
+        endPoint.close();
+    }
+
+    private void terminate()
+    {
+        while (true)
+        {
+            CloseState current = closed.get();
+            switch (current)
+            {
+                case NOT_CLOSED:
+                case LOCALLY_CLOSED:
+                case REMOTELY_CLOSED:
+                {
+                    if (closed.compareAndSet(current, CloseState.CLOSED))
+                    {
+                        flusher.close();
+                        for (IStream stream : streams.values())
+                            stream.close();
+                        streams.clear();
+                        disconnect();
+                        return;
+                    }
+                    break;
+                }
+                default:
+                {
+                    return;
+                }
+            }
+        }
+    }
+
+    protected void abort(Throwable failure)
+    {
+        terminate();
+        notifyFailure(this, failure);
+    }
+
+    public boolean isDisconnected()
+    {
+        return !endPoint.isOpen();
+    }
+
+    private void updateLastStreamId(int streamId)
+    {
+        Atomics.updateMax(lastStreamId, streamId);
+    }
+
+    protected Stream.Listener notifyNewStream(Stream stream, HeadersFrame frame)
+    {
+        try
+        {
+            return listener.onNewStream(stream, frame);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+            return null;
+        }
+    }
+
+    protected void notifySettings(Session session, SettingsFrame frame)
+    {
+        try
+        {
+            listener.onSettings(session, frame);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    protected void notifyPing(Session session, PingFrame frame)
+    {
+        try
+        {
+            listener.onPing(session, frame);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    protected void notifyReset(Session session, ResetFrame frame)
+    {
+        try
+        {
+            listener.onReset(session, frame);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    protected void notifyClose(Session session, GoAwayFrame frame)
+    {
+        try
+        {
+            listener.onClose(session, frame);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    protected void notifyFailure(Session session, Throwable failure)
+    {
+        try
+        {
+            listener.onFailure(session, failure);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("%s@%x{queueSize=%d,sendWindow=%s,recvWindow=%s,streams=%d,%s}", getClass().getSimpleName(),
+                hashCode(), flusher.getQueueSize(), sendWindow, recvWindow, streams.size(), closed);
+    }
+
+    private class ControlEntry extends HTTP2Flusher.Entry
+    {
+        private ControlEntry(Frame frame, IStream stream, Callback callback)
+        {
+            super(frame, stream, callback);
+        }
+
+        public Throwable generate(ByteBufferPool.Lease lease)
+        {
+            try
+            {
+                generator.control(lease, frame);
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Generated {}", frame);
+                prepare();
+                return null;
+            }
+            catch (Throwable x)
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Failure generating frame " + frame, x);
+                return x;
+            }
+        }
+
+        /**
+         * <p>Performs actions just before writing the frame to the network.</p>
+         * <p>Some frame, when sent over the network, causes the receiver
+         * to react and send back frames that may be processed by the original
+         * sender *before* {@link #succeeded()} is called.
+         * <p>If the action to perform updates some state, this update may
+         * not be seen by the received frames and cause errors.</p>
+         * <p>For example, suppose the action updates the stream window to a
+         * larger value; the sender sends the frame; the receiver is now entitled
+         * to send back larger data; when the data is received by the original
+         * sender, the action may have not been performed yet, causing the larger
+         * data to be rejected, when it should have been accepted.</p>
+         */
+        private void prepare()
+        {
+            switch (frame.getType())
+            {
+                case SETTINGS:
+                {
+                    SettingsFrame settingsFrame = (SettingsFrame)frame;
+                    Integer initialWindow = settingsFrame.getSettings().get(SettingsFrame.INITIAL_WINDOW_SIZE);
+                    if (initialWindow != null)
+                        flowControl.updateInitialStreamWindow(HTTP2Session.this, initialWindow, true);
+                    break;
+                }
+                default:
+                {
+                    break;
+                }
+            }
+        }
+
+        @Override
+        public void succeeded()
+        {
+            switch (frame.getType())
+            {
+                case HEADERS:
+                {
+                    HeadersFrame headersFrame = (HeadersFrame)frame;
+                    if (stream.updateClose(headersFrame.isEndStream(), true))
+                        removeStream(stream, true);
+                    break;
+                }
+                case RST_STREAM:
+                {
+                    if (stream != null)
+                    {
+                        stream.close();
+                        removeStream(stream, true);
+                    }
+                    break;
+                }
+                case PUSH_PROMISE:
+                {
+                    // Pushed streams are implicitly remotely closed.
+                    // They are closed when sending an end-stream DATA frame.
+                    stream.updateClose(true, false);
+                    break;
+                }
+                case GO_AWAY:
+                {
+                    // We just sent a GO_AWAY, only shutdown the
+                    // output without closing yet, to allow reads.
+                    getEndPoint().shutdownOutput();
+                    break;
+                }
+                case WINDOW_UPDATE:
+                {
+                    flowControl.windowUpdate(HTTP2Session.this, stream, (WindowUpdateFrame)frame);
+                    break;
+                }
+                case DISCONNECT:
+                {
+                    terminate();
+                    break;
+                }
+                default:
+                {
+                    break;
+                }
+            }
+            callback.succeeded();
+        }
+    }
+
+    private class DataEntry extends HTTP2Flusher.Entry
+    {
+        private int length;
+
+        private DataEntry(DataFrame frame, IStream stream, Callback callback)
+        {
+            super(frame, stream, callback);
+        }
+
+        @Override
+        public int dataRemaining()
+        {
+            // We don't do any padding, so the flow control length is
+            // always the data remaining. This simplifies the handling
+            // of data frames that cannot be completely written due to
+            // the flow control window exhausting, since in that case
+            // we would have to count the padding only once.
+            return ((DataFrame)frame).remaining();
+        }
+
+        public Throwable generate(ByteBufferPool.Lease lease)
+        {
+            try
+            {
+                int flowControlLength = dataRemaining();
+
+                int sessionSendWindow = getSendWindow();
+                if (sessionSendWindow < 0)
+                    throw new IllegalStateException();
+
+                int streamSendWindow = stream.updateSendWindow(0);
+                if (streamSendWindow < 0)
+                    throw new IllegalStateException();
+
+                int window = Math.min(streamSendWindow, sessionSendWindow);
+
+                int length = this.length = Math.min(flowControlLength, window);
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Generated {}, length/window={}/{}", frame, length, window);
+
+                generator.data(lease, (DataFrame)frame, length);
+                flowControl.onDataSending(stream, length);
+                return null;
+            }
+            catch (Throwable x)
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Failure generating frame " + frame, x);
+                return x;
+            }
+        }
+
+        @Override
+        public void succeeded()
+        {
+            flowControl.onDataSent(stream, length);
+            // Do we have more to send ?
+            DataFrame dataFrame = (DataFrame)frame;
+            if (dataFrame.remaining() > 0)
+            {
+                // We have written part of the frame, but there is more to write.
+                // We need to keep the correct ordering of frames, to avoid that other
+                // frames for the same stream are written before this one is finished.
+                flusher.prepend(this);
+            }
+            else
+            {
+                // Only now we can update the close state
+                // and eventually remove the stream.
+                if (stream.updateClose(dataFrame.isEndStream(), true))
+                    removeStream(stream, true);
+                callback.succeeded();
+            }
+        }
+    }
+
+    private static class PromiseCallback<C> implements Callback
+    {
+        private final Promise<C> promise;
+        private final C value;
+
+        private PromiseCallback(Promise<C> promise, C value)
+        {
+            this.promise = promise;
+            this.value = value;
+        }
+
+        @Override
+        public void succeeded()
+        {
+            promise.succeeded(value);
+        }
+
+        @Override
+        public void failed(Throwable x)
+        {
+            promise.failed(x);
+        }
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Stream.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Stream.java
new file mode 100644
index 0000000..a3ee68a
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Stream.java
@@ -0,0 +1,406 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2;
+
+import java.io.EOFException;
+import java.io.IOException;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PushPromiseFrame;
+import org.eclipse.jetty.http2.frames.ResetFrame;
+import org.eclipse.jetty.io.IdleTimeout;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.Promise;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.Scheduler;
+
+public class HTTP2Stream extends IdleTimeout implements IStream
+{
+    private static final Logger LOG = Log.getLogger(HTTP2Stream.class);
+
+    private final AtomicReference<ConcurrentMap<String, Object>> attributes = new AtomicReference<>();
+    private final AtomicReference<CloseState> closeState = new AtomicReference<>(CloseState.NOT_CLOSED);
+    private final AtomicInteger sendWindow = new AtomicInteger();
+    private final AtomicInteger recvWindow = new AtomicInteger();
+    private final ISession session;
+    private final int streamId;
+    private volatile Listener listener;
+    private volatile boolean localReset;
+    private volatile boolean remoteReset;
+
+    public HTTP2Stream(Scheduler scheduler, ISession session, int streamId)
+    {
+        super(scheduler);
+        this.session = session;
+        this.streamId = streamId;
+    }
+
+    @Override
+    public int getId()
+    {
+        return streamId;
+    }
+
+    @Override
+    public ISession getSession()
+    {
+        return session;
+    }
+
+    @Override
+    public void headers(HeadersFrame frame, Callback callback)
+    {
+        notIdle();
+        session.frames(this, callback, frame, Frame.EMPTY_ARRAY);
+    }
+
+    @Override
+    public void push(PushPromiseFrame frame, Promise<Stream> promise, Listener listener)
+    {
+        notIdle();
+        session.push(this, promise, frame, listener);
+    }
+
+    @Override
+    public void data(DataFrame frame, Callback callback)
+    {
+        notIdle();
+        session.data(this, callback, frame);
+    }
+
+    @Override
+    public void reset(ResetFrame frame, Callback callback)
+    {
+        if (isReset())
+            return;
+        notIdle();
+        localReset = true;
+        session.frames(this, callback, frame, Frame.EMPTY_ARRAY);
+    }
+
+    @Override
+    public Object getAttribute(String key)
+    {
+        return attributes().get(key);
+    }
+
+    @Override
+    public void setAttribute(String key, Object value)
+    {
+        attributes().put(key, value);
+    }
+
+    @Override
+    public Object removeAttribute(String key)
+    {
+        return attributes().remove(key);
+    }
+
+    @Override
+    public boolean isReset()
+    {
+        return localReset || remoteReset;
+    }
+
+    @Override
+    public boolean isClosed()
+    {
+        return closeState.get() == CloseState.CLOSED;
+    }
+
+    public boolean isRemotelyClosed()
+    {
+        return closeState.get() == CloseState.REMOTELY_CLOSED;
+    }
+
+    public boolean isLocallyClosed()
+    {
+        return closeState.get() == CloseState.LOCALLY_CLOSED;
+    }
+
+    @Override
+    public boolean isOpen()
+    {
+        return !isClosed();
+    }
+
+    @Override
+    protected void onIdleExpired(TimeoutException timeout)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Idle timeout {}ms expired on {}", getIdleTimeout(), this);
+
+        // The stream is now gone, we must close it to
+        // avoid that its idle timeout is rescheduled.
+        close();
+
+        // Tell the other peer that we timed out.
+        reset(new ResetFrame(getId(), ErrorCode.CANCEL_STREAM_ERROR.code), Callback.NOOP);
+
+        // Notify the application.
+        notifyTimeout(this, timeout);
+    }
+
+    private ConcurrentMap<String, Object> attributes()
+    {
+        ConcurrentMap<String, Object> map = attributes.get();
+        if (map == null)
+        {
+            map = new ConcurrentHashMap<>();
+            if (!attributes.compareAndSet(null, map))
+            {
+                map = attributes.get();
+            }
+        }
+        return map;
+    }
+
+    @Override
+    public Listener getListener()
+    {
+        return listener;
+    }
+
+    @Override
+    public void setListener(Listener listener)
+    {
+        this.listener = listener;
+    }
+
+    @Override
+    public void process(Frame frame, Callback callback)
+    {
+        notIdle();
+        switch (frame.getType())
+        {
+            case HEADERS:
+            {
+                onHeaders((HeadersFrame)frame, callback);
+                break;
+            }
+            case DATA:
+            {
+                onData((DataFrame)frame, callback);
+                break;
+            }
+            case RST_STREAM:
+            {
+                onReset((ResetFrame)frame, callback);
+                break;
+            }
+            case PUSH_PROMISE:
+            {
+                onPush((PushPromiseFrame)frame, callback);
+                break;
+            }
+            default:
+            {
+                throw new UnsupportedOperationException();
+            }
+        }
+    }
+
+    private void onHeaders(HeadersFrame frame, Callback callback)
+    {
+        if (updateClose(frame.isEndStream(), false))
+            session.removeStream(this, false);
+        callback.succeeded();
+    }
+
+    private void onData(DataFrame frame, Callback callback)
+    {
+        if (getRecvWindow() < 0)
+        {
+            // It's a bad client, it does not deserve to be
+            // treated gently by just resetting the stream.
+            session.close(ErrorCode.FLOW_CONTROL_ERROR.code, "stream_window_exceeded", Callback.NOOP);
+            callback.failed(new IOException("stream_window_exceeded"));
+            return;
+        }
+
+        // SPEC: remotely closed streams must be replied with a reset.
+        if (isRemotelyClosed())
+        {
+            reset(new ResetFrame(streamId, ErrorCode.STREAM_CLOSED_ERROR.code), Callback.NOOP);
+            callback.failed(new EOFException("stream_closed"));
+            return;
+        }
+
+        if (isReset())
+        {
+            // Just drop the frame.
+            callback.failed(new IOException("stream_reset"));
+            return;
+        }
+
+        if (updateClose(frame.isEndStream(), false))
+            session.removeStream(this, false);
+        notifyData(this, frame, callback);
+    }
+
+    private void onReset(ResetFrame frame, Callback callback)
+    {
+        remoteReset = true;
+        close();
+        session.removeStream(this, false);
+        callback.succeeded();
+        notifyReset(this, frame);
+    }
+
+    private void onPush(PushPromiseFrame frame, Callback callback)
+    {
+        // Pushed streams are implicitly locally closed.
+        // They are closed when receiving an end-stream DATA frame.
+        updateClose(true, true);
+        callback.succeeded();
+    }
+
+    @Override
+    public boolean updateClose(boolean update, boolean local)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Update close for {} close={} local={}", this, update, local);
+
+        if (!update)
+            return false;
+
+        while (true)
+        {
+            CloseState current = closeState.get();
+            switch (current)
+            {
+                case NOT_CLOSED:
+                {
+                    CloseState newValue = local ? CloseState.LOCALLY_CLOSED : CloseState.REMOTELY_CLOSED;
+                    if (closeState.compareAndSet(current, newValue))
+                        return false;
+                    break;
+                }
+                case LOCALLY_CLOSED:
+                {
+                    if (local)
+                        return false;
+                    close();
+                    return true;
+                }
+                case REMOTELY_CLOSED:
+                {
+                    if (!local)
+                        return false;
+                    close();
+                    return true;
+                }
+                default:
+                {
+                    return false;
+                }
+            }
+        }
+    }
+
+    public int getSendWindow()
+    {
+        return sendWindow.get();
+    }
+
+    public int getRecvWindow()
+    {
+        return recvWindow.get();
+    }
+
+    @Override
+    public int updateSendWindow(int delta)
+    {
+        return sendWindow.getAndAdd(delta);
+    }
+
+    @Override
+    public int updateRecvWindow(int delta)
+    {
+        return recvWindow.getAndAdd(delta);
+    }
+
+    @Override
+    public void close()
+    {
+        closeState.set(CloseState.CLOSED);
+        onClose();
+    }
+
+    private void notifyData(Stream stream, DataFrame frame, Callback callback)
+    {
+        final Listener listener = this.listener;
+        if (listener == null)
+            return;
+        try
+        {
+            listener.onData(stream, frame, callback);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    private void notifyReset(Stream stream, ResetFrame frame)
+    {
+        final Listener listener = this.listener;
+        if (listener == null)
+            return;
+        try
+        {
+            listener.onReset(stream, frame);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    private void notifyTimeout(Stream stream, Throwable failure)
+    {
+        Listener listener = this.listener;
+        if (listener == null)
+            return;
+        try
+        {
+            listener.onTimeout(stream, failure);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("%s@%x#%d{sendWindow=%s,recvWindow=%s,reset=%b,%s}", getClass().getSimpleName(),
+                hashCode(), getId(), sendWindow, recvWindow, isReset(), closeState);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/ISession.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/ISession.java
new file mode 100644
index 0000000..428a0fc
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/ISession.java
@@ -0,0 +1,131 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2;
+
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.PushPromiseFrame;
+import org.eclipse.jetty.http2.frames.WindowUpdateFrame;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.Promise;
+
+/**
+ * <p>The SPI interface for implementing a HTTP/2 session.</p>
+ * <p>This class extends {@link Session} by adding the methods required to
+ * implement the HTTP/2 session functionalities.</p>
+ */
+public interface ISession extends Session
+{
+    @Override
+    public IStream getStream(int streamId);
+
+    /**
+     * <p>Removes the given {@code stream}.</p>
+     *
+     * @param stream the stream to remove
+     * @param local  whether the stream is local or remote
+     */
+    public void removeStream(IStream stream, boolean local);
+
+    /**
+     * <p>Enqueues the given frames to be written to the connection.</p>
+     *
+     * @param stream   the stream the frames belong to
+     * @param callback the callback that gets notified when the frames have been sent
+     * @param frame    the first frame to enqueue
+     * @param frames   additional frames to enqueue
+     */
+    public void frames(IStream stream, Callback callback, Frame frame, Frame... frames);
+
+    /**
+     * <p>Enqueues the given PUSH_PROMISE frame to be written to the connection.</p>
+     * <p>Differently from {@link #frames(IStream, Callback, Frame, Frame...)}, this method
+     * generates atomically the stream id for the pushed stream.</p>
+     *
+     * @param stream   the stream associated to the pushed stream
+     * @param promise  the promise that gets notified of the pushed stream creation
+     * @param frame    the PUSH_PROMISE frame to enqueue
+     * @param listener the listener that gets notified of pushed stream events
+     */
+    public void push(IStream stream, Promise<Stream> promise, PushPromiseFrame frame, Stream.Listener listener);
+
+    /**
+     * <p>Enqueues the given DATA frame to be written to the connection.</p>
+     *
+     * @param stream   the stream the data frame belongs to
+     * @param callback the callback that gets notified when the frame has been sent
+     * @param frame    the DATA frame to send
+     */
+    public void data(IStream stream, Callback callback, DataFrame frame);
+
+    /**
+     * <p>Updates the session send window by the given {@code delta}.</p>
+     *
+     * @param delta the delta value (positive or negative) to add to the session send window
+     * @return the previous value of the session send window
+     */
+    public int updateSendWindow(int delta);
+
+    /**
+     * <p>Updates the session receive window by the given {@code delta}.</p>
+     *
+     * @param delta the delta value (positive or negative) to add to the session receive window
+     * @return the previous value of the session receive window
+     */
+    public int updateRecvWindow(int delta);
+
+    /**
+     * <p>Callback method invoked when a WINDOW_UPDATE frame has been received.</p>
+     *
+     * @param stream the stream the window update belongs to, or null if the window update belongs to the session
+     * @param frame  the WINDOW_UPDATE frame received
+     */
+    public void onWindowUpdate(IStream stream, WindowUpdateFrame frame);
+
+    /**
+     * @return whether the push functionality is enabled
+     */
+    public boolean isPushEnabled();
+
+    /**
+     * <p>Callback invoked when the connection reads -1.</p>
+     *
+     * @see #onIdleTimeout()
+     * @see #close(int, String, Callback)
+     */
+    public void onShutdown();
+
+    /**
+     * <p>Callback invoked when the idle timeout expires.</p>
+     *
+     * @see #onShutdown()
+     * @see #close(int, String, Callback)
+     */
+    public void onIdleTimeout();
+
+    /**
+     * <p>Callback method invoked during an HTTP/1.1 to HTTP/2 upgrade requests
+     * to process the given synthetic frame.</p>
+     *
+     * @param frame the synthetic frame to process
+     */
+    public void onFrame(Frame frame);
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/IStream.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/IStream.java
new file mode 100644
index 0000000..e041f54
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/IStream.java
@@ -0,0 +1,97 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2;
+
+import java.io.Closeable;
+
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.util.Callback;
+
+/**
+ * <p>The SPI interface for implementing a HTTP/2 stream.</p>
+ * <p>This class extends {@link Stream} by adding the methods required to
+ * implement the HTTP/2 stream functionalities.</p>
+ */
+public interface IStream extends Stream, Closeable
+{
+    /**
+     * <p>The constant used as attribute key to store/retrieve the HTTP
+     * channel associated with this stream</p>
+     *
+     * @see #setAttribute(String, Object)
+     */
+    public static final String CHANNEL_ATTRIBUTE = IStream.class.getName() + ".channel";
+
+    @Override
+    public ISession getSession();
+
+    /**
+     * @return the {@link org.eclipse.jetty.http2.api.Stream.Listener} associated with this stream
+     * @see #setListener(Listener)
+     */
+    public Listener getListener();
+
+    /**
+     * @param listener the {@link org.eclipse.jetty.http2.api.Stream.Listener} associated with this stream
+     * @see #getListener()
+     */
+    public void setListener(Listener listener);
+
+    /**
+     * <p>Processes the given {@code frame}, belonging to this stream.</p>
+     *
+     * @param frame the frame to process
+     * @param callback the callback to complete when frame has been processed
+     */
+    public void process(Frame frame, Callback callback);
+
+    /**
+     * <p>Updates the close state of this stream.</p>
+     *
+     * @param update whether to update the close state
+     * @param local  whether the update comes from a local operation
+     *               (such as sending a frame that ends the stream)
+     *               or a remote operation (such as receiving a frame
+     * @return whether the stream has been fully closed by this invocation
+     */
+    public boolean updateClose(boolean update, boolean local);
+
+    /**
+     * <p>Forcibly closes this stream.</p>
+     */
+    @Override
+    public void close();
+
+    /**
+     * <p>Updates the stream send window by the given {@code delta}.</p>
+     *
+     * @param delta the delta value (positive or negative) to add to the stream send window
+     * @return the previous value of the stream send window
+     */
+    public int updateSendWindow(int delta);
+
+    /**
+     * <p>Updates the stream receive window by the given {@code delta}.</p>
+     *
+     * @param delta the delta value (positive or negative) to add to the stream receive window
+     * @return the previous value of the stream receive window
+     */
+    public int updateRecvWindow(int delta);
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/SimpleFlowControlStrategy.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/SimpleFlowControlStrategy.java
new file mode 100644
index 0000000..b86f200
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/SimpleFlowControlStrategy.java
@@ -0,0 +1,72 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2;
+
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.WindowUpdateFrame;
+import org.eclipse.jetty.util.Callback;
+
+public class SimpleFlowControlStrategy extends AbstractFlowControlStrategy
+{
+    public SimpleFlowControlStrategy()
+    {
+        this(DEFAULT_WINDOW_SIZE);
+    }
+
+    public SimpleFlowControlStrategy(int initialStreamSendWindow)
+    {
+        super(initialStreamSendWindow);
+    }
+
+    @Override
+    public void onDataConsumed(ISession session, IStream stream, int length)
+    {
+        if (length <= 0)
+            return;
+
+        // This is the simple algorithm for flow control.
+        // This method is called when a whole flow controlled frame has been consumed.
+        // We send a WindowUpdate every time, even if the frame was very small.
+
+        WindowUpdateFrame sessionFrame = new WindowUpdateFrame(0, length);
+        session.updateRecvWindow(length);
+        if (LOG.isDebugEnabled())
+            LOG.debug("Data consumed, increased session recv window by {} for {}", length, session);
+
+        Frame[] streamFrame = Frame.EMPTY_ARRAY;
+        if (stream != null)
+        {
+            if (stream.isClosed())
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Data consumed, ignoring update stream recv window by {} for closed {}", length, stream);
+            }
+            else
+            {
+                streamFrame = new Frame[1];
+                streamFrame[0] = new WindowUpdateFrame(stream.getId(), length);
+                stream.updateRecvWindow(length);
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Data consumed, increased stream recv window by {} for {}", length, stream);
+            }
+        }
+
+        session.frames(stream, Callback.NOOP, sessionFrame, streamFrame);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/api/Session.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/api/Session.java
new file mode 100644
index 0000000..883ed32
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/api/Session.java
@@ -0,0 +1,247 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.api;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.GoAwayFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PingFrame;
+import org.eclipse.jetty.http2.frames.PriorityFrame;
+import org.eclipse.jetty.http2.frames.ResetFrame;
+import org.eclipse.jetty.http2.frames.SettingsFrame;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.Promise;
+
+/**
+ * <p>A {@link Session} represents the client-side endpoint of a HTTP/2 connection to a single origin server.</p>
+ * <p>Once a {@link Session} has been obtained, it can be used to open HTTP/2 streams:</p>
+ * <pre>
+ * Session session = ...;
+ * HeadersFrame frame = ...;
+ * Promise&lt;Stream&gt; promise = ...
+ * session.newStream(frame, promise, new Stream.Listener.Adapter()
+ * {
+ *     public void onHeaders(Stream stream, HeadersFrame frame)
+ *     {
+ *         // Reply received
+ *     }
+ * });
+ * </pre>
+ * <p>A {@link Session} is the active part of the endpoint, and by calling its API applications can generate
+ * events on the connection; conversely {@link Session.Listener} is the passive part of the endpoint, and
+ * has callbacks that are invoked when events happen on the connection.</p>
+ *
+ * @see Session.Listener
+ */
+public interface Session
+{
+    /**
+     * <p>Sends the given HEADERS {@code frame} to create a new {@link Stream}.</p>
+     *
+     * @param frame    the HEADERS frame containing the HTTP headers
+     * @param promise  the promise that gets notified of the stream creation
+     * @param listener the listener that gets notified of stream events
+     */
+    public void newStream(HeadersFrame frame, Promise<Stream> promise, Stream.Listener listener);
+
+    /**
+     * <p>Sends the given PRIORITY {@code frame}.</p>
+     * <p>If the {@code frame} references a {@code streamId} that does not exist
+     * (for example {@code 0}), then a new {@code streamId} will be allocated, to
+     * support <em>unused anchor streams</em> that act as parent for other streams.</p>
+     *
+     * @param frame    the PRIORITY frame to send
+     * @param callback the callback that gets notified when the frame has been sent
+     * @return         the new stream id generated by the PRIORITY frame, or the stream id
+     *                 that it is already referencing
+     */
+    public int priority(PriorityFrame frame, Callback callback);
+
+    /**
+     * <p>Sends the given SETTINGS {@code frame} to configure the session.</p>
+     *
+     * @param frame    the SETTINGS frame to send
+     * @param callback the callback that gets notified when the frame has been sent
+     */
+    public void settings(SettingsFrame frame, Callback callback);
+
+    /**
+     * <p>Sends the given PING {@code frame}.</p>
+     * <p>PING frames may be used to test the connection integrity and to measure
+     * round-trip time.</p>
+     *
+     * @param frame    the PING frame to send
+     * @param callback the callback that gets notified when the frame has been sent
+     */
+    public void ping(PingFrame frame, Callback callback);
+
+    /**
+     * <p>Closes the session by sending a GOAWAY frame with the given error code
+     * and payload.</p>
+     * <p>The GOAWAY frame is sent only once; subsequent or concurrent attempts to
+     * close the session will have no effect.</p>
+     *
+     * @param error    the error code
+     * @param payload  an optional payload (may be null)
+     * @param callback the callback that gets notified when the frame has been sent
+     * @return true if the frame is being sent, false if the session was already closed
+     */
+    public boolean close(int error, String payload, Callback callback);
+
+    /**
+     * @return whether the session is not open
+     */
+    public boolean isClosed();
+
+    /**
+     * @return a snapshot of all the streams currently belonging to this session
+     */
+    public Collection<Stream> getStreams();
+
+    /**
+     * <p>Retrieves the stream with the given {@code streamId}.</p>
+     *
+     * @param streamId the stream id of the stream looked for
+     * @return the stream with the given id, or null if no such stream exist
+     */
+    public Stream getStream(int streamId);
+
+    /**
+     * <p>A {@link Listener} is the passive counterpart of a {@link Session} and
+     * receives events happening on a HTTP/2 connection.</p>
+     *
+     * @see Session
+     */
+    public interface Listener
+    {
+        /**
+         * <p>Callback method invoked when the preface has been received.</p>
+         *
+         * @param session the session
+         * @return a (possibly empty or null) map containing SETTINGS configuration
+         * options that are sent after the preface.
+         */
+        public Map<Integer, Integer> onPreface(Session session);
+
+        /**
+         * <p>Callback method invoked when a new stream is being created upon
+         * receiving a HEADERS frame representing a HTTP request.</p>
+         * <p>Applications should implement this method to process HTTP requests,
+         * typically providing a HTTP response via
+         * {@link Stream#headers(HeadersFrame, Callback)}.</p>
+         * <p>Applications can detect whether request DATA frames will be arriving
+         * by testing {@link HeadersFrame#isEndStream()}. If the application is
+         * interested in processing the DATA frames, it must return a
+         * {@link Stream.Listener} implementation that overrides
+         * {@link Stream.Listener#onData(Stream, DataFrame, Callback)}.</p>
+         *
+         * @param stream the newly created stream
+         * @param frame  the HEADERS frame received
+         * @return a {@link Stream.Listener} that will be notified of stream events
+         */
+        public Stream.Listener onNewStream(Stream stream, HeadersFrame frame);
+
+        /**
+         * <p>Callback method invoked when a SETTINGS frame has been received.</p>
+         *
+         * @param session the session
+         * @param frame   the SETTINGS frame received
+         */
+        public void onSettings(Session session, SettingsFrame frame);
+
+        /**
+         * <p>Callback method invoked when a PING frame has been received.</p>
+         *
+         * @param session the session
+         * @param frame   the PING frame received
+         */
+        public void onPing(Session session, PingFrame frame);
+
+        /**
+         * <p>Callback method invoked when a RST_STREAM frame has been received for an unknown stream.</p>
+         *
+         * @param session the session
+         * @param frame   the RST_STREAM frame received
+         * @see Stream.Listener#onReset(Stream, ResetFrame)
+         */
+        public void onReset(Session session, ResetFrame frame);
+
+        /**
+         * <p>Callback method invoked when a GOAWAY frame has been received.</p>
+         *
+         * @param session the session
+         * @param frame   the GOAWAY frame received
+         */
+        public void onClose(Session session, GoAwayFrame frame);
+
+        /**
+         * <p>Callback method invoked when a failure has been detected for this session.</p>
+         *
+         * @param session the session
+         * @param failure the failure
+         */
+        public void onFailure(Session session, Throwable failure);
+
+        /**
+         * <p>Empty implementation of {@link Stream.Listener}.</p>
+         */
+        public static class Adapter implements Session.Listener
+        {
+            @Override
+            public Map<Integer, Integer> onPreface(Session session)
+            {
+                return null;
+            }
+
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                return null;
+            }
+
+            @Override
+            public void onSettings(Session session, SettingsFrame frame)
+            {
+            }
+
+            @Override
+            public void onPing(Session session, PingFrame frame)
+            {
+            }
+
+            @Override
+            public void onReset(Session session, ResetFrame frame)
+            {
+            }
+
+            @Override
+            public void onClose(Session session, GoAwayFrame frame)
+            {
+            }
+
+            @Override
+            public void onFailure(Session session, Throwable failure)
+            {
+            }
+        }
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/api/Stream.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/api/Stream.java
new file mode 100644
index 0000000..ef8d82e
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/api/Stream.java
@@ -0,0 +1,217 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.api;
+
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PushPromiseFrame;
+import org.eclipse.jetty.http2.frames.ResetFrame;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.Promise;
+
+/**
+ * <p>A {@link Stream} represents a bidirectional exchange of data on top of a {@link Session}.</p>
+ * <p>Differently from socket streams, where the input and output streams are permanently associated
+ * with the socket (and hence with the connection that the socket represents), there can be multiple
+ * HTTP/2 streams present concurrent for a HTTP/2 session.</p>
+ * <p>A {@link Stream} maps to a HTTP request/response cycle, and after the request/response cycle is
+ * completed, the stream is closed and removed from the session.</p>
+ * <p>Like {@link Session}, {@link Stream} is the active part and by calling its API applications
+ * can generate events on the stream; conversely, {@link Stream.Listener} is the passive part, and
+ * its callbacks are invoked when events happen on the stream.</p>
+ *
+ * @see Stream.Listener
+ */
+public interface Stream
+{
+    /**
+     * @return the stream unique id
+     */
+    public int getId();
+
+    /**
+     * @return the session this stream is associated to
+     */
+    public Session getSession();
+
+    /**
+     * <p>Sends the given HEADERS {@code frame} representing a HTTP response.</p>
+     *
+     * @param frame    the HEADERS frame to send
+     * @param callback the callback that gets notified when the frame has been sent
+     */
+    public void headers(HeadersFrame frame, Callback callback);
+
+    /**
+     * <p>Sends the given PUSH_PROMISE {@code frame}.</p>
+     *
+     * @param frame   the PUSH_PROMISE frame to send
+     * @param promise the promise that gets notified of the pushed stream creation
+     * @param listener the listener that gets notified of stream events
+     */
+    public void push(PushPromiseFrame frame, Promise<Stream> promise, Listener listener);
+
+    /**
+     * <p>Sends the given DATA {@code frame}.</p>
+     *
+     * @param frame    the DATA frame to send
+     * @param callback the callback that gets notified when the frame has been sent
+     */
+    public void data(DataFrame frame, Callback callback);
+
+    /**
+     * <p>Sends the given RST_STREAM {@code frame}.</p>
+     *
+     * @param frame    the RST_FRAME to send
+     * @param callback the callback that gets notified when the frame has been sent
+     */
+    public void reset(ResetFrame frame, Callback callback);
+
+    /**
+     * @param key the attribute key
+     * @return an arbitrary object associated with the given key to this stream
+     * or null if no object can be found for the given key.
+     * @see #setAttribute(String, Object)
+     */
+    public Object getAttribute(String key);
+
+    /**
+     * @param key   the attribute key
+     * @param value an arbitrary object to associate with the given key to this stream
+     * @see #getAttribute(String)
+     * @see #removeAttribute(String)
+     */
+    public void setAttribute(String key, Object value);
+
+    /**
+     * @param key the attribute key
+     * @return the arbitrary object associated with the given key to this stream
+     * @see #setAttribute(String, Object)
+     */
+    public Object removeAttribute(String key);
+
+    /**
+     * @return whether this stream has been reset
+     */
+    public boolean isReset();
+
+    /**
+     * @return whether this stream is closed, both locally and remotely.
+     */
+    public boolean isClosed();
+
+    /**
+     * @return the stream idle timeout
+     * @see #setIdleTimeout(long)
+     */
+    public long getIdleTimeout();
+
+    /**
+     * @param idleTimeout the stream idle timeout
+     * @see #getIdleTimeout()
+     * @see Stream.Listener#onTimeout(Stream, Throwable)
+     */
+    public void setIdleTimeout(long idleTimeout);
+
+    /**
+     * <p>A {@link Stream.Listener} is the passive counterpart of a {@link Stream} and receives
+     * events happening on a HTTP/2 stream.</p>
+     *
+     * @see Stream
+     */
+    public interface Listener
+    {
+        /**
+         * <p>Callback method invoked when a HEADERS frame representing the HTTP response has been received.</p>
+         *
+         * @param stream the stream
+         * @param frame  the HEADERS frame received
+         */
+        public void onHeaders(Stream stream, HeadersFrame frame);
+
+        /**
+         * <p>Callback method invoked when a PUSH_PROMISE frame has been received.</p>
+         *
+         * @param stream the stream
+         * @param frame  the PUSH_PROMISE frame received
+         * @return a {@link Stream.Listener} that will be notified of pushed stream events
+         */
+        public Listener onPush(Stream stream, PushPromiseFrame frame);
+
+        /**
+         * <p>Callback method invoked when a DATA frame has been received.</p>
+         *
+         * @param stream   the stream
+         * @param frame    the DATA frame received
+         * @param callback the callback to complete when the bytes of the DATA frame have been consumed
+         */
+        public void onData(Stream stream, DataFrame frame, Callback callback);
+
+        /**
+         * <p>Callback method invoked when a RST_STREAM frame has been received for this stream.</p>
+         *
+         * @param stream the stream
+         * @param frame  the RST_FRAME received
+         * @see Session.Listener#onReset(Session, ResetFrame)
+         */
+        public void onReset(Stream stream, ResetFrame frame);
+
+        /**
+         * <p>Callback method invoked when the stream exceeds its idle timeout.</p>
+         *
+         * @param stream the stream
+         * @param x      the timeout failure
+         * @see #getIdleTimeout()
+         */
+        public void onTimeout(Stream stream, Throwable x);
+
+        /**
+         * <p>Empty implementation of {@link Listener}</p>
+         */
+        public static class Adapter implements Listener
+        {
+            @Override
+            public void onHeaders(Stream stream, HeadersFrame frame)
+            {
+            }
+
+            @Override
+            public Listener onPush(Stream stream, PushPromiseFrame frame)
+            {
+                return null;
+            }
+
+            @Override
+            public void onData(Stream stream, DataFrame frame, Callback callback)
+            {
+                callback.succeeded();
+            }
+
+            @Override
+            public void onReset(Stream stream, ResetFrame frame)
+            {
+            }
+
+            @Override
+            public void onTimeout(Stream stream, Throwable x)
+            {
+            }
+        }
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/api/server/ServerSessionListener.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/api/server/ServerSessionListener.java
new file mode 100644
index 0000000..b563cc4
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/api/server/ServerSessionListener.java
@@ -0,0 +1,44 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.api.server;
+
+import org.eclipse.jetty.http2.api.Session;
+
+/**
+ * <p>Server-side extension of {@link org.eclipse.jetty.http2.api.Session.Listener} that exposes additional events.</p>
+ */
+public interface ServerSessionListener extends Session.Listener
+{
+    /**
+     * <p>Callback method invoked when a connection has been accepted by the server.</p>
+     * @param session the session
+     */
+    public void onAccept(Session session);
+
+    /**
+     * <p>Empty implementation of {@link ServerSessionListener}</p>
+     */
+    public static class Adapter extends Session.Listener.Adapter implements ServerSessionListener
+    {
+        @Override
+        public void onAccept(Session session)
+        {
+        }
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/DataFrame.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/DataFrame.java
new file mode 100644
index 0000000..f4429a0
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/DataFrame.java
@@ -0,0 +1,80 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+import java.nio.ByteBuffer;
+
+public class DataFrame extends Frame
+{
+    private final int streamId;
+    private final ByteBuffer data;
+    private final boolean endStream;
+    private final int padding;
+
+    public DataFrame(int streamId, ByteBuffer data, boolean endStream)
+    {
+        this(streamId, data, endStream, 0);
+    }
+
+    public DataFrame(int streamId, ByteBuffer data, boolean endStream, int padding)
+    {
+        super(FrameType.DATA);
+        this.streamId = streamId;
+        this.data = data;
+        this.endStream = endStream;
+        this.padding = padding;
+    }
+
+    public int getStreamId()
+    {
+        return streamId;
+    }
+
+    public ByteBuffer getData()
+    {
+        return data;
+    }
+
+    public boolean isEndStream()
+    {
+        return endStream;
+    }
+
+    /**
+     * @return the number of data bytes remaining.
+     */
+    public int remaining()
+    {
+        return data.remaining();
+    }
+
+    /**
+     * @return the number of bytes used for padding that count towards flow control.
+     */
+    public int padding()
+    {
+        return padding;
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("%s#%d{length:%d,end=%b}", super.toString(), streamId, data.remaining(), endStream);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/DisconnectFrame.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/DisconnectFrame.java
new file mode 100644
index 0000000..f8133aa
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/DisconnectFrame.java
@@ -0,0 +1,27 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+public class DisconnectFrame extends Frame
+{
+    public DisconnectFrame()
+    {
+        super(FrameType.DISCONNECT);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/Frame.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/Frame.java
new file mode 100644
index 0000000..35a96d6
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/Frame.java
@@ -0,0 +1,45 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+public abstract class Frame
+{
+    public static final int HEADER_LENGTH = 9;
+    public static final int DEFAULT_MAX_LENGTH = 0x40_00;
+    public static final int MAX_MAX_LENGTH = 0xFF_FF_FF;
+    public static final Frame[] EMPTY_ARRAY = new Frame[0];
+
+    private final FrameType type;
+
+    protected Frame(FrameType type)
+    {
+        this.type = type;
+    }
+
+    public FrameType getType()
+    {
+        return type;
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("%s@%x", getClass().getSimpleName(), hashCode());
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/FrameType.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/FrameType.java
new file mode 100644
index 0000000..da633a3
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/FrameType.java
@@ -0,0 +1,62 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public enum FrameType
+{
+    DATA(0),
+    HEADERS(1),
+    PRIORITY(2),
+    RST_STREAM(3),
+    SETTINGS(4),
+    PUSH_PROMISE(5),
+    PING(6),
+    GO_AWAY(7),
+    WINDOW_UPDATE(8),
+    CONTINUATION(9),
+    // Synthetic frames only needed by the implementation.
+    PREFACE(10),
+    DISCONNECT(11);
+
+    public static FrameType from(int type)
+    {
+        return Types.types.get(type);
+    }
+
+    private final int type;
+
+    private FrameType(int type)
+    {
+        this.type = type;
+        Types.types.put(type, this);
+    }
+
+    public int getType()
+    {
+        return type;
+    }
+
+    private static class Types
+    {
+        private static final Map<Integer, FrameType> types = new HashMap<>();
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/GoAwayFrame.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/GoAwayFrame.java
new file mode 100644
index 0000000..9225687
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/GoAwayFrame.java
@@ -0,0 +1,74 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.util.BufferUtil;
+
+public class GoAwayFrame extends Frame
+{
+    private final int lastStreamId;
+    private final int error;
+    private final byte[] payload;
+
+    public GoAwayFrame(int lastStreamId, int error, byte[] payload)
+    {
+        super(FrameType.GO_AWAY);
+        this.lastStreamId = lastStreamId;
+        this.error = error;
+        this.payload = payload;
+    }
+
+    public int getLastStreamId()
+    {
+        return lastStreamId;
+    }
+
+    public int getError()
+    {
+        return error;
+    }
+
+    public byte[] getPayload()
+    {
+        return payload;
+    }
+
+    public String tryConvertPayload()
+    {
+        if (payload == null)
+            return "";
+        ByteBuffer buffer = BufferUtil.toBuffer(payload);
+        try
+        {
+            return BufferUtil.toUTF8String(buffer);
+        }
+        catch (Throwable x)
+        {
+            return BufferUtil.toDetailString(buffer);
+        }
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("%s,%d/%s", super.toString(), error, tryConvertPayload());
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/HeadersFrame.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/HeadersFrame.java
new file mode 100644
index 0000000..71ebd4f
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/HeadersFrame.java
@@ -0,0 +1,88 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+import org.eclipse.jetty.http.MetaData;
+
+public class HeadersFrame extends Frame
+{
+    private final int streamId;
+    private final MetaData metaData;
+    private final PriorityFrame priority;
+    private final boolean endStream;
+
+    /**
+     * <p>Creates a new {@code HEADERS} frame with an unspecified stream {@code id}.</p>
+     * <p>The stream {@code id} will be generated by the implementation while sending
+     * this frame to the other peer.</p>
+     *
+     * @param metaData  the metadata containing HTTP request information
+     * @param priority  the PRIORITY frame associated with this HEADERS frame
+     * @param endStream whether this frame ends the stream
+     */
+    public HeadersFrame(MetaData metaData, PriorityFrame priority, boolean endStream)
+    {
+        this(0, metaData, priority, endStream);
+    }
+
+    /**
+     * <p>Creates a new {@code HEADERS} frame with the specified stream {@code id}.</p>
+     * <p>{@code HEADERS} frames with a specific stream {@code id} are typically used
+     * in responses to request {@code HEADERS} frames.</p>
+     *
+     * @param streamId  the stream id
+     * @param metaData  the metadata containing HTTP request/response information
+     * @param priority  the PRIORITY frame associated with this HEADERS frame
+     * @param endStream whether this frame ends the stream
+     */
+    public HeadersFrame(int streamId, MetaData metaData, PriorityFrame priority, boolean endStream)
+    {
+        super(FrameType.HEADERS);
+        this.streamId = streamId;
+        this.metaData = metaData;
+        this.priority = priority;
+        this.endStream = endStream;
+    }
+
+    public int getStreamId()
+    {
+        return streamId;
+    }
+
+    public MetaData getMetaData()
+    {
+        return metaData;
+    }
+
+    public PriorityFrame getPriority()
+    {
+        return priority;
+    }
+
+    public boolean isEndStream()
+    {
+        return endStream;
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("%s#%d{end=%b}", super.toString(), streamId, endStream);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/PingFrame.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/PingFrame.java
new file mode 100644
index 0000000..b407e59
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/PingFrame.java
@@ -0,0 +1,103 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+import java.util.Objects;
+
+public class PingFrame extends Frame
+{
+    public static final int PING_LENGTH = 8;
+    private static final byte[] EMPTY_PAYLOAD = new byte[8];
+
+    private final byte[] payload;
+    private final boolean reply;
+
+    /**
+     * Creates a PING frame with an empty payload.
+     *
+     * @param reply whether this PING frame is a reply
+     */
+    public PingFrame(boolean reply)
+    {
+        this(EMPTY_PAYLOAD, reply);
+    }
+
+    /**
+     * Creates a PING frame with the given {@code long} {@code value} as payload.
+     *
+     * @param value the value to use as a payload for this PING frame
+     * @param reply whether this PING frame is a reply
+     */
+    public PingFrame(long value, boolean reply)
+    {
+        this(toBytes(value), reply);
+    }
+
+    /**
+     * Creates a PING frame with the given {@code payload}.
+     *
+     * @param payload the payload for this PING frame
+     * @param reply whether this PING frame is a reply
+     */
+    public PingFrame(byte[] payload, boolean reply)
+    {
+        super(FrameType.PING);
+        this.payload = Objects.requireNonNull(payload);
+        if (payload.length != PING_LENGTH)
+            throw new IllegalArgumentException("PING payload must be 8 bytes");
+        this.reply = reply;
+    }
+
+    public byte[] getPayload()
+    {
+        return payload;
+    }
+
+    public long getPayloadAsLong()
+    {
+        return toLong(payload);
+    }
+
+    public boolean isReply()
+    {
+        return reply;
+    }
+
+    private static byte[] toBytes(long value)
+    {
+        byte[] result = new byte[8];
+        for (int i = result.length - 1; i >= 0; --i)
+        {
+            result[i] = (byte)(value & 0xFF);
+            value >>= 8;
+        }
+        return result;
+    }
+
+    private static long toLong(byte[] payload)
+    {
+        long result = 0;
+        for (int i = 0; i < 8; ++i)
+        {
+            result <<= 8;
+            result |= (payload[i] & 0xFF);
+        }
+        return result;
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/PrefaceFrame.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/PrefaceFrame.java
new file mode 100644
index 0000000..2589f3d
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/PrefaceFrame.java
@@ -0,0 +1,48 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+import java.nio.charset.StandardCharsets;
+
+public class PrefaceFrame extends Frame
+{
+    /**
+     * The bytes of the HTTP/2 preface that form a legal HTTP/1.1
+     * request, used in the direct upgrade.
+     */
+    public static final byte[] PREFACE_PREAMBLE_BYTES = (
+            "PRI * HTTP/2.0\r\n" +
+            "\r\n"
+    ).getBytes(StandardCharsets.US_ASCII);
+
+    /**
+     * The HTTP/2 preface bytes.
+     */
+    public static final byte[] PREFACE_BYTES = (
+            "PRI * HTTP/2.0\r\n" +
+            "\r\n" +
+            "SM\r\n" +
+            "\r\n"
+    ).getBytes(StandardCharsets.US_ASCII);
+
+    public PrefaceFrame()
+    {
+        super(FrameType.PREFACE);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/PriorityFrame.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/PriorityFrame.java
new file mode 100644
index 0000000..51f4b12
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/PriorityFrame.java
@@ -0,0 +1,78 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+public class PriorityFrame extends Frame
+{
+    public static final int PRIORITY_LENGTH = 5;
+
+    private final int streamId;
+    private final int parentStreamId;
+    private final int weight;
+    private final boolean exclusive;
+
+    public PriorityFrame(int parentStreamId, int weight, boolean exclusive)
+    {
+        this(0, parentStreamId, weight, exclusive);
+    }
+
+    public PriorityFrame(int streamId, int parentStreamId, int weight, boolean exclusive)
+    {
+        super(FrameType.PRIORITY);
+        this.streamId = streamId;
+        this.parentStreamId = parentStreamId;
+        this.weight = weight;
+        this.exclusive = exclusive;
+    }
+
+    public int getStreamId()
+    {
+        return streamId;
+    }
+
+    /**
+     * @deprecated use {@link #getParentStreamId()} instead.
+     */
+    @Deprecated
+    public int getDependentStreamId()
+    {
+        return getParentStreamId();
+    }
+
+    public int getParentStreamId()
+    {
+        return parentStreamId;
+    }
+
+    public int getWeight()
+    {
+        return weight;
+    }
+
+    public boolean isExclusive()
+    {
+        return exclusive;
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("%s#%d/#%d{weight=%d,exclusive=%b}", super.toString(), streamId, parentStreamId, weight, exclusive);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/PushPromiseFrame.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/PushPromiseFrame.java
new file mode 100644
index 0000000..dbc3687
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/PushPromiseFrame.java
@@ -0,0 +1,57 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+import org.eclipse.jetty.http.MetaData;
+
+public class PushPromiseFrame extends Frame
+{
+    private final int streamId;
+    private final int promisedStreamId;
+    private final MetaData metaData;
+
+    public PushPromiseFrame(int streamId, int promisedStreamId, MetaData metaData)
+    {
+        super(FrameType.PUSH_PROMISE);
+        this.streamId = streamId;
+        this.promisedStreamId = promisedStreamId;
+        this.metaData = metaData;
+    }
+
+    public int getStreamId()
+    {
+        return streamId;
+    }
+
+    public int getPromisedStreamId()
+    {
+        return promisedStreamId;
+    }
+
+    public MetaData getMetaData()
+    {
+        return metaData;
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("%s#%d/#%d", super.toString(), streamId, promisedStreamId);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/ResetFrame.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/ResetFrame.java
new file mode 100644
index 0000000..5128374
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/ResetFrame.java
@@ -0,0 +1,52 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+import org.eclipse.jetty.http2.ErrorCode;
+
+public class ResetFrame extends Frame
+{
+    private final int streamId;
+    private final int error;
+
+    public ResetFrame(int streamId, int error)
+    {
+        super(FrameType.RST_STREAM);
+        this.streamId = streamId;
+        this.error = error;
+    }
+
+    public int getStreamId()
+    {
+        return streamId;
+    }
+
+    public int getError()
+    {
+        return error;
+    }
+
+    @Override
+    public String toString()
+    {
+        ErrorCode errorCode = ErrorCode.from(error);
+        String reason = errorCode == null ? "error=" + error : errorCode.name().toLowerCase();
+        return String.format("%s#%d{%s}", super.toString(), streamId, reason);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/SettingsFrame.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/SettingsFrame.java
new file mode 100644
index 0000000..5a9356c
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/SettingsFrame.java
@@ -0,0 +1,57 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+import java.util.Map;
+
+public class SettingsFrame extends Frame
+{
+    public static final int HEADER_TABLE_SIZE = 1;
+    public static final int ENABLE_PUSH = 2;
+    public static final int MAX_CONCURRENT_STREAMS = 3;
+    public static final int INITIAL_WINDOW_SIZE = 4;
+    public static final int MAX_FRAME_SIZE = 5;
+    public static final int MAX_HEADER_LIST_SIZE = 6;
+    
+    private final Map<Integer, Integer> settings;
+    private final boolean reply;
+
+    public SettingsFrame(Map<Integer, Integer> settings, boolean reply)
+    {
+        super(FrameType.SETTINGS);
+        this.settings = settings;
+        this.reply = reply;
+    }
+
+    public Map<Integer, Integer> getSettings()
+    {
+        return settings;
+    }
+
+    public boolean isReply()
+    {
+        return reply;
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("%s,reply=%b:%s", super.toString(), reply, settings);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/WindowUpdateFrame.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/WindowUpdateFrame.java
new file mode 100644
index 0000000..7e5b123
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/frames/WindowUpdateFrame.java
@@ -0,0 +1,48 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+public class WindowUpdateFrame extends Frame
+{
+    private final int streamId;
+    private final int windowDelta;
+
+    public WindowUpdateFrame(int streamId, int windowDelta)
+    {
+        super(FrameType.WINDOW_UPDATE);
+        this.streamId = streamId;
+        this.windowDelta = windowDelta;
+    }
+
+    public int getStreamId()
+    {
+        return streamId;
+    }
+
+    public int getWindowDelta()
+    {
+        return windowDelta;
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("%s#%d,delta=%d", super.toString(), streamId, windowDelta);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/DataGenerator.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/DataGenerator.java
new file mode 100644
index 0000000..e77b686
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/DataGenerator.java
@@ -0,0 +1,93 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.generator;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.Flags;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.FrameType;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.util.BufferUtil;
+
+public class DataGenerator
+{
+    private final HeaderGenerator headerGenerator;
+
+    public DataGenerator(HeaderGenerator headerGenerator)
+    {
+        this.headerGenerator = headerGenerator;
+    }
+
+    public void generate(ByteBufferPool.Lease lease, DataFrame frame, int maxLength)
+    {
+        generateData(lease, frame.getStreamId(), frame.getData(), frame.isEndStream(), maxLength);
+    }
+
+    public void generateData(ByteBufferPool.Lease lease, int streamId, ByteBuffer data, boolean last, int maxLength)
+    {
+        if (streamId < 0)
+            throw new IllegalArgumentException("Invalid stream id: " + streamId);
+
+        int dataLength = data.remaining();
+        int maxFrameSize = headerGenerator.getMaxFrameSize();
+        if (dataLength <= maxLength && dataLength <= maxFrameSize)
+        {
+            // Single frame.
+            generateFrame(lease, streamId, data, last);
+            return;
+        }
+
+        // Other cases, we need to slice the original buffer into multiple frames.
+
+        int length = Math.min(maxLength, dataLength);
+        int frames = length / maxFrameSize;
+        if (frames * maxFrameSize != length)
+            ++frames;
+
+        int begin = data.position();
+        int end = data.limit();
+        for (int i = 1; i <= frames; ++i)
+        {
+            int limit = begin + Math.min(maxFrameSize * i, length);
+            data.limit(limit);
+            ByteBuffer slice = data.slice();
+            data.position(limit);
+            generateFrame(lease, streamId, slice, i == frames && last && limit == end);
+        }
+        data.limit(end);
+    }
+
+    private void generateFrame(ByteBufferPool.Lease lease, int streamId, ByteBuffer data, boolean last)
+    {
+        int length = data.remaining();
+
+        int flags = Flags.NONE;
+        if (last)
+            flags |= Flags.END_STREAM;
+
+        ByteBuffer header = headerGenerator.generate(lease, FrameType.DATA, Frame.HEADER_LENGTH + length, length, flags, streamId);
+
+        BufferUtil.flipToFlush(header, 0);
+        lease.append(header, true);
+
+        lease.append(data, false);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/DisconnectGenerator.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/DisconnectGenerator.java
new file mode 100644
index 0000000..6eeb760
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/DisconnectGenerator.java
@@ -0,0 +1,35 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.generator;
+
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.io.ByteBufferPool;
+
+public class DisconnectGenerator extends FrameGenerator
+{
+    public DisconnectGenerator()
+    {
+        super(null);
+    }
+
+    @Override
+    public void generate(ByteBufferPool.Lease lease, Frame frame)
+    {
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/FrameGenerator.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/FrameGenerator.java
new file mode 100644
index 0000000..28ec973
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/FrameGenerator.java
@@ -0,0 +1,47 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.generator;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.FrameType;
+import org.eclipse.jetty.io.ByteBufferPool;
+
+public abstract class FrameGenerator
+{
+    private final HeaderGenerator headerGenerator;
+
+    protected FrameGenerator(HeaderGenerator headerGenerator)
+    {
+        this.headerGenerator = headerGenerator;
+    }
+
+    public abstract void generate(ByteBufferPool.Lease lease, Frame frame);
+
+    protected ByteBuffer generateHeader(ByteBufferPool.Lease lease, FrameType frameType, int length, int flags, int streamId)
+    {
+        return headerGenerator.generate(lease, frameType, Frame.HEADER_LENGTH + length, length, flags, streamId);
+    }
+
+    public int getMaxFrameSize()
+    {
+        return headerGenerator.getMaxFrameSize();
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/Generator.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/Generator.java
new file mode 100644
index 0000000..5d6ae06
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/Generator.java
@@ -0,0 +1,87 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.generator;
+
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.FrameType;
+import org.eclipse.jetty.http2.hpack.HpackEncoder;
+import org.eclipse.jetty.io.ByteBufferPool;
+
+public class Generator
+{
+    private final ByteBufferPool byteBufferPool;
+    private final HeaderGenerator headerGenerator;
+    private final HpackEncoder hpackEncoder;
+    private final FrameGenerator[] generators;
+    private final DataGenerator dataGenerator;
+
+    public Generator(ByteBufferPool byteBufferPool)
+    {
+        this(byteBufferPool, 4096, 0);
+    }
+
+    public Generator(ByteBufferPool byteBufferPool, int maxDynamicTableSize, int maxHeaderBlockFragment)
+    {
+        this.byteBufferPool = byteBufferPool;
+
+        headerGenerator = new HeaderGenerator();
+        hpackEncoder = new HpackEncoder(maxDynamicTableSize);
+
+        this.generators = new FrameGenerator[FrameType.values().length];
+        this.generators[FrameType.HEADERS.getType()] = new HeadersGenerator(headerGenerator, hpackEncoder, maxHeaderBlockFragment);
+        this.generators[FrameType.PRIORITY.getType()] = new PriorityGenerator(headerGenerator);
+        this.generators[FrameType.RST_STREAM.getType()] = new ResetGenerator(headerGenerator);
+        this.generators[FrameType.SETTINGS.getType()] = new SettingsGenerator(headerGenerator);
+        this.generators[FrameType.PUSH_PROMISE.getType()] = new PushPromiseGenerator(headerGenerator, hpackEncoder);
+        this.generators[FrameType.PING.getType()] = new PingGenerator(headerGenerator);
+        this.generators[FrameType.GO_AWAY.getType()] = new GoAwayGenerator(headerGenerator);
+        this.generators[FrameType.WINDOW_UPDATE.getType()] = new WindowUpdateGenerator(headerGenerator);
+        this.generators[FrameType.CONTINUATION.getType()] = null; // Never generated explicitly.
+        this.generators[FrameType.PREFACE.getType()] = new PrefaceGenerator();
+        this.generators[FrameType.DISCONNECT.getType()] = new DisconnectGenerator();
+
+        this.dataGenerator = new DataGenerator(headerGenerator);
+    }
+
+    public ByteBufferPool getByteBufferPool()
+    {
+        return byteBufferPool;
+    }
+
+    public void setHeaderTableSize(int headerTableSize)
+    {
+        hpackEncoder.setRemoteMaxDynamicTableSize(headerTableSize);
+    }
+
+    public void setMaxFrameSize(int maxFrameSize)
+    {
+        headerGenerator.setMaxFrameSize(maxFrameSize);
+    }
+
+    public void control(ByteBufferPool.Lease lease, Frame frame)
+    {
+        generators[frame.getType().getType()].generate(lease, frame);
+    }
+
+    public void data(ByteBufferPool.Lease lease, DataFrame frame, int maxLength)
+    {
+        dataGenerator.generate(lease, frame, maxLength);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/GoAwayGenerator.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/GoAwayGenerator.java
new file mode 100644
index 0000000..538d3c9
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/GoAwayGenerator.java
@@ -0,0 +1,72 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.generator;
+
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+
+import org.eclipse.jetty.http2.Flags;
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.FrameType;
+import org.eclipse.jetty.http2.frames.GoAwayFrame;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.util.BufferUtil;
+
+public class GoAwayGenerator extends FrameGenerator
+{
+    public GoAwayGenerator(HeaderGenerator headerGenerator)
+    {
+        super(headerGenerator);
+    }
+
+    @Override
+    public void generate(ByteBufferPool.Lease lease, Frame frame)
+    {
+        GoAwayFrame goAwayFrame = (GoAwayFrame)frame;
+        generateGoAway(lease, goAwayFrame.getLastStreamId(), goAwayFrame.getError(), goAwayFrame.getPayload());
+    }
+
+    public void generateGoAway(ByteBufferPool.Lease lease, int lastStreamId, int error, byte[] payload)
+    {
+        if (lastStreamId < 0)
+            throw new IllegalArgumentException("Invalid last stream id: " + lastStreamId);
+
+        // The last streamId + the error code.
+        int fixedLength = 4 + 4;
+
+        // Make sure we don't exceed the default frame max length.
+        int maxPayloadLength = Frame.DEFAULT_MAX_LENGTH - fixedLength;
+        if (payload != null && payload.length > maxPayloadLength)
+            payload = Arrays.copyOfRange(payload, 0, maxPayloadLength);
+
+        int length = fixedLength + (payload != null ? payload.length : 0);
+        ByteBuffer header = generateHeader(lease, FrameType.GO_AWAY, length, Flags.NONE, 0);
+
+        header.putInt(lastStreamId);
+        header.putInt(error);
+
+        if (payload != null)
+        {
+            header.put(payload);
+        }
+
+        BufferUtil.flipToFlush(header, 0);
+        lease.append(header, true);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/HeaderGenerator.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/HeaderGenerator.java
new file mode 100644
index 0000000..89ca164
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/HeaderGenerator.java
@@ -0,0 +1,52 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.generator;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.FrameType;
+import org.eclipse.jetty.io.ByteBufferPool;
+
+public class HeaderGenerator
+{
+    private int maxFrameSize = Frame.DEFAULT_MAX_LENGTH;
+
+    public ByteBuffer generate(ByteBufferPool.Lease lease, FrameType frameType, int capacity, int length, int flags, int streamId)
+    {
+        ByteBuffer header = lease.acquire(capacity, true);
+        header.put((byte)((length & 0x00_FF_00_00) >>> 16));
+        header.put((byte)((length & 0x00_00_FF_00) >>> 8));
+        header.put((byte)((length & 0x00_00_00_FF)));
+        header.put((byte)frameType.getType());
+        header.put((byte)flags);
+        header.putInt(streamId);
+        return header;
+    }
+
+    public int getMaxFrameSize()
+    {
+        return maxFrameSize;
+    }
+
+    public void setMaxFrameSize(int maxFrameSize)
+    {
+        this.maxFrameSize = maxFrameSize;
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/HeadersGenerator.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/HeadersGenerator.java
new file mode 100644
index 0000000..160b21b
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/HeadersGenerator.java
@@ -0,0 +1,139 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.generator;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.Flags;
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.FrameType;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PriorityFrame;
+import org.eclipse.jetty.http2.hpack.HpackEncoder;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.util.BufferUtil;
+
+public class HeadersGenerator extends FrameGenerator
+{
+    private final HpackEncoder encoder;
+    private final int maxHeaderBlockFragment;
+    private final PriorityGenerator priorityGenerator;
+
+    public HeadersGenerator(HeaderGenerator headerGenerator, HpackEncoder encoder)
+    {
+        this(headerGenerator, encoder, 0);
+    }
+
+    public HeadersGenerator(HeaderGenerator headerGenerator, HpackEncoder encoder, int maxHeaderBlockFragment)
+    {
+        super(headerGenerator);
+        this.encoder = encoder;
+        this.maxHeaderBlockFragment = maxHeaderBlockFragment;
+        this.priorityGenerator = new PriorityGenerator(headerGenerator);
+    }
+
+    @Override
+    public void generate(ByteBufferPool.Lease lease, Frame frame)
+    {
+        HeadersFrame headersFrame = (HeadersFrame)frame;
+        generateHeaders(lease, headersFrame.getStreamId(), headersFrame.getMetaData(), headersFrame.getPriority(), headersFrame.isEndStream());
+    }
+
+    public void generateHeaders(ByteBufferPool.Lease lease, int streamId, MetaData metaData, PriorityFrame priority, boolean endStream)
+    {
+        if (streamId < 0)
+            throw new IllegalArgumentException("Invalid stream id: " + streamId);
+
+        int flags = Flags.NONE;
+
+        if (priority != null)
+            flags = Flags.PRIORITY;
+
+        int maxFrameSize = getMaxFrameSize();
+        ByteBuffer hpacked = lease.acquire(maxFrameSize, false);
+        BufferUtil.clearToFill(hpacked);
+        encoder.encode(hpacked, metaData);
+        int hpackedLength = hpacked.position();
+        BufferUtil.flipToFlush(hpacked, 0);
+
+        // Split into CONTINUATION frames if necessary.
+        if (maxHeaderBlockFragment > 0 && hpackedLength > maxHeaderBlockFragment)
+        {
+            if (endStream)
+                flags |= Flags.END_STREAM;
+
+            int length = maxHeaderBlockFragment;
+            if (priority != null)
+                length += PriorityFrame.PRIORITY_LENGTH;
+
+            ByteBuffer header = generateHeader(lease, FrameType.HEADERS, length, flags, streamId);
+            generatePriority(header, priority);
+            BufferUtil.flipToFlush(header, 0);
+            lease.append(header, true);
+
+            hpacked.limit(maxHeaderBlockFragment);
+            lease.append(hpacked.slice(), false);
+
+            int position = maxHeaderBlockFragment;
+            int limit = position + maxHeaderBlockFragment;
+            while (limit < hpackedLength)
+            {
+                hpacked.position(position).limit(limit);
+                header = generateHeader(lease, FrameType.CONTINUATION, maxHeaderBlockFragment, Flags.NONE, streamId);
+                BufferUtil.flipToFlush(header, 0);
+                lease.append(header, true);
+                lease.append(hpacked.slice(), false);
+                position += maxHeaderBlockFragment;
+                limit += maxHeaderBlockFragment;
+            }
+
+            hpacked.position(position).limit(hpackedLength);
+            header = generateHeader(lease, FrameType.CONTINUATION, hpacked.remaining(), Flags.END_HEADERS, streamId);
+            BufferUtil.flipToFlush(header, 0);
+            lease.append(header, true);
+            lease.append(hpacked, true);
+        }
+        else
+        {
+            flags |= Flags.END_HEADERS;
+            if (endStream)
+                flags |= Flags.END_STREAM;
+
+            int length = hpackedLength;
+            if (priority != null)
+                length += PriorityFrame.PRIORITY_LENGTH;
+
+            ByteBuffer header = generateHeader(lease, FrameType.HEADERS, length, flags, streamId);
+            generatePriority(header, priority);
+            BufferUtil.flipToFlush(header, 0);
+            lease.append(header, true);
+            lease.append(hpacked, true);
+        }
+    }
+
+    private void generatePriority(ByteBuffer header, PriorityFrame priority)
+    {
+        if (priority != null)
+        {
+            priorityGenerator.generatePriorityBody(header, priority.getStreamId(),
+                    priority.getParentStreamId(), priority.getWeight(), priority.isExclusive());
+        }
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/PingGenerator.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/PingGenerator.java
new file mode 100644
index 0000000..e5ee775
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/PingGenerator.java
@@ -0,0 +1,56 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.generator;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.Flags;
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.FrameType;
+import org.eclipse.jetty.http2.frames.PingFrame;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.util.BufferUtil;
+
+public class PingGenerator extends FrameGenerator
+{
+    public PingGenerator(HeaderGenerator headerGenerator)
+    {
+        super(headerGenerator);
+    }
+
+    @Override
+    public void generate(ByteBufferPool.Lease lease, Frame frame)
+    {
+        PingFrame pingFrame = (PingFrame)frame;
+        generatePing(lease, pingFrame.getPayload(), pingFrame.isReply());
+    }
+
+    public void generatePing(ByteBufferPool.Lease lease, byte[] payload, boolean reply)
+    {
+        if (payload.length != PingFrame.PING_LENGTH)
+            throw new IllegalArgumentException("Invalid payload length: " + payload.length);
+
+        ByteBuffer header = generateHeader(lease, FrameType.PING, PingFrame.PING_LENGTH, reply ? Flags.ACK : Flags.NONE, 0);
+
+        header.put(payload);
+
+        BufferUtil.flipToFlush(header, 0);
+        lease.append(header, true);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/PrefaceGenerator.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/PrefaceGenerator.java
new file mode 100644
index 0000000..464e4c0
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/PrefaceGenerator.java
@@ -0,0 +1,39 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.generator;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.PrefaceFrame;
+import org.eclipse.jetty.io.ByteBufferPool;
+
+public class PrefaceGenerator extends FrameGenerator
+{
+    public PrefaceGenerator()
+    {
+        super(null);
+    }
+
+    @Override
+    public void generate(ByteBufferPool.Lease lease, Frame frame)
+    {
+        lease.append(ByteBuffer.wrap(PrefaceFrame.PREFACE_BYTES), false);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/PriorityGenerator.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/PriorityGenerator.java
new file mode 100644
index 0000000..8a28eee
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/PriorityGenerator.java
@@ -0,0 +1,68 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.generator;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.Flags;
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.FrameType;
+import org.eclipse.jetty.http2.frames.PriorityFrame;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.util.BufferUtil;
+
+public class PriorityGenerator extends FrameGenerator
+{
+    public PriorityGenerator(HeaderGenerator headerGenerator)
+    {
+        super(headerGenerator);
+    }
+
+    @Override
+    public void generate(ByteBufferPool.Lease lease, Frame frame)
+    {
+        PriorityFrame priorityFrame = (PriorityFrame)frame;
+        generatePriority(lease, priorityFrame.getStreamId(), priorityFrame.getParentStreamId(), priorityFrame.getWeight(), priorityFrame.isExclusive());
+    }
+
+    public void generatePriority(ByteBufferPool.Lease lease, int streamId, int parentStreamId, int weight, boolean exclusive)
+    {
+        ByteBuffer header = generateHeader(lease, FrameType.PRIORITY, PriorityFrame.PRIORITY_LENGTH, Flags.NONE, streamId);
+        generatePriorityBody(header, streamId, parentStreamId, weight, exclusive);
+        BufferUtil.flipToFlush(header, 0);
+        lease.append(header, true);
+    }
+
+    public void generatePriorityBody(ByteBuffer header, int streamId, int parentStreamId, int weight, boolean exclusive)
+    {
+        if (streamId < 0)
+            throw new IllegalArgumentException("Invalid stream id: " + streamId);
+        if (parentStreamId < 0)
+            throw new IllegalArgumentException("Invalid parent stream id: " + parentStreamId);
+        if (parentStreamId == streamId)
+            throw new IllegalArgumentException("Stream " + streamId + " cannot depend on stream " + parentStreamId);
+        if (weight < 1 || weight > 256)
+            throw new IllegalArgumentException("Invalid weight: " + weight);
+
+        if (exclusive)
+            parentStreamId |= 0x80_00_00_00;
+        header.putInt(parentStreamId);
+        header.put((byte)(weight - 1));
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/PushPromiseGenerator.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/PushPromiseGenerator.java
new file mode 100644
index 0000000..647e4a9
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/PushPromiseGenerator.java
@@ -0,0 +1,77 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.generator;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.Flags;
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.FrameType;
+import org.eclipse.jetty.http2.frames.PushPromiseFrame;
+import org.eclipse.jetty.http2.hpack.HpackEncoder;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.util.BufferUtil;
+
+public class PushPromiseGenerator extends FrameGenerator
+{
+    private final HpackEncoder encoder;
+
+    public PushPromiseGenerator(HeaderGenerator headerGenerator, HpackEncoder encoder)
+    {
+        super(headerGenerator);
+        this.encoder = encoder;
+    }
+
+    @Override
+    public void generate(ByteBufferPool.Lease lease, Frame frame)
+    {
+        PushPromiseFrame pushPromiseFrame = (PushPromiseFrame)frame;
+        generatePushPromise(lease, pushPromiseFrame.getStreamId(), pushPromiseFrame.getPromisedStreamId(), pushPromiseFrame.getMetaData());
+    }
+
+    public void generatePushPromise(ByteBufferPool.Lease lease, int streamId, int promisedStreamId, MetaData metaData)
+    {
+        if (streamId < 0)
+            throw new IllegalArgumentException("Invalid stream id: " + streamId);
+        if (promisedStreamId < 0)
+            throw new IllegalArgumentException("Invalid promised stream id: " + promisedStreamId);
+
+        int maxFrameSize = getMaxFrameSize();
+        // The promised streamId space.
+        int extraSpace = 4;
+        maxFrameSize -= extraSpace;
+
+        ByteBuffer hpacked = lease.acquire(maxFrameSize, false);
+        BufferUtil.clearToFill(hpacked);
+        encoder.encode(hpacked, metaData);
+        int hpackedLength = hpacked.position();
+        BufferUtil.flipToFlush(hpacked, 0);
+
+        int length = hpackedLength + extraSpace;
+        int flags = Flags.END_HEADERS;
+
+        ByteBuffer header = generateHeader(lease, FrameType.PUSH_PROMISE, length, flags, streamId);
+        header.putInt(promisedStreamId);
+        BufferUtil.flipToFlush(header, 0);
+
+        lease.append(header, true);
+        lease.append(hpacked, true);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/ResetGenerator.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/ResetGenerator.java
new file mode 100644
index 0000000..a6cc592
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/ResetGenerator.java
@@ -0,0 +1,56 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.generator;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.Flags;
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.FrameType;
+import org.eclipse.jetty.http2.frames.ResetFrame;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.util.BufferUtil;
+
+public class ResetGenerator extends FrameGenerator
+{
+    public ResetGenerator(HeaderGenerator headerGenerator)
+    {
+        super(headerGenerator);
+    }
+
+    @Override
+    public void generate(ByteBufferPool.Lease lease, Frame frame)
+    {
+        ResetFrame resetFrame = (ResetFrame)frame;
+        generateReset(lease, resetFrame.getStreamId(), resetFrame.getError());
+    }
+
+    public void generateReset(ByteBufferPool.Lease lease, int streamId, int error)
+    {
+        if (streamId < 0)
+            throw new IllegalArgumentException("Invalid stream id: " + streamId);
+
+        ByteBuffer header = generateHeader(lease, FrameType.RST_STREAM, 4, Flags.NONE, streamId);
+
+        header.putInt(error);
+
+        BufferUtil.flipToFlush(header, 0);
+        lease.append(header, true);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/SettingsGenerator.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/SettingsGenerator.java
new file mode 100644
index 0000000..7bc406b
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/SettingsGenerator.java
@@ -0,0 +1,64 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.generator;
+
+import java.nio.ByteBuffer;
+import java.util.Map;
+
+import org.eclipse.jetty.http2.Flags;
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.FrameType;
+import org.eclipse.jetty.http2.frames.SettingsFrame;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.util.BufferUtil;
+
+public class SettingsGenerator extends FrameGenerator
+{
+    public SettingsGenerator(HeaderGenerator headerGenerator)
+    {
+        super(headerGenerator);
+    }
+
+    @Override
+    public void generate(ByteBufferPool.Lease lease, Frame frame)
+    {
+        SettingsFrame settingsFrame = (SettingsFrame)frame;
+        generateSettings(lease, settingsFrame.getSettings(), settingsFrame.isReply());
+    }
+
+    public void generateSettings(ByteBufferPool.Lease lease, Map<Integer, Integer> settings, boolean reply)
+    {
+        // Two bytes for the identifier, four bytes for the value.
+        int entryLength = 2 + 4;
+        int length = entryLength * settings.size();
+        if (length > getMaxFrameSize())
+            throw new IllegalArgumentException("Invalid settings, too big");
+
+        ByteBuffer header = generateHeader(lease, FrameType.SETTINGS, length, reply ? Flags.ACK : Flags.NONE, 0);
+
+        for (Map.Entry<Integer, Integer> entry : settings.entrySet())
+        {
+            header.putShort(entry.getKey().shortValue());
+            header.putInt(entry.getValue());
+        }
+
+        BufferUtil.flipToFlush(header, 0);
+        lease.append(header, true);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/WindowUpdateGenerator.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/WindowUpdateGenerator.java
new file mode 100644
index 0000000..741f10d
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/generator/WindowUpdateGenerator.java
@@ -0,0 +1,54 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.generator;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.Flags;
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.FrameType;
+import org.eclipse.jetty.http2.frames.WindowUpdateFrame;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.util.BufferUtil;
+
+public class WindowUpdateGenerator extends FrameGenerator
+{
+    public WindowUpdateGenerator(HeaderGenerator headerGenerator)
+    {
+        super(headerGenerator);
+    }
+
+    @Override
+    public void generate(ByteBufferPool.Lease lease, Frame frame)
+    {
+        WindowUpdateFrame windowUpdateFrame = (WindowUpdateFrame)frame;
+        generateWindowUpdate(lease, windowUpdateFrame.getStreamId(), windowUpdateFrame.getWindowDelta());
+    }
+
+    public void generateWindowUpdate(ByteBufferPool.Lease lease, int streamId, int windowUpdate)
+    {
+        if (windowUpdate < 0)
+            throw new IllegalArgumentException("Invalid window update: " + windowUpdate);
+
+        ByteBuffer header = generateHeader(lease, FrameType.WINDOW_UPDATE, 4, Flags.NONE, streamId);
+        header.putInt(windowUpdate);
+        BufferUtil.flipToFlush(header, 0);
+        lease.append(header, true);
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/BodyParser.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/BodyParser.java
new file mode 100644
index 0000000..fa5858f
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/BodyParser.java
@@ -0,0 +1,225 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.parser;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.Flags;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.GoAwayFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PingFrame;
+import org.eclipse.jetty.http2.frames.PriorityFrame;
+import org.eclipse.jetty.http2.frames.PushPromiseFrame;
+import org.eclipse.jetty.http2.frames.ResetFrame;
+import org.eclipse.jetty.http2.frames.SettingsFrame;
+import org.eclipse.jetty.http2.frames.WindowUpdateFrame;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+/**
+ * <p>The base parser for the frame body of HTTP/2 frames.</p>
+ * <p>Subclasses implement {@link #parse(ByteBuffer)} to parse
+ * the frame specific body.</p>
+ *
+ * @see Parser
+ */
+public abstract class BodyParser
+{
+    protected static final Logger LOG = Log.getLogger(BodyParser.class);
+
+    private final HeaderParser headerParser;
+    private final Parser.Listener listener;
+
+    protected BodyParser(HeaderParser headerParser, Parser.Listener listener)
+    {
+        this.headerParser = headerParser;
+        this.listener = listener;
+    }
+
+    /**
+     * <p>Parses the body bytes in the given {@code buffer}; only the body
+     * bytes are consumed, therefore when this method returns, the buffer
+     * may contain unconsumed bytes.</p>
+     *
+     * @param buffer the buffer to parse
+     * @return true if the whole body bytes were parsed, false if not enough
+     * body bytes were present in the buffer
+     */
+    public abstract boolean parse(ByteBuffer buffer);
+
+    protected void emptyBody(ByteBuffer buffer)
+    {
+        connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_frame");
+    }
+
+    protected boolean hasFlag(int bit)
+    {
+        return headerParser.hasFlag(bit);
+    }
+
+    protected boolean isPadding()
+    {
+        return headerParser.hasFlag(Flags.PADDING);
+    }
+
+    protected boolean isEndStream()
+    {
+        return headerParser.hasFlag(Flags.END_STREAM);
+    }
+
+    protected int getStreamId()
+    {
+        return headerParser.getStreamId();
+    }
+
+    protected int getBodyLength()
+    {
+        return headerParser.getLength();
+    }
+
+    protected void notifyData(DataFrame frame)
+    {
+        try
+        {
+            listener.onData(frame);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    protected void notifyHeaders(HeadersFrame frame)
+    {
+        try
+        {
+            listener.onHeaders(frame);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    protected void notifyPriority(PriorityFrame frame)
+    {
+        try
+        {
+            listener.onPriority(frame);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    protected void notifyReset(ResetFrame frame)
+    {
+        try
+        {
+            listener.onReset(frame);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    protected void notifySettings(SettingsFrame frame)
+    {
+        try
+        {
+            listener.onSettings(frame);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    protected void notifyPushPromise(PushPromiseFrame frame)
+    {
+        try
+        {
+            listener.onPushPromise(frame);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    protected void notifyPing(PingFrame frame)
+    {
+        try
+        {
+            listener.onPing(frame);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    protected void notifyGoAway(GoAwayFrame frame)
+    {
+        try
+        {
+            listener.onGoAway(frame);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    protected void notifyWindowUpdate(WindowUpdateFrame frame)
+    {
+        try
+        {
+            listener.onWindowUpdate(frame);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    protected boolean connectionFailure(ByteBuffer buffer, int error, String reason)
+    {
+        BufferUtil.clear(buffer);
+        notifyConnectionFailure(error, reason);
+        return false;
+    }
+
+    private void notifyConnectionFailure(int error, String reason)
+    {
+        try
+        {
+            listener.onConnectionFailure(error, reason);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/ContinuationBodyParser.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/ContinuationBodyParser.java
new file mode 100644
index 0000000..a9e9e67
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/ContinuationBodyParser.java
@@ -0,0 +1,114 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.parser;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.Flags;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+
+public class ContinuationBodyParser extends BodyParser
+{
+    private final HeaderBlockParser headerBlockParser;
+    private final HeaderBlockFragments headerBlockFragments;
+    private State state = State.PREPARE;
+    private int length;
+
+    public ContinuationBodyParser(HeaderParser headerParser, Parser.Listener listener, HeaderBlockParser headerBlockParser, HeaderBlockFragments headerBlockFragments)
+    {
+        super(headerParser, listener);
+        this.headerBlockParser = headerBlockParser;
+        this.headerBlockFragments = headerBlockFragments;
+    }
+
+    @Override
+    protected void emptyBody(ByteBuffer buffer)
+    {
+        if (hasFlag(Flags.END_HEADERS))
+            onHeaders();
+    }
+
+    @Override
+    public boolean parse(ByteBuffer buffer)
+    {
+        while (buffer.hasRemaining())
+        {
+            switch (state)
+            {
+                case PREPARE:
+                {
+                    // SPEC: wrong streamId is treated as connection error.
+                    if (getStreamId() == 0)
+                        return connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_continuation_frame");
+
+                    if (getStreamId() != headerBlockFragments.getStreamId())
+                        return connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_continuation_stream");
+
+                    length = getBodyLength();
+                    state = State.FRAGMENT;
+                    break;
+                }
+                case FRAGMENT:
+                {
+                    int remaining = buffer.remaining();
+                    if (remaining < length)
+                    {
+                        headerBlockFragments.storeFragment(buffer, remaining, false);
+                        length -= remaining;
+                    }
+                    else
+                    {
+                        boolean last = hasFlag(Flags.END_HEADERS);
+                        headerBlockFragments.storeFragment(buffer, length, last);
+                        reset();
+                        if (last)
+                            onHeaders();
+                        return true;
+                    }
+                }
+                default:
+                {
+                    throw new IllegalStateException();
+                }
+            }
+        }
+        return false;
+    }
+
+    private void onHeaders()
+    {
+        ByteBuffer headerBlock = headerBlockFragments.complete();
+        MetaData metaData = headerBlockParser.parse(headerBlock, headerBlock.remaining());
+        HeadersFrame frame = new HeadersFrame(getStreamId(), metaData, headerBlockFragments.getPriorityFrame(), headerBlockFragments.isEndStream());
+        notifyHeaders(frame);
+    }
+
+    private void reset()
+    {
+        state = State.PREPARE;
+        length = 0;
+    }
+
+    private enum State
+    {
+        PREPARE, FRAGMENT
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/DataBodyParser.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/DataBodyParser.java
new file mode 100644
index 0000000..0553889
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/DataBodyParser.java
@@ -0,0 +1,145 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.parser;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.util.BufferUtil;
+
+public class DataBodyParser extends BodyParser
+{
+    private State state = State.PREPARE;
+    private int padding;
+    private int paddingLength;
+    private int length;
+
+    public DataBodyParser(HeaderParser headerParser, Parser.Listener listener)
+    {
+        super(headerParser, listener);
+    }
+
+    private void reset()
+    {
+        state = State.PREPARE;
+        padding = 0;
+        paddingLength = 0;
+        length = 0;
+    }
+
+    @Override
+    protected void emptyBody(ByteBuffer buffer)
+    {
+        if (isPadding())
+            connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_data_frame");
+        else
+            onData(BufferUtil.EMPTY_BUFFER, false, 0);
+    }
+
+    @Override
+    public boolean parse(ByteBuffer buffer)
+    {
+        boolean loop = false;
+        while (buffer.hasRemaining() || loop)
+        {
+            switch (state)
+            {
+                case PREPARE:
+                {
+                    // SPEC: wrong streamId is treated as connection error.
+                    if (getStreamId() == 0)
+                        return connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_data_frame");
+
+                    length = getBodyLength();
+                    state = isPadding() ? State.PADDING_LENGTH : State.DATA;
+                    break;
+                }
+                case PADDING_LENGTH:
+                {
+                    padding = 1; // We have seen this byte.
+                    paddingLength = buffer.get() & 0xFF;
+                    --length;
+                    length -= paddingLength;
+                    state = State.DATA;
+                    loop = length == 0;
+                    if (length < 0)
+                        return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_data_frame_padding");
+                    break;
+                }
+                case DATA:
+                {
+                    int size = Math.min(buffer.remaining(), length);
+                    int position = buffer.position();
+                    int limit = buffer.limit();
+                    buffer.limit(position + size);
+                    ByteBuffer slice = buffer.slice();
+                    buffer.limit(limit);
+                    buffer.position(position + size);
+
+                    length -= size;
+                    if (length == 0)
+                    {
+                        state = State.PADDING;
+                        loop = paddingLength == 0;
+                        // Padding bytes include the bytes that define the
+                        // padding length plus the actual padding bytes.
+                        onData(slice, false, padding + paddingLength);
+                    }
+                    else
+                    {
+                        // We got partial data, simulate a smaller frame, and stay in DATA state.
+                        // No padding for these synthetic frames (even if we have read
+                        // the padding length already), it will be accounted at the end.
+                        onData(slice, true, 0);
+                    }
+                    break;
+                }
+                case PADDING:
+                {
+                    int size = Math.min(buffer.remaining(), paddingLength);
+                    buffer.position(buffer.position() + size);
+                    paddingLength -= size;
+                    if (paddingLength == 0)
+                    {
+                        reset();
+                        return true;
+                    }
+                    break;
+                }
+                default:
+                {
+                    throw new IllegalStateException();
+                }
+            }
+        }
+        return false;
+    }
+
+    private void onData(ByteBuffer buffer, boolean fragment, int padding)
+    {
+        DataFrame frame = new DataFrame(getStreamId(), buffer, !fragment && isEndStream(), padding);
+        notifyData(frame);
+    }
+
+    private enum State
+    {
+        PREPARE, PADDING_LENGTH, DATA, PADDING
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/GoAwayBodyParser.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/GoAwayBodyParser.java
new file mode 100644
index 0000000..35780fd
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/GoAwayBodyParser.java
@@ -0,0 +1,177 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.parser;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.frames.GoAwayFrame;
+
+public class GoAwayBodyParser extends BodyParser
+{
+    private State state = State.PREPARE;
+    private int cursor;
+    private int length;
+    private int lastStreamId;
+    private int error;
+    private byte[] payload;
+
+    public GoAwayBodyParser(HeaderParser headerParser, Parser.Listener listener)
+    {
+        super(headerParser, listener);
+    }
+
+    private void reset()
+    {
+        state = State.PREPARE;
+        cursor = 0;
+        length = 0;
+        lastStreamId = 0;
+        error = 0;
+        payload = null;
+    }
+
+    @Override
+    public boolean parse(ByteBuffer buffer)
+    {
+        while (buffer.hasRemaining())
+        {
+            switch (state)
+            {
+                case PREPARE:
+                {
+                    state = State.LAST_STREAM_ID;
+                    length = getBodyLength();
+                    break;
+                }
+                case LAST_STREAM_ID:
+                {
+                    if (buffer.remaining() >= 4)
+                    {
+                        lastStreamId = buffer.getInt();
+                        lastStreamId &= 0x7F_FF_FF_FF;
+                        state = State.ERROR;
+                        length -= 4;
+                        if (length <= 0)
+                            return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_go_away_frame");
+                    }
+                    else
+                    {
+                        state = State.LAST_STREAM_ID_BYTES;
+                        cursor = 4;
+                    }
+                    break;
+                }
+                case LAST_STREAM_ID_BYTES:
+                {
+                    int currByte = buffer.get() & 0xFF;
+                    --cursor;
+                    lastStreamId += currByte << (8 * cursor);
+                    --length;
+                    if (cursor > 0 && length <= 0)
+                        return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_go_away_frame");
+                    if (cursor == 0)
+                    {
+                        lastStreamId &= 0x7F_FF_FF_FF;
+                        state = State.ERROR;
+                        if (length == 0)
+                            return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_go_away_frame");
+                    }
+                    break;
+                }
+                case ERROR:
+                {
+                    if (buffer.remaining() >= 4)
+                    {
+                        error = buffer.getInt();
+                        state = State.PAYLOAD;
+                        length -= 4;
+                        if (length < 0)
+                            return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_go_away_frame");
+                        if (length == 0)
+                            return onGoAway(lastStreamId, error, null);
+                    }
+                    else
+                    {
+                        state = State.ERROR_BYTES;
+                        cursor = 4;
+                    }
+                    break;
+                }
+                case ERROR_BYTES:
+                {
+                    int currByte = buffer.get() & 0xFF;
+                    --cursor;
+                    error += currByte << (8 * cursor);
+                    --length;
+                    if (cursor > 0 && length <= 0)
+                        return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_go_away_frame");
+                    if (cursor == 0)
+                    {
+                        state = State.PAYLOAD;
+                        if (length == 0)
+                            return onGoAway(lastStreamId, error, null);
+                    }
+                    break;
+                }
+                case PAYLOAD:
+                {
+                    payload = new byte[length];
+                    if (buffer.remaining() >= length)
+                    {
+                        buffer.get(payload);
+                        return onGoAway(lastStreamId, error, payload);
+                    }
+                    else
+                    {
+                        state = State.PAYLOAD_BYTES;
+                        cursor = length;
+                    }
+                    break;
+                }
+                case PAYLOAD_BYTES:
+                {
+                    payload[payload.length - cursor] = buffer.get();
+                    --cursor;
+                    if (cursor == 0)
+                        return onGoAway(lastStreamId, error, payload);
+                    break;
+                }
+                default:
+                {
+                    throw new IllegalStateException();
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean onGoAway(int lastStreamId, int error, byte[] payload)
+    {
+        GoAwayFrame frame = new GoAwayFrame(lastStreamId, error, payload);
+        reset();
+        notifyGoAway(frame);
+        return true;
+    }
+
+    private enum State
+    {
+        PREPARE, LAST_STREAM_ID, LAST_STREAM_ID_BYTES, ERROR, ERROR_BYTES, PAYLOAD, PAYLOAD_BYTES
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeaderBlockFragments.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeaderBlockFragments.java
new file mode 100644
index 0000000..a9c609f
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeaderBlockFragments.java
@@ -0,0 +1,95 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.parser;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.frames.PriorityFrame;
+
+public class HeaderBlockFragments
+{
+    private PriorityFrame priorityFrame;
+    private boolean endStream;
+    private int streamId;
+    private ByteBuffer storage;
+
+    public void storeFragment(ByteBuffer fragment, int length, boolean last)
+    {
+        if (storage == null)
+        {
+            int space = last ? length : length * 2;
+            storage = ByteBuffer.allocate(space);
+        }
+
+        // Grow the storage if necessary.
+        if (storage.remaining() < length)
+        {
+            int space = last ? length : length * 2;
+            int capacity = storage.position() + space;
+            ByteBuffer newStorage = ByteBuffer.allocate(capacity);
+            storage.flip();
+            newStorage.put(storage);
+            storage = newStorage;
+        }
+
+        // Copy the fragment into the storage.
+        int limit = fragment.limit();
+        fragment.limit(fragment.position() + length);
+        storage.put(fragment);
+        fragment.limit(limit);
+    }
+
+    public PriorityFrame getPriorityFrame()
+    {
+        return priorityFrame;
+    }
+
+    public void setPriorityFrame(PriorityFrame priorityFrame)
+    {
+        this.priorityFrame = priorityFrame;
+    }
+
+    public boolean isEndStream()
+    {
+        return endStream;
+    }
+
+    public void setEndStream(boolean endStream)
+    {
+        this.endStream = endStream;
+    }
+
+    public ByteBuffer complete()
+    {
+        ByteBuffer result = storage;
+        storage = null;
+        result.flip();
+        return result;
+    }
+
+    public int getStreamId()
+    {
+        return streamId;
+    }
+
+    public void setStreamId(int streamId)
+    {
+        this.streamId = streamId;
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeaderBlockParser.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeaderBlockParser.java
new file mode 100644
index 0000000..e66888f
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeaderBlockParser.java
@@ -0,0 +1,83 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.parser;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.hpack.HpackDecoder;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.util.BufferUtil;
+
+public class HeaderBlockParser
+{
+    private final ByteBufferPool byteBufferPool;
+    private final HpackDecoder hpackDecoder;
+    private ByteBuffer blockBuffer;
+
+    public HeaderBlockParser(ByteBufferPool byteBufferPool, HpackDecoder hpackDecoder)
+    {
+        this.byteBufferPool = byteBufferPool;
+        this.hpackDecoder = hpackDecoder;
+    }
+
+    public MetaData parse(ByteBuffer buffer, int blockLength)
+    {
+        // We must wait for the all the bytes of the header block to arrive.
+        // If they are not all available, accumulate them.
+        // When all are available, decode them.
+
+        int accumulated = blockBuffer == null ? 0 : blockBuffer.position();
+        int remaining = blockLength - accumulated;
+
+        if (buffer.remaining() < remaining)
+        {
+            if (blockBuffer == null)
+            {
+                blockBuffer = byteBufferPool.acquire(blockLength, false);
+                BufferUtil.clearToFill(blockBuffer);
+            }
+            blockBuffer.put(buffer);
+            return null;
+        }
+        else
+        {
+            int limit = buffer.limit();
+            buffer.limit(buffer.position() + remaining);
+            ByteBuffer toDecode;
+            if (blockBuffer != null)
+            {
+                blockBuffer.put(buffer);
+                BufferUtil.flipToFlush(blockBuffer, 0);
+                toDecode = blockBuffer;
+            }
+            else
+            {
+                toDecode = buffer;
+            }
+
+            MetaData result = hpackDecoder.decode(toDecode);
+
+            buffer.limit(limit);
+            byteBufferPool.release(blockBuffer);
+
+            return result;
+        }
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeaderParser.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeaderParser.java
new file mode 100644
index 0000000..581f6c5
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeaderParser.java
@@ -0,0 +1,151 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.parser;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.frames.Frame;
+
+/**
+ * <p>The parser for the frame header of HTTP/2 frames.</p>
+ *
+ * @see Parser
+ */
+public class HeaderParser
+{
+    private State state = State.LENGTH;
+    private int cursor;
+
+    private int length;
+    private int type;
+    private int flags;
+    private int streamId;
+
+    protected void reset()
+    {
+        state = State.LENGTH;
+        cursor = 0;
+
+        length = 0;
+        type = 0;
+        flags = 0;
+        streamId = 0;
+    }
+
+    /**
+     * <p>Parses the header bytes in the given {@code buffer}; only the header
+     * bytes are consumed, therefore when this method returns, the buffer may
+     * contain unconsumed bytes.</p>
+     *
+     * @param buffer the buffer to parse
+     * @return true if the whole header bytes were parsed, false if not enough
+     * header bytes were present in the buffer
+     */
+    public boolean parse(ByteBuffer buffer)
+    {
+        while (buffer.hasRemaining())
+        {
+            switch (state)
+            {
+                case LENGTH:
+                {
+                    int octet = buffer.get() & 0xFF;
+                    length = (length << 8) + octet;
+                    if (++cursor == 3)
+                    {
+                        length &= Frame.MAX_MAX_LENGTH;
+                        state = State.TYPE;
+                    }
+                    break;
+                }
+                case TYPE:
+                {
+                    type = buffer.get() & 0xFF;
+                    state = State.FLAGS;
+                    break;
+                }
+                case FLAGS:
+                {
+                    flags = buffer.get() & 0xFF;
+                    state = State.STREAM_ID;
+                    break;
+                }
+                case STREAM_ID:
+                {
+                    if (buffer.remaining() >= 4)
+                    {
+                        streamId = buffer.getInt();
+                        // Most significant bit MUST be ignored as per specification.
+                        streamId &= 0x7F_FF_FF_FF;
+                        return true;
+                    }
+                    else
+                    {
+                        state = State.STREAM_ID_BYTES;
+                        cursor = 4;
+                    }
+                    break;
+                }
+                case STREAM_ID_BYTES:
+                {
+                    int currByte = buffer.get() & 0xFF;
+                    --cursor;
+                    streamId += currByte << (8 * cursor);
+                    if (cursor == 0)
+                    {
+                        // Most significant bit MUST be ignored as per specification.
+                        streamId &= 0x7F_FF_FF_FF;
+                        return true;
+                    }
+                    break;
+                }
+                default:
+                {
+                    throw new IllegalStateException();
+                }
+            }
+        }
+        return false;
+    }
+
+    public int getLength()
+    {
+        return length;
+    }
+
+    public int getFrameType()
+    {
+        return type;
+    }
+
+    public boolean hasFlag(int bit)
+    {
+        return (flags & bit) == bit;
+    }
+
+    public int getStreamId()
+    {
+        return streamId;
+    }
+
+    private enum State
+    {
+        LENGTH, TYPE, FLAGS, STREAM_ID, STREAM_ID_BYTES
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeadersBodyParser.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeadersBodyParser.java
new file mode 100644
index 0000000..29ef9ca
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeadersBodyParser.java
@@ -0,0 +1,237 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.parser;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.Flags;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PriorityFrame;
+import org.eclipse.jetty.util.BufferUtil;
+
+public class HeadersBodyParser extends BodyParser
+{
+    private final HeaderBlockParser headerBlockParser;
+    private final HeaderBlockFragments headerBlockFragments;
+    private State state = State.PREPARE;
+    private int cursor;
+    private int length;
+    private int paddingLength;
+    private boolean exclusive;
+    private int parentStreamId;
+    private int weight;
+
+    public HeadersBodyParser(HeaderParser headerParser, Parser.Listener listener, HeaderBlockParser headerBlockParser, HeaderBlockFragments headerBlockFragments)
+    {
+        super(headerParser, listener);
+        this.headerBlockParser = headerBlockParser;
+        this.headerBlockFragments = headerBlockFragments;
+    }
+
+    private void reset()
+    {
+        state = State.PREPARE;
+        cursor = 0;
+        length = 0;
+        paddingLength = 0;
+        exclusive = false;
+        parentStreamId = 0;
+        weight = 0;
+    }
+
+    @Override
+    protected void emptyBody(ByteBuffer buffer)
+    {
+        if (hasFlag(Flags.END_HEADERS))
+        {
+            MetaData metaData = headerBlockParser.parse(BufferUtil.EMPTY_BUFFER, 0);
+            onHeaders(0, 0, false, metaData);
+        }
+        else
+        {
+            headerBlockFragments.setStreamId(getStreamId());
+            headerBlockFragments.setEndStream(isEndStream());
+            if (hasFlag(Flags.PRIORITY))
+                connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_headers_priority_frame");
+        }
+    }
+
+    @Override
+    public boolean parse(ByteBuffer buffer)
+    {
+        boolean loop = false;
+        while (buffer.hasRemaining() || loop)
+        {
+            switch (state)
+            {
+                case PREPARE:
+                {
+                    // SPEC: wrong streamId is treated as connection error.
+                    if (getStreamId() == 0)
+                        return connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_headers_frame");
+
+                    length = getBodyLength();
+
+                    if (isPadding())
+                    {
+                        state = State.PADDING_LENGTH;
+                    }
+                    else if (hasFlag(Flags.PRIORITY))
+                    {
+                        state = State.EXCLUSIVE;
+                    }
+                    else
+                    {
+                        state = State.HEADERS;
+                    }
+                    break;
+                }
+                case PADDING_LENGTH:
+                {
+                    paddingLength = buffer.get() & 0xFF;
+                    --length;
+                    length -= paddingLength;
+                    state = hasFlag(Flags.PRIORITY) ? State.EXCLUSIVE : State.HEADERS;
+                    loop = length == 0;
+                    if (length < 0)
+                        return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_headers_frame_padding");
+                    break;
+                }
+                case EXCLUSIVE:
+                {
+                    // We must only peek the first byte and not advance the buffer
+                    // because the 31 least significant bits represent the stream id.
+                    int currByte = buffer.get(buffer.position());
+                    exclusive = (currByte & 0x80) == 0x80;
+                    state = State.PARENT_STREAM_ID;
+                    break;
+                }
+                case PARENT_STREAM_ID:
+                {
+                    if (buffer.remaining() >= 4)
+                    {
+                        parentStreamId = buffer.getInt();
+                        parentStreamId &= 0x7F_FF_FF_FF;
+                        length -= 4;
+                        state = State.WEIGHT;
+                        if (length < 1)
+                            return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_headers_frame");
+                    }
+                    else
+                    {
+                        state = State.PARENT_STREAM_ID_BYTES;
+                        cursor = 4;
+                    }
+                    break;
+                }
+                case PARENT_STREAM_ID_BYTES:
+                {
+                    int currByte = buffer.get() & 0xFF;
+                    --cursor;
+                    parentStreamId += currByte << (8 * cursor);
+                    --length;
+                    if (cursor > 0 && length <= 0)
+                        return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_headers_frame");
+                    if (cursor == 0)
+                    {
+                        parentStreamId &= 0x7F_FF_FF_FF;
+                        state = State.WEIGHT;
+                        if (length < 1)
+                            return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_headers_frame");
+                    }
+                    break;
+                }
+                case WEIGHT:
+                {
+                    weight = (buffer.get() & 0xFF) + 1;
+                    --length;
+                    state = State.HEADERS;
+                    loop = length == 0;
+                    break;
+                }
+                case HEADERS:
+                {
+                    if (hasFlag(Flags.END_HEADERS))
+                    {
+                        MetaData metaData = headerBlockParser.parse(buffer, length);
+                        if (metaData != null)
+                        {
+                            state = State.PADDING;
+                            loop = paddingLength == 0;
+                            onHeaders(parentStreamId, weight, exclusive, metaData);
+                        }
+                    }
+                    else
+                    {
+                        int remaining = buffer.remaining();
+                        if (remaining < length)
+                        {
+                            headerBlockFragments.storeFragment(buffer, remaining, false);
+                            length -= remaining;
+                        }
+                        else
+                        {
+                            headerBlockFragments.setStreamId(getStreamId());
+                            headerBlockFragments.setEndStream(isEndStream());
+                            if (hasFlag(Flags.PRIORITY))
+                                headerBlockFragments.setPriorityFrame(new PriorityFrame(getStreamId(), parentStreamId, weight, exclusive));
+                            headerBlockFragments.storeFragment(buffer, length, false);
+                            state = State.PADDING;
+                            loop = paddingLength == 0;
+                        }
+                    }
+                    break;
+                }
+                case PADDING:
+                {
+                    int size = Math.min(buffer.remaining(), paddingLength);
+                    buffer.position(buffer.position() + size);
+                    paddingLength -= size;
+                    if (paddingLength == 0)
+                    {
+                        reset();
+                        return true;
+                    }
+                    break;
+                }
+                default:
+                {
+                    throw new IllegalStateException();
+                }
+            }
+        }
+        return false;
+    }
+
+    private void onHeaders(int parentStreamId, int weight, boolean exclusive, MetaData metaData)
+    {
+        PriorityFrame priorityFrame = null;
+        if (hasFlag(Flags.PRIORITY))
+            priorityFrame = new PriorityFrame(getStreamId(), parentStreamId, weight, exclusive);
+        HeadersFrame frame = new HeadersFrame(getStreamId(), metaData, priorityFrame, isEndStream());
+        notifyHeaders(frame);
+    }
+
+    private enum State
+    {
+        PREPARE, PADDING_LENGTH, EXCLUSIVE, PARENT_STREAM_ID, PARENT_STREAM_ID_BYTES, WEIGHT, HEADERS, PADDING
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/Parser.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/Parser.java
new file mode 100644
index 0000000..cfc27e4
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/Parser.java
@@ -0,0 +1,298 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.parser;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.Flags;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.FrameType;
+import org.eclipse.jetty.http2.frames.GoAwayFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PingFrame;
+import org.eclipse.jetty.http2.frames.PriorityFrame;
+import org.eclipse.jetty.http2.frames.PushPromiseFrame;
+import org.eclipse.jetty.http2.frames.ResetFrame;
+import org.eclipse.jetty.http2.frames.SettingsFrame;
+import org.eclipse.jetty.http2.frames.WindowUpdateFrame;
+import org.eclipse.jetty.http2.hpack.HpackDecoder;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+/**
+ * <p>The HTTP/2 protocol parser.</p>
+ * <p>This parser makes use of the {@link HeaderParser} and of
+ * {@link BodyParser}s to parse HTTP/2 frames.</p>
+ */
+public class Parser
+{
+    private static final Logger LOG = Log.getLogger(Parser.class);
+
+    private final Listener listener;
+    private final HeaderParser headerParser;
+    private final BodyParser[] bodyParsers;
+    private boolean continuation;
+    private State state = State.HEADER;
+
+    public Parser(ByteBufferPool byteBufferPool, Listener listener, int maxDynamicTableSize, int maxHeaderSize)
+    {
+        this.listener = listener;
+        this.headerParser = new HeaderParser();
+        this.bodyParsers = new BodyParser[FrameType.values().length];
+
+        HeaderBlockParser headerBlockParser = new HeaderBlockParser(byteBufferPool, new HpackDecoder(maxDynamicTableSize, maxHeaderSize));
+        HeaderBlockFragments headerBlockFragments = new HeaderBlockFragments();
+
+        bodyParsers[FrameType.DATA.getType()] = new DataBodyParser(headerParser, listener);
+        bodyParsers[FrameType.HEADERS.getType()] = new HeadersBodyParser(headerParser, listener, headerBlockParser, headerBlockFragments);
+        bodyParsers[FrameType.PRIORITY.getType()] = new PriorityBodyParser(headerParser, listener);
+        bodyParsers[FrameType.RST_STREAM.getType()] = new ResetBodyParser(headerParser, listener);
+        bodyParsers[FrameType.SETTINGS.getType()] = new SettingsBodyParser(headerParser, listener);
+        bodyParsers[FrameType.PUSH_PROMISE.getType()] = new PushPromiseBodyParser(headerParser, listener, headerBlockParser);
+        bodyParsers[FrameType.PING.getType()] = new PingBodyParser(headerParser, listener);
+        bodyParsers[FrameType.GO_AWAY.getType()] = new GoAwayBodyParser(headerParser, listener);
+        bodyParsers[FrameType.WINDOW_UPDATE.getType()] = new WindowUpdateBodyParser(headerParser, listener);
+        bodyParsers[FrameType.CONTINUATION.getType()] = new ContinuationBodyParser(headerParser, listener, headerBlockParser, headerBlockFragments);
+    }
+
+    private void reset()
+    {
+        headerParser.reset();
+        state = State.HEADER;
+    }
+
+    /**
+     * <p>Parses the given {@code buffer} bytes and emit events to a {@link Listener}.</p>
+     * <p>When this method returns, the buffer may not be fully consumed, so invocations
+     * to this method should be wrapped in a loop:</p>
+     * <pre>
+     * while (buffer.hasRemaining())
+     *     parser.parse(buffer);
+     * </pre>
+     *
+     * @param buffer the buffer to parse
+     */
+    public void parse(ByteBuffer buffer)
+    {
+        try
+        {
+            while (true)
+            {
+                switch (state)
+                {
+                    case HEADER:
+                    {
+                        if (!parseHeader(buffer))
+                            return;
+                        break;
+                    }
+                    case BODY:
+                    {
+                        if (!parseBody(buffer))
+                            return;
+                        break;
+                    }
+                    default:
+                    {
+                        throw new IllegalStateException();
+                    }
+                }
+            }
+        }
+        catch (Throwable x)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug(x);
+            BufferUtil.clear(buffer);
+            notifyConnectionFailure(ErrorCode.PROTOCOL_ERROR.code, "parser_error");
+        }
+    }
+
+    protected boolean parseHeader(ByteBuffer buffer)
+    {
+        if (!headerParser.parse(buffer))
+            return false;
+
+        int frameType = getFrameType();
+        if (LOG.isDebugEnabled())
+            LOG.debug("Parsed {} frame header", FrameType.from(frameType));
+
+        if (continuation)
+        {
+            if (frameType != FrameType.CONTINUATION.getType())
+            {
+                // SPEC: CONTINUATION frames must be consecutive.
+                BufferUtil.clear(buffer);
+                notifyConnectionFailure(ErrorCode.PROTOCOL_ERROR.code, "continuation_frame_expected");
+                return false;
+            }
+            if (headerParser.hasFlag(Flags.END_HEADERS))
+            {
+                continuation = false;
+            }
+        }
+        else
+        {
+            if (frameType == FrameType.HEADERS.getType() &&
+                    !headerParser.hasFlag(Flags.END_HEADERS))
+            {
+                continuation = true;
+            }
+        }
+        state = State.BODY;
+        return true;
+    }
+
+    protected boolean parseBody(ByteBuffer buffer)
+    {
+        int type = getFrameType();
+        if (type < 0 || type >= bodyParsers.length)
+        {
+            BufferUtil.clear(buffer);
+            notifyConnectionFailure(ErrorCode.PROTOCOL_ERROR.code, "unknown_frame_type_" + type);
+            return false;
+        }
+
+        FrameType frameType = FrameType.from(type);
+        if (LOG.isDebugEnabled())
+            LOG.debug("Parsing {} frame", frameType);
+
+        BodyParser bodyParser = bodyParsers[type];
+        if (headerParser.getLength() == 0)
+        {
+            bodyParser.emptyBody(buffer);
+        }
+        else
+        {
+            if (!bodyParser.parse(buffer))
+                return false;
+        }
+        if (LOG.isDebugEnabled())
+            LOG.debug("Parsed {} frame", frameType);
+        reset();
+        return true;
+    }
+
+    protected int getFrameType()
+    {
+        return headerParser.getFrameType();
+    }
+
+    protected boolean hasFlag(int bit)
+    {
+        return headerParser.hasFlag(bit);
+    }
+
+    protected void notifyConnectionFailure(int error, String reason)
+    {
+        try
+        {
+            listener.onConnectionFailure(error, reason);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    public interface Listener
+    {
+        public void onData(DataFrame frame);
+
+        public void onHeaders(HeadersFrame frame);
+
+        public void onPriority(PriorityFrame frame);
+
+        public void onReset(ResetFrame frame);
+
+        public void onSettings(SettingsFrame frame);
+
+        public void onPushPromise(PushPromiseFrame frame);
+
+        public void onPing(PingFrame frame);
+
+        public void onGoAway(GoAwayFrame frame);
+
+        public void onWindowUpdate(WindowUpdateFrame frame);
+
+        public void onConnectionFailure(int error, String reason);
+
+        public static class Adapter implements Listener
+        {
+            @Override
+            public void onData(DataFrame frame)
+            {
+            }
+
+            @Override
+            public void onHeaders(HeadersFrame frame)
+            {
+            }
+
+            @Override
+            public void onPriority(PriorityFrame frame)
+            {
+            }
+
+            @Override
+            public void onReset(ResetFrame frame)
+            {
+            }
+
+            @Override
+            public void onSettings(SettingsFrame frame)
+            {
+            }
+
+            @Override
+            public void onPushPromise(PushPromiseFrame frame)
+            {
+            }
+
+            @Override
+            public void onPing(PingFrame frame)
+            {
+            }
+
+            @Override
+            public void onGoAway(GoAwayFrame frame)
+            {
+            }
+
+            @Override
+            public void onWindowUpdate(WindowUpdateFrame frame)
+            {
+            }
+
+            @Override
+            public void onConnectionFailure(int error, String reason)
+            {
+                LOG.warn("Connection failure: {}/{}", error, reason);
+            }
+        }
+    }
+
+    private enum State
+    {
+        HEADER, BODY
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/PingBodyParser.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/PingBodyParser.java
new file mode 100644
index 0000000..1ff61dc
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/PingBodyParser.java
@@ -0,0 +1,107 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.parser;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.Flags;
+import org.eclipse.jetty.http2.frames.PingFrame;
+
+public class PingBodyParser extends BodyParser
+{
+    private State state = State.PREPARE;
+    private int cursor;
+    private byte[] payload;
+
+    public PingBodyParser(HeaderParser headerParser, Parser.Listener listener)
+    {
+        super(headerParser, listener);
+    }
+
+    private void reset()
+    {
+        state = State.PREPARE;
+        cursor = 0;
+        payload = null;
+    }
+
+    @Override
+    public boolean parse(ByteBuffer buffer)
+    {
+        while (buffer.hasRemaining())
+        {
+            switch (state)
+            {
+                case PREPARE:
+                {
+                    // SPEC: wrong streamId is treated as connection error.
+                    if (getStreamId() != 0)
+                        return connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_ping_frame");
+                    // SPEC: wrong body length is treated as connection error.
+                    if (getBodyLength() != 8)
+                        return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_ping_frame");
+                    state = State.PAYLOAD;
+                    break;
+                }
+                case PAYLOAD:
+                {
+                    payload = new byte[8];
+                    if (buffer.remaining() >= 8)
+                    {
+                        buffer.get(payload);
+                        return onPing(payload);
+                    }
+                    else
+                    {
+                        state = State.PAYLOAD_BYTES;
+                        cursor = 8;
+                    }
+                    break;
+                }
+                case PAYLOAD_BYTES:
+                {
+                    payload[8 - cursor] = buffer.get();
+                    --cursor;
+                    if (cursor == 0)
+                        return onPing(payload);
+                    break;
+                }
+                default:
+                {
+                    throw new IllegalStateException();
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean onPing(byte[] payload)
+    {
+        PingFrame frame = new PingFrame(payload, hasFlag(Flags.ACK));
+        reset();
+        notifyPing(frame);
+        return true;
+    }
+
+    private enum State
+    {
+        PREPARE, PAYLOAD, PAYLOAD_BYTES
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/PrefaceParser.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/PrefaceParser.java
new file mode 100644
index 0000000..71caff3
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/PrefaceParser.java
@@ -0,0 +1,88 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.parser;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.frames.PrefaceFrame;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+public class PrefaceParser
+{
+    private static final Logger LOG = Log.getLogger(PrefaceParser.class);
+
+    private final Parser.Listener listener;
+    private int cursor;
+
+    public PrefaceParser(Parser.Listener listener)
+    {
+        this.listener = listener;
+    }
+
+    /**
+     * <p>Advances this parser after the {@link PrefaceFrame#PREFACE_PREAMBLE_BYTES}.</p>
+     * <p>This allows the HTTP/1.1 parser to parse the preamble of the preface,
+     * which is a legal HTTP/1.1 request, and this parser will parse the remaining
+     * bytes, that are not parseable by a HTTP/1.1 parser.</p>
+     */
+    protected void directUpgrade()
+    {
+        if (cursor != 0)
+            throw new IllegalStateException();
+        cursor = PrefaceFrame.PREFACE_PREAMBLE_BYTES.length;
+    }
+
+    public boolean parse(ByteBuffer buffer)
+    {
+        while (buffer.hasRemaining())
+        {
+            int currByte = buffer.get();
+            if (currByte != PrefaceFrame.PREFACE_BYTES[cursor])
+            {
+                BufferUtil.clear(buffer);
+                notifyConnectionFailure(ErrorCode.PROTOCOL_ERROR.code, "invalid_preface");
+                return false;
+            }
+            ++cursor;
+            if (cursor == PrefaceFrame.PREFACE_BYTES.length)
+            {
+                cursor = 0;
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Parsed preface bytes");
+                return true;
+            }
+        }
+        return false;
+    }
+
+    protected void notifyConnectionFailure(int error, String reason)
+    {
+        try
+        {
+            listener.onConnectionFailure(error, reason);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/PriorityBodyParser.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/PriorityBodyParser.java
new file mode 100644
index 0000000..430e33b
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/PriorityBodyParser.java
@@ -0,0 +1,130 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.parser;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.frames.PriorityFrame;
+
+public class PriorityBodyParser extends BodyParser
+{
+    private State state = State.PREPARE;
+    private int cursor;
+    private boolean exclusive;
+    private int parentStreamId;
+
+    public PriorityBodyParser(HeaderParser headerParser, Parser.Listener listener)
+    {
+        super(headerParser, listener);
+    }
+
+    private void reset()
+    {
+        state = State.PREPARE;
+        cursor = 0;
+        exclusive = false;
+        parentStreamId = 0;
+    }
+
+    @Override
+    public boolean parse(ByteBuffer buffer)
+    {
+        while (buffer.hasRemaining())
+        {
+            switch (state)
+            {
+                case PREPARE:
+                {
+                    // SPEC: wrong streamId is treated as connection error.
+                    if (getStreamId() == 0)
+                        return connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_priority_frame");
+                    int length = getBodyLength();
+                    if (length != 5)
+                        return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_priority_frame");
+                    state = State.EXCLUSIVE;
+                    break;
+                }
+                case EXCLUSIVE:
+                {
+                    // We must only peek the first byte and not advance the buffer
+                    // because the 31 least significant bits represent the stream id.
+                    int currByte = buffer.get(buffer.position());
+                    exclusive = (currByte & 0x80) == 0x80;
+                    state = State.PARENT_STREAM_ID;
+                    break;
+                }
+                case PARENT_STREAM_ID:
+                {
+                    if (buffer.remaining() >= 4)
+                    {
+                        parentStreamId = buffer.getInt();
+                        parentStreamId &= 0x7F_FF_FF_FF;
+                        state = State.WEIGHT;
+                    }
+                    else
+                    {
+                        state = State.PARENT_STREAM_ID_BYTES;
+                        cursor = 4;
+                    }
+                    break;
+                }
+                case PARENT_STREAM_ID_BYTES:
+                {
+                    int currByte = buffer.get() & 0xFF;
+                    --cursor;
+                    parentStreamId += currByte << (8 * cursor);
+                    if (cursor == 0)
+                    {
+                        parentStreamId &= 0x7F_FF_FF_FF;
+                        state = State.WEIGHT;
+                    }
+                    break;
+                }
+                case WEIGHT:
+                {
+                    // SPEC: stream cannot depend on itself.
+                    if (getStreamId() == parentStreamId)
+                        return connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_priority_frame");
+
+                    int weight = (buffer.get() & 0xFF) + 1;
+                    return onPriority(parentStreamId, weight, exclusive);
+                }
+                default:
+                {
+                    throw new IllegalStateException();
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean onPriority(int parentStreamId, int weight, boolean exclusive)
+    {
+        PriorityFrame frame = new PriorityFrame(getStreamId(), parentStreamId, weight, exclusive);
+        reset();
+        notifyPriority(frame);
+        return true;
+    }
+
+    private enum State
+    {
+        PREPARE, EXCLUSIVE, PARENT_STREAM_ID, PARENT_STREAM_ID_BYTES, WEIGHT
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/PushPromiseBodyParser.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/PushPromiseBodyParser.java
new file mode 100644
index 0000000..728e058
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/PushPromiseBodyParser.java
@@ -0,0 +1,167 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.parser;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.Flags;
+import org.eclipse.jetty.http2.frames.PushPromiseFrame;
+
+public class PushPromiseBodyParser extends BodyParser
+{
+    private final HeaderBlockParser headerBlockParser;
+    private State state = State.PREPARE;
+    private int cursor;
+    private int length;
+    private int paddingLength;
+    private int streamId;
+
+    public PushPromiseBodyParser(HeaderParser headerParser, Parser.Listener listener, HeaderBlockParser headerBlockParser)
+    {
+        super(headerParser, listener);
+        this.headerBlockParser = headerBlockParser;
+    }
+
+    private void reset()
+    {
+        state = State.PREPARE;
+        cursor = 0;
+        length = 0;
+        paddingLength = 0;
+        streamId = 0;
+    }
+
+    @Override
+    public boolean parse(ByteBuffer buffer)
+    {
+        boolean loop = false;
+        while (buffer.hasRemaining() || loop)
+        {
+            switch (state)
+            {
+                case PREPARE:
+                {
+                    // SPEC: wrong streamId is treated as connection error.
+                    if (getStreamId() == 0)
+                        return connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_push_promise_frame");
+
+                    // For now we don't support PUSH_PROMISE frames that don't have END_HEADERS.
+                    if (!hasFlag(Flags.END_HEADERS))
+                        return connectionFailure(buffer, ErrorCode.INTERNAL_ERROR.code, "unsupported_push_promise_frame");
+
+                    length = getBodyLength();
+
+                    if (isPadding())
+                    {
+                        state = State.PADDING_LENGTH;
+                    }
+                    else
+                    {
+                        state = State.STREAM_ID;
+                    }
+                    break;
+                }
+                case PADDING_LENGTH:
+                {
+                    paddingLength = buffer.get() & 0xFF;
+                    --length;
+                    length -= paddingLength;
+                    state = State.STREAM_ID;
+                    if (length < 4)
+                        return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_push_promise_frame");
+                    break;
+                }
+                case STREAM_ID:
+                {
+                    if (buffer.remaining() >= 4)
+                    {
+                        streamId = buffer.getInt();
+                        streamId &= 0x7F_FF_FF_FF;
+                        length -= 4;
+                        state = State.HEADERS;
+                        loop = length == 0;
+                    }
+                    else
+                    {
+                        state = State.STREAM_ID_BYTES;
+                        cursor = 4;
+                    }
+                    break;
+                }
+                case STREAM_ID_BYTES:
+                {
+                    int currByte = buffer.get() & 0xFF;
+                    --cursor;
+                    streamId += currByte << (8 * cursor);
+                    --length;
+                    if (cursor > 0 && length <= 0)
+                        return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_push_promise_frame");
+                    if (cursor == 0)
+                    {
+                        streamId &= 0x7F_FF_FF_FF;
+                        state = State.HEADERS;
+                        loop = length == 0;
+                    }
+                    break;
+                }
+                case HEADERS:
+                {
+                    MetaData metaData = headerBlockParser.parse(buffer, length);
+                    if (metaData != null)
+                    {
+                        state = State.PADDING;
+                        loop = paddingLength == 0;
+                        onPushPromise(streamId, metaData);
+                    }
+                    break;
+                }
+                case PADDING:
+                {
+                    int size = Math.min(buffer.remaining(), paddingLength);
+                    buffer.position(buffer.position() + size);
+                    paddingLength -= size;
+                    if (paddingLength == 0)
+                    {
+                        reset();
+                        return true;
+                    }
+                    break;
+                }
+                default:
+                {
+                    throw new IllegalStateException();
+                }
+            }
+        }
+        return false;
+    }
+
+    private void onPushPromise(int streamId, MetaData metaData)
+    {
+        PushPromiseFrame frame = new PushPromiseFrame(getStreamId(), streamId, metaData);
+        notifyPushPromise(frame);
+    }
+
+    private enum State
+    {
+        PREPARE, PADDING_LENGTH, STREAM_ID, STREAM_ID_BYTES, HEADERS, PADDING
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/ResetBodyParser.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/ResetBodyParser.java
new file mode 100644
index 0000000..b04f448
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/ResetBodyParser.java
@@ -0,0 +1,105 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.parser;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.frames.ResetFrame;
+
+public class ResetBodyParser extends BodyParser
+{
+    private State state = State.PREPARE;
+    private int cursor;
+    private int error;
+
+    public ResetBodyParser(HeaderParser headerParser, Parser.Listener listener)
+    {
+        super(headerParser, listener);
+    }
+
+    private void reset()
+    {
+        state = State.PREPARE;
+        cursor = 0;
+        error = 0;
+    }
+
+    @Override
+    public boolean parse(ByteBuffer buffer)
+    {
+        while (buffer.hasRemaining())
+        {
+            switch (state)
+            {
+                case PREPARE:
+                {
+                    // SPEC: wrong streamId is treated as connection error.
+                    if (getStreamId() == 0)
+                        return connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_rst_stream_frame");
+                    int length = getBodyLength();
+                    if (length != 4)
+                        return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_rst_stream_frame");
+                    state = State.ERROR;
+                    break;
+                }
+                case ERROR:
+                {
+                    if (buffer.remaining() >= 4)
+                    {
+                        return onReset(buffer.getInt());
+                    }
+                    else
+                    {
+                        state = State.ERROR_BYTES;
+                        cursor = 4;
+                    }
+                    break;
+                }
+                case ERROR_BYTES:
+                {
+                    int currByte = buffer.get() & 0xFF;
+                    --cursor;
+                    error += currByte << (8 * cursor);
+                    if (cursor == 0)
+                        return onReset(error);
+                    break;
+                }
+                default:
+                {
+                    throw new IllegalStateException();
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean onReset(int error)
+    {
+        ResetFrame frame = new ResetFrame(getStreamId(), error);
+        reset();
+        notifyReset(frame);
+        return true;
+    }
+
+    private enum State
+    {
+        PREPARE, ERROR, ERROR_BYTES
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/ServerParser.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/ServerParser.java
new file mode 100644
index 0000000..c584348
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/ServerParser.java
@@ -0,0 +1,167 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.parser;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.Flags;
+import org.eclipse.jetty.http2.frames.FrameType;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+public class ServerParser extends Parser
+{
+    private static final Logger LOG = Log.getLogger(ServerParser.class);
+
+    private final Listener listener;
+    private final PrefaceParser prefaceParser;
+    private State state = State.PREFACE;
+    private boolean notifyPreface = true;
+
+    public ServerParser(ByteBufferPool byteBufferPool, Listener listener, int maxDynamicTableSize, int maxHeaderSize)
+    {
+        super(byteBufferPool, listener, maxDynamicTableSize, maxHeaderSize);
+        this.listener = listener;
+        this.prefaceParser = new PrefaceParser(listener);
+    }
+
+    /**
+     * <p>A direct upgrade is an unofficial upgrade from HTTP/1.1 to HTTP/2.0.</p>
+     * <p>A direct upgrade is initiated when {@code org.eclipse.jetty.server.HttpConnection}
+     * sees a request with these bytes:</p>
+     * <pre>
+     * PRI * HTTP/2.0\r\n
+     * \r\n
+     * </pre>
+     * <p>This request is part of the HTTP/2.0 preface, indicating that a
+     * HTTP/2.0 client is attempting a h2c direct connection.</p>
+     * <p>This is not a standard HTTP/1.1 Upgrade path.</p>
+     */
+    public void directUpgrade()
+    {
+        if (state != State.PREFACE)
+            throw new IllegalStateException();
+        prefaceParser.directUpgrade();
+    }
+
+    /**
+     * <p>The standard HTTP/1.1 upgrade path.</p>
+     */
+    public void standardUpgrade()
+    {
+        if (state != State.PREFACE)
+            throw new IllegalStateException();
+        notifyPreface = false;
+    }
+
+    @Override
+    public void parse(ByteBuffer buffer)
+    {
+        try
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Parsing {}", buffer);
+
+            while (true)
+            {
+                switch (state)
+                {
+                    case PREFACE:
+                    {
+                        if (!prefaceParser.parse(buffer))
+                            return;
+                        if (notifyPreface)
+                            onPreface();
+                        state = State.SETTINGS;
+                        break;
+                    }
+                    case SETTINGS:
+                    {
+                        if (!parseHeader(buffer))
+                            return;
+                        if (getFrameType() != FrameType.SETTINGS.getType() || hasFlag(Flags.ACK))
+                        {
+                            BufferUtil.clear(buffer);
+                            notifyConnectionFailure(ErrorCode.PROTOCOL_ERROR.code, "invalid_preface");
+                            return;
+                        }
+                        if (!parseBody(buffer))
+                            return;
+                        state = State.FRAMES;
+                        break;
+                    }
+                    case FRAMES:
+                    {
+                        // Stay forever in the FRAMES state.
+                        super.parse(buffer);
+                        return;
+                    }
+                    default:
+                    {
+                        throw new IllegalStateException();
+                    }
+                }
+            }
+        }
+        catch (Throwable x)
+        {
+            LOG.debug(x);
+            BufferUtil.clear(buffer);
+            notifyConnectionFailure(ErrorCode.PROTOCOL_ERROR.code, "parser_error");
+        }
+    }
+
+    protected void onPreface()
+    {
+        notifyPreface();
+    }
+
+    private void notifyPreface()
+    {
+        try
+        {
+            listener.onPreface();
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    public interface Listener extends Parser.Listener
+    {
+        public void onPreface();
+
+        public static class Adapter extends Parser.Listener.Adapter implements Listener
+        {
+            @Override
+            public void onPreface()
+            {
+            }
+        }
+    }
+
+    private enum State
+    {
+        PREFACE, SETTINGS, FRAMES
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/SettingsBodyParser.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/SettingsBodyParser.java
new file mode 100644
index 0000000..78d7225
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/SettingsBodyParser.java
@@ -0,0 +1,212 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.parser;
+
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.Flags;
+import org.eclipse.jetty.http2.frames.SettingsFrame;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+public class SettingsBodyParser extends BodyParser
+{
+    private static final Logger LOG = Log.getLogger(SettingsBodyParser.class);
+    private State state = State.PREPARE;
+    private int cursor;
+    private int length;
+    private int settingId;
+    private int settingValue;
+    private Map<Integer, Integer> settings;
+
+    public SettingsBodyParser(HeaderParser headerParser, Parser.Listener listener)
+    {
+        super(headerParser, listener);
+    }
+
+    protected void reset()
+    {
+        state = State.PREPARE;
+        cursor = 0;
+        length = 0;
+        settingId = 0;
+        settingValue = 0;
+        settings = null;
+    }
+
+    @Override
+    protected void emptyBody(ByteBuffer buffer)
+    {
+        onSettings(new HashMap<>());
+    }
+
+    @Override
+    public boolean parse(ByteBuffer buffer)
+    {
+        while (buffer.hasRemaining())
+        {
+            switch (state)
+            {
+                case PREPARE:
+                {
+                    // SPEC: wrong streamId is treated as connection error.
+                    if (getStreamId() != 0)
+                        return connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_settings_frame");
+                    length = getBodyLength();
+                    settings = new HashMap<>();
+                    state = State.SETTING_ID;
+                    break;
+                }
+                case SETTING_ID:
+                {
+                    if (buffer.remaining() >= 2)
+                    {
+                        settingId = buffer.getShort() & 0xFF_FF;
+                        state = State.SETTING_VALUE;
+                        length -= 2;
+                        if (length <= 0)
+                            return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_settings_frame");
+                    }
+                    else
+                    {
+                        cursor = 2;
+                        settingId = 0;
+                        state = State.SETTING_ID_BYTES;
+                    }
+                    break;
+                }
+                case SETTING_ID_BYTES:
+                {
+                    int currByte = buffer.get() & 0xFF;
+                    --cursor;
+                    settingId += currByte << (8 * cursor);
+                    --length;
+                    if (length <= 0)
+                        return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_settings_frame");
+                    if (cursor == 0)
+                    {
+                        state = State.SETTING_VALUE;
+                    }
+                    break;
+                }
+                case SETTING_VALUE:
+                {
+                    if (buffer.remaining() >= 4)
+                    {
+                        settingValue = buffer.getInt();
+                        if (LOG.isDebugEnabled())
+                            LOG.debug(String.format("setting %d=%d",settingId, settingValue));
+                        settings.put(settingId, settingValue);
+                        state = State.SETTING_ID;
+                        length -= 4;
+                        if (length == 0)
+                            return onSettings(settings);
+                    }
+                    else
+                    {
+                        cursor = 4;
+                        settingValue = 0;
+                        state = State.SETTING_VALUE_BYTES;
+                    }
+                    break;
+                }
+                case SETTING_VALUE_BYTES:
+                {
+                    int currByte = buffer.get() & 0xFF;
+                    --cursor;
+                    settingValue += currByte << (8 * cursor);
+                    --length;
+                    if (cursor > 0 && length <= 0)
+                        return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_settings_frame");
+                    if (cursor == 0)
+                    {
+                        if (LOG.isDebugEnabled())
+                            LOG.debug(String.format("setting %d=%d",settingId, settingValue));
+                        settings.put(settingId, settingValue);
+                        state = State.SETTING_ID;
+                        if (length == 0)
+                            return onSettings(settings);
+                    }
+                    break;
+                }
+                default:
+                {
+                    throw new IllegalStateException();
+                }
+            }
+        }
+        return false;
+    }
+
+    protected boolean onSettings(Map<Integer, Integer> settings)
+    {
+        SettingsFrame frame = new SettingsFrame(settings, hasFlag(Flags.ACK));
+        reset();
+        notifySettings(frame);
+        return true;
+    }
+
+    public static SettingsFrame parseBody(final ByteBuffer buffer)
+    {
+        final int bodyLength = buffer.remaining();
+        final AtomicReference<SettingsFrame> frameRef = new AtomicReference<>();
+        SettingsBodyParser parser = new SettingsBodyParser(null, null)
+        {
+            @Override
+            protected int getStreamId()
+            {
+                return 0;
+            }
+
+            @Override
+            protected int getBodyLength()
+            {
+                return bodyLength;
+            }
+
+            @Override
+            protected boolean onSettings(Map<Integer, Integer> settings)
+            {
+                frameRef.set(new SettingsFrame(settings, false));
+                return true;
+            }
+
+            @Override
+            protected boolean connectionFailure(ByteBuffer buffer, int error, String reason)
+            {
+                frameRef.set(null);
+                return false;
+            }
+        };
+        if (bodyLength == 0)
+            parser.emptyBody(buffer);
+        else
+            parser.parse(buffer);
+        return frameRef.get();
+    }
+
+    private enum State
+    {
+        PREPARE, SETTING_ID, SETTING_ID_BYTES, SETTING_VALUE, SETTING_VALUE_BYTES
+    }
+}
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/WindowUpdateBodyParser.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/WindowUpdateBodyParser.java
new file mode 100644
index 0000000..bd2325a
--- /dev/null
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/parser/WindowUpdateBodyParser.java
@@ -0,0 +1,106 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.parser;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.frames.WindowUpdateFrame;
+
+public class WindowUpdateBodyParser extends BodyParser
+{
+    private State state = State.PREPARE;
+    private int cursor;
+    private int windowDelta;
+
+    public WindowUpdateBodyParser(HeaderParser headerParser, Parser.Listener listener)
+    {
+        super(headerParser, listener);
+    }
+
+    private void reset()
+    {
+        state = State.PREPARE;
+        cursor = 0;
+        windowDelta = 0;
+    }
+
+    @Override
+    public boolean parse(ByteBuffer buffer)
+    {
+        while (buffer.hasRemaining())
+        {
+            switch (state)
+            {
+                case PREPARE:
+                {
+                    int length = getBodyLength();
+                    if (length != 4)
+                        return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_window_update_frame");
+                    state = State.WINDOW_DELTA;
+                    break;
+                }
+                case WINDOW_DELTA:
+                {
+                    if (buffer.remaining() >= 4)
+                    {
+                        windowDelta = buffer.getInt() & 0x7F_FF_FF_FF;
+                        return onWindowUpdate(windowDelta);
+                    }
+                    else
+                    {
+                        state = State.WINDOW_DELTA_BYTES;
+                        cursor = 4;
+                    }
+                    break;
+                }
+                case WINDOW_DELTA_BYTES:
+                {
+                    byte currByte = buffer.get();
+                    --cursor;
+                    windowDelta += (currByte & 0xFF) << 8 * cursor;
+                    if (cursor == 0)
+                    {
+                        windowDelta &= 0x7F_FF_FF_FF;
+                        return onWindowUpdate(windowDelta);
+                    }
+                    break;
+                }
+                default:
+                {
+                    throw new IllegalStateException();
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean onWindowUpdate(int windowDelta)
+    {
+        WindowUpdateFrame frame = new WindowUpdateFrame(getStreamId(), windowDelta);
+        reset();
+        notifyWindowUpdate(frame);
+        return true;
+    }
+
+    private enum State
+    {
+        PREPARE, WINDOW_DELTA, WINDOW_DELTA_BYTES
+    }
+}
diff --git a/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/api/UsageTest.java b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/api/UsageTest.java
new file mode 100644
index 0000000..88ad1bb
--- /dev/null
+++ b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/api/UsageTest.java
@@ -0,0 +1,60 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.api;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class UsageTest
+{
+    @Ignore
+    @Test
+    public void test() throws Exception
+    {
+//        HTTP2Client client = new HTTP2Client();
+//        client.connect("localhost", 8080, new Promise.Adapter<Session>()
+//        {
+//            @Override
+//            public void succeeded(Session session)
+//            {
+//                session.newStream(new HeadersFrame(info, null, true), new Stream.Listener.Adapter()
+//                {
+//                    @Override
+//                    public void onData(Stream stream, DataFrame frame)
+//                    {
+//                        System.out.println("received frame = " + frame);
+//                    }
+//                }, new Adapter<Stream>()
+//                {
+//                    @Override
+//                    public void succeeded(Stream stream)
+//                    {
+//                        DataFrame frame = new DataFrame(stream.getId(), ByteBuffer.wrap("HELLO".getBytes(StandardCharsets.UTF_8)), true);
+//                        stream.data(frame, new Callback.Adapter());
+//                    }
+//                });
+//            }
+//        });
+
+        // KINDA CALLBACK HELL ABOVE.
+        // BELOW USING COMPLETABLES:
+
+//        client.connect("localhost", 8080).then(session -> session.newStream(...)).then(stream -> stream.data(...));
+    }
+}
diff --git a/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/DataGenerateParseTest.java b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/DataGenerateParseTest.java
new file mode 100644
index 0000000..dd7f837
--- /dev/null
+++ b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/DataGenerateParseTest.java
@@ -0,0 +1,147 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.eclipse.jetty.http2.generator.DataGenerator;
+import org.eclipse.jetty.http2.generator.HeaderGenerator;
+import org.eclipse.jetty.http2.parser.Parser;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.MappedByteBufferPool;
+import org.eclipse.jetty.util.BufferUtil;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class DataGenerateParseTest
+{
+    private final byte[] smallContent = new byte[128];
+    private final byte[] largeContent = new byte[128 * 1024];
+    private final ByteBufferPool byteBufferPool = new MappedByteBufferPool();
+
+    public DataGenerateParseTest()
+    {
+        Random random = new Random();
+        random.nextBytes(smallContent);
+        random.nextBytes(largeContent);
+    }
+
+    @Test
+    public void testGenerateParseNoContentNoPadding()
+    {
+        testGenerateParseContent(BufferUtil.EMPTY_BUFFER);
+    }
+
+    @Test
+    public void testGenerateParseSmallContentNoPadding()
+    {
+        testGenerateParseContent(ByteBuffer.wrap(smallContent));
+    }
+
+    private void testGenerateParseContent(ByteBuffer content)
+    {
+        List<DataFrame> frames = testGenerateParse(content);
+        Assert.assertEquals(1, frames.size());
+        DataFrame frame = frames.get(0);
+        Assert.assertTrue(frame.getStreamId() != 0);
+        Assert.assertTrue(frame.isEndStream());
+        Assert.assertEquals(content, frame.getData());
+    }
+
+    @Test
+    public  void testGenerateParseLargeContent()
+    {
+        ByteBuffer content = ByteBuffer.wrap(largeContent);
+        List<DataFrame> frames = testGenerateParse(content);
+        Assert.assertEquals(8, frames.size());
+        ByteBuffer aggregate = ByteBuffer.allocate(content.remaining());
+        for (int i = 1; i <= frames.size(); ++i)
+        {
+            DataFrame frame = frames.get(i - 1);
+            Assert.assertTrue(frame.getStreamId() != 0);
+            Assert.assertEquals(i == frames.size(), frame.isEndStream());
+            aggregate.put(frame.getData());
+        }
+        aggregate.flip();
+        Assert.assertEquals(content, aggregate);
+    }
+
+    private List<DataFrame> testGenerateParse(ByteBuffer data)
+    {
+        DataGenerator generator = new DataGenerator(new HeaderGenerator());
+
+        final List<DataFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onData(DataFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        // Iterate a few times to be sure generator and parser are properly reset.
+        for (int i = 0; i < 2; ++i)
+        {
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            generator.generateData(lease, 13, data.slice(), true, data.remaining());
+
+            frames.clear();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+            {
+                parser.parse(buffer);
+            }
+        }
+
+        return frames;
+    }
+
+    @Test
+    public void testGenerateParseOneByteAtATime()
+    {
+        DataGenerator generator = new DataGenerator(new HeaderGenerator());
+
+        final List<DataFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onData(DataFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        ByteBuffer data = ByteBuffer.wrap(largeContent);
+        generator.generateData(lease, 13, data.slice(), true, data.remaining());
+
+        for (ByteBuffer buffer : lease.getByteBuffers())
+        {
+            while (buffer.hasRemaining())
+            {
+                parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
+            }
+        }
+
+        Assert.assertEquals(largeContent.length, frames.size());
+    }
+}
diff --git a/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/GoAwayGenerateParseTest.java b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/GoAwayGenerateParseTest.java
new file mode 100644
index 0000000..b53225a
--- /dev/null
+++ b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/GoAwayGenerateParseTest.java
@@ -0,0 +1,116 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.eclipse.jetty.http2.generator.GoAwayGenerator;
+import org.eclipse.jetty.http2.generator.HeaderGenerator;
+import org.eclipse.jetty.http2.parser.Parser;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.MappedByteBufferPool;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class GoAwayGenerateParseTest
+{
+    private final ByteBufferPool byteBufferPool = new MappedByteBufferPool();
+
+    @Test
+    public void testGenerateParse() throws Exception
+    {
+        GoAwayGenerator generator = new GoAwayGenerator(new HeaderGenerator());
+
+        final List<GoAwayFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onGoAway(GoAwayFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        int lastStreamId = 13;
+        int error = 17;
+
+        // Iterate a few times to be sure generator and parser are properly reset.
+        for (int i = 0; i < 2; ++i)
+        {
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            generator.generateGoAway(lease, lastStreamId, error, null);
+
+            frames.clear();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+            {
+                while (buffer.hasRemaining())
+                {
+                    parser.parse(buffer);
+                }
+            }
+        }
+
+        Assert.assertEquals(1, frames.size());
+        GoAwayFrame frame = frames.get(0);
+        Assert.assertEquals(lastStreamId, frame.getLastStreamId());
+        Assert.assertEquals(error, frame.getError());
+        Assert.assertNull(frame.getPayload());
+    }
+
+    @Test
+    public void testGenerateParseOneByteAtATime() throws Exception
+    {
+        GoAwayGenerator generator = new GoAwayGenerator(new HeaderGenerator());
+
+        final List<GoAwayFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onGoAway(GoAwayFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        int lastStreamId = 13;
+        int error = 17;
+        byte[] payload = new byte[16];
+        new Random().nextBytes(payload);
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        generator.generateGoAway(lease, lastStreamId, error, payload);
+
+        for (ByteBuffer buffer : lease.getByteBuffers())
+        {
+            while (buffer.hasRemaining())
+            {
+                parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
+            }
+        }
+
+        Assert.assertEquals(1, frames.size());
+        GoAwayFrame frame = frames.get(0);
+        Assert.assertEquals(lastStreamId, frame.getLastStreamId());
+        Assert.assertEquals(error, frame.getError());
+        Assert.assertArrayEquals(payload, frame.getPayload());
+    }
+}
diff --git a/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/HeadersGenerateParseTest.java b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/HeadersGenerateParseTest.java
new file mode 100644
index 0000000..a7796f0
--- /dev/null
+++ b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/HeadersGenerateParseTest.java
@@ -0,0 +1,154 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jetty.http.HostPortHttpField;
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpScheme;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.generator.HeaderGenerator;
+import org.eclipse.jetty.http2.generator.HeadersGenerator;
+import org.eclipse.jetty.http2.hpack.HpackEncoder;
+import org.eclipse.jetty.http2.parser.Parser;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.MappedByteBufferPool;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class HeadersGenerateParseTest
+{
+    private final ByteBufferPool byteBufferPool = new MappedByteBufferPool();
+
+    @Test
+    public void testGenerateParse() throws Exception
+    {
+        HeadersGenerator generator = new HeadersGenerator(new HeaderGenerator(), new HpackEncoder());
+
+        int streamId = 13;
+        HttpFields fields = new HttpFields();
+        fields.put("Accept", "text/html");
+        fields.put("User-Agent", "Jetty");
+        MetaData.Request metaData = new MetaData.Request("GET", HttpScheme.HTTP, new HostPortHttpField("localhost:8080"), "/path", HttpVersion.HTTP_2, fields);
+
+        final List<HeadersFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(HeadersFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        // Iterate a few times to be sure generator and parser are properly reset.
+        for (int i = 0; i < 2; ++i)
+        {
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            PriorityFrame priorityFrame = new PriorityFrame(streamId, 3 * streamId, 200, true);
+            generator.generateHeaders(lease, streamId, metaData, priorityFrame, true);
+
+            frames.clear();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+            {
+                while (buffer.hasRemaining())
+                {
+                    parser.parse(buffer);
+                }
+            }
+
+            Assert.assertEquals(1, frames.size());
+            HeadersFrame frame = frames.get(0);
+            Assert.assertEquals(streamId, frame.getStreamId());
+            Assert.assertTrue(frame.isEndStream());
+            MetaData.Request request = (MetaData.Request)frame.getMetaData();
+            Assert.assertEquals(metaData.getMethod(), request.getMethod());
+            Assert.assertEquals(metaData.getURI(), request.getURI());
+            for (int j = 0; j < fields.size(); ++j)
+            {
+                HttpField field = fields.getField(j);
+                Assert.assertTrue(request.getFields().contains(field));
+            }
+            PriorityFrame priority = frame.getPriority();
+            Assert.assertNotNull(priority);
+            Assert.assertEquals(priorityFrame.getStreamId(), priority.getStreamId());
+            Assert.assertEquals(priorityFrame.getParentStreamId(), priority.getParentStreamId());
+            Assert.assertEquals(priorityFrame.getWeight(), priority.getWeight());
+            Assert.assertEquals(priorityFrame.isExclusive(), priority.isExclusive());
+        }
+    }
+
+    @Test
+    public void testGenerateParseOneByteAtATime() throws Exception
+    {
+        HeadersGenerator generator = new HeadersGenerator(new HeaderGenerator(), new HpackEncoder());
+
+        final List<HeadersFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onHeaders(HeadersFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        int streamId = 13;
+        HttpFields fields = new HttpFields();
+        fields.put("Accept", "text/html");
+        fields.put("User-Agent", "Jetty");
+        MetaData.Request metaData = new MetaData.Request("GET", HttpScheme.HTTP, new HostPortHttpField("localhost:8080"), "/path", HttpVersion.HTTP_2, fields);
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        PriorityFrame priorityFrame = new PriorityFrame(streamId, 3 * streamId, 200, true);
+        generator.generateHeaders(lease, streamId, metaData, priorityFrame, true);
+
+        for (ByteBuffer buffer : lease.getByteBuffers())
+        {
+            while (buffer.hasRemaining())
+            {
+                parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
+            }
+        }
+
+        Assert.assertEquals(1, frames.size());
+        HeadersFrame frame = frames.get(0);
+        Assert.assertEquals(streamId, frame.getStreamId());
+        Assert.assertTrue(frame.isEndStream());
+        MetaData.Request request = (MetaData.Request)frame.getMetaData();
+        Assert.assertEquals(metaData.getMethod(), request.getMethod());
+        Assert.assertEquals(metaData.getURI(), request.getURI());
+        for (int j = 0; j < fields.size(); ++j)
+        {
+            HttpField field = fields.getField(j);
+            Assert.assertTrue(request.getFields().contains(field));
+        }
+        PriorityFrame priority = frame.getPriority();
+        Assert.assertNotNull(priority);
+        Assert.assertEquals(priorityFrame.getStreamId(), priority.getStreamId());
+        Assert.assertEquals(priorityFrame.getParentStreamId(), priority.getParentStreamId());
+        Assert.assertEquals(priorityFrame.getWeight(), priority.getWeight());
+        Assert.assertEquals(priorityFrame.isExclusive(), priority.isExclusive());
+    }
+}
diff --git a/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/PingGenerateParseTest.java b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/PingGenerateParseTest.java
new file mode 100644
index 0000000..b3e85ae
--- /dev/null
+++ b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/PingGenerateParseTest.java
@@ -0,0 +1,145 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.eclipse.jetty.http2.generator.HeaderGenerator;
+import org.eclipse.jetty.http2.generator.PingGenerator;
+import org.eclipse.jetty.http2.parser.Parser;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.MappedByteBufferPool;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class PingGenerateParseTest
+{
+    private final ByteBufferPool byteBufferPool = new MappedByteBufferPool();
+
+    @Test
+    public void testGenerateParse() throws Exception
+    {
+        PingGenerator generator = new PingGenerator(new HeaderGenerator());
+
+        final List<PingFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onPing(PingFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        byte[] payload = new byte[8];
+        new Random().nextBytes(payload);
+
+        // Iterate a few times to be sure generator and parser are properly reset.
+        for (int i = 0; i < 2; ++i)
+        {
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            generator.generatePing(lease, payload, true);
+
+            frames.clear();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+            {
+                while (buffer.hasRemaining())
+                {
+                    parser.parse(buffer);
+                }
+            }
+        }
+
+        Assert.assertEquals(1, frames.size());
+        PingFrame frame = frames.get(0);
+        Assert.assertArrayEquals(payload, frame.getPayload());
+        Assert.assertTrue(frame.isReply());
+    }
+
+    @Test
+    public void testGenerateParseOneByteAtATime() throws Exception
+    {
+        PingGenerator generator = new PingGenerator(new HeaderGenerator());
+
+        final List<PingFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onPing(PingFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        byte[] payload = new byte[8];
+        new Random().nextBytes(payload);
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        generator.generatePing(lease, payload, true);
+
+        for (ByteBuffer buffer : lease.getByteBuffers())
+        {
+            while (buffer.hasRemaining())
+            {
+                parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
+            }
+        }
+
+        Assert.assertEquals(1, frames.size());
+        PingFrame frame = frames.get(0);
+        Assert.assertArrayEquals(payload, frame.getPayload());
+        Assert.assertTrue(frame.isReply());
+    }
+
+    @Test
+    public void testPayloadAsLong() throws Exception
+    {
+        PingGenerator generator = new PingGenerator(new HeaderGenerator());
+
+        final List<PingFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onPing(PingFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        PingFrame ping = new PingFrame(System.nanoTime(), true);
+        generator.generate(lease, ping);
+
+        for (ByteBuffer buffer : lease.getByteBuffers())
+        {
+            while (buffer.hasRemaining())
+            {
+                parser.parse(buffer);
+            }
+        }
+
+        Assert.assertEquals(1, frames.size());
+        PingFrame pong = frames.get(0);
+        Assert.assertEquals(ping.getPayloadAsLong(), pong.getPayloadAsLong());
+        Assert.assertTrue(pong.isReply());
+    }
+}
diff --git a/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/PriorityGenerateParseTest.java b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/PriorityGenerateParseTest.java
new file mode 100644
index 0000000..44dbc0c
--- /dev/null
+++ b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/PriorityGenerateParseTest.java
@@ -0,0 +1,119 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jetty.http2.generator.HeaderGenerator;
+import org.eclipse.jetty.http2.generator.PriorityGenerator;
+import org.eclipse.jetty.http2.parser.Parser;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.MappedByteBufferPool;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class PriorityGenerateParseTest
+{
+    private final ByteBufferPool byteBufferPool = new MappedByteBufferPool();
+
+    @Test
+    public void testGenerateParse() throws Exception
+    {
+        PriorityGenerator generator = new PriorityGenerator(new HeaderGenerator());
+
+        final List<PriorityFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onPriority(PriorityFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        int streamId = 13;
+        int parentStreamId = 17;
+        int weight = 256;
+        boolean exclusive = true;
+
+        // Iterate a few times to be sure generator and parser are properly reset.
+        for (int i = 0; i < 2; ++i)
+        {
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            generator.generatePriority(lease, streamId, parentStreamId, weight, exclusive);
+
+            frames.clear();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+            {
+                while (buffer.hasRemaining())
+                {
+                    parser.parse(buffer);
+                }
+            }
+        }
+
+        Assert.assertEquals(1, frames.size());
+        PriorityFrame frame = frames.get(0);
+        Assert.assertEquals(streamId, frame.getStreamId());
+        Assert.assertEquals(parentStreamId, frame.getParentStreamId());
+        Assert.assertEquals(weight, frame.getWeight());
+        Assert.assertEquals(exclusive, frame.isExclusive());
+    }
+
+    @Test
+    public void testGenerateParseOneByteAtATime() throws Exception
+    {
+        PriorityGenerator generator = new PriorityGenerator(new HeaderGenerator());
+
+        final List<PriorityFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onPriority(PriorityFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        int streamId = 13;
+        int parentStreamId = 17;
+        int weight = 3;
+        boolean exclusive = true;
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        generator.generatePriority(lease, streamId, parentStreamId, weight, exclusive);
+
+        for (ByteBuffer buffer : lease.getByteBuffers())
+        {
+            while (buffer.hasRemaining())
+            {
+                parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
+            }
+        }
+
+        Assert.assertEquals(1, frames.size());
+        PriorityFrame frame = frames.get(0);
+        Assert.assertEquals(streamId, frame.getStreamId());
+        Assert.assertEquals(parentStreamId, frame.getParentStreamId());
+        Assert.assertEquals(weight, frame.getWeight());
+        Assert.assertEquals(exclusive, frame.isExclusive());
+    }
+}
diff --git a/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/PushPromiseGenerateParseTest.java b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/PushPromiseGenerateParseTest.java
new file mode 100644
index 0000000..78a08f9
--- /dev/null
+++ b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/PushPromiseGenerateParseTest.java
@@ -0,0 +1,142 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jetty.http.HostPortHttpField;
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpScheme;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.generator.HeaderGenerator;
+import org.eclipse.jetty.http2.generator.PushPromiseGenerator;
+import org.eclipse.jetty.http2.hpack.HpackEncoder;
+import org.eclipse.jetty.http2.parser.Parser;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.MappedByteBufferPool;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class PushPromiseGenerateParseTest
+{
+    private final ByteBufferPool byteBufferPool = new MappedByteBufferPool();
+
+    @Test
+    public void testGenerateParse() throws Exception
+    {
+        PushPromiseGenerator generator = new PushPromiseGenerator(new HeaderGenerator(), new HpackEncoder());
+
+        final List<PushPromiseFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onPushPromise(PushPromiseFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        int streamId = 13;
+        int promisedStreamId = 17;
+        HttpFields fields = new HttpFields();
+        fields.put("Accept", "text/html");
+        fields.put("User-Agent", "Jetty");
+        MetaData.Request metaData = new MetaData.Request("GET", HttpScheme.HTTP, new HostPortHttpField("localhost:8080"), "/path", HttpVersion.HTTP_2, fields);
+
+        // Iterate a few times to be sure generator and parser are properly reset.
+        for (int i = 0; i < 2; ++i)
+        {
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            generator.generatePushPromise(lease, streamId, promisedStreamId, metaData);
+
+            frames.clear();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+            {
+                while (buffer.hasRemaining())
+                {
+                    parser.parse(buffer);
+                }
+            }
+
+            Assert.assertEquals(1, frames.size());
+            PushPromiseFrame frame = frames.get(0);
+            Assert.assertEquals(streamId, frame.getStreamId());
+            Assert.assertEquals(promisedStreamId, frame.getPromisedStreamId());
+            MetaData.Request request = (MetaData.Request)frame.getMetaData();
+            Assert.assertEquals(metaData.getMethod(), request.getMethod());
+            Assert.assertEquals(metaData.getURI(), request.getURI());
+            for (int j = 0; j < fields.size(); ++j)
+            {
+                HttpField field = fields.getField(j);
+                Assert.assertTrue(request.getFields().contains(field));
+            }
+        }
+    }
+
+    @Test
+    public void testGenerateParseOneByteAtATime() throws Exception
+    {
+        PushPromiseGenerator generator = new PushPromiseGenerator(new HeaderGenerator(), new HpackEncoder());
+
+        final List<PushPromiseFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onPushPromise(PushPromiseFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        int streamId = 13;
+        int promisedStreamId = 17;
+        HttpFields fields = new HttpFields();
+        fields.put("Accept", "text/html");
+        fields.put("User-Agent", "Jetty");
+        MetaData.Request metaData = new MetaData.Request("GET", HttpScheme.HTTP, new HostPortHttpField("localhost:8080"), "/path", HttpVersion.HTTP_2, fields);
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        generator.generatePushPromise(lease, streamId, promisedStreamId, metaData);
+
+        for (ByteBuffer buffer : lease.getByteBuffers())
+        {
+            while (buffer.hasRemaining())
+            {
+                parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
+            }
+        }
+
+        Assert.assertEquals(1, frames.size());
+        PushPromiseFrame frame = frames.get(0);
+        Assert.assertEquals(streamId, frame.getStreamId());
+        Assert.assertEquals(promisedStreamId, frame.getPromisedStreamId());
+        MetaData.Request request = (MetaData.Request)frame.getMetaData();
+        Assert.assertEquals(metaData.getMethod(), request.getMethod());
+        Assert.assertEquals(metaData.getURI(), request.getURI());
+        for (int j = 0; j < fields.size(); ++j)
+        {
+            HttpField field = fields.getField(j);
+            Assert.assertTrue(request.getFields().contains(field));
+        }
+    }
+}
diff --git a/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/ResetGenerateParseTest.java b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/ResetGenerateParseTest.java
new file mode 100644
index 0000000..66633e6
--- /dev/null
+++ b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/ResetGenerateParseTest.java
@@ -0,0 +1,111 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jetty.http2.generator.HeaderGenerator;
+import org.eclipse.jetty.http2.generator.ResetGenerator;
+import org.eclipse.jetty.http2.parser.Parser;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.MappedByteBufferPool;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ResetGenerateParseTest
+{
+    private final ByteBufferPool byteBufferPool = new MappedByteBufferPool();
+
+    @Test
+    public void testGenerateParse() throws Exception
+    {
+        ResetGenerator generator = new ResetGenerator(new HeaderGenerator());
+
+        final List<ResetFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onReset(ResetFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        int streamId = 13;
+        int error = 17;
+
+        // Iterate a few times to be sure generator and parser are properly reset.
+        for (int i = 0; i < 2; ++i)
+        {
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            generator.generateReset(lease, streamId, error);
+
+            frames.clear();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+            {
+                while (buffer.hasRemaining())
+                {
+                    parser.parse(buffer);
+                }
+            }
+        }
+
+        Assert.assertEquals(1, frames.size());
+        ResetFrame frame = frames.get(0);
+        Assert.assertEquals(streamId, frame.getStreamId());
+        Assert.assertEquals(error, frame.getError());
+    }
+
+    @Test
+    public void testGenerateParseOneByteAtATime() throws Exception
+    {
+        ResetGenerator generator = new ResetGenerator(new HeaderGenerator());
+
+        final List<ResetFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onReset(ResetFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        int streamId = 13;
+        int error = 17;
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        generator.generateReset(lease, streamId, error);
+
+        for (ByteBuffer buffer : lease.getByteBuffers())
+        {
+            while (buffer.hasRemaining())
+            {
+                parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
+            }
+        }
+
+        Assert.assertEquals(1, frames.size());
+        ResetFrame frame = frames.get(0);
+        Assert.assertEquals(streamId, frame.getStreamId());
+        Assert.assertEquals(error, frame.getError());
+    }
+}
diff --git a/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/SettingsGenerateParseTest.java b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/SettingsGenerateParseTest.java
new file mode 100644
index 0000000..15343f4
--- /dev/null
+++ b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/SettingsGenerateParseTest.java
@@ -0,0 +1,176 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.generator.HeaderGenerator;
+import org.eclipse.jetty.http2.generator.SettingsGenerator;
+import org.eclipse.jetty.http2.parser.Parser;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.MappedByteBufferPool;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SettingsGenerateParseTest
+{
+    private final ByteBufferPool byteBufferPool = new MappedByteBufferPool();
+
+    @Test
+    public void testGenerateParseNoSettings() throws Exception
+    {
+        List<SettingsFrame> frames = testGenerateParse(Collections.<Integer, Integer>emptyMap());
+        Assert.assertEquals(1, frames.size());
+        SettingsFrame frame = frames.get(0);
+        Assert.assertEquals(0, frame.getSettings().size());
+        Assert.assertTrue(frame.isReply());
+    }
+
+    @Test
+    public void testGenerateParseSettings() throws Exception
+    {
+        Map<Integer, Integer> settings1 = new HashMap<>();
+        int key1 = 13;
+        Integer value1 = 17;
+        settings1.put(key1, value1);
+        int key2 = 19;
+        Integer value2 = 23;
+        settings1.put(key2, value2);
+        List<SettingsFrame> frames = testGenerateParse(settings1);
+        Assert.assertEquals(1, frames.size());
+        SettingsFrame frame = frames.get(0);
+        Map<Integer, Integer> settings2 = frame.getSettings();
+        Assert.assertEquals(2, settings2.size());
+        Assert.assertEquals(value1, settings2.get(key1));
+        Assert.assertEquals(value2, settings2.get(key2));
+    }
+
+    private List<SettingsFrame> testGenerateParse(Map<Integer, Integer> settings)
+    {
+        SettingsGenerator generator = new SettingsGenerator(new HeaderGenerator());
+
+        final List<SettingsFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onSettings(SettingsFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        // Iterate a few times to be sure generator and parser are properly reset.
+        for (int i = 0; i < 2; ++i)
+        {
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            generator.generateSettings(lease, settings, true);
+
+            frames.clear();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+            {
+                while (buffer.hasRemaining())
+                {
+                    parser.parse(buffer);
+                }
+            }
+        }
+
+        return frames;
+    }
+
+    @Test
+    public void testGenerateParseInvalidSettings() throws Exception
+    {
+        SettingsGenerator generator = new SettingsGenerator(new HeaderGenerator());
+
+        final AtomicInteger errorRef = new AtomicInteger();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onConnectionFailure(int error, String reason)
+            {
+                errorRef.set(error);
+            }
+        }, 4096, 8192);
+
+        Map<Integer, Integer> settings1 = new HashMap<>();
+        settings1.put(13, 17);
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        generator.generateSettings(lease, settings1, true);
+        // Modify the length of the frame to make it invalid
+        ByteBuffer bytes = lease.getByteBuffers().get(0);
+        bytes.putShort(1, (short)(bytes.getShort(1) - 1));
+
+        for (ByteBuffer buffer : lease.getByteBuffers())
+        {
+            while (buffer.hasRemaining())
+            {
+                parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
+            }
+        }
+
+        Assert.assertEquals(ErrorCode.FRAME_SIZE_ERROR.code, errorRef.get());
+    }
+
+    @Test
+    public void testGenerateParseOneByteAtATime() throws Exception
+    {
+        SettingsGenerator generator = new SettingsGenerator(new HeaderGenerator());
+
+        final List<SettingsFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onSettings(SettingsFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        Map<Integer, Integer> settings1 = new HashMap<>();
+        int key = 13;
+        Integer value = 17;
+        settings1.put(key, value);
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        generator.generateSettings(lease, settings1, true);
+
+        for (ByteBuffer buffer : lease.getByteBuffers())
+        {
+            while (buffer.hasRemaining())
+            {
+                parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
+            }
+        }
+
+        Assert.assertEquals(1, frames.size());
+        SettingsFrame frame = frames.get(0);
+        Map<Integer, Integer> settings2 = frame.getSettings();
+        Assert.assertEquals(1, settings2.size());
+        Assert.assertEquals(value, settings2.get(key));
+        Assert.assertTrue(frame.isReply());
+    }
+}
diff --git a/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/WindowUpdateGenerateParseTest.java b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/WindowUpdateGenerateParseTest.java
new file mode 100644
index 0000000..3cd2e6b
--- /dev/null
+++ b/jetty-http2/http2-common/src/test/java/org/eclipse/jetty/http2/frames/WindowUpdateGenerateParseTest.java
@@ -0,0 +1,111 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.frames;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jetty.http2.generator.HeaderGenerator;
+import org.eclipse.jetty.http2.generator.WindowUpdateGenerator;
+import org.eclipse.jetty.http2.parser.Parser;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.MappedByteBufferPool;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class WindowUpdateGenerateParseTest
+{
+    private final ByteBufferPool byteBufferPool = new MappedByteBufferPool();
+
+    @Test
+    public void testGenerateParse() throws Exception
+    {
+        WindowUpdateGenerator generator = new WindowUpdateGenerator(new HeaderGenerator());
+
+        final List<WindowUpdateFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onWindowUpdate(WindowUpdateFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        int streamId = 13;
+        int windowUpdate = 17;
+
+        // Iterate a few times to be sure generator and parser are properly reset.
+        for (int i = 0; i < 2; ++i)
+        {
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            generator.generateWindowUpdate(lease, streamId, windowUpdate);
+
+            frames.clear();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+            {
+                while (buffer.hasRemaining())
+                {
+                    parser.parse(buffer);
+                }
+            }
+        }
+
+        Assert.assertEquals(1, frames.size());
+        WindowUpdateFrame frame = frames.get(0);
+        Assert.assertEquals(streamId, frame.getStreamId());
+        Assert.assertEquals(windowUpdate, frame.getWindowDelta());
+    }
+
+    @Test
+    public void testGenerateParseOneByteAtATime() throws Exception
+    {
+        WindowUpdateGenerator generator = new WindowUpdateGenerator(new HeaderGenerator());
+
+        final List<WindowUpdateFrame> frames = new ArrayList<>();
+        Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+        {
+            @Override
+            public void onWindowUpdate(WindowUpdateFrame frame)
+            {
+                frames.add(frame);
+            }
+        }, 4096, 8192);
+
+        int streamId = 13;
+        int windowUpdate = 17;
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        generator.generateWindowUpdate(lease, streamId, windowUpdate);
+
+        for (ByteBuffer buffer : lease.getByteBuffers())
+        {
+            while (buffer.hasRemaining())
+            {
+                parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
+            }
+        }
+
+        Assert.assertEquals(1, frames.size());
+        WindowUpdateFrame frame = frames.get(0);
+        Assert.assertEquals(streamId, frame.getStreamId());
+        Assert.assertEquals(windowUpdate, frame.getWindowDelta());
+    }
+}
diff --git a/jetty-http2/http2-common/src/test/resources/jetty-logging.properties b/jetty-http2/http2-common/src/test/resources/jetty-logging.properties
new file mode 100644
index 0000000..b4e4380
--- /dev/null
+++ b/jetty-http2/http2-common/src/test/resources/jetty-logging.properties
@@ -0,0 +1,2 @@
+org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
+org.eclipse.jetty.http2.LEVEL=INFO
diff --git a/jetty-http2/http2-hpack/pom.xml b/jetty-http2/http2-hpack/pom.xml
new file mode 100644
index 0000000..9773d61
--- /dev/null
+++ b/jetty-http2/http2-hpack/pom.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+    <groupId>org.eclipse.jetty.http2</groupId>
+    <artifactId>http2-parent</artifactId>
+    <version>9.3.6-SNAPSHOT</version>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>http2-hpack</artifactId>
+  <name>Jetty :: HTTP2 :: HPACK</name>
+
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.hpack</bundle-symbolic-name>
+  </properties>
+  <dependencies>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-util</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-http</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-io</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.toolchain</groupId>
+      <artifactId>jetty-test-helper</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-util-ajax</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+  </build>
+
+</project>
diff --git a/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/AuthorityHttpField.java b/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/AuthorityHttpField.java
new file mode 100644
index 0000000..bae1c4a
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/AuthorityHttpField.java
@@ -0,0 +1,43 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.http2.hpack;
+
+import org.eclipse.jetty.http.HostPortHttpField;
+import org.eclipse.jetty.http.HttpHeader;
+
+
+/* ------------------------------------------------------------ */
+/**
+ */
+public class AuthorityHttpField extends HostPortHttpField
+{
+    public final static String AUTHORITY = HpackContext.STATIC_TABLE[1][0];
+    
+    public AuthorityHttpField(String authority)
+    {
+        super(HttpHeader.C_AUTHORITY,AUTHORITY,authority);
+    }
+    
+    @Override
+    public String toString()
+    {
+        return String.format("%s(preparsed h=%s p=%d)",super.toString(),getHost(),getPort());
+    }
+}
diff --git a/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/HpackContext.java b/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/HpackContext.java
new file mode 100644
index 0000000..468d47b
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/HpackContext.java
@@ -0,0 +1,515 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.hpack;
+
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpScheme;
+import org.eclipse.jetty.util.ArrayQueue;
+import org.eclipse.jetty.util.ArrayTernaryTrie;
+import org.eclipse.jetty.util.StringUtil;
+import org.eclipse.jetty.util.Trie;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+
+/* ------------------------------------------------------------ */
+/** HPACK - Header Compression for HTTP/2
+ * <p>This class maintains the compression context for a single HTTP/2
+ * connection. Specifically it holds the static and dynamic Header Field Tables
+ * and the associated sizes and limits.
+ * </p>
+ * <p>It is compliant with draft 11 of the specification</p>
+ */
+public class HpackContext
+{
+    public static final Logger LOG = Log.getLogger(HpackContext.class);
+    
+    public static final String[][] STATIC_TABLE = 
+    {
+        {null,null},
+        /* 1  */ {":authority",null},
+        /* 2  */ {":method","GET"},
+        /* 3  */ {":method","POST"},
+        /* 4  */ {":path","/"},
+        /* 5  */ {":path","/index.html"},
+        /* 6  */ {":scheme","http"},
+        /* 7  */ {":scheme","https"},
+        /* 8  */ {":status","200"},
+        /* 9  */ {":status","204"},
+        /* 10 */ {":status","206"},
+        /* 11 */ {":status","304"},
+        /* 12 */ {":status","400"},
+        /* 13 */ {":status","404"},
+        /* 14 */ {":status","500"},
+        /* 15 */ {"accept-charset",null},
+        /* 16 */ {"accept-encoding","gzip, deflate"},
+        /* 17 */ {"accept-language",null},
+        /* 18 */ {"accept-ranges",null},
+        /* 19 */ {"accept",null},
+        /* 20 */ {"access-control-allow-origin",null},
+        /* 21 */ {"age",null},
+        /* 22 */ {"allow",null},
+        /* 23 */ {"authorization",null},
+        /* 24 */ {"cache-control",null},
+        /* 25 */ {"content-disposition",null},
+        /* 26 */ {"content-encoding",null},
+        /* 27 */ {"content-language",null},
+        /* 28 */ {"content-length",null},
+        /* 29 */ {"content-location",null},
+        /* 30 */ {"content-range",null},
+        /* 31 */ {"content-type",null},
+        /* 32 */ {"cookie",null},
+        /* 33 */ {"date",null},
+        /* 34 */ {"etag",null},
+        /* 35 */ {"expect",null},
+        /* 36 */ {"expires",null},
+        /* 37 */ {"from",null},
+        /* 38 */ {"host",null},
+        /* 39 */ {"if-match",null},
+        /* 40 */ {"if-modified-since",null},
+        /* 41 */ {"if-none-match",null},
+        /* 42 */ {"if-range",null},
+        /* 43 */ {"if-unmodified-since",null},
+        /* 44 */ {"last-modified",null},
+        /* 45 */ {"link",null},
+        /* 46 */ {"location",null},
+        /* 47 */ {"max-forwards",null},
+        /* 48 */ {"proxy-authenticate",null},
+        /* 49 */ {"proxy-authorization",null},
+        /* 50 */ {"range",null},
+        /* 51 */ {"referer",null},
+        /* 52 */ {"refresh",null},
+        /* 53 */ {"retry-after",null},
+        /* 54 */ {"server",null},
+        /* 55 */ {"set-cookie",null},
+        /* 56 */ {"strict-transport-security",null},
+        /* 57 */ {"transfer-encoding",null},
+        /* 58 */ {"user-agent",null},
+        /* 59 */ {"vary",null},
+        /* 60 */ {"via",null},
+        /* 61 */ {"www-authenticate",null},
+    };
+    
+    private static final Map<HttpField,Entry> __staticFieldMap = new HashMap<>();
+    private static final Trie<StaticEntry> __staticNameMap = new ArrayTernaryTrie<>(true,512);
+    private static final StaticEntry[] __staticTableByHeader = new StaticEntry[HttpHeader.UNKNOWN.ordinal()];
+    private static final StaticEntry[] __staticTable=new StaticEntry[STATIC_TABLE.length];
+    static
+    {
+        Set<String> added = new HashSet<>();
+        for (int i=1;i<STATIC_TABLE.length;i++)
+        {
+            StaticEntry entry=null;
+
+            String name  = STATIC_TABLE[i][0];
+            String value = STATIC_TABLE[i][1];
+            HttpHeader header = HttpHeader.CACHE.get(name);
+            if (header!=null && value!=null)
+            {
+                switch (header)
+                {
+                    case C_METHOD:
+                    {
+                        
+                        HttpMethod method = HttpMethod.CACHE.get(value);
+                        if (method!=null)
+                            entry=new StaticEntry(i,new StaticTableHttpField(header,name,value,method));
+                        break;
+                    }
+                    
+                    case C_SCHEME:
+                    {
+                        
+                        HttpScheme scheme = HttpScheme.CACHE.get(value);
+                        if (scheme!=null)
+                            entry=new StaticEntry(i,new StaticTableHttpField(header,name,value,scheme));
+                        break;
+                    }
+                    
+                    case C_STATUS:
+                    {
+                        entry=new StaticEntry(i,new StaticTableHttpField(header,name,value,Integer.valueOf(value)));
+                        break;
+                    }
+                    
+                    default:
+                        break;
+                }
+            }
+            
+            if (entry==null)
+                entry=new StaticEntry(i,header==null?new HttpField(STATIC_TABLE[i][0],value):new HttpField(header,name,value));
+            
+                        
+            __staticTable[i]=entry;
+            
+            if (entry._field.getValue()!=null)
+                __staticFieldMap.put(entry._field,entry);
+            
+            if (!added.contains(entry._field.getName()))
+            {
+                added.add(entry._field.getName());
+                __staticNameMap.put(entry._field.getName(),entry);
+                if (__staticNameMap.get(entry._field.getName())==null)
+                    throw new IllegalStateException("name trie too small");
+            }
+        }
+        
+        for (HttpHeader h : HttpHeader.values())
+        {
+            StaticEntry entry = __staticNameMap.get(h.asString());
+            if (entry!=null)
+                __staticTableByHeader[h.ordinal()]=entry;
+        }
+    }
+    
+    private int _maxDynamicTableSizeInBytes;
+    private int _dynamicTableSizeInBytes;
+    private final DynamicTable _dynamicTable;
+    private final Map<HttpField,Entry> _fieldMap = new HashMap<>();
+    private final Map<String,Entry> _nameMap = new HashMap<>();
+    
+    HpackContext(int maxDynamicTableSize)
+    {
+        _maxDynamicTableSizeInBytes=maxDynamicTableSize;
+        int guesstimateEntries = 10+maxDynamicTableSize/(32+10+10);
+        _dynamicTable=new DynamicTable(guesstimateEntries,guesstimateEntries+10);
+        if (LOG.isDebugEnabled())
+            LOG.debug(String.format("HdrTbl[%x] created max=%d",hashCode(),maxDynamicTableSize));
+    }
+    
+    public void resize(int newMaxDynamicTableSize)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug(String.format("HdrTbl[%x] resized max=%d->%d",hashCode(),_maxDynamicTableSizeInBytes,newMaxDynamicTableSize));
+        _maxDynamicTableSizeInBytes=newMaxDynamicTableSize;
+        int guesstimateEntries = 10+newMaxDynamicTableSize/(32+10+10);
+        evict();
+        _dynamicTable.resizeUnsafe(guesstimateEntries);
+    }
+    
+    public Entry get(HttpField field)
+    {
+        Entry entry = _fieldMap.get(field);
+        if (entry==null)
+            entry=__staticFieldMap.get(field);
+        return entry;
+    }
+    
+    public Entry get(String name)
+    {
+        Entry entry = __staticNameMap.get(name);
+        if (entry!=null)
+            return entry;
+        return _nameMap.get(StringUtil.asciiToLowerCase(name));
+    }
+    
+    public Entry get(int index)
+    {
+        if (index<__staticTable.length)
+            return __staticTable[index];
+            
+        int d=_dynamicTable.size()-index+__staticTable.length-1;
+
+        if (d>=0) 
+            return _dynamicTable.getUnsafe(d);      
+        return null;
+    }
+    
+    public Entry get(HttpHeader header)
+    {
+        Entry e = __staticTableByHeader[header.ordinal()];
+        if (e==null)
+            return get(header.asString());
+        return e;
+    }
+
+    public static Entry getStatic(HttpHeader header)
+    {
+        return __staticTableByHeader[header.ordinal()];
+    }
+    
+    public Entry add(HttpField field)
+    {
+        int slot=_dynamicTable.getNextSlotUnsafe();
+        Entry entry=new Entry(slot,field);
+        int size = entry.getSize();
+        if (size>_maxDynamicTableSizeInBytes)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug(String.format("HdrTbl[%x] !added size %d>%d",hashCode(),size,_maxDynamicTableSizeInBytes));
+            return null;
+        }
+        _dynamicTableSizeInBytes+=size;
+        _dynamicTable.addUnsafe(entry);
+        _fieldMap.put(field,entry);
+        _nameMap.put(StringUtil.asciiToLowerCase(field.getName()),entry);
+
+        if (LOG.isDebugEnabled())
+            LOG.debug(String.format("HdrTbl[%x] added %s",hashCode(),entry));
+        evict();
+        return entry;
+    }
+
+    /**
+     * @return Current dynamic table size in entries
+     */
+    public int size()
+    {
+        return _dynamicTable.size();
+    }
+    
+    /**
+     * @return Current Dynamic table size in Octets
+     */
+    public int getDynamicTableSize()
+    {
+        return _dynamicTableSizeInBytes;
+    }
+
+    /**
+     * @return Max Dynamic table size in Octets
+     */
+    public int getMaxDynamicTableSize()
+    {
+        return _maxDynamicTableSizeInBytes;
+    }
+
+    public int index(Entry entry)
+    {
+        if (entry._slot<0)
+            return 0;
+        if (entry.isStatic())
+            return entry._slot;
+
+        return _dynamicTable.index(entry)+__staticTable.length-1;
+    }
+    
+    public static int staticIndex(HttpHeader header)
+    {
+        if (header==null)
+            return 0;
+        Entry entry=__staticNameMap.get(header.asString());
+        if (entry==null)
+            return 0;
+        return entry.getSlot();
+    }
+    
+    private void evict()
+    {
+        while (_dynamicTableSizeInBytes>_maxDynamicTableSizeInBytes)
+        {
+            Entry entry = _dynamicTable.pollUnsafe();
+            if (LOG.isDebugEnabled())
+                LOG.debug(String.format("HdrTbl[%x] evict %s",hashCode(),entry));
+            _dynamicTableSizeInBytes-=entry.getSize();
+            entry._slot=-1;
+            _fieldMap.remove(entry.getHttpField());
+            String lc=StringUtil.asciiToLowerCase(entry.getHttpField().getName());
+            if (entry==_nameMap.get(lc))
+                _nameMap.remove(lc);
+        }
+        if (LOG.isDebugEnabled())
+            LOG.debug(String.format("HdrTbl[%x] entries=%d, size=%d, max=%d",hashCode(),_dynamicTable.size(),_dynamicTableSizeInBytes,_maxDynamicTableSizeInBytes));
+    }
+    
+    @Override
+    public String toString()
+    {
+        return String.format("HpackContext@%x{entries=%d,size=%d,max=%d}",hashCode(),_dynamicTable.size(),_dynamicTableSizeInBytes,_maxDynamicTableSizeInBytes);
+    }
+    
+    
+    
+    /* ------------------------------------------------------------ */
+    /**
+     */
+    private class DynamicTable extends ArrayQueue<HpackContext.Entry>
+    {
+        /* ------------------------------------------------------------ */
+        /**
+         * @param initCapacity
+         * @param growBy
+         */
+        private DynamicTable(int initCapacity, int growBy)
+        {
+            super(initCapacity,growBy);
+        }
+
+        /* ------------------------------------------------------------ */
+        /**
+         * @see org.eclipse.jetty.util.ArrayQueue#growUnsafe()
+         */
+        @Override
+        protected void resizeUnsafe(int newCapacity)
+        {
+            // Relay on super.growUnsafe to pack all entries 0 to _nextSlot
+            super.resizeUnsafe(newCapacity);
+            for (int s=0;s<_nextSlot;s++)
+                ((Entry)_elements[s])._slot=s;
+        }
+
+        /* ------------------------------------------------------------ */
+        /**
+         * @see org.eclipse.jetty.util.ArrayQueue#enqueue(java.lang.Object)
+         */
+        @Override
+        public boolean enqueue(Entry e)
+        {
+            return super.enqueue(e);
+        }
+
+        /* ------------------------------------------------------------ */
+        /**
+         * @see org.eclipse.jetty.util.ArrayQueue#dequeue()
+         */
+        @Override
+        public Entry dequeue()
+        {
+            return super.dequeue();
+        }
+        
+        /* ------------------------------------------------------------ */
+        /**
+         * @param entry
+         * @return
+         */
+        private int index(Entry entry)
+        {
+            return entry._slot>=_nextE?_size-entry._slot+_nextE:_nextSlot-entry._slot;
+        }
+
+    }
+
+
+
+    /* ------------------------------------------------------------ */
+    /* ------------------------------------------------------------ */
+    /* ------------------------------------------------------------ */
+    public static class Entry
+    {
+        final HttpField _field;
+        int _slot;
+        
+        Entry()
+        {    
+            _slot=0;
+            _field=null;
+        }
+        
+        Entry(int index,String name, String value)
+        {    
+            _slot=index;
+            _field=new HttpField(name,value);
+        }
+        
+        Entry(int slot, HttpField field)
+        {    
+            _slot=slot;
+            _field=field;
+        }
+
+        public int getSize()
+        {
+            return 32+_field.getName().length()+_field.getValue().length();
+        }
+        
+        public HttpField getHttpField()
+        {
+            return _field;
+        }
+        
+        public boolean isStatic()
+        {
+            return false;
+        }
+        
+        public byte[] getStaticHuffmanValue()
+        {
+            return null;
+        }
+        
+        public int getSlot()
+        {
+            return _slot;
+        }
+        
+        public String toString()
+        {
+            return String.format("{%s,%d,%s,%x}",isStatic()?"S":"D",_slot,_field,hashCode());
+        }
+    } 
+    
+    public static class StaticEntry extends Entry
+    {
+        private final byte[] _huffmanValue;
+        private final byte _encodedField;
+        
+        StaticEntry(int index,HttpField field)
+        {    
+            super(index,field);
+            String value = field.getValue();
+            if (value!=null && value.length()>0)
+            {
+                int huffmanLen = Huffman.octetsNeeded(value);
+                int lenLen = NBitInteger.octectsNeeded(7,huffmanLen);
+                _huffmanValue = new byte[1+lenLen+huffmanLen];
+                ByteBuffer buffer = ByteBuffer.wrap(_huffmanValue); 
+                        
+                // Indicate Huffman
+                buffer.put((byte)0x80);
+                // Add huffman length
+                NBitInteger.encode(buffer,7,huffmanLen);
+                // Encode value
+                Huffman.encode(buffer,value);       
+            }
+            else
+                _huffmanValue=null;
+            
+            _encodedField=(byte)(0x80|index);
+        }
+
+        @Override
+        public boolean isStatic()
+        {
+            return true;
+        }
+        
+        @Override
+        public byte[] getStaticHuffmanValue()
+        {
+            return _huffmanValue;
+        }
+        
+        public byte getEncodedField()
+        {
+            return _encodedField;
+        }
+    }
+
+
+}
diff --git a/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/HpackDecoder.java b/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/HpackDecoder.java
new file mode 100644
index 0000000..abd791e
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/HpackDecoder.java
@@ -0,0 +1,280 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.http2.hpack;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http.BadMessageException;
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.hpack.HpackContext.Entry;
+import org.eclipse.jetty.util.TypeUtil;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+/**
+ * Hpack Decoder
+ * <p>This is not thread safe and may only be called by 1 thread at a time.</p>
+ */
+public class HpackDecoder
+{
+    public static final Logger LOG = Log.getLogger(HpackDecoder.class);
+    public final static HttpField.LongValueHttpField CONTENT_LENGTH_0 =
+            new HttpField.LongValueHttpField(HttpHeader.CONTENT_LENGTH,0L);
+
+    private final HpackContext _context;
+    private final MetaDataBuilder _builder;
+    private int _localMaxDynamicTableSize;
+
+    /**
+     * @param localMaxDynamicTableSize  The maximum allowed size of the local dynamic header field table.
+     * @param maxHeaderSize The maximum allowed size of a headers block, expressed as total of all name and value characters.
+     */
+    public HpackDecoder(int localMaxDynamicTableSize, int maxHeaderSize)
+    {
+        _context=new HpackContext(localMaxDynamicTableSize);
+        _localMaxDynamicTableSize=localMaxDynamicTableSize;
+        _builder = new MetaDataBuilder(maxHeaderSize);
+    }
+
+    public HpackContext getHpackContext()
+    {
+        return _context;
+    }
+
+    public void setLocalMaxDynamicTableSize(int localMaxdynamciTableSize)
+    {
+        _localMaxDynamicTableSize=localMaxdynamciTableSize;
+    }
+
+    public MetaData decode(ByteBuffer buffer)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug(String.format("CtxTbl[%x] decoding %d octets",_context.hashCode(),buffer.remaining()));
+
+        // If the buffer is big, don't even think about decoding it
+        if (buffer.remaining()>_builder.getMaxSize())
+            throw new BadMessageException(HttpStatus.REQUEST_ENTITY_TOO_LARGE_413,"Header frame size "+buffer.remaining()+">"+_builder.getMaxSize());
+
+
+        while(buffer.hasRemaining())
+        {
+            if (LOG.isDebugEnabled())
+            {
+                int l=Math.min(buffer.remaining(),16);
+                // TODO: not guaranteed the buffer has a backing array !
+                LOG.debug("decode {}{}",
+                        TypeUtil.toHexString(buffer.array(),buffer.arrayOffset()+buffer.position(),l),
+                        l<buffer.remaining()?"...":"");
+            }
+
+            byte b = buffer.get();
+            if (b<0)
+            {
+                // 7.1 indexed if the high bit is set
+                int index = NBitInteger.decode(buffer,7);
+                Entry entry=_context.get(index);
+                if (entry==null)
+                {
+                    throw new BadMessageException("Unknown index "+index);
+                }
+                else if (entry.isStatic())
+                {
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("decode IdxStatic {}",entry);
+                    // emit field
+                    _builder.emit(entry.getHttpField());
+
+                    // TODO copy and add to reference set if there is room
+                    // _context.add(entry.getHttpField());
+                }
+                else
+                {
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("decode Idx {}",entry);
+                    // emit
+                    _builder.emit(entry.getHttpField());
+                }
+            }
+            else
+            {
+                // look at the first nibble in detail
+                byte f= (byte)((b&0xF0)>>4);
+                String name;
+                HttpHeader header;
+                String value;
+
+                boolean indexed;
+                int name_index;
+
+                switch (f)
+                {
+                    case 2: // 7.3
+                    case 3: // 7.3
+                        // change table size
+                        int size = NBitInteger.decode(buffer,5);
+                        if (LOG.isDebugEnabled())
+                            LOG.debug("decode resize="+size);
+                        if (size>_localMaxDynamicTableSize)
+                            throw new IllegalArgumentException();
+                        _context.resize(size);
+                        continue;
+
+                    case 0: // 7.2.2
+                    case 1: // 7.2.3
+                        indexed=false;
+                        name_index=NBitInteger.decode(buffer,4);
+                        break;
+
+
+                    case 4: // 7.2.1
+                    case 5: // 7.2.1
+                    case 6: // 7.2.1
+                    case 7: // 7.2.1
+                        indexed=true;
+                        name_index=NBitInteger.decode(buffer,6);
+                        break;
+
+                    default:
+                        throw new IllegalStateException();
+                }
+
+
+                boolean huffmanName=false;
+
+                // decode the name
+                if (name_index>0)
+                {
+                    Entry name_entry=_context.get(name_index);
+                    name=name_entry.getHttpField().getName();
+                    header=name_entry.getHttpField().getHeader();
+                }
+                else
+                {
+                    huffmanName = (buffer.get()&0x80)==0x80;
+                    int length = NBitInteger.decode(buffer,7);
+                    _builder.checkSize(length,huffmanName);
+                    if (huffmanName)
+                        name=Huffman.decode(buffer,length);
+                    else
+                        name=toASCIIString(buffer,length);
+                    for (int i=0;i<name.length();i++)
+                    {
+                        char c=name.charAt(i);
+                        if (c>='A'&&c<='Z')
+                        {
+                            throw new BadMessageException(400,"Uppercase header name");
+                        }
+                    }
+                    header=HttpHeader.CACHE.get(name);
+                }
+
+                // decode the value
+                boolean huffmanValue = (buffer.get()&0x80)==0x80;
+                int length = NBitInteger.decode(buffer,7);
+                _builder.checkSize(length,huffmanValue);
+                if (huffmanValue)
+                    value=Huffman.decode(buffer,length);
+                else
+                    value=toASCIIString(buffer,length);
+
+                // Make the new field
+                HttpField field;
+                if (header==null)
+                {
+                    // just make a normal field and bypass header name lookup
+                    field = new HttpField(null,name,value);
+                }
+                else
+                {
+                    // might be worthwhile to create a value HttpField if it is indexed
+                    // and/or of a type that may be looked up multiple times.
+                    switch(header)
+                    {
+                        case C_STATUS:
+                            if (indexed)
+                                field = new HttpField.IntValueHttpField(header,name,value);
+                            else
+                                field = new HttpField(header,name,value);
+                            break;
+
+                        case C_AUTHORITY:
+                            field = new AuthorityHttpField(value);
+                            break;
+
+                        case CONTENT_LENGTH:
+                            if ("0".equals(value))
+                                field = CONTENT_LENGTH_0;
+                            else
+                                field = new HttpField.LongValueHttpField(header,name,value);
+                            break;
+
+                        default:
+                            field = new HttpField(header,name,value);
+                            break;
+                    }
+                }
+
+                if (LOG.isDebugEnabled())
+                {
+                    LOG.debug("decoded '{}' by {}/{}/{}",
+                            field,
+                            name_index > 0 ? "IdxName" : (huffmanName ? "HuffName" : "LitName"),
+                            huffmanValue ? "HuffVal" : "LitVal",
+                            indexed ? "Idx" : "");
+                }
+
+                // emit the field
+                _builder.emit(field);
+
+                // if indexed
+                if (indexed)
+                {
+                    // add to dynamic table
+                    _context.add(field);
+                }
+
+            }
+        }
+
+        return _builder.build();
+    }
+
+    public static String toASCIIString(ByteBuffer buffer,int length)
+    {
+        StringBuilder builder = new StringBuilder(length);
+        int position=buffer.position();
+        int start=buffer.arrayOffset()+ position;
+        int end=start+length;
+        buffer.position(position+length);
+        byte[] array=buffer.array();
+        for (int i=start;i<end;i++)
+            builder.append((char)(0x7f&array[i]));
+        return builder.toString();
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("HpackDecoder@%x{%s}",hashCode(),_context);
+    }
+}
diff --git a/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/HpackEncoder.java b/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/HpackEncoder.java
new file mode 100644
index 0000000..3cddcd0
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/HpackEncoder.java
@@ -0,0 +1,354 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.http2.hpack;
+
+import java.nio.ByteBuffer;
+import java.util.EnumSet;
+
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpScheme;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http.PreEncodedHttpField;
+import org.eclipse.jetty.http2.hpack.HpackContext.Entry;
+import org.eclipse.jetty.http2.hpack.HpackContext.StaticEntry;
+import org.eclipse.jetty.util.TypeUtil;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+public class HpackEncoder
+{
+    public static final Logger LOG = Log.getLogger(HpackEncoder.class);
+
+    private final static HttpField[] __status= new HttpField[599];
+
+
+    final static EnumSet<HttpHeader> __DO_NOT_HUFFMAN =
+            EnumSet.of(
+                    HttpHeader.AUTHORIZATION,
+                    HttpHeader.CONTENT_MD5,
+                    HttpHeader.PROXY_AUTHENTICATE,
+                    HttpHeader.PROXY_AUTHORIZATION);
+
+    final static EnumSet<HttpHeader> __DO_NOT_INDEX =
+            EnumSet.of(
+                    // HttpHeader.C_PATH,  // TODO more data needed
+                    // HttpHeader.DATE,    // TODO more data needed
+                    HttpHeader.AUTHORIZATION,
+                    HttpHeader.CONTENT_MD5,
+                    HttpHeader.CONTENT_RANGE,
+                    HttpHeader.ETAG,
+                    HttpHeader.IF_MODIFIED_SINCE,
+                    HttpHeader.IF_UNMODIFIED_SINCE,
+                    HttpHeader.IF_NONE_MATCH,
+                    HttpHeader.IF_RANGE,
+                    HttpHeader.IF_MATCH,
+                    HttpHeader.LOCATION,
+                    HttpHeader.RANGE,
+                    HttpHeader.RETRY_AFTER,
+                    // HttpHeader.EXPIRES,
+                    HttpHeader.LAST_MODIFIED,
+                    HttpHeader.SET_COOKIE,
+                    HttpHeader.SET_COOKIE2);
+
+
+    final static EnumSet<HttpHeader> __NEVER_INDEX =
+            EnumSet.of(
+                    HttpHeader.AUTHORIZATION,
+                    HttpHeader.SET_COOKIE,
+                    HttpHeader.SET_COOKIE2);
+
+    static
+    {
+        for (HttpStatus.Code code : HttpStatus.Code.values())
+            __status[code.getCode()]=new PreEncodedHttpField(HttpHeader.C_STATUS,Integer.toString(code.getCode()));
+    }
+
+    private final HpackContext _context;
+    private final boolean _debug;
+    private int _remoteMaxDynamicTableSize;
+    private int _localMaxDynamicTableSize;
+
+    public HpackEncoder()
+    {
+        this(4096,4096);
+    }
+
+    public HpackEncoder(int localMaxDynamicTableSize)
+    {
+        this(localMaxDynamicTableSize,4096);
+    }
+
+    public HpackEncoder(int localMaxDynamicTableSize,int remoteMaxDynamicTableSize)
+    {
+        _context=new HpackContext(remoteMaxDynamicTableSize);
+        _remoteMaxDynamicTableSize=remoteMaxDynamicTableSize;
+        _localMaxDynamicTableSize=localMaxDynamicTableSize;
+        _debug=LOG.isDebugEnabled();
+    }
+
+    public HpackContext getHpackContext()
+    {
+        return _context;
+    }
+
+    public void setRemoteMaxDynamicTableSize(int remoteMaxDynamicTableSize)
+    {
+        _remoteMaxDynamicTableSize=remoteMaxDynamicTableSize;
+    }
+
+    public void setLocalMaxDynamicTableSize(int localMaxDynamicTableSize)
+    {
+        _localMaxDynamicTableSize=localMaxDynamicTableSize;
+    }
+
+    public void encode(ByteBuffer buffer, MetaData metadata)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug(String.format("CtxTbl[%x] encoding",_context.hashCode()));
+
+        int pos = buffer.position();
+
+        // Check the dynamic table sizes!
+        int maxDynamicTableSize=Math.min(_remoteMaxDynamicTableSize,_localMaxDynamicTableSize);
+        if (maxDynamicTableSize!=_context.getMaxDynamicTableSize())
+            encodeMaxDynamicTableSize(buffer,maxDynamicTableSize);
+
+        // Add Request/response meta fields
+        if (metadata.isRequest())
+        {
+            MetaData.Request request = (MetaData.Request)metadata;
+
+            // TODO optimise these to avoid HttpField creation
+            String scheme=request.getURI().getScheme();
+            encode(buffer,new HttpField(HttpHeader.C_SCHEME,scheme==null?HttpScheme.HTTP.asString():scheme));
+            encode(buffer,new HttpField(HttpHeader.C_METHOD,request.getMethod()));
+            encode(buffer,new HttpField(HttpHeader.C_AUTHORITY,request.getURI().getAuthority()));
+            encode(buffer,new HttpField(HttpHeader.C_PATH,request.getURI().getPathQuery()));
+
+        }
+        else if (metadata.isResponse())
+        {
+            MetaData.Response response = (MetaData.Response)metadata;
+            int code=response.getStatus();
+            HttpField status = code<__status.length?__status[code]:null;
+            if (status==null)
+                status=new HttpField.IntValueHttpField(HttpHeader.C_STATUS,code);
+            encode(buffer,status);
+        }
+
+        // Add all the other fields
+        for (HttpField field : metadata)
+            encode(buffer,field);
+
+        if (LOG.isDebugEnabled())
+            LOG.debug(String.format("CtxTbl[%x] encoded %d octets",_context.hashCode(), buffer.position() - pos));
+    }
+
+    public void encodeMaxDynamicTableSize(ByteBuffer buffer, int maxDynamicTableSize)
+    {
+        if (maxDynamicTableSize>_remoteMaxDynamicTableSize)
+            throw new IllegalArgumentException();
+        buffer.put((byte)0x20);
+        NBitInteger.encode(buffer,5,maxDynamicTableSize);
+        _context.resize(maxDynamicTableSize);
+    }
+
+    public void encode(ByteBuffer buffer, HttpField field)
+    {
+        final int p=_debug?buffer.position():-1;
+
+        String encoding=null;
+
+        // Is there an entry for the field?
+        Entry entry = _context.get(field);
+        if (entry!=null)
+        {
+            // Known field entry, so encode it as indexed
+            if (entry.isStatic())
+            {
+                buffer.put(((StaticEntry)entry).getEncodedField());
+                if (_debug)
+                    encoding="IdxFieldS1";
+            }
+            else
+            {
+                int index=_context.index(entry);
+                buffer.put((byte)0x80);
+                NBitInteger.encode(buffer,7,index);
+                if (_debug)
+                    encoding="IdxField"+(entry.isStatic()?"S":"")+(1+NBitInteger.octectsNeeded(7,index));
+            }
+        }
+        else
+        {
+            // Unknown field entry, so we will have to send literally.
+            final boolean indexed;
+
+            // But do we know it's name?
+            HttpHeader header = field.getHeader();
+
+            // Select encoding strategy
+            if (header==null)
+            {
+                // Select encoding strategy for unknown header names
+                Entry name = _context.get(field.getName());
+
+                if (field instanceof PreEncodedHttpField)
+                {
+                    int i=buffer.position();
+                    ((PreEncodedHttpField)field).putTo(buffer,HttpVersion.HTTP_2);
+                    byte b=buffer.get(i);
+                    indexed=b<0||b>=0x40;
+                    if (_debug)
+                        encoding=indexed?"PreEncodedIdx":"PreEncoded";
+                }
+                // has the custom header name been seen before?
+                else if (name==null)
+                {
+                    // unknown name and value, so let's index this just in case it is
+                    // the first time we have seen a custom name or a custom field.
+                    // unless the name is changing, this is worthwhile
+                    indexed=true;
+                    encodeName(buffer,(byte)0x40,6,field.getName(),null);
+                    encodeValue(buffer,true,field.getValue());
+                    if (_debug)
+                        encoding="LitHuffNHuffVIdx";
+                }
+                else
+                {
+                    // known custom name, but unknown value.
+                    // This is probably a custom field with changing value, so don't index.
+                    indexed=false;
+                    encodeName(buffer,(byte)0x00,4,field.getName(),null);
+                    encodeValue(buffer,true,field.getValue());
+                    if (_debug)
+                        encoding="LitHuffNHuffV!Idx";
+                }
+            }
+            else
+            {
+                // Select encoding strategy for known header names
+                Entry name = _context.get(header);
+
+                if (field instanceof PreEncodedHttpField)
+                {
+                    // Preencoded field
+                    int i=buffer.position();
+                    ((PreEncodedHttpField)field).putTo(buffer,HttpVersion.HTTP_2);
+                    byte b=buffer.get(i);
+                    indexed=b<0||b>=0x40;
+                    if (_debug)
+                        encoding=indexed?"PreEncodedIdx":"PreEncoded";
+                }
+                else if (__DO_NOT_INDEX.contains(header))
+                {
+                    // Non indexed field
+                    indexed=false;
+                    boolean never_index=__NEVER_INDEX.contains(header);
+                    boolean huffman=!__DO_NOT_HUFFMAN.contains(header);
+                    encodeName(buffer,never_index?(byte)0x10:(byte)0x00,4,header.asString(),name);
+                    encodeValue(buffer,huffman,field.getValue());
+
+                    if (_debug)
+                        encoding="Lit"+
+                                ((name==null)?"HuffN":("IdxN"+(name.isStatic()?"S":"")+(1+NBitInteger.octectsNeeded(4,_context.index(name)))))+
+                                (huffman?"HuffV":"LitV")+
+                                (indexed?"Idx":(never_index?"!!Idx":"!Idx"));
+                }
+                else if (header==HttpHeader.CONTENT_LENGTH && field.getValue().length()>1)
+                {
+                    // Non indexed content length for 2 digits or more
+                    indexed=false;
+                    encodeName(buffer,(byte)0x00,4,header.asString(),name);
+                    encodeValue(buffer,true,field.getValue());
+                    if (_debug)
+                        encoding="LitIdxNS"+(1+NBitInteger.octectsNeeded(4,_context.index(name)))+"HuffV!Idx";
+                }
+                else
+                {
+                    // indexed
+                    indexed=true;
+                    boolean huffman=!__DO_NOT_HUFFMAN.contains(header);
+                    encodeName(buffer,(byte)0x40,6,header.asString(),name);
+                    encodeValue(buffer,huffman,field.getValue());
+                    if (_debug)
+                        encoding=((name==null)?"LitHuffN":("LitIdxN"+(name.isStatic()?"S":"")+(1+NBitInteger.octectsNeeded(6,_context.index(name)))))+
+                                (huffman?"HuffVIdx":"LitVIdx");
+                }
+            }
+
+            // If we want the field referenced, then we add it to our
+            // table and reference set.
+            if (indexed)
+                _context.add(field);
+        }
+
+        if (_debug)
+        {
+            int e=buffer.position();
+            if (LOG.isDebugEnabled())
+                LOG.debug("encode {}:'{}' to '{}'",encoding,field,TypeUtil.toHexString(buffer.array(),buffer.arrayOffset()+p,e-p));
+        }
+    }
+
+    private void encodeName(ByteBuffer buffer, byte mask, int bits, String name, Entry entry)
+    {
+        buffer.put(mask);
+        if (entry==null)
+        {
+            // leave name index bits as 0
+            // Encode the name always with lowercase huffman
+            buffer.put((byte)0x80);
+            NBitInteger.encode(buffer,7,Huffman.octetsNeededLC(name));
+            Huffman.encodeLC(buffer,name);
+        }
+        else
+        {
+            NBitInteger.encode(buffer,bits,_context.index(entry));
+        }
+    }
+
+    static void encodeValue(ByteBuffer buffer, boolean huffman, String value)
+    {
+        if (huffman)
+        {
+            // huffman literal value
+            buffer.put((byte)0x80);
+            NBitInteger.encode(buffer,7,Huffman.octetsNeeded(value));
+            Huffman.encode(buffer,value);
+        }
+        else
+        {
+            // add literal assuming iso_8859_1
+            buffer.put((byte)0x00);
+            NBitInteger.encode(buffer,7,value.length());
+            for (int i=0;i<value.length();i++)
+            {
+                char c=value.charAt(i);
+                if (c<' '|| c>127)
+                    throw new IllegalArgumentException();
+                buffer.put((byte)c);
+            }
+        }
+    }
+}
diff --git a/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/HpackFieldPreEncoder.java b/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/HpackFieldPreEncoder.java
new file mode 100644
index 0000000..a52208c
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/HpackFieldPreEncoder.java
@@ -0,0 +1,97 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.http2.hpack;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http.HttpFieldPreEncoder;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.util.BufferUtil;
+
+
+/* ------------------------------------------------------------ */
+/**
+ */
+public class HpackFieldPreEncoder implements HttpFieldPreEncoder
+{
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.http.HttpFieldPreEncoder#getHttpVersion()
+     */
+    @Override
+    public HttpVersion getHttpVersion()
+    {
+        return HttpVersion.HTTP_2;
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.http.HttpFieldPreEncoder#getEncodedField(org.eclipse.jetty.http.HttpHeader, java.lang.String, java.lang.String)
+     */
+    @Override
+    public byte[] getEncodedField(HttpHeader header, String name, String value)
+    {
+        boolean not_indexed=HpackEncoder.__DO_NOT_INDEX.contains(header);
+        
+        ByteBuffer buffer = BufferUtil.allocate(name.length()+value.length()+10);
+        BufferUtil.clearToFill(buffer);
+        boolean huffman;
+        int bits;
+        
+        if (not_indexed)
+        {
+            // Non indexed field
+            boolean never_index=HpackEncoder.__NEVER_INDEX.contains(header);
+            huffman=!HpackEncoder.__DO_NOT_HUFFMAN.contains(header);
+            buffer.put(never_index?(byte)0x10:(byte)0x00);
+            bits=4;
+        }
+        else if (header==HttpHeader.CONTENT_LENGTH && value.length()>1)
+        {
+            // Non indexed content length for 2 digits or more
+            buffer.put((byte)0x00);
+            huffman=true;
+            bits=4;
+        }
+        else
+        {
+            // indexed
+            buffer.put((byte)0x40);
+            huffman=!HpackEncoder.__DO_NOT_HUFFMAN.contains(header);
+            bits=6;
+        }
+        
+        int name_idx=HpackContext.staticIndex(header);
+        if (name_idx>0)
+            NBitInteger.encode(buffer,bits,name_idx);
+        else
+        {
+            buffer.put((byte)0x80);
+            NBitInteger.encode(buffer,7,Huffman.octetsNeededLC(name));
+            Huffman.encodeLC(buffer,name);
+        }
+
+        HpackEncoder.encodeValue(buffer,huffman,value);
+        
+        BufferUtil.flipToFlush(buffer,0);
+        return BufferUtil.toArray(buffer);
+    }
+}
diff --git a/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/Huffman.java b/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/Huffman.java
new file mode 100644
index 0000000..154ddfa
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/Huffman.java
@@ -0,0 +1,480 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.hpack;
+
+import java.nio.ByteBuffer;
+
+public class Huffman
+{
+
+    // Appendix C: Huffman Codes
+    // http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-12#appendix-C
+    static final int[][] CODES =
+    { 
+        /*    (  0)  |11111111|11000                      */       {0x1ff8,13},
+        /*    (  1)  |11111111|11111111|1011000           */     {0x7fffd8,23},
+        /*    (  2)  |11111111|11111111|11111110|0010     */    {0xfffffe2,28},
+        /*    (  3)  |11111111|11111111|11111110|0011     */    {0xfffffe3,28},
+        /*    (  4)  |11111111|11111111|11111110|0100     */    {0xfffffe4,28},
+        /*    (  5)  |11111111|11111111|11111110|0101     */    {0xfffffe5,28},
+        /*    (  6)  |11111111|11111111|11111110|0110     */    {0xfffffe6,28},
+        /*    (  7)  |11111111|11111111|11111110|0111     */    {0xfffffe7,28},
+        /*    (  8)  |11111111|11111111|11111110|1000     */    {0xfffffe8,28},
+        /*    (  9)  |11111111|11111111|11101010          */     {0xffffea,24},
+        /*    ( 10)  |11111111|11111111|11111111|111100   */   {0x3ffffffc,30},
+        /*    ( 11)  |11111111|11111111|11111110|1001     */    {0xfffffe9,28},
+        /*    ( 12)  |11111111|11111111|11111110|1010     */    {0xfffffea,28},
+        /*    ( 13)  |11111111|11111111|11111111|111101   */   {0x3ffffffd,30},
+        /*    ( 14)  |11111111|11111111|11111110|1011     */    {0xfffffeb,28},
+        /*    ( 15)  |11111111|11111111|11111110|1100     */    {0xfffffec,28},
+        /*    ( 16)  |11111111|11111111|11111110|1101     */    {0xfffffed,28},
+        /*    ( 17)  |11111111|11111111|11111110|1110     */    {0xfffffee,28},
+        /*    ( 18)  |11111111|11111111|11111110|1111     */    {0xfffffef,28},
+        /*    ( 19)  |11111111|11111111|11111111|0000     */    {0xffffff0,28},
+        /*    ( 20)  |11111111|11111111|11111111|0001     */    {0xffffff1,28},
+        /*    ( 21)  |11111111|11111111|11111111|0010     */    {0xffffff2,28},
+        /*    ( 22)  |11111111|11111111|11111111|111110   */   {0x3ffffffe,30},
+        /*    ( 23)  |11111111|11111111|11111111|0011     */    {0xffffff3,28},
+        /*    ( 24)  |11111111|11111111|11111111|0100     */    {0xffffff4,28},
+        /*    ( 25)  |11111111|11111111|11111111|0101     */    {0xffffff5,28},
+        /*    ( 26)  |11111111|11111111|11111111|0110     */    {0xffffff6,28},
+        /*    ( 27)  |11111111|11111111|11111111|0111     */    {0xffffff7,28},
+        /*    ( 28)  |11111111|11111111|11111111|1000     */    {0xffffff8,28},
+        /*    ( 29)  |11111111|11111111|11111111|1001     */    {0xffffff9,28},
+        /*    ( 30)  |11111111|11111111|11111111|1010     */    {0xffffffa,28},
+        /*    ( 31)  |11111111|11111111|11111111|1011     */    {0xffffffb,28},
+        /*' ' ( 32)  |010100                              */         {0x14, 6},
+        /*'!' ( 33)  |11111110|00                         */        {0x3f8,10},
+        /*'"' ( 34)  |11111110|01                         */        {0x3f9,10},
+        /*'#' ( 35)  |11111111|1010                       */        {0xffa,12},
+        /*'$' ( 36)  |11111111|11001                      */       {0x1ff9,13},
+        /*'%' ( 37)  |010101                              */         {0x15, 6},
+        /*'&' ( 38)  |11111000                            */         {0xf8, 8},
+        /*''' ( 39)  |11111111|010                        */        {0x7fa,11},
+        /*'(' ( 40)  |11111110|10                         */        {0x3fa,10},
+        /*')' ( 41)  |11111110|11                         */        {0x3fb,10},
+        /*'*' ( 42)  |11111001                            */         {0xf9, 8},
+        /*'+' ( 43)  |11111111|011                        */        {0x7fb,11},
+        /*',' ( 44)  |11111010                            */         {0xfa, 8},
+        /*'-' ( 45)  |010110                              */         {0x16, 6},
+        /*'.' ( 46)  |010111                              */         {0x17, 6},
+        /*'/' ( 47)  |011000                              */         {0x18, 6},
+        /*'0' ( 48)  |00000                               */          {0x0, 5},
+        /*'1' ( 49)  |00001                               */          {0x1, 5},
+        /*'2' ( 50)  |00010                               */          {0x2, 5},
+        /*'3' ( 51)  |011001                              */         {0x19, 6},
+        /*'4' ( 52)  |011010                              */         {0x1a, 6},
+        /*'5' ( 53)  |011011                              */         {0x1b, 6},
+        /*'6' ( 54)  |011100                              */         {0x1c, 6},
+        /*'7' ( 55)  |011101                              */         {0x1d, 6},
+        /*'8' ( 56)  |011110                              */         {0x1e, 6},
+        /*'9' ( 57)  |011111                              */         {0x1f, 6},
+        /*':' ( 58)  |1011100                             */         {0x5c, 7},
+        /*';' ( 59)  |11111011                            */         {0xfb, 8},
+        /*'<' ( 60)  |11111111|1111100                    */       {0x7ffc,15},
+        /*'=' ( 61)  |100000                              */         {0x20, 6},
+        /*'>' ( 62)  |11111111|1011                       */        {0xffb,12},
+        /*'?' ( 63)  |11111111|00                         */        {0x3fc,10},
+        /*'@' ( 64)  |11111111|11010                      */       {0x1ffa,13},
+        /*'A' ( 65)  |100001                              */         {0x21, 6},
+        /*'B' ( 66)  |1011101                             */         {0x5d, 7},
+        /*'C' ( 67)  |1011110                             */         {0x5e, 7},
+        /*'D' ( 68)  |1011111                             */         {0x5f, 7},
+        /*'E' ( 69)  |1100000                             */         {0x60, 7},
+        /*'F' ( 70)  |1100001                             */         {0x61, 7},
+        /*'G' ( 71)  |1100010                             */         {0x62, 7},
+        /*'H' ( 72)  |1100011                             */         {0x63, 7},
+        /*'I' ( 73)  |1100100                             */         {0x64, 7},
+        /*'J' ( 74)  |1100101                             */         {0x65, 7},
+        /*'K' ( 75)  |1100110                             */         {0x66, 7},
+        /*'L' ( 76)  |1100111                             */         {0x67, 7},
+        /*'M' ( 77)  |1101000                             */         {0x68, 7},
+        /*'N' ( 78)  |1101001                             */         {0x69, 7},
+        /*'O' ( 79)  |1101010                             */         {0x6a, 7},
+        /*'P' ( 80)  |1101011                             */         {0x6b, 7},
+        /*'Q' ( 81)  |1101100                             */         {0x6c, 7},
+        /*'R' ( 82)  |1101101                             */         {0x6d, 7},
+        /*'S' ( 83)  |1101110                             */         {0x6e, 7},
+        /*'T' ( 84)  |1101111                             */         {0x6f, 7},
+        /*'U' ( 85)  |1110000                             */         {0x70, 7},
+        /*'V' ( 86)  |1110001                             */         {0x71, 7},
+        /*'W' ( 87)  |1110010                             */         {0x72, 7},
+        /*'X' ( 88)  |11111100                            */         {0xfc, 8},
+        /*'Y' ( 89)  |1110011                             */         {0x73, 7},
+        /*'Z' ( 90)  |11111101                            */         {0xfd, 8},
+        /*'[' ( 91)  |11111111|11011                      */       {0x1ffb,13},
+        /*'\' ( 92)  |11111111|11111110|000               */      {0x7fff0,19},
+        /*']' ( 93)  |11111111|11100                      */       {0x1ffc,13},
+        /*'^' ( 94)  |11111111|111100                     */       {0x3ffc,14},
+        /*'_' ( 95)  |100010                              */         {0x22, 6},
+        /*'`' ( 96)  |11111111|1111101                    */       {0x7ffd,15},
+        /*'a' ( 97)  |00011                               */          {0x3, 5},
+        /*'b' ( 98)  |100011                              */         {0x23, 6},
+        /*'c' ( 99)  |00100                               */          {0x4, 5},
+        /*'d' (100)  |100100                              */         {0x24, 6},
+        /*'e' (101)  |00101                               */          {0x5, 5},
+        /*'f' (102)  |100101                              */         {0x25, 6},
+        /*'g' (103)  |100110                              */         {0x26, 6},
+        /*'h' (104)  |100111                              */         {0x27, 6},
+        /*'i' (105)  |00110                               */          {0x6, 5},
+        /*'j' (106)  |1110100                             */         {0x74, 7},
+        /*'k' (107)  |1110101                             */         {0x75, 7},
+        /*'l' (108)  |101000                              */         {0x28, 6},
+        /*'m' (109)  |101001                              */         {0x29, 6},
+        /*'n' (110)  |101010                              */         {0x2a, 6},
+        /*'o' (111)  |00111                               */          {0x7, 5},
+        /*'p' (112)  |101011                              */         {0x2b, 6},
+        /*'q' (113)  |1110110                             */         {0x76, 7},
+        /*'r' (114)  |101100                              */         {0x2c, 6},
+        /*'s' (115)  |01000                               */          {0x8, 5},
+        /*'t' (116)  |01001                               */          {0x9, 5},
+        /*'u' (117)  |101101                              */         {0x2d, 6},
+        /*'v' (118)  |1110111                             */         {0x77, 7},
+        /*'w' (119)  |1111000                             */         {0x78, 7},
+        /*'x' (120)  |1111001                             */         {0x79, 7},
+        /*'y' (121)  |1111010                             */         {0x7a, 7},
+        /*'z' (122)  |1111011                             */         {0x7b, 7},
+        /*'{' (123)  |11111111|1111110                    */       {0x7ffe,15},
+        /*'|' (124)  |11111111|100                        */        {0x7fc,11},
+        /*'}' (125)  |11111111|111101                     */       {0x3ffd,14},
+        /*'~' (126)  |11111111|11101                      */       {0x1ffd,13},
+        /*    (127)  |11111111|11111111|11111111|1100     */    {0xffffffc,28},
+        /*    (128)  |11111111|11111110|0110              */      {0xfffe6,20},
+        /*    (129)  |11111111|11111111|010010            */     {0x3fffd2,22},
+        /*    (130)  |11111111|11111110|0111              */      {0xfffe7,20},
+        /*    (131)  |11111111|11111110|1000              */      {0xfffe8,20},
+        /*    (132)  |11111111|11111111|010011            */     {0x3fffd3,22},
+        /*    (133)  |11111111|11111111|010100            */     {0x3fffd4,22},
+        /*    (134)  |11111111|11111111|010101            */     {0x3fffd5,22},
+        /*    (135)  |11111111|11111111|1011001           */     {0x7fffd9,23},
+        /*    (136)  |11111111|11111111|010110            */     {0x3fffd6,22},
+        /*    (137)  |11111111|11111111|1011010           */     {0x7fffda,23},
+        /*    (138)  |11111111|11111111|1011011           */     {0x7fffdb,23},
+        /*    (139)  |11111111|11111111|1011100           */     {0x7fffdc,23},
+        /*    (140)  |11111111|11111111|1011101           */     {0x7fffdd,23},
+        /*    (141)  |11111111|11111111|1011110           */     {0x7fffde,23},
+        /*    (142)  |11111111|11111111|11101011          */     {0xffffeb,24},
+        /*    (143)  |11111111|11111111|1011111           */     {0x7fffdf,23},
+        /*    (144)  |11111111|11111111|11101100          */     {0xffffec,24},
+        /*    (145)  |11111111|11111111|11101101          */     {0xffffed,24},
+        /*    (146)  |11111111|11111111|010111            */     {0x3fffd7,22},
+        /*    (147)  |11111111|11111111|1100000           */     {0x7fffe0,23},
+        /*    (148)  |11111111|11111111|11101110          */     {0xffffee,24},
+        /*    (149)  |11111111|11111111|1100001           */     {0x7fffe1,23},
+        /*    (150)  |11111111|11111111|1100010           */     {0x7fffe2,23},
+        /*    (151)  |11111111|11111111|1100011           */     {0x7fffe3,23},
+        /*    (152)  |11111111|11111111|1100100           */     {0x7fffe4,23},
+        /*    (153)  |11111111|11111110|11100             */     {0x1fffdc,21},
+        /*    (154)  |11111111|11111111|011000            */     {0x3fffd8,22},
+        /*    (155)  |11111111|11111111|1100101           */     {0x7fffe5,23},
+        /*    (156)  |11111111|11111111|011001            */     {0x3fffd9,22},
+        /*    (157)  |11111111|11111111|1100110           */     {0x7fffe6,23},
+        /*    (158)  |11111111|11111111|1100111           */     {0x7fffe7,23},
+        /*    (159)  |11111111|11111111|11101111          */     {0xffffef,24},
+        /*    (160)  |11111111|11111111|011010            */     {0x3fffda,22},
+        /*    (161)  |11111111|11111110|11101             */     {0x1fffdd,21},
+        /*    (162)  |11111111|11111110|1001              */      {0xfffe9,20},
+        /*    (163)  |11111111|11111111|011011            */     {0x3fffdb,22},
+        /*    (164)  |11111111|11111111|011100            */     {0x3fffdc,22},
+        /*    (165)  |11111111|11111111|1101000           */     {0x7fffe8,23},
+        /*    (166)  |11111111|11111111|1101001           */     {0x7fffe9,23},
+        /*    (167)  |11111111|11111110|11110             */     {0x1fffde,21},
+        /*    (168)  |11111111|11111111|1101010           */     {0x7fffea,23},
+        /*    (169)  |11111111|11111111|011101            */     {0x3fffdd,22},
+        /*    (170)  |11111111|11111111|011110            */     {0x3fffde,22},
+        /*    (171)  |11111111|11111111|11110000          */     {0xfffff0,24},
+        /*    (172)  |11111111|11111110|11111             */     {0x1fffdf,21},
+        /*    (173)  |11111111|11111111|011111            */     {0x3fffdf,22},
+        /*    (174)  |11111111|11111111|1101011           */     {0x7fffeb,23},
+        /*    (175)  |11111111|11111111|1101100           */     {0x7fffec,23},
+        /*    (176)  |11111111|11111111|00000             */     {0x1fffe0,21},
+        /*    (177)  |11111111|11111111|00001             */     {0x1fffe1,21},
+        /*    (178)  |11111111|11111111|100000            */     {0x3fffe0,22},
+        /*    (179)  |11111111|11111111|00010             */     {0x1fffe2,21},
+        /*    (180)  |11111111|11111111|1101101           */     {0x7fffed,23},
+        /*    (181)  |11111111|11111111|100001            */     {0x3fffe1,22},
+        /*    (182)  |11111111|11111111|1101110           */     {0x7fffee,23},
+        /*    (183)  |11111111|11111111|1101111           */     {0x7fffef,23},
+        /*    (184)  |11111111|11111110|1010              */      {0xfffea,20},
+        /*    (185)  |11111111|11111111|100010            */     {0x3fffe2,22},
+        /*    (186)  |11111111|11111111|100011            */     {0x3fffe3,22},
+        /*    (187)  |11111111|11111111|100100            */     {0x3fffe4,22},
+        /*    (188)  |11111111|11111111|1110000           */     {0x7ffff0,23},
+        /*    (189)  |11111111|11111111|100101            */     {0x3fffe5,22},
+        /*    (190)  |11111111|11111111|100110            */     {0x3fffe6,22},
+        /*    (191)  |11111111|11111111|1110001           */     {0x7ffff1,23},
+        /*    (192)  |11111111|11111111|11111000|00       */    {0x3ffffe0,26},
+        /*    (193)  |11111111|11111111|11111000|01       */    {0x3ffffe1,26},
+        /*    (194)  |11111111|11111110|1011              */      {0xfffeb,20},
+        /*    (195)  |11111111|11111110|001               */      {0x7fff1,19},
+        /*    (196)  |11111111|11111111|100111            */     {0x3fffe7,22},
+        /*    (197)  |11111111|11111111|1110010           */     {0x7ffff2,23},
+        /*    (198)  |11111111|11111111|101000            */     {0x3fffe8,22},
+        /*    (199)  |11111111|11111111|11110110|0        */    {0x1ffffec,25},
+        /*    (200)  |11111111|11111111|11111000|10       */    {0x3ffffe2,26},
+        /*    (201)  |11111111|11111111|11111000|11       */    {0x3ffffe3,26},
+        /*    (202)  |11111111|11111111|11111001|00       */    {0x3ffffe4,26},
+        /*    (203)  |11111111|11111111|11111011|110      */    {0x7ffffde,27},
+        /*    (204)  |11111111|11111111|11111011|111      */    {0x7ffffdf,27},
+        /*    (205)  |11111111|11111111|11111001|01       */    {0x3ffffe5,26},
+        /*    (206)  |11111111|11111111|11110001          */     {0xfffff1,24},
+        /*    (207)  |11111111|11111111|11110110|1        */    {0x1ffffed,25},
+        /*    (208)  |11111111|11111110|010               */      {0x7fff2,19},
+        /*    (209)  |11111111|11111111|00011             */     {0x1fffe3,21},
+        /*    (210)  |11111111|11111111|11111001|10       */    {0x3ffffe6,26},
+        /*    (211)  |11111111|11111111|11111100|000      */    {0x7ffffe0,27},
+        /*    (212)  |11111111|11111111|11111100|001      */    {0x7ffffe1,27},
+        /*    (213)  |11111111|11111111|11111001|11       */    {0x3ffffe7,26},
+        /*    (214)  |11111111|11111111|11111100|010      */    {0x7ffffe2,27},
+        /*    (215)  |11111111|11111111|11110010          */     {0xfffff2,24},
+        /*    (216)  |11111111|11111111|00100             */     {0x1fffe4,21},
+        /*    (217)  |11111111|11111111|00101             */     {0x1fffe5,21},
+        /*    (218)  |11111111|11111111|11111010|00       */    {0x3ffffe8,26},
+        /*    (219)  |11111111|11111111|11111010|01       */    {0x3ffffe9,26},
+        /*    (220)  |11111111|11111111|11111111|1101     */    {0xffffffd,28},
+        /*    (221)  |11111111|11111111|11111100|011      */    {0x7ffffe3,27},
+        /*    (222)  |11111111|11111111|11111100|100      */    {0x7ffffe4,27},
+        /*    (223)  |11111111|11111111|11111100|101      */    {0x7ffffe5,27},
+        /*    (224)  |11111111|11111110|1100              */      {0xfffec,20},
+        /*    (225)  |11111111|11111111|11110011          */     {0xfffff3,24},
+        /*    (226)  |11111111|11111110|1101              */      {0xfffed,20},
+        /*    (227)  |11111111|11111111|00110             */     {0x1fffe6,21},
+        /*    (228)  |11111111|11111111|101001            */     {0x3fffe9,22},
+        /*    (229)  |11111111|11111111|00111             */     {0x1fffe7,21},
+        /*    (230)  |11111111|11111111|01000             */     {0x1fffe8,21},
+        /*    (231)  |11111111|11111111|1110011           */     {0x7ffff3,23},
+        /*    (232)  |11111111|11111111|101010            */     {0x3fffea,22},
+        /*    (233)  |11111111|11111111|101011            */     {0x3fffeb,22},
+        /*    (234)  |11111111|11111111|11110111|0        */    {0x1ffffee,25},
+        /*    (235)  |11111111|11111111|11110111|1        */    {0x1ffffef,25},
+        /*    (236)  |11111111|11111111|11110100          */     {0xfffff4,24},
+        /*    (237)  |11111111|11111111|11110101          */     {0xfffff5,24},
+        /*    (238)  |11111111|11111111|11111010|10       */    {0x3ffffea,26},
+        /*    (239)  |11111111|11111111|1110100           */     {0x7ffff4,23},
+        /*    (240)  |11111111|11111111|11111010|11       */    {0x3ffffeb,26},
+        /*    (241)  |11111111|11111111|11111100|110      */    {0x7ffffe6,27},
+        /*    (242)  |11111111|11111111|11111011|00       */    {0x3ffffec,26},
+        /*    (243)  |11111111|11111111|11111011|01       */    {0x3ffffed,26},
+        /*    (244)  |11111111|11111111|11111100|111      */    {0x7ffffe7,27},
+        /*    (245)  |11111111|11111111|11111101|000      */    {0x7ffffe8,27},
+        /*    (246)  |11111111|11111111|11111101|001      */    {0x7ffffe9,27},
+        /*    (247)  |11111111|11111111|11111101|010      */    {0x7ffffea,27},
+        /*    (248)  |11111111|11111111|11111101|011      */    {0x7ffffeb,27},
+        /*    (249)  |11111111|11111111|11111111|1110     */    {0xffffffe,28},
+        /*    (250)  |11111111|11111111|11111101|100      */    {0x7ffffec,27},
+        /*    (251)  |11111111|11111111|11111101|101      */    {0x7ffffed,27},
+        /*    (252)  |11111111|11111111|11111101|110      */    {0x7ffffee,27},
+        /*    (253)  |11111111|11111111|11111101|111      */    {0x7ffffef,27},
+        /*    (254)  |11111111|11111111|11111110|000      */    {0x7fffff0,27},
+        /*    (255)  |11111111|11111111|11111011|10       */    {0x3ffffee,26},
+        /*EOS (256)  |11111111|11111111|11111111|111111   */   {0x3fffffff,30},
+    };
+
+    static final int[][] LCCODES = new int[CODES.length][];
+    
+    // Huffman decode tree stored in a flattened char array for good 
+    // locality of reference.
+    static final char[] tree;
+    static final char[] rowsym;
+    static final byte[] rowbits;
+
+    // Build the Huffman lookup tree and LC TABLE
+    static 
+    {
+        System.arraycopy(CODES,0,LCCODES,0,CODES.length);
+        for (int i='A';i<='Z';i++)
+            LCCODES[i]=LCCODES['a'+i-'A'];
+        
+        int r=0;
+        for (int i=0;i<CODES.length;i++)
+            r+=(CODES[i][1]+7)/8;
+        tree=new char[r*256];
+        rowsym=new char[r];
+        rowbits=new byte[r];
+
+        r=0;
+        for (int sym = 0; sym < CODES.length; sym++) 
+        {
+            int code = CODES[sym][0];
+            int len = CODES[sym][1];
+
+            int current = 0;
+
+            while (len > 8) 
+            {
+                len -= 8;
+                int i = ((code >>> len) & 0xFF);
+
+                int t=current*256+i;
+                current = tree[t];
+                if (current == 0)
+                {
+                    tree[t] = (char)++r;
+                    current=r;
+                }
+            }
+
+            int terminal = ++r;
+            rowsym[r]=(char)sym;
+            int b = len & 0x07;
+            int terminalBits = b == 0?8:b;
+
+            rowbits[r]=(byte)terminalBits;
+            int shift = 8 - len;
+            int start = current*256 + ((code << shift) & 0xFF);
+            int end = start + (1<<shift);
+            for (int i = start; i < end; i++)
+                tree[i]=(char)terminal;
+        }
+    }
+
+    public static String decode(ByteBuffer buffer)
+    {  
+        return decode(buffer,buffer.remaining());
+    }
+
+    public static String decode(ByteBuffer buffer,int length)
+    {        
+        StringBuilder out = new StringBuilder(length*2);
+        int node = 0;
+        int current = 0;
+        int bits = 0;
+        
+        byte[] array = buffer.array();
+        int position=buffer.position();
+        int start=buffer.arrayOffset()+position;
+        int end=start+length;
+        buffer.position(position+length);
+        
+        for (int i=start; i<end; i++)
+        {
+            int b = array[i]&0xFF;
+            current = (current << 8) | b;
+            bits += 8;
+            while (bits >= 8) 
+            {
+                int c = (current >>> (bits - 8)) & 0xFF;
+                node = tree[node*256+c];
+                if (rowbits[node]!=0) 
+                {
+                    // terminal node
+                    out.append(rowsym[node]);
+                    bits -= rowbits[node];
+                    node = 0;
+                } 
+                else 
+                {
+                    // non-terminal node
+                    bits -= 8;
+                }
+            }
+        }
+
+        while (bits > 0) 
+        {
+            int c = (current << (8 - bits)) & 0xFF;
+            node = tree[node*256+c];
+            if (rowbits[node]==0 || rowbits[node] > bits) 
+                break;
+            
+            if (rowbits[node]==0)
+                throw new IllegalStateException();
+            
+            out.append(rowsym[node]);
+            bits -= rowbits[node];
+            node = 0;
+        }
+
+        return out.toString();
+    }
+
+    public static int octetsNeeded(String s)
+    {   
+        return octetsNeeded(CODES,s);
+    }
+    
+    public static void encode(ByteBuffer buffer,String s)
+    {
+        encode(CODES,buffer,s);
+    }
+    
+    public static int octetsNeededLC(String s)
+    {
+        return octetsNeeded(LCCODES,s);
+    }
+
+    public static void encodeLC(ByteBuffer buffer, String s)
+    {
+        encode(LCCODES,buffer,s);
+    }
+    
+    private static int octetsNeeded(final int[][] table,String s)
+    {   
+        int needed=0;
+        int len = s.length();
+        for (int i=0;i<len;i++)
+        {
+            char c=s.charAt(i);
+            if (c>=128 || c<' ')
+                throw new IllegalArgumentException();
+            needed += table[c][1];
+        }
+
+        return (needed+7) / 8;
+    }
+
+    private static void encode(final int[][] table,ByteBuffer buffer,String s)
+    {
+        long current = 0;
+        int n = 0;
+
+        byte[] array = buffer.array();
+        int p=buffer.arrayOffset()+buffer.position();
+
+        int len = s.length();
+        for (int i=0;i<len;i++)
+        {
+            char c=s.charAt(i);
+            if (c>=128 || c<' ')
+                throw new IllegalArgumentException();
+            int code = table[c][0];
+            int bits = table[c][1];
+
+            current <<= bits;
+            current |= code;
+            n += bits;
+
+            while (n >= 8) 
+            {
+                n -= 8;
+                array[p++]=(byte)(current >> n);
+            }
+        }
+
+        if (n > 0) 
+        {
+          current <<= (8 - n);
+          current |= (0xFF >>> n); 
+          array[p++]=(byte)current;
+        }
+        
+        buffer.position(p-buffer.arrayOffset());
+    }
+
+}
diff --git a/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/MetaDataBuilder.java b/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/MetaDataBuilder.java
new file mode 100644
index 0000000..8e81dcc
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/MetaDataBuilder.java
@@ -0,0 +1,184 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.http2.hpack;
+
+
+import org.eclipse.jetty.http.BadMessageException;
+import org.eclipse.jetty.http.HostPortHttpField;
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpScheme;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+
+public class MetaDataBuilder
+{ 
+    private final int _maxSize;
+    private int _size;
+    private int _status;
+    private String _method;
+    private HttpScheme _scheme;
+    private HostPortHttpField _authority;
+    private String _path;  
+    private long _contentLength=Long.MIN_VALUE;
+
+    private HttpFields _fields = new HttpFields(10);
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @param maxHeadersSize The maximum size of the headers, expressed as total name and value characters.
+     */
+    MetaDataBuilder(int maxHeadersSize)
+    {
+        _maxSize=maxHeadersSize;
+    }
+    
+    /** Get the maxSize.
+     * @return the maxSize
+     */
+    public int getMaxSize()
+    {
+        return _maxSize;
+    }
+
+    /** Get the size.
+     * @return the current size in bytes
+     */
+    public int getSize()
+    {
+        return _size;
+    }
+
+    public void emit(HttpField field)
+    {        
+        int field_size = field.getName().length()+field.getValue().length();
+        _size+=field_size;
+        if (_size>_maxSize)
+            throw new BadMessageException(HttpStatus.REQUEST_ENTITY_TOO_LARGE_413,"Header size "+_size+">"+_maxSize);
+        
+        if (field instanceof StaticTableHttpField)
+        {
+            StaticTableHttpField value = (StaticTableHttpField)field;
+            switch(field.getHeader())
+            {
+                case C_STATUS:
+                    _status=(Integer)value.getStaticValue();
+                    break;
+                    
+                case C_METHOD:
+                    _method=field.getValue();
+                    break;
+
+                case C_SCHEME:
+                    _scheme = (HttpScheme)value.getStaticValue();
+                    break;
+                    
+                default:
+                    throw new IllegalArgumentException(field.getName());
+            }
+        }
+        else if (field.getHeader()!=null)
+        {
+            switch(field.getHeader())
+            {
+                case C_STATUS:
+                    _status=field.getIntValue();
+                    break;
+
+                case C_METHOD:
+                    _method=field.getValue();
+                    break;
+
+                case C_SCHEME:
+                    _scheme = HttpScheme.CACHE.get(field.getValue());
+                    break;
+
+                case C_AUTHORITY:
+                    _authority=(field instanceof HostPortHttpField)?((HostPortHttpField)field):new AuthorityHttpField(field.getValue());
+                    break;
+
+                case HOST:
+                    // :authority fields must come first.  If we have one, ignore the host header as far as authority goes.
+                    if (_authority==null)
+                        _authority=(field instanceof HostPortHttpField)?((HostPortHttpField)field):new AuthorityHttpField(field.getValue());
+                    _fields.add(field);
+                    break;
+
+                case C_PATH:
+                    _path = field.getValue();
+                    break;
+
+                case CONTENT_LENGTH:
+                    _contentLength = field.getLongValue();
+                    _fields.add(field);
+                    break;
+                    
+                default:
+                    if (field.getName().charAt(0)!=':')
+                        _fields.add(field);
+            }
+        }
+        else
+        {
+            if (field.getName().charAt(0)!=':')
+                _fields.add(field);
+        }
+    }
+    
+    public MetaData build()
+    {
+        try
+        {
+            HttpFields fields = _fields;
+            _fields = new HttpFields(Math.max(10,fields.size()+5));
+            
+            if (_method!=null)
+                return new MetaData.Request(_method,_scheme,_authority,_path,HttpVersion.HTTP_2,fields,_contentLength);
+            if (_status!=0)
+                return new MetaData.Response(HttpVersion.HTTP_2,_status,fields,_contentLength);
+            return new MetaData(HttpVersion.HTTP_2,fields,_contentLength);
+        }
+        finally
+        {
+            _status=0;
+            _method=null;
+            _scheme=null;
+            _authority=null;
+            _path=null;
+            _size=0;
+            _contentLength=Long.MIN_VALUE;
+        }
+    }
+
+    /* ------------------------------------------------------------ */
+    /** Check that the max size will not be exceeded.
+     * @param length the length
+     * @param huffman the huffman name
+     */
+    public void checkSize(int length, boolean huffman)
+    {
+        // Apply a huffman fudge factor
+        if (huffman)
+            length=(length*4)/3;
+        if ((_size+length)>_maxSize)
+            throw new BadMessageException(HttpStatus.REQUEST_ENTITY_TOO_LARGE_413,"Header size "+(_size+length)+">"+_maxSize);
+    }
+}
diff --git a/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/NBitInteger.java b/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/NBitInteger.java
new file mode 100644
index 0000000..8ed7cdb
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/NBitInteger.java
@@ -0,0 +1,151 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.hpack;
+
+import java.nio.ByteBuffer;
+
+public class NBitInteger
+{
+    public static int octectsNeeded(int n,int i)
+    {
+        if (n==8)
+        {
+            int nbits = 0xFF;
+            i=i-nbits;
+            if (i<0)
+                return 1;
+            if (i==0)
+                return 2;
+            int lz=Integer.numberOfLeadingZeros(i);
+            int log=32-lz;
+            return 1+(log+6)/7;
+        }
+        
+        int nbits = 0xFF >>> (8 - n);
+        i=i-nbits;
+        if (i<0)
+            return 0;
+        if (i==0)
+            return 1;
+        int lz=Integer.numberOfLeadingZeros(i);
+        int log=32-lz;
+        return (log+6)/7;
+    }
+    
+    public static void encode(ByteBuffer buf, int n, int i)
+    {
+        if (n==8)
+        {
+            if (i < 0xFF)
+            {
+                buf.put((byte)i);
+            }
+            else
+            {
+                buf.put((byte)0xFF);
+
+                int length = i - 0xFF;
+                while (true)
+                {
+                    if ((length & ~0x7F) == 0)
+                    {
+                        buf.put((byte)length);
+                        return;
+                    }
+                    else
+                    {
+                        buf.put((byte)((length & 0x7F) | 0x80));
+                        length >>>= 7;
+                    }
+                }
+            }
+        }
+        else
+        {
+            int p=buf.position()-1;
+            int bits = 0xFF >>> (8 - n);
+
+            if (i < bits)
+            {
+                buf.put(p,(byte)((buf.get(p)&~bits)|i));
+            }
+            else
+            {
+                buf.put(p,(byte)(buf.get(p)|bits));
+
+                int length = i - bits;
+                while (true)
+                {
+                    if ((length & ~0x7F) == 0)
+                    {
+                        buf.put((byte)length);
+                        return;
+                    }
+                    else
+                    {
+                        buf.put((byte)((length & 0x7F) | 0x80));
+                        length >>>= 7;
+                    }
+                }
+            }
+        }
+    }
+
+    public static int decode(ByteBuffer buffer, int n)
+    {
+        if (n==8)
+        {
+            int nbits = 0xFF;
+
+            int i=buffer.get()&0xff;
+            
+            if (i == nbits)
+            {       
+                int m=1;
+                int b;
+                do
+                {
+                    b = 0xff&buffer.get();
+                    i = i + (b&127) * m;
+                    m = m*128;
+                }
+                while ((b&128) == 128);
+            }
+            return i;
+        }
+        
+        int nbits = 0xFF >>> (8 - n);
+
+        int i=buffer.get(buffer.position()-1)&nbits;
+        
+        if (i == nbits)
+        {       
+            int m=1;
+            int b;
+            do
+            {
+                b = 0xff&buffer.get();
+                i = i + (b&127) * m;
+                m = m*128;
+            }
+            while ((b&128) == 128);
+        }
+        return i;
+    }
+}
diff --git a/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/StaticTableHttpField.java b/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/StaticTableHttpField.java
new file mode 100644
index 0000000..f49326f
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/main/java/org/eclipse/jetty/http2/hpack/StaticTableHttpField.java
@@ -0,0 +1,61 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.http2.hpack;
+
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpHeader;
+
+/* ------------------------------------------------------------ */
+public class StaticTableHttpField extends HttpField
+{
+    private final Object _value;
+
+    public StaticTableHttpField(HttpHeader header, String name, String valueString, Object value)
+    {
+        super(header,name,valueString);
+        if (value==null)
+            throw new IllegalArgumentException();
+        _value=value;
+    }
+    
+    public StaticTableHttpField(HttpHeader header,String valueString, Object value)
+    {
+        this (header,header.asString(),valueString, value);
+    }
+    
+    public StaticTableHttpField(String name, String valueString, Object value)
+    {
+        super(name,valueString);
+        if (value==null)
+            throw new IllegalArgumentException();
+        _value=value;
+    }
+
+    public Object getStaticValue()
+    {
+        return _value;
+    }
+    
+    @Override
+    public String toString()
+    {
+        return super.toString()+"(evaluated)";
+    }
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/main/resources/META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder b/jetty-http2/http2-hpack/src/main/resources/META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder
new file mode 100644
index 0000000..4dca767
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/main/resources/META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder
@@ -0,0 +1 @@
+org.eclipse.jetty.http2.hpack.HpackFieldPreEncoder
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/HpackContextTest.java b/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/HpackContextTest.java
new file mode 100644
index 0000000..26512e6
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/HpackContextTest.java
@@ -0,0 +1,455 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.http2.hpack;
+
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http2.hpack.HpackContext.Entry;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+/* ------------------------------------------------------------ */
+/**
+ */
+public class HpackContextTest
+{
+
+    @Test
+    public void testStaticName()
+    {
+        HpackContext ctx = new HpackContext(4096);
+        Entry entry=ctx.get(":method");
+        assertEquals(":method",entry.getHttpField().getName());
+        Assert.assertTrue(entry.isStatic());
+        Assert.assertThat(entry.toString(),Matchers.startsWith("{S,2,:method: "));
+    }
+    
+    @Test
+    public void testEmptyAdd()
+    {
+        HpackContext ctx = new HpackContext(0);
+        HttpField field = new HttpField("foo","bar");
+        Assert.assertNull(ctx.add(field));
+    }
+    
+    @Test
+    public void testTooBigAdd()
+    {
+        HpackContext ctx = new HpackContext(37);
+        HttpField field = new HttpField("foo","bar");
+        Assert.assertNull(ctx.add(field));
+    }
+    
+    @Test
+    public void testJustRight()
+    {
+        HpackContext ctx = new HpackContext(38);
+        HttpField field = new HttpField("foo","bar");
+        Entry entry=ctx.add(field);
+        Assert.assertNotNull(entry);
+        Assert.assertThat(entry.toString(),Matchers.startsWith("{D,0,foo: bar,"));
+    }
+    
+    @Test
+    public void testEvictOne()
+    {
+        HpackContext ctx = new HpackContext(38);
+        HttpField field0 = new HttpField("foo","bar");
+        
+        assertEquals(field0,ctx.add(field0).getHttpField());
+        assertEquals(field0,ctx.get("foo").getHttpField());
+        
+        HttpField field1 = new HttpField("xxx","yyy");
+        assertEquals(field1,ctx.add(field1).getHttpField());
+
+        assertNull(ctx.get(field0));
+        assertNull(ctx.get("foo"));
+        assertEquals(field1,ctx.get(field1).getHttpField());
+        assertEquals(field1,ctx.get("xxx").getHttpField());
+        
+    }
+
+    @Test
+    public void testEvictNames()
+    {
+        HpackContext ctx = new HpackContext(38*2);
+        HttpField[] field = 
+        {
+           new HttpField("name","v0"),
+           new HttpField("name","v1"),
+           new HttpField("name","v2"),
+           new HttpField("name","v3"),
+           new HttpField("name","v4"),
+           new HttpField("name","v5"),
+        };
+        
+        Entry[] entry = new Entry[field.length];
+        
+        // Add 2 name entries to fill table
+        for (int i=0;i<=1;i++)
+            entry[i]=ctx.add(field[i]);
+        
+        // check there is a name reference and it is the most recent added
+        assertEquals(entry[1],ctx.get("name"));
+
+        // Add 1 other entry to table and evict 1
+        ctx.add(new HttpField("xxx","yyy"));
+        
+        // check the name reference has been not been evicted
+        assertEquals(entry[1],ctx.get("name"));
+        
+        // Add 1 other entry to table and evict 1
+        ctx.add(new HttpField("foo","bar"));
+        
+        // name is evicted
+        assertNull(ctx.get("name"));
+    }
+    @Test
+    public void testGetAddStatic()
+    {
+        HpackContext ctx = new HpackContext(4096);
+
+        // Look for the field.  Should find static version.
+        HttpField methodGet = new HttpField(":method","GET");
+        assertEquals(methodGet,ctx.get(methodGet).getHttpField());
+        assertTrue(ctx.get(methodGet).isStatic());
+        
+        // Add static version to dynamic table
+        Entry e0=ctx.add(ctx.get(methodGet).getHttpField());
+        
+        // Look again and should see dynamic version
+        assertEquals(methodGet,ctx.get(methodGet).getHttpField());
+        assertFalse(methodGet==ctx.get(methodGet).getHttpField());
+        assertFalse(ctx.get(methodGet).isStatic());
+        
+        // Duplicates allows
+        Entry e1=ctx.add(ctx.get(methodGet).getHttpField());
+        
+        // Look again and should see dynamic version
+        assertEquals(methodGet,ctx.get(methodGet).getHttpField());
+        assertFalse(methodGet==ctx.get(methodGet).getHttpField());
+        assertFalse(ctx.get(methodGet).isStatic());
+        assertFalse(e0==e1);
+    }
+    
+    @Test
+    public void testGetAddStaticName()
+    {
+        HpackContext ctx = new HpackContext(4096);
+        HttpField methodOther = new HttpField(":method","OTHER");
+
+        // Look for the field by name.  Should find static version.
+        assertEquals(":method",ctx.get(":method").getHttpField().getName());
+        assertTrue(ctx.get(":method").isStatic());
+        
+        // Add dynamic entry with method
+        ctx.add(methodOther);
+        
+        // Look for the field by name.  Should find static version.
+        assertEquals(":method",ctx.get(":method").getHttpField().getName());
+        assertTrue(ctx.get(":method").isStatic()); 
+    }
+
+    @Test
+    public void testIndexes()
+    {
+        // Only enough space for 5 entries
+        HpackContext ctx = new HpackContext(38*5);
+        
+        HttpField methodPost = new HttpField(":method","POST");
+        HttpField[] field = 
+        {
+           new HttpField("fo0","b0r"),
+           new HttpField("fo1","b1r"),
+           new HttpField("fo2","b2r"),
+           new HttpField("fo3","b3r"),
+           new HttpField("fo4","b4r"),
+           new HttpField("fo5","b5r"),
+           new HttpField("fo6","b6r"),
+           new HttpField("fo7","b7r"),
+           new HttpField("fo8","b8r"),
+           new HttpField("fo9","b9r"),
+           new HttpField("foA","bAr"),
+        };
+        
+        Entry[] entry = new Entry[100];
+        
+        // Lookup the index of a static field
+        assertEquals(0,ctx.size());
+        assertEquals(":authority",ctx.get(1).getHttpField().getName());
+        assertEquals(3,ctx.index(ctx.get(methodPost)));
+        assertEquals(methodPost,ctx.get(3).getHttpField());
+        assertEquals("www-authenticate",ctx.get(61).getHttpField().getName());
+        assertEquals(null,ctx.get(62));
+        
+        // Add a single entry  
+        entry[0]=ctx.add(field[0]);
+        
+        // Check new entry is 62 
+        assertEquals(1,ctx.size());
+        assertEquals(62,ctx.index(entry[0]));
+        assertEquals(entry[0],ctx.get(62));
+        
+        // and statics have moved up 0
+        assertEquals(":authority",ctx.get(1+0).getHttpField().getName());
+        assertEquals(3+0,ctx.index(ctx.get(methodPost)));
+        assertEquals(methodPost,ctx.get(3+0).getHttpField());
+        assertEquals("www-authenticate",ctx.get(61+0).getHttpField().getName());
+        assertEquals(null,ctx.get(62+0+ctx.size()));
+        
+
+        // Add 4 more entries
+        for (int i=1;i<=4;i++)  
+            entry[i]=ctx.add(field[i]);
+
+        // Check newest entry is at 62 oldest at 66
+        assertEquals(5,ctx.size());
+        int index=66;
+        for (int i=0;i<=4;i++)  
+        {
+            assertEquals(index,ctx.index(entry[i]));
+            assertEquals(entry[i],ctx.get(index));
+            index--;
+        }
+
+        // and statics have moved up 0
+        assertEquals(":authority",ctx.get(1+0).getHttpField().getName());
+        assertEquals(3+0,ctx.index(ctx.get(methodPost)));
+        assertEquals(methodPost,ctx.get(3+0).getHttpField());
+        assertEquals("www-authenticate",ctx.get(61+0).getHttpField().getName());
+        assertEquals(null,ctx.get(62+0+ctx.size()));
+        
+        // add 1 more entry and this should cause an eviction!
+        entry[5]=ctx.add(field[5]);
+
+        // Check newest entry is at 1 oldest at 5
+        index=66;
+        for (int i=1;i<=5;i++)  
+        {
+            assertEquals(index,ctx.index(entry[i]));
+            assertEquals(entry[i],ctx.get(index));
+            index--;
+        }
+        // check entry 0 evicted
+        assertNull(ctx.get(field[0]));
+        assertEquals(0,ctx.index(entry[0]));
+
+        // and statics have moved up 0
+        assertEquals(":authority",ctx.get(1+0).getHttpField().getName());
+        assertEquals(3+0,ctx.index(ctx.get(methodPost)));
+        assertEquals(methodPost,ctx.get(3+0).getHttpField());
+        assertEquals("www-authenticate",ctx.get(61+0).getHttpField().getName());
+        assertEquals(null,ctx.get(62+0+ctx.size()));
+        
+        // Add 4 more entries
+        for (int i=6;i<=9;i++)  
+            entry[i]=ctx.add(field[i]);
+        
+        // Check newest entry is at 1 oldest at 5
+        index=66;
+        for (int i=5;i<=9;i++)  
+        {
+            assertEquals(index,ctx.index(entry[i]));
+            assertEquals(entry[i],ctx.get(index));
+            index--;
+        }
+        // check entry 0-4 evicted
+        for (int i=0;i<=4;i++) 
+        {
+            assertNull(ctx.get(field[i]));
+            assertEquals(0,ctx.index(entry[i]));
+        }
+        
+
+        // Add new entries enough so that array queue will wrap
+        for (int i=10;i<=52;i++)
+            entry[i]=ctx.add(new HttpField("n"+i,"v"+i));
+
+        index=66;
+        for (int i=48;i<=52;i++)  
+        {
+            assertEquals(index,ctx.index(entry[i]));
+            assertEquals(entry[i],ctx.get(index));
+            index--;
+        }
+    }
+    
+
+    @Test
+    public void testResize()
+    {
+        // Only enough space for 5 entries
+        HpackContext ctx = new HpackContext(38*5);
+        HttpField methodPost = new HttpField(":method","POST");
+        
+        HttpField[] field = 
+        {
+           new HttpField("fo0","b0r"),
+           new HttpField("fo1","b1r"),
+           new HttpField("fo2","b2r"),
+           new HttpField("fo3","b3r"),
+           new HttpField("fo4","b4r"),
+           new HttpField("fo5","b5r"),
+           new HttpField("fo6","b6r"),
+           new HttpField("fo7","b7r"),
+           new HttpField("fo8","b8r"),
+           new HttpField("fo9","b9r"),
+           new HttpField("foA","bAr"),
+        };
+        Entry[] entry = new Entry[field.length];
+        
+        // Add 5 entries
+        for (int i=0;i<=4;i++)  
+            entry[i]=ctx.add(field[i]);
+        
+        assertEquals(5,ctx.size());
+        
+        // check indexes
+        int index=66;
+        for (int i=0;i<=4;i++)  
+        {
+            assertEquals(index,ctx.index(entry[i]));
+            assertEquals(entry[i],ctx.get(index));
+            index--;
+        }
+
+        // and statics have moved up 0
+        assertEquals(":authority",ctx.get(1+0).getHttpField().getName());
+        assertEquals(3+0,ctx.index(ctx.get(methodPost)));
+        assertEquals(methodPost,ctx.get(3+0).getHttpField());
+        assertEquals("www-authenticate",ctx.get(61+0).getHttpField().getName());
+        assertEquals(null,ctx.get(62+ctx.size()));
+        
+        
+        
+        // resize so that only 2 entries may be held
+        ctx.resize(38*2);
+        assertEquals(2,ctx.size());
+        
+        // check indexes
+        index=63;
+        for (int i=3;i<=4;i++)  
+        {
+            assertEquals(index,ctx.index(entry[i]));
+            assertEquals(entry[i],ctx.get(index));
+            index--;
+        }
+
+        // and statics have moved up 0
+        assertEquals(":authority",ctx.get(1+0).getHttpField().getName());
+        assertEquals(3+0,ctx.index(ctx.get(methodPost)));
+        assertEquals(methodPost,ctx.get(3+0).getHttpField());
+        assertEquals("www-authenticate",ctx.get(61+0).getHttpField().getName());
+        assertEquals(null,ctx.get(62+ctx.size()));
+        
+        // resize so that 6.5 entries may be held
+        ctx.resize(38*6+19);
+        assertEquals(2,ctx.size());
+
+        // check indexes
+        index=63;
+        for (int i=3;i<=4;i++)  
+        {
+            assertEquals(index,ctx.index(entry[i]));
+            assertEquals(entry[i],ctx.get(index));
+            index--;
+        }
+
+        // and statics have moved up 0
+        assertEquals(":authority",ctx.get(1+0).getHttpField().getName());
+        assertEquals(3+0,ctx.index(ctx.get(methodPost)));
+        assertEquals(methodPost,ctx.get(3+0).getHttpField());
+        assertEquals("www-authenticate",ctx.get(61+0).getHttpField().getName());
+        assertEquals(null,ctx.get(62+ctx.size()));
+        
+
+        // Add 5 entries
+        for (int i=5;i<=9;i++)  
+            entry[i]=ctx.add(field[i]);
+        
+        assertEquals(6,ctx.size());
+
+        // check indexes
+        index=67;
+        for (int i=4;i<=9;i++)  
+        {
+            assertEquals(index,ctx.index(entry[i]));
+            assertEquals(entry[i],ctx.get(index));
+            index--;
+        }
+
+        // and statics have moved up 0
+        assertEquals(":authority",ctx.get(1+0).getHttpField().getName());
+        assertEquals(3+0,ctx.index(ctx.get(methodPost)));
+        assertEquals(methodPost,ctx.get(3+0).getHttpField());
+        assertEquals("www-authenticate",ctx.get(61+0).getHttpField().getName());
+        assertEquals(null,ctx.get(62+ctx.size()));
+        
+    }
+    
+    @Test
+    public void testStaticHuffmanValues()
+    {
+        HpackContext ctx = new HpackContext(4096);
+        for (int i=2;i<=14;i++)
+        {
+            Entry entry=ctx.get(i);
+            assertTrue(entry.isStatic());
+            
+            ByteBuffer buffer = ByteBuffer.wrap(entry.getStaticHuffmanValue());
+            int huff = 0xff&buffer.get();
+            assertTrue((0x80&huff)==0x80);
+            
+            int len = NBitInteger.decode(buffer,7);
+            
+            assertEquals(len,buffer.remaining());
+            String value = Huffman.decode(buffer);
+            
+            assertEquals(entry.getHttpField().getValue(),value);
+            
+        }
+    }
+    
+
+    
+    @Test
+    public void testNameInsensitivity()
+    {
+        HpackContext ctx = new HpackContext(4096);
+        assertEquals("content-length",ctx.get("content-length").getHttpField().getName());
+        assertEquals("content-length",ctx.get("Content-Length").getHttpField().getName());
+        assertTrue(ctx.get("Content-Length").isStatic());
+        assertTrue(ctx.get("Content-Type").isStatic());
+        
+        ctx.add(new HttpField("Wibble","Wobble"));
+        assertEquals("Wibble",ctx.get("wibble").getHttpField().getName());
+        assertEquals("Wibble",ctx.get("Wibble").getHttpField().getName());
+        
+    }
+}
diff --git a/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/HpackDecoderTest.java b/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/HpackDecoderTest.java
new file mode 100644
index 0000000..ab2ab62
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/HpackDecoderTest.java
@@ -0,0 +1,162 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.http2.hpack;
+
+import java.nio.ByteBuffer;
+import java.util.Iterator;
+
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpScheme;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.util.TypeUtil;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class HpackDecoderTest
+{
+    @Test
+    public void testDecodeD_3()
+    {
+        HpackDecoder decoder = new HpackDecoder(4096,8192);
+
+        // First request
+        String encoded="828684410f7777772e6578616d706c652e636f6d";
+        ByteBuffer buffer = ByteBuffer.wrap(TypeUtil.fromHexString(encoded));
+
+        MetaData.Request request = (MetaData.Request)decoder.decode(buffer);
+
+        assertEquals("GET", request.getMethod());
+        assertEquals(HttpScheme.HTTP.asString(),request.getURI().getScheme());
+        assertEquals("/",request.getURI().getPath());
+        assertEquals("www.example.com",request.getURI().getHost());
+        assertFalse(request.iterator().hasNext());
+
+        // Second request
+        encoded="828684be58086e6f2d6361636865";
+        buffer = ByteBuffer.wrap(TypeUtil.fromHexString(encoded));
+
+        request = (MetaData.Request)decoder.decode(buffer);
+
+        assertEquals("GET", request.getMethod());
+        assertEquals(HttpScheme.HTTP.asString(),request.getURI().getScheme());
+        assertEquals("/",request.getURI().getPath());
+        assertEquals("www.example.com",request.getURI().getHost());
+        Iterator<HttpField> iterator=request.iterator();
+        assertTrue(iterator.hasNext());
+        assertEquals(new HttpField("cache-control","no-cache"),iterator.next());
+        assertFalse(iterator.hasNext());
+
+        // Third request
+        encoded="828785bf400a637573746f6d2d6b65790c637573746f6d2d76616c7565";
+        buffer = ByteBuffer.wrap(TypeUtil.fromHexString(encoded));
+
+        request = (MetaData.Request)decoder.decode(buffer);
+
+        assertEquals("GET",request.getMethod());
+        assertEquals(HttpScheme.HTTPS.asString(),request.getURI().getScheme());
+        assertEquals("/index.html",request.getURI().getPath());
+        assertEquals("www.example.com",request.getURI().getHost());
+        iterator=request.iterator();
+        assertTrue(iterator.hasNext());
+        assertEquals(new HttpField("custom-key","custom-value"),iterator.next());
+        assertFalse(iterator.hasNext());
+    }
+
+    @Test
+    public void testDecodeD_4()
+    {
+        HpackDecoder decoder = new HpackDecoder(4096,8192);
+
+        // First request
+        String encoded="828684418cf1e3c2e5f23a6ba0ab90f4ff";
+        ByteBuffer buffer = ByteBuffer.wrap(TypeUtil.fromHexString(encoded));
+
+        MetaData.Request request = (MetaData.Request)decoder.decode(buffer);
+
+        assertEquals("GET", request.getMethod());
+        assertEquals(HttpScheme.HTTP.asString(),request.getURI().getScheme());
+        assertEquals("/",request.getURI().getPath());
+        assertEquals("www.example.com",request.getURI().getHost());
+        assertFalse(request.iterator().hasNext());
+
+        // Second request
+        encoded="828684be5886a8eb10649cbf";
+        buffer = ByteBuffer.wrap(TypeUtil.fromHexString(encoded));
+
+        request = (MetaData.Request)decoder.decode(buffer);
+
+        assertEquals("GET", request.getMethod());
+        assertEquals(HttpScheme.HTTP.asString(),request.getURI().getScheme());
+        assertEquals("/",request.getURI().getPath());
+        assertEquals("www.example.com",request.getURI().getHost());
+        Iterator<HttpField> iterator=request.iterator();
+        assertTrue(iterator.hasNext());
+        assertEquals(new HttpField("cache-control","no-cache"),iterator.next());
+        assertFalse(iterator.hasNext());
+    }
+
+    @Test
+    public void testDecodeWithArrayOffset()
+    {
+        String value = "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==";
+
+        HpackDecoder decoder = new HpackDecoder(4096,8192);
+        String encoded = "8682418cF1E3C2E5F23a6bA0Ab90F4Ff841f0822426173696320515778685a475270626a70766347567549484e6c633246745a513d3d";
+        byte[] bytes = TypeUtil.fromHexString(encoded);
+        byte[] array = new byte[bytes.length + 1];
+        System.arraycopy(bytes, 0, array, 1, bytes.length);
+        ByteBuffer buffer = ByteBuffer.wrap(array, 1, bytes.length).slice();
+
+        MetaData.Request request = (MetaData.Request)decoder.decode(buffer);
+
+        assertEquals("GET", request.getMethod());
+        assertEquals(HttpScheme.HTTP.asString(),request.getURI().getScheme());
+        assertEquals("/",request.getURI().getPath());
+        assertEquals("www.example.com",request.getURI().getHost());
+        assertEquals(1,request.getFields().size());
+        HttpField field = request.iterator().next();
+        assertEquals(HttpHeader.AUTHORIZATION, field.getHeader());
+        assertEquals(value, field.getValue());
+    }
+
+    @Test
+    public void testDecodeHuffmanWithArrayOffset()
+    {
+        HpackDecoder decoder = new HpackDecoder(4096,8192);
+
+        String encoded="8286418cf1e3c2e5f23a6ba0ab90f4ff84";
+        byte[] bytes = TypeUtil.fromHexString(encoded);
+        byte[] array = new byte[bytes.length + 1];
+        System.arraycopy(bytes, 0, array, 1, bytes.length);
+        ByteBuffer buffer = ByteBuffer.wrap(array, 1, bytes.length).slice();
+
+        MetaData.Request request = (MetaData.Request)decoder.decode(buffer);
+
+        assertEquals("GET", request.getMethod());
+        assertEquals(HttpScheme.HTTP.asString(),request.getURI().getScheme());
+        assertEquals("/",request.getURI().getPath());
+        assertEquals("www.example.com",request.getURI().getHost());
+        assertFalse(request.iterator().hasNext());
+    }
+}
diff --git a/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/HpackEncoderTest.java b/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/HpackEncoderTest.java
new file mode 100644
index 0000000..c243ac0
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/HpackEncoderTest.java
@@ -0,0 +1,190 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.http2.hpack;
+
+
+import static org.junit.Assert.assertThat;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.util.BufferUtil;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+/* ------------------------------------------------------------ */
+/**
+ */
+public class HpackEncoderTest
+{
+    @Test
+    public void testUnknownFieldsContextManagement()
+    {
+        HpackEncoder encoder = new HpackEncoder(38*5);
+        HttpFields fields = new HttpFields();
+        
+
+        HttpField[] field = 
+        {
+           new HttpField("fo0","b0r"),
+           new HttpField("fo1","b1r"),
+           new HttpField("fo2","b2r"),
+           new HttpField("fo3","b3r"),
+           new HttpField("fo4","b4r"),
+           new HttpField("fo5","b5r"),
+           new HttpField("fo6","b6r"),
+           new HttpField("fo7","b7r"),
+           new HttpField("fo8","b8r"),
+           new HttpField("fo9","b9r"),
+           new HttpField("foA","bAr"),
+        };
+        
+        // Add 4 entries
+        for (int i=0;i<=3;i++)  
+            fields.add(field[i]);
+        
+        // encode them
+        ByteBuffer buffer = BufferUtil.allocate(4096);
+        int pos = BufferUtil.flipToFill(buffer);
+        encoder.encode(buffer,new MetaData(HttpVersion.HTTP_2,fields));
+        BufferUtil.flipToFlush(buffer,pos);
+        
+        // something was encoded!
+        assertThat(buffer.remaining(),Matchers.greaterThan(0));
+        
+        // All are in the dynamic table
+        Assert.assertEquals(4,encoder.getHpackContext().size());
+                
+        // encode exact same fields again!
+        BufferUtil.clearToFill(buffer);
+        encoder.encode(buffer,new MetaData(HttpVersion.HTTP_2,fields));
+        BufferUtil.flipToFlush(buffer,0);
+
+        // All are in the dynamic table
+        Assert.assertEquals(4,encoder.getHpackContext().size());
+        
+        // Add 4 more fields
+        for (int i=4;i<=7;i++)  
+            fields.add(field[i]);
+        
+        // encode
+        BufferUtil.clearToFill(buffer);
+        encoder.encode(buffer,new MetaData(HttpVersion.HTTP_2,fields));
+        BufferUtil.flipToFlush(buffer,0);
+
+        // something was encoded!
+        assertThat(buffer.remaining(),Matchers.greaterThan(0));
+
+        // max dynamic table size reached
+        Assert.assertEquals(5,encoder.getHpackContext().size());
+        
+        
+        // remove some fields
+        for (int i=0;i<=7;i+=2)  
+            fields.remove(field[i].getName());
+
+        // encode
+        BufferUtil.clearToFill(buffer);
+        encoder.encode(buffer,new MetaData(HttpVersion.HTTP_2,fields));
+        BufferUtil.flipToFlush(buffer,0);
+        
+        // something was encoded!
+        assertThat(buffer.remaining(),Matchers.greaterThan(0));
+
+        // max dynamic table size reached
+        Assert.assertEquals(5,encoder.getHpackContext().size());
+
+
+        // remove another fields
+        fields.remove(field[1].getName());
+
+        // encode
+        BufferUtil.clearToFill(buffer);
+        encoder.encode(buffer,new MetaData(HttpVersion.HTTP_2,fields));
+        BufferUtil.flipToFlush(buffer,0);
+        
+        // something was encoded!
+        assertThat(buffer.remaining(),Matchers.greaterThan(0));
+
+        // max dynamic table size reached
+        Assert.assertEquals(5,encoder.getHpackContext().size());
+
+        
+        // re add the field
+
+        fields.add(field[1]);
+
+        // encode
+        BufferUtil.clearToFill(buffer);
+        encoder.encode(buffer,new MetaData(HttpVersion.HTTP_2,fields));
+        BufferUtil.flipToFlush(buffer,0);
+        
+        // something was encoded!
+        assertThat(buffer.remaining(),Matchers.greaterThan(0));
+
+        // max dynamic table size reached
+        Assert.assertEquals(5,encoder.getHpackContext().size());
+
+    }
+
+
+    @Test
+    public void testNeverIndexSetCookie()
+    {
+        HpackEncoder encoder = new HpackEncoder(38*5);
+        ByteBuffer buffer = BufferUtil.allocate(4096);
+        
+        HttpFields fields = new HttpFields();
+        fields.put("set-cookie","some cookie value");
+
+        // encode
+        BufferUtil.clearToFill(buffer);
+        encoder.encode(buffer,new MetaData(HttpVersion.HTTP_2,fields));
+        BufferUtil.flipToFlush(buffer,0);
+        
+        // something was encoded!
+        assertThat(buffer.remaining(),Matchers.greaterThan(0));
+        
+        // empty dynamic table
+        Assert.assertEquals(0,encoder.getHpackContext().size());
+        
+
+        // encode again
+        BufferUtil.clearToFill(buffer);
+        encoder.encode(buffer,new MetaData(HttpVersion.HTTP_2,fields));
+        BufferUtil.flipToFlush(buffer,0);
+        
+        // something was encoded!
+        assertThat(buffer.remaining(),Matchers.greaterThan(0));
+        
+        // empty dynamic table
+        Assert.assertEquals(0,encoder.getHpackContext().size());
+        
+    }
+    
+
+    
+
+}
diff --git a/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/HpackPerfTest.java b/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/HpackPerfTest.java
new file mode 100644
index 0000000..7e219f3
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/HpackPerfTest.java
@@ -0,0 +1,135 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.http2.hpack;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.FilenameFilter;
+import java.nio.ByteBuffer;
+import java.util.Map;
+
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.ajax.JSON;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class HpackPerfTest
+{
+    int _maxDynamicTableSize=4*1024;
+    int _unencodedSize;
+    int _encodedSize;
+    
+    @Before
+    public void before()
+    {
+        _unencodedSize=0;
+        _encodedSize=0;
+    }
+
+    @After
+    public void after()
+    {        
+        System.err.printf("dynamictable=%d unencoded=%d encoded=%d p=%3.1f%%%n",_maxDynamicTableSize,_unencodedSize,_encodedSize,100.0*_encodedSize/_unencodedSize);
+
+    }
+    
+    @Test
+    public void simpleTest() throws Exception
+    {
+        runStories(_maxDynamicTableSize);
+    }
+    
+    private void runStories(int maxDynamicTableSize) throws Exception
+    {
+        // Find files
+        File data = MavenTestingUtils.getTestResourceDir("data");
+        String[] files = data.list(new FilenameFilter()
+        {
+            @Override
+            public boolean accept(File dir, String name)
+            {
+                return name.startsWith("story_");
+            }
+        });
+        
+        // Parse JSON
+        Map<String,Object>[] stories = new Map[files.length];
+        int i=0;
+        for (String story : files)
+            stories[i++]=(Map<String,Object>)JSON.parse(new FileReader(new File(data,story)));
+        
+        ByteBuffer buffer = BufferUtil.allocate(256*1024);
+        
+        // Encode all the requests
+        encodeStories(buffer,stories,"request");
+
+        // clear table
+        BufferUtil.clearToFill(buffer);
+        BufferUtil.flipToFlush(buffer,0);
+        
+        // Encode all the responses
+        encodeStories(buffer,stories,"response");
+        
+    }
+    
+    private void encodeStories(ByteBuffer buffer,Map<String,Object>[] stories, String type) throws Exception
+    {
+        for (Map<String,Object> story : stories)
+        {
+            if (type.equals(story.get("context")))
+            {
+                HpackEncoder encoder = new HpackEncoder(_maxDynamicTableSize,_maxDynamicTableSize);
+                
+                // System.err.println(story);
+                Object[] cases = (Object[])story.get("cases");
+                for (Object c : cases)
+                {
+                    // System.err.println("  "+c);
+                    Object[] headers = (Object[])((Map<String,Object>)c).get("headers");
+                    // System.err.println("    "+headers);
+                    HttpFields fields = new HttpFields();
+                    for (Object header:headers)
+                    {
+                        Map<String,String> h = (Map<String,String>)header;
+                        Map.Entry<String, String> e = h.entrySet().iterator().next();
+                        fields.add(e.getKey(),e.getValue());
+                        _unencodedSize+=e.getKey().length()+e.getValue().length();
+                        
+                    }
+
+                    BufferUtil.clearToFill(buffer);
+                    encoder.encode(buffer,new MetaData(HttpVersion.HTTP_2,fields));
+                    BufferUtil.flipToFlush(buffer,0);
+                    _encodedSize+=buffer.remaining();
+                    
+                }
+            }
+        }
+
+    }
+    
+    
+}
diff --git a/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/HpackTest.java b/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/HpackTest.java
new file mode 100644
index 0000000..a61860a
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/HpackTest.java
@@ -0,0 +1,207 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.hpack;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http.BadMessageException;
+import org.eclipse.jetty.http.DateGenerator;
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http.MetaData.Response;
+import org.eclipse.jetty.http.PreEncodedHttpField;
+import org.eclipse.jetty.util.BufferUtil;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class HpackTest
+{
+    final static HttpField ServerJetty = new PreEncodedHttpField(HttpHeader.SERVER,"jetty");
+    final static HttpField XPowerJetty = new PreEncodedHttpField(HttpHeader.X_POWERED_BY,"jetty");
+    final static HttpField Date = new PreEncodedHttpField(HttpHeader.DATE,DateGenerator.formatDate(System.currentTimeMillis()));
+    
+    @Test
+    public void encodeDecodeResponseTest()
+    {
+        HpackEncoder encoder = new HpackEncoder();
+        HpackDecoder decoder = new HpackDecoder(4096,8192);
+        ByteBuffer buffer = BufferUtil.allocate(16*1024);
+        
+        HttpFields fields0 = new HttpFields();
+        fields0.add(HttpHeader.CONTENT_TYPE,"text/html");
+        fields0.add(HttpHeader.CONTENT_LENGTH,"1024");
+        fields0.add(ServerJetty);
+        fields0.add(XPowerJetty);
+        fields0.add(Date);
+        fields0.add(HttpHeader.SET_COOKIE,"abcdefghijklmnopqrstuvwxyz");
+        fields0.add("custom-key","custom-value");
+        Response original0 = new MetaData.Response(HttpVersion.HTTP_2,200,fields0);
+        
+        BufferUtil.clearToFill(buffer);
+        encoder.encode(buffer,original0);
+        BufferUtil.flipToFlush(buffer,0);
+        Response decoded0 = (Response)decoder.decode(buffer);
+
+        assertMetadataSame(original0,decoded0);
+        
+        // Same again?
+        BufferUtil.clearToFill(buffer);
+        encoder.encode(buffer,original0);
+        BufferUtil.flipToFlush(buffer,0);
+        Response decoded0b = (Response)decoder.decode(buffer);
+
+        assertMetadataSame(original0,decoded0b);        
+
+        HttpFields fields1 = new HttpFields();
+        fields1.add(HttpHeader.CONTENT_TYPE,"text/plain");
+        fields1.add(HttpHeader.CONTENT_LENGTH,"1234");
+        fields1.add(ServerJetty);
+        fields0.add(XPowerJetty);
+        fields0.add(Date);
+        fields1.add("Custom-Key","Other-Value");
+        Response original1 = new MetaData.Response(HttpVersion.HTTP_2,200,fields1);
+
+        // Same again?
+        BufferUtil.clearToFill(buffer);
+        encoder.encode(buffer,original1);
+        BufferUtil.flipToFlush(buffer,0);
+        Response decoded1 = (Response)decoder.decode(buffer);
+
+        assertMetadataSame(original1,decoded1);
+        Assert.assertEquals("custom-key",decoded1.getFields().getField("Custom-Key").getName());
+    }
+    
+    @Test
+    public void encodeDecodeTooLargeTest()
+    {
+        HpackEncoder encoder = new HpackEncoder();
+        HpackDecoder decoder = new HpackDecoder(4096,101);
+        ByteBuffer buffer = BufferUtil.allocate(16*1024);
+        
+        HttpFields fields0 = new HttpFields();
+        fields0.add("1234567890","1234567890123456789012345678901234567890");
+        fields0.add("Cookie","abcdeffhijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR");
+        MetaData original0= new MetaData(HttpVersion.HTTP_2,fields0);
+        
+        BufferUtil.clearToFill(buffer);
+        encoder.encode(buffer,original0);
+        BufferUtil.flipToFlush(buffer,0);
+        MetaData decoded0 = (MetaData)decoder.decode(buffer);
+
+        assertMetadataSame(original0,decoded0);
+               
+        HttpFields fields1 = new HttpFields();
+        fields1.add("1234567890","1234567890123456789012345678901234567890");
+        fields1.add("Cookie","abcdeffhijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR");
+        fields1.add("x","y");
+        MetaData original1 = new MetaData(HttpVersion.HTTP_2,fields1);
+
+        BufferUtil.clearToFill(buffer);
+        encoder.encode(buffer,original1);
+        BufferUtil.flipToFlush(buffer,0);
+        try
+        {
+            decoder.decode(buffer);
+            Assert.fail();
+        }
+        catch(BadMessageException e)
+        {
+            assertEquals(HttpStatus.REQUEST_ENTITY_TOO_LARGE_413,e.getCode());
+        }
+    }
+
+    @Test
+    public void evictReferencedFieldTest()
+    {
+        HpackEncoder encoder = new HpackEncoder(200,200);
+        HpackDecoder decoder = new HpackDecoder(200,1024);
+        ByteBuffer buffer = BufferUtil.allocate(16*1024);
+        
+        HttpFields fields0 = new HttpFields();
+        fields0.add("123456789012345678901234567890123456788901234567890","value");
+        fields0.add("foo","abcdeffhijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR");
+        MetaData original0= new MetaData(HttpVersion.HTTP_2,fields0);
+
+        BufferUtil.clearToFill(buffer);
+        encoder.encode(buffer,original0);
+        BufferUtil.flipToFlush(buffer,0);
+        MetaData decoded0 = (MetaData)decoder.decode(buffer);
+
+        assertEquals(2,encoder.getHpackContext().size());
+        assertEquals(2,decoder.getHpackContext().size());
+        assertEquals("123456789012345678901234567890123456788901234567890",encoder.getHpackContext().get(HpackContext.STATIC_TABLE.length+1).getHttpField().getName());
+        assertEquals("foo",encoder.getHpackContext().get(HpackContext.STATIC_TABLE.length+0).getHttpField().getName());
+        
+        assertMetadataSame(original0,decoded0);
+               
+        HttpFields fields1 = new HttpFields();
+        fields1.add("123456789012345678901234567890123456788901234567890","other_value");
+        fields1.add("x","y");
+        MetaData original1 = new MetaData(HttpVersion.HTTP_2,fields1);
+
+        BufferUtil.clearToFill(buffer);
+        encoder.encode(buffer,original1);
+        BufferUtil.flipToFlush(buffer,0);
+        MetaData decoded1 = (MetaData)decoder.decode(buffer);
+        assertMetadataSame(original1,decoded1);
+        
+        assertEquals(2,encoder.getHpackContext().size());
+        assertEquals(2,decoder.getHpackContext().size());
+        assertEquals("x",encoder.getHpackContext().get(HpackContext.STATIC_TABLE.length+0).getHttpField().getName());
+        assertEquals("foo",encoder.getHpackContext().get(HpackContext.STATIC_TABLE.length+1).getHttpField().getName());        
+    }
+    
+    private void assertMetadataSame(MetaData.Response expected, MetaData.Response actual)
+    {
+        assertThat("Response.status", actual.getStatus(), is(expected.getStatus()));
+        assertThat("Response.reason", actual.getReason(), is(expected.getReason()));
+        assertMetadataSame((MetaData)expected,(MetaData)actual);
+    }
+
+    private void assertMetadataSame(MetaData expected, MetaData actual)
+    {
+        assertThat("Metadata.contentLength",actual.getContentLength(),is(expected.getContentLength()));
+        assertThat("Metadata.version" + ".version", actual.getVersion(), is(expected.getVersion()));
+        assertHttpFieldsSame("Metadata.fields",expected.getFields(),actual.getFields());
+    }
+
+    private void assertHttpFieldsSame(String msg, HttpFields expected, HttpFields actual)
+    {
+        assertThat(msg + ".size", actual.size(), is(expected.size()));
+        
+        for (HttpField actualField : actual)
+        {
+            if ("DATE".equalsIgnoreCase(actualField.getName()))
+            {
+                // skip comparison on Date, as these values can often differ by 1 second
+                // during testing.
+                continue;
+            }
+            assertThat(msg + ".contains(" + actualField + ")",expected.contains(actualField),is(true));
+        }
+    }
+}
diff --git a/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/HuffmanTest.java b/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/HuffmanTest.java
new file mode 100644
index 0000000..ce0c71f
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/HuffmanTest.java
@@ -0,0 +1,107 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.hpack;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.TypeUtil;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class HuffmanTest
+{
+    String[][] tests =
+        {
+            {"D.4.1","f1e3c2e5f23a6ba0ab90f4ff","www.example.com"},
+            {"D.4.2","a8eb10649cbf","no-cache"},
+            {"D.6.1k","6402","302"},
+            {"D.6.1v","aec3771a4b","private"},
+            {"D.6.1d","d07abe941054d444a8200595040b8166e082a62d1bff","Mon, 21 Oct 2013 20:13:21 GMT"},
+            {"D.6.1l","9d29ad171863c78f0b97c8e9ae82ae43d3","https://www.example.com"},
+            {"D.6.2te","640cff","303"},
+        };
+    
+    @Test
+    public void testDecode() throws Exception
+    {
+        for (String[] test:tests)
+        {
+            byte[] encoded=TypeUtil.fromHexString(test[1]);
+            String decoded=Huffman.decode(ByteBuffer.wrap(encoded));
+            Assert.assertEquals(test[0],test[2],decoded);
+        }
+    }
+    
+    @Test
+    public void testDecodeTrailingFF() throws Exception
+    {
+        for (String[] test:tests)
+        {
+            byte[] encoded=TypeUtil.fromHexString(test[1]+"FF");
+            String decoded=Huffman.decode(ByteBuffer.wrap(encoded));
+            Assert.assertEquals(test[0],test[2],decoded);
+        }
+    }
+    
+    @Test
+    public void testEncode() throws Exception
+    {
+        for (String[] test:tests)
+        {
+            ByteBuffer buf = BufferUtil.allocate(1024);
+            int pos=BufferUtil.flipToFill(buf);
+            Huffman.encode(buf,test[2]);
+            BufferUtil.flipToFlush(buf,pos);
+            String encoded=TypeUtil.toHexString(BufferUtil.toArray(buf)).toLowerCase();
+            Assert.assertEquals(test[0],test[1],encoded);
+            Assert.assertEquals(test[1].length()/2,Huffman.octetsNeeded(test[2]));
+        }
+    }
+
+    @Test
+    public void testEncode8859Only() throws Exception
+    {
+        char bad[] = {(char)128,(char)0,(char)-1,' '-1};
+        for (int i=0;i<bad.length;i++)
+        {
+            String s="bad '"+bad[i]+"'";
+            
+            try
+            {
+                Huffman.octetsNeeded(s);
+                Assert.fail("i="+i);
+            }
+            catch(IllegalArgumentException e)
+            {
+            }
+            
+            try
+            {
+                Huffman.encode(BufferUtil.allocate(32),s);
+                Assert.fail("i="+i);
+            }
+            catch(IllegalArgumentException e)
+            {
+            }
+        }
+    }
+    
+    
+}
diff --git a/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/NBitIntegerTest.java b/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/NBitIntegerTest.java
new file mode 100644
index 0000000..99c0b81
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/java/org/eclipse/jetty/http2/hpack/NBitIntegerTest.java
@@ -0,0 +1,214 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.hpack;
+
+import static org.junit.Assert.assertEquals;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.TypeUtil;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class NBitIntegerTest
+{
+
+    @Test 
+    public void testOctetsNeeded()
+    {
+        assertEquals(0,NBitInteger.octectsNeeded(5,10));
+        assertEquals(2,NBitInteger.octectsNeeded(5,1337));
+        assertEquals(1,NBitInteger.octectsNeeded(8,42));
+        assertEquals(3,NBitInteger.octectsNeeded(8,1337));
+
+        assertEquals(0,NBitInteger.octectsNeeded(6,62));
+        assertEquals(1,NBitInteger.octectsNeeded(6,63));
+        assertEquals(1,NBitInteger.octectsNeeded(6,64));
+        assertEquals(2,NBitInteger.octectsNeeded(6,63+0x00+0x80*0x01));
+        assertEquals(3,NBitInteger.octectsNeeded(6,63+0x00+0x80*0x80));
+        assertEquals(4,NBitInteger.octectsNeeded(6,63+0x00+0x80*0x80*0x80));
+    }
+
+    @Test
+    public void testEncode()
+    {
+        testEncode(6,0,"00");
+        testEncode(6,1,"01");
+        testEncode(6,62,"3e");
+        testEncode(6,63,"3f00");
+        testEncode(6,63+1,"3f01");
+        testEncode(6,63+0x7e,"3f7e");
+        testEncode(6,63+0x7f,"3f7f");
+        testEncode(6,63+0x00+0x80*0x01,"3f8001");
+        testEncode(6,63+0x01+0x80*0x01,"3f8101");
+        testEncode(6,63+0x7f+0x80*0x01,"3fFf01");
+        testEncode(6,63+0x00+0x80*0x02,"3f8002");
+        testEncode(6,63+0x01+0x80*0x02,"3f8102");
+        testEncode(6,63+0x7f+0x80*0x7f,"3fFf7f");
+        testEncode(6,63+0x00+0x80*0x80,     "3f808001");
+        testEncode(6,63+0x7f+0x80*0x80*0x7f,"3fFf807f");
+        testEncode(6,63+0x00+0x80*0x80*0x80,"3f80808001");
+
+        testEncode(8,0,"00");
+        testEncode(8,1,"01");
+        testEncode(8,128,"80");
+        testEncode(8,254,"Fe");
+        testEncode(8,255,"Ff00");
+        testEncode(8,255+1,"Ff01");
+        testEncode(8,255+0x7e,"Ff7e");
+        testEncode(8,255+0x7f,"Ff7f");
+        testEncode(8,255+0x80,"Ff8001");
+        testEncode(8,255+0x00+0x80*0x80,"Ff808001");
+    }
+
+    public void testEncode(int n,int i,String expected)
+    {
+        ByteBuffer buf = BufferUtil.allocate(16);
+        int p=BufferUtil.flipToFill(buf);
+        if (n<8)
+            buf.put((byte)0x00);
+        NBitInteger.encode(buf,n,i);
+        BufferUtil.flipToFlush(buf,p);
+        String r=TypeUtil.toHexString(BufferUtil.toArray(buf));
+        assertEquals(expected,r);
+        
+        assertEquals(expected.length()/2,(n<8?1:0)+NBitInteger.octectsNeeded(n,i));
+    }
+    
+    @Test
+    public void testDecode()
+    {
+        testDecode(6,0,"00");
+        testDecode(6,1,"01");
+        testDecode(6,62,"3e");
+        testDecode(6,63,"3f00");
+        testDecode(6,63+1,"3f01");
+        testDecode(6,63+0x7e,"3f7e");
+        testDecode(6,63+0x7f,"3f7f");
+        testDecode(6,63+0x80,"3f8001");
+        testDecode(6,63+0x81,"3f8101");
+        testDecode(6,63+0x7f+0x80*0x01,"3fFf01");
+        testDecode(6,63+0x00+0x80*0x02,"3f8002");
+        testDecode(6,63+0x01+0x80*0x02,"3f8102");
+        testDecode(6,63+0x7f+0x80*0x7f,"3fFf7f");
+        testDecode(6,63+0x00+0x80*0x80,     "3f808001");
+        testDecode(6,63+0x7f+0x80*0x80*0x7f,"3fFf807f");
+        testDecode(6,63+0x00+0x80*0x80*0x80,"3f80808001");
+        
+        testDecode(8,0,"00");
+        testDecode(8,1,"01");
+        testDecode(8,128,"80");
+        testDecode(8,254,"Fe");
+        testDecode(8,255,"Ff00");
+        testDecode(8,255+1,"Ff01");
+        testDecode(8,255+0x7e,"Ff7e");
+        testDecode(8,255+0x7f,"Ff7f");
+        testDecode(8,255+0x80,"Ff8001");
+        testDecode(8,255+0x00+0x80*0x80,"Ff808001");
+    }
+    
+    
+    public void testDecode(int n,int expected,String encoded)
+    {
+        ByteBuffer buf = ByteBuffer.wrap(TypeUtil.fromHexString(encoded));
+        buf.position(n==8?0:1);
+        Assert.assertEquals(expected,NBitInteger.decode(buf,n));
+    }
+    
+    @Test
+    public void testEncodeExampleD_1_1()
+    {
+        ByteBuffer buf = BufferUtil.allocate(16);
+        int p=BufferUtil.flipToFill(buf);
+        buf.put((byte)0x77);
+        buf.put((byte)0xFF);
+        NBitInteger.encode(buf,5,10);
+        BufferUtil.flipToFlush(buf,p);
+        
+        String r=TypeUtil.toHexString(BufferUtil.toArray(buf));
+        
+        assertEquals("77Ea",r);
+        
+    }
+    
+    @Test
+    public void testDecodeExampleD_1_1()
+    {
+        ByteBuffer buf = ByteBuffer.wrap(TypeUtil.fromHexString("77EaFF"));
+        buf.position(2);
+        
+        Assert.assertEquals(10,NBitInteger.decode(buf,5));
+    }
+    
+
+    @Test
+    public void testEncodeExampleD_1_2()
+    {
+        ByteBuffer buf = BufferUtil.allocate(16);
+        int p=BufferUtil.flipToFill(buf);
+        buf.put((byte)0x88);
+        buf.put((byte)0x00);
+        NBitInteger.encode(buf,5,1337);
+        BufferUtil.flipToFlush(buf,p);
+        
+        String r=TypeUtil.toHexString(BufferUtil.toArray(buf));
+        
+        Assert.assertEquals("881f9a0a",r);
+        
+    }
+    
+    @Test
+    public void testDecodeExampleD_1_2()
+    {
+        ByteBuffer buf = ByteBuffer.wrap(TypeUtil.fromHexString("881f9a0aff"));
+        buf.position(2);
+        
+        Assert.assertEquals(1337,NBitInteger.decode(buf,5));
+    }
+    
+    
+    @Test
+    public void testEncodeExampleD_1_3()
+    {
+        ByteBuffer buf = BufferUtil.allocate(16);
+        int p=BufferUtil.flipToFill(buf);
+        buf.put((byte)0x88);
+        buf.put((byte)0xFF);
+        NBitInteger.encode(buf,8,42);
+        BufferUtil.flipToFlush(buf,p);
+        
+        String r=TypeUtil.toHexString(BufferUtil.toArray(buf));
+        
+        Assert.assertEquals("88Ff2a",r);
+        
+    }
+
+    
+    @Test
+    public void testDecodeExampleD_1_3()
+    {
+        ByteBuffer buf = ByteBuffer.wrap(TypeUtil.fromHexString("882aFf"));
+        buf.position(1);
+        
+        Assert.assertEquals(42,NBitInteger.decode(buf,8));
+    }
+    
+
+}
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_00.json b/jetty-http2/http2-hpack/src/test/resources/data/story_00.json
new file mode 100644
index 0000000..44d521f
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_00.json
@@ -0,0 +1,53 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yahoo.co.jp"
+        },
+        {
+          ":path": "/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.yahoo.co.jp"
+        },
+        {
+          ":path": "/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/top/sp2/cmn/logo-ns-130528.png"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_01.json b/jetty-http2/http2-hpack/src/test/resources/data/story_01.json
new file mode 100644
index 0000000..54aab3b
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_01.json
@@ -0,0 +1,52 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":scheme": "https"
+        },
+        {
+          ":authority": "example.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          ":method": "GET"
+        },
+        {
+          "user-agent": "hpack-test"
+        },
+        {
+          "cookie": "xxxxxxx1"
+        },
+        {
+          "x-hello": "world"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":scheme": "https"
+        },
+        {
+          ":authority": "example.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          ":method": "GET"
+        },
+        {
+          "user-agent": "hpack-test"
+        },
+        {
+          "cookie": "xxxxxxx2"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_02.json b/jetty-http2/http2-hpack/src/test/resources/data/story_02.json
new file mode 100644
index 0000000..4348579
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_02.json
@@ -0,0 +1,339 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "amazon.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "g-ecx.images-amazon.com"
+        },
+        {
+          ":path": "/images/G/01/gno/beacon/BeaconSprite-US-01._V401903535_.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.amazon.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "g-ecx.images-amazon.com"
+        },
+        {
+          ":path": "/images/G/01/x-locale/common/transparent-pixel._V386942464_.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.amazon.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "g-ecx.images-amazon.com"
+        },
+        {
+          ":path": "/images/G/01/img12/other/disaster-relief/300-column/sandy-relief_300x75._V400689491_.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.amazon.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.amazon.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "g-ecx.images-amazon.com"
+        },
+        {
+          ":path": "/images/G/01/x-locale/common/transparent-pixel._V192234675_.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.amazon.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "g-ecx.images-amazon.com"
+        },
+        {
+          ":path": "/images/G/01/img12/shoes/sales_events/11_nov/1030_AccessoriesPROMO_GWright._V400626950_.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.amazon.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "g-ecx.images-amazon.com"
+        },
+        {
+          ":path": "/images/G/01/Automotive/rotos/Duracell600_120._V192204764_.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.amazon.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "g-ecx.images-amazon.com"
+        },
+        {
+          ":path": "/images/G/01/ui/loadIndicators/loadIndicator-large._V192195480_.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.amazon.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ecx.images-amazon.com"
+        },
+        {
+          ":path": "/images/I/41HZ-ND-SUL._SL135_.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.amazon.com/"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_03.json b/jetty-http2/http2-hpack/src/test/resources/data/story_03.json
new file mode 100644
index 0000000..3d7e5be
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_03.json
@@ -0,0 +1,342 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "baidu.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "baidu.com"
+        },
+        {
+          ":path": "/favicon.ico"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.baidu.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.baidu.com"
+        },
+        {
+          ":path": "/img/baidu_sylogo1.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.baidu.com/"
+        },
+        {
+          "cookie": "BAIDUID=B6136AC10EBE0A8FCD216EB64C4C1A5C:FG=1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.baidu.com"
+        },
+        {
+          ":path": "/cache/global/img/gs.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.baidu.com/"
+        },
+        {
+          "cookie": "BAIDUID=B6136AC10EBE0A8FCD216EB64C4C1A5C:FG=1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "s1.bdstatic.com"
+        },
+        {
+          ":path": "/r/www/cache/global/js/tangram-1.3.4c1.0.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.baidu.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "s1.bdstatic.com"
+        },
+        {
+          ":path": "/r/www/cache/global/js/home-1.8.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.baidu.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "s1.bdstatic.com"
+        },
+        {
+          ":path": "/r/www/cache/user/js/u-1.3.4.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.baidu.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "s1.bdstatic.com"
+        },
+        {
+          ":path": "/r/www/img/i-1.0.0.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.baidu.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.baidu.com"
+        },
+        {
+          ":path": "/favicon.ico"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "BAIDUID=B6136AC10EBE0A8FCD216EB64C4C1A5C:FG=1"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_04.json b/jetty-http2/http2-hpack/src/test/resources/data/story_04.json
new file mode 100644
index 0000000..3d7e5be
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_04.json
@@ -0,0 +1,342 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "baidu.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "baidu.com"
+        },
+        {
+          ":path": "/favicon.ico"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.baidu.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.baidu.com"
+        },
+        {
+          ":path": "/img/baidu_sylogo1.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.baidu.com/"
+        },
+        {
+          "cookie": "BAIDUID=B6136AC10EBE0A8FCD216EB64C4C1A5C:FG=1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.baidu.com"
+        },
+        {
+          ":path": "/cache/global/img/gs.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.baidu.com/"
+        },
+        {
+          "cookie": "BAIDUID=B6136AC10EBE0A8FCD216EB64C4C1A5C:FG=1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "s1.bdstatic.com"
+        },
+        {
+          ":path": "/r/www/cache/global/js/tangram-1.3.4c1.0.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.baidu.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "s1.bdstatic.com"
+        },
+        {
+          ":path": "/r/www/cache/global/js/home-1.8.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.baidu.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "s1.bdstatic.com"
+        },
+        {
+          ":path": "/r/www/cache/user/js/u-1.3.4.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.baidu.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "s1.bdstatic.com"
+        },
+        {
+          ":path": "/r/www/img/i-1.0.0.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.baidu.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.baidu.com"
+        },
+        {
+          ":path": "/favicon.ico"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "BAIDUID=B6136AC10EBE0A8FCD216EB64C4C1A5C:FG=1"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_05.json b/jetty-http2/http2-hpack/src/test/resources/data/story_05.json
new file mode 100644
index 0000000..dfcd8e1
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_05.json
@@ -0,0 +1,366 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "geo.craigslist.org"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "cl_b=AB2BKbsl4hGM7M4nH5PYWghTM5A"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.craigslist.org"
+        },
+        {
+          ":path": "/about/sites/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "cl_b=AB2BKbsl4hGM7M4nH5PYWghTM5A"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.craigslist.org"
+        },
+        {
+          ":path": "/styles/countries.css"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.craigslist.org/about/sites/"
+        },
+        {
+          "cookie": "cl_b=AB2BKbsl4hGM7M4nH5PYWghTM5A"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.craigslist.org"
+        },
+        {
+          ":path": "/js/formats.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.craigslist.org/about/sites/"
+        },
+        {
+          "cookie": "cl_b=AB2BKbsl4hGM7M4nH5PYWghTM5A"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.craigslist.org"
+        },
+        {
+          ":path": "/js/jquery-1.4.2.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.craigslist.org/about/sites/"
+        },
+        {
+          "cookie": "cl_b=AB2BKbsl4hGM7M4nH5PYWghTM5A"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.craigslist.org"
+        },
+        {
+          ":path": "/favicon.ico"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "cl_b=AB2BKbsl4hGM7M4nH5PYWghTM5A"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "shoals.craigslist.org"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.craigslist.org/about/sites/"
+        },
+        {
+          "cookie": "cl_b=AB2BKbsl4hGM7M4nH5PYWghTM5A"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.craigslist.org"
+        },
+        {
+          ":path": "/styles/craigslist.css"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://shoals.craigslist.org/"
+        },
+        {
+          "cookie": "cl_b=AB2BKbsl4hGM7M4nH5PYWghTM5A; cl_def_lang=en; cl_def_hp=shoals"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.craigslist.org"
+        },
+        {
+          ":path": "/js/formats.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://shoals.craigslist.org/"
+        },
+        {
+          "cookie": "cl_b=AB2BKbsl4hGM7M4nH5PYWghTM5A; cl_def_lang=en; cl_def_hp=shoals"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.craigslist.org"
+        },
+        {
+          ":path": "/js/homepage.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://shoals.craigslist.org/"
+        },
+        {
+          "cookie": "cl_b=AB2BKbsl4hGM7M4nH5PYWghTM5A; cl_def_lang=en; cl_def_hp=shoals"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_06.json b/jetty-http2/http2-hpack/src/test/resources/data/story_06.json
new file mode 100644
index 0000000..74dac51
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_06.json
@@ -0,0 +1,342 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ebay.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.ebay.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ebay-stories.com"
+        },
+        {
+          ":path": "/wp-content/uploads/2012/11/Iso-65.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.ebay.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "rover.ebay.com"
+        },
+        {
+          ":path": "/roversync/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.ebay.com/"
+        },
+        {
+          "cookie": "ebay=%5Esbf%3D%23%5E; dp1=bpbf/%238000000000005276504d^u1p/QEBfX0BAX19AQA**5276504d^; cssg=c67883f113a0a56964e646c6ffaa1abe; s=CgAD4ACBQlm5NYzY3ODgzZjExM2EwYTU2OTY0ZTY0NmM2ZmZhYTFhYmUBSgAYUJZuTTUwOTUxY2NkLjAuMS4zLjE1MS4zLjAuMeN+7JE*; nonsession=CgAFMABhSdlBNNTA5NTFjY2QuMC4xLjEuMTQ5LjMuMC4xAMoAIFn7Hk1jNjc4ODNmMTEzYTBhNTY5NjRlNjQ2YzZmZmFhMWFjMQDLAAFQlSPVMX8u5Z8*"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "p.ebaystatic.com"
+        },
+        {
+          ":path": "/aw/pics/s.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.ebay.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "p.ebaystatic.com"
+        },
+        {
+          ":path": "/aw/pics/mops/2012_doodles/Holiday/DS3/ImgWeek_1_Penguin_Small_150x30.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.ebay.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "p.ebaystatic.com"
+        },
+        {
+          ":path": "/aw/pics/globalHeader/facebook/g12.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.ebay.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "p.ebaystatic.com"
+        },
+        {
+          ":path": "/aw/pics/globalHeader/twitter/g12.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.ebay.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "p.ebaystatic.com"
+        },
+        {
+          ":path": "/aw/pics/globalHeader/icon_mobile_gray_11x16.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.ebay.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "srx.main.ebayrtm.com"
+        },
+        {
+          ":path": "/rtm"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.ebay.com/"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_07.json b/jetty-http2/http2-hpack/src/test/resources/data/story_07.json
new file mode 100644
index 0000000..cabe2c3
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_07.json
@@ -0,0 +1,345 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "static.ak.fbcdn.net"
+        },
+        {
+          ":path": "/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.facebook.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "static.ak.fbcdn.net"
+        },
+        {
+          ":path": "/rsrc.php/v2/yY/r/u8iA3kXb8Y1.css"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.facebook.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "static.ak.fbcdn.net"
+        },
+        {
+          ":path": "/rsrc.php/v2/yI/r/qANVTsC52fp.css"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.facebook.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "static.ak.fbcdn.net"
+        },
+        {
+          ":path": "/rsrc.php/v2/yt/r/FZaMKqARgC6.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.facebook.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "static.ak.fbcdn.net"
+        },
+        {
+          ":path": "/rsrc.php/v2/yZ/r/jlKDoX15kHG.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.facebook.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "static.ak.fbcdn.net"
+        },
+        {
+          ":path": "/rsrc.php/v2/yO/r/_MRarphcCIq.css"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.facebook.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "static.ak.fbcdn.net"
+        },
+        {
+          ":path": "/rsrc.php/v2/yP/r/CRkiDDWTd1u.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.facebook.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "static.ak.fbcdn.net"
+        },
+        {
+          ":path": "/rsrc.php/v2/yX/x/Qq6L1haQrYr.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://static.ak.fbcdn.net/rsrc.php/v2/yI/r/qANVTsC52fp.css"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "static.ak.fbcdn.net"
+        },
+        {
+          ":path": "/rsrc.php/v2/yN/r/EarbWo_mDU-.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.facebook.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "static.ak.fbcdn.net"
+        },
+        {
+          ":path": "/rsrc.php/v2/y7/x/9jt7oVdF7z3.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://static.ak.fbcdn.net/rsrc.php/v2/yO/r/_MRarphcCIq.css"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_08.json b/jetty-http2/http2-hpack/src/test/resources/data/story_08.json
new file mode 100644
index 0000000..f0fefde
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_08.json
@@ -0,0 +1,363 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "flickr.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.flickr.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "BX=c99r6jp89a7no&b=3&s=q4; localization=en-us%3Bus%3Bus"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "us.adserver.yahoo.com"
+        },
+        {
+          ":path": "/a"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.flickr.com/"
+        },
+        {
+          "cookie": "B=4m2rqu589a507&b=3&s=1v; k_visit=1; MSC=t=1351947310X; CH=AgBQlRQgADwDIAAbDSAAGrIgADpuIAAoriAALMQgAAs0IAA7CCAAJ0MgABo3; ucs=bnas=0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.flickr.com"
+        },
+        {
+          ":path": "/images/share-this-icons-sprite.png.v6"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "BX=c99r6jp89a7no&b=3&s=q4; localization=en-us%3Bus%3Bus"
+        },
+        {
+          "referer": "http://www.flickr.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.flickr.com"
+        },
+        {
+          ":path": "/images/flickr-sprite.png.v4"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.flickr.com/"
+        },
+        {
+          "cookie": "BX=c99r6jp89a7no&b=3&s=q4; localization=en-us%3Bus%3Bus"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.flickr.com"
+        },
+        {
+          ":path": "/flanal_event.gne"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "BX=c99r6jp89a7no&b=3&s=q4; localization=en-us%3Bus%3Bus; ywadp10001561398679=1956875541"
+        },
+        {
+          "referer": "http://www.flickr.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "y.analytics.yahoo.com"
+        },
+        {
+          ":path": "/fpc.pl"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.flickr.com/"
+        },
+        {
+          "cookie": "B=4m2rqu589a507&b=3&s=1v; k_visit=1; MSC=t=1351947310X; CH=AgBQlRQgADwDIAAbDSAAGrIgADpuIAAoriAALMQgAAs0IAA7CCAAJ0MgABo3; ucs=bnas=0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "d.yimg.com"
+        },
+        {
+          ":path": "/ce/soup/soup_generated_fragment.gne"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.flickr.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "geo.yahoo.com"
+        },
+        {
+          ":path": "/b"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.flickr.com/"
+        },
+        {
+          "cookie": "B=4m2rqu589a507&b=3&s=1v; k_visit=1; MSC=t=1351947310X; CH=AgBQlRQgADwDIAAbDSAAGrIgADpuIAAoriAALMQgAAs0IAA7CCAAJ0MgABo3; ucs=bnas=0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.flickr.com"
+        },
+        {
+          ":path": "/photos/nasacommons/4940913342/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "BX=c99r6jp89a7no&b=3&s=q4; localization=en-us%3Bus%3Bus; ywadp10001561398679=1956875541; fl_v=souhp; fpc10001561398679=Qvv1ikW_|aUqazlyMaa|fses10001561398679=|aUqazlyMaa|Qvv1ikW_|fvis10001561398679=Zj1odHRwJTNBJTJGJTJGd3d3LmZsaWNrci5jb20lMkYmdD0xMzUxOTUwMDc1JmI9JTJGaW5kZXhfc291cC5nbmU=|8M1871YYH0|8M1871YYH0|8M1871YYH0|8|8M1871YYH0|8M1871YYH0"
+        },
+        {
+          "referer": "http://www.flickr.com/"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_09.json b/jetty-http2/http2-hpack/src/test/resources/data/story_09.json
new file mode 100644
index 0000000..b922bc7
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_09.json
@@ -0,0 +1,345 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "linkedin.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.linkedin.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "s.c.lnkd.licdn.com"
+        },
+        {
+          ":path": "/scds/concat/common/js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.linkedin.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "s.c.lnkd.licdn.com"
+        },
+        {
+          ":path": "/scds/concat/common/css"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.linkedin.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "s.c.lnkd.licdn.com"
+        },
+        {
+          ":path": "/scds/concat/common/js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.linkedin.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "s.c.lnkd.licdn.com"
+        },
+        {
+          ":path": "/scds/concat/common/css"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.linkedin.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "s.c.lnkd.licdn.com"
+        },
+        {
+          ":path": "/scds/concat/common/css"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.linkedin.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "s.c.lnkd.licdn.com"
+        },
+        {
+          ":path": "/scds/concat/common/js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.linkedin.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.linkedin.com"
+        },
+        {
+          ":path": "/analytics/noauthtracker"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-requested-with": "XMLHttpRequest"
+        },
+        {
+          "referer": "http://www.linkedin.com/"
+        },
+        {
+          "cookie": "bcookie=\"v=2&bae845a5-83ed-4590-becf-f0f3d586432b\"; leo_auth_token=\"GST:UDbWFFpLLdcS6gHJ7NJa3XYRsc7W_gDwutbWnlWLfo7G_2Y4jfLH-H:1351948419:4b5c0f1309310a9b659b97d8960e64fdd635526b\"; JSESSIONID=\"ajax:0608630266152992729\"; visit=\"v=1&G\"; X-LI-IDC=C1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "s.c.lnkd.licdn.com"
+        },
+        {
+          ":path": "/scds/common/u/img/favicon_v3.ico"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.linkedin.com/"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_10.json b/jetty-http2/http2-hpack/src/test/resources/data/story_10.json
new file mode 100644
index 0000000..686aa68
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_10.json
@@ -0,0 +1,339 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "msn.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.msn.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ads1.msads.net"
+        },
+        {
+          ":path": "/library/primedns.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.msn.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "col.stj.s-msn.com"
+        },
+        {
+          ":path": "/primedns.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.msn.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "blu.stc.s-msn.com"
+        },
+        {
+          ":path": "/as/wea3/i/en-us/law/39.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.msn.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "col.stj.s-msn.com"
+        },
+        {
+          ":path": "/primedns.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.msn.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "col.stc.s-msn.com"
+        },
+        {
+          ":path": "/br/sc/i/ff/adchoices_gif2.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.msn.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "col.stb00.s-msn.com"
+        },
+        {
+          ":path": "/i/80/53CAC6A10B6248682CF221B24A92.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.msn.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "col.stb01.s-msn.com"
+        },
+        {
+          ":path": "/i/E0/A6C312635EF0A355668C820EB5343.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.msn.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "col.stb00.s-msn.com"
+        },
+        {
+          ":path": "/i/BB/B1F619A1AD4D4AA6B0648BDBBCDEED.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.msn.com/"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_11.json b/jetty-http2/http2-hpack/src/test/resources/data/story_11.json
new file mode 100644
index 0000000..cc86a09
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_11.json
@@ -0,0 +1,369 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "nytimes.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "t.pointroll.com"
+        },
+        {
+          ":path": "/PointRoll/Track/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.bbc.co.uk/news/business-20178000"
+        },
+        {
+          "cookie": "PRbu=EzZdduhgq; PRgo=BBBAAFMnA; PRti4CD975E46CAEA=B"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "t.pointroll.com"
+        },
+        {
+          ":path": "/PointRoll/Track/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.bbc.co.uk/news/business-20178000"
+        },
+        {
+          "cookie": "PRbu=EzZdduhgq; PRgo=BBBAAFMnA; PRti4CD975E46CAEA=B"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "graphics8.nytimes.com"
+        },
+        {
+          ":path": "/packages/css/multimedia/bundles/projects/2012/HPLiveDebateFlex.css"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.nytimes.com/"
+        },
+        {
+          "cookie": "RMID=007f010022166047bee9002b; adxcs=-"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "graphics8.nytimes.com"
+        },
+        {
+          ":path": "/js/app/common/slideshow/embeddedSlideshowBuilder.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.nytimes.com/"
+        },
+        {
+          "cookie": "RMID=007f010022166047bee9002b; adxcs=-"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "graphics8.nytimes.com"
+        },
+        {
+          ":path": "/css/0.1/screen/slideshow/modules/slidingGallery.css"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.nytimes.com/"
+        },
+        {
+          "cookie": "RMID=007f010022166047bee9002b; adxcs=-"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "graphics8.nytimes.com"
+        },
+        {
+          ":path": "/adx/images/ADS/31/46/ad.314668/NYT_MBM_IPHON_LEFT_Oct11.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.nytimes.com/"
+        },
+        {
+          "cookie": "RMID=007f010022166047bee9002b; adxcs=-"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "graphics8.nytimes.com"
+        },
+        {
+          ":path": "/packages/js/multimedia/bundles/projects/2012/HPLiveDebateFlex.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.nytimes.com/"
+        },
+        {
+          "cookie": "RMID=007f010022166047bee9002b; adxcs=-"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "graphics8.nytimes.com"
+        },
+        {
+          ":path": "/packages/js/multimedia/data/FilmStripPromo/2012_election_filmstrip.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.nytimes.com/"
+        },
+        {
+          "cookie": "RMID=007f010022166047bee9002b; adxcs=-"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "graphics8.nytimes.com"
+        },
+        {
+          ":path": "/packages/js/elections/2012/debates/videostrip/filmstrip.css"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.nytimes.com/"
+        },
+        {
+          "cookie": "RMID=007f010022166047bee9002b; adxcs=-"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_12.json b/jetty-http2/http2-hpack/src/test/resources/data/story_12.json
new file mode 100644
index 0000000..3b27fd7
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_12.json
@@ -0,0 +1,369 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "pinterest.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "media-cache-lt0.pinterest.com"
+        },
+        {
+          ":path": "/upload/164311086374323731_DhZSfIfc_b.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://pinterest.com/"
+        },
+        {
+          "cookie": "_pinterest_sess=\"eJyLMnSMyghISi53cnEMyqgo9ElPya0M1jdw9/S0tY8vycxNtfUN8TX0Dck28A9JrvQPtLVVK04tLs5MsfXM9az0C3HKicpKN/JzSa/yrQrKiswKNY3MijSJzMrI8M1KN/bNDTT1rQo08Uy3tQUAm3EkCA==\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "media-cache-lt0.pinterest.com"
+        },
+        {
+          ":path": "/upload/161637074097583855_SNjDRMKe_b.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://pinterest.com/"
+        },
+        {
+          "cookie": "_pinterest_sess=\"eJyLMnSMyghISi53cnEMyqgo9ElPya0M1jdw9/S0tY8vycxNtfUN8TX0Dck28A9JrvQPtLVVK04tLs5MsfXM9az0C3HKicpKN/JzSa/yrQrKiswKNY3MijSJzMrI8M1KN/bNDTT1rQo08Uy3tQUAm3EkCA==\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "media-cache-lt0.pinterest.com"
+        },
+        {
+          ":path": "/upload/273593746083022624_FCoEkXsC_b.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://pinterest.com/"
+        },
+        {
+          "cookie": "_pinterest_sess=\"eJyLMnSMyghISi53cnEMyqgo9ElPya0M1jdw9/S0tY8vycxNtfUN8TX0Dck28A9JrvQPtLVVK04tLs5MsfXM9az0C3HKicpKN/JzSa/yrQrKiswKNY3MijSJzMrI8M1KN/bNDTT1rQo08Uy3tQUAm3EkCA==\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "media-cache-lt0.pinterest.com"
+        },
+        {
+          ":path": "/upload/52917364342893663_qtPmJgkx_b.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://pinterest.com/"
+        },
+        {
+          "cookie": "_pinterest_sess=\"eJyLMnSMyghISi53cnEMyqgo9ElPya0M1jdw9/S0tY8vycxNtfUN8TX0Dck28A9JrvQPtLVVK04tLs5MsfXM9az0C3HKicpKN/JzSa/yrQrKiswKNY3MijSJzMrI8M1KN/bNDTT1rQo08Uy3tQUAm3EkCA==\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "media-cache-lt0.pinterest.com"
+        },
+        {
+          ":path": "/upload/116952921544035902_KyTWinzm_b.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://pinterest.com/"
+        },
+        {
+          "cookie": "_pinterest_sess=\"eJyLMnSMyghISi53cnEMyqgo9ElPya0M1jdw9/S0tY8vycxNtfUN8TX0Dck28A9JrvQPtLVVK04tLs5MsfXM9az0C3HKicpKN/JzSa/yrQrKiswKNY3MijSJzMrI8M1KN/bNDTT1rQo08Uy3tQUAm3EkCA==\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "media-cache-lt0.pinterest.com"
+        },
+        {
+          ":path": "/upload/283445370267774252_AttBMVfT_b.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://pinterest.com/"
+        },
+        {
+          "cookie": "_pinterest_sess=\"eJyLMnSMyghISi53cnEMyqgo9ElPya0M1jdw9/S0tY8vycxNtfUN8TX0Dck28A9JrvQPtLVVK04tLs5MsfXM9az0C3HKicpKN/JzSa/yrQrKiswKNY3MijSJzMrI8M1KN/bNDTT1rQo08Uy3tQUAm3EkCA==\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "media-cache-lt0.pinterest.com"
+        },
+        {
+          ":path": "/upload/237142736599025827_ufDEHdRe_b.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://pinterest.com/"
+        },
+        {
+          "cookie": "_pinterest_sess=\"eJyLMnSMyghISi53cnEMyqgo9ElPya0M1jdw9/S0tY8vycxNtfUN8TX0Dck28A9JrvQPtLVVK04tLs5MsfXM9az0C3HKicpKN/JzSa/yrQrKiswKNY3MijSJzMrI8M1KN/bNDTT1rQo08Uy3tQUAm3EkCA==\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "media-cache-lt0.pinterest.com"
+        },
+        {
+          ":path": "/upload/224194887669533381_UBmi659g_b.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://pinterest.com/"
+        },
+        {
+          "cookie": "_pinterest_sess=\"eJyLMnSMyghISi53cnEMyqgo9ElPya0M1jdw9/S0tY8vycxNtfUN8TX0Dck28A9JrvQPtLVVK04tLs5MsfXM9az0C3HKicpKN/JzSa/yrQrKiswKNY3MijSJzMrI8M1KN/bNDTT1rQo08Uy3tQUAm3EkCA==\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "media-cache-lt0.pinterest.com"
+        },
+        {
+          ":path": "/upload/274156696036479907_A1ezgnsj_b.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://pinterest.com/"
+        },
+        {
+          "cookie": "_pinterest_sess=\"eJyLMnSMyghISi53cnEMyqgo9ElPya0M1jdw9/S0tY8vycxNtfUN8TX0Dck28A9JrvQPtLVVK04tLs5MsfXM9az0C3HKicpKN/JzSa/yrQrKiswKNY3MijSJzMrI8M1KN/bNDTT1rQo08Uy3tQUAm3EkCA==\""
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_13.json b/jetty-http2/http2-hpack/src/test/resources/data/story_13.json
new file mode 100644
index 0000000..a692cb5
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_13.json
@@ -0,0 +1,342 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "qq.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "mat1.gtimg.com"
+        },
+        {
+          ":path": "/www/images/qq2012/followme.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.qq.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "mat1.gtimg.com"
+        },
+        {
+          ":path": "/www/images/qq2012/sosologo.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.qq.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "mat1.gtimg.com"
+        },
+        {
+          ":path": "/www/images/qq2012/festival/da18search.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.qq.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "mat1.gtimg.com"
+        },
+        {
+          ":path": "/www/images/qq2012/festival/da18bodybg05.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.qq.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "mat1.gtimg.com"
+        },
+        {
+          ":path": "/www/images/qq2012/loginall_1.2.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.qq.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "mat1.gtimg.com"
+        },
+        {
+          ":path": "/www/images/qq2012/aikanLoading1.1.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.qq.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "mat1.gtimg.com"
+        },
+        {
+          ":path": "/joke/Koala/Qfast1.0.1.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.qq.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "mat1.gtimg.com"
+        },
+        {
+          ":path": "/www/images/qq2012/mobileNews.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.qq.com/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "img1.gtimg.com"
+        },
+        {
+          ":path": "/v/pics/hv1/241/117/1186/77149726.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.qq.com/"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_14.json b/jetty-http2/http2-hpack/src/test/resources/data/story_14.json
new file mode 100644
index 0000000..c07d85f
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_14.json
@@ -0,0 +1,339 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "sina.com.cn"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.sina.com.cn"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "news.sina.com.cn"
+        },
+        {
+          ":path": "/js/87/20121024/201218ConfTop.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.sina.com.cn/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "int.dpool.sina.com.cn"
+        },
+        {
+          ":path": "/iplookup/iplookup.php"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.sina.com.cn/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i3.sinaimg.cn"
+        },
+        {
+          ":path": "/video/2012/1103/U7805P167DT20121103211853.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.sina.com.cn/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i3.sinaimg.cn"
+        },
+        {
+          ":path": "/home/2012/1102/U6041P30DT20121102122146.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.sina.com.cn/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i3.sinaimg.cn"
+        },
+        {
+          ":path": "/home/deco/2009/0330/logo_home.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.sina.com.cn/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "d1.sina.com.cn"
+        },
+        {
+          ":path": "/shh/lechan/20121016sina/logo1.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.sina.com.cn/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i0.sinaimg.cn"
+        },
+        {
+          ":path": "/home/2012/1103/U8551P30DT20121103063734.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.sina.com.cn/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i1.sinaimg.cn"
+        },
+        {
+          ":path": "/home/2012/1101/U6648P30DT20121101141432.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.sina.com.cn/"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_15.json b/jetty-http2/http2-hpack/src/test/resources/data/story_15.json
new file mode 100644
index 0000000..1bd29a3
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_15.json
@@ -0,0 +1,336 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "taobao.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.taobao.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.taobao.com"
+        },
+        {
+          ":path": "/index_global.php"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "a.tbcdn.cn"
+        },
+        {
+          ":path": "/p/fp/2011a/assets/space.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.taobao.com/index_global.php"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "a.tbcdn.cn"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.taobao.com/index_global.php"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "a.tbcdn.cn"
+        },
+        {
+          ":path": "/p/fp/2011hk/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.taobao.com/index_global.php"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "a.tbcdn.cn"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.taobao.com/index_global.php"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "a.tbcdn.cn"
+        },
+        {
+          ":path": "/p/fp/2010c/js/fp-direct-promo-min.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.taobao.com/index_global.php"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "img01.taobaocdn.com"
+        },
+        {
+          ":path": "/tps/i1/T1fqY2XilfXXahsVgc-1000-40.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.taobao.com/index_global.php"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "img01.taobaocdn.com"
+        },
+        {
+          ":path": "/tps/i1/T1rZiwXgtfXXXXXXXX-110-135.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.taobao.com/index_global.php"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_16.json b/jetty-http2/http2-hpack/src/test/resources/data/story_16.json
new file mode 100644
index 0000000..e638e7d
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_16.json
@@ -0,0 +1,375 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "en.wikipedia.org"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "centralnotice_bucket=1; clicktracking-session=eJko6IiUcEm69ehQfaakQlJfiLy9lShNP; mediaWiki.user.bucket%3Aext.articleFeedback-tracking=10%3Atrack; mediaWiki.user.id=EM83jsjaqPzIMLwBTiKF3aLiiTKeweez; mediaWiki.user.bucket%3Aext.articleFeedback-options=8%3Ashow"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "en.wikipedia.org"
+        },
+        {
+          ":path": "/wiki/Main_Page"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "centralnotice_bucket=1; clicktracking-session=eJko6IiUcEm69ehQfaakQlJfiLy9lShNP; mediaWiki.user.bucket%3Aext.articleFeedback-tracking=10%3Atrack; mediaWiki.user.id=EM83jsjaqPzIMLwBTiKF3aLiiTKeweez; mediaWiki.user.bucket%3Aext.articleFeedback-options=8%3Ashow"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "bits.wikimedia.org"
+        },
+        {
+          ":path": "/en.wikipedia.org/load.php"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://en.wikipedia.org/wiki/Main_Page"
+        },
+        {
+          "if-modified-since": "Wed, 31 Oct 2012 17:52:04 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "bits.wikimedia.org"
+        },
+        {
+          ":path": "/en.wikipedia.org/load.php"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://en.wikipedia.org/wiki/Main_Page"
+        },
+        {
+          "if-modified-since": "Thu, 01 Nov 2012 09:33:27 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "bits.wikimedia.org"
+        },
+        {
+          ":path": "/en.wikipedia.org/load.php"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://en.wikipedia.org/wiki/Main_Page"
+        },
+        {
+          "if-modified-since": "Sat, 03 Nov 2012 12:53:27 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "bits.wikimedia.org"
+        },
+        {
+          ":path": "/en.wikipedia.org/load.php"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://en.wikipedia.org/wiki/Main_Page"
+        },
+        {
+          "if-modified-since": "Wed, 31 Oct 2012 17:52:04 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "bits.wikimedia.org"
+        },
+        {
+          ":path": "/en.wikipedia.org/load.php"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://en.wikipedia.org/wiki/Main_Page"
+        },
+        {
+          "if-modified-since": "Thu, 01 Nov 2012 09:33:27 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "upload.wikimedia.org"
+        },
+        {
+          ":path": "/wikipedia/en/c/ca/Kanthirava_cropped.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://en.wikipedia.org/wiki/Main_Page"
+        },
+        {
+          "if-modified-since": "Fri, 02 Nov 2012 23:46:59 GMT"
+        },
+        {
+          "if-none-match": "288bdb2fd5e5a4f7272f58fcb083a7e1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "upload.wikimedia.org"
+        },
+        {
+          ":path": "/wikipedia/commons/thumb/d/d2/Dancing_girl_ajanta_%28cropped%29.jpg/72px-Dancing_girl_ajanta_%28cropped%29.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://en.wikipedia.org/wiki/Main_Page"
+        },
+        {
+          "if-modified-since": "Tue, 30 Oct 2012 17:37:15 GMT"
+        },
+        {
+          "if-none-match": "6e8d56df9be35494b4d9f0ea72ed1a3e"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "bits.wikimedia.org"
+        },
+        {
+          ":path": "/en.wikipedia.org/load.php"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://en.wikipedia.org/wiki/Main_Page"
+        },
+        {
+          "if-modified-since": "Sat, 03 Nov 2012 12:53:27 GMT"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_17.json b/jetty-http2/http2-hpack/src/test/resources/data/story_17.json
new file mode 100644
index 0000000..50fa4ca
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_17.json
@@ -0,0 +1,348 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yahoo.co.jp"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.yahoo.co.jp"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/top/sp2/clr/1/clr-121025.css"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/top/sp/logo.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/bookstore/common/special/2012/0829_05/banner/84x84_1.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yjaxc.yahoo.co.jp"
+        },
+        {
+          ":path": "/oi"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/weather/general/transparent_s/clouds.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/weather/general/transparent_s/sun.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/bookstore/common/special/2012/0829_05/banner/84x84_2.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/premium/contents/bnr/2012/50x50/0928_store_supernatural.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_18.json b/jetty-http2/http2-hpack/src/test/resources/data/story_18.json
new file mode 100644
index 0000000..43377fb
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_18.json
@@ -0,0 +1,351 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yahoo.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "d.yimg.com"
+        },
+        {
+          ":path": "/hd/ch7news/7_world/1103_0700_nat_elephant_sml_1898chj-1898chl.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://au.yahoo.com/?p=us"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "au.yahoo.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "B=4m2rqu589a507&b=3&s=1v"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "d.yimg.com"
+        },
+        {
+          ":path": "/mi/ywa.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://au.yahoo.com/?p=us"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yui.yahooapis.com"
+        },
+        {
+          ":path": "/combo"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://au.yahoo.com/?p=us"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "secure-au.imrworldwide.com"
+        },
+        {
+          ":path": "/cgi-bin/m"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://au.yahoo.com/?p=us"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "chart.finance.yahoo.com"
+        },
+        {
+          ":path": "/instrument/1.0/%5Eaxjo/chart;range=5d/image;size=179x98"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://au.yahoo.com/?p=us"
+        },
+        {
+          "cookie": "B=4m2rqu589a507&b=3&s=1v; session_start_time=1351947275160; k_visit=1; push_time_start=1351947295160"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "chart.finance.yahoo.com"
+        },
+        {
+          ":path": "/instrument/1.0/%5Eaord/chart;range=5d/image;size=179x98"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://au.yahoo.com/?p=us"
+        },
+        {
+          "cookie": "B=4m2rqu589a507&b=3&s=1v; session_start_time=1351947275160; k_visit=1; push_time_start=1351947295160"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "chart.finance.yahoo.com"
+        },
+        {
+          ":path": "/instrument/1.0/audusd=x/chart;range=5d/image;size=179x98"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://au.yahoo.com/?p=us"
+        },
+        {
+          "cookie": "B=4m2rqu589a507&b=3&s=1v; session_start_time=1351947275160; k_visit=1; push_time_start=1351947295160"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "cm.au.yahoo.overture.com"
+        },
+        {
+          ":path": "/js_flat_1_0/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://au.yahoo.com/?p=us"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_19.json b/jetty-http2/http2-hpack/src/test/resources/data/story_19.json
new file mode 100644
index 0000000..fe8dd3a
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_19.json
@@ -0,0 +1,345 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yandex.ru"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.yandex.ru"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yabs.yandex.ru"
+        },
+        {
+          ":path": "/count/Vnw_3zF2dkO40002Zhl8KGa5KPK2cmPfMeYpO2zG0vAeOuAefZIAgoA2KAe2fPOOP96yq4ba1fDKGQC1hlDVeQN8GfVD17e7"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yandex.ru/"
+        },
+        {
+          "cookie": "t=p; yandexuid=6410453771351949451"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yabs.yandex.ru"
+        },
+        {
+          ":path": "/count/Vnw_3mft8wq40000Zhl8KGa5KP6yq4ba1fDKhlDVeQN8GfVD17a3=qcOn49K2cmPfMcbQagXZWgYAgoA2KAMM66IcD7W3"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yandex.ru/"
+        },
+        {
+          "cookie": "t=p; yandexuid=6410453771351949451"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yandex.st"
+        },
+        {
+          ":path": "/lego/_/pDu9OWAQKB0s2J9IojKpiS_Eho.ico"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yandex.st"
+        },
+        {
+          ":path": "/www/1.359/www/i/yandex3.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yandex.ru/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yandex.st"
+        },
+        {
+          ":path": "/morda-logo/i/logo.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yandex.ru/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "mc.yandex.ru"
+        },
+        {
+          ":path": "/watch/722545"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yandex.ru/"
+        },
+        {
+          "cookie": "t=p; yandexuid=6410453771351949451"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yandex.st"
+        },
+        {
+          ":path": "/www/1.359/www/pages-desktop/www-css/_www-css.css"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yandex.ru/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yandex.st"
+        },
+        {
+          ":path": "/www/_/_r7pp-b-hKoDbgyGYy0IB3wlkno.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yandex.ru/"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_20.json b/jetty-http2/http2-hpack/src/test/resources/data/story_20.json
new file mode 100644
index 0000000..f86f11a
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_20.json
@@ -0,0 +1,5674 @@
+{
+  "context": "request",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yahoo.co.jp"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.yahoo.co.jp"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/top/sp2/clr/1/clr-121025.css"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/top/sp/logo.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/bookstore/common/special/2012/0829_05/banner/84x84_1.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yjaxc.yahoo.co.jp"
+        },
+        {
+          ":path": "/oi"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/weather/general/transparent_s/clouds.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/weather/general/transparent_s/sun.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/bookstore/common/special/2012/0829_05/banner/84x84_2.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/premium/contents/bnr/2012/50x50/0928_store_supernatural.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/bookstore/common/special/2012/0829_05/banner/84x84_3.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/bookstore/common/special/2012/0829_05/banner/84x84_5.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/500052/1080894/20121029/meulz5rknmobtjfqmyz8-a.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yjaxc.yahoo.co.jp"
+        },
+        {
+          ":path": "/oi"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/70506/1082209/20121024/ffmwiwdybofwysftxna1-a.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/yahoo/javascript/yfa_visual5_tbp.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.yahoo.co.jp"
+        },
+        {
+          ":path": "/javascript/fp_base_bd_ga_5.0.42.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/yahoo/javascript/csc/20060824/lib2obf_b6.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/top/sp2/pr/tb_bg-120110.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/top/sp2/uhd/homepage_bg-120123.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/sicons/bookstore16.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/sicons/movie16.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/sicons/game16.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/top/sp2/cmn/pic_all-121004.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/sicons/fortune16.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/top/sp2/emg/disaster_ttl2.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/video-topics/rec/1211/03_e01.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/top/sp2/clr/1/clr-121025.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://k.yimg.jp/images/top/sp2/clr/1/clr-121025.css"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/top/sp2/cmp/comp_all-121012.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "k.yimg.jp"
+        },
+        {
+          ":path": "/images/top/sp2/spotlight/2011/1031o.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "news.c.yimg.jp"
+        },
+        {
+          ":path": "/images/topics/20121103-00000193-sph-000-thumb.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/2237/1080330/20121103/bg6so7sbgcqenc9py6xk-a.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "www.yahoo.co.jp"
+        },
+        {
+          ":path": "/favicon.ico"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/images/security/pf/yjsecure.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yjaxc.yahoo.co.jp"
+        },
+        {
+          ":path": "/js/yjaxc.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "dailynews.yahoo.co.jp"
+        },
+        {
+          ":path": "/fc/sports/nippon_series/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://www.yahoo.co.jp/"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b; YJTOPICSFBREAD=d=juTus3MJdA6fAPKQn3MJyoWvkTaY6I2RngPiVKE3BMv8AFX.C4TMg0utwM_uXg_sKn7y2yDVFKE-&v=1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "dailynews.yahoo.co.jp"
+        },
+        {
+          ":path": "/fc/js/fb_pc.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b; YJTOPICSFBREAD=d=juTus3MJdA6fAPKQn3MJyoWvkTaY6I2RngPiVKE3BMv8AFX.C4TMg0utwM_uXg_sKn7y2yDVFKE-&v=1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/71629/1073618/20121029/ypxcyyekc_ruhypdisqu-a.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/news/fc.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/icon/photo.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/mh/news.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/30/1077242/20121029/ixbislu9ygczxzdkfnpt-a.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/news/facebook/news_Facebook_76x76.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/rapid/1.5.0/ult.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/new2.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/topics/wiki/nestopics_icon_40.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/yahoo/javascript/yfa_visual5.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/193/1072227/20121029/uyzwkpexjszyi2zgct4p-a.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/2959/1085127/20121102/dalvv9p9fw9tribawawe-a.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/2959/1085124/20121102/bz9rzgnremydaxbp4ihb-a.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/topics/wiki/editor/topics_pr_linkimg_l2.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "lpt.c.yimg.jp"
+        },
+        {
+          ":path": "/im_sigg537mI30DS9hWeZeGpWl75Q---x200-y190-q90/amd/20121103-00000542-sanspo-000-view.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "amd.c.yimg.jp"
+        },
+        {
+          ":path": "/im_siggHulEjLwgzPyrVDkZ9oNPng---x200-y133-q90/amd/20121031-00005828-yj_corptrend-000-51670401-view.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "amd.c.yimg.jp"
+        },
+        {
+          ":path": "/im_siggrMDL3ZpnqnwM4Z1FYvhX2Q---x200-y133-q90/amd/20121101-00005830-yj_corptrend-000-51751400-view.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/topics/css/import_ver2.css"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/commerce/js/libs/jquery/core/1.4.2/jquery.min.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/yui/jp/uhd/olympic/1.0.2/img/uhdChnk.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/news/v1/yn_gnavi_sprite_20120926.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/topics/css/import_ver2.css?date=20121029"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yjaxc.yahoo.co.jp"
+        },
+        {
+          ":path": "/oi"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yjaxc.yahoo.co.jp"
+        },
+        {
+          ":path": "/oi"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/topics/social/btnMx.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/topics/css/import_ver2.css?date=20121029"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/topics/wiki/ytopics_sprite_icons.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/topics/css/import_ver2.css?date=20121029"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/topics/wiki/ytopics_sprite_backgrounds.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/topics/css/import_ver2.css?date=20121029"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/topics/wiki/relTabLeft.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/topics/css/import_ver2.css?date=20121029"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/topics/wiki/relTabRight.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/topics/css/import_ver2.css?date=20121029"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/topics/wiki/bullet_list.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/topics/css/import_ver2.css?date=20121029"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/yui/jp/uft/1.0.0/img/utfChnk.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/topics/wiki/accountTitleBg.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/topics/css/import_ver2.css?date=20121029"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/topics/social/sprite_icoSns16.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/topics/css/import_ver2.css?date=20121029"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/topics/wiki/trendTitleBg.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/topics/css/import_ver2.css?date=20121029"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/yahoo/javascript/csc/20060824/lib2obf_b4.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ah.yimg.jp"
+        },
+        {
+          ":path": "/bdv/164354/1084075/20121101/4feasfvz47csxcoydlvl-a.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "platform.twitter.com"
+        },
+        {
+          ":path": "/widgets.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        },
+        {
+          "cookie": "pid=v3:1351947306477664316206054; k=10.35.101.123.1351947536129989; guest_id=v1%3A135194753658491573; __utma=43838368.2140315505.1351947542.1351947542.1351947542.1; __utmb=43838368.2.10.1351947542; __utmz=43838368.1351947542.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "platform.twitter.com"
+        },
+        {
+          ":path": "/widgets/tweet_button.1351848862.html"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        },
+        {
+          "cookie": "pid=v3:1351947306477664316206054; k=10.35.101.123.1351947536129989; guest_id=v1%3A135194753658491573; __utma=43838368.2140315505.1351947542.1351947542.1351947542.1; __utmb=43838368.2.10.1351947542; __utmz=43838368.1351947542.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "connect.facebook.net"
+        },
+        {
+          ":path": "/ja_JP/all.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "bkskapi.dailynews.yahoo.co.jp"
+        },
+        {
+          ":path": "/detail"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b; YJTOPICSFBREAD=d=juTus3MJdA6fAPKQn3MJyoWvkTaY6I2RngPiVKE3BMv8AFX.C4TMg0utwM_uXg_sKn7y2yDVFKE-&v=1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "platform.twitter.com"
+        },
+        {
+          ":path": "/widgets/follow_button.1351848862.html"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        },
+        {
+          "cookie": "pid=v3:1351947306477664316206054; k=10.35.101.123.1351947536129989; guest_id=v1%3A135194753658491573; __utma=43838368.2140315505.1351947542.1351947542.1351947542.1; __utmb=43838368.2.10.1351947542; __utmz=43838368.1351947542.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "p.twitter.com"
+        },
+        {
+          ":path": "/t.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://platform.twitter.com/widgets/tweet_button.1351848862.html"
+        },
+        {
+          "cookie": "pid=v3:1351947306477664316206054; k=10.35.101.123.1351947536129989; guest_id=v1%3A135194753658491573; __utma=43838368.2140315505.1351947542.1351947542.1351947542.1; __utmb=43838368.2.10.1351947542; __utmz=43838368.1351947542.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "cdn.api.twitter.com"
+        },
+        {
+          ":path": "/1/urls/count.json"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://platform.twitter.com/widgets/tweet_button.1351848862.html"
+        },
+        {
+          "cookie": "pid=v3:1351947306477664316206054; k=10.35.101.123.1351947536129989; guest_id=v1%3A135194753658491573; __utma=43838368.2140315505.1351947542.1351947542.1351947542.1; __utmb=43838368.2.10.1351947542; __utmz=43838368.1351947542.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "r.twimg.com"
+        },
+        {
+          ":path": "/jot"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://platform.twitter.com/widgets/tweet_button.1351848862.html"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "cdn.api.twitter.com"
+        },
+        {
+          ":path": "/1/users/show.json"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://platform.twitter.com/widgets/follow_button.1351848862.html"
+        },
+        {
+          "cookie": "pid=v3:1351947306477664316206054; k=10.35.101.123.1351947536129989; guest_id=v1%3A135194753658491573; __utma=43838368.2140315505.1351947542.1351947542.1351947542.1; __utmb=43838368.2.10.1351947542; __utmz=43838368.1351947542.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "p.twitter.com"
+        },
+        {
+          ":path": "/f.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://platform.twitter.com/widgets/follow_button.1351848862.html"
+        },
+        {
+          "cookie": "pid=v3:1351947306477664316206054; k=10.35.101.123.1351947536129989; guest_id=v1%3A135194753658491573; __utma=43838368.2140315505.1351947542.1351947542.1351947542.1; __utmb=43838368.2.10.1351947542; __utmz=43838368.1351947542.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "r.twimg.com"
+        },
+        {
+          ":path": "/jot"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://platform.twitter.com/widgets/follow_button.1351848862.html"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "POST"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ocsp.verisign.com"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "115"
+        },
+        {
+          "content-type": "application/ocsp-request"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "dailynews.yahoo.co.jp"
+        },
+        {
+          ":path": "/favicon.ico"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b; YJTOPICSFBREAD=d=juTus3MJdA6fAPKQn3MJyoWvkTaY6I2RngPiVKE3BMv8AFX.C4TMg0utwM_uXg_sKn7y2yDVFKE-&v=1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/css/yj2.css"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/clear.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/news/cobranding/sanspo.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/lib/news/json/jsr_class_1_1.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "headlines.yahoo.co.jp"
+        },
+        {
+          ":path": "/hl"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://dailynews.yahoo.co.jp/fc/sports/nippon_series/?1351933494"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/lib/news/socialModule/realtimeSearch_1_0-min.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/lib/news/jquery/jquery.template.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/lib/news/socialModule/facebook_1_3_1-min.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "amd.c.yimg.jp"
+        },
+        {
+          ":path": "/im_siggvNnG417_XZJF5TsJPh7FFQ---x200-y190-q90/amd/20121103-00000542-sanspo-000-4-view.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/70506/1082210/20121024/0ffcv4drh8ir07jvroju-a.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/71629/1082189/20121029/2n1tdzicd8j7eotfexbi-a.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/lib/news/jquery/jquery.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/lib/news/widgets/widgets_1_1.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/2959/1085127/20121102/ilaj2_d_zo_9bjginqty-a.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/2959/1085124/20121102/vval_chos32k_7okick9-a.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/30/1072134/20121029/qv2c_lhjbra0qr5ps55w-a.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/news/v1/css/master-news.css"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/css,*/*;q=0.1"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yjaxc.yahoo.co.jp"
+        },
+        {
+          ":path": "/oi"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/news/v1/news_socialbutton.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/news/v1/css/master-news.css?v11"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/media/ymui/img/lineWide_4x1.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/news/v1/css/master-news.css?v11"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/news/v1/yn_sprite_icons.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/news/v1/css/master-news.css?v11"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/media/ymui/img/carrrot_2.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/news/v1/css/master-news.css?v11"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/media/ymui/img/photoNew_45x15.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/news/v1/css/master-news.css?v11"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/news/v1/sprite_bgRTSearchBox.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/news/v1/css/master-news.css?v11"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/news/v1/sprite_icoTwitter.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/news/v1/css/master-news.css?v11"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/news/v1/yn_sprite_background.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/news/v1/css/master-news.css?v11"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/news/v1/ranking.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/news/v1/css/master-news.css?v11"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/news/v1/yn_gnavi_sprite.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/news/v1/css/master-news.css?v11"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yjaxc.yahoo.co.jp"
+        },
+        {
+          ":path": "/oi"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/yui/jp/ult/arrow.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/listing/tool/yjaxc/yjaxc-iframe.html"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "realtime.search.yahooapis.jp"
+        },
+        {
+          ":path": "/v1/post"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/lib/news/widgets/tweet_button.html"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yjaxc.yahoo.co.jp"
+        },
+        {
+          ":path": "/oi"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/listing/tool/yjaxc/yjaxc-iframe.html?src0=http%3A%2F%2Fyjaxc.yahoo.co.jp%2Foi%3Fs%3Danemos_news01295%26i%3D2078709534%26w%3D%26apg%3D1%26t%3Dj%26u%3Dhttp%253A%252F%252Fheadlines.yahoo.co.jp%252Fhl%253Fa%253D20121103-00000542-sanspo-base%26ref%3Dhttp%253A%252F%252Fdailynews.yahoo.co.jp%252Ffc%252Fsports%252Fnippon_series%252F%253F1351933494%26enc%3DEUC-JP%26spaceId%3D%26jisx0402%3D%26type%3D%26crawlUrl%3D&src1=http%3A%2F%2Fyjaxc.yahoo.co.jp%2Fjs%2Fyjaxc-internal-banner.js%3Fimgurl%3Dhttp%253A%252F%252Fah.yimg.jp%252Fimages%252Fim%252Finnerad%252F%26imgpath%3Dbnr1_ss_1_300-250.jpg%26clickurl%3Dhttp%253A%252F%252Frd.yahoo.co.jp%252Fbzc%252Fsds%252F97648%252Fevt%253D97648%252F*http%253A%252F%252Flisting.yahoo.co.jp%252Fy_promo%252Flisting01%252F%253Fo%253DJP1350"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "headlines.yahoo.co.jp"
+        },
+        {
+          ":path": "/sc/show"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ah.yimg.jp"
+        },
+        {
+          ":path": "/bdv/164354/1080825/20121101/hii0znrxvsbx0dt01k_g-a.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/lib/news/widgets/images/tweet.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/lib/news/widgets/tweet_button.html?_=1351949189638&count=none&id=twitter_tweet_button_2&lang=ja&original_referer=http%3A%2F%2Fheadlines.yahoo.co.jp%2Fhl%3Fa%3D20121103-00000542-sanspo-base&redirect=&text=%E5%B7%A8%E4%BA%BA%E3%81%8C%EF%BC%93%E5%B9%B4%E3%81%B6%E3%82%8A%E6%97%A5%E6%9C%AC%E4%B8%80%EF%BC%81%E5%BE%A9%E5%B8%B0%E3%81%AE%E9%98%BF%E9%83%A8%E3%81%8C%E6%B1%BA%E5%8B%9D%E6%89%93%EF%BC%88%E3%82%B5%E3%83%B3%E3%82%B1%E3%82%A4%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%84%EF%BC%89%20-%20Y!%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&url=http%3A%2F%2Fheadlines.yahoo.co.jp%2Fhl%3Fa%3D20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/lib/news/widgets/images/tweet_ja.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/lib/news/widgets/tweet_button.html?_=1351949189638&count=none&id=twitter_tweet_button_2&lang=ja&original_referer=http%3A%2F%2Fheadlines.yahoo.co.jp%2Fhl%3Fa%3D20121103-00000542-sanspo-base&redirect=&text=%E5%B7%A8%E4%BA%BA%E3%81%8C%EF%BC%93%E5%B9%B4%E3%81%B6%E3%82%8A%E6%97%A5%E6%9C%AC%E4%B8%80%EF%BC%81%E5%BE%A9%E5%B8%B0%E3%81%AE%E9%98%BF%E9%83%A8%E3%81%8C%E6%B1%BA%E5%8B%9D%E6%89%93%EF%BC%88%E3%82%B5%E3%83%B3%E3%82%B1%E3%82%A4%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%84%EF%BC%89%20-%20Y!%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&url=http%3A%2F%2Fheadlines.yahoo.co.jp%2Fhl%3Fa%3D20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/lib/news/widgets/tweet_button.html"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "puffer.c.yimg.jp"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "puffer.c.yimg.jp"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "puffer.c.yimg.jp"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "puffer.c.yimg.jp"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/images/im/imgim/pc2/im1001149230pcmr1.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/listing/tool/yjaxc/yjaxc-iframe.html?src0=http%3A%2F%2Fyjaxc.yahoo.co.jp%2Foi%3Fs%3Danemos_news01295%26i%3D2078709534%26w%3D%26apg%3D1%26t%3Dj%26u%3Dhttp%253A%252F%252Fheadlines.yahoo.co.jp%252Fhl%253Fa%253D20121103-00000542-sanspo-base%26ref%3Dhttp%253A%252F%252Fdailynews.yahoo.co.jp%252Ffc%252Fsports%252Fnippon_series%252F%253F1351933494%26enc%3DEUC-JP%26spaceId%3D%26jisx0402%3D%26type%3D%26crawlUrl%3D&src1=http%3A%2F%2Fyjaxc.yahoo.co.jp%2Fjs%2Fyjaxc-internal-banner.js%3Fimgurl%3Dhttp%253A%252F%252Fah.yimg.jp%252Fimages%252Fim%252Finnerad%252F%26imgpath%3Dbnr1_ss_1_300-250.jpg%26clickurl%3Dhttp%253A%252F%252Frd.yahoo.co.jp%252Fbzc%252Fsds%252F97648%252Fevt%253D97648%252F*http%253A%252F%252Flisting.yahoo.co.jp%252Fy_promo%252Flisting01%252F%253Fo%253DJP1350"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "urls.api.twitter.com"
+        },
+        {
+          ":path": "/1/urls/count.json"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/lib/news/widgets/tweet_button.html?_=1351949189638&count=none&id=twitter_tweet_button_2&lang=ja&original_referer=http%3A%2F%2Fheadlines.yahoo.co.jp%2Fhl%3Fa%3D20121103-00000542-sanspo-base&redirect=&text=%E5%B7%A8%E4%BA%BA%E3%81%8C%EF%BC%93%E5%B9%B4%E3%81%B6%E3%82%8A%E6%97%A5%E6%9C%AC%E4%B8%80%EF%BC%81%E5%BE%A9%E5%B8%B0%E3%81%AE%E9%98%BF%E9%83%A8%E3%81%8C%E6%B1%BA%E5%8B%9D%E6%89%93%EF%BC%88%E3%82%B5%E3%83%B3%E3%82%B1%E3%82%A4%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%84%EF%BC%89%20-%20Y!%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&url=http%3A%2F%2Fheadlines.yahoo.co.jp%2Fhl%3Fa%3D20121103-00000542-sanspo-base"
+        },
+        {
+          "cookie": "pid=v3:1351947306477664316206054; k=10.35.101.123.1351947536129989; guest_id=v1%3A135194753658491573; __utma=43838368.2140315505.1351947542.1351947542.1351947542.1; __utmb=43838368.2.10.1351947542; __utmz=43838368.1351947542.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "puffer.c.yimg.jp"
+        },
+        {
+          ":path": "/"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "headlines.yahoo.co.jp"
+        },
+        {
+          ":path": "/favicon.ico"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b; YJNEWSCOMMENT=d=06yLIwT4EjfCUHM_ZATPTTC.be6FwFeXux__KeWeqlDK.dHwKDQYqgJFHj9.HJlNGmTwWgk.h4h.sU8V_TDfRcrHwDjLWrrsKoxSuxiWaUP8PvEUAbJUe9xIk79LoWKr6tlDjWRkyBVLbqWqtJB_axSkadUO&v=1; YJNEWSFB=d=g52f45b4EjeJqzak676NkVYuFf6EMD66FMZIfmpIG32ywhp.ZRx6EAf7vGDLjqk7eQGKmGgvFcgo&v=1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "headlines.yahoo.co.jp"
+        },
+        {
+          ":path": "/hl"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?a=20121103-00000542-sanspo-base"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b; YJNEWSCOMMENT=d=06yLIwT4EjfCUHM_ZATPTTC.be6FwFeXux__KeWeqlDK.dHwKDQYqgJFHj9.HJlNGmTwWgk.h4h.sU8V_TDfRcrHwDjLWrrsKoxSuxiWaUP8PvEUAbJUe9xIk79LoWKr6tlDjWRkyBVLbqWqtJB_axSkadUO&v=1; YJNEWSFB=d=g52f45b4EjeJqzak676NkVYuFf6EMD66FMZIfmpIG32ywhp.ZRx6EAf7vGDLjqk7eQGKmGgvFcgo&v=1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/images/tech/bcn1.js"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=moto&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/3124/1073472/20121029/mkgcwzthl_hbpnxy_tno-a.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=moto&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/71629/1074517/20121029/kqo8rgbu_aykmxxf3cqf-a.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=moto&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/media/ymui/img/carrrot_5.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://i.yimg.jp/images/news/v1/css/master-news.css?v11"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/2959/1085127/20121102/crs1gvpzl74_ilnbd8yl-a.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=moto&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/news/bylines/v201209/main/bnr/bnr_300x90.png"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=moto&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yjaxc.yahoo.co.jp"
+        },
+        {
+          ":path": "/oi"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=moto&t=l"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/news/twitter/tw_spo_300_60.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=moto&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/193/1074340/20121029/rhnusvihwpg9khhap9vn-a.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=moto&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/1862/1083691/20121030/fk8wxszqyglpfwkac5kl-a.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=moto&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "headlines.yahoo.co.jp"
+        },
+        {
+          ":path": "/hl"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=moto&t=l"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b; YJNEWSCOMMENT=d=06yLIwT4EjfCUHM_ZATPTTC.be6FwFeXux__KeWeqlDK.dHwKDQYqgJFHj9.HJlNGmTwWgk.h4h.sU8V_TDfRcrHwDjLWrrsKoxSuxiWaUP8PvEUAbJUe9xIk79LoWKr6tlDjWRkyBVLbqWqtJB_axSkadUO&v=1; YJNEWSFB=d=g52f45b4EjeJqzak676NkVYuFf6EMD66FMZIfmpIG32ywhp.ZRx6EAf7vGDLjqk7eQGKmGgvFcgo&v=1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/71629/1082190/20121029/_xhxh5ukdv3s6oigo4bq-a.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=socc&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/71629/1075880/20121029/vstketkrv3fci_zfj0fb-a.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=socc&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/30/1072203/20121029/rzqkxhmakk4bokrlm87_-a.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=socc&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yjaxc.yahoo.co.jp"
+        },
+        {
+          ":path": "/oi"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=socc&t=l"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "i.yimg.jp"
+        },
+        {
+          ":path": "/images/news/module/md20120709_gsearch.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=socc&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "content.yieldmanager.edgesuite.net"
+        },
+        {
+          ":path": "/atoms/71/f8/fb/ee/71f8fbeed96e2ac38d4638d6c6e2ece4.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=socc&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "headlines.yahoo.co.jp"
+        },
+        {
+          ":path": "/hl"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=socc&t=l"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b; YJNEWSCOMMENT=d=06yLIwT4EjfCUHM_ZATPTTC.be6FwFeXux__KeWeqlDK.dHwKDQYqgJFHj9.HJlNGmTwWgk.h4h.sU8V_TDfRcrHwDjLWrrsKoxSuxiWaUP8PvEUAbJUe9xIk79LoWKr6tlDjWRkyBVLbqWqtJB_axSkadUO&v=1; YJNEWSFB=d=g52f45b4EjeJqzak676NkVYuFf6EMD66FMZIfmpIG32ywhp.ZRx6EAf7vGDLjqk7eQGKmGgvFcgo&v=1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/71629/1073618/20121029/tldo4m5hcuajwtl9ebr7-a.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=base&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/3514/1070875/20121102/di3ufilunjw9ul9nrygs-a.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=base&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yjaxc.yahoo.co.jp"
+        },
+        {
+          ":path": "/oi"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=base&t=l"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "amd.c.yimg.jp"
+        },
+        {
+          ":path": "/im_siggSTQFSGS6B_ulqQXD.kRB.g---x150-y83-q90/amd/20121103-00000687-yom-000-1-thumb.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=base&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/30/1072095/20121029/_wzyz3fszhqvouc6tuav-a.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=base&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "content.yieldmanager.edgesuite.net"
+        },
+        {
+          ":path": "/atoms/23/03/f1/77/2303f17798f0116b59cd53fbb5f89873.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=base&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "headlines.yahoo.co.jp"
+        },
+        {
+          ":path": "/hl"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=base&t=l"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b; YJNEWSCOMMENT=d=06yLIwT4EjfCUHM_ZATPTTC.be6FwFeXux__KeWeqlDK.dHwKDQYqgJFHj9.HJlNGmTwWgk.h4h.sU8V_TDfRcrHwDjLWrrsKoxSuxiWaUP8PvEUAbJUe9xIk79LoWKr6tlDjWRkyBVLbqWqtJB_axSkadUO&v=1; YJNEWSFB=d=g52f45b4EjeJqzak676NkVYuFf6EMD66FMZIfmpIG32ywhp.ZRx6EAf7vGDLjqk7eQGKmGgvFcgo&v=1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/71629/1074517/20121029/qym5s_fuonkwfh4vw608-a.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=spo&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/71629/1073614/20121029/wnskbirfjfjyqqjwjnx3-a.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=spo&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "yjaxc.yahoo.co.jp"
+        },
+        {
+          ":path": "/oi"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "*/*"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=spo&t=l"
+        },
+        {
+          "cookie": "B=76j09a189a6h4&b=3&s=0b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/2959/1085124/20121102/71ewr2thlfq_2yiqyhjw-a.gif"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=spo&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/30/1072106/20121029/hczia9w6zzi3jskznvxo-a.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=spo&t=l"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":method": "GET"
+        },
+        {
+          ":scheme": "http"
+        },
+        {
+          ":authority": "ai.yimg.jp"
+        },
+        {
+          ":path": "/bdv/26008/1077726/20121029/zuabaglgdswip3wx_faw-a.jpg"
+        },
+        {
+          "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0"
+        },
+        {
+          "accept": "image/png,image/*;q=0.8,*/*;q=0.5"
+        },
+        {
+          "accept-language": "en-US,en;q=0.5"
+        },
+        {
+          "accept-encoding": "gzip, deflate"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "referer": "http://headlines.yahoo.co.jp/hl?c=spo&t=l"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_21.json b/jetty-http2/http2-hpack/src/test/resources/data/story_21.json
new file mode 100644
index 0000000..86b67a6
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_21.json
@@ -0,0 +1,15422 @@
+{
+  "context": "response",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":status": "301"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:26 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "location": "http://www.amazon.com/"
+        },
+        {
+          "content-length": "230"
+        },
+        {
+          "keep-alive": "timeout=2, max=20"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "text/html; charset=iso-8859-1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "6577"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 23 Oct 2012 17:58:47 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 19 Oct 2012 23:59:58 GMT"
+        },
+        {
+          "age": "932740"
+        },
+        {
+          "x-amz-cf-id": "whiC_hNmBgrO48K-Fv1AqlFY-Cig61exld9QXg99v4RwPo9kzfqE9Q=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 26 Sep 2012 22:18:37 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Tue, 25 Sep 2012 20:26:21 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "3249950"
+        },
+        {
+          "x-amz-cf-id": "LClrkUlr2-9oeIoNwP-CxxGuMmJQguT1mVNFchiptNXT2gkurFa1cw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "3774"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 30 Oct 2012 23:02:44 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 23:02:44 GMT"
+        },
+        {
+          "age": "309703"
+        },
+        {
+          "x-amz-cf-id": "0SnGIpF0HloiJDtBSskp0LPclCOdy-cBHBsP3LTUdBy-0l2hmYRW2w=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:26 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "set-cookie": "skin=noskin; path=/; domain=.amazon.com; expires=Sat, 03-Nov-2012 13:04:26 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "x-amz-id-1": "0HE6SZ5H5Z4Y71SA54J9"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "x-amz-id-2": "MqdgMKxu1H6fgZ4cXY/fMQyxCVupVtmdiA3mTqc2n4+baHA/4MFE3DtVsBH6B4hp"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html; charset=ISO-8859-1"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 11 Sep 2012 13:31:51 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 12 Sep 2008 10:13:34 GMT"
+        },
+        {
+          "age": "4577556"
+        },
+        {
+          "x-amz-cf-id": "AvgiZt6QvGiJjVptinxMWssqdE82ATuSxl0D-EfQqkg6iVMBCgJkdQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "7813"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 07:00:01 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 03:41:23 GMT"
+        },
+        {
+          "age": "108266"
+        },
+        {
+          "x-amz-cf-id": "C0P4ip7yqOsc3niS_9Bd5ONzppJ1_dduEL7eXeMlCIsohE0Nad0iCw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2503"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 29 Nov 2011 16:46:38 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 02 Jun 2010 17:55:54 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "29362669"
+        },
+        {
+          "x-amz-cf-id": "T5hInOb6hUOq4NSYTVt8TjsCSGRUHafPxwGkS5jiNGzpLmixDUmWug=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "7441"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 28 Sep 2012 14:59:28 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 01:01:41 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "3103499"
+        },
+        {
+          "x-amz-cf-id": "8puqnUMeyh0E9DCrrjWoD5tD9GjqgGyr6aMyg--qLs2ztEb3QIj9HQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4127"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 27 Sep 2012 21:46:40 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 12 Sep 2012 23:45:20 GMT"
+        },
+        {
+          "age": "3165467"
+        },
+        {
+          "x-amz-cf-id": "LModLJjBuUU3HjY0zayadcTVs_lDPQK-oIK3WWYJl9ykREzfNIm9Mw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3135"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sun, 16 Sep 2012 13:49:30 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 13 Sep 2012 04:46:34 GMT"
+        },
+        {
+          "age": "4144497"
+        },
+        {
+          "x-amz-cf-id": "6OFsf9nPu-D4_yWQy3sINzNayyg6fm625JfZVcPmqYdOicciN0i5rg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3039"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sun, 04 Mar 2012 12:44:05 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Fri, 02 Mar 2012 18:46:04 GMT"
+        },
+        {
+          "age": "21082822"
+        },
+        {
+          "x-amz-cf-id": "r7y3D04cQyZW1pY59rhfKoWDuC9yHfp5enkf0y9a6BKaF_6PcDVg7g=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4222"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 16 Jul 2012 17:01:48 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Jun 2009 12:02:10 GMT"
+        },
+        {
+          "age": "9489759"
+        },
+        {
+          "x-amz-cf-id": "VmOehiu6mDUBpTHylminnvdcSz7Pz3bwA_dNil6iko3qIIKu4pvwQg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1711"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 28 Nov 2011 02:10:41 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 15 Nov 2007 04:25:55 GMT"
+        },
+        {
+          "age": "29501626"
+        },
+        {
+          "x-amz-cf-id": "wDhU0erCw0YoyRgAjloixwiytE5IdFT-rCT5ITwxPx5uFgGAv50Y9Q=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3721"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 18 Nov 2011 22:23:31 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 04 Jan 2011 18:48:20 GMT"
+        },
+        {
+          "age": "30292856"
+        },
+        {
+          "x-amz-cf-id": "YXNG-nYMiEVi0gaRGKrCIfNODPvIKOE5L-dzPeXzyYh1LuQTLjvdSA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "24369"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 07:00:00 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 03:43:42 GMT"
+        },
+        {
+          "age": "21867"
+        },
+        {
+          "x-amz-cf-id": "2asasoycqewuj5Fwn6w6mjCvOMdZQZLZhNhdl44Yyo1-AI9hQ7bFfg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "1216"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 28 Jul 2012 05:05:57 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 28 Feb 2011 18:36:12 GMT"
+        },
+        {
+          "age": "8495910"
+        },
+        {
+          "x-amz-cf-id": "6h3O56dcjyQ3aM_m5a8_ir-VgVzDCmcwyIUXFSYcLFIQISyj5Q46vA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "47767"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 19 Oct 2012 14:52:48 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 08 Oct 2012 22:30:55 GMT"
+        },
+        {
+          "age": "1289499"
+        },
+        {
+          "x-amz-cf-id": "sO6PqD2yEqaPpl5EvNYnGspKuhuAXsV3jf-Ya1imW1287RLowvVQTQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4613"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sun, 27 Nov 2011 23:44:52 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 21 Nov 2011 21:42:35 GMT"
+        },
+        {
+          "age": "29510375"
+        },
+        {
+          "x-amz-cf-id": "qv844DZxuLlk-LGj1-AJNpjz_LOzLR2cGsrHaLRm9jAHtj0ynP66dQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3934"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 20 Oct 2012 00:01:41 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 28 Sep 2012 13:30:37 GMT"
+        },
+        {
+          "age": "1256566"
+        },
+        {
+          "x-amz-cf-id": "JW5QyuWGDa5ik9AIEsBmnV6YrytP9At48rtnwWjKkn77rXOj8cx9WA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1344"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 00:59:30 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Wed, 24 Oct 2012 18:51:08 GMT"
+        },
+        {
+          "age": "43497"
+        },
+        {
+          "x-amz-cf-id": "IKlxWmc8byHH_FJFiboqtD71dz0H-GkBay3SaG26MwMCXfLft_HgYw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 15 Aug 2012 22:51:53 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=624307871"
+        },
+        {
+          "expires": "Mon, 16 Aug 2032 07:55:38 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:27 GMT"
+        },
+        {
+          "content-length": "5354"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 13:25:50 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=630462932"
+        },
+        {
+          "expires": "Tue, 26 Oct 2032 13:39:59 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:27 GMT"
+        },
+        {
+          "content-length": "3658"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Tue, 23 Oct 2012 08:00:53 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=629882804"
+        },
+        {
+          "expires": "Tue, 19 Oct 2032 20:31:11 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:27 GMT"
+        },
+        {
+          "content-length": "7632"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "4804"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 31 Oct 2012 21:53:07 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 21:10:04 GMT"
+        },
+        {
+          "age": "227481"
+        },
+        {
+          "x-amz-cf-id": "bdyVYgf7boW90khU9D9kSQ4rt8H41h_yufp79zDL_rVA8a9brz2IwA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "148"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sun, 15 Jul 2012 13:57:33 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 01 Aug 2011 23:32:56 GMT"
+        },
+        {
+          "age": "9587215"
+        },
+        {
+          "x-amz-cf-id": "Gv6tJh4vJVFIOBxlsPYY_n-mupZYOqsq0_IXHTz6WS89qWAryOKy8g=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "356"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 28 Sep 2012 01:43:37 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 21 Jul 2011 20:40:59 GMT"
+        },
+        {
+          "age": "3151251"
+        },
+        {
+          "x-amz-cf-id": "A4eNx4xBAu8rDK_SSjVdCoYo59rIc5aBFph1neHeq97ohGyzANNfoA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "6986"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sun, 30 Sep 2012 10:59:49 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 01:06:32 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "2945079"
+        },
+        {
+          "x-amz-cf-id": "BCz8ITjlEUNn-tAfee5IQYTwG9afocm__16MmahSICmeqky8tmv-qA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:28 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "set-cookie": "skin=noskin; path=/; domain=.amazon.com; expires=Sat, 03-Nov-2012 13:04:26 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "x-amz-id-1": "0HE6SZ5H5Z4Y71SA54J9"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "x-amz-id-2": "MqdgMKxu1H6fgZ4cXY/fMQyxCVupVtmdiA3mTqc2n4+baHA/4MFE3DtVsBH6B4hp"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "x-amzn-requestid": "ffd52343-25b6-11e2-ac17-5765013d7795"
+        },
+        {
+          "cache-control": "max-age=29030400, public"
+        },
+        {
+          "content-length": "1140"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "296"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:28 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "5728"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 10 Oct 2012 01:33:28 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Sat, 22 Oct 2011 00:40:50 GMT"
+        },
+        {
+          "age": "8903"
+        },
+        {
+          "x-amz-cf-id": "odznSvAIyfv7NmqZX6A2oTHE_IX5rh889vBaPKfwpg3AMo9k3ScXcA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "content-length": "6951"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:28 GMT"
+        },
+        {
+          "server": "Server"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "17849"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-amz-id-2": "ZgdRydvxV2Z5YPfl9vhZZTYWMOX7vl8vIt9RuMTlm258HbYgx1yMhHsXiVTR5T1w"
+        },
+        {
+          "x-amz-request-id": "135182B51618D297"
+        },
+        {
+          "date": "Wed, 18 Jul 2012 22:57:25 GMT"
+        },
+        {
+          "last-modified": "Wed, 18 Jul 2012 22:43:26 GMT"
+        },
+        {
+          "etag": "\"08b0f3794e1b5e9a927698e159741c50\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "AmazonS3"
+        },
+        {
+          "age": "50666"
+        },
+        {
+          "x-amz-cf-id": "4wcVhu3OEiWfFvYvE3GH5UYO4KY8UpnlLcJRRRqZh0Q1zELrmrAmsA=="
+        },
+        {
+          "via": "1.0 c33edbf5459a4a44749c2cb5ecdb3fca.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 02:31:02 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=630422753"
+        },
+        {
+          "expires": "Tue, 26 Oct 2032 02:30:20 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:27 GMT"
+        },
+        {
+          "content-length": "54217"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "1827"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 27 Sep 2012 22:12:58 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 12 Mar 2012 23:57:13 GMT"
+        },
+        {
+          "age": "3163891"
+        },
+        {
+          "x-amz-cf-id": "wU_0sJ4VJxKBN-1nsDAgg_KUmfVbpaaGyo7YelU9wE9JmGGGKQ92EQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "1134"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 09 Oct 2012 18:09:17 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 12 Mar 2012 23:57:13 GMT"
+        },
+        {
+          "age": "2141712"
+        },
+        {
+          "x-amz-cf-id": "SoQLSlLwLn_jdEOyiXGwginYyKphpwUS6-dbQ3wpPqBJIRg6mOrKvQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "636"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 20 Oct 2012 16:53:05 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 02 Jun 2010 22:18:48 GMT"
+        },
+        {
+          "age": "1195884"
+        },
+        {
+          "x-amz-cf-id": "twHfjXTW5hFlDA9KoqKVBWXyksHgSNg4Vhy3mstETvyPHr3CpZq6_Q=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "246"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 26 Jul 2012 10:28:32 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 02 Jun 2010 22:19:30 GMT"
+        },
+        {
+          "age": "8649357"
+        },
+        {
+          "x-amz-cf-id": "GuAxInIiaQe4FRi5wBUXvlgCqbiXlqBaFsFj_nccpovWEb1sePoPdQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:29 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "set-cookie": "skin=noskin; path=/; domain=.amazon.com; expires=Sat, 03-Nov-2012 13:04:26 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "x-amz-id-1": "05FGR6EKSNDPZCE5TRJQ"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "x-amz-id-2": "Tjab3PJkvWGMyS25sjt7CpJ2clcWTx72Uj5PrdRHrCIku2pHj7RnTwl293ZTfYMX"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "x-amzn-requestid": "ffd52343-25b6-11e2-ac17-5765013d7795"
+        },
+        {
+          "cache-control": "max-age=29030400, public"
+        },
+        {
+          "content-length": "1140"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Tue, 04 Sep 2012 11:58:23 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=625532809"
+        },
+        {
+          "expires": "Mon, 30 Aug 2032 12:11:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:29 GMT"
+        },
+        {
+          "content-length": "656"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Mon, 01 Oct 2012 10:33:01 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=628540179"
+        },
+        {
+          "expires": "Mon, 04 Oct 2032 07:34:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:29 GMT"
+        },
+        {
+          "content-length": "2251"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 21 Sep 2012 09:55:10 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=627262883"
+        },
+        {
+          "expires": "Sun, 19 Sep 2032 12:45:52 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:29 GMT"
+        },
+        {
+          "content-length": "1098"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 11:48:59 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=630506046"
+        },
+        {
+          "expires": "Wed, 27 Oct 2032 01:38:35 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:29 GMT"
+        },
+        {
+          "content-length": "1342"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "content-length": "1101"
+        },
+        {
+          "last-modified": "Mon, 09 Jul 2012 16:40:17 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "public, max-age=621651328"
+        },
+        {
+          "expires": "Fri, 16 Jul 2032 13:59:57 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2424"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 18 Oct 2012 18:56:17 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 07 Oct 2011 03:33:58 GMT"
+        },
+        {
+          "age": "1361293"
+        },
+        {
+          "x-amz-cf-id": "MRpSS6BPNijyVanqgR6mydKxGphIrKl9jTmcGgiX2DmcWgVdFwTQ2w=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3802"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 19 Oct 2012 08:34:27 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 31 Jan 2012 23:51:01 GMT"
+        },
+        {
+          "age": "1312203"
+        },
+        {
+          "x-amz-cf-id": "ohsa-VbEM_mSc8EnpAEXEtU6Nk599gGxk2FtaVe9QKvloqbwSCbxNA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "content-length": "2"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:29 GMT"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "server": "Server"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:30 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "0RMJJXGT1KVEMXX3VSJP"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "NqGNEb/SfkxLIfbOv73h5JBBcLVNGjGLK9GCNJwg5TW2rI8DxuXtaszrL5UZhTYZ"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:30 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "set-cookie": "skin=noskin; path=/; domain=.amazon.com; expires=Sat, 03-Nov-2012 13:04:26 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "x-amz-id-1": "12MZRY3TA9X8CDYHBV5T"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "x-amz-id-2": "mlslIMHpZawNFsGF0x1LVEqrRVG3ckOj+P3RRTLmw7Th6oLI75FjRKiMc9ln/2lK"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html; charset=ISO-8859-1"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "x-amzn-requestid": "ffd52343-25b6-11e2-ac17-5765013d7795"
+        },
+        {
+          "cache-control": "max-age=29030400, public"
+        },
+        {
+          "content-length": "1140"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "28988"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 20 Oct 2012 08:13:25 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 23 Jul 2012 20:35:57 GMT"
+        },
+        {
+          "age": "1227065"
+        },
+        {
+          "x-amz-cf-id": "mNIt-n16LCJdi8mcEtro9XVeAtGNT2eusOQLsXk2aBoA_LGn9iuGbQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "30231"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 06:32:33 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 00:00:59 GMT"
+        },
+        {
+          "age": "196317"
+        },
+        {
+          "x-amz-cf-id": "FIDb9FCQOTap3p4J66TlrId8wIZ_I0Uw8DgL3KGyPEN5FIgqZ4BPpA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "25698"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 28 Sep 2012 10:39:32 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 19 Sep 2012 17:12:28 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "3119098"
+        },
+        {
+          "x-amz-cf-id": "hKKlixQii0vlb9a_DiDDphY3LEUoIv24q9VfC3UOtpnJV37uLWUpmw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "26311"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 31 Oct 2012 16:56:42 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 15 Oct 2012 20:13:30 GMT"
+        },
+        {
+          "age": "245268"
+        },
+        {
+          "x-amz-cf-id": "lpU11IQ1j_7om8_FVILszZ1CEV-8zAg172J2ph8lsbqt3hrfJnS7eQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "34586"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 25 Oct 2012 21:34:09 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 16:33:14 GMT"
+        },
+        {
+          "age": "747021"
+        },
+        {
+          "x-amz-cf-id": "DNbatysenX2LUU6xkuO3lGcxhDVX2DG5CzqVUpLHPw-L-eSRtn7_vw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:30 GMT"
+        },
+        {
+          "x-amzn-requestid": "014c3370-25b7-11e2-b46a-73e2a83196ed"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "53"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:30 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "0RMJJXGT1KVEMXX3VSJP"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "NqGNEb/SfkxLIfbOv73h5JBBcLVNGjGLK9GCNJwg5TW2rI8DxuXtaszrL5UZhTYZ"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/x-icon"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "last-modified": "Tue, 21 Sep 2010 17:37:41 GMT"
+        },
+        {
+          "etag": "\"4486-7c5a6340\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "2590"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "35541"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 30 Oct 2012 07:00:01 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 24 Aug 2012 15:19:22 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "367469"
+        },
+        {
+          "x-amz-cf-id": "kpSB8Aj4s2QcAS66S2b7mB-wlCfwmdJWltC0f0sPcsiYvcEbitBpoQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "31343"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 26 Oct 2012 21:17:40 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 24 Oct 2012 18:24:45 GMT"
+        },
+        {
+          "age": "661610"
+        },
+        {
+          "x-amz-cf-id": "i3CTyh6smISPVQ7LqJU5PQ5QUwHdPuZiSswgKhn1iRrMR73x5YQglg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "30919"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 19 Oct 2012 16:31:27 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 23 Aug 2012 22:11:01 GMT"
+        },
+        {
+          "age": "1283583"
+        },
+        {
+          "x-amz-cf-id": "m8mt86i5hOEx1AMpRbo6qBzFxqJqTLek8zyWFYjxj2NFT6p2yRbnZw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 15:20:43 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=630213450"
+        },
+        {
+          "expires": "Sat, 23 Oct 2032 16:22:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:30 GMT"
+        },
+        {
+          "content-length": "3978"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Sat, 02 Jun 2012 17:24:51 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=617973507"
+        },
+        {
+          "expires": "Fri, 04 Jun 2032 00:22:57 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:30 GMT"
+        },
+        {
+          "content-length": "2352"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 28 Sep 2012 07:05:33 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=628204224"
+        },
+        {
+          "expires": "Thu, 30 Sep 2032 10:14:54 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:30 GMT"
+        },
+        {
+          "content-length": "2192"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 00:31:19 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=630455624"
+        },
+        {
+          "expires": "Tue, 26 Oct 2032 11:38:14 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:30 GMT"
+        },
+        {
+          "content-length": "1783"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "content-length": "3742"
+        },
+        {
+          "last-modified": "Wed, 13 Jun 2012 19:39:59 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "public, max-age=618388596"
+        },
+        {
+          "expires": "Tue, 08 Jun 2032 19:41:06 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "359"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 23 Jan 2012 18:47:58 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 12 Aug 2011 13:43:43 GMT"
+        },
+        {
+          "age": "20390"
+        },
+        {
+          "x-amz-cf-id": "K1hCWmx7ReBxsX55XuAkjHXE0mRsJjI50uNKE5GUBq4SdF4TzxN--A=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:30 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\", CP=\"PSAo PSDo OUR SAM OTR DSP COR\""
+        },
+        {
+          "location": "http://s.amazon-adsystem.com/iu3?d=amazon.com&a1=&a2=0101e39f75aa93465ee8202686e3f52bc2745bcaf2fc55ecfd1eae647167a83ecbb5&old_oo=0&n=1351947870865&dcc=t"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "set-cookie": "ad-id=A7PYmy2fB0qZnFwhmisdExM|t; Domain=.amazon-adsystem.com; Expires=Thu, 01-Jan-2037 00:00:01 GMT; Path=/"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "20"
+        },
+        {
+          "content-type": "text/plain"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:30 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\", CP=\"PSAo PSDo OUR SAM OTR DSP COR\""
+        },
+        {
+          "location": "http://s.amazon-adsystem.com/iu3?d=amazon.com&a1=&a2=0101e39f75aa93465ee8202686e3f52bc2745bcaf2fc55ecfd1eae647167a83ecbb5&old_oo=0&n=1351947870865&dcc=t"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "set-cookie": "ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Thu, 01-Jan-2037 00:00:01 GMT; Path=/"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "217"
+        },
+        {
+          "content-type": "text/html;charset=ISO-8859-1"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:30 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\", CP=\"PSAo PSDo OUR SAM OTR DSP COR\""
+        },
+        {
+          "location": "http://s.amazon-adsystem.com/iu3?d=amazon.com&a1=&a2=0101e39f75aa93465ee8202686e3f52bc2745bcaf2fc55ecfd1eae647167a83ecbb5&old_oo=0&n=1351947870865&dcc=t"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "set-cookie": "ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Thu, 01-Jan-2037 00:00:01 GMT; Path=/"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "158"
+        },
+        {
+          "content-type": "text/html;charset=ISO-8859-1"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:30 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "content-type": "text/html;charset=ISO-8859-1"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "160"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-length": "42"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-location": "http://spe.atdmt.com/images/pixel.gif"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR CUR ADM DEV TAIo PSAo PSDo OUR BUS UNI PUR COM NAV INT DEM STA PRE OTC\""
+        },
+        {
+          "set-cookie": "MUID=38CD881268FB628E3D318C1F6BFB6289; expires=Monday, 03-Nov-2014 00:00:00 GMT; path=/; domain=.atdmt.com"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:30 GMT"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "313"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:31 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-length": "42"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-location": "http://spe.atdmt.com/images/pixel.gif"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR CUR ADM DEV TAIo PSAo PSDo OUR BUS UNI PUR COM NAV INT DEM STA PRE OTC\""
+        },
+        {
+          "set-cookie": "MUID=39C1843BD7CB679E06238036D4CB670B; expires=Monday, 03-Nov-2014 00:00:00 GMT; path=/; domain=.atdmt.com"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:30 GMT"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "content-length": "6951"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:30 GMT"
+        },
+        {
+          "server": "Server"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "304"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "17849"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-amz-id-2": "ZgdRydvxV2Z5YPfl9vhZZTYWMOX7vl8vIt9RuMTlm258HbYgx1yMhHsXiVTR5T1w"
+        },
+        {
+          "x-amz-request-id": "135182B51618D297"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:31 GMT"
+        },
+        {
+          "last-modified": "Wed, 18 Jul 2012 22:43:26 GMT"
+        },
+        {
+          "etag": "\"08b0f3794e1b5e9a927698e159741c50\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "AmazonS3"
+        },
+        {
+          "age": "50669"
+        },
+        {
+          "x-amz-cf-id": "UB_lB5ijt678Q2wJ3BJ-U_cVvtSnWAVfUTXcCKhh-QAhIQ9BCb3djQ=="
+        },
+        {
+          "via": "1.0 c33edbf5459a4a44749c2cb5ecdb3fca.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:31 GMT"
+        },
+        {
+          "x-amzn-requestid": "01a883c0-25b7-11e2-ac1e-e97d81479c85"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "53"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:31 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "set-cookie": "skin=noskin; path=/; domain=.amazon.com; expires=Sat, 03-Nov-2012 13:04:26 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "x-amz-id-1": "05PW0GT01QWP44EFKF0E"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "x-amz-id-2": "GCho/mJOD51Oufijqw6gqph1/1sIiACGCKJXKh2zpMaDj6u5gA1ggWuscsW3aojI"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "x-amzn-requestid": "ffd52343-25b6-11e2-ac17-5765013d7795"
+        },
+        {
+          "cache-control": "max-age=29030400, public"
+        },
+        {
+          "content-length": "1140"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "187"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-amz-id-2": "a+sM7JnK1z8XJALH7//6/PrXIyqStu8OXpFxVoaX6gaWUfZFD47Fr2QQUa/fp7AI"
+        },
+        {
+          "x-amz-request-id": "1388995ECC503151"
+        },
+        {
+          "date": "Mon, 22 Oct 2012 17:26:53 GMT"
+        },
+        {
+          "x-amz-meta-jets3t-original-file-date-iso8601": "2011-11-07T21:33:44.000Z"
+        },
+        {
+          "x-amz-meta-md5-hash": "a20db430a00109d80184570ec2b5d38e"
+        },
+        {
+          "cache-control": "max-age=864000"
+        },
+        {
+          "last-modified": "Tue, 08 Nov 2011 18:37:11 GMT"
+        },
+        {
+          "etag": "\"a20db430a00109d80184570ec2b5d38e\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "AmazonS3"
+        },
+        {
+          "age": "157059"
+        },
+        {
+          "x-amz-cf-id": "Ls6I3zhLRw-y0K8aIUpki-XaifKyUBIlqjKRtAaQI11Yw135jA8Ahg=="
+        },
+        {
+          "via": "1.0 06b38b2ddcbb45c8e33db161a2316149.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "232"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-amz-id-2": "j62Ubwkhgqe/6HUlxy6AgFFF3a9toD+TP5OG4thryUyvAuIRkEPZznTcEkslc2vu"
+        },
+        {
+          "x-amz-request-id": "D24296DC343E3D4D"
+        },
+        {
+          "date": "Mon, 22 Oct 2012 17:26:53 GMT"
+        },
+        {
+          "x-amz-meta-jets3t-original-file-date-iso8601": "2012-08-30T18:01:46.000Z"
+        },
+        {
+          "x-amz-meta-md5-hash": "ac923fb65b36b7e6df1b85ed9a2eeb25"
+        },
+        {
+          "cache-control": "max-age=864000"
+        },
+        {
+          "last-modified": "Thu, 30 Aug 2012 18:02:23 GMT"
+        },
+        {
+          "etag": "\"ac923fb65b36b7e6df1b85ed9a2eeb25\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "AmazonS3"
+        },
+        {
+          "age": "157059"
+        },
+        {
+          "x-amz-cf-id": "u4HxdeiPj2Z69lQ7aky8PwR3bIL1DI2LZviCrEidCeKNRXIzSU04Hw=="
+        },
+        {
+          "via": "1.0 06b38b2ddcbb45c8e33db161a2316149.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "246"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-amz-id-2": "A8pOeFTyzWm76hXU6FfLkQf4c9wZCOf1QF9R4TGkjXEInQJp6farkkg0WB0HfwcK"
+        },
+        {
+          "x-amz-request-id": "4B032A9637D718D5"
+        },
+        {
+          "date": "Mon, 22 Oct 2012 17:26:53 GMT"
+        },
+        {
+          "x-amz-meta-jets3t-original-file-date-iso8601": "2011-11-08T18:38:37.000Z"
+        },
+        {
+          "x-amz-meta-md5-hash": "abb0183baa0ea995b47dcc0e9972095a"
+        },
+        {
+          "cache-control": "max-age=864000"
+        },
+        {
+          "last-modified": "Tue, 08 Nov 2011 18:41:02 GMT"
+        },
+        {
+          "etag": "\"abb0183baa0ea995b47dcc0e9972095a\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "AmazonS3"
+        },
+        {
+          "age": "157059"
+        },
+        {
+          "x-amz-cf-id": "o02bJWU_jSE66IwLSFs3qnpdALQRgcE53RerA0FNaohnIpayFuIBWg=="
+        },
+        {
+          "via": "1.0 06b38b2ddcbb45c8e33db161a2316149.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "227"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-amz-id-2": "9LJz7DXOJVq1v+6jQBPW+PKANy+8UBrktRUpS5ldd7n64fM5B0dvTEVk3oKOAaQj"
+        },
+        {
+          "x-amz-request-id": "7E12EE38DC5DE3F0"
+        },
+        {
+          "date": "Fri, 26 Oct 2012 20:55:51 GMT"
+        },
+        {
+          "x-amz-meta-jets3t-original-file-date-iso8601": "2012-04-11T18:59:01.000Z"
+        },
+        {
+          "x-amz-meta-md5-hash": "e45b8e1074fb65e447d6d8a91eff8a94"
+        },
+        {
+          "cache-control": "max-age=864000"
+        },
+        {
+          "last-modified": "Wed, 11 Apr 2012 18:59:43 GMT"
+        },
+        {
+          "etag": "\"e45b8e1074fb65e447d6d8a91eff8a94\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "AmazonS3"
+        },
+        {
+          "age": "662921"
+        },
+        {
+          "x-amz-cf-id": "B6N7v4ZLzrFyVRVxNchTyVO2unOzJHIK39q8SJis7c6pWrIOw4rC1Q=="
+        },
+        {
+          "via": "1.0 06b38b2ddcbb45c8e33db161a2316149.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "236"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-amz-id-2": "3TVcuu6MQ87em+GdI+9z27lbDxXU5i9H9Zz9GIbm33BZo9vPgIC/AkilBK5tF75Q"
+        },
+        {
+          "x-amz-request-id": "F105689791C8CFC6"
+        },
+        {
+          "date": "Fri, 26 Oct 2012 20:55:51 GMT"
+        },
+        {
+          "x-amz-meta-jets3t-original-file-date-iso8601": "2012-05-18T18:46:04.000Z"
+        },
+        {
+          "x-amz-meta-md5-hash": "b1178d4fb4111d1058a187cf31c95ab9"
+        },
+        {
+          "cache-control": "max-age=864000"
+        },
+        {
+          "last-modified": "Fri, 18 May 2012 18:47:11 GMT"
+        },
+        {
+          "etag": "\"b1178d4fb4111d1058a187cf31c95ab9\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "AmazonS3"
+        },
+        {
+          "age": "662921"
+        },
+        {
+          "x-amz-cf-id": "sKPhYUyawRrJWnfWsyGL2s3ckBnoapJQYfxvp1W3KVKwMiUhkEK51w=="
+        },
+        {
+          "via": "1.0 06b38b2ddcbb45c8e33db161a2316149.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "p3p": "CP=\"CUR ADM OUR NOR STA NID\""
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "location": "http://s.amazon-adsystem.com/ecm3?ex=openx.com&id=40a611fe-06f9-cb74-26a8-7b5edc1205e7"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "set-cookie": "i=cbdc52da-b3d4-4f79-bc70-3121d006fdfa; version=1; path=/; domain=.openx.net; max-age=63072000;"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:31 GMT"
+        },
+        {
+          "server": "TRP Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "CP=\"NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT\""
+        },
+        {
+          "location": "http://s.amazon-adsystem.com/ecm3?id=&ex=rubiconproject.com&status=no-user-id"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "set-cookie": "SERVERID=; Expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/"
+        },
+        {
+          "keep-alive": "timeout=5, max=200"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "text/plain; charset=UTF-8"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "10979"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sun, 21 Oct 2012 02:44:45 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 06 Mar 2012 22:20:25 GMT"
+        },
+        {
+          "age": "1160386"
+        },
+        {
+          "x-amz-cf-id": "F1Bnl4JS9Kyz-O5cpuXeg0_j5GumDg2Qt1wp0zonzvxPGICjmUSeMg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "1526"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sun, 21 Oct 2012 09:00:12 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 15 Jul 2011 19:42:36 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "1137859"
+        },
+        {
+          "x-amz-cf-id": "JGLRgB6lNjaxDdggNb9JkO58_vLkHmUReZ84GjyLh10FHCjDZ1d15Q=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:31 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\", CP=\"PSAo PSDo OUR SAM OTR DSP COR\""
+        },
+        {
+          "location": "http://s.amazon-adsystem.com/iu3?d=amazon.com&a1=&a2=0101e39f75aa93465ee8202686e3f52bc2745bcaf2fc55ecfd1eae647167a83ecbb5&old_oo=0&n=1351947870865&dcc=t"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "set-cookie": "ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Thu, 01-Jan-2037 00:00:01 GMT; Path=/"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "57"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:31 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "57"
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 20 Apr 2012 10:05:40 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=614707622"
+        },
+        {
+          "expires": "Tue, 27 Apr 2032 05:11:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:30 GMT"
+        },
+        {
+          "content-length": "1095"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "11117"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 29 Oct 2012 16:56:50 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 24 Sep 2012 20:44:19 GMT"
+        },
+        {
+          "age": "418061"
+        },
+        {
+          "x-amz-cf-id": "5o_BiUaTAD5lYQsK4IV5TzqQ5cWYNQbnt0xLwze5jS-445EERctTFg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "31461"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 17 Oct 2012 18:29:24 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Tue, 09 Oct 2012 22:41:15 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "1449307"
+        },
+        {
+          "x-amz-cf-id": "tw9-4WwNBPYcd_2n5w02SSvFLzYSQr7PgoWnUBoekvj_CAvLUtzicg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Tue, 01 Sep 2009 21:16:26 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=618550558"
+        },
+        {
+          "expires": "Thu, 10 Jun 2032 16:40:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:31 GMT"
+        },
+        {
+          "content-length": "3215"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 20 Oct 2011 08:30:59 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=613322830"
+        },
+        {
+          "expires": "Sun, 11 Apr 2032 04:31:41 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:31 GMT"
+        },
+        {
+          "content-length": "3542"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "2045"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 16 Jul 2012 05:26:37 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 13 Jul 2011 21:50:54 GMT"
+        },
+        {
+          "age": "9531474"
+        },
+        {
+          "x-amz-cf-id": "vjhm9zt0l4ak9rTfcaqoDHHqCVyjy5BT-0EXxKy0Qu1D7GuQLeuwKQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "location": "http://s.amazon-adsystem.com/ecm3?ex=doubleclick.net&google_gid=CAESEDp6zTGnEVOFXTsUTIntlOo&google_cver=1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:31 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "server": "Cookie Matcher"
+        },
+        {
+          "content-length": "310"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 29 May 2009 20:56:27 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=613357164"
+        },
+        {
+          "expires": "Sun, 11 Apr 2032 14:03:55 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:31 GMT"
+        },
+        {
+          "content-length": "739"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:31 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\", CP=\"PSAo PSDo OUR SAM OTR DSP COR\""
+        },
+        {
+          "location": "http://s.amazon-adsystem.com/iu3?d=amazon.com&a1=&a2=0101e39f75aa93465ee8202686e3f52bc2745bcaf2fc55ecfd1eae647167a83ecbb5&old_oo=0&n=1351947870865&dcc=t"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "set-cookie": "ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Thu, 01-Jan-2037 00:00:01 GMT; Path=/"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "57"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "23861"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 09 Oct 2012 23:49:58 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 09 Oct 2012 23:23:03 GMT"
+        },
+        {
+          "age": "2121273"
+        },
+        {
+          "x-amz-cf-id": "6igCzs5zDRpfl3uREE8U8b7UsUeKiOXlnR5OwfDF4SRDwMzu4n2Hxw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 06:26:14 GMT"
+        },
+        {
+          "last-modified": "Wed, 05 Sep 2012 21:17:19 GMT"
+        },
+        {
+          "etag": "\"19309a1-2b15-e65bd5c0\""
+        },
+        {
+          "cache-control": "max-age=172800"
+        },
+        {
+          "server": "Apache/2.2.3 (Red Hat)"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC\", CP=\"NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC\""
+        },
+        {
+          "content-length": "3891"
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:31 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "p3p": "policyref=\"http://tag.admeld.com/w3c/p3p.xml\", CP=\"PSAo PSDo OUR SAM OTR BUS DSP ALL COR\""
+        },
+        {
+          "location": "http://s.amazon-adsystem.com/ecm3?id=bfd291d0-29a4-4e30-a3a2-90bfcce51d8f&ex=admeld.com"
+        },
+        {
+          "content-length": "275"
+        },
+        {
+          "content-type": "text/html; charset=iso-8859-1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:31 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "set-cookie": "meld_sess=bfd291d0-29a4-4e30-a3a2-90bfcce51d8f;expires=Sun, 05 May 2013 03:59:31 GMT;path=/;domain=tag.admeld.com;"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:32 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\", CP=\"PSAo PSDo OUR SAM OTR DSP COR\""
+        },
+        {
+          "location": "http://s.amazon-adsystem.com/iu3?d=amazon.com&a1=&a2=0101e39f75aa93465ee8202686e3f52bc2745bcaf2fc55ecfd1eae647167a83ecbb5&old_oo=0&n=1351947870865&dcc=t"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "set-cookie": "ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Thu, 01-Jan-2037 00:00:01 GMT; Path=/"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "57"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "content-length": "9834"
+        },
+        {
+          "last-modified": "Tue, 14 Aug 2012 08:19:30 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "public, max-age=623720235"
+        },
+        {
+          "expires": "Mon, 09 Aug 2032 12:41:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:31 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 25 Feb 2009 15:49:48 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "max-age=580546798"
+        },
+        {
+          "expires": "Thu, 10 Jun 2032 16:40:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:31 GMT"
+        },
+        {
+          "content-length": "349"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-cache-lookup": "MISS from cdn-images.amazon.com:10080"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "26111"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 20:57:01 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 20:57:01 GMT"
+        },
+        {
+          "age": "144451"
+        },
+        {
+          "x-amz-cf-id": "14X7FbQwII7W32KG_B6UnQzAAN04K4czIvpQXldrJky1-W_FKI0wsA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "expires": "Mon, 29 Oct 2012 20:03:22 GMT"
+        },
+        {
+          "last-modified": "Tue, 10 Jul 2012 09:55:27 GMT"
+        },
+        {
+          "etag": "\"1930a25-22c7-badbe1c0\""
+        },
+        {
+          "cache-control": "max-age=90400000, public"
+        },
+        {
+          "server": "Apache/2.2.3 (Red Hat)"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC\", CP=\"NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC\""
+        },
+        {
+          "content-length": "2708"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:32 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 18 Apr 2012 10:47:18 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=623739489"
+        },
+        {
+          "expires": "Mon, 09 Aug 2032 18:02:41 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:32 GMT"
+        },
+        {
+          "content-length": "2622"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-cache-lookup": "MISS from cdn-images.amazon.com:10080"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:33 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 20:03:15 GMT"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 20:03:15 GMT"
+        },
+        {
+          "etag": "EDAADA0BBD2E54186FB78DECDB80E1E00940A39A"
+        },
+        {
+          "cache-control": "max-age=283721,public,no-transform,must-revalidate"
+        },
+        {
+          "x-ocsp-reponder-id": "t8edcaocsp2"
+        },
+        {
+          "content-length": "471"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "application/ocsp-response"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:33 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 16:35:33 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 16:35:33 GMT"
+        },
+        {
+          "etag": "179CA2EEF2B7FE96BC99C52D47B1A6E9E36FF3A7"
+        },
+        {
+          "cache-control": "max-age=357659,public,no-transform,must-revalidate"
+        },
+        {
+          "x-ocsp-reponder-id": "t8edcaocsp2"
+        },
+        {
+          "content-length": "471"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "application/ocsp-response"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:32 GMT"
+        },
+        {
+          "server": "Apache/2.2.4 (Unix) DAV/2 mod_ssl/2.2.4 OpenSSL/0.9.7a mod_fastcgi/2.4.2"
+        },
+        {
+          "set-cookie": "KADUSERCOOKIE=A682BC39-E933-4AED-86D3-69AAE2AAD12F; domain=pubmatic.com; expires=Sun, 03-Nov-2013 13:04:32 GMT; path=/"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC\""
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "text/html"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:33 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\", CP=\"PSAo PSDo OUR SAM OTR DSP COR\""
+        },
+        {
+          "location": "http://s.amazon-adsystem.com/iu3?d=amazon.com&a1=&a2=0101e39f75aa93465ee8202686e3f52bc2745bcaf2fc55ecfd1eae647167a83ecbb5&old_oo=0&n=1351947870865&dcc=t"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "set-cookie": "ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Thu, 01-Jan-2037 00:00:01 GMT; Path=/"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "57"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:33 GMT"
+        },
+        {
+          "server": "Apache/2.2.4 (Unix) DAV/2 mod_ssl/2.2.4 OpenSSL/0.9.8e-fips-rhel5 mod_fastcgi/2.4.2"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC\""
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "text/html"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 22 Oct 2010 19:31:50 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "max-age=583595968"
+        },
+        {
+          "expires": "Mon, 09 Aug 2032 18:02:41 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:34 GMT"
+        },
+        {
+          "content-length": "355"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-cache-lookup": "MISS from cdn-images.amazon.com:10080"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Tue, 16 Oct 2012 21:06:15 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=630485187"
+        },
+        {
+          "expires": "Tue, 26 Oct 2032 19:51:01 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:34 GMT"
+        },
+        {
+          "content-length": "3398"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-cache-lookup": "MISS from cdn-images.amazon.com:10080"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "24345"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 10 Oct 2012 00:37:19 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 09 Oct 2012 23:23:04 GMT"
+        },
+        {
+          "age": "2118435"
+        },
+        {
+          "x-amz-cf-id": "tLO5krWbCYmRm9LIjXDN76fC2DJhTSiML3Wx7P5GT_QflWQzjjyLSw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Mon, 09 Apr 2012 04:08:58 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=613372173"
+        },
+        {
+          "expires": "Sun, 11 Apr 2032 18:14:07 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:34 GMT"
+        },
+        {
+          "content-length": "3972"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-cache-lookup": "MISS from cdn-images.amazon.com:10080"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "21733"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sun, 21 Oct 2012 01:33:35 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 08 Oct 2012 20:03:10 GMT"
+        },
+        {
+          "age": "1164660"
+        },
+        {
+          "x-amz-cf-id": "boy0DjYIiv9QiDUAB5IT03oJw0Oe-TzQq2zaLbbC8-MCS_l6Jrzf5g=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 05:55:45 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=630608237"
+        },
+        {
+          "expires": "Thu, 28 Oct 2032 06:01:52 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:35 GMT"
+        },
+        {
+          "content-length": "17650"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-cache-lookup": "MISS from cdn-images.amazon.com:10080"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "23996"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 24 Oct 2012 00:39:53 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 08 Oct 2012 16:18:49 GMT"
+        },
+        {
+          "age": "908682"
+        },
+        {
+          "x-amz-cf-id": "qC_RVL0YLxYoBvaZ0uqbs2VI6jEgUk34Rk19qpGdS2VsFUS3KkWYMg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "21582"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 19 Oct 2012 18:47:58 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Mon, 08 Oct 2012 20:03:11 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "1275397"
+        },
+        {
+          "x-amz-cf-id": "vHqKStRXJPYsiKzS0tTwY_1XKiks6HvwJGT9UArSlfAs6OnCYHQ7lA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "22139"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 18 Oct 2012 09:05:16 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 08 Oct 2012 20:03:12 GMT"
+        },
+        {
+          "age": "1396759"
+        },
+        {
+          "x-amz-cf-id": "3iqSry0i3VhqyuBUo-iRW3UgESSNBQ3lv4YeFtxPi_-Acv46jt6IAw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "849"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 27 Sep 2012 07:28:18 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Sat, 16 Jul 2011 00:30:22 GMT"
+        },
+        {
+          "age": "3216977"
+        },
+        {
+          "x-amz-cf-id": "jh36SMSXaXj_TeRR9z4Vs8-cbbEoHRGJkz-zWwqnTDkn3mU7WYIILw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Tue, 17 Jan 2012 01:18:38 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=613357224"
+        },
+        {
+          "expires": "Sun, 11 Apr 2032 14:04:59 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:35 GMT"
+        },
+        {
+          "content-length": "2305"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-cache-lookup": "MISS from cdn-images.amazon.com:10080"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "2645"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 16 Oct 2012 14:50:28 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 22 Oct 2010 23:53:27 GMT"
+        },
+        {
+          "age": "1548848"
+        },
+        {
+          "x-amz-cf-id": "RYwtx5a09etraZHlO8Ut-TcazsQhaIMlHsC_JTzCEXAYeXfmbh0AWA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Tue, 22 May 2012 10:05:12 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=623739489"
+        },
+        {
+          "expires": "Mon, 09 Aug 2032 18:02:44 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:35 GMT"
+        },
+        {
+          "content-length": "656"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "590"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 19 Jul 2012 07:06:19 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 06 Oct 2010 20:47:18 GMT"
+        },
+        {
+          "age": "9266297"
+        },
+        {
+          "x-amz-cf-id": "jMk_WLA7tRGazvX3ieenZ8uPLkOB1NVjnlmuRGPRPfUGpdfopJWMug=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "618"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 19 Oct 2012 17:16:59 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 14 Sep 2012 15:15:31 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "1280857"
+        },
+        {
+          "x-amz-cf-id": "gsm-rW_jbFRe2Ne92Oddd13REiBnDzo9k53P59LW-6WZhjFKi2gpcg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "6409"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 06 Oct 2012 05:21:58 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 25 Apr 2012 05:07:39 GMT"
+        },
+        {
+          "age": "2446958"
+        },
+        {
+          "x-amz-cf-id": "RenD1oaMDB7WDA0nJBiT78PBjnjUmYU-NT3-eSlLX03q5vM16mQthg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "13915"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 30 Oct 2012 05:57:41 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 19:21:14 GMT"
+        },
+        {
+          "age": "371215"
+        },
+        {
+          "x-amz-cf-id": "y-qky_uSUebpzoYKGYMa1lzGeUux4fgnmRhwkgvrXQn78lG5AhfFmA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Tue, 22 May 2012 06:41:37 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=621353717"
+        },
+        {
+          "expires": "Tue, 13 Jul 2032 03:19:53 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:36 GMT"
+        },
+        {
+          "content-length": "1580"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4456"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 31 Oct 2012 05:26:53 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 05:26:32 GMT"
+        },
+        {
+          "age": "286663"
+        },
+        {
+          "x-amz-cf-id": "QAWFAFoQqqdK6bsebuU01EfGVCwSV_HjtTaLA-hlTAAOA6d4Wsz4wg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2951"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 18:38:41 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 05:26:34 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "66355"
+        },
+        {
+          "x-amz-cf-id": "Aubb5MuBO28D2I8jIDVYWmI2-8g4Tt0cpl6beMcpVSNTX5gZMv4wgQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4666"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 17:58:34 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 17:58:34 GMT"
+        },
+        {
+          "age": "155162"
+        },
+        {
+          "x-amz-cf-id": "OBft3yppuSTyI5o52ZSa5lfbjZWp3ShzF8-dM45Pf0qkJIYh24nQtQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5192"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 16:39:49 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 25 Jul 2012 11:12:38 GMT"
+        },
+        {
+          "age": "69923"
+        },
+        {
+          "x-amz-cf-id": "Y6S4ynuqdWWDNdGNvXNtU6fnNBBOoJLWVPdhgnyEnTTMDvI_4XuMzQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5529"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 31 Oct 2012 03:41:12 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 03:15:26 GMT"
+        },
+        {
+          "age": "293004"
+        },
+        {
+          "x-amz-cf-id": "ShMwoXym8XNH4S1fFX15TBcjBioYagCJaBprDbqaOtJjOiNkWdeg7g=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3629"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 19 Oct 2012 23:15:49 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Sat, 23 Jun 2012 21:37:13 GMT"
+        },
+        {
+          "age": "1259327"
+        },
+        {
+          "x-amz-cf-id": "HlyMS446sa886uO7DjJyUavWa-mHH0XLcyzUrb49K-G4mkqMbSOsIA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3509"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 25 May 2012 23:03:05 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 24 May 2012 18:35:18 GMT"
+        },
+        {
+          "age": "13960891"
+        },
+        {
+          "x-amz-cf-id": "-IZ-Kzdl4oTM776x_-SdI-Sf-rdBE0xeKYvmj2otONB4guu3l0lNsA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4879"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 31 Oct 2012 04:39:14 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 03:14:55 GMT"
+        },
+        {
+          "age": "289522"
+        },
+        {
+          "x-amz-cf-id": "UnkzEKXd4DwGvLUL-8-afWzVHMcB4T-tYr9-HLWFRsfbiIvYylwIxA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2809"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 17:24:44 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Tue, 11 Sep 2012 11:41:25 GMT"
+        },
+        {
+          "age": "70792"
+        },
+        {
+          "x-amz-cf-id": "ApQSczR7vg5QCdxHZR6hBm1pbl-hGvpxOz6MPp9eCEoBx99I8-atXg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1979"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 31 Oct 2012 18:13:18 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 18:13:18 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "240678"
+        },
+        {
+          "x-amz-cf-id": "WvvSWSGbGBRHrBf0RFjJ3qJ_o4y9yJuT8SeGDq1dpYvwTANrwyr-Ow=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "6942"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 17:58:34 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 17:58:34 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "155162"
+        },
+        {
+          "x-amz-cf-id": "XA_j3mVwjsJMTgHec3EMMTJ547z0XmIPH8hlMt5tuM1OEe2Kuo_A8g=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1854"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 31 Oct 2012 03:41:12 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 03:15:25 GMT"
+        },
+        {
+          "age": "293004"
+        },
+        {
+          "x-amz-cf-id": "rPNUJ_0Y4uE0WKLOFZddVt9Pt-15ixc8M9WYFxZcxUq204PEfNtVuw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3661"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 16:20:50 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 11 Sep 2012 21:41:22 GMT"
+        },
+        {
+          "age": "161026"
+        },
+        {
+          "x-amz-cf-id": "10WYvTpJNEH0MAP3wne0pXXNE8ZnAI4eVJA3EDPrJ6TF3rv0YJJK_A=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2729"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 23:43:43 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 01 Jun 2011 05:24:35 GMT"
+        },
+        {
+          "age": "70759"
+        },
+        {
+          "x-amz-cf-id": "kb2nMqvt29Qj3LdcwS6ww1KobMLzUlJWjzEzfJ49hrIYV9AchOannQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3916"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 17:24:44 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 07 Sep 2012 09:03:37 GMT"
+        },
+        {
+          "age": "70792"
+        },
+        {
+          "x-amz-cf-id": "JJZDbMR4RLNK_HVvTbUnNaDilC24pIBmtY7BRd5JkQybHgLPJLr2Bw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2103"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 31 Oct 2012 18:14:15 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 18:14:15 GMT"
+        },
+        {
+          "age": "240621"
+        },
+        {
+          "x-amz-cf-id": "AG9h0_9ASRuhaLjhB4fsbvE6ktpeabI5v9S-fSJ_K1SOdr8skxsQ8A=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2120"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 31 Oct 2012 18:29:52 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 18:15:06 GMT"
+        },
+        {
+          "age": "239684"
+        },
+        {
+          "x-amz-cf-id": "3V9zS2t71NKOHjc-zbQieHw8D15BF88HM5DVQY9j5z7qaxE8JDHbyA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2065"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 17:25:28 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 09 Oct 2012 17:48:33 GMT"
+        },
+        {
+          "age": "70748"
+        },
+        {
+          "x-amz-cf-id": "Nkglfv_cx2pdr2EZJF0D475iF5L5LK6Fxcq0dUDPSxCVHftCYtgHng=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2131"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 31 Oct 2012 18:14:15 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 18:14:15 GMT"
+        },
+        {
+          "age": "240621"
+        },
+        {
+          "x-amz-cf-id": "Xp7P1ZCF0IjKGtBRruIMsC780cNrxhNJ5960ejB13uXf3su3MHM7PQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2962"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 07:00:00 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 05:49:53 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "194676"
+        },
+        {
+          "x-amz-cf-id": "peTzFJr516_fOBQY5OC91FWEamWDNAqIh8_l1VUiaqrMRgGupou75w=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4626"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 07:00:02 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 05:49:52 GMT"
+        },
+        {
+          "age": "194674"
+        },
+        {
+          "x-amz-cf-id": "VMe4jZb7miZ0G-rv3uBPNmdTpYUIYgkj8UaXTHlFZ8sd2SONziLchg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3581"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 31 Oct 2012 17:29:39 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 17:29:39 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "243297"
+        },
+        {
+          "x-amz-cf-id": "DQkavQgzFQLKNbG-YUMaAIW1JOadibOwvA_xdhashOIKLfpQuAn2gA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5534"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 31 Oct 2012 05:49:57 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 05:49:53 GMT"
+        },
+        {
+          "age": "285279"
+        },
+        {
+          "x-amz-cf-id": "Quota3IS8N_cDOH-5AgNf6IoirJJCjYpEsTfXJKx-QYO8uoPPsgF5Q=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3336"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 31 Oct 2012 07:03:12 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 07:03:12 GMT"
+        },
+        {
+          "age": "280884"
+        },
+        {
+          "x-amz-cf-id": "nKFIlcQrEACy_wNDwvMk7o4wDqwiqg22gTbbx1GgRtKIfeQCY4rAUg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3660"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 31 Oct 2012 07:05:38 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 07:04:35 GMT"
+        },
+        {
+          "age": "280738"
+        },
+        {
+          "x-amz-cf-id": "5flYXqijU45smYJrbpa6DyFQK79BKOC75IH_AD_gBLabCf2_f6JJ4w=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3631"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 31 Oct 2012 07:03:29 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 07:03:29 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "280867"
+        },
+        {
+          "x-amz-cf-id": "9zt7Ykby0o5nJUdXmLURwVG97OcVN7UDmlxqqBAr6-kpce1NUZ3vHQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4831"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 31 Oct 2012 07:02:44 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 07:02:44 GMT"
+        },
+        {
+          "age": "280912"
+        },
+        {
+          "x-amz-cf-id": "arnnoA4osVhZ9WWxe1rw1kH36LVZpueZhg5Ij7p06zynPPuP_PbhAg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "71"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sun, 21 Oct 2012 07:10:55 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 01:53:07 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "1144421"
+        },
+        {
+          "x-amz-cf-id": "otV5h9P0a9-ozjyL5asNyiDOMvE4cnJFvEUCY1qCIkCO1BlYJsF-fQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "4528"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 26 Oct 2012 23:30:10 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Sat, 13 Oct 2012 00:03:47 GMT"
+        },
+        {
+          "age": "653666"
+        },
+        {
+          "x-amz-cf-id": "zat2zuNOe5PZPMKX9J5IIEc2EvGHW2wIWsGnPPG6NWdX7cWtkKBL3Q=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "4305"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 19:34:27 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 18:07:44 GMT"
+        },
+        {
+          "age": "63009"
+        },
+        {
+          "x-amz-cf-id": "P_0GsZlh-uhXRNgmMVIxDRrsh8CWCBHEX0sNhI9WcxKsR6VpK8qf1A=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "8307"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 07:00:07 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 19:02:26 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "194669"
+        },
+        {
+          "x-amz-cf-id": "_1G9P5_LnBwk_k5A76Q4cs4aOE-c9Y2U6KPOYakVoWIblaFat2Quuw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "3817"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 22 Oct 2012 21:23:14 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 18 Oct 2012 22:25:34 GMT"
+        },
+        {
+          "age": "1006882"
+        },
+        {
+          "x-amz-cf-id": "b-rYDPAafNePCeY3rEXSUu_SHu_vhZoVf-W-90RHYbQi7NMrF7IuVw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "14262"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 26 Oct 2012 19:54:19 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 26 Oct 2012 19:43:52 GMT"
+        },
+        {
+          "age": "666617"
+        },
+        {
+          "x-amz-cf-id": "DYBg6QCNjA9V6sSGrhw4w4QT--gzcIbkjjJZKjphipyO-cYwRK1p8w=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:36 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "0D7SZ3NDXXQ10K0Y1P2W"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "Yhw+pyNdxXVfOz+enqEPz5i4xubYpPznUk/Z7jiBcq/rnwK5Kwv0df5Ff+b2ROcL"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html; charset=ISO-8859-1"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "last-modified": "Tue, 21 Sep 2010 17:37:41 GMT"
+        },
+        {
+          "etag": "\"4486-7c5a6340\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "2590"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "-1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "5639"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 23 Oct 2012 16:30:50 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 23 Oct 2012 16:30:51 GMT"
+        },
+        {
+          "age": "938026"
+        },
+        {
+          "x-amz-cf-id": "O6Rt-cRJLPLokVndpOyGdTuWoLI6bPqiRt_TrdmIiYayIHUPbzY__A=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "14998"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 30 Oct 2012 20:28:09 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 20:28:09 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "318987"
+        },
+        {
+          "x-amz-cf-id": "LmtQ4CHgGq-tu05FlE0VnrOXiq0ALsXRzmG89ZFrPGFrzAJOWjQADw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "5391"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 30 Oct 2012 23:27:41 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 19 Oct 2012 17:44:45 GMT"
+        },
+        {
+          "age": "308215"
+        },
+        {
+          "x-amz-cf-id": "B9874IgNcW6Dl_iw2J-uxdH_JRYl-xRAXmd-Fx2sDQjm3zOmOAGS6A=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "14682"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 00:57:21 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 21:44:15 GMT"
+        },
+        {
+          "age": "216435"
+        },
+        {
+          "x-amz-cf-id": "JNivNWPfMlDwvI1crpnpaAtSZ9ynv0-1kJNOR3Kmfy-pFt3R00dHPQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "14468"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 07:00:12 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 24 Oct 2012 03:52:02 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "194664"
+        },
+        {
+          "x-amz-cf-id": "u_bSf4kdjci5AymBMUSnaNCb7yBkMN4vlmaw6b2yHQaKkeC6bOoqXQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "17329"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 07:00:57 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 20 Apr 2012 19:39:30 GMT"
+        },
+        {
+          "age": "194619"
+        },
+        {
+          "x-amz-cf-id": "8NlR_O7HCbbYd6sWYXsaGIxoNNX3kno3ZaIkqqgmHYk3r7P0msD2hA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "5249"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 11 Oct 2012 22:47:04 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 13 Sep 2012 19:26:45 GMT"
+        },
+        {
+          "age": "1952252"
+        },
+        {
+          "x-amz-cf-id": "P3861d5dz7qGT13WJVUssV0-8x_VFQt4TtyhgjHZkDhDFHeoBpixcA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 25 Jun 2010 18:22:49 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=623879811"
+        },
+        {
+          "expires": "Wed, 11 Aug 2032 09:01:27 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:36 GMT"
+        },
+        {
+          "content-length": "2903"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 28 Sep 2012 00:00:56 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=630492875"
+        },
+        {
+          "expires": "Tue, 26 Oct 2032 21:59:12 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:37 GMT"
+        },
+        {
+          "content-length": "1467"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 03:41:46 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=630506567"
+        },
+        {
+          "expires": "Wed, 27 Oct 2032 01:47:24 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:37 GMT"
+        },
+        {
+          "content-length": "4150"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Tue, 22 May 2012 06:41:37 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=621353716"
+        },
+        {
+          "expires": "Tue, 13 Jul 2032 03:19:53 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:37 GMT"
+        },
+        {
+          "content-length": "1580"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 17 Jun 2009 18:26:49 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=613395574"
+        },
+        {
+          "expires": "Mon, 12 Apr 2032 00:44:11 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:37 GMT"
+        },
+        {
+          "content-length": "856"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 02:32:26 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=630557957"
+        },
+        {
+          "expires": "Wed, 27 Oct 2032 16:03:53 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:36 GMT"
+        },
+        {
+          "content-length": "74964"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "3564"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sun, 21 Oct 2012 19:37:21 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 12 Sep 2012 12:02:28 GMT"
+        },
+        {
+          "age": "1099637"
+        },
+        {
+          "x-amz-cf-id": "UnPWM9TK0CYPiYCFO7JpmgG2mEPdetqHfd_sfHtz7tBC7MdT1QthvQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "4267"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 30 Oct 2012 04:55:12 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 19:55:09 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "374966"
+        },
+        {
+          "x-amz-cf-id": "cjoJQzghJEJQidTuBdcGV7vefvG_4fs26RZ_XZHGp3J47Hsqk_mYqA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 05:23:58 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=630506503"
+        },
+        {
+          "expires": "Wed, 27 Oct 2032 01:46:20 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:37 GMT"
+        },
+        {
+          "content-length": "115718"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "1104"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 19 Oct 2012 19:46:04 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 02 Jun 2010 22:12:17 GMT"
+        },
+        {
+          "age": "1271916"
+        },
+        {
+          "x-amz-cf-id": "CWh3NmGhidrPUirYTJeaMy1q9wfohhNrJcJHsnvLdnXf-hfmvNt_Eg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "6577"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 23 Oct 2012 17:59:58 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Tue, 23 Oct 2012 17:58:26 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "2532"
+        },
+        {
+          "x-amz-cf-id": "h2X5ptCOi7LbCmEDN_-FkzuUX3O9fZGO3nRZaYiuaVmjsZJVea0KlA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "469"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 21 May 2012 18:57:43 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 17 May 2012 16:40:47 GMT"
+        },
+        {
+          "age": "76922"
+        },
+        {
+          "x-amz-cf-id": "cTNh37gW3aRYzh0_ymNAgRrpHgiKNyjCHWwWepii3kfSm2mifkCOuQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "1628"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 17 May 2012 00:31:56 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 15 May 2012 05:09:34 GMT"
+        },
+        {
+          "age": "35944"
+        },
+        {
+          "x-amz-cf-id": "Lg2DdGTzo_5b8Nxk_htSqW7FB2nLWjG6cKbaOt8zmZY66pVw8K4fCA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "356"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 16 May 2012 19:42:46 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 15 May 2012 05:09:34 GMT"
+        },
+        {
+          "age": "3065596"
+        },
+        {
+          "x-amz-cf-id": "1OH_QkiX-oKt7sV0toMi-aqqotKtLvRU2cjdTLewhf5rcVlqqk1ODg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Miss from cloudfront"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:40 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "0D7SZ3NDXXQ10K0Y1P2W"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "Yhw+pyNdxXVfOz+enqEPz5i4xubYpPznUk/Z7jiBcq/rnwK5Kwv0df5Ff+b2ROcL"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "last-modified": "Tue, 21 Sep 2010 17:37:41 GMT"
+        },
+        {
+          "etag": "\"4486-7c5a6340\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "2590"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "x-amzn-requestid": "070e59c2-25b7-11e2-9647-1185f0fe0569"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:40 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "0D7SZ3NDXXQ10K0Y1P2W"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "Yhw+pyNdxXVfOz+enqEPz5i4xubYpPznUk/Z7jiBcq/rnwK5Kwv0df5Ff+b2ROcL"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "last-modified": "Tue, 21 Sep 2010 17:37:41 GMT"
+        },
+        {
+          "etag": "\"4486-7c5a6340\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "2590"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "x-amzn-requestid": "0727fc26-25b7-11e2-bb20-cf84a5272b25"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4885"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 07:00:03 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 07 Aug 2012 04:35:28 GMT"
+        },
+        {
+          "age": "21877"
+        },
+        {
+          "x-amz-cf-id": "IporfETtFCxA5v41bAp-pDjDCP4cWlKwkoaOGvvvrxS1Mw1yvUBlGQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "1543"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 11 Sep 2012 13:00:00 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 02 Jul 2010 18:12:37 GMT"
+        },
+        {
+          "age": "4579480"
+        },
+        {
+          "x-amz-cf-id": "-6t8SJvNBh6dZt3rUiRrjIVqnnVJiFbFC-QSFxcqJYuBXrzKAWWdoQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "592"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 22 Oct 2012 20:03:59 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 01:37:57 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "1011641"
+        },
+        {
+          "x-amz-cf-id": "8vWzDFif0eREdPSdflEYZlgYAymCWdiDYl8Kv7KC_Fl0ALuKJG_4ag=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "1646"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 16 Feb 2012 06:11:58 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 13 Oct 2010 20:47:21 GMT"
+        },
+        {
+          "age": "22575162"
+        },
+        {
+          "x-amz-cf-id": "3RdIhQfLO9XOQFa49YXot07-NIDImEld2xoGH4X9880KTfwAGihvfQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 22:37:51 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 22:37:51 GMT"
+        },
+        {
+          "content-type": "application/ocsp-response"
+        },
+        {
+          "content-transfer-encoding": "binary"
+        },
+        {
+          "content-length": "1596"
+        },
+        {
+          "cache-control": "max-age=379990, public, no-transform, must-revalidate"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:41 GMT"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "connection": "Keep-Alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 20:27:41 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 20:27:41 GMT"
+        },
+        {
+          "content-type": "application/ocsp-response"
+        },
+        {
+          "content-transfer-encoding": "binary"
+        },
+        {
+          "content-length": "1596"
+        },
+        {
+          "cache-control": "max-age=372180, public, no-transform, must-revalidate"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:41 GMT"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "connection": "Keep-Alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:42 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "0ZHTZBAADKEZ1K4EGBW6"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "yJRRI8wh/xPuc4C3nBZz5KNXS1OE9OJu63P/XksiIWL9W09cknSsgC8WWr29GiDY"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "last-modified": "Tue, 21 Sep 2010 17:37:41 GMT"
+        },
+        {
+          "etag": "\"4486-7c5a6340\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "2590"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "x-amzn-requestid": "0727fc26-25b7-11e2-bb20-cf84a5272b25"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:42 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "1ZH0W43SZ47AMV593QDH"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "wGMRjKh1Pt/o44qHjshIvp7ZIPt2LK8Cze7/o3+/lfgxPUcgTEKCAZBzlDIoLoet"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "452"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:42 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "480"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:42 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 18:39:58 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 22:20:44 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 22:20:44 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "43420"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "53038"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "304"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "1543"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:42 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 12 Aug 2011 13:43:43 GMT"
+        },
+        {
+          "age": "20402"
+        },
+        {
+          "x-amz-cf-id": "6gJoa6bOvFtigUntTCjVHju-EqLbWnHKw6eJPDdiGK6ocghu7-S_cg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 24 May 2012 09:43:11 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=621326683"
+        },
+        {
+          "expires": "Mon, 12 Jul 2032 19:49:25 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:42 GMT"
+        },
+        {
+          "content-length": "4823"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:47 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "0DHCSP7QGSTG72H1QPRB"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "iwlAGigQepIxbg6chfZtqXoGGw6vBTgxU/ol+ayO5+ttKg7WcjWBSrPG+7aY5Eey"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html; charset=ISO-8859-1"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:48 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "06NWT8YAYSXDSXHFEBX3"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "+dgTelR5Pvj5ApOpupZ5c4EXyGBnWsp/CtTohBqWXrKuiSIBT+ZSU/92HDHIoBxS"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html; charset=ISO-8859-1"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2393"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sun, 30 Sep 2012 01:55:28 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 15 Dec 2009 04:00:19 GMT"
+        },
+        {
+          "age": "2977760"
+        },
+        {
+          "x-amz-cf-id": "iMEciUEJFtmANuUhvSWuNQKwQ56xFPVzicWdjaUIS7KD_SS41vr3pQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "599"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 28 Sep 2012 14:12:09 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 01:32:16 GMT"
+        },
+        {
+          "age": "3106359"
+        },
+        {
+          "x-amz-cf-id": "tN10_L-OYWE-jbnsbpustU_nkePz1Ht2dF12FZfdzo8SDh6xAzABhw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3457"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 30 Oct 2012 16:44:30 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 06 Aug 2012 02:14:57 GMT"
+        },
+        {
+          "age": "332418"
+        },
+        {
+          "x-amz-cf-id": "nAZvrqCa80oBwwxAEUWbmmOUITdcLIDdCpFL12zOCAKgSf4n0wfGcQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3174"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 08 Mar 2012 01:24:50 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 15 Oct 2010 14:25:35 GMT"
+        },
+        {
+          "age": "20777998"
+        },
+        {
+          "x-amz-cf-id": "o4ZBTBwVKGrCOxAmevzGBdf3GXvw24E_Ibo53uEwUJbXc2EdAiOMyQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "601"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sun, 30 Sep 2012 13:45:07 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 01:33:44 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "2935181"
+        },
+        {
+          "x-amz-cf-id": "_ELm77X7wvQxQ8ccnoUS-_woGWJlpaS6DF6N2WkCaQSwNycPUCFD4A=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3446"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 05 Jan 2012 14:17:10 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Thu, 10 Feb 2011 01:27:46 GMT"
+        },
+        {
+          "age": "26174858"
+        },
+        {
+          "x-amz-cf-id": "-Kkrw4riucQdic2OO_FiGGTwkrKyhvjx0Mcpi0Tz7UmWTD6LAmwHeg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3793"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 26 Oct 2012 19:06:32 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 07 Aug 2012 03:08:01 GMT"
+        },
+        {
+          "age": "669496"
+        },
+        {
+          "x-amz-cf-id": "X6dyQ-kDIuminUqGxtG-vyD7eZ70sWXg-ltBtWE0KkdI8OEM-Mpleg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "609"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 25 Sep 2012 16:01:58 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 15:54:14 GMT"
+        },
+        {
+          "age": "3358970"
+        },
+        {
+          "x-amz-cf-id": "b_pAd8eX4r8HYc3jV3dhKukKkfwIrYz-zWqHjipfMmhJSE_781h1oQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3653"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 01 Feb 2012 02:46:14 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 21 Nov 2011 14:13:29 GMT"
+        },
+        {
+          "age": "23883514"
+        },
+        {
+          "x-amz-cf-id": "bjtvmLGP6K92dIdVA6duj28yhxkrL38nJMkNCptOUGcR-vblR3Dgog=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3268"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 23 Oct 2012 16:12:38 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 21 Nov 2011 14:13:47 GMT"
+        },
+        {
+          "age": "939130"
+        },
+        {
+          "x-amz-cf-id": "NjXCi6TD-dhpmdMViBrtzqn_DEt71fFljKydDm_2OCDAPJEMAg5xnA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2974"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 30 Oct 2012 09:47:16 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 03 Apr 2012 10:20:17 GMT"
+        },
+        {
+          "age": "357452"
+        },
+        {
+          "x-amz-cf-id": "Z_49skoUilBV6g2nhKUJZO1CTvzkPUHD_SDUxrSh1etd8GS3FknVlQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3246"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 26 Oct 2012 04:05:23 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Tue, 02 Feb 2010 23:26:50 GMT"
+        },
+        {
+          "age": "723565"
+        },
+        {
+          "x-amz-cf-id": "0SbSlmo1oQR1EZaPujBcrkn2rp6-JwnKeWPjRJuZmV1Z6bYwy17-7Q=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3677"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 22 Oct 2012 23:48:37 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 21 Nov 2011 14:14:18 GMT"
+        },
+        {
+          "age": "998171"
+        },
+        {
+          "x-amz-cf-id": "kIXZdAY5Fnpheu46XC3kSBlJD9BzYrmLWTcGFXMEBT4VLXyNpe1SPw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2600"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 14 Dec 2011 20:22:55 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 28 Sep 2011 08:02:37 GMT"
+        },
+        {
+          "age": "28053713"
+        },
+        {
+          "x-amz-cf-id": "jdbN9e43yR0jKrrOZUnGZIUGi2GCJHSK3n2VKaDm3XT7Xy-Rj8OqNQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "1489"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 18 Jul 2012 14:38:05 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 04 Jun 2010 01:32:52 GMT"
+        },
+        {
+          "age": "9325603"
+        },
+        {
+          "x-amz-cf-id": "X3VwQpWnMPHQC7MJRw6T-DaBIBalsbD0mGV4Ng9yHU5gBejjAez0dA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:48 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "1C1W41NW5TYBHBJNXB7G"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "AatuyevJiRUtb6/2d9LbJJ3EZwL4Qi5oAN43fcnZTs+cBfpfR5xhWX4o6c4AFjko"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:48 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "101M70TJ0XKDRA31P9ZW"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "8Q84WjUy4qxnCmekXyK0cOh2MgfmCnF2jlIdsknvZNKQIyUhsXloJp0QYIhPIFFw"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:49 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "0R7WZ6VQ04KDQ1RKBSDK"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "iCw5Tdn11Ug6Qn1eOt4uOA+JEPcRxl56zUcXJAWRQ7+nE2ZJ4m5XU7DWbrWSX6Jj"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html; charset=ISO-8859-1"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4760"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 19 Oct 2012 09:19:33 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 27 Jul 2012 14:32:32 GMT"
+        },
+        {
+          "age": "1309517"
+        },
+        {
+          "x-amz-cf-id": "wn_k8I4g86z9xU39JO_mi8Znx5qLGm-YEKtqp9bzQUcLva6y9aPWWg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3348"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 14 Sep 2012 14:36:02 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 20 Jul 2012 14:38:01 GMT"
+        },
+        {
+          "age": "4314528"
+        },
+        {
+          "x-amz-cf-id": "FEA_NXcSb4YgiTvDGcoQ8YzVOim-T7ZoGwBNe_-tBm3HybITjhj1bw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "587"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 20 Oct 2012 15:34:28 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 15:54:16 GMT"
+        },
+        {
+          "age": "1200622"
+        },
+        {
+          "x-amz-cf-id": "vmJhsk3IfjzGGQAAi64eB8PuL0vI87SwHahTEYuBFlmrsmi_dxZ-IA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5691"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 09 Oct 2012 04:35:25 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Thu, 13 Sep 2012 17:48:15 GMT"
+        },
+        {
+          "age": "2190565"
+        },
+        {
+          "x-amz-cf-id": "UiucrnKNxdras37pId8z-tCHGNPWFMZJXLOIxPAsl_08EFRty9FxZA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4764"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 16 Oct 2012 16:34:25 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 04 Oct 2012 02:17:34 GMT"
+        },
+        {
+          "age": "1542625"
+        },
+        {
+          "x-amz-cf-id": "quvhesbVUpq0D4qHZPiMZU_LBC4xAEbnNL5tNfJoazAENn82wpjOFA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "588"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 28 Sep 2012 12:35:39 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 01:41:22 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "3112151"
+        },
+        {
+          "x-amz-cf-id": "RNt3gJPkHWBNRTsYRS0r-qEJUzHeKw0wd8LRUaKmPjRoB_txmvKk0g=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3687"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 25 Jul 2012 15:43:46 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 13 Jul 2012 14:50:09 GMT"
+        },
+        {
+          "age": "8716864"
+        },
+        {
+          "x-amz-cf-id": "P_VlWy_DI7Q9lOv31mLocJxGBGCO3x_Flg_jDhAwOvSOlHxhfkj4hA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5547"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 21 Mar 2012 20:01:12 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 21 Mar 2012 14:44:09 GMT"
+        },
+        {
+          "age": "19587818"
+        },
+        {
+          "x-amz-cf-id": "gVRXsClGSK87EC1y6EX-0j9CO-BL95NF-urXdrKWurV1eDIRau04Cw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4020"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 19 Oct 2012 09:18:15 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Sat, 13 Oct 2012 21:42:50 GMT"
+        },
+        {
+          "age": "1309595"
+        },
+        {
+          "x-amz-cf-id": "mvpI8qWvGHh__TojWYI7VYmcaawpJ27bnnPJ08ozq7UlLXJiYycA4g=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4769"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 08 Oct 2012 21:18:35 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 31 Jul 2012 08:49:37 GMT"
+        },
+        {
+          "age": "2216775"
+        },
+        {
+          "x-amz-cf-id": "d8GIZ1IcSWZMBXJ8HsZ_vts4ysREuGFsNrOBA_iB5au7tUOZqueqQQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "1759"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 27 Sep 2012 01:27:26 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 12 Jan 2009 18:19:36 GMT"
+        },
+        {
+          "age": "3238644"
+        },
+        {
+          "x-amz-cf-id": "bTf74h2ZtQt_I09t6RmrbYg-97o_HtttusNHsh-MGb8gUA51AY7Twg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "17741"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 12 Oct 2012 14:19:15 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Wed, 19 May 2010 09:51:41 GMT"
+        },
+        {
+          "age": "1896338"
+        },
+        {
+          "x-amz-cf-id": "UYx91fWWjcOHKIO2wY26UNYf5EQYYW4g5IWOLayy-_r3LBCjQQsV6w=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Mon, 26 Mar 2012 20:19:08 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=630656332"
+        },
+        {
+          "expires": "Thu, 28 Oct 2032 19:23:45 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:53 GMT"
+        },
+        {
+          "content-length": "2126"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Tue, 17 Jul 2012 05:47:45 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=627946664"
+        },
+        {
+          "expires": "Mon, 27 Sep 2032 10:42:37 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:53 GMT"
+        },
+        {
+          "content-length": "1518"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 04 Nov 2009 06:54:44 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=613395773"
+        },
+        {
+          "expires": "Mon, 12 Apr 2032 00:47:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:53 GMT"
+        },
+        {
+          "content-length": "2288"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 21 Sep 2012 07:31:02 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=626993061"
+        },
+        {
+          "expires": "Thu, 16 Sep 2032 09:49:14 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:53 GMT"
+        },
+        {
+          "content-length": "2752"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 04:13:23 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=630408896"
+        },
+        {
+          "expires": "Mon, 25 Oct 2032 22:39:49 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:53 GMT"
+        },
+        {
+          "content-length": "18249"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "796"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 12 Oct 2012 10:45:19 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Wed, 19 May 2010 09:51:41 GMT"
+        },
+        {
+          "age": "1909174"
+        },
+        {
+          "x-amz-cf-id": "9MHc1JZ7kR7Xm1k_06GjXXBjMfsbYsbpxH549UlaToDw3PtOlOpJng=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:52 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "05Y7M552RGFYHV8MY341"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "oGWKRn1W+jjcnVaAmsQPuDLm0eqlACpITrO3bAh2oWT2VrepfzlHFl5s2S6e8ah5"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html; charset=ISO-8859-1"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "x-sap-pg": "photo_display_on_website"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "expires": "-1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2358"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 21 Nov 2011 14:41:51 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Mon, 21 Nov 2011 14:13:29 GMT"
+        },
+        {
+          "age": "30061382"
+        },
+        {
+          "x-amz-cf-id": "rRtoTrePiEQnYeC12h_GTXYCVfIghwtr3bSzq5YQmQ2ZGyWgspVhvQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2343"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 28 Nov 2011 00:30:41 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 06 Apr 2010 23:10:58 GMT"
+        },
+        {
+          "age": "29507652"
+        },
+        {
+          "x-amz-cf-id": "47jA2MZ4Sw4DCikN2VyaaWmwTHmqX3rU2MwTeNh7e1Jz_UoUPpYraQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3059"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 05 Jan 2012 13:26:27 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 10 Feb 2011 01:27:46 GMT"
+        },
+        {
+          "age": "26177906"
+        },
+        {
+          "x-amz-cf-id": "WYavyIQcFAiZj--Zhj4aZuRfOIHvmeL3UfzvuuRJG_cspyZyEBTZvw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1090"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 06:05:00 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 06 Apr 2010 23:10:58 GMT"
+        },
+        {
+          "age": "25193"
+        },
+        {
+          "x-amz-cf-id": "8VDa9TCRS7VKfaAxdyPoMxc3nU5HHd7-ochC_jBjm5Htnl-jkMkuTA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "730"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 25 Jul 2012 12:42:51 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 31 Jan 2011 08:00:09 GMT"
+        },
+        {
+          "age": "8727722"
+        },
+        {
+          "x-amz-cf-id": "QrXHFzwiaMq4tNw6xz1x_Fy8OExfQwsb9eYgNg9x5of9ynYhiimfqg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1271"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 05 Jan 2012 19:58:22 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 21 Nov 2011 14:13:47 GMT"
+        },
+        {
+          "age": "26154391"
+        },
+        {
+          "x-amz-cf-id": "zfueMiQqfM6t_I7CSioRWzJ6Ja4aCnQfweQZmxivqYZ8HJfnkGedAQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1333"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 08 Feb 2012 22:12:29 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 10 Feb 2011 01:27:46 GMT"
+        },
+        {
+          "age": "23208744"
+        },
+        {
+          "x-amz-cf-id": "ELEGmBCM3aCsE_CitSFuw5Z_9oO1nINZ1Td8UGwaW5JQqOgNgrbAgw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1361"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 07 Mar 2012 21:41:49 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Fri, 07 Oct 2011 06:20:36 GMT"
+        },
+        {
+          "age": "20791384"
+        },
+        {
+          "x-amz-cf-id": "pOqim5pkNLfn0oKxi7ICFEmFFenUh0PbL_R9Lb9h6TpuGt0tRp4z8Q=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3006"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 13 Oct 2011 00:59:11 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 02 Feb 2010 23:33:20 GMT"
+        },
+        {
+          "age": "33480342"
+        },
+        {
+          "x-amz-cf-id": "G9CB0PE2to9TXhCktQwgI5sW6rlvjeiIaljq43R1hfimZv_emDTQ5Q=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3051"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 22 Nov 2011 21:04:40 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 21 Nov 2011 14:13:47 GMT"
+        },
+        {
+          "age": "29952013"
+        },
+        {
+          "x-amz-cf-id": "8B2pTWiByqir35Y8C9JwI9kCzXLE0qdWzMliO7vI6X4z0IPFb7OJSw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3784"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 24 Jan 2012 22:05:08 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 21 May 2010 10:34:44 GMT"
+        },
+        {
+          "age": "24505185"
+        },
+        {
+          "x-amz-cf-id": "iiwiqgcVCWG_cRsMapSsC7zbtuul0T9eNy4NjAklVsbJhZbhbNP0Hw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2439"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sun, 20 Nov 2011 13:48:40 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 28 Sep 2011 08:02:37 GMT"
+        },
+        {
+          "age": "30150973"
+        },
+        {
+          "x-amz-cf-id": "N3_BBMhFY33Y_cabN1aZofeaRTYY2qxgxIlyDqqnyzTHoBb-HQQ4kA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3087"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 22 Oct 2012 10:10:03 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Mon, 25 Jul 2011 21:08:27 GMT"
+        },
+        {
+          "age": "1047291"
+        },
+        {
+          "x-amz-cf-id": "pUS_TqP5ZtROVGDGuR-eDXw0ijzMiGzziwONZiQwoWOmwMrlTnRUiQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3377"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 22 Oct 2012 12:55:04 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 05 Jun 2009 14:46:00 GMT"
+        },
+        {
+          "age": "1037390"
+        },
+        {
+          "x-amz-cf-id": "U8QzlM0myAnVtennCypCEE35AVBn9P7vU8rfVC-qdIV19u_F-61loA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 28 Sep 2012 12:16:12 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:15:32 GMT"
+        },
+        {
+          "age": "3113322"
+        },
+        {
+          "x-amz-cf-id": "yRMGD1lIFrzR7iBctL75xllVcgCY4oq5vxpU8vyBYtYIhDG4wgfhhw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2639"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 11 Jan 2011 12:36:42 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 21 Dec 2010 20:23:19 GMT"
+        },
+        {
+          "age": "57198492"
+        },
+        {
+          "x-amz-cf-id": "KUP-5JnHht-4Vm9AI5uL23vWqItT_PCAoTXYhS67UcTYyHi9H4qomw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "53"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 29 Sep 2012 16:43:06 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 23:12:42 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "3010908"
+        },
+        {
+          "x-amz-cf-id": "9nFbAiM9DpxC3cnA__WbfWVECGjZkkgmC6B1r2D6H_pZUeOJpmckKw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1266"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 13 Dec 2011 01:03:43 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 12 Dec 2011 22:30:22 GMT"
+        },
+        {
+          "age": "28209671"
+        },
+        {
+          "x-amz-cf-id": "4XS4NQ5jtAPsXr8uz5LSIhit3YaYLOacfgxTqaJdmgGUSVeVX3L52w=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"31-ris0UMaL_SL500_SS100_#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "549"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 17 Sep 2012 06:10:41 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 04:41:18 GMT"
+        },
+        {
+          "age": "4085653"
+        },
+        {
+          "x-amz-cf-id": "8cM2EbSq2xMoZmAuqaRNnHUXo5fFEkwP993iO66WXR8cQhYdXav_-A=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "2309"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 22 Oct 2012 00:31:48 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 18 Sep 2012 23:01:43 GMT"
+        },
+        {
+          "age": "1081986"
+        },
+        {
+          "x-amz-cf-id": "I_rWsREl-5AOAKtcn3LicFnMAMonpKIxSr1BGia7JpyGrtD-VJlFAw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "4689"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 10 Oct 2012 00:37:12 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 15 Jul 2011 19:43:59 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "2118462"
+        },
+        {
+          "x-amz-cf-id": "zJr0j4xcaVnqbt7keScwtlVcaVTMpKQyOnG62dfi3bC2Yn7ZUU8hmQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "304"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 24 Aug 2012 23:48:39 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 18 Jul 2008 22:54:46 GMT"
+        },
+        {
+          "age": "6095775"
+        },
+        {
+          "x-amz-cf-id": "PKmkuepDkCjjY62A77yQuYuUte5c2Ty-_6DlKmAvhcwzRsHyn5nIrQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "3183"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 27 Sep 2012 03:20:41 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:20:32 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "3231853"
+        },
+        {
+          "x-amz-cf-id": "OwAw73zfegmW_QHY-kswWa1c-b8oV4xZ-5eevFXbZxfqoKPE6umE4Q=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "859"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 15:34:26 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Tue, 22 May 2012 07:35:03 GMT"
+        },
+        {
+          "age": "163828"
+        },
+        {
+          "x-amz-cf-id": "lfeQCmQ-LTseaf2mLmw-Ec-MgECRsFNyDab6oODONovNp3KBwaWuNQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "904"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 15:34:26 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 21 Apr 2011 09:50:08 GMT"
+        },
+        {
+          "age": "163828"
+        },
+        {
+          "x-amz-cf-id": "fx4kuYG47HcKaHNWoFHoUpVuQ9sWagCnJ3Kox-WAsGeI9bLRuIFkZA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"31-ris0UMaL_SL500_SS100_#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "988"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 15:34:26 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 11 Apr 2012 09:49:52 GMT"
+        },
+        {
+          "age": "163828"
+        },
+        {
+          "x-amz-cf-id": "pdz_b69t7pq2FxRxED3J9qfLWu_VlLnSgt3UkrYI2IsWgh0cxAcbRg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "7477"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 19 Oct 2012 13:03:42 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 01:06:13 GMT"
+        },
+        {
+          "age": "1296072"
+        },
+        {
+          "x-amz-cf-id": "IpXkwhJGWUHRMnyRAQVIxqffI1_ZEyW-nzUYrSWrfr8R_Y1uuGRCCQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "702"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 14 Sep 2012 15:53:26 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 12 Oct 2011 01:31:30 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "4309888"
+        },
+        {
+          "x-amz-cf-id": "HsG6bJczHwzkieHglmFzE2QCmzLxTaLPXXnAy-N55tzbuvrtZRCzCw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "7983"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 19 Oct 2012 12:29:27 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 15 Jul 2011 19:44:12 GMT"
+        },
+        {
+          "age": "1298127"
+        },
+        {
+          "x-amz-cf-id": "sCXON_3fv6WubL7uLSJaIqpVlCgjIetJyv1h_hMdF4cY17dhW5AtuQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "21587"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 19 Oct 2012 07:42:49 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 27 Sep 2012 18:42:30 GMT"
+        },
+        {
+          "age": "1315325"
+        },
+        {
+          "x-amz-cf-id": "T9aSuzcFAaMOSl0BfGK1RZtk2bHJRFveb6whI8ExXPmes7P1gEIr_g=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "14808"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 14 Sep 2012 19:42:20 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Sat, 02 Jun 2012 16:25:51 GMT"
+        },
+        {
+          "age": "4296154"
+        },
+        {
+          "x-amz-cf-id": "0V2zXn_NrH1y0_eQiJhavI_iThDjEBl3W8rbz6WK2bL14yhUFFMzMg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "929"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 15:34:26 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Sun, 20 Jun 2010 09:46:10 GMT"
+        },
+        {
+          "age": "163828"
+        },
+        {
+          "x-amz-cf-id": "kSSVSJhWVu77d7bZr26ow7tGxAtxQIJKxzBSnMTb-BvsXBOXCVvmrQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"41+6XVdi5mL_SX36_SY36_CR,0,0,36,36_#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:54 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\", CP=\"PSAo PSDo OUR SAM OTR DSP COR\""
+        },
+        {
+          "location": "http://s.amazon-adsystem.com/iu3?d=amazon.com&a1=&a2=0101e39f75aa93465ee8202686e3f52bc2745bcaf2fc55ecfd1eae647167a83ecbb5&old_oo=0&n=1351947870865&dcc=t"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "set-cookie": "ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Thu, 01-Jan-2037 00:00:01 GMT; Path=/"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "170"
+        },
+        {
+          "content-type": "text/html;charset=ISO-8859-1"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "304"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "246"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-amz-id-2": "A8pOeFTyzWm76hXU6FfLkQf4c9wZCOf1QF9R4TGkjXEInQJp6farkkg0WB0HfwcK"
+        },
+        {
+          "x-amz-request-id": "4B032A9637D718D5"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:54 GMT"
+        },
+        {
+          "x-amz-meta-jets3t-original-file-date-iso8601": "2011-11-08T18:38:37.000Z"
+        },
+        {
+          "x-amz-meta-md5-hash": "abb0183baa0ea995b47dcc0e9972095a"
+        },
+        {
+          "cache-control": "max-age=864000"
+        },
+        {
+          "last-modified": "Thu, 30 Aug 2012 18:02:23 GMT"
+        },
+        {
+          "etag": "\"ac923fb65b36b7e6df1b85ed9a2eeb25\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "AmazonS3"
+        },
+        {
+          "age": "157082"
+        },
+        {
+          "x-amz-cf-id": "QZJcXJG7Ji8wu-0D789ZbWAnaHnVN-XBUkupFYbHTmHhHcHrJq7P9Q=="
+        },
+        {
+          "via": "1.0 06b38b2ddcbb45c8e33db161a2316149.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "451"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:54 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 15:21:37 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=628223582"
+        },
+        {
+          "expires": "Thu, 30 Sep 2032 15:37:56 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:54 GMT"
+        },
+        {
+          "content-length": "856"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 04:12:21 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=630383568"
+        },
+        {
+          "expires": "Mon, 25 Oct 2032 15:37:42 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:54 GMT"
+        },
+        {
+          "content-length": "6979"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 17 Oct 2012 16:08:26 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=629262241"
+        },
+        {
+          "expires": "Tue, 12 Oct 2032 16:08:55 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:54 GMT"
+        },
+        {
+          "content-length": "1860"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Mon, 18 May 2009 10:07:44 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "max-age=580533835"
+        },
+        {
+          "expires": "Mon, 27 Sep 2032 10:42:37 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:54 GMT"
+        },
+        {
+          "content-length": "810"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-cache-lookup": "MISS from cdn-images.amazon.com:10080"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "516"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:54 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "p3p": "policyref=\"http://tag.admeld.com/w3c/p3p.xml\", CP=\"PSAo PSDo OUR SAM OTR BUS DSP ALL COR\""
+        },
+        {
+          "location": "http://s.amazon-adsystem.com/ecm3?id=bfd291d0-29a4-4e30-a3a2-90bfcce51d8f&ex=admeld.com"
+        },
+        {
+          "content-length": "275"
+        },
+        {
+          "content-type": "text/html; charset=iso-8859-1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:54 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "set-cookie": "meld_sess=bfd291d0-29a4-4e30-a3a2-90bfcce51d8f;expires=Sun, 05 May 2013 03:59:31 GMT;path=/;domain=tag.admeld.com;"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Thu, 27 Sep 2012 18:22:05 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 14:49:26 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 14:49:26 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "25380"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "80128"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:54 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\", CP=\"PSAo PSDo OUR SAM OTR DSP COR\""
+        },
+        {
+          "location": "http://s.amazon-adsystem.com/iu3?d=amazon.com&a1=&a2=0101e39f75aa93465ee8202686e3f52bc2745bcaf2fc55ecfd1eae647167a83ecbb5&old_oo=0&n=1351947870865&dcc=t"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "set-cookie": "ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Thu, 01-Jan-2037 00:00:01 GMT; Path=/"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "57"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 28 Sep 2012 08:55:13 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=628633148"
+        },
+        {
+          "expires": "Tue, 05 Oct 2032 09:24:02 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:54 GMT"
+        },
+        {
+          "content-length": "16588"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 11 Apr 2012 19:05:24 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=617190640"
+        },
+        {
+          "expires": "Tue, 25 May 2032 22:55:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:54 GMT"
+        },
+        {
+          "content-length": "10742"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 25 May 2012 04:46:13 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=621621842"
+        },
+        {
+          "expires": "Fri, 16 Jul 2032 05:48:57 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:55 GMT"
+        },
+        {
+          "content-length": "3960"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 26 Oct 2012 09:03:20 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=630485970"
+        },
+        {
+          "expires": "Tue, 26 Oct 2032 20:04:24 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:54 GMT"
+        },
+        {
+          "content-length": "14019"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:56 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "16ZMB88V50KWWQXFQZNR"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "0PU9VNtv9/YHthxuwDwGQDz7kHY8GLhrhbQs/A0BbIf1y/GiCONyJttmltEgnDaZ"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:56 GMT"
+        },
+        {
+          "x-amzn-requestid": "10a7eef8-25b7-11e2-a2e0-8bdc8a85b675"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "53"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:56 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "16KH0V157G0TXXQVTR1Z"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "6Hy72ZQh4+twTqX90DijzRdHDpTv81nJLyxFZMBbjNHkb8qZfDO7y4+75uITFMjm"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html; charset=ISO-8859-1"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "2212"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 27 Sep 2012 04:09:18 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 03 Aug 2011 20:37:32 GMT"
+        },
+        {
+          "age": "3228938"
+        },
+        {
+          "x-amz-cf-id": "e_uegUCHnyG0CG1xWLrNCiBH1sC8uTUlb-e31fTCz2013GXiBQpv3g=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"11+dlfeUrBL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1658"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 16 May 2012 17:46:43 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Mon, 21 Nov 2011 14:13:29 GMT"
+        },
+        {
+          "age": "14757493"
+        },
+        {
+          "x-amz-cf-id": "rjUV7bECb3foXt-4i01sG21mlvMgo9nOu7EtcMeIYzyJSWWqNNlDOw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "16364"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 14 Dec 2011 03:17:38 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Fri, 04 Nov 2011 23:48:42 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "28115238"
+        },
+        {
+          "x-amz-cf-id": "I6W0oRiMtuRDCDZetJr8DtOxr0nMh8QpK29mcgE2eMGEw69ogMaPdg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 13 Jul 2011 17:18:50 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=616029616"
+        },
+        {
+          "expires": "Wed, 12 May 2032 12:25:12 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:56 GMT"
+        },
+        {
+          "content-length": "594"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:56 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "0X3NVRPASEGRWVCHH1H3"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "+dgTelR5Pvj5ApOpupZ5c4EXyGBnWsp/CtTohBqWXrKuiSIBT+ZSU/92HDHIoBxS"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html; charset=ISO-8859-1"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2902"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 27 Oct 2012 23:34:12 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 20 Jul 2012 15:59:40 GMT"
+        },
+        {
+          "age": "567044"
+        },
+        {
+          "x-amz-cf-id": "bYLWczW4h_oqRLXSyZdMo3kjSsqUZNWoGXrVLgvaIVqM8SXrlaPicA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3155"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 26 Jul 2012 09:16:33 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 19 Jul 2012 17:10:12 GMT"
+        },
+        {
+          "age": "8653703"
+        },
+        {
+          "x-amz-cf-id": "pxFBejzs4oRgmqxYc2s6mbS_QBknibmyPLQGd8Ejv-8cWl04HQGPtA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"41+6XVdi5mL_SX36_SY36_CR,0,0,36,36_#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3536"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sun, 27 May 2012 08:44:57 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 19 May 2011 14:46:28 GMT"
+        },
+        {
+          "age": "13839599"
+        },
+        {
+          "x-amz-cf-id": "vToxkdVmSZQS0V3iRZM-gCcaadczMLYZw_REFYGTBUn-HP5HfdAeDA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3143"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 06 Aug 2012 15:53:39 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 06 Aug 2012 03:38:02 GMT"
+        },
+        {
+          "age": "7679477"
+        },
+        {
+          "x-amz-cf-id": "752wgDaFeaq4IQjicHeqyUiLYIjEjsca-nvc2LB2o4jOXMT99M6E2g=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3209"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 28 Feb 2012 22:53:21 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 21 Oct 2010 19:52:40 GMT"
+        },
+        {
+          "age": "21478295"
+        },
+        {
+          "x-amz-cf-id": "UDgO86Lg7vsbRr_HLz0bT_G-fu7CRAkkBmD_NFdclHEzx1CJpRhtKw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"31-ris0UMaL_SL500_SS100_#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3210"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 27 Oct 2012 23:45:01 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Fri, 20 Jul 2012 15:59:43 GMT"
+        },
+        {
+          "age": "566395"
+        },
+        {
+          "x-amz-cf-id": "rEUppa210byJyTItTaRQ2r-jhwUwD4c2CKORz2AGJaLhjCZ_LQ2w9w=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:56 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "0ESJ91CM6R89TGWH3QJG"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "Mg+wYQrytsBDnHHKyZlGNrkR5GzVMXvkIuJkR86aYslzZP5CJX/EEO5A8c1v2Jk4"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "21282"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 21:09:43 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 21:09:31 GMT"
+        },
+        {
+          "age": "143714"
+        },
+        {
+          "x-amz-cf-id": "jFqxNpOKI6HWPqTs3raLIRgnJcu3GReFRL3MjibUt9APw7R9CfzNqQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"11+dlfeUrBL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "439"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 20 Oct 2012 19:18:25 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:16:17 GMT"
+        },
+        {
+          "age": "1187193"
+        },
+        {
+          "x-amz-cf-id": "5en8vtO00oTNRx5jsyJYxwuPMEVufg38JPIk7uytbZiFN77vUtBibg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"11+dlfeUrBL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:57 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "1AB4PH2A91QH3YJJ2WCZ"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "V5wX099kS85XeVk46pZgvH7cjgKx1WawnTJkqYth5ykinf4em6ZqgNlZk9K/lPby"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html; charset=ISO-8859-1"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "67"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 22 Oct 2012 05:50:27 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:16:14 GMT"
+        },
+        {
+          "age": "1062871"
+        },
+        {
+          "x-amz-cf-id": "eIpkgqRGkyaTW4PSLscvrasxuDsM3f4NIrPYv6VI1sZt_IgixOKN_A=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"11+dlfeUrBL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "861"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 19 Oct 2012 07:26:29 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Sat, 24 Nov 2007 03:04:01 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "1316309"
+        },
+        {
+          "x-amz-cf-id": "5MBwLvJE3E5vg0khYEnuWX6RGzCOtyfFmYYy2nuztIayL9O0paE0oA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 23 Oct 2012 09:12:37 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 04 Jun 2010 01:44:17 GMT"
+        },
+        {
+          "age": "964341"
+        },
+        {
+          "x-amz-cf-id": "W5ENbtcrY4pVK3r7ND94JJHXcEjjBccP7Q77zOSiZQUgWtPBn75lHw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "1598"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 20 Oct 2012 15:51:07 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:16:29 GMT"
+        },
+        {
+          "age": "1199631"
+        },
+        {
+          "x-amz-cf-id": "nFYTABAConMh8T_fXHANG9_r3FjyUfnSBWjxeb2GqJKtgi_mNRIXMw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "1657"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 25 Sep 2012 17:28:50 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:16:30 GMT"
+        },
+        {
+          "age": "3353768"
+        },
+        {
+          "x-amz-cf-id": "ssIfXXDbBp8rP_142eUVOboNUYX4Iood5RH_Qe9W7wP1xbkZp9MChw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3013"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 28 Nov 2011 22:24:05 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Mon, 21 Nov 2011 14:13:29 GMT"
+        },
+        {
+          "age": "29428853"
+        },
+        {
+          "x-amz-cf-id": "vO0R09hZC6TnyhMNTV9jEegb2DgNmH-Z1KaQiyeSbsYm8eoBtHUnDw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "455"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:58 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "2522"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:58 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:58 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "dl_s": "a104"
+        },
+        {
+          "x-host": "a104 D=1922"
+        },
+        {
+          "p3p": "CP=\"ALL DSP COR PSAa PSDa OUR IND COM NAV INT LOC OTC\", policyref=\"http://ch.questionmarket.com/w3c/audit2007/p3p_DynamicLogic.xml\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "558"
+        },
+        {
+          "keep-alive": "timeout=120, max=934"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:58 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "dl_s": "a104"
+        },
+        {
+          "x-host": "a103 D=213"
+        },
+        {
+          "p3p": "CP=\"ALL DSP COR PSAa PSDa OUR IND COM NAV INT LOC OTC\", policyref=\"http://ch.questionmarket.com/w3c/audit2007/p3p_DynamicLogic.xml\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "78"
+        },
+        {
+          "keep-alive": "timeout=120, max=941"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "expires": "Mon, 26 Jul 1997 05:00:00 GMT"
+        },
+        {
+          "cache-control": "post-check=0, pre-check=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "PL=_974702-1-83324420; expires=Sun, 03-Nov-2013 13:04:58 GMT; path=/; domain=.questionmarket.com"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Wed, 17 Oct 2012 17:29:14 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 05:34:15 GMT"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 05:34:15 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "27737"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "27043"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:58 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "dl_s": "a212"
+        },
+        {
+          "x-host": "a212 D=715"
+        },
+        {
+          "p3p": "CP=\"ALL DSP COR PSAa PSDa OUR IND COM NAV INT LOC OTC\", policyref=\"http://ch.questionmarket.com/w3c/audit2007/p3p_DynamicLogic.xml\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "keep-alive": "timeout=120, max=973"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "Mon, 26 Jul 1997 05:00:00 GMT"
+        },
+        {
+          "cache-control": "post-check=0, pre-check=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "ES=974702-1d5qN-0; expires=Wed, 25-Dec-2013 05:04:58 GMT; path=/; domain=.questionmarket.com;"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:58 GMT"
+        },
+        {
+          "x-amzn-requestid": "123b3889-25b7-11e2-8af6-a1b44f97a3ae"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "53"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:58 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "1ZP9F4EGXPG1W1PYCNJK"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "AsL0eWMF3+3wScCyR0bGR31dSLss9n05o3uERrVw6pReE9DgHJ1jKFUl9eThTjRS"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:58 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "168BW4BHQH0ZXM7FXMPB"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "cEL12N93+m4WoEqFtPIfCFUi+syrhK4ihYi/vQREHqBRscgh343Rj/z+yvBSU/1C"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:04:58 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "1PF1RSF1KPZFT8AG8QH3"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "BMEF9l9idgW7J6L5kAVCmgL1L1VX3ONDIY4c/R7+/waDULftLKfFOhjdf5bX9Jgw"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html; charset=ISO-8859-1"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "76"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 25 Sep 2012 13:31:43 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 15:53:50 GMT"
+        },
+        {
+          "age": "3367996"
+        },
+        {
+          "x-amz-cf-id": "ecrxOwZyLIYoOI7n1HZdjAnEynOb8rnSjf9oMBvu9l-mcg-DvsQ5tA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"11+dlfeUrBL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2953"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sun, 14 Oct 2012 20:13:59 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Fri, 18 Mar 2011 23:50:26 GMT"
+        },
+        {
+          "age": "1702260"
+        },
+        {
+          "x-amz-cf-id": "RRnk1cdyHejHw9mprrW3eHhVJDtMgC2-2Z_Ozk1TtfyHQbMGDRM1gQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2908"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 00:29:01 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 21 Nov 2011 14:13:47 GMT"
+        },
+        {
+          "age": "45358"
+        },
+        {
+          "x-amz-cf-id": "dVVqpxaUvghScp5L3V8knNH7yD0rPX4f2QIUqHQG7hWgDw29J2DGyQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"41+6XVdi5mL_SX36_SY36_CR,0,0,36,36_#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2684"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 29 Oct 2012 09:50:03 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 02 Feb 2010 23:26:50 GMT"
+        },
+        {
+          "age": "443696"
+        },
+        {
+          "x-amz-cf-id": "PlD1_xjVuo-YCz7_Za4wyP6LFVnojIw0t9xjXHByHBqF2ZeqI4b_qg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"31-ris0UMaL_SL500_SS100_#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "879"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sun, 08 Jul 2012 02:35:34 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:12:48 GMT"
+        },
+        {
+          "age": "10232965"
+        },
+        {
+          "x-amz-cf-id": "NFgWbhPAIPS6Aa_OA1MZi4RJV38Eh2JztiuONINXzMa0bG62le6jyA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"11+dlfeUrBL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "829"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 29 Nov 2011 15:46:34 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:12:49 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "29366305"
+        },
+        {
+          "x-amz-cf-id": "09OGcA01CtEV2DWxFMbKMdNmD6Wr6zUzXg6LlkVtCG84Y07dTLSY0Q=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "874"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 20 Oct 2012 17:41:46 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:12:48 GMT"
+        },
+        {
+          "age": "1192993"
+        },
+        {
+          "x-amz-cf-id": "rwvtxrU_8yM4vEsn3LxI68PMeCTNAaI2pID_hvPOaXhJAUXpLcUqOQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "839"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 28 Jul 2012 16:53:55 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:12:48 GMT"
+        },
+        {
+          "age": "8453464"
+        },
+        {
+          "x-amz-cf-id": "jK_V3T8gBhnVX6aGpizNe84I03zSajHOTGC01MnF2N-ZKUFTuuznfg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "873"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 02 Oct 2012 10:07:50 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:12:48 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "2775429"
+        },
+        {
+          "x-amz-cf-id": "zP8uDh7oW4qGktFpCJQlKyzDvuaUlw8SfQPZeV2OLAF_FolwTs7PYA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "839"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 04 Oct 2012 03:38:14 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:12:48 GMT"
+        },
+        {
+          "age": "2626005"
+        },
+        {
+          "x-amz-cf-id": "zCUT7P4ddAsA_5EOdXS-ecWSi3Caf1GD9wdw37lzeKfQj2j9AmHUiQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "829"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 18 Feb 2012 00:35:57 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:12:46 GMT"
+        },
+        {
+          "age": "22422542"
+        },
+        {
+          "x-amz-cf-id": "QKTCegDFqVr3XC8HIuieCb-HlLFpsf1vJJyDKhTn9DFbJiLWVXQjLQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"11+dlfeUrBL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "874"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sun, 29 Jul 2012 00:33:38 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:12:47 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "8425881"
+        },
+        {
+          "x-amz-cf-id": "FQmsZuwjmRdgwUM5HxTx27tY2H27QOrbg1DJdNz_RrAOa991o5Lvyw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:05:01 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "1KF6CJF0ZA3T90MCGE8X"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "EhBekXVsIWcz6GtFV9/VWJHMzQoVZUur+CK0EG1dAElJjqTWpGnJuKNs84/dLZ0q"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html; charset=ISO-8859-1"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "394"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 23 Oct 2012 16:46:08 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 01:46:54 GMT"
+        },
+        {
+          "age": "937134"
+        },
+        {
+          "x-amz-cf-id": "L9oihLkhCsGUlU-3jqFLwWX3TyuBQLcp_cHchbBiCmtUA736X8Kphg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"11+dlfeUrBL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "627"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 11 Oct 2012 14:33:21 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:15:44 GMT"
+        },
+        {
+          "age": "1981901"
+        },
+        {
+          "x-amz-cf-id": "7ml4lF66qQTzIXFECW3ocZ5nG9vHHfuYDmXpdeBjLVSaQQolCys92A=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "621"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 10 Oct 2012 11:21:25 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:15:46 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "2079817"
+        },
+        {
+          "x-amz-cf-id": "CoLcmSXF2suFL6QBnOjjLxEUhf72VKlrplyC4RYJlfNREf6-Xi0pXw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2358"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 29 Nov 2011 01:52:38 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Mon, 21 Nov 2011 14:13:29 GMT"
+        },
+        {
+          "age": "29416344"
+        },
+        {
+          "x-amz-cf-id": "dRi8YsVC5rJM48lwap3Mh06QHVr9w6Oq0Pfg31QRRKiDl1QSIT3zdg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "1594"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 20 Oct 2012 10:14:19 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:15:59 GMT"
+        },
+        {
+          "age": "1219843"
+        },
+        {
+          "x-amz-cf-id": "1biuu9U97pslYVYAmMFhrwSwOBYVwXiLgwm1MRKI7_h7l2zmYZZEaQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 26 Sep 2012 22:18:37 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 25 Sep 2012 20:26:21 GMT"
+        },
+        {
+          "age": "3249985"
+        },
+        {
+          "x-amz-cf-id": "fX317kpOFNd5ZTVD5dUMrmSEeYRzqm4WpyDuKNG28yJ4O9eAvvazUw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"41+6XVdi5mL_SX36_SY36_CR,0,0,36,36_#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "1061"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 19 Oct 2012 11:04:19 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:18:05 GMT"
+        },
+        {
+          "age": "1303243"
+        },
+        {
+          "x-amz-cf-id": "mAtXqkAkC4DjophBzYEW5S6QprX5KyDZpPzyK9EozCLiukdFrBze5A=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "850"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 19 Nov 2011 02:02:32 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:12:52 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "30279750"
+        },
+        {
+          "x-amz-cf-id": "V9zouqOby7zTdw8N1UFD-7MjNT6Is1zC6qGyOi0cvSwTqMJZ1Qkygw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2561"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 22 Oct 2012 01:47:15 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 21 Nov 2011 14:13:29 GMT"
+        },
+        {
+          "age": "1077467"
+        },
+        {
+          "x-amz-cf-id": "S275mzRyfiEZwFTcPfyW0eoYH91UX_599Ev_ECgM6b_xOLfjspcbHg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"31-ris0UMaL_SL500_SS100_#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "564"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 29 Nov 2011 11:54:46 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 04 Jun 2010 01:27:32 GMT"
+        },
+        {
+          "age": "29380216"
+        },
+        {
+          "x-amz-cf-id": "R7S8on0vdk1HXxrim-2c2Zh8aNdO6mf4C0WS3tKHegaM2jWsiM5epQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "1698"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 29 Nov 2011 12:21:20 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 01:03:45 GMT"
+        },
+        {
+          "age": "29378622"
+        },
+        {
+          "x-amz-cf-id": "YvMqD5UqqFKzy1f2mFcHqX7aM_4HxOmRkYus-RhWfCdy_pqhPAEz_g=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"11+dlfeUrBL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "558"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 20 Oct 2012 11:34:34 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Fri, 04 Jun 2010 01:27:17 GMT"
+        },
+        {
+          "age": "1215028"
+        },
+        {
+          "x-amz-cf-id": "cVa44QM2u8IAuUF9QEfpfnoTg8a0J18iQn7wd2DQr-jo-fY8BpiHkQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "2268"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 28 Jul 2012 02:30:22 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 01:00:18 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "8505280"
+        },
+        {
+          "x-amz-cf-id": "22Ju-KfgdJeRvZSlX5DsdLObbhPEZeBSd4Gc72ZIaWMiVqmbMkB3Bg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "161"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 25 Sep 2012 20:28:46 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:15:25 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "3342976"
+        },
+        {
+          "x-amz-cf-id": "qmBPDk2JKVaJRpv7A4mhguHOgSAQ224UfofPNOhYc7AXsZ28LFXM-Q=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1567"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 29 Sep 2012 12:18:43 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:14:03 GMT"
+        },
+        {
+          "age": "3026779"
+        },
+        {
+          "x-amz-cf-id": "9apayreRLqLNv5SP9KNS5EuSvY5sPVDHoDgblKHgUdkUCoUDFfPCbw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "2075"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 08 Feb 2012 03:25:50 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:19:09 GMT"
+        },
+        {
+          "age": "23276352"
+        },
+        {
+          "x-amz-cf-id": "x7eg4fYYkTWpaWFE4nN7BtaqRyiZfNva-voci7p3Xzbfipq19svpKQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"11+dlfeUrBL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "1703"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 29 Nov 2011 09:32:04 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:14:39 GMT"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "age": "29388778"
+        },
+        {
+          "x-amz-cf-id": "Sud7TM_0UEovovJxWwSbgeoYTXcAYAv14GhdR63hJZOjeBUYsvtKqQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"01-XuHrwcHL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "2601"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 25 Jul 2012 12:53:34 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:17:36 GMT"
+        },
+        {
+          "age": "8727088"
+        },
+        {
+          "x-amz-cf-id": "mAk0OO6evBoCPjFxnJqirH_8vom2gwHEBysCZcqQfQejl1rp3OGD1Q=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "1581"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 22 Oct 2012 11:57:50 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:13:01 GMT"
+        },
+        {
+          "age": "1040832"
+        },
+        {
+          "x-amz-cf-id": "Dib_HmcmgtWNGzNtGv3F6ZAXixIagykEiamEBmt2obULi0G_yrbohw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "etag": "\"01+KP3cIDVL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "44"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 20 Oct 2012 02:45:35 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 16:13:49 GMT"
+        },
+        {
+          "age": "1246767"
+        },
+        {
+          "x-amz-cf-id": "wjm3efkQaATVWVoZIxXYwJ9h7_UJVQWBeywk_XevnjWO-aG5dXU1uw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Thu, 12 Mar 2009 22:20:15 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=613385389"
+        },
+        {
+          "expires": "Sun, 11 Apr 2032 21:54:51 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:05:02 GMT"
+        },
+        {
+          "content-length": "1167"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "etag": "\"11Z3ZviGhqL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:05:02 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "0N0ET7DXR0Z0S958XDT2"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "rVbwKM7uj9c8KPLYmRAVt4kYRdMGzqE9h6Tyc+UcXD6y0h6n5t1Qps2dG4l0erjn"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html; charset=ISO-8859-1"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1419"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 21 Nov 2011 14:19:01 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Mon, 21 Nov 2011 14:13:29 GMT"
+        },
+        {
+          "age": "30062762"
+        },
+        {
+          "x-amz-cf-id": "V720Rh4VXwLpavgc0gzogCAvcfu8eju-6aTUgkZ0KVqt2Dmee6LRbA=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3603"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 06:00:11 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Tue, 06 Apr 2010 23:10:58 GMT"
+        },
+        {
+          "age": "25492"
+        },
+        {
+          "x-amz-cf-id": "fQb0nipMtXJuYbIZySKBDRsrklJuv7qAkK8XsAxNdlaxuu3_Nb882A=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"41+6XVdi5mL_SX36_SY36_CR,0,0,36,36_#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "610"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 10 Oct 2012 05:09:08 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 01:30:08 GMT"
+        },
+        {
+          "age": "2102155"
+        },
+        {
+          "x-amz-cf-id": "CaXyn6Of0tMpboI2JSReSog7OZegmXSk2HeG_0TZ-GXKneON61wt4Q=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"11+dlfeUrBL#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "6063"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 28 Sep 2010 14:19:43 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Sun, 23 May 2010 07:31:32 GMT"
+        },
+        {
+          "age": "66264320"
+        },
+        {
+          "x-amz-cf-id": "Xi5psl_5u_FA8F_cxp1Bgg5JQqekzjzXubyxkq6OioH5vJa_xpl7bg=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"31-ris0UMaL_SL500_SS100_#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3808"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Mon, 23 Jan 2012 20:55:29 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 28 Sep 2011 08:02:37 GMT"
+        },
+        {
+          "age": "24595774"
+        },
+        {
+          "x-amz-cf-id": "YCExo8QCW6i8b43rK1WKdbqGi4BBr67tDQvHKeByUOjFZWkYcGmSVw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4743"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Thu, 16 Feb 2012 18:43:39 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 21 Nov 2011 14:13:47 GMT"
+        },
+        {
+          "age": "22530084"
+        },
+        {
+          "x-amz-cf-id": "f-ZNWJJlfQWW0yKzQd7uCRUJaMBxf_uM7iH1fbKBNdQQggwy-fMhMQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5433"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 10 Apr 2012 03:22:11 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 15 Feb 2012 16:43:09 GMT"
+        },
+        {
+          "age": "17919772"
+        },
+        {
+          "x-amz-cf-id": "d_if579P0cd1V3nzUXiXXtDTylQLMz1X-zUPk2ry79G_nUYX-N0rAQ=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4449"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Fri, 23 Mar 2012 00:45:43 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "etag": "\"41YZLkI+UsL_SL135_#1\""
+        },
+        {
+          "last-modified": "Fri, 09 Sep 2011 07:00:28 GMT"
+        },
+        {
+          "age": "19484360"
+        },
+        {
+          "x-amz-cf-id": "XHbZSMpsPMFYPGHelyqQvYo133-6UF8nzLJrfmuubfb8md_c3wKN8w=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4065"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Tue, 25 Sep 2012 13:07:27 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Thu, 04 Feb 2010 16:43:55 GMT"
+        },
+        {
+          "age": "3369456"
+        },
+        {
+          "x-amz-cf-id": "cqvYtZEgzgfwS7oAvqOkuzRizhSe9arLcRGaP5nnF2izwecHSwS-Cw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"31-ris0UMaL_SL500_SS100_#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4778"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Wed, 14 Sep 2011 17:50:19 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "cache-control": "max-age=630720000,public"
+        },
+        {
+          "expires": "Wed, 18 May 2033 03:33:20 GMT"
+        },
+        {
+          "last-modified": "Mon, 24 Aug 2009 16:48:22 GMT"
+        },
+        {
+          "age": "35925284"
+        },
+        {
+          "x-amz-cf-id": "wXY9DDbUrHJoSYufMPmtErRRutYkp32cOy1b07_NcZFdUScDaLORpw=="
+        },
+        {
+          "via": "1.0 e0361d2450a4995d92d661bf6b825ede.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        },
+        {
+          "etag": "\"41+6XVdi5mL_SX36_SY36_CR,0,0,36,36_#1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "last-modified": "Wed, 22 Sep 2010 23:59:48 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=613358641"
+        },
+        {
+          "expires": "Sun, 11 Apr 2032 14:29:03 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:05:02 GMT"
+        },
+        {
+          "content-length": "22760"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:05:03 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "0M6TJE3FZYTXRNRY512Y"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "uk/tDjh11RBjIvdv0Gj9JUCG/M9iirulGzM8OhRvjW/qch4hPreEf7n4VnzczAr6"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:05:03 GMT"
+        },
+        {
+          "server": "Server"
+        },
+        {
+          "x-amz-id-1": "0DNVGFVH4CF96QBN4TM9"
+        },
+        {
+          "p3p": "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \""
+        },
+        {
+          "x-amz-id-2": "vE+1ySfLV/mErY5cd7s2NdxUOOOUvbYCVUyYCdjxcxbN3eyQRj3PwWhhDk9+xh+Q"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "set-cookie": "session-id=178-5926262-3769435; path=/; domain=.amazon.com; expires=Tue, 01-Jan-2036 08:00:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_22.json b/jetty-http2/http2-hpack/src/test/resources/data/story_22.json
new file mode 100644
index 0000000..a2d7031
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_22.json
@@ -0,0 +1,14947 @@
+{
+  "context": "response",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:30 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "cache-control": "max-age=86400"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 12:56:30 GMT"
+        },
+        {
+          "last-modified": "Tue, 12 Jan 2010 13:48:00 GMT"
+        },
+        {
+          "etag": "\"51-4b4c7d90\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "81"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "text/html"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:30 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "cache-control": "max-age=86400"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 12:56:30 GMT"
+        },
+        {
+          "last-modified": "Mon, 24 Jan 2011 11:52:00 GMT"
+        },
+        {
+          "etag": "\"13e-4d3d67e0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "318"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "text/plain"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:32 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        },
+        {
+          "content-length": "4034"
+        },
+        {
+          "content-type": "text/html;charset=gbk"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 12:56:32 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "set-cookie": "BAIDUID=B6136AC10EBE0A8FCD216EB64C4C1A5C:FG=1; expires=Sat, 03-Nov-42 12:56:32 GMT; path=/; domain=.baidu.com"
+        },
+        {
+          "p3p": "CP=\" OTI DSP COR IVA OUR IND COM \""
+        },
+        {
+          "connection": "Keep-Alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:32 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Thu, 20 Jan 2011 07:15:35 GMT"
+        },
+        {
+          "etag": "\"65e-49a41e65933c0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "1630"
+        },
+        {
+          "cache-control": "max-age=315360000"
+        },
+        {
+          "expires": "Tue, 01 Nov 2022 12:56:32 GMT"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:32 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Thu, 19 Apr 2012 09:51:20 GMT"
+        },
+        {
+          "etag": "\"5b-4be051d263600\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "91"
+        },
+        {
+          "cache-control": "max-age=315360000"
+        },
+        {
+          "expires": "Tue, 01 Nov 2022 12:56:32 GMT"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:33 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "p3p": "CP=\" OTI DSP COR IVA OUR IND COM \""
+        },
+        {
+          "set-cookie": "BAIDUID=94A36D239683687B3C92793A22BA0C93:FG=1; expires=Sun, 03-Nov-13 12:56:33 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1"
+        },
+        {
+          "last-modified": "Thu, 11 Aug 2011 07:44:31 GMT"
+        },
+        {
+          "etag": "\"57d9-4aa35f79b95c0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=315360000"
+        },
+        {
+          "expires": "Tue, 01 Nov 2022 12:56:33 GMT"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8000"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "application/javascript"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:33 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "p3p": "CP=\" OTI DSP COR IVA OUR IND COM \""
+        },
+        {
+          "set-cookie": "BAIDUID=129ADB92B43CFC527CA7FB93BCB8AB88:FG=1; expires=Sun, 03-Nov-13 12:56:33 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 06:54:50 GMT"
+        },
+        {
+          "etag": "\"5555-4cd7d9cac8280\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=315360000"
+        },
+        {
+          "expires": "Tue, 01 Nov 2022 12:56:33 GMT"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "7499"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "application/javascript"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:33 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "p3p": "CP=\" OTI DSP COR IVA OUR IND COM \""
+        },
+        {
+          "set-cookie": "BAIDUID=CC2AAA2AE3AF303A945CAF8E9945BC2D:FG=1; expires=Sun, 03-Nov-13 12:56:33 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1"
+        },
+        {
+          "last-modified": "Thu, 20 Sep 2012 04:32:55 GMT"
+        },
+        {
+          "etag": "\"26fa-4ca1a9df6cbc0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=315360000"
+        },
+        {
+          "expires": "Tue, 01 Nov 2022 12:56:33 GMT"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3586"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "application/javascript"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:33 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "p3p": "CP=\" OTI DSP COR IVA OUR IND COM \""
+        },
+        {
+          "set-cookie": "BAIDUID=6C1D358E43AAD143080C18E498033F71:FG=1; expires=Sun, 03-Nov-13 12:56:33 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1"
+        },
+        {
+          "last-modified": "Thu, 30 Jun 2011 10:56:51 GMT"
+        },
+        {
+          "etag": "\"25f-4a6ebc21c42c0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "607"
+        },
+        {
+          "cache-control": "max-age=315360000"
+        },
+        {
+          "expires": "Tue, 01 Nov 2022 12:56:33 GMT"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "image/png"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:34 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-length": "147"
+        },
+        {
+          "content-type": "image/x-icon"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 12:56:32 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "set-cookie": "BAIDUID=B6136AC10EBE0A8FCD216EB64C4C1A5C:FG=1; expires=Sat, 03-Nov-42 12:56:32 GMT; path=/; domain=.baidu.com"
+        },
+        {
+          "p3p": "CP=\" OTI DSP COR IVA OUR IND COM \""
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "last-modified": "Mon, 24 Jan 2011 11:52:05 GMT"
+        },
+        {
+          "etag": "\"13e-49a963a8e0340\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "BAIDUID=7B3F07DA7EB7581C6AAAAC2399C0F469:FG=1; max-age=31536000; expires=Sun, 03-Nov-13 12:56:39 GMT; domain=.hao123.com; path=/; version=1"
+        },
+        {
+          "p3p": "CP=\" OTI DSP COR IVA OUR IND COM \""
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 12:56:39 GMT"
+        },
+        {
+          "cache-control": "max-age=0"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:39 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "etag": "\"2880337125\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Tue, 14 Feb 2012 03:23:36 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:40 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "content-length": "795"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:40 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "etag": "\"1970946457\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Tue, 21 Aug 2012 12:19:47 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:40 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "content-length": "49"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:40 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "etag": "\"3508231446\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Wed, 12 Sep 2012 06:59:30 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:40 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "content-length": "4465"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:40 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "JSP2/1.0.2"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:41 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "5928"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "etag": "\"3116325809147476198\""
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 02:09:15 GMT"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 02:07:33 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "JSP2/1.0.2"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:41 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "10550"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "etag": "\"13813589230791420108\""
+        },
+        {
+          "expires": "Fri, 01 Nov 2013 10:53:47 GMT"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 06:05:04 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "etag": "\"991580451\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 05:07:04 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:40 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "11081"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:40 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "etag": "\"2826587238\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Tue, 18 Sep 2012 06:59:28 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:41 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "content-length": "1803"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:41 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "etag": "\"2820264983\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Tue, 18 Sep 2012 02:45:17 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:41 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "content-length": "3703"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:41 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "etag": "\"779014302\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Mon, 06 Aug 2012 10:17:50 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:41 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "content-length": "2053"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:41 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "etag": "\"439052966\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 05:07:03 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:40 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "38609"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:40 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "etag": "\"1503293558\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 05:07:03 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:41 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "13174"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:41 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "etag": "\"790245820\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 05:07:03 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:40 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "33536"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:40 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "etag": "\"1136345403\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Wed, 17 Oct 2012 17:08:02 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:43 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "content-length": "3731"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:43 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "etag": "\"1881822353\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Tue, 16 Oct 2012 15:28:36 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:43 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1007"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:43 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "etag": "\"55301462\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Fri, 19 Oct 2012 15:59:17 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:43 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2179"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:43 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "BAIDUID=7B3F07DA7EB7581C6AAAAC2399C0F469:FG=1; max-age=31536000; expires=Sun, 03-Nov-13 12:56:39 GMT; domain=.hao123.com; path=/; version=1"
+        },
+        {
+          "p3p": "CP=\" OTI DSP COR IVA OUR IND COM \""
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:43 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:43 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "etag": "\"2082195828\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Tue, 18 Jan 2011 06:39:02 GMT"
+        },
+        {
+          "content-length": "43"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "etag": "\"2082195828\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Tue, 18 Jan 2011 06:39:02 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:43 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:43 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "etag": "\"1129043035\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Fri, 19 Oct 2012 15:58:50 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:43 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1962"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:43 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "JSP2/1.0.2"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:43 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "1076"
+        },
+        {
+          "etag": "\"2330871933\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Fri, 13 Jul 2012 03:17:42 GMT"
+        },
+        {
+          "expires": "Sat, 12 Jan 2013 11:31:05 GMT"
+        },
+        {
+          "cache-control": "max-age=15552000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "etag": "\"2084456863\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Tue, 18 Jan 2011 03:02:19 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:43 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:43 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:44 GMT"
+        },
+        {
+          "server": "ECOM Apache 1.0.13.0"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "text/html"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "max-age=0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "etag": "\"1905870111\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Wed, 18 Nov 2009 09:44:09 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 12:56:44 GMT"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:44 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.15"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:18 GMT"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "pragma": "No-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "set-cookie": "JSESSIONID=24206446514B3C020AC50919B9330503; Path=/"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "x-powered-by": "PHP/5.2.3"
+        },
+        {
+          "cache-control": "max-age=259200"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 12:56:46 GMT"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "set-cookie": "loc=1%7C%B1%B1%BE%A9%7C%B1%B1%BE%A9; expires=Tue, 06-Nov-2012 12:56:46 GMT; path=/; domain=.hao123.com"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "684"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:46 GMT"
+        },
+        {
+          "server": "lighttpd"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "media": "media"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Fri, 26 Oct 2012 12:24:13 GMT"
+        },
+        {
+          "last-modified": "Sat, 25 Apr 2009 07:04:00 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:46 GMT"
+        },
+        {
+          "server": "apache"
+        },
+        {
+          "content-length": "8992"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:47 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 10:00:20 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:26:47 GMT"
+        },
+        {
+          "cache-control": "max-age=1800"
+        },
+        {
+          "set-cookie": "id58=05eNElCVFI9c8Hfk16UMAg==; expires=Tue, 01-Nov-22 12:56:47 GMT; domain=58.com; path=/"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"CUR ADM OUR NOR STA NID\""
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "etag": "\"1840151033\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Tue, 14 Feb 2012 03:23:36 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:47 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "4959"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:47 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "etag": "\"1236171233\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Tue, 14 Feb 2012 03:23:36 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:47 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "4571"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:47 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "BAIDUID=7B3F07DA7EB7581C6AAAAC2399C0F469:FG=1; max-age=31536000; expires=Sun, 03-Nov-13 12:56:39 GMT; domain=.hao123.com; path=/; version=1"
+        },
+        {
+          "p3p": "CP=\" OTI DSP COR IVA OUR IND COM \""
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 12:56:47 GMT"
+        },
+        {
+          "cache-control": "max-age=31104000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:47 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        },
+        {
+          "content-type": "image/x-icon"
+        },
+        {
+          "etag": "\"567172269\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Thu, 01 Mar 2012 02:31:58 GMT"
+        },
+        {
+          "content-length": "1150"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:54:27 GMT"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "last-modified": "Thu, 16 Aug 2012 08:37:54 GMT"
+        },
+        {
+          "cache-control": "max-age=300"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "age": "1"
+        },
+        {
+          "x-via": "1.1 bjgm232:8102 (Cdn Cache Server V2.0), 1.1 stsz70:8105 (Cdn Cache Server V2.0), 1.1 gdyf13:9080 (Cdn Cache Server V2.0)"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Mon, 22 Oct 2012 04:02:33 GMT"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "22332"
+        },
+        {
+          "last-modified": "Mon, 25 Apr 2011 10:41:57 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "1"
+        },
+        {
+          "x-via": "1.1 gm240:8104 (Cdn Cache Server V2.0), 1.1 stcz163:8106 (Cdn Cache Server V2.0), 1.1 gdyf13:8184 (Cdn Cache Server V2.0)"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Fri, 26 Oct 2012 12:49:31 GMT"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "9309"
+        },
+        {
+          "last-modified": "Mon, 25 Apr 2011 08:07:52 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "1"
+        },
+        {
+          "x-via": "1.1 gm243:8106 (Cdn Cache Server V2.0), 1.1 stsz75:8104 (Cdn Cache Server V2.0), 1.1 gdyf16:9080 (Cdn Cache Server V2.0)"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.2.0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:49 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 16 Aug 2012 08:37:54 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Fri, 26 Oct 2012 12:49:31 GMT"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "23163"
+        },
+        {
+          "last-modified": "Mon, 25 Apr 2011 10:46:11 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "1"
+        },
+        {
+          "x-via": "1.1 gm240:8101 (Cdn Cache Server V2.0), 1.1 stsz74:8080 (Cdn Cache Server V2.0), 1.1 gdyf17:8184 (Cdn Cache Server V2.0)"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Fri, 26 Oct 2012 12:49:21 GMT"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "281"
+        },
+        {
+          "last-modified": "Mon, 25 Apr 2011 08:07:52 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "1"
+        },
+        {
+          "x-via": "1.1 gm239:8102 (Cdn Cache Server V2.0), 1.1 stsz70:88 (Cdn Cache Server V2.0), 1.1 gdyf20:8184 (Cdn Cache Server V2.0)"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 04:29:06 GMT"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "183"
+        },
+        {
+          "last-modified": "Wed, 11 Jan 2012 07:50:38 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "1"
+        },
+        {
+          "x-via": "1.1 tjtg100:80 (Cdn Cache Server V2.0), 1.1 gm240:8106 (Cdn Cache Server V2.0), 1.1 stsz75:8107 (Cdn Cache Server V2.0), 1.1 gdyf18:8360 (Cdn Cache Server V2.0)"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:50 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Sun, 24 Apr 2011 02:10:42 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:26:50 GMT"
+        },
+        {
+          "cache-control": "max-age=1800"
+        },
+        {
+          "set-cookie": "id58=05eNElCVFI9c8Hfk16UMAg==; expires=Tue, 01-Nov-22 12:56:47 GMT; domain=58.com; path=/"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"CUR ADM OUR NOR STA NID\""
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.2.3"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:50 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "last-modified": "Tue, 16 Oct 2012 03:32:08 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Thu, 18 Oct 2012 03:17:25 GMT"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "11545"
+        },
+        {
+          "last-modified": "Mon, 25 Apr 2011 09:08:36 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "1"
+        },
+        {
+          "x-via": "1.1 gm240:8107 (Cdn Cache Server V2.0), 1.1 stcz158:8104 (Cdn Cache Server V2.0), 1.1 gdyf16:8184 (Cdn Cache Server V2.0)"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:51 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "set-cookie": "TIEBAUID=cb23caae14130a0d384a57f1; expires=Thu, 31-Dec-2020 15:59:59 GMT; path=/; domain=tieba.baidu.com"
+        },
+        {
+          "location": "http://tieba.baidu.com/index.html"
+        },
+        {
+          "tracecode": "34115693691177833738110320"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.15"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:24 GMT"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "pragma": "No-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "set-cookie": "JSESSIONID=24206446514B3C020AC50919B9330503; Path=/"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "W/\"4286-1337327987000\""
+        },
+        {
+          "last-modified": "Fri, 18 May 2012 07:59:47 GMT"
+        },
+        {
+          "content-length": "4286"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "JSP2/1.0.2"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:52 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "5352"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "etag": "\"3854054371452794933\""
+        },
+        {
+          "expires": "Fri, 01 Nov 2013 07:42:36 GMT"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 07:18:44 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:52 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "20557"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 01:59:00 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:52 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "etag": "\"1496242645\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Sun, 15 Aug 2010 16:00:00 GMT"
+        },
+        {
+          "expires": "Mon, 12 Sep 2022 12:56:52 GMT"
+        },
+        {
+          "cache-control": "max-age=311040000"
+        },
+        {
+          "content-length": "1574"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:52 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:52 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "13644"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 03:33:51 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:52 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:52 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "8122"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 06:49:50 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:52 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:51 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 11:28:20 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:52 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "19956"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 06:36:26 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:52 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 07:23:32 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "4240"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:53 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "etag": "\"464442779\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Sun, 15 Aug 2010 16:00:00 GMT"
+        },
+        {
+          "expires": "Mon, 12 Sep 2022 12:56:53 GMT"
+        },
+        {
+          "cache-control": "max-age=311040000"
+        },
+        {
+          "content-length": "231"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "etag": "\"531551641\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Sun, 15 Aug 2010 16:00:00 GMT"
+        },
+        {
+          "expires": "Mon, 12 Sep 2022 12:56:53 GMT"
+        },
+        {
+          "cache-control": "max-age=311040000"
+        },
+        {
+          "content-length": "339"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "server": "ECOM Apache 1.0.13.0"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "text/html"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "7748"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 03:02:59 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:53 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:52 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "set-cookie": "TIEBAUID=cb23caae14130a0d384a57f1; expires=Thu, 31-Dec-2020 15:59:59 GMT; path=/; domain=tieba.baidu.com"
+        },
+        {
+          "location": "http://tieba.baidu.com/index.html"
+        },
+        {
+          "tracecode": "34115693691177833738110320"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-length": "29476"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 03:31:40 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:52 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 05:21:05 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "7301"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:53 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "7993"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 07:14:19 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:53 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "last-modified": "Thu, 14 Oct 2010 10:10:45 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Fri, 29 Oct 2010 06:30:56 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:53 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Wed, 14 Sep 2011 06:13:02 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:53 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:52 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "35637"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 04:22:40 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:52 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "set-cookie": "TIEBAUID=cb23caae14130a0d384a57f1; expires=Thu, 31-Dec-2020 15:59:59 GMT; path=/; domain=tieba.baidu.com"
+        },
+        {
+          "location": "http://tieba.baidu.com/index.html"
+        },
+        {
+          "tracecode": "34115693691177833738110320"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-length": "4997"
+        },
+        {
+          "last-modified": "Thu, 21 Jun 2012 03:57:37 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:53 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 29 Jun 2012 10:13:16 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2267"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:53 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "1480"
+        },
+        {
+          "last-modified": "Mon, 21 May 2012 07:58:06 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:53 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "8922"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 03:21:07 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:53 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "etag": "\"4172175030\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Tue, 23 Oct 2012 10:48:27 GMT"
+        },
+        {
+          "content-length": "9393"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "server": "apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "9294"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 08:16:26 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:53 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:52 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "40299"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 04:07:00 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:52 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:54 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:36:44 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8579"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:54 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "18605"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:36:43 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:54 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:54 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "set-cookie": "TIEBAUID=cb23caae14130a0d384a57f1; expires=Thu, 31-Dec-2020 15:59:59 GMT; path=/; domain=tieba.baidu.com"
+        },
+        {
+          "location": "http://tieba.baidu.com/index.html"
+        },
+        {
+          "tracecode": "34115693691177833738110320"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-length": "20099"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:36:43 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:54 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:54 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "18865"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:36:44 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:54 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:54 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "20123"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:36:44 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:54 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:31:14 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:54 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "location": "http://msg.baidu.com/msg/msg_dataGetmsgCount?from=msg"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "206"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "text/html; charset=iso-8859-1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:54 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "17869"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:36:43 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:54 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:54 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "18072"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:36:44 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:54 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "21328"
+        },
+        {
+          "last-modified": "Wed, 19 Jan 2011 09:16:11 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:53 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:54 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "1481"
+        },
+        {
+          "last-modified": "Tue, 24 Jul 2012 03:59:23 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:54 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:54 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "220"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "text/html"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "etag": "\"3965408141\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Tue, 16 Oct 2012 06:54:58 GMT"
+        },
+        {
+          "expires": "Mon, 12 Sep 2022 12:56:52 GMT"
+        },
+        {
+          "cache-control": "max-age=311040000"
+        },
+        {
+          "content-length": "39993"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:52 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:54 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "11279"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:36:43 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:54 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:54 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:36:44 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "22384"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:54 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:54 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "set-cookie": "TIEBAUID=cb23caae14130a0d384a57f1; expires=Thu, 31-Dec-2020 15:59:59 GMT; path=/; domain=tieba.baidu.com"
+        },
+        {
+          "location": "http://tieba.baidu.com/index.html"
+        },
+        {
+          "tracecode": "34115693691177833738110320"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-length": "20962"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:36:43 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:54 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "61444"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 07:13:16 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:53 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:54 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "17732"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 09:16:23 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:54 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Fri, 26 Oct 2012 12:58:13 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:53 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:31:14 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:53 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:57 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 11 Oct 2011 07:38:09 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "999"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:57 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:57 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "3949"
+        },
+        {
+          "last-modified": "Mon, 27 Aug 2012 06:36:50 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:57 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:57 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "1158"
+        },
+        {
+          "last-modified": "Mon, 03 Sep 2012 03:47:57 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:57 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:57 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "1008"
+        },
+        {
+          "last-modified": "Mon, 27 Aug 2012 08:26:17 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:57 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:57 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Wed, 14 Sep 2011 06:13:06 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:57 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3059"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:57 GMT"
+        },
+        {
+          "content-type": "text/html; charset=GBK"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "set-cookie": "TIEBA_USERTYPE=7a2a671a262b15b7e6f4819b; expires=Thu, 31-Dec-2020 15:59:59 GMT; path=/; domain=tieba.baidu.com"
+        },
+        {
+          "location": "http://tieba.baidu.com/index.html"
+        },
+        {
+          "tracecode": "34173872330388372234110320"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-length": "20962"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:36:43 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:54 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:57 GMT"
+        },
+        {
+          "content-type": "text/html; charset=GBK"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "1158"
+        },
+        {
+          "last-modified": "Mon, 03 Sep 2012 03:47:57 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:57 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "tracecode": "34176809970478157322110320"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:57 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "607"
+        },
+        {
+          "last-modified": "Tue, 24 Jul 2012 03:59:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:57 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:57 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "2921"
+        },
+        {
+          "last-modified": "Tue, 17 May 2011 06:39:02 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:57 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:57 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "2832"
+        },
+        {
+          "last-modified": "Tue, 17 May 2011 06:39:02 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:57 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:57 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "3059"
+        },
+        {
+          "last-modified": "Tue, 17 May 2011 06:39:02 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:57 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:57 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "2801"
+        },
+        {
+          "last-modified": "Tue, 17 May 2011 06:39:02 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:57 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:57 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "2923"
+        },
+        {
+          "last-modified": "Wed, 14 Sep 2011 06:13:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:57 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:57 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "20220"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 07:56:05 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:57 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:58 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "2830"
+        },
+        {
+          "last-modified": "Tue, 17 May 2011 06:39:02 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:58 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:58 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "2877"
+        },
+        {
+          "last-modified": "Tue, 17 May 2011 06:39:02 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:58 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:58 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "2967"
+        },
+        {
+          "last-modified": "Wed, 14 Sep 2011 06:13:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:58 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:58 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "177"
+        },
+        {
+          "last-modified": "Wed, 14 Sep 2011 06:13:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:58 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:58 GMT"
+        },
+        {
+          "content-type": "text/html; charset=GBK"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "1158"
+        },
+        {
+          "last-modified": "Mon, 03 Sep 2012 03:47:57 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:57 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "tracecode": "34180192590438703882110320"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:58 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "7067"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:31:14 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:58 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:58 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Wed, 14 Sep 2011 06:12:51 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:58 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "288"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:58 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "8236"
+        },
+        {
+          "last-modified": "Wed, 14 Sep 2011 06:13:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:58 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:59 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "2842"
+        },
+        {
+          "last-modified": "Tue, 17 May 2011 06:39:02 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:59 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "etag": "\"4291424757\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Thu, 21 Jun 2012 08:04:46 GMT"
+        },
+        {
+          "expires": "Mon, 12 Sep 2022 12:56:59 GMT"
+        },
+        {
+          "cache-control": "max-age=311040000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3558"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:59 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "etag": "\"4232694198\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Thu, 21 Jun 2012 08:04:45 GMT"
+        },
+        {
+          "expires": "Mon, 12 Sep 2022 12:56:59 GMT"
+        },
+        {
+          "cache-control": "max-age=311040000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "10901"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:59 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:59 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=44849399"
+        },
+        {
+          "expires": "Sun, 06 Apr 2014 15:06:58 GMT"
+        },
+        {
+          "last-modified": "Thu, 31 Dec 2009 08:37:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:59 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=40280084"
+        },
+        {
+          "expires": "Wed, 12 Feb 2014 17:51:43 GMT"
+        },
+        {
+          "last-modified": "Fri, 16 Apr 2010 03:07:31 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:59 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=12713623"
+        },
+        {
+          "expires": "Sat, 30 Mar 2013 16:30:42 GMT"
+        },
+        {
+          "last-modified": "Sat, 14 Jan 2012 05:49:33 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:59 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=33539862"
+        },
+        {
+          "expires": "Tue, 26 Nov 2013 17:34:41 GMT"
+        },
+        {
+          "last-modified": "Sun, 19 Sep 2010 03:41:35 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:59 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4405195"
+        },
+        {
+          "expires": "Mon, 24 Dec 2012 12:36:54 GMT"
+        },
+        {
+          "last-modified": "Tue, 24 Jul 2012 13:37:09 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "media": "media"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Fri, 26 Oct 2012 12:24:13 GMT"
+        },
+        {
+          "last-modified": "Sat, 25 Apr 2009 07:04:00 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:58 GMT"
+        },
+        {
+          "server": "apache"
+        },
+        {
+          "content-length": "27159"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "etag": "\"2269828500\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Tue, 24 Aug 2010 14:26:41 GMT"
+        },
+        {
+          "expires": "Mon, 12 Sep 2022 12:56:59 GMT"
+        },
+        {
+          "cache-control": "max-age=311040000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "571"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:59 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:59 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=25111771"
+        },
+        {
+          "expires": "Wed, 21 Aug 2013 04:26:30 GMT"
+        },
+        {
+          "last-modified": "Sat, 02 Apr 2011 05:57:56 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:59 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=9297121"
+        },
+        {
+          "expires": "Tue, 19 Feb 2013 03:29:00 GMT"
+        },
+        {
+          "last-modified": "Mon, 02 Apr 2012 07:52:56 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:59 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=41820075"
+        },
+        {
+          "expires": "Sun, 02 Mar 2014 13:38:14 GMT"
+        },
+        {
+          "last-modified": "Thu, 11 Mar 2010 11:34:29 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:59 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=10209204"
+        },
+        {
+          "expires": "Fri, 01 Mar 2013 16:50:23 GMT"
+        },
+        {
+          "last-modified": "Mon, 12 Mar 2012 05:10:10 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "etag": "eab7a0d6b87c3b4ed2c270c0380dbf29"
+        },
+        {
+          "cache-control": "max-age=0, must-revalidate"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "set-cookie": "HMACCOUNT=0F8500D919421ADB; Path=/; Domain=hm.baidu.com; Expires=Sun, 18 Jan 2038 00:00:00 GMT"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-length": "5779"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:59 GMT"
+        },
+        {
+          "server": "apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:59 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=8515483"
+        },
+        {
+          "expires": "Sun, 10 Feb 2013 02:21:42 GMT"
+        },
+        {
+          "last-modified": "Fri, 20 Apr 2012 10:07:32 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, max-age=0, no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:00 GMT"
+        },
+        {
+          "server": "apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:00 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "1158"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:54:28 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:00 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "tracecode": "34180192590438703882110320"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:00 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "1158"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:54:28 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:00 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "tracecode": "34180192590438703882110320"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:00 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "3949"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 12:11:36 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:00 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "BAIDUID=53B0A4069A29BECD16EF519984CCA005:FG=1; max-age=946080000; expires=Mon, 27-Oct-42 12:57:02 GMT; domain=.baidu.com; path=/; version=1"
+        },
+        {
+          "p3p": "CP=\" OTI DSP COR IVA OUR IND COM \""
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "etag": "\"1698673572\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 08:49:58 GMT"
+        },
+        {
+          "expires": "Fri, 01 Feb 2013 12:57:02 GMT"
+        },
+        {
+          "cache-control": "max-age=7776000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "502"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:02 GMT"
+        },
+        {
+          "server": "apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "BAIDUID=53B0A4069A29BECDD09DC829CEEA31EE:FG=1; max-age=946080000; expires=Mon, 27-Oct-42 12:57:02 GMT; domain=.baidu.com; path=/; version=1"
+        },
+        {
+          "p3p": "CP=\" OTI DSP COR IVA OUR IND COM \""
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "etag": "\"2769205800\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 08:49:58 GMT"
+        },
+        {
+          "expires": "Fri, 01 Feb 2013 12:57:02 GMT"
+        },
+        {
+          "cache-control": "max-age=7776000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3712"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:02 GMT"
+        },
+        {
+          "server": "apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "etag": "\"1610142698\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Thu, 21 Jun 2012 08:04:47 GMT"
+        },
+        {
+          "expires": "Mon, 12 Sep 2022 12:56:59 GMT"
+        },
+        {
+          "cache-control": "max-age=311040000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "158920"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:56:59 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:04 GMT"
+        },
+        {
+          "content-type": "image/x-icon"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "2550"
+        },
+        {
+          "last-modified": "Tue, 30 Mar 2010 09:25:50 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:04 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "tracecode": "34180192590438703882110320"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:07 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Wed, 14 Sep 2011 06:11:42 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:56:58 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "max-age=0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "etag": "\"1905870111\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Wed, 18 Nov 2009 09:44:09 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 12:57:07 GMT"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:07 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, max-age=0, no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:07 GMT"
+        },
+        {
+          "server": "apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 09:21:56 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:08 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:08 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "787"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "522"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:08 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "image/x-icon"
+        },
+        {
+          "content-length": "2550"
+        },
+        {
+          "last-modified": "Tue, 24 Jul 2012 03:59:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:08 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=14920916"
+        },
+        {
+          "expires": "Thu, 25 Apr 2013 05:39:04 GMT"
+        },
+        {
+          "last-modified": "Thu, 24 Nov 2011 03:33:15 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=20272763"
+        },
+        {
+          "expires": "Wed, 26 Jun 2013 04:16:31 GMT"
+        },
+        {
+          "last-modified": "Sat, 23 Jul 2011 06:18:22 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=3386843"
+        },
+        {
+          "expires": "Wed, 12 Dec 2012 17:44:31 GMT"
+        },
+        {
+          "last-modified": "Fri, 17 Aug 2012 03:22:22 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=319801"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 05:47:09 GMT"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 03:17:06 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "etag": "\"2813066485\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Thu, 12 Aug 2010 08:49:52 GMT"
+        },
+        {
+          "expires": "Mon, 12 Sep 2022 12:57:08 GMT"
+        },
+        {
+          "cache-control": "max-age=311040000"
+        },
+        {
+          "content-length": "1490"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:31:14 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:08 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:09:10 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:08 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:31:14 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:08 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:08 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "4715"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:08 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5848"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "last-modified": "Thu, 29 Mar 2012 08:20:20 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:08 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1173183"
+        },
+        {
+          "expires": "Sat, 17 Nov 2012 02:50:11 GMT"
+        },
+        {
+          "last-modified": "Sun, 07 Oct 2012 09:11:02 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=131604"
+        },
+        {
+          "expires": "Mon, 05 Nov 2012 01:30:32 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 11:50:19 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=305486"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 01:48:34 GMT"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 11:14:16 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=10106809"
+        },
+        {
+          "expires": "Thu, 28 Feb 2013 12:23:57 GMT"
+        },
+        {
+          "last-modified": "Wed, 14 Mar 2012 14:03:29 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=11660411"
+        },
+        {
+          "expires": "Mon, 18 Mar 2013 11:57:19 GMT"
+        },
+        {
+          "last-modified": "Tue, 07 Feb 2012 14:56:45 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1356978"
+        },
+        {
+          "expires": "Mon, 19 Nov 2012 05:53:26 GMT"
+        },
+        {
+          "last-modified": "Wed, 03 Oct 2012 03:04:31 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=10204165"
+        },
+        {
+          "expires": "Fri, 01 Mar 2013 15:26:33 GMT"
+        },
+        {
+          "last-modified": "Mon, 12 Mar 2012 07:58:17 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=9726906"
+        },
+        {
+          "expires": "Sun, 24 Feb 2013 02:52:14 GMT"
+        },
+        {
+          "last-modified": "Fri, 23 Mar 2012 09:06:55 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=2265452"
+        },
+        {
+          "expires": "Thu, 29 Nov 2012 18:14:40 GMT"
+        },
+        {
+          "last-modified": "Wed, 12 Sep 2012 02:22:04 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "8761"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:09:10 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:08 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:08 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5828"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "6430"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:08 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:08 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "6892"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "4639"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 10:10:35 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:08 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:08 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "853"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=6834284"
+        },
+        {
+          "expires": "Mon, 21 Jan 2013 15:21:52 GMT"
+        },
+        {
+          "last-modified": "Tue, 29 May 2012 08:07:39 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=8117075"
+        },
+        {
+          "expires": "Tue, 05 Feb 2013 11:41:43 GMT"
+        },
+        {
+          "last-modified": "Sun, 29 Apr 2012 15:27:57 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=6108255"
+        },
+        {
+          "expires": "Sun, 13 Jan 2013 05:41:23 GMT"
+        },
+        {
+          "last-modified": "Fri, 15 Jun 2012 03:28:38 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=2157496"
+        },
+        {
+          "expires": "Wed, 28 Nov 2012 12:15:24 GMT"
+        },
+        {
+          "last-modified": "Fri, 14 Sep 2012 14:20:35 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=7406109"
+        },
+        {
+          "expires": "Mon, 28 Jan 2013 06:12:17 GMT"
+        },
+        {
+          "last-modified": "Wed, 16 May 2012 02:26:49 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=5979956"
+        },
+        {
+          "expires": "Fri, 11 Jan 2013 18:03:04 GMT"
+        },
+        {
+          "last-modified": "Mon, 18 Jun 2012 02:45:15 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=12913110"
+        },
+        {
+          "expires": "Mon, 01 Apr 2013 23:55:38 GMT"
+        },
+        {
+          "last-modified": "Mon, 09 Jan 2012 15:00:07 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 13:37:52 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "4639"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:08 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3673"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "834"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:31:14 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 10:10:35 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5828"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "586"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "581"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=5746593"
+        },
+        {
+          "expires": "Wed, 09 Jan 2013 01:13:42 GMT"
+        },
+        {
+          "last-modified": "Sat, 23 Jun 2012 12:24:03 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4420208"
+        },
+        {
+          "expires": "Mon, 24 Dec 2012 16:47:17 GMT"
+        },
+        {
+          "last-modified": "Tue, 24 Jul 2012 05:16:52 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "text/html; charset=GBK"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "2550"
+        },
+        {
+          "last-modified": "Tue, 30 Mar 2010 09:25:50 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:04 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "tracecode": "34277428450405149450110320"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "set-cookie": "wise_device=0; expires=Sun, 03-Nov-2013 12:57:07 GMT; path=/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=750933"
+        },
+        {
+          "expires": "Mon, 12 Nov 2012 05:32:42 GMT"
+        },
+        {
+          "last-modified": "Wed, 17 Oct 2012 03:46:02 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=31704989"
+        },
+        {
+          "expires": "Tue, 05 Nov 2013 11:53:37 GMT"
+        },
+        {
+          "last-modified": "Sun, 31 Oct 2010 15:04:09 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=2436757"
+        },
+        {
+          "expires": "Sat, 01 Dec 2012 17:49:46 GMT"
+        },
+        {
+          "last-modified": "Sat, 08 Sep 2012 03:11:54 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=108530"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 19:05:59 GMT"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 00:39:29 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=519223"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 13:10:52 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 12:29:43 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=3860382"
+        },
+        {
+          "expires": "Tue, 18 Dec 2012 05:16:51 GMT"
+        },
+        {
+          "last-modified": "Mon, 06 Aug 2012 04:17:45 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 09:21:56 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "2820"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "618"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "572"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=9498052"
+        },
+        {
+          "expires": "Thu, 21 Feb 2013 11:18:01 GMT"
+        },
+        {
+          "last-modified": "Wed, 28 Mar 2012 16:15:24 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4541952"
+        },
+        {
+          "expires": "Wed, 26 Dec 2012 02:36:21 GMT"
+        },
+        {
+          "last-modified": "Sat, 21 Jul 2012 09:38:45 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4854455"
+        },
+        {
+          "expires": "Sat, 29 Dec 2012 17:24:44 GMT"
+        },
+        {
+          "last-modified": "Sat, 14 Jul 2012 04:01:58 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=217395"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 01:20:24 GMT"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 12:10:39 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=606214"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 13:20:43 GMT"
+        },
+        {
+          "last-modified": "Sat, 20 Oct 2012 12:10:00 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=10024120"
+        },
+        {
+          "expires": "Wed, 27 Feb 2013 13:25:49 GMT"
+        },
+        {
+          "last-modified": "Fri, 16 Mar 2012 11:59:49 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4573190"
+        },
+        {
+          "expires": "Wed, 26 Dec 2012 11:16:59 GMT"
+        },
+        {
+          "last-modified": "Fri, 20 Jul 2012 16:17:28 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=8773628"
+        },
+        {
+          "expires": "Wed, 13 Feb 2013 02:04:17 GMT"
+        },
+        {
+          "last-modified": "Sat, 14 Apr 2012 10:42:52 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "10566"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:31:14 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:09:10 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "840"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "10010"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "5929"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "1970"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:31:14 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "2878"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 13:37:52 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "2367"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 13:37:52 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "138"
+        },
+        {
+          "last-modified": "Tue, 24 Jul 2012 03:59:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "248"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:09:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "340"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:09:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "522"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:09:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "1284"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:09:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "142"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:09:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=2867849"
+        },
+        {
+          "expires": "Thu, 06 Dec 2012 17:34:38 GMT"
+        },
+        {
+          "last-modified": "Wed, 29 Aug 2012 03:42:11 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=742724"
+        },
+        {
+          "expires": "Mon, 12 Nov 2012 03:15:53 GMT"
+        },
+        {
+          "last-modified": "Wed, 17 Oct 2012 08:19:41 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1777991"
+        },
+        {
+          "expires": "Sat, 24 Nov 2012 02:50:20 GMT"
+        },
+        {
+          "last-modified": "Sun, 23 Sep 2012 09:10:47 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=962398"
+        },
+        {
+          "expires": "Wed, 14 Nov 2012 16:17:07 GMT"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 06:17:12 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=14125794"
+        },
+        {
+          "expires": "Tue, 16 Apr 2013 00:47:03 GMT"
+        },
+        {
+          "last-modified": "Mon, 12 Dec 2011 13:17:20 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:31:14 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "954"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=431506"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 12:48:55 GMT"
+        },
+        {
+          "last-modified": "Wed, 24 Oct 2012 13:13:37 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=11487816"
+        },
+        {
+          "expires": "Sat, 16 Mar 2013 12:00:45 GMT"
+        },
+        {
+          "last-modified": "Sat, 11 Feb 2012 14:49:57 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=2738958"
+        },
+        {
+          "expires": "Wed, 05 Dec 2012 05:46:27 GMT"
+        },
+        {
+          "last-modified": "Sat, 01 Sep 2012 03:18:32 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=5566505"
+        },
+        {
+          "expires": "Sun, 06 Jan 2013 23:12:14 GMT"
+        },
+        {
+          "last-modified": "Wed, 27 Jun 2012 16:26:59 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "3063"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 10:10:36 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "539"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:09:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "17226"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "833"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "820"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:10 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Wed, 14 Sep 2011 06:12:46 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "4911"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "1394"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:09:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:10 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "5772"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:31:14 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "10954"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "994"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:09:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:10 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=54046405"
+        },
+        {
+          "expires": "Tue, 22 Jul 2014 01:50:34 GMT"
+        },
+        {
+          "last-modified": "Mon, 01 Jun 2009 11:10:18 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=707871"
+        },
+        {
+          "expires": "Sun, 11 Nov 2012 17:35:01 GMT"
+        },
+        {
+          "last-modified": "Thu, 18 Oct 2012 03:41:27 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=362012"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 17:30:42 GMT"
+        },
+        {
+          "last-modified": "Fri, 26 Oct 2012 03:50:06 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=18793623"
+        },
+        {
+          "expires": "Sun, 09 Jun 2013 01:24:13 GMT"
+        },
+        {
+          "last-modified": "Fri, 26 Aug 2011 12:03:04 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=430516"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 12:32:26 GMT"
+        },
+        {
+          "last-modified": "Wed, 24 Oct 2012 13:46:37 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=32880607"
+        },
+        {
+          "expires": "Tue, 19 Nov 2013 02:27:17 GMT"
+        },
+        {
+          "last-modified": "Mon, 04 Oct 2010 09:56:55 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=3367264"
+        },
+        {
+          "expires": "Wed, 12 Dec 2012 12:18:14 GMT"
+        },
+        {
+          "last-modified": "Fri, 17 Aug 2012 14:15:02 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=3543896"
+        },
+        {
+          "expires": "Fri, 14 Dec 2012 13:22:06 GMT"
+        },
+        {
+          "last-modified": "Mon, 13 Aug 2012 12:07:18 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "2725"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:10 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:54:28 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "4823"
+        },
+        {
+          "last-modified": "Wed, 14 Sep 2011 06:12:46 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:10 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "598"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "4344"
+        },
+        {
+          "last-modified": "Fri, 09 Sep 2011 07:29:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:10 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=920631"
+        },
+        {
+          "expires": "Wed, 14 Nov 2012 04:41:01 GMT"
+        },
+        {
+          "last-modified": "Sat, 13 Oct 2012 05:29:27 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=10801080"
+        },
+        {
+          "expires": "Fri, 08 Mar 2013 13:15:10 GMT"
+        },
+        {
+          "last-modified": "Mon, 27 Feb 2012 12:21:10 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=19349568"
+        },
+        {
+          "expires": "Sat, 15 Jun 2013 11:49:58 GMT"
+        },
+        {
+          "last-modified": "Sat, 13 Aug 2011 15:11:34 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=2597506"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 14:28:56 GMT"
+        },
+        {
+          "last-modified": "Tue, 04 Sep 2012 09:53:37 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=27218873"
+        },
+        {
+          "expires": "Sat, 14 Sep 2013 13:45:03 GMT"
+        },
+        {
+          "last-modified": "Sat, 12 Feb 2011 11:21:23 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=3377775"
+        },
+        {
+          "expires": "Wed, 12 Dec 2012 15:13:25 GMT"
+        },
+        {
+          "last-modified": "Fri, 17 Aug 2012 08:24:39 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4247008"
+        },
+        {
+          "expires": "Sat, 22 Dec 2012 16:40:38 GMT"
+        },
+        {
+          "last-modified": "Sat, 28 Jul 2012 05:30:14 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1815543"
+        },
+        {
+          "expires": "Sat, 24 Nov 2012 13:16:13 GMT"
+        },
+        {
+          "last-modified": "Sat, 22 Sep 2012 12:19:04 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=270710"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 16:09:00 GMT"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 06:33:30 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:31:14 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1790915"
+        },
+        {
+          "expires": "Sat, 24 Nov 2012 06:25:45 GMT"
+        },
+        {
+          "last-modified": "Sun, 23 Sep 2012 02:00:00 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=14218"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 16:54:08 GMT"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:03:14 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=3723118"
+        },
+        {
+          "expires": "Sun, 16 Dec 2012 15:09:08 GMT"
+        },
+        {
+          "last-modified": "Thu, 09 Aug 2012 08:33:13 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4635533"
+        },
+        {
+          "expires": "Thu, 27 Dec 2012 04:36:03 GMT"
+        },
+        {
+          "last-modified": "Thu, 19 Jul 2012 05:39:24 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=12138710"
+        },
+        {
+          "expires": "Sun, 24 Mar 2013 00:49:00 GMT"
+        },
+        {
+          "last-modified": "Fri, 27 Jan 2012 13:13:30 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=19371229"
+        },
+        {
+          "expires": "Sat, 15 Jun 2013 17:50:59 GMT"
+        },
+        {
+          "last-modified": "Sat, 13 Aug 2011 03:09:31 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=3202347"
+        },
+        {
+          "expires": "Mon, 10 Dec 2012 14:29:37 GMT"
+        },
+        {
+          "last-modified": "Tue, 21 Aug 2012 09:52:15 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=3678437"
+        },
+        {
+          "expires": "Sun, 16 Dec 2012 02:44:27 GMT"
+        },
+        {
+          "last-modified": "Fri, 10 Aug 2012 09:22:36 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1085523"
+        },
+        {
+          "expires": "Fri, 16 Nov 2012 02:29:13 GMT"
+        },
+        {
+          "last-modified": "Tue, 09 Oct 2012 09:53:04 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:31:14 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=51122420"
+        },
+        {
+          "expires": "Wed, 18 Jun 2014 05:37:30 GMT"
+        },
+        {
+          "last-modified": "Sat, 08 Aug 2009 03:36:30 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 13:37:52 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4381984"
+        },
+        {
+          "expires": "Mon, 24 Dec 2012 06:10:14 GMT"
+        },
+        {
+          "last-modified": "Wed, 25 Jul 2012 02:31:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=7305155"
+        },
+        {
+          "expires": "Sun, 27 Jan 2013 02:09:45 GMT"
+        },
+        {
+          "last-modified": "Fri, 18 May 2012 10:32:00 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=13340027"
+        },
+        {
+          "expires": "Sat, 06 Apr 2013 22:30:57 GMT"
+        },
+        {
+          "last-modified": "Fri, 30 Dec 2011 17:49:36 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=3517984"
+        },
+        {
+          "expires": "Fri, 14 Dec 2012 06:10:14 GMT"
+        },
+        {
+          "last-modified": "Tue, 14 Aug 2012 02:31:02 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4872542"
+        },
+        {
+          "expires": "Sat, 29 Dec 2012 22:26:12 GMT"
+        },
+        {
+          "last-modified": "Fri, 13 Jul 2012 17:59:05 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "48731"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:09:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1855967"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 00:29:57 GMT"
+        },
+        {
+          "last-modified": "Fri, 21 Sep 2012 13:51:36 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1357261"
+        },
+        {
+          "expires": "Mon, 19 Nov 2012 05:58:11 GMT"
+        },
+        {
+          "last-modified": "Wed, 03 Oct 2012 02:55:08 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=12271010"
+        },
+        {
+          "expires": "Mon, 25 Mar 2013 13:34:00 GMT"
+        },
+        {
+          "last-modified": "Tue, 24 Jan 2012 11:43:29 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1069555"
+        },
+        {
+          "expires": "Thu, 15 Nov 2012 22:03:05 GMT"
+        },
+        {
+          "last-modified": "Tue, 09 Oct 2012 18:45:20 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=3114138"
+        },
+        {
+          "expires": "Sun, 09 Dec 2012 13:59:29 GMT"
+        },
+        {
+          "last-modified": "Thu, 23 Aug 2012 10:52:35 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=15254111"
+        },
+        {
+          "expires": "Mon, 29 Apr 2013 02:12:22 GMT"
+        },
+        {
+          "last-modified": "Wed, 16 Nov 2011 10:26:48 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:10 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "6834"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:10 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1956253"
+        },
+        {
+          "expires": "Mon, 26 Nov 2012 04:21:24 GMT"
+        },
+        {
+          "last-modified": "Wed, 19 Sep 2012 06:08:44 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=3164696"
+        },
+        {
+          "expires": "Mon, 10 Dec 2012 04:02:07 GMT"
+        },
+        {
+          "last-modified": "Wed, 22 Aug 2012 06:47:19 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=15466892"
+        },
+        {
+          "expires": "Wed, 01 May 2013 13:18:43 GMT"
+        },
+        {
+          "last-modified": "Fri, 11 Nov 2011 12:14:06 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=56032"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 04:31:03 GMT"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 05:49:26 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=7623169"
+        },
+        {
+          "expires": "Wed, 30 Jan 2013 18:30:00 GMT"
+        },
+        {
+          "last-modified": "Fri, 11 May 2012 01:51:32 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=12924665"
+        },
+        {
+          "expires": "Tue, 02 Apr 2013 03:08:16 GMT"
+        },
+        {
+          "last-modified": "Mon, 09 Jan 2012 08:35:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=2176101"
+        },
+        {
+          "expires": "Wed, 28 Nov 2012 17:25:32 GMT"
+        },
+        {
+          "last-modified": "Fri, 14 Sep 2012 04:00:28 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=14007174"
+        },
+        {
+          "expires": "Sun, 14 Apr 2013 15:50:05 GMT"
+        },
+        {
+          "last-modified": "Thu, 15 Dec 2011 07:11:23 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1438855"
+        },
+        {
+          "expires": "Tue, 20 Nov 2012 04:38:06 GMT"
+        },
+        {
+          "last-modified": "Mon, 01 Oct 2012 05:35:21 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=6323658"
+        },
+        {
+          "expires": "Tue, 15 Jan 2013 17:31:29 GMT"
+        },
+        {
+          "last-modified": "Sun, 10 Jun 2012 03:48:34 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=41611"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 00:30:42 GMT"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 13:50:08 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=25072164"
+        },
+        {
+          "expires": "Tue, 20 Aug 2013 17:26:35 GMT"
+        },
+        {
+          "last-modified": "Sun, 03 Apr 2011 03:58:23 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=13004317"
+        },
+        {
+          "expires": "Wed, 03 Apr 2013 01:15:48 GMT"
+        },
+        {
+          "last-modified": "Sat, 07 Jan 2012 12:19:57 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=778015"
+        },
+        {
+          "expires": "Mon, 12 Nov 2012 13:04:06 GMT"
+        },
+        {
+          "last-modified": "Tue, 16 Oct 2012 12:43:21 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1778334"
+        },
+        {
+          "expires": "Sat, 24 Nov 2012 02:56:05 GMT"
+        },
+        {
+          "last-modified": "Sun, 23 Sep 2012 08:59:23 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=5531525"
+        },
+        {
+          "expires": "Sun, 06 Jan 2013 13:29:16 GMT"
+        },
+        {
+          "last-modified": "Thu, 28 Jun 2012 11:53:00 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=2468675"
+        },
+        {
+          "expires": "Sun, 02 Dec 2012 02:41:46 GMT"
+        },
+        {
+          "last-modified": "Fri, 07 Sep 2012 09:28:00 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1223853"
+        },
+        {
+          "expires": "Sat, 17 Nov 2012 16:54:44 GMT"
+        },
+        {
+          "last-modified": "Sat, 06 Oct 2012 05:02:04 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=3496295"
+        },
+        {
+          "expires": "Fri, 14 Dec 2012 00:08:46 GMT"
+        },
+        {
+          "last-modified": "Tue, 14 Aug 2012 14:34:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:09 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:09 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=20150086"
+        },
+        {
+          "expires": "Mon, 24 Jun 2013 18:11:57 GMT"
+        },
+        {
+          "last-modified": "Tue, 26 Jul 2011 02:27:39 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:11 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=5057999"
+        },
+        {
+          "expires": "Tue, 01 Jan 2013 01:57:10 GMT"
+        },
+        {
+          "last-modified": "Mon, 09 Jul 2012 10:57:13 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=2613405"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 18:53:57 GMT"
+        },
+        {
+          "last-modified": "Tue, 04 Sep 2012 01:03:41 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4365433"
+        },
+        {
+          "expires": "Mon, 24 Dec 2012 01:34:25 GMT"
+        },
+        {
+          "last-modified": "Wed, 25 Jul 2012 11:42:45 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=19834480"
+        },
+        {
+          "expires": "Fri, 21 Jun 2013 02:31:52 GMT"
+        },
+        {
+          "last-modified": "Tue, 02 Aug 2011 09:47:52 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=11268"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 16:05:00 GMT"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 06:41:35 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=5616267"
+        },
+        {
+          "expires": "Mon, 07 Jan 2013 13:01:39 GMT"
+        },
+        {
+          "last-modified": "Tue, 26 Jun 2012 12:48:17 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=7263532"
+        },
+        {
+          "expires": "Sat, 26 Jan 2013 14:36:04 GMT"
+        },
+        {
+          "last-modified": "Sat, 19 May 2012 09:39:27 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "JSP2/1.0.2"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:08 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "94544"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "etag": "\"1031174008914679718\""
+        },
+        {
+          "expires": "Tue, 20 Aug 2013 13:41:19 GMT"
+        },
+        {
+          "last-modified": "Sun, 08 Jul 2012 14:17:09 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "723"
+        },
+        {
+          "last-modified": "Tue, 24 Jul 2012 03:59:23 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "tracecode": "34277428450405149450110320"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "set-cookie": "wise_device=0; expires=Sun, 03-Nov-2013 12:57:07 GMT; path=/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "3728"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "987"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "3108"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:25:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 09:07:40 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "598"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "717"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 13:37:52 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:09:10 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "973"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "386"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:09:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Wed, 25 Jul 2012 07:00:44 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-length": "584"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "last-modified": "Wed, 30 May 2012 03:14:35 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "429"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "2725"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:31:14 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "last-modified": "Thu, 14 Oct 2010 10:10:45 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:10 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "1633"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:09:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "733"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:31:14 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "1647"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 10:49:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1217631"
+        },
+        {
+          "expires": "Sat, 17 Nov 2012 15:11:03 GMT"
+        },
+        {
+          "last-modified": "Sat, 06 Oct 2012 08:29:30 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4935379"
+        },
+        {
+          "expires": "Sun, 30 Dec 2012 15:53:31 GMT"
+        },
+        {
+          "last-modified": "Thu, 12 Jul 2012 07:04:33 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=94090"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 15:05:22 GMT"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 08:40:52 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=268205"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 15:27:17 GMT"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 07:57:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=3501790"
+        },
+        {
+          "expires": "Fri, 14 Dec 2012 01:40:22 GMT"
+        },
+        {
+          "last-modified": "Tue, 14 Aug 2012 11:30:52 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1089367"
+        },
+        {
+          "expires": "Fri, 16 Nov 2012 03:33:19 GMT"
+        },
+        {
+          "last-modified": "Tue, 09 Oct 2012 07:44:57 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=5175917"
+        },
+        {
+          "expires": "Wed, 02 Jan 2013 10:42:29 GMT"
+        },
+        {
+          "last-modified": "Fri, 06 Jul 2012 17:26:38 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=2826947"
+        },
+        {
+          "expires": "Thu, 06 Dec 2012 06:12:59 GMT"
+        },
+        {
+          "last-modified": "Thu, 30 Aug 2012 02:25:38 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 13:37:52 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "560"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "2850"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:31:14 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "1196"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:09:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "1804"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:09:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1320"
+        },
+        {
+          "last-modified": "Wed, 30 May 2012 03:19:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Wed, 30 May 2012 03:19:18 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1990"
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=14263076"
+        },
+        {
+          "expires": "Wed, 17 Apr 2013 14:55:08 GMT"
+        },
+        {
+          "last-modified": "Fri, 09 Dec 2011 09:01:20 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=2086351"
+        },
+        {
+          "expires": "Tue, 27 Nov 2012 16:29:43 GMT"
+        },
+        {
+          "last-modified": "Sun, 16 Sep 2012 05:52:10 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=6392807"
+        },
+        {
+          "expires": "Wed, 16 Jan 2013 12:43:59 GMT"
+        },
+        {
+          "last-modified": "Fri, 08 Jun 2012 13:23:38 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4373528"
+        },
+        {
+          "expires": "Mon, 24 Dec 2012 03:49:20 GMT"
+        },
+        {
+          "last-modified": "Wed, 25 Jul 2012 07:12:56 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=960053"
+        },
+        {
+          "expires": "Wed, 14 Nov 2012 15:38:05 GMT"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 07:35:25 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1446556"
+        },
+        {
+          "expires": "Tue, 20 Nov 2012 06:46:28 GMT"
+        },
+        {
+          "last-modified": "Mon, 01 Oct 2012 01:18:39 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=13730089"
+        },
+        {
+          "expires": "Thu, 11 Apr 2013 10:52:01 GMT"
+        },
+        {
+          "last-modified": "Wed, 21 Dec 2011 17:07:33 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4447089"
+        },
+        {
+          "expires": "Tue, 25 Dec 2012 00:15:21 GMT"
+        },
+        {
+          "last-modified": "Mon, 23 Jul 2012 14:20:53 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1048930"
+        },
+        {
+          "expires": "Thu, 15 Nov 2012 16:19:22 GMT"
+        },
+        {
+          "last-modified": "Wed, 10 Oct 2012 06:12:51 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "etag": "\"4013610198\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Wed, 20 Jun 2012 16:39:57 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1828"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=23765568"
+        },
+        {
+          "expires": "Mon, 05 Aug 2013 14:30:00 GMT"
+        },
+        {
+          "last-modified": "Tue, 03 May 2011 09:51:35 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "9466"
+        },
+        {
+          "last-modified": "Wed, 25 Jul 2012 06:58:47 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=2736291"
+        },
+        {
+          "expires": "Wed, 05 Dec 2012 05:02:03 GMT"
+        },
+        {
+          "last-modified": "Sat, 01 Sep 2012 04:47:30 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=7202517"
+        },
+        {
+          "expires": "Fri, 25 Jan 2013 21:39:09 GMT"
+        },
+        {
+          "last-modified": "Sun, 20 May 2012 19:33:18 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=962816"
+        },
+        {
+          "expires": "Wed, 14 Nov 2012 16:24:09 GMT"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 06:03:21 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=28898351"
+        },
+        {
+          "expires": "Fri, 04 Oct 2013 00:16:24 GMT"
+        },
+        {
+          "last-modified": "Tue, 04 Jan 2011 14:18:50 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=26910239"
+        },
+        {
+          "expires": "Wed, 11 Sep 2013 00:01:12 GMT"
+        },
+        {
+          "last-modified": "Sat, 19 Feb 2011 14:49:14 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=314449"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 04:18:02 GMT"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 06:15:34 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=17303680"
+        },
+        {
+          "expires": "Wed, 22 May 2013 19:31:53 GMT"
+        },
+        {
+          "last-modified": "Thu, 29 Sep 2011 23:47:53 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=8742316"
+        },
+        {
+          "expires": "Tue, 12 Feb 2013 17:22:29 GMT"
+        },
+        {
+          "last-modified": "Sun, 15 Apr 2012 04:06:41 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=951041"
+        },
+        {
+          "expires": "Wed, 14 Nov 2012 13:07:54 GMT"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 12:35:50 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=12357995"
+        },
+        {
+          "expires": "Tue, 26 Mar 2013 13:43:48 GMT"
+        },
+        {
+          "last-modified": "Sun, 22 Jan 2012 11:24:02 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-length": "30289"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 08:14:30 GMT"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "tracecode": "34277428450405149450110320"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "set-cookie": "wise_device=0; expires=Sun, 03-Nov-2013 12:57:07 GMT; path=/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=6924353"
+        },
+        {
+          "expires": "Tue, 22 Jan 2013 16:23:06 GMT"
+        },
+        {
+          "last-modified": "Sun, 27 May 2012 06:05:27 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=35998348"
+        },
+        {
+          "expires": "Wed, 25 Dec 2013 04:29:41 GMT"
+        },
+        {
+          "last-modified": "Sat, 24 Jul 2010 05:52:16 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=403161"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 04:56:34 GMT"
+        },
+        {
+          "last-modified": "Thu, 25 Oct 2012 04:58:30 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=11795987"
+        },
+        {
+          "expires": "Wed, 20 Mar 2013 01:37:00 GMT"
+        },
+        {
+          "last-modified": "Sat, 04 Feb 2012 11:37:39 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4466678"
+        },
+        {
+          "expires": "Tue, 25 Dec 2012 05:41:51 GMT"
+        },
+        {
+          "last-modified": "Mon, 23 Jul 2012 03:27:57 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4380824"
+        },
+        {
+          "expires": "Mon, 24 Dec 2012 05:50:57 GMT"
+        },
+        {
+          "last-modified": "Wed, 25 Jul 2012 03:09:45 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4370018"
+        },
+        {
+          "expires": "Mon, 24 Dec 2012 02:50:51 GMT"
+        },
+        {
+          "last-modified": "Wed, 25 Jul 2012 09:09:57 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=22046695"
+        },
+        {
+          "expires": "Tue, 16 Jul 2013 17:02:08 GMT"
+        },
+        {
+          "last-modified": "Sun, 12 Jun 2011 04:47:22 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "etag": "\"1795935374\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Thu, 20 Sep 2012 06:30:31 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "490"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1813409"
+        },
+        {
+          "expires": "Sat, 24 Nov 2012 12:40:42 GMT"
+        },
+        {
+          "last-modified": "Sat, 22 Sep 2012 13:30:14 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=2381150"
+        },
+        {
+          "expires": "Sat, 01 Dec 2012 02:23:03 GMT"
+        },
+        {
+          "last-modified": "Sun, 09 Sep 2012 10:05:33 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=12085408"
+        },
+        {
+          "expires": "Sat, 23 Mar 2013 10:00:41 GMT"
+        },
+        {
+          "last-modified": "Sat, 28 Jan 2012 18:50:17 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=7660325"
+        },
+        {
+          "expires": "Thu, 31 Jan 2013 04:49:18 GMT"
+        },
+        {
+          "last-modified": "Thu, 10 May 2012 05:13:02 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=20831903"
+        },
+        {
+          "expires": "Tue, 02 Jul 2013 15:35:36 GMT"
+        },
+        {
+          "last-modified": "Sun, 10 Jul 2011 07:40:26 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:12 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "42293"
+        },
+        {
+          "last-modified": "Wed, 30 May 2012 03:19:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:57:12 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=13227345"
+        },
+        {
+          "expires": "Fri, 05 Apr 2013 15:12:58 GMT"
+        },
+        {
+          "last-modified": "Mon, 02 Jan 2012 08:25:43 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=5658505"
+        },
+        {
+          "expires": "Tue, 08 Jan 2013 00:45:38 GMT"
+        },
+        {
+          "last-modified": "Mon, 25 Jun 2012 13:20:23 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1397477"
+        },
+        {
+          "expires": "Mon, 19 Nov 2012 17:08:30 GMT"
+        },
+        {
+          "last-modified": "Tue, 02 Oct 2012 04:34:38 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=3108210"
+        },
+        {
+          "expires": "Sun, 09 Dec 2012 12:20:43 GMT"
+        },
+        {
+          "last-modified": "Thu, 23 Aug 2012 14:10:13 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1080824"
+        },
+        {
+          "expires": "Fri, 16 Nov 2012 01:10:57 GMT"
+        },
+        {
+          "last-modified": "Tue, 09 Oct 2012 12:29:45 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=10544861"
+        },
+        {
+          "expires": "Tue, 05 Mar 2013 14:04:54 GMT"
+        },
+        {
+          "last-modified": "Sun, 04 Mar 2012 10:41:50 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=9336177"
+        },
+        {
+          "expires": "Tue, 19 Feb 2013 14:20:10 GMT"
+        },
+        {
+          "last-modified": "Sun, 01 Apr 2012 10:11:18 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=947069"
+        },
+        {
+          "expires": "Wed, 14 Nov 2012 12:01:43 GMT"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 14:48:15 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1473803"
+        },
+        {
+          "expires": "Tue, 20 Nov 2012 14:20:37 GMT"
+        },
+        {
+          "last-modified": "Sun, 30 Sep 2012 10:10:28 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1395562"
+        },
+        {
+          "expires": "Mon, 19 Nov 2012 16:36:36 GMT"
+        },
+        {
+          "last-modified": "Tue, 02 Oct 2012 05:38:29 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4082149"
+        },
+        {
+          "expires": "Thu, 20 Dec 2012 18:53:02 GMT"
+        },
+        {
+          "last-modified": "Wed, 01 Aug 2012 01:05:35 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4020129"
+        },
+        {
+          "expires": "Thu, 20 Dec 2012 01:39:23 GMT"
+        },
+        {
+          "last-modified": "Thu, 02 Aug 2012 11:32:55 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=30533221"
+        },
+        {
+          "expires": "Tue, 22 Oct 2013 22:24:15 GMT"
+        },
+        {
+          "last-modified": "Sat, 27 Nov 2010 18:03:12 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=9250886"
+        },
+        {
+          "expires": "Mon, 18 Feb 2013 14:38:40 GMT"
+        },
+        {
+          "last-modified": "Tue, 03 Apr 2012 09:34:21 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=7796153"
+        },
+        {
+          "expires": "Fri, 01 Feb 2013 18:33:07 GMT"
+        },
+        {
+          "last-modified": "Mon, 07 May 2012 01:45:28 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=12403487"
+        },
+        {
+          "expires": "Wed, 27 Mar 2013 02:22:01 GMT"
+        },
+        {
+          "last-modified": "Sat, 21 Jan 2012 10:07:40 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=342416"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 12:04:10 GMT"
+        },
+        {
+          "last-modified": "Fri, 26 Oct 2012 14:43:22 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=13044961"
+        },
+        {
+          "expires": "Wed, 03 Apr 2013 12:33:15 GMT"
+        },
+        {
+          "last-modified": "Fri, 06 Jan 2012 13:45:12 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=90589"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 14:07:03 GMT"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 10:37:35 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=13128536"
+        },
+        {
+          "expires": "Thu, 04 Apr 2013 11:46:10 GMT"
+        },
+        {
+          "last-modified": "Wed, 04 Jan 2012 15:19:22 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=3557238"
+        },
+        {
+          "expires": "Fri, 14 Dec 2012 17:04:32 GMT"
+        },
+        {
+          "last-modified": "Mon, 13 Aug 2012 04:42:37 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=2348339"
+        },
+        {
+          "expires": "Fri, 30 Nov 2012 17:16:13 GMT"
+        },
+        {
+          "last-modified": "Mon, 10 Sep 2012 04:19:15 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=303065"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 01:08:19 GMT"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 12:35:04 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=3713169"
+        },
+        {
+          "expires": "Sun, 16 Dec 2012 12:23:23 GMT"
+        },
+        {
+          "last-modified": "Thu, 09 Aug 2012 14:04:55 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=3556632"
+        },
+        {
+          "expires": "Fri, 14 Dec 2012 16:54:26 GMT"
+        },
+        {
+          "last-modified": "Mon, 13 Aug 2012 05:02:50 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4793201"
+        },
+        {
+          "expires": "Sat, 29 Dec 2012 00:23:55 GMT"
+        },
+        {
+          "last-modified": "Sun, 15 Jul 2012 14:03:52 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=488079"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 04:31:53 GMT"
+        },
+        {
+          "last-modified": "Tue, 23 Oct 2012 05:47:55 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=12998284"
+        },
+        {
+          "expires": "Tue, 02 Apr 2013 23:35:18 GMT"
+        },
+        {
+          "last-modified": "Sat, 07 Jan 2012 15:41:05 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=38194284"
+        },
+        {
+          "expires": "Sun, 19 Jan 2014 14:28:38 GMT"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 09:54:26 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:13 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "17574"
+        },
+        {
+          "last-modified": "Fri, 26 Oct 2012 03:00:00 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:57:13 GMT"
+        },
+        {
+          "cache-control": "max-age=3600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1010448"
+        },
+        {
+          "expires": "Thu, 15 Nov 2012 05:38:02 GMT"
+        },
+        {
+          "last-modified": "Thu, 11 Oct 2012 03:35:37 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=573690"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:18:44 GMT"
+        },
+        {
+          "last-modified": "Sun, 21 Oct 2012 06:14:13 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=9690556"
+        },
+        {
+          "expires": "Sat, 23 Feb 2013 16:46:30 GMT"
+        },
+        {
+          "last-modified": "Sat, 24 Mar 2012 05:18:41 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=20727056"
+        },
+        {
+          "expires": "Mon, 01 Jul 2013 10:28:10 GMT"
+        },
+        {
+          "last-modified": "Tue, 12 Jul 2011 17:55:22 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=5867076"
+        },
+        {
+          "expires": "Thu, 10 Jan 2013 10:41:50 GMT"
+        },
+        {
+          "last-modified": "Wed, 20 Jun 2012 17:28:01 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1938815"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 23:30:49 GMT"
+        },
+        {
+          "last-modified": "Wed, 19 Sep 2012 15:50:04 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:14 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=25417039"
+        },
+        {
+          "expires": "Sat, 24 Aug 2013 17:14:33 GMT"
+        },
+        {
+          "last-modified": "Sat, 26 Mar 2011 04:22:35 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1258204"
+        },
+        {
+          "expires": "Sun, 18 Nov 2012 02:27:19 GMT"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 09:57:06 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1855684"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 00:25:19 GMT"
+        },
+        {
+          "last-modified": "Fri, 21 Sep 2012 14:01:06 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=6489659"
+        },
+        {
+          "expires": "Thu, 17 Jan 2013 15:38:14 GMT"
+        },
+        {
+          "last-modified": "Wed, 06 Jun 2012 07:35:17 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4972705"
+        },
+        {
+          "expires": "Mon, 31 Dec 2012 02:15:40 GMT"
+        },
+        {
+          "last-modified": "Wed, 11 Jul 2012 10:20:25 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4075979"
+        },
+        {
+          "expires": "Thu, 20 Dec 2012 17:10:14 GMT"
+        },
+        {
+          "last-modified": "Wed, 01 Aug 2012 04:31:16 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        },
+        {
+          "content-length": "16"
+        },
+        {
+          "content-type": "text/html;charset=gbk"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "set-cookie": "BDRCVFR[RQbEFtOPS6t]=mbxnW11j9Dfmh7GuZR8mvqV; path=/; domain=rp.baidu.com"
+        },
+        {
+          "connection": "Keep-Alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        },
+        {
+          "content-length": "16"
+        },
+        {
+          "content-type": "text/html;charset=gbk"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "set-cookie": "BDRCVFR[74hAi0as9Oc]=mbxnW11j9Dfmh7GuZR8mvqV; path=/; domain=rp.baidu.com"
+        },
+        {
+          "connection": "Keep-Alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        },
+        {
+          "content-length": "16"
+        },
+        {
+          "content-type": "text/html;charset=gbk"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "set-cookie": "BDRCVFR[INlq_Cf3RCm]=mbxnW11j9Dfmh7GuZR8mvqV; path=/; domain=rp.baidu.com"
+        },
+        {
+          "connection": "Keep-Alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "BWS/1.0"
+        },
+        {
+          "content-length": "16"
+        },
+        {
+          "content-type": "text/html;charset=gbk"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "set-cookie": "BDRCVFR[wqXIM55hsyY]=mbxnW11j9Dfmh7GuZR8mvqV; path=/; domain=rp.baidu.com"
+        },
+        {
+          "connection": "Keep-Alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "17574"
+        },
+        {
+          "last-modified": "Sat Nov  3 20:57:15 2012"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 26 Jul 1997 05:00:00 GMT"
+        },
+        {
+          "cache-control": "post-check=0, pre-check=0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=433162"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 13:16:37 GMT"
+        },
+        {
+          "last-modified": "Wed, 24 Oct 2012 12:18:30 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=701481"
+        },
+        {
+          "expires": "Sun, 11 Nov 2012 15:48:36 GMT"
+        },
+        {
+          "last-modified": "Thu, 18 Oct 2012 07:14:33 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=473366"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 00:26:41 GMT"
+        },
+        {
+          "last-modified": "Tue, 23 Oct 2012 13:58:23 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=5523078"
+        },
+        {
+          "expires": "Sun, 06 Jan 2013 11:08:33 GMT"
+        },
+        {
+          "last-modified": "Thu, 28 Jun 2012 16:34:39 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=16759229"
+        },
+        {
+          "expires": "Thu, 16 May 2013 12:17:44 GMT"
+        },
+        {
+          "last-modified": "Wed, 12 Oct 2011 14:16:17 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=4189499"
+        },
+        {
+          "expires": "Sat, 22 Dec 2012 00:42:14 GMT"
+        },
+        {
+          "last-modified": "Sun, 29 Jul 2012 13:27:17 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "JSP2/1.0.2"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "etag": "\"2607371477\""
+        },
+        {
+          "last-modified": "Tue, 18 Sep 2012 05:49:17 GMT"
+        },
+        {
+          "expires": "Sun, 17 Mar 2013 06:26:16 GMT"
+        },
+        {
+          "cache-control": "max-age=15552000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "JSP2/1.0.2"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "etag": "\"2063226227\""
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 10:39:26 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:09:38 GMT"
+        },
+        {
+          "cache-control": "max-age=1800"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=1345881"
+        },
+        {
+          "expires": "Mon, 19 Nov 2012 02:48:36 GMT"
+        },
+        {
+          "last-modified": "Wed, 03 Oct 2012 09:14:33 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=96063"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 15:38:18 GMT"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 07:35:08 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=3617766"
+        },
+        {
+          "expires": "Sat, 15 Dec 2012 09:53:21 GMT"
+        },
+        {
+          "last-modified": "Sat, 11 Aug 2012 19:05:03 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=11496580"
+        },
+        {
+          "expires": "Sat, 16 Mar 2013 14:26:55 GMT"
+        },
+        {
+          "last-modified": "Sat, 11 Feb 2012 09:57:55 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "server": "apache 1.1.26.0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=307195"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 02:17:10 GMT"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 10:17:24 GMT"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "JSP2/1.0.2"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:15 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "etag": "\"618192838\""
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 12:49:53 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "JSP2/1.0.2"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:57:16 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-length": "9799"
+        },
+        {
+          "etag": "\"2773371803\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 03:58:12 GMT"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 09:54:56 GMT"
+        },
+        {
+          "cache-control": "max-age=604800"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_23.json b/jetty-http2/http2-hpack/src/test/resources/data/story_23.json
new file mode 100644
index 0000000..935e29d
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_23.json
@@ -0,0 +1,13406 @@
+{
+  "context": "response",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":status": "301"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:10 GMT"
+        },
+        {
+          "server": "Apache/2.2.22 (Unix)"
+        },
+        {
+          "set-cookie": "BBC-UID=557049b5114e60f649a3590541375a237274de5c1020f1118262d353e424f5650Mozilla%2f5%2e0%20%28Macintosh%3b%20Intel%20Mac%20OS%20X%2010%2e8%3b%20rv%3a16%2e0%29%20Gecko%2f20100101%20Firefox%2f16%2e0; expires=Sun, 03-Nov-13 13:37:10 GMT; path=/; domain=.bbc.co.uk;"
+        },
+        {
+          "location": "http://www.bbc.co.uk/"
+        },
+        {
+          "content-length": "229"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "text/html; charset=iso-8859-1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "cache-control": "private, max-age=60"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:37:38 GMT"
+        },
+        {
+          "etag": "\"dfc69d0362a1518353bddd8fa0dcc7cf-49cffe7f817cb754d3241794c0a3e991\""
+        },
+        {
+          "x-pal-host": "pal047.cwwtf.bbc.co.uk:80"
+        },
+        {
+          "content-length": "25186"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:11 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-cache-action": "PASS (non-cacheable)"
+        },
+        {
+          "x-cache-age": "33"
+        },
+        {
+          "vary": "X-CDN"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:12 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Mon, 15 Oct 2012 10:42:57 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=900"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:52:11 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2414"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "keep-alive": "timeout=4, max=175"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "application/x-javascript"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "cache-control": "max-age=86400"
+        },
+        {
+          "content-type": "image/x-icon"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 13:37:12 GMT"
+        },
+        {
+          "etag": "\"dfc69d0362a1518353bddd8fa0dcc7cf-49cffe7f817cb754d3241794c0a3e991\""
+        },
+        {
+          "x-pal-host": "pal047.cwwtf.bbc.co.uk:80"
+        },
+        {
+          "content-length": "958"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:12 GMT"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "x-cache-action": "PASS (non-cacheable)"
+        },
+        {
+          "x-cache-age": "33"
+        },
+        {
+          "vary": "X-CDN"
+        },
+        {
+          "last-modified": "Wed, 28 Jun 2006 14:32:43 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "keep-alive": "timeout=4, max=190"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 05 May 2011 09:15:59 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "4786"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "max-age=30845970"
+        },
+        {
+          "expires": "Sat, 26 Oct 2013 13:56:42 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "etag": "\"d1a-4af7eb4dd8880\""
+        },
+        {
+          "expires": "Tue, 13 Nov 2012 11:52:05 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 17 Oct 2011 13:37:22 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1227"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:13 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "etag": "\"677-4af7eb4bf0400\""
+        },
+        {
+          "expires": "Tue, 13 Nov 2012 11:49:51 GMT"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 17 Oct 2011 13:37:20 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "644"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:13 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 13:31:55 GMT"
+        },
+        {
+          "etag": "\"3c9-4cd32b163a8c0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 08:47:52 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "418"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:13 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 13:31:55 GMT"
+        },
+        {
+          "etag": "\"217-4cd32b163a8c0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 08:48:03 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "211"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:13 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Thu, 11 Oct 2012 10:08:28 GMT"
+        },
+        {
+          "etag": "\"7316-4cbc5c0a6df00\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Thu, 24 Oct 2013 08:20:52 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5855"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:13 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 13:33:03 GMT"
+        },
+        {
+          "etag": "\"714c-4cd32b57141c0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 08:48:07 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5891"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:13 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Wed, 16 Nov 2011 15:42:16 GMT"
+        },
+        {
+          "etag": "\"5ec2-4b1dbf2c82600\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Tue, 17 Sep 2013 11:45:35 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "7383"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:13 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Thu, 11 Oct 2012 10:08:26 GMT"
+        },
+        {
+          "etag": "\"41d9-4cbc5c0885a80\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Thu, 24 Oct 2013 08:21:11 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:13 GMT"
+        },
+        {
+          "content-length": "5723"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 13:32:01 GMT"
+        },
+        {
+          "etag": "\"9029-4cd32b1bf3640\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 08:47:52 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "11967"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:13 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 26 Apr 2010 14:22:59 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "916"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "max-age=27418917"
+        },
+        {
+          "expires": "Mon, 16 Sep 2013 21:59:10 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:13 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Wed, 06 Jul 2011 17:14:05 GMT"
+        },
+        {
+          "etag": "\"20a0c-4a769ba3ff140\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Tue, 17 Sep 2013 11:50:03 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "37892"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:14 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 26 Apr 2010 14:18:35 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "31308"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "max-age=27418893"
+        },
+        {
+          "expires": "Mon, 16 Sep 2013 21:58:47 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:14 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://www.googleadservices.com/pagead/p3p.xml\", CP=\"NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC\""
+        },
+        {
+          "content-type": "text/javascript; charset=UTF-8"
+        },
+        {
+          "etag": "16031183393755591049"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:45:54 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:45:54 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-disposition": "attachment"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "content-length": "11145"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "3084"
+        },
+        {
+          "cache-control": "public, max-age=3600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 13:31:56 GMT"
+        },
+        {
+          "etag": "\"722a-4cd32b172eb00\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 08:48:06 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5813"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "302"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:18 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "302"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:19 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Tue, 08 May 2012 20:06:18 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 14:30:10 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 14:30:10 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "83229"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:37:19 GMT"
+        },
+        {
+          "cache-control": "max-age=86400, private"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 13:37:19 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://js.revsci.net/w3c/rsip3p.xml\", CP=\"NON PSA PSD IVA IVD OTP SAM IND UNI PUR COM NAV INT DEM CNT STA PRE OTC HEA\""
+        },
+        {
+          "x-proc-data": "pd3-bgas02-0"
+        },
+        {
+          "content-type": "application/javascript;charset=ISO-8859-1"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:18 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Wed, 03 Oct 2012 14:20:11 GMT"
+        },
+        {
+          "etag": "\"1fbb-4cb2856215cc0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=2592000"
+        },
+        {
+          "expires": "Fri, 30 Nov 2012 15:42:45 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3254"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Thu, 11 Oct 2012 10:08:24 GMT"
+        },
+        {
+          "etag": "\"3fc-4cbc5c069d600\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Thu, 24 Oct 2013 08:21:03 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1020"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Thu, 11 Oct 2012 10:08:24 GMT"
+        },
+        {
+          "etag": "\"bc-4cbc5c069d600\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Thu, 24 Oct 2013 08:20:59 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "188"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Thu, 27 Sep 2012 10:15:51 GMT"
+        },
+        {
+          "etag": "\"293-4caac394743c0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Thu, 03 Oct 2013 09:51:46 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:18 GMT"
+        },
+        {
+          "content-length": "659"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "etag": "\"11e-4caac394743c0\""
+        },
+        {
+          "expires": "Thu, 03 Oct 2013 09:51:45 GMT"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 27 Sep 2012 10:15:51 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "286"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "etag": "\"25d-4caac394743c0\""
+        },
+        {
+          "expires": "Thu, 03 Oct 2013 09:51:56 GMT"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 27 Sep 2012 10:15:51 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "605"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 17:19:32 GMT"
+        },
+        {
+          "etag": "\"121f4-4cd5e1b17b100\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31470349"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 17:19:32 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "10750"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "2378"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:19 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Fri, 24 Jun 2011 10:14:39 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 22:58:53 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 22:58:53 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "12034"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "52707"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "308"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "308"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 01 Jan 2000 00:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.nedstat.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND NAV COM\""
+        },
+        {
+          "set-cookie": "s1=50951E1074D40255; expires=Thu, 02-Nov-2017 13:37:20 GMT; path=/; domain=.bbc.co.uk"
+        },
+        {
+          "location": "http://sa.bbc.co.uk/bbc/bbc/s?name=home.page&ns_m2=yes&ns_setsiteck=50951E1074D40255&geo_edition=int&pal_route=default&ml_name=barlesque&app_type=web&language=en-GB&ml_version=0.14.2&pal_webapp=wwhomepage&bbc_mc=not_set&screen_resolution=1366x768&blq_s=3.5&blq_r=3.5&blq_v=default-worldwide&ns__t=1351949839865&ns_c=UTF-8&ns_ti=BBC%20-%20Homepage&ns_jspageurl=http%3A//www.bbc.co.uk/&ns_referrer="
+        },
+        {
+          "content-length": "656"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "text/html; charset=iso-8859-1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 17:19:32 GMT"
+        },
+        {
+          "etag": "\"608f-4cd5e1b17b100\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31470342"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 17:19:32 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "6150"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Thu, 11 Oct 2012 10:08:24 GMT"
+        },
+        {
+          "etag": "\"223-4cbc5c069d600\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Thu, 24 Oct 2013 08:20:57 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "547"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "308"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Thu, 11 Oct 2012 10:08:24 GMT"
+        },
+        {
+          "etag": "\"89f-4cbc5c069d600\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Thu, 24 Oct 2013 08:20:51 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2207"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 01 Jan 2000 00:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.nedstat.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND NAV COM\""
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "308"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 13:32:08 GMT"
+        },
+        {
+          "etag": "\"11d21-4cd32b22a0600\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 08:48:10 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "24284"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "3291"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "last-modified": "Wed, 19 Sep 2012 18:25:49 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 20:14:11 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 20:14:11 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "1581"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "62589"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 17:19:26 GMT"
+        },
+        {
+          "etag": "\"1b7f-4cd5e1abc2380\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31470341"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 17:19:26 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "7039"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 17:19:26 GMT"
+        },
+        {
+          "etag": "\"20a3-4cd5e1abc2380\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31470356"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 17:19:26 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8355"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "308"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 17:19:26 GMT"
+        },
+        {
+          "etag": "\"3038-4cd5e1abc2380\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31470335"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 17:19:26 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "content-length": "12344"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "last-modified": "Fri, 07 Sep 2012 16:46:42 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 10:27:06 GMT"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 10:27:06 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "23913"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "11414"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 17:19:26 GMT"
+        },
+        {
+          "etag": "\"1ff0-4cd5e1abc2380\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31470356"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 17:19:26 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8176"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "308"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:21 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "cache-control": "max-age=63072000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Mon, 03 Nov 2014 06:54:04 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 06:50:43 GMT"
+        },
+        {
+          "content-length": "3810"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "cache-control": "max-age=63072000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Fri, 31 Oct 2014 21:56:00 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 21:51:59 GMT"
+        },
+        {
+          "content-length": "5049"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "cache-control": "max-age=63072000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Mon, 03 Nov 2014 09:47:13 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 09:31:24 GMT"
+        },
+        {
+          "content-length": "5071"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Thu, 19 Jul 2012 22:49:47 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 22:03:55 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 22:03:55 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "31936"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "56006"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:21 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "content-length": "42"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 17:19:26 GMT"
+        },
+        {
+          "etag": "\"323-4cd5e1abc2380\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31470350"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 17:19:26 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "803"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "347"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:21 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Wed, 06 Jul 2011 17:14:01 GMT"
+        },
+        {
+          "etag": "\"1a56e-4a769ba02e840\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Tue, 17 Sep 2013 11:50:28 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "30642"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 14:27:29 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 20:29:16 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 20:29:16 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "18065"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "61685"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "rts_AAAA=MLuB86QsXkGiDUw6LAw6IpFSRlNUwBT4lFpER0UXYGEV+3P4; Domain=.revsci.net; Expires=Sun, 03-Nov-2013 13:37:21 GMT; Path=/"
+        },
+        {
+          "x-proc-data": "pd3-bgas08-1"
+        },
+        {
+          "p3p": "policyref=\"http://js.revsci.net/w3c/rsip3p.xml\", CP=\"NON PSA PSD IVA IVD OTP SAM IND UNI PUR COM NAV INT DEM CNT STA PRE OTC HEA\""
+        },
+        {
+          "server": "RSI"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "content-type": "application/javascript;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "cache-control": "max-age=63072000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Mon, 03 Nov 2014 12:03:34 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 11:02:09 GMT"
+        },
+        {
+          "content-length": "13746"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 17:19:26 GMT"
+        },
+        {
+          "etag": "\"136-4cd5e1abc2380\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31470294"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 17:19:26 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:21 GMT"
+        },
+        {
+          "content-length": "310"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "cache-control": "max-age=63072000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Mon, 03 Nov 2014 08:07:24 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 08:04:03 GMT"
+        },
+        {
+          "content-length": "10701"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "cache-control": "max-age=63072000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 11:46:30 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:37:23 GMT"
+        },
+        {
+          "content-length": "4375"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "cache-control": "max-age=63072000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 03:14:26 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 03:10:05 GMT"
+        },
+        {
+          "content-length": "3965"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "cache-control": "max-age=63072000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 12:49:53 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 12:39:23 GMT"
+        },
+        {
+          "content-length": "4844"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 13:23:10 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31490899"
+        },
+        {
+          "expires": "Sat, 02 Nov 2013 13:28:30 GMT"
+        },
+        {
+          "content-length": "18949"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 17:01:19 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 02:00:11 GMT"
+        },
+        {
+          "content-length": "25085"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:30:25 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=31493423"
+        },
+        {
+          "expires": "Sat, 02 Nov 2013 14:10:58 GMT"
+        },
+        {
+          "content-length": "27938"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "cache-control": "max-age=63072000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 05:49:17 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 02:43:46 GMT"
+        },
+        {
+          "content-length": "5569"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:22 GMT"
+        },
+        {
+          "server": "Omniture DC/2.0.0"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "set-cookie": "s_vi=[CS]v1|284A8F0905160D8B-600001A1C0108CD4[CE]; Expires=Thu,  2 Nov 2017 13:37:22 GMT; Domain=sa.bbc.com; Path=/"
+        },
+        {
+          "location": "http://sa.bbc.com/b/ss/bbcwglobalprod/1/H.22.1/s0268806509673?AQB=1&pccr=true&vidn=284A8F0905160D8B-600001A1C0108CD4&&ndh=1&t=3%2F10%2F2012%209%3A37%3A21%206%20240&vmt=4F9A739C&vmf=bbc.112.2o7.net&ce=UTF-8&cdp=3&pageName=bbc%20%7C%20homepage&g=http%3A%2F%2Fwww.bbc.co.uk%2F&cc=USD&ch=homepage&events=event2&h1=bbc%7Chomepage&v2=D%3DpageName&c5=INDEX&v5=D%3Dc5&c6=homepage&v6=D%3Dc6&c11=saturday%7C1%3A30pm&c15=%2F&v15=D%3Dc15&c17=bbc%20%7C%20homepage&v17=D%3Dc17&c31=HTML&v31=D%3Dc31&c32=Not%20available&v32=D%3Dc32&v49=Direct%20Load&c53=www.bbc.co.uk&v53=D%3Dc53&c54=http%3A%2F%2Fwww.bbc.co.uk&v54=D%3Dc54&c55=bbc.com&v55=D%3Dc55&c56=D%3DpageName&v56=D%3Dc56&c57=yes&v57=D%3Dc57&c62=wpp%7Cldb%7Cm08%7Cm2l%7Cm6i%7Cm1f%7Cmpu%7Cm29%7Cm4t%7Cm80&v62=D%3Dc62&s=1366x768&c=24&j=1.7&v=Y&k=Y&bw=994&bh=649&p=Java%20Applet%20Plug-in%3BQuickTime%20Plug-in%207.7.1%3B&AQE=1"
+        },
+        {
+          "x-c": "ms-4.4.9"
+        },
+        {
+          "expires": "Fri, 02 Nov 2012 13:37:22 GMT"
+        },
+        {
+          "last-modified": "Sun, 04 Nov 2012 13:37:22 GMT"
+        },
+        {
+          "cache-control": "no-cache, no-store, max-age=0, no-transform, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA OUR IND COM NAV STA\""
+        },
+        {
+          "xserver": "www614"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "keep-alive": "timeout=15"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "text/plain"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "cache-control": "max-age=86400"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:02:56 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 09:46:49 GMT"
+        },
+        {
+          "content-length": "2041"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "etag": "\"c82a-4cd8003bbf440\""
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "cache-control": "max-age=86400"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:34:34 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:33:07 GMT"
+        },
+        {
+          "content-length": "5173"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "etag": "\"3ca55-4cd817fe482c0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:22 GMT"
+        },
+        {
+          "server": "Omniture DC/2.0.0"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "set-cookie": "s_vi=[CS]v1|284A8F0905160D8B-600001A1C0108CD4[CE]; Expires=Thu,  2 Nov 2017 13:37:22 GMT; Domain=sa.bbc.com; Path=/"
+        },
+        {
+          "location": "http://sa.bbc.com/b/ss/bbcwglobalprod/1/H.22.1/s0268806509673?AQB=1&pccr=true&vidn=284A8F0905160D8B-600001A1C0108CD4&&ndh=1&t=3%2F10%2F2012%209%3A37%3A21%206%20240&vmt=4F9A739C&vmf=bbc.112.2o7.net&ce=UTF-8&cdp=3&pageName=bbc%20%7C%20homepage&g=http%3A%2F%2Fwww.bbc.co.uk%2F&cc=USD&ch=homepage&events=event2&h1=bbc%7Chomepage&v2=D%3DpageName&c5=INDEX&v5=D%3Dc5&c6=homepage&v6=D%3Dc6&c11=saturday%7C1%3A30pm&c15=%2F&v15=D%3Dc15&c17=bbc%20%7C%20homepage&v17=D%3Dc17&c31=HTML&v31=D%3Dc31&c32=Not%20available&v32=D%3Dc32&v49=Direct%20Load&c53=www.bbc.co.uk&v53=D%3Dc53&c54=http%3A%2F%2Fwww.bbc.co.uk&v54=D%3Dc54&c55=bbc.com&v55=D%3Dc55&c56=D%3DpageName&v56=D%3Dc56&c57=yes&v57=D%3Dc57&c62=wpp%7Cldb%7Cm08%7Cm2l%7Cm6i%7Cm1f%7Cmpu%7Cm29%7Cm4t%7Cm80&v62=D%3Dc62&s=1366x768&c=24&j=1.7&v=Y&k=Y&bw=994&bh=649&p=Java%20Applet%20Plug-in%3BQuickTime%20Plug-in%207.7.1%3B&AQE=1"
+        },
+        {
+          "x-c": "ms-4.4.9"
+        },
+        {
+          "expires": "Fri, 02 Nov 2012 13:37:22 GMT"
+        },
+        {
+          "last-modified": "Sun, 04 Nov 2012 13:37:22 GMT"
+        },
+        {
+          "cache-control": "no-cache, no-store, max-age=0, no-transform, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA OUR IND COM NAV STA\""
+        },
+        {
+          "xserver": "www620"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "keep-alive": "timeout=15"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "etag": "\"50951E12-5F83-53505C0B\""
+        },
+        {
+          "vary": "*"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 10:24:39 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31480349"
+        },
+        {
+          "expires": "Sat, 02 Nov 2013 10:32:40 GMT"
+        },
+        {
+          "content-length": "34963"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Tue, 23 Oct 2012 19:51:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=86400"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 03:52:27 GMT"
+        },
+        {
+          "content-length": "16335"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "etag": "\"4627f-4ccbf4cca7880\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Sat, 17 Nov 2012 13:37:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:21 GMT"
+        },
+        {
+          "content-length": "1140"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "private, no-transform, max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Omniture DC/2.0.0"
+        },
+        {
+          "last-modified": "Mon, 09 Jul 2012 16:00:20 GMT"
+        },
+        {
+          "etag": "\"115240-38-b5f12d00\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "56"
+        },
+        {
+          "cache-control": "max-age=7776000"
+        },
+        {
+          "expires": "Sun, 07 Oct 2012 17:35:44 GMT"
+        },
+        {
+          "xserver": "www465"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:22 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 13:25:41 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=31535948"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 01:59:43 GMT"
+        },
+        {
+          "content-length": "41157"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 15:49:09 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31535796"
+        },
+        {
+          "expires": "Fri, 01 Nov 2013 04:08:52 GMT"
+        },
+        {
+          "content-length": "43495"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "cache-control": "max-age=63072000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Mon, 03 Nov 2014 11:29:44 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 11:15:24 GMT"
+        },
+        {
+          "content-length": "83456"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:57:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=86400"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 11:13:50 GMT"
+        },
+        {
+          "content-length": "18324"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "etag": "\"8c10d-4cd6f66d2d640\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:22 GMT"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 15:44:45 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=86400"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 18:39:25 GMT"
+        },
+        {
+          "content-length": "24118"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:22 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "etag": "\"bae19-4cd48aa479540\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.22 (Unix) mod_ssl/2.2.22 OpenSSL/0.9.7d"
+        },
+        {
+          "cache-control": "max-age=86400"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:01:50 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Fri, 26 Oct 2012 21:25:25 GMT"
+        },
+        {
+          "content-length": "21999"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:22 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "etag": "\"8cfa9-4ccfcf53bbb40\""
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "cache-control": "max-age=86400"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 01:27:36 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 19:32:42 GMT"
+        },
+        {
+          "content-length": "29003"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:22 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "etag": "\"b3983-4cbe1c0594a80\""
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "cache-control": "max-age=86400"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 10:14:22 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:56:52 GMT"
+        },
+        {
+          "content-length": "28742"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "etag": "\"9b7c0-4cd6f64243100\""
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "cache-control": "max-age=31457054"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Sat, 02 Nov 2013 12:04:47 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 11:57:38 GMT"
+        },
+        {
+          "content-length": "24526"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:22 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "etag": "\"3ca55-4cd817fe482c0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "cache-control": "max-age=86400"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 17:24:54 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 14:40:40 GMT"
+        },
+        {
+          "content-length": "45064"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "etag": "\"fcf54-4cd841e9faa00\""
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 03:17:34 GMT"
+        },
+        {
+          "server": "collection8"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID\""
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "public, max-age=604800"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:23 GMT"
+        },
+        {
+          "content-length": "5450"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:24 GMT"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "content-length": "173"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "set-cookie": "v=848381a268c12381e2d991b8bfad50951e1458d396-6634083950951e14834_3366; expires=Sat, 03-Nov-2012 14:07:24 GMT; path=/; domain=.effectivemeasure.net"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "server": "collection10"
+        },
+        {
+          "cache-directive": "no-cache"
+        },
+        {
+          "pragma-directive": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 12 Jul 2011 16:02:59 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "928"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "max-age=27418899"
+        },
+        {
+          "expires": "Mon, 16 Sep 2013 21:59:06 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:27 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 08:26:47 GMT"
+        },
+        {
+          "cache-control": "max-age=62707765"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 08:26:54 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "content-length": "3417"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 08:27:16 GMT"
+        },
+        {
+          "content-length": "2419"
+        },
+        {
+          "cache-control": "max-age=62707751"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 08:26:40 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 08:27:16 GMT"
+        },
+        {
+          "content-length": "1281"
+        },
+        {
+          "cache-control": "max-age=62707783"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 08:27:12 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 08:27:28 GMT"
+        },
+        {
+          "cache-control": "max-age=62707813"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 08:27:42 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "content-length": "56"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Wed, 18 Nov 2009 12:17:02 GMT"
+        },
+        {
+          "content-length": "1275"
+        },
+        {
+          "cache-control": "max-age=345600"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "vary": "X-CDN"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "keep-alive": "timeout=5, max=778"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "application/x-javascript"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 09:35:09 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "content-length": "941"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-cache-action": "MISS"
+        },
+        {
+          "x-cache-age": "0"
+        },
+        {
+          "cache-control": "private, max-age=0, must-revalidate"
+        },
+        {
+          "x-lb-nocache": "true"
+        },
+        {
+          "vary": "X-CDN"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Tue, 22 Nov 2011 09:50:32 GMT"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1409"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "max-age=33813709"
+        },
+        {
+          "expires": "Fri, 29 Nov 2013 22:19:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Tue, 22 Nov 2011 09:39:54 GMT"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3436"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "max-age=33814374"
+        },
+        {
+          "expires": "Fri, 29 Nov 2013 22:30:23 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Tue, 22 Nov 2011 09:31:26 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "348"
+        },
+        {
+          "cache-control": "max-age=33076455"
+        },
+        {
+          "expires": "Thu, 21 Nov 2013 09:31:44 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 12 Jul 2012 11:26:22 GMT"
+        },
+        {
+          "content-length": "3667"
+        },
+        {
+          "cache-control": "max-age=53347413"
+        },
+        {
+          "expires": "Mon, 14 Jul 2014 00:21:02 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 12 Jul 2012 11:26:27 GMT"
+        },
+        {
+          "content-length": "1999"
+        },
+        {
+          "cache-control": "max-age=53214541"
+        },
+        {
+          "expires": "Sat, 12 Jul 2014 11:26:30 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "301"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-type": "text/html; charset=iso-8859-1"
+        },
+        {
+          "location": "http://emp.bbci.co.uk/emp/releases/bump/revisions/905298/embed.js?emp=worldwide&enableClear=1"
+        },
+        {
+          "content-length": "305"
+        },
+        {
+          "cache-control": "max-age=211"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 08:27:21 GMT"
+        },
+        {
+          "cache-control": "max-age=62707796"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 08:27:25 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "content-length": "303"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 08:27:37 GMT"
+        },
+        {
+          "content-length": "4740"
+        },
+        {
+          "cache-control": "max-age=62707822"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 08:27:51 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:37:27 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "91216"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:27 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-cache-action": "MISS"
+        },
+        {
+          "x-cache-age": "0"
+        },
+        {
+          "cache-control": "private, max-age=0, must-revalidate"
+        },
+        {
+          "x-lb-nocache": "true"
+        },
+        {
+          "vary": "X-CDN"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Tue, 09 Oct 2012 17:14:09 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "446"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-cache-action": "MISS"
+        },
+        {
+          "x-cache-age": "0"
+        },
+        {
+          "cache-control": "private, max-age=0, must-revalidate"
+        },
+        {
+          "x-lb-nocache": "true"
+        },
+        {
+          "vary": "X-CDN"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Wed, 28 Jul 2010 11:07:36 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8432"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "max-age=33813771"
+        },
+        {
+          "expires": "Fri, 29 Nov 2013 22:20:20 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Mon, 09 Jul 2012 15:09:23 GMT"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2234"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "max-age=53344068"
+        },
+        {
+          "expires": "Sun, 13 Jul 2014 23:25:17 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Tue, 23 Oct 2012 07:38:38 GMT"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1657"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "max-age=62100138"
+        },
+        {
+          "expires": "Thu, 23 Oct 2014 07:39:47 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 02:43:33 GMT"
+        },
+        {
+          "content-length": "5496"
+        },
+        {
+          "cache-control": "max-age=63033059"
+        },
+        {
+          "expires": "Mon, 03 Nov 2014 02:48:28 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 11:02:09 GMT"
+        },
+        {
+          "content-length": "4994"
+        },
+        {
+          "cache-control": "max-age=63062731"
+        },
+        {
+          "expires": "Mon, 03 Nov 2014 11:03:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "set-cookie": "BGUID=65e0995521ce0199c628d193f15847bbfbb0331236b8ab2579e9db3ae85993f0; expires=Wed, 02-Nov-16 13:37:29 GMT; path=/; domain=bbc.co.uk;"
+        },
+        {
+          "last-modified": "Wed, 01 Mar 2006 15:13:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "cache-control": "max-age=0, no-cache=Set-Cookie"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "keep-alive": "timeout=10, max=182"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "location": "http://emp.bbci.co.uk/emp/releases/bump/revisions/905298/embed.js?emp=worldwide&enableClear=1"
+        },
+        {
+          "content-length": "2628"
+        },
+        {
+          "cache-control": "max-age=166"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:40:15 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 11 Jul 2012 23:13:31 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 00:21:03 GMT"
+        },
+        {
+          "cache-control": "max-age=63024342"
+        },
+        {
+          "expires": "Mon, 03 Nov 2014 00:23:11 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "content-length": "3624"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 00:21:28 GMT"
+        },
+        {
+          "content-length": "4643"
+        },
+        {
+          "cache-control": "max-age=63024320"
+        },
+        {
+          "expires": "Mon, 03 Nov 2014 00:22:49 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 09:22:54 GMT"
+        },
+        {
+          "content-length": "9275"
+        },
+        {
+          "cache-control": "max-age=62711088"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 09:22:17 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 09:22:55 GMT"
+        },
+        {
+          "cache-control": "max-age=62711138"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 09:23:07 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "content-length": "11982"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 11:29:54 GMT"
+        },
+        {
+          "content-length": "5363"
+        },
+        {
+          "cache-control": "max-age=63064402"
+        },
+        {
+          "expires": "Mon, 03 Nov 2014 11:30:52 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Thu, 11 Oct 2012 10:08:24 GMT"
+        },
+        {
+          "etag": "\"3ff-4cbc5c069d600\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Thu, 24 Oct 2013 08:22:26 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1023"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 00:34:55 GMT"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5633"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=63025209"
+        },
+        {
+          "expires": "Mon, 03 Nov 2014 00:37:39 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Wed, 07 Mar 2012 10:43:47 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "7269"
+        },
+        {
+          "cache-control": "max-age=43235623"
+        },
+        {
+          "expires": "Tue, 18 Mar 2014 23:31:12 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 08:20:54 GMT"
+        },
+        {
+          "cache-control": "max-age=62707524"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 08:22:53 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:29 GMT"
+        },
+        {
+          "content-length": "34395"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 09:22:57 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "24217"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "max-age=62711138"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 09:23:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 15:48:27 GMT"
+        },
+        {
+          "content-length": "20316"
+        },
+        {
+          "cache-control": "max-age=63051888"
+        },
+        {
+          "expires": "Mon, 03 Nov 2014 08:02:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 12 Jul 2011 15:59:09 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "31310"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "max-age=27418847"
+        },
+        {
+          "expires": "Mon, 16 Sep 2013 21:58:17 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 12 Jul 2011 15:59:10 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "31708"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "max-age=27418799"
+        },
+        {
+          "expires": "Mon, 16 Sep 2013 21:57:31 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:32 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 12 Jul 2012 10:02:19 GMT"
+        },
+        {
+          "cache-control": "max-age=53347291"
+        },
+        {
+          "expires": "Mon, 14 Jul 2014 00:19:05 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:34 GMT"
+        },
+        {
+          "content-length": "358"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 12 Jul 2011 15:59:09 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5794"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "max-age=27418850"
+        },
+        {
+          "expires": "Mon, 16 Sep 2013 21:58:24 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:34 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 12 Jul 2012 10:02:20 GMT"
+        },
+        {
+          "cache-control": "max-age=53394356"
+        },
+        {
+          "expires": "Mon, 14 Jul 2014 13:23:31 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:35 GMT"
+        },
+        {
+          "content-length": "3759"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Thu, 26 Apr 2012 15:23:19 GMT"
+        },
+        {
+          "etag": "\"453b-4be96914da7c0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Tue, 17 Sep 2013 11:52:07 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3403"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:35 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 12 Jul 2012 10:02:24 GMT"
+        },
+        {
+          "cache-control": "max-age=53487765"
+        },
+        {
+          "expires": "Tue, 15 Jul 2014 15:20:20 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:35 GMT"
+        },
+        {
+          "content-length": "6382"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 09:22:55 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1304"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "max-age=62711132"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 09:23:09 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:37 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:37 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "etag": "\"392d4eaba4ddbcf7bb408352be465c19\""
+        },
+        {
+          "cache-control": "max-age=1728000, private"
+        },
+        {
+          "x-lb-nocache": "true"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "content-length": "286"
+        },
+        {
+          "keep-alive": "timeout=45"
+        },
+        {
+          "connection": "Keep-Alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 09:22:54 GMT"
+        },
+        {
+          "cache-control": "max-age=62711099"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 09:22:36 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:37 GMT"
+        },
+        {
+          "content-length": "5788"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "2410"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:38 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:38 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 01 Jan 2000 00:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.nedstat.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND NAV COM\""
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Thu, 19 Apr 2012 16:34:19 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 23:06:55 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 23:06:55 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "9836"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "52243"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:37 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "etag": "\"392d4eaba4ddbcf7bb408352be465c19\""
+        },
+        {
+          "cache-control": "private, max-age=30"
+        },
+        {
+          "x-lb-nocache": "true"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "content-length": "47"
+        },
+        {
+          "keep-alive": "timeout=45"
+        },
+        {
+          "connection": "Keep-Alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "327"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:38 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Mon, 09 Jul 2012 15:09:22 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "970"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "max-age=52968695"
+        },
+        {
+          "expires": "Wed, 09 Jul 2014 15:09:13 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:38 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Mon, 09 Jul 2012 15:09:21 GMT"
+        },
+        {
+          "content-length": "126"
+        },
+        {
+          "cache-control": "max-age=52968716"
+        },
+        {
+          "expires": "Wed, 09 Jul 2014 15:09:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:38 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 08:27:16 GMT"
+        },
+        {
+          "cache-control": "max-age=62707784"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 08:27:22 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:38 GMT"
+        },
+        {
+          "content-length": "3595"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 08:26:49 GMT"
+        },
+        {
+          "content-length": "1859"
+        },
+        {
+          "cache-control": "max-age=62707757"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 08:26:55 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:38 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "301"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-type": "text/html; charset=iso-8859-1"
+        },
+        {
+          "location": "http://emp.bbci.co.uk/emp/releases/worldwide/revisions/749603_749269_749444_6/embed.js?mediaset=journalism-pc"
+        },
+        {
+          "content-length": "317"
+        },
+        {
+          "cache-control": "max-age=160"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:40:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:38 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 11 Jul 2012 23:13:31 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 09:22:54 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1014"
+        },
+        {
+          "cache-control": "max-age=62711082"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 09:22:20 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:38 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "location": "http://emp.bbci.co.uk/emp/releases/worldwide/revisions/749603_749269_749444_6/embed.js?mediaset=journalism-pc"
+        },
+        {
+          "content-length": "6090"
+        },
+        {
+          "cache-control": "max-age=167"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:40:26 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:39 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 18 Sep 2012 12:56:25 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Thu, 11 Oct 2012 10:08:24 GMT"
+        },
+        {
+          "etag": "\"adb-4cbc5c069d600\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Thu, 24 Oct 2013 08:21:42 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2779"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:38 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/javascript; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-disposition": "attachment"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:40 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "1545"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "2506"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:40 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Tue, 15 Feb 2011 16:39:27 GMT"
+        },
+        {
+          "etag": "\"6414-49c54cec44dc0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Tue, 17 Sep 2013 11:49:13 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "7619"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:39 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 20:42:56 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 15:05:54 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 15:05:54 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "37317"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "81106"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "327"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:40 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Mon, 09 Jul 2012 15:09:22 GMT"
+        },
+        {
+          "cache-control": "max-age=52968720"
+        },
+        {
+          "expires": "Wed, 09 Jul 2014 15:09:38 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:38 GMT"
+        },
+        {
+          "content-length": "36830"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:40 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-length": "359"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "530"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:40 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 08:26:46 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "4729"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "max-age=62707754"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 08:26:54 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 08:27:33 GMT"
+        },
+        {
+          "content-length": "130"
+        },
+        {
+          "cache-control": "max-age=62707807"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 08:27:47 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Nov 2014 13:37:38 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "81990"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:38 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-cache-action": "MISS"
+        },
+        {
+          "x-cache-age": "0"
+        },
+        {
+          "cache-control": "private, max-age=0, must-revalidate"
+        },
+        {
+          "x-lb-nocache": "true"
+        },
+        {
+          "vary": "X-CDN"
+        },
+        {
+          "last-modified": "Wed, 26 Sep 2012 09:35:41 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "server": "nginx/1.2.0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:43 GMT"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "location": "http://ad-emea.doubleclick.net/adj/N2581.122656.2214702362621/B6422491.8;sz=120x30;click0=http://ad.doubleclick.net/click%3Bh%3Dv8/3d22/3/0/%2a/q%3B264679025%3B0-0%3B1%3B49066565%3B47-120/30%3B47423100/47438653/1%3B%3B%7Eokv%3D%3Bslot%3Dpartner_button1%3Bsz%3D120x30%3Bsectn%3Dnews%3Bctype%3Dcontent%3Bnews%3Damerica%3Breferrer%3D%3Bdomain%3Dwww.bbc.co.uk%3Breferrer_domain%3Dwww.bbc.co.uk%3Brsi%3D%3Bheadline%3Dromneypromisesus%2527realchang%3B%7Esscs%3D%3f;ord=835861?"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.2.0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:43 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "483"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:44 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Tue, 15 May 2012 22:04:59 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 16:00:52 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 16:00:52 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "4146"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "77812"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Fri, 11 Mar 2011 22:15:34 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 19:51:36 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 19:51:36 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "3834"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "63968"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "326"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:44 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "212"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:44 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "rts_AAAA=MLuB86QsXkGiDUw6LAw6IpFSRlNUwBT4lFpGQscUZ2EV0HP8; Domain=.revsci.net; Expires=Sun, 03-Nov-2013 13:37:44 GMT; Path=/"
+        },
+        {
+          "x-proc-data": "pd3-bgas06-9"
+        },
+        {
+          "p3p": "policyref=\"http://js.revsci.net/w3c/rsip3p.xml\", CP=\"NON PSA PSD IVA IVD OTP SAM IND UNI PUR COM NAV INT DEM CNT STA PRE OTC HEA\""
+        },
+        {
+          "server": "RSI"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "content-type": "application/javascript;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:44 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:44 GMT"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "content-length": "173"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "set-cookie": "v=1de6548e4a0d3e45a7c991b8bfad50951e1458d396-6634083950951e28834_3366; expires=Sat, 03-Nov-2012 14:07:44 GMT; path=/; domain=.effectivemeasure.net"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "server": "collection10"
+        },
+        {
+          "cache-directive": "no-cache"
+        },
+        {
+          "pragma-directive": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:50 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "P3P - policyref=\"http://www.adfusion.com/w3c/adfusion.xml\", CP=\"NON DSP COR CURa TIA\""
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "location": "http://www.adfusion.com/AdServer/default.aspx?e=i&lid=10641&ct="
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "content-length": "188"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "age": "245581"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:45 GMT"
+        },
+        {
+          "last-modified": "Mon, 14 Nov 2011 18:32:16 GMT"
+        },
+        {
+          "content-length": "4442"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:50 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "P3P - policyref=\"http://www.adfusion.com/w3c/adfusion.xml\", CP=\"NON DSP COR CURa TIA\""
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "location": "http://www.adfusion.com/AdServer/default.aspx?e=i&lid=10641&ct="
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "content-length": "4449"
+        },
+        {
+          "set-cookie": "cid=6f010485-f507-4a4e-a485-feb7619db013; domain=.adfusion.com; expires=Wed, 01-Jan-2020 06:00:00 GMT; path=/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "age": "73519"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:45 GMT"
+        },
+        {
+          "last-modified": "Fri, 20 Apr 2012 15:50:57 GMT"
+        },
+        {
+          "content-length": "1709"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "age": "172785"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:45 GMT"
+        },
+        {
+          "last-modified": "Wed, 22 Aug 2012 17:58:48 GMT"
+        },
+        {
+          "content-length": "4036"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "age": "120980"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:45 GMT"
+        },
+        {
+          "last-modified": "Fri, 02 Dec 2011 21:51:59 GMT"
+        },
+        {
+          "content-length": "4919"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Mon, 09 Jul 2012 15:09:22 GMT"
+        },
+        {
+          "cache-control": "max-age=52968714"
+        },
+        {
+          "expires": "Wed, 09 Jul 2014 15:09:38 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:44 GMT"
+        },
+        {
+          "content-length": "1128"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:44 GMT"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 12 Jul 2011 15:59:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "207"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "max-age=27418929"
+        },
+        {
+          "expires": "Mon, 16 Sep 2013 21:59:53 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:44 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Fri, 26 Oct 2012 19:57:24 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "26021"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=62403629"
+        },
+        {
+          "expires": "Sun, 26 Oct 2014 19:58:14 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:45 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "cache-control": "max-age=300, public, s-maxage=120"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:28 GMT"
+        },
+        {
+          "keep-alive": "timeout=5, max=852"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:42:28 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"8550-4c7d8d79b86c0\""
+        },
+        {
+          "last-modified": "Wed, 22 Aug 2012 11:14:11 GMT"
+        },
+        {
+          "content-length": "12181"
+        },
+        {
+          "connection": "Keep-Alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Wed, 22 Aug 2012 11:14:13 GMT"
+        },
+        {
+          "etag": "\"31a9-4c7d8d7ba0b40\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=300, public, s-maxage=120"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:38:33 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2364"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:46 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-type": "application/json;charset=UTF-8"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "access-control-allow-methods": "POST, GET, PUT, OPTIONS"
+        },
+        {
+          "access-control-allow-headers": "Content-Type, X-Requested-With, *"
+        },
+        {
+          "content-length": "117"
+        },
+        {
+          "cache-control": "max-age=0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:47 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "last-modified": "Wed, 22 Aug 2012 11:14:08 GMT"
+        },
+        {
+          "etag": "\"212e-4c7d8d76dc000\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "expires": "Tue, 17 Sep 2013 11:50:39 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8494"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:47 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:57 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 01 Jan 2000 00:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.nedstat.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND NAV COM\""
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Mon, 09 Jul 2012 15:09:23 GMT"
+        },
+        {
+          "cache-control": "max-age=52968675"
+        },
+        {
+          "expires": "Wed, 09 Jul 2014 15:09:12 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:57 GMT"
+        },
+        {
+          "content-length": "126"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "575"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:58 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "location": "http://mp.apmebf.com/ad/fm/13001-83639-22765-1?mpt=853079&mpvc=http://ad.doubleclick.net/click%3Bh%3Dv8/3d22/3/0/%2a/v%3B264640753%3B0-0%3B0%3B73659506%3B3454-728/90%3B47524155/47539673/1%3B%3B%7Eokv%3D%3Bslot%3Dleaderboard%3Bsz%3D728x90%2C970x66%2C970x90%2C970x250%3Bsectn%3Dnews%3Bctype%3Dcontent%3Bnews%3Dworld%3Breferrer%3Dnewsworlduscanada20104929%3Bdomain%3Dwww.bbc.co.uk%3Breferrer_domain%3Dwww.bbc.co.uk%3Brsi%3D%3Bheadline%3Dbombkillspakistanipolitician%3B%7Esscs%3D%3f&host=altfarm.mediaplex.com"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:58 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:58 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Wed, 01 Mar 2006 15:13:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "cache-control": "max-age=0, no-cache=Set-Cookie"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:37:58 GMT"
+        },
+        {
+          "keep-alive": "timeout=10, max=176"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "341"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:58 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/javascript; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-disposition": "attachment"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:59 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "1387"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 06:50:47 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "4705"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=63047620"
+        },
+        {
+          "expires": "Mon, 03 Nov 2014 06:51:38 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:58 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:59 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR PSAo PSDo OUR IND UNI COM NAV\""
+        },
+        {
+          "set-cookie": "S=g14vo-413-1351949879145-ya; domain=.apmebf.com; path=/; expires=Mon, 03-Nov-2014 13:37:59 GMT"
+        },
+        {
+          "location": "http://altfarm.mediaplex.com/ad/fm/13001-83639-22765-1?mpt=853079&mpvc=http://ad.doubleclick.net/click%3Bh%3Dv8/3d22/3/0/%2a/v%3B264640753%3B0-0%3B0%3B73659506%3B3454-728/90%3B47524155/47539673/1%3B%3B%7Eokv%3D%3Bslot%3Dleaderboard%3Bsz%3D728x90%2C970x66%2C970x90%2C970x250%3Bsectn%3Dnews%3Bctype%3Dcontent%3Bnews%3Dworld%3Breferrer%3Dnewsworlduscanada20104929%3Bdomain%3Dwww.bbc.co.uk%3Breferrer_domain%3Dwww.bbc.co.uk%3Brsi%3D%3Bheadline%3Dbombkillspakistanipolitician%3B%7Esscs%3D%3f&no_cj_c=1&upsid=545485072431"
+        },
+        {
+          "content-length": "711"
+        },
+        {
+          "keep-alive": "timeout=5"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "text/html; charset=iso-8859-1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR PSAo PSDo OUR IND UNI COM NAV\""
+        },
+        {
+          "set-cookie": "mojo3=13001:22765; expires=Sun, 2-Nov-2014 16:28:10 GMT; path=/; domain=.mediaplex.com;"
+        },
+        {
+          "location": "http://img.mediaplex.com/content/0/13001/728x90_090512_MVT_Standard.html?mpck=altfarm.mediaplex.com%2Fad%2Fck%2F13001-83639-22765-1%3Fmpt%3D853079&mpt=853079&mpvc=http://ad.doubleclick.net/click%3Bh%3Dv8/3d22/3/0/%2a/v%3B264640753%3B0-0%3B0%3B73659506%3B3454-728/90%3B47524155/47539673/1%3B%3B%7Eokv%3D%3Bslot%3Dleaderboard%3Bsz%3D728x90%2C970x66%2C970x90%2C970x250%3Bsectn%3Dnews%3Bctype%3Dcontent%3Bnews%3Dworld%3Breferrer%3Dnewsworlduscanada20104929%3Bdomain%3Dwww.bbc.co.uk%3Breferrer_domain%3Dwww.bbc.co.uk%3Brsi%3D%3Bheadline%3Dbombkillspakistanipolitician%3B%7Esscs%3D%3f"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:58 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:59 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Tue, 09 Oct 2012 13:34:50 GMT"
+        },
+        {
+          "etag": "\"a5f202-357-4cba066fe7280\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "1285"
+        },
+        {
+          "keep-alive": "timeout=5"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "text/html; charset=ISO-8859-1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "2518"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:59 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "339"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:59 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 11:26:09 GMT"
+        },
+        {
+          "cache-control": "max-age=63064269"
+        },
+        {
+          "expires": "Mon, 03 Nov 2014 11:29:07 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:58 GMT"
+        },
+        {
+          "content-length": "18429"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "332"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:59 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:59 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-length": "332"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "339"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:59 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:37:55 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "84226"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:55 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-cache-action": "MISS"
+        },
+        {
+          "x-cache-age": "0"
+        },
+        {
+          "cache-control": "private, max-age=0, must-revalidate"
+        },
+        {
+          "x-lb-nocache": "true"
+        },
+        {
+          "vary": "X-CDN"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "expires": "Sat Nov 03 13:37:59 UTC 2012"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "p3p": "CP=\"NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT\""
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-length": "1273"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:59 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "212"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:59 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:05 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "P3P - policyref=\"http://www.adfusion.com/w3c/adfusion.xml\", CP=\"NON DSP COR CURa TIA\""
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "location": "http://www.adfusion.com/AdServer/default.aspx?e=i&lid=10641&ct="
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "content-length": "188"
+        },
+        {
+          "set-cookie": "cid=6f010485-f507-4a4e-a485-feb7619db013; domain=.adfusion.com; expires=Wed, 01-Jan-2020 06:00:00 GMT; path=/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "rts_AAAA=MLuB86QsXkGiDUw6LAw6IpFSRlNUwBT4lNpFQ0QUg4OfFcQQ1VXgXlFGVpIpliI6eB4eKxBjZB19azY=; Domain=.revsci.net; Expires=Sun, 03-Nov-2013 13:38:00 GMT; Path=/"
+        },
+        {
+          "x-proc-data": "pd3-bgas01-1"
+        },
+        {
+          "p3p": "policyref=\"http://js.revsci.net/w3c/rsip3p.xml\", CP=\"NON PSA PSD IVA IVD OTP SAM IND UNI PUR COM NAV INT DEM CNT STA PRE OTC HEA\""
+        },
+        {
+          "server": "RSI"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "content-type": "application/javascript;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:59 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "expires": "Sat Nov 03 13:37:59 UTC 2012"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "p3p": "CP=\"NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT\""
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "7375"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:59 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:05 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "P3P - policyref=\"http://www.adfusion.com/w3c/adfusion.xml\", CP=\"NON DSP COR CURa TIA\""
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "location": "http://www.adfusion.com/AdServer/default.aspx?e=i&lid=10641&ct="
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "content-length": "4449"
+        },
+        {
+          "set-cookie": "cid=6f010485-f507-4a4e-a485-feb7619db013; domain=.adfusion.com; expires=Wed, 01-Jan-2020 06:00:00 GMT; path=/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "56812"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:45:03 GMT"
+        },
+        {
+          "server": "Apache/2.2.3 (CentOS)"
+        },
+        {
+          "last-modified": "Sat, 18 Aug 2012 06:04:35 GMT"
+        },
+        {
+          "etag": "\"5d0aba4-ddec-4c7840d06c2c0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=3600"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:45:03 GMT"
+        },
+        {
+          "x-permitted-cross-domain-policies": "all"
+        },
+        {
+          "age": "3177"
+        },
+        {
+          "x-amz-cf-id": "Nqvl7hdh1ZID-spjM3MSj_rmvJrOblt2qYh9QKaP4AUq-J79-UBaKg=="
+        },
+        {
+          "via": "1.0 f9710778d388f0645feb35b6ec48d316.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:00 GMT"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "content-length": "173"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "set-cookie": "v=51bfcbb530581eaf84e991b8bfad50951e1458d396-6634083950951e38834_3366; expires=Sat, 03-Nov-2012 14:08:00 GMT; path=/; domain=.effectivemeasure.net"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "server": "collection10"
+        },
+        {
+          "cache-directive": "no-cache"
+        },
+        {
+          "pragma-directive": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:37:59 GMT"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-type": "application/json;charset=UTF-8"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "access-control-allow-methods": "POST, GET, PUT, OPTIONS"
+        },
+        {
+          "access-control-allow-headers": "Content-Type, X-Requested-With, *"
+        },
+        {
+          "content-length": "111"
+        },
+        {
+          "cache-control": "max-age=31"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:00 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 08:27:19 GMT"
+        },
+        {
+          "cache-control": "max-age=62707764"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 08:27:30 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:06 GMT"
+        },
+        {
+          "content-length": "297"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:06 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Wed, 01 Mar 2006 15:13:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "cache-control": "max-age=0, no-cache=Set-Cookie"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:38:06 GMT"
+        },
+        {
+          "keep-alive": "timeout=10, max=162"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 12 Jul 2012 10:02:19 GMT"
+        },
+        {
+          "cache-control": "max-age=53487737"
+        },
+        {
+          "expires": "Tue, 15 Jul 2014 15:20:24 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "content-length": "7969"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 16:22:37 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "4852"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=62995766"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 16:27:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 23:13:05 GMT"
+        },
+        {
+          "content-length": "6548"
+        },
+        {
+          "cache-control": "max-age=63020343"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 23:17:10 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 08:04:19 GMT"
+        },
+        {
+          "cache-control": "max-age=62880339"
+        },
+        {
+          "expires": "Sat, 01 Nov 2014 08:23:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "content-length": "4144"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 14:00:52 GMT"
+        },
+        {
+          "content-length": "3761"
+        },
+        {
+          "cache-control": "max-age=62901025"
+        },
+        {
+          "expires": "Sat, 01 Nov 2014 14:08:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 18:22:05 GMT"
+        },
+        {
+          "content-length": "6600"
+        },
+        {
+          "cache-control": "max-age=62916820"
+        },
+        {
+          "expires": "Sat, 01 Nov 2014 18:31:47 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "454"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 14:39:26 GMT"
+        },
+        {
+          "content-length": "6851"
+        },
+        {
+          "cache-control": "max-age=62989321"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 14:40:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 25 Oct 2012 11:27:56 GMT"
+        },
+        {
+          "content-length": "5411"
+        },
+        {
+          "cache-control": "max-age=62320782"
+        },
+        {
+          "expires": "Sat, 25 Oct 2014 20:57:49 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "location": "http://img.mediaplex.com/content/0/18916/LT_XML_RateTable_ScrollingHeadline_PurpleArrows_RecordLows_728x90_050112.js?mpck=altfarm.mediaplex.com%2Fad%2Fck%2F18916-133472-32866-8%3Fmpt%3D862767&mpt=862767&mpvc=http://ad.doubleclick.net/click%3Bh%3Dv8/3d22/3/0/%2a/o%3B264441578%3B0-0%3B0%3B19196826%3B3454-728/90%3B49903581/49895429/1%3B%3B%7Eokv%3D%3Bslot%3Dleaderboard%3Bsz%3D728x90%2C970x66%2C970x90%2C970x250%3Bsectn%3Dnews%3Bctype%3Dindex%3Bnews%3Dworld%3Breferrer%3Dnewsworldasia20190337%3Bdomain%3Dwww.bbc.co.uk%3Breferrer_domain%3Dwww.bbc.co.uk%3Brsi%3DJ08781_10132%3Brsi%3DJ08781_10628%3B%7Esscs%3D%3f"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR PSAo PSDo OUR IND UNI COM NAV\""
+        },
+        {
+          "set-cookie": "mojo3=18916:32866/13001:22765; expires=Sun, 2-Nov-2014 16:53:09 GMT; path=/; domain=.mediaplex.com;"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 01 Jan 2000 00:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.nedstat.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND NAV COM\""
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Tue, 01 May 2012 19:15:40 GMT"
+        },
+        {
+          "etag": "\"2119c1-1526-4befe65754f00\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "6980"
+        },
+        {
+          "keep-alive": "timeout=5"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "application/x-javascript"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:38:05 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "90666"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:05 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-cache-action": "MISS"
+        },
+        {
+          "x-cache-age": "0"
+        },
+        {
+          "cache-control": "private, max-age=0, must-revalidate"
+        },
+        {
+          "x-lb-nocache": "true"
+        },
+        {
+          "vary": "X-CDN"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Wed, 19 Oct 2011 07:28:39 GMT"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "18359"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=52349338"
+        },
+        {
+          "expires": "Wed, 02 Jul 2014 11:07:05 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 18:19:24 GMT"
+        },
+        {
+          "cache-control": "max-age=63002534"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 18:20:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "content-length": "5791"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 09:30:47 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5035"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=63057300"
+        },
+        {
+          "expires": "Mon, 03 Nov 2014 09:33:07 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 06:55:42 GMT"
+        },
+        {
+          "cache-control": "max-age=62961571"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 06:57:38 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "content-length": "6266"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 15:53:37 GMT"
+        },
+        {
+          "content-length": "4757"
+        },
+        {
+          "cache-control": "max-age=62820986"
+        },
+        {
+          "expires": "Fri, 31 Oct 2014 15:54:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 09:01:42 GMT"
+        },
+        {
+          "cache-control": "max-age=62882710"
+        },
+        {
+          "expires": "Sat, 01 Nov 2014 09:03:17 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "content-length": "5396"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:09:30 GMT"
+        },
+        {
+          "content-length": "4759"
+        },
+        {
+          "cache-control": "max-age=62965934"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 08:10:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 13:24:17 GMT"
+        },
+        {
+          "content-length": "3202"
+        },
+        {
+          "cache-control": "max-age=62989607"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 14:44:54 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 13:01:25 GMT"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "4022"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=62983627"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 13:05:15 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:08 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 08:54:55 GMT"
+        },
+        {
+          "cache-control": "max-age=62970180"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 09:21:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:08 GMT"
+        },
+        {
+          "content-length": "4853"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 13:44:04 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3289"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "max-age=62901702"
+        },
+        {
+          "expires": "Sat, 01 Nov 2014 14:19:50 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:08 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 16:55:01 GMT"
+        },
+        {
+          "content-length": "7105"
+        },
+        {
+          "cache-control": "max-age=62911093"
+        },
+        {
+          "expires": "Sat, 01 Nov 2014 16:56:20 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 14 Sep 2012 07:57:36 GMT"
+        },
+        {
+          "cache-control": "max-age=58732357"
+        },
+        {
+          "expires": "Sun, 14 Sep 2014 08:10:45 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:08 GMT"
+        },
+        {
+          "content-length": "3960"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Tue, 21 Aug 2012 07:36:37 GMT"
+        },
+        {
+          "content-length": "3948"
+        },
+        {
+          "cache-control": "max-age=56656721"
+        },
+        {
+          "expires": "Thu, 21 Aug 2014 07:36:49 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:08 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Thu, 09 Mar 2006 21:32:31 GMT"
+        },
+        {
+          "etag": "\"9f40d-3a-40e969d2259c0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:08 GMT"
+        },
+        {
+          "content-length": "63"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Mon, 05 Mar 2012 12:15:23 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "59958"
+        },
+        {
+          "cache-control": "max-age=42071869"
+        },
+        {
+          "expires": "Wed, 05 Mar 2014 12:15:56 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "pragma": ""
+        },
+        {
+          "content-length": "479"
+        },
+        {
+          "cache-control": "max-age=30"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:08 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "2493"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:09 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "321"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:09 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:09 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-length": "363"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "212"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:09 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:14 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "P3P - policyref=\"http://www.adfusion.com/w3c/adfusion.xml\", CP=\"NON DSP COR CURa TIA\""
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "location": "http://www.adfusion.com/AdServer/default.aspx?e=i&lid=10641&ct="
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "content-length": "188"
+        },
+        {
+          "set-cookie": "cid=6f010485-f507-4a4e-a485-feb7619db013; domain=.adfusion.com; expires=Wed, 01-Jan-2020 06:00:00 GMT; path=/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:14 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "P3P - policyref=\"http://www.adfusion.com/w3c/adfusion.xml\", CP=\"NON DSP COR CURa TIA\""
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "location": "http://www.adfusion.com/AdServer/default.aspx?e=i&lid=10641&ct="
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "content-length": "4449"
+        },
+        {
+          "set-cookie": "cid=6f010485-f507-4a4e-a485-feb7619db013; domain=.adfusion.com; expires=Wed, 01-Jan-2020 06:00:00 GMT; path=/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/javascript; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-disposition": "attachment"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:09 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "1396"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "rts_AAAA=MLuBg59Xwl/EEO1FURBA3cAlgmns+ZjtUnj+OABraDN8bCZzDmjhJGhbKAxEWBcNLyPWU8lPaSzTe300; Domain=.revsci.net; Expires=Sun, 03-Nov-2013 13:38:09 GMT; Path=/"
+        },
+        {
+          "x-proc-data": "pd3-bgas04-1"
+        },
+        {
+          "p3p": "policyref=\"http://js.revsci.net/w3c/rsip3p.xml\", CP=\"NON PSA PSD IVA IVD OTP SAM IND UNI PUR COM NAV INT DEM CNT STA PRE OTC HEA\""
+        },
+        {
+          "server": "RSI"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "content-type": "application/javascript;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:09 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:09 GMT"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "content-length": "173"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "set-cookie": "v=d12d53fe4bd39099b1d991b8bfad50951e1458d396-6634083950951e41834_3366; expires=Sat, 03-Nov-2012 14:08:09 GMT; path=/; domain=.effectivemeasure.net"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "server": "collection10"
+        },
+        {
+          "cache-directive": "no-cache"
+        },
+        {
+          "pragma-directive": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Mon, 09 Jul 2012 15:09:21 GMT"
+        },
+        {
+          "cache-control": "max-age=52968683"
+        },
+        {
+          "expires": "Wed, 09 Jul 2014 15:09:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:09 GMT"
+        },
+        {
+          "content-length": "11937"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:09 GMT"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 08:26:43 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1594"
+        },
+        {
+          "cache-control": "max-age=62707699"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 08:26:28 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Mon, 16 Jul 2012 20:54:14 GMT"
+        },
+        {
+          "etag": "\"6d6c23-816c-4c4f8a1e64980\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "33132"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:08 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:22 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 01 Jan 2000 00:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.nedstat.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND NAV COM\""
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "317"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "1222"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR BUS OTC\""
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "4631"
+        },
+        {
+          "set-cookie": "PRpc=|HrYvHDG1:1|#;domain=ads.pointroll.com; path=/; expires=Mon, 03-Nov-2014 13:38:23 GMT;"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 12:33:21 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "17839"
+        },
+        {
+          "cache-control": "max-age=62987851"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 14:15:53 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:22 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 02:51:54 GMT"
+        },
+        {
+          "cache-control": "max-age=62946923"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 02:53:45 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:22 GMT"
+        },
+        {
+          "content-length": "4827"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 15:48:41 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5891"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=62993480"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 15:49:42 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:22 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 10:44:04 GMT"
+        },
+        {
+          "content-length": "3664"
+        },
+        {
+          "cache-control": "max-age=62975317"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 10:46:59 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:22 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 13:08:31 GMT"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5589"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=62813487"
+        },
+        {
+          "expires": "Fri, 31 Oct 2014 13:49:49 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:22 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 11:47:26 GMT"
+        },
+        {
+          "content-length": "6787"
+        },
+        {
+          "cache-control": "max-age=62806355"
+        },
+        {
+          "expires": "Fri, 31 Oct 2014 11:50:57 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:22 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Wed, 01 Mar 2006 15:13:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "cache-control": "max-age=0, no-cache=Set-Cookie"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "keep-alive": "timeout=10, max=150"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:22 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "cache-control": "private, max-age=30"
+        },
+        {
+          "x-lb-nocache": "true"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "content-length": "47"
+        },
+        {
+          "keep-alive": "timeout=45"
+        },
+        {
+          "connection": "Keep-Alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "1232"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR BUS OTC\""
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "4657"
+        },
+        {
+          "set-cookie": "PRpc=|HrYwHDG0:1|HrYvHDG1:1|#;domain=ads.pointroll.com; path=/; expires=Mon, 03-Nov-2014 13:38:23 GMT;"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Thu, 25 Oct 2012 12:54:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "6289"
+        },
+        {
+          "cache-control": "max-age=62291861"
+        },
+        {
+          "expires": "Sat, 25 Oct 2014 12:56:04 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 05:59:50 GMT"
+        },
+        {
+          "cache-control": "max-age=62871966"
+        },
+        {
+          "expires": "Sat, 01 Nov 2014 06:04:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "content-length": "4071"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 09:39:39 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "6862"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=62885045"
+        },
+        {
+          "expires": "Sat, 01 Nov 2014 09:42:28 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Mon, 24 Sep 2012 12:45:46 GMT"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "4014"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=59612845"
+        },
+        {
+          "expires": "Wed, 24 Sep 2014 12:45:48 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "360"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 05:12:35 GMT"
+        },
+        {
+          "content-length": "6772"
+        },
+        {
+          "cache-control": "max-age=62955857"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 05:22:40 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-length": "548"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "545"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "545"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Tue, 01 Feb 2011 16:45:17 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 19:49:21 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 19:49:21 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "4447"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "64143"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Tue, 25 Sep 2012 20:37:11 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 20:14:54 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 20:14:54 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "2993"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "62610"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:38:21 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "103860"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-cache-action": "MISS"
+        },
+        {
+          "x-cache-age": "0"
+        },
+        {
+          "cache-control": "private, max-age=0, must-revalidate"
+        },
+        {
+          "x-lb-nocache": "true"
+        },
+        {
+          "vary": "X-CDN"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 18:53:42 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 21:59:32 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 21:59:32 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "5619"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "56332"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 18:54:38 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 21:59:33 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 21:59:33 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "5379"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "56331"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "server": "GFE/2.0"
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "location": "http://s0.2mdn.net/viewad/2179194/1-1x1.gif"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "GFE/2.0"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "location": "http://s0.2mdn.net/viewad/2179194/1-1x1.gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Fri, 05 Nov 2010 18:11:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 08:14:05 GMT"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:14:05 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "19459"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR BUS OTC\""
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "content-type": "text/plain"
+        },
+        {
+          "content-length": "3528"
+        },
+        {
+          "cache-control": "private, max-age=506694"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/javascript; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-disposition": "attachment"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "882"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 07:32:16 GMT"
+        },
+        {
+          "cache-control": "max-age=62963730"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 07:33:53 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "content-length": "6112"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 02:53:00 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "6904"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=62947059"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 02:56:02 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 23:54:38 GMT"
+        },
+        {
+          "content-length": "6467"
+        },
+        {
+          "cache-control": "max-age=62677369"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 00:01:12 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 01:56:44 GMT"
+        },
+        {
+          "content-length": "5790"
+        },
+        {
+          "cache-control": "max-age=62943937"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 02:04:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Thu, 15 Dec 2011 11:42:59 GMT"
+        },
+        {
+          "content-length": "13166"
+        },
+        {
+          "cache-control": "max-age=60312573"
+        },
+        {
+          "expires": "Thu, 02 Oct 2014 15:07:56 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 19:47:01 GMT"
+        },
+        {
+          "content-length": "6715"
+        },
+        {
+          "cache-control": "max-age=63007794"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 19:48:17 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "42"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "Sun, 05-Jun-2005 22:00:00 GMT"
+        },
+        {
+          "set-cookie": "u2=0c1d5772-7a75-4913-9e34-91b1ec36e6763Qv0b0; expires=Fri, 01-Feb-2013 09:38:24 GMT; domain=.serving-sys.com; path=/"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"NOI DEVa OUR BUS UNI\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "2370"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "location": "http://s0.2mdn.net/viewad/2179194/1-1x1.gif"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Nov 2014 13:38:24 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "17960"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "x-cache-action": "MISS"
+        },
+        {
+          "x-cache-age": "0"
+        },
+        {
+          "cache-control": "max-age=63072000"
+        },
+        {
+          "x-lb-nocache": "true"
+        },
+        {
+          "vary": "X-CDN"
+        },
+        {
+          "last-modified": "Mon, 08 Nov 2010 14:53:56 GMT"
+        },
+        {
+          "keep-alive": "timeout=5, max=713"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 24 May 2012 20:52:06 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 20:45:30 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 20:45:30 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "18377"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "60774"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "rts_AAAA=MLuBg59Xwl/EEO1FURBA3cAlgmns+ZhxgFZ2Xd28p4N8+qai9qH+vXEtJkM6N3AzKCRseBomFyz6/H0m; Domain=.revsci.net; Expires=Sun, 03-Nov-2013 13:38:24 GMT; Path=/"
+        },
+        {
+          "x-proc-data": "pd3-bgas09-1"
+        },
+        {
+          "p3p": "policyref=\"http://js.revsci.net/w3c/rsip3p.xml\", CP=\"NON PSA PSD IVA IVD OTP SAM IND UNI PUR COM NAV INT DEM CNT STA PRE OTC HEA\""
+        },
+        {
+          "server": "RSI"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "content-type": "application/javascript;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Mon, 08 Nov 2010 14:53:48 GMT"
+        },
+        {
+          "content-length": "17610"
+        },
+        {
+          "cache-control": "max-age=63072000"
+        },
+        {
+          "expires": "Mon, 03 Nov 2014 13:38:23 GMT"
+        },
+        {
+          "vary": "X-CDN"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "keep-alive": "timeout=5, max=793"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "server": "Omniture DC/2.0.0"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "set-cookie": "s_vi=[CS]v1|284A8F0905160D8B-600001A1C0108CD4[CE]; Expires=Thu,  2 Nov 2017 13:38:24 GMT; Domain=sa.bbc.com; Path=/"
+        },
+        {
+          "x-c": "ms-4.4.9"
+        },
+        {
+          "expires": "Fri, 02 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "last-modified": "Sun, 04 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "cache-control": "no-cache, no-store, max-age=0, no-transform, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "etag": "\"50951E50-1A84-669E56BC\""
+        },
+        {
+          "vary": "*"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA OUR IND COM NAV STA\""
+        },
+        {
+          "xserver": "www665"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "keep-alive": "timeout=15"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 00:08:06 GMT"
+        },
+        {
+          "cache-control": "max-age=62937399"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 00:15:03 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "content-length": "7180"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 15:54:41 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "4902"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=62848278"
+        },
+        {
+          "expires": "Fri, 31 Oct 2014 23:29:42 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 23:33:51 GMT"
+        },
+        {
+          "content-length": "3930"
+        },
+        {
+          "cache-control": "max-age=62935245"
+        },
+        {
+          "expires": "Sat, 01 Nov 2014 23:39:09 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "content-length": "173"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "set-cookie": "v=72911efde47ed7df994991b8bfad50951e1458d396-6634083950951e50834_3366; expires=Sat, 03-Nov-2012 14:08:24 GMT; path=/; domain=.effectivemeasure.net"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "server": "collection10"
+        },
+        {
+          "cache-directive": "no-cache"
+        },
+        {
+          "pragma-directive": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 23:02:53 GMT"
+        },
+        {
+          "content-length": "3589"
+        },
+        {
+          "cache-control": "max-age=62846973"
+        },
+        {
+          "expires": "Fri, 31 Oct 2014 23:07:57 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR BUS OTC\""
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "content-type": "text/plain"
+        },
+        {
+          "content-length": "15586"
+        },
+        {
+          "cache-control": "private, max-age=506675"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-length": "20151"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 25 Oct 2012 17:13:44 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"0544416d4b2cd1:b56\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR BUS OTC\""
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Mon, 05 Mar 2012 12:20:37 GMT"
+        },
+        {
+          "cache-control": "max-age=42072135"
+        },
+        {
+          "expires": "Wed, 05 Mar 2014 12:20:37 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:22 GMT"
+        },
+        {
+          "content-length": "59958"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 08:26:48 GMT"
+        },
+        {
+          "cache-control": "max-age=62707710"
+        },
+        {
+          "expires": "Thu, 30 Oct 2014 08:26:54 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "content-length": "189"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Fri, 26 Oct 2012 15:18:41 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5471"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=62387032"
+        },
+        {
+          "expires": "Sun, 26 Oct 2014 15:22:16 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 15 Nov 2011 09:49:33 GMT"
+        },
+        {
+          "content-length": "3645"
+        },
+        {
+          "cache-control": "max-age=59275525"
+        },
+        {
+          "expires": "Sat, 20 Sep 2014 15:03:49 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 01:30:29 GMT"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5937"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "max-age=62942201"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 01:35:04 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 17:42:14 GMT"
+        },
+        {
+          "cache-control": "max-age=63000297"
+        },
+        {
+          "expires": "Sun, 02 Nov 2014 17:43:20 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "content-length": "6807"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "x-pad": "avoid browser bug"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 23:03:40 GMT"
+        },
+        {
+          "content-length": "4382"
+        },
+        {
+          "cache-control": "max-age=62846946"
+        },
+        {
+          "expires": "Fri, 31 Oct 2014 23:07:30 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 23:49:59 GMT"
+        },
+        {
+          "content-length": "5299"
+        },
+        {
+          "cache-control": "max-age=62768266"
+        },
+        {
+          "expires": "Fri, 31 Oct 2014 01:16:10 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:24 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:26 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR BUS OTC\""
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "content-length": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-type": "text/plain; charset=utf-8"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:26 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR BUS OTC\""
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "content-length": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-type": "text/plain; charset=utf-8"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-length": "29965"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 25 Oct 2012 17:12:34 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"02d8becd3b2cd1:b56\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR BUS OTC\""
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:31 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR BUS OTC\""
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "content-length": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-type": "text/plain; charset=utf-8"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:31 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 01 Jan 2000 00:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.nedstat.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND NAV COM\""
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:31 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Wed, 01 Mar 2006 15:13:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "cache-control": "max-age=0, no-cache=Set-Cookie"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:38:31 GMT"
+        },
+        {
+          "keep-alive": "timeout=10, max=91"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "312"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:32 GMT"
+        },
+        {
+          "location": "http://s0.2mdn.net/viewad/2179194/1-1x1.gif"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "1216"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:32 GMT"
+        },
+        {
+          "location": "http://s0.2mdn.net/viewad/2179194/1-1x1.gif"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:32 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR BUS OTC\""
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "4631"
+        },
+        {
+          "set-cookie": "PRpc=|HrYwHDG0:1|HrYvHDG1:2|#;domain=ads.pointroll.com; path=/; expires=Mon, 03-Nov-2014 13:38:32 GMT;"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "322"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:33 GMT"
+        },
+        {
+          "location": "http://s0.2mdn.net/viewad/2179194/1-1x1.gif"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 20 Jul 2012 11:50:26 GMT"
+        },
+        {
+          "cache-control": "max-age=53907180"
+        },
+        {
+          "expires": "Sun, 20 Jul 2014 11:51:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:32 GMT"
+        },
+        {
+          "content-length": "2149"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/javascript; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-disposition": "attachment"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:33 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "1660"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "609"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:33 GMT"
+        },
+        {
+          "location": "http://s0.2mdn.net/viewad/2179194/1-1x1.gif"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-msadid": "291301914"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:32 GMT"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-length": "2882"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:33 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "320"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:33 GMT"
+        },
+        {
+          "location": "http://s0.2mdn.net/viewad/2179194/1-1x1.gif"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "50"
+        },
+        {
+          "allow": "GET"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 10:23:48 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:33 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "server": "nginx/0.8.54"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:26 GMT"
+        },
+        {
+          "content-type": "application/xml"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "set-cookie": "pixel_f52666608=1; Domain=.dimestore.com; Expires=Sun, 03-Nov-2013 13:38:26 GMT"
+        },
+        {
+          "location": "http://content.dimestore.com/pixel.gif"
+        },
+        {
+          "content-length": "0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:38:30 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "91710"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-cache-action": "MISS"
+        },
+        {
+          "x-cache-age": "0"
+        },
+        {
+          "cache-control": "private, max-age=0, must-revalidate"
+        },
+        {
+          "x-lb-nocache": "true"
+        },
+        {
+          "vary": "X-CDN"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "538"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:33 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "356"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:33 GMT"
+        },
+        {
+          "location": "http://s0.2mdn.net/viewad/2179194/1-1x1.gif"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "539"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:33 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:33 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-length": "545"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "location": "http://s0.2mdn.net/viewad/2179194/1-1x1.gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:34 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR BUS OTC\""
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "content-length": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-type": "text/plain; charset=utf-8"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "server": "GFE/2.0"
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:33 GMT"
+        },
+        {
+          "location": "http://s0.2mdn.net/viewad/2179194/1-1x1.gif"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "321"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:34 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:33 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "GFE/2.0"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "location": "http://s0.2mdn.net/viewad/2179194/1-1x1.gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "18600"
+        },
+        {
+          "allow": "GET"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:03:01 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:34 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "42"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "Sun, 05-Jun-2005 22:00:00 GMT"
+        },
+        {
+          "set-cookie": "u2=0c1d5772-7a75-4913-9e34-91b1ec36e6763Qv0bg; expires=Fri, 01-Feb-2013 09:38:34 GMT; domain=.serving-sys.com; path=/"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"NOI DEVa OUR BUS UNI\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:33 GMT"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "245"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:34 GMT"
+        },
+        {
+          "location": "http://s0.2mdn.net/viewad/2179194/1-1x1.gif"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/0.6.35"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "49"
+        },
+        {
+          "last-modified": "Fri, 05 Aug 2011 18:45:32 GMT"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:34 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:35 GMT"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Wed, 19 Sep 2012 23:30:39 GMT"
+        },
+        {
+          "etag": "\"bed15b-d00-4ca1664f965c0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "3328"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR DEVa TAIa OUR BUS UNI\""
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:35 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:37 GMT"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "set-cookie": "BMX_3PC=1; path=/; domain=.voicefive.com;"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI COR NID CUR DEV TAI PSA IVA OUR STA UNI NAV INT\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "vary": "User-Agent,Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8240"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR DEVa TAIa OUR BUS UNI\""
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:38:37 GMT"
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:37 GMT"
+        },
+        {
+          "content-length": "392"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "set-cookie": "CMDD=AAIWeQE*;domain=casalemedia.com;path=/;expires=Sun, 04 Nov 2012 13:38:37 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "rts_AAAA=MLuBg59Xwl/EEO1FURBA3cAlgmns+bAxJsyTL2hw/WD8n92ZW/I4JwcH7E4ANXFCKgXlxsjUzY2F7dfMxN21mUJt+5Zxhw==; Domain=.revsci.net; Expires=Sun, 03-Nov-2013 13:38:37 GMT; Path=/"
+        },
+        {
+          "x-proc-data": "pd3-bgas02-1"
+        },
+        {
+          "p3p": "policyref=\"http://js.revsci.net/w3c/rsip3p.xml\", CP=\"NON PSA PSD IVA IVD OTP SAM IND UNI PUR COM NAV INT DEM CNT STA PRE OTC HEA\""
+        },
+        {
+          "server": "RSI"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "content-type": "application/javascript;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:37 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:37 GMT"
+        },
+        {
+          "server": "Omniture DC/2.0.0"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "set-cookie": "s_vi=[CS]v1|284A8F0905160D8B-600001A1C0108CD4[CE]; Expires=Thu,  2 Nov 2017 13:38:37 GMT; Domain=sa.bbc.com; Path=/"
+        },
+        {
+          "x-c": "ms-4.4.9"
+        },
+        {
+          "expires": "Fri, 02 Nov 2012 13:38:37 GMT"
+        },
+        {
+          "last-modified": "Sun, 04 Nov 2012 13:38:37 GMT"
+        },
+        {
+          "cache-control": "no-cache, no-store, max-age=0, no-transform, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "etag": "\"50951E5D-2288-2D7FF956\""
+        },
+        {
+          "vary": "*"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA OUR IND COM NAV STA\""
+        },
+        {
+          "xserver": "www381"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "keep-alive": "timeout=15"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:37 GMT"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "content-length": "173"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "set-cookie": "v=b90bb042855f902565c991b8bfad50951e1458d396-6634083950951e5d834_3366; expires=Sat, 03-Nov-2012 14:08:37 GMT; path=/; domain=.effectivemeasure.net"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "server": "collection10"
+        },
+        {
+          "cache-directive": "no-cache"
+        },
+        {
+          "pragma-directive": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:37 GMT"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache/2.2.19 (Unix)"
+        },
+        {
+          "content-type": "application/json;charset=UTF-8"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "access-control-allow-methods": "POST, GET, PUT, OPTIONS"
+        },
+        {
+          "access-control-allow-headers": "Content-Type, X-Requested-With, *"
+        },
+        {
+          "content-length": "112"
+        },
+        {
+          "cache-control": "max-age=17"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:37 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Fri, 24 Jun 2005 22:51:33 GMT"
+        },
+        {
+          "etag": "\"fec19c-1b-3fa51a4b8c740\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR DEVa TAIa OUR BUS UNI\""
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "38"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:37 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 15:55:36 GMT"
+        },
+        {
+          "etag": "\"4016f-8a-4cca7e25a0e00\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR DEVa TAIa OUR BUS UNI\""
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "135"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:38 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "273"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:38 GMT"
+        },
+        {
+          "location": "http://s0.2mdn.net/viewad/2179194/1-1x1.gif"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:38:38 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:41 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR BUS OTC\""
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "content-length": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-type": "text/plain; charset=utf-8"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_24.json b/jetty-http2/http2-hpack/src/test/resources/data/story_24.json
new file mode 100644
index 0000000..c294895
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_24.json
@@ -0,0 +1,1187 @@
+{
+  "context": "response",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "content-type": "text/html; charset=iso-8859-1"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "location": "http://www.craigslist.org/about/sites/"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:34:16 GMT"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "public, max-age=14400"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 10:03:45 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 10:03:45 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "10344"
+        },
+        {
+          "content-type": "text/html; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 10:03:45 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "max-age=2592000, public"
+        },
+        {
+          "last-modified": "Tue, 16 Oct 2012 22:03:00 GMT"
+        },
+        {
+          "date": "Tue, 16 Oct 2012 22:03:00 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "1099"
+        },
+        {
+          "content-type": "text/css; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Thu, 15 Nov 2012 22:03:00 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "max-age=15, public"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:33:59 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:33:59 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "6344"
+        },
+        {
+          "content-type": "text/javascript; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:34:14 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "max-age=2592000, public"
+        },
+        {
+          "last-modified": "Tue, 09 Oct 2012 06:13:28 GMT"
+        },
+        {
+          "date": "Tue, 09 Oct 2012 06:13:28 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "28017"
+        },
+        {
+          "content-type": "text/javascript; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 06:13:28 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "last-modified": "Mon, 23 Jun 2008 23:06:11 GMT"
+        },
+        {
+          "cache-control": "public, max-age=315360000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Tue, 09 Oct 2012 05:33:00 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "1150"
+        },
+        {
+          "content-type": "text/plain"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Fri, 07 Oct 2022 05:33:00 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "max-age=3600, public"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 12:36:54 GMT"
+        },
+        {
+          "set-cookie": "cl_def_hp=shoals; domain=.craigslist.org; path=/; expires=Sun, 03-Nov-13 12:36:54 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:36:54 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "6245"
+        },
+        {
+          "content-type": "text/html; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:36:54 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "max-age=2592000, public"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 20:53:37 GMT"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 20:53:37 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "6047"
+        },
+        {
+          "content-type": "text/css; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 01 Dec 2012 20:53:37 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "max-age=2592000, public"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 20:53:17 GMT"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 20:53:17 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "6344"
+        },
+        {
+          "content-type": "text/javascript; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 01 Dec 2012 20:53:17 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "max-age=2592000, public"
+        },
+        {
+          "last-modified": "Tue, 09 Oct 2012 06:01:51 GMT"
+        },
+        {
+          "date": "Tue, 09 Oct 2012 06:01:51 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "473"
+        },
+        {
+          "content-type": "text/javascript; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 06:01:51 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "max-age=2592000, public"
+        },
+        {
+          "last-modified": "Tue, 09 Oct 2012 06:01:55 GMT"
+        },
+        {
+          "date": "Tue, 09 Oct 2012 06:01:55 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "28017"
+        },
+        {
+          "content-type": "text/javascript; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 06:01:55 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "last-modified": "Mon, 23 Jun 2008 23:06:11 GMT"
+        },
+        {
+          "cache-control": "public, max-age=315360000"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Tue, 09 Oct 2012 05:33:00 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "1150"
+        },
+        {
+          "content-type": "text/plain"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Fri, 07 Oct 2022 05:33:00 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "public, max-age=600"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:34:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:34:21 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "9660"
+        },
+        {
+          "content-type": "text/html; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:49:21 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "max-age=2592000, public"
+        },
+        {
+          "last-modified": "Tue, 09 Oct 2012 06:21:38 GMT"
+        },
+        {
+          "date": "Tue, 09 Oct 2012 06:21:38 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "225"
+        },
+        {
+          "content-type": "text/javascript; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 06:21:38 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "max-age=2592000, public"
+        },
+        {
+          "last-modified": "Tue, 09 Oct 2012 07:20:18 GMT"
+        },
+        {
+          "date": "Tue, 09 Oct 2012 07:20:18 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "2857"
+        },
+        {
+          "content-type": "text/javascript; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 07:20:18 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "max-age=2592000, public"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 21:50:50 GMT"
+        },
+        {
+          "date": "Tue, 30 Oct 2012 21:50:50 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "1398"
+        },
+        {
+          "content-type": "text/javascript; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Thu, 29 Nov 2012 21:50:50 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "max-age=2592000, public"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 21:26:48 GMT"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 21:26:48 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "40353"
+        },
+        {
+          "content-type": "text/javascript; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 01 Dec 2012 21:26:48 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "max-age=2592000, public"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 21:46:27 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 21:46:27 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "2458"
+        },
+        {
+          "content-type": "text/html; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sun, 02 Dec 2012 21:46:27 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "max-age=2592000, public"
+        },
+        {
+          "last-modified": "Mon, 15 Oct 2012 22:07:17 GMT"
+        },
+        {
+          "date": "Mon, 15 Oct 2012 22:07:17 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "727"
+        },
+        {
+          "content-type": "text/javascript; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Wed, 14 Nov 2012 22:07:17 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "public, max-age=2592000"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 21:46:28 GMT"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "public, max-age=2592000"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 21:46:27 GMT"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "public, max-age=2592000"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 21:46:28 GMT"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "public, max-age=2592000"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 21:46:27 GMT"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "public, max-age=600"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:34:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:34:17 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "10780"
+        },
+        {
+          "content-type": "text/html; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:49:18 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "max-age=2592000, public"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:17:50 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:17:50 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "2245"
+        },
+        {
+          "content-type": "text/html; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 13:17:50 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "public, max-age=2592000"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Mon, 22 Oct 2012 22:00:11 GMT"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "public, max-age=2592000"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Sat, 27 Oct 2012 12:09:05 GMT"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "public, max-age=2592000"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Sat, 27 Oct 2012 07:36:12 GMT"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "public, max-age=2592000"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Mon, 22 Oct 2012 22:00:12 GMT"
+        },
+        {
+          "server": "Apache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "public, max-age=14400"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 12:53:23 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:53:23 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "5733"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 12:53:23 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "public, max-age=14400"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 10:58:55 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 10:58:55 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "1480"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 10:58:55 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "public, max-age=14400"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 09:53:38 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 09:53:38 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "10400"
+        },
+        {
+          "content-type": "text/html; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Mon, 03 Dec 2012 09:53:38 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "max-age=2592000, public"
+        },
+        {
+          "last-modified": "Tue, 09 Oct 2012 06:01:47 GMT"
+        },
+        {
+          "date": "Tue, 09 Oct 2012 06:01:47 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "4861"
+        },
+        {
+          "content-type": "text/css; charset=iso-8859-1"
+        },
+        {
+          "x-frame-options": "Allow-From https://forums.craigslist.org"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 06:01:47 GMT"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_25.json b/jetty-http2/http2-hpack/src/test/resources/data/story_25.json
new file mode 100644
index 0000000..a974038
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_25.json
@@ -0,0 +1,8637 @@
+{
+  "context": "response",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":status": "301"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "etag": ""
+        },
+        {
+          "last-modified": "Sat, 3 Nov 2012 13:18:25 GMT"
+        },
+        {
+          "location": "http://www.ebay.com"
+        },
+        {
+          "rlogid": "p4fug%60fvehq%60%3C%3Dsm%2Bpu56*a37%3Fb0%60-13ac6788085"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:56 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "nonsession=CgAFMABhSdlBNNTA5NTFjY2QuMC4xLjEuMTQ5LjMuMC4xAMoAIFn7Hk1jNjc4ODNmMTEzYTBhNTY5NjRlNjQ2YzZmZmFhMWFjMQDLAAFQlSPVMX8u5Z8*; Domain=.ebay.com; Expires=Sun, 03-Nov-2013 13:31:57 GMT; Path=/"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-length": "14114"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:56 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:58 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 00:07:22 GMT"
+        },
+        {
+          "etag": "\"558014-cc3-4cd77eb75a280\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "3267"
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4n%60rujfudlwc%3D9vt*ts67.g15ea31-13ac67885c6-0x1a1"
+        },
+        {
+          "set-cookie": "npii=bcguid/c67885c613a0a0a9f6568b16ff5917ee5276504e^tguid/c67883f113a0a56964e646c6ffaa1ac15276504e^; Domain=.ebay.com; Expires=Sun, 03-Nov-2013 13:31:58 GMT; Path=/"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa ADMa DEVa PSDo PSAa OUR SAMo IND UNI COM NAV INT STA DEM PRE\""
+        },
+        {
+          "cache-control": "private, no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "42"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:57 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:58 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 15:31:45 GMT"
+        },
+        {
+          "last-modified": "Sat, 16 Aug 2003 20:42:27 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80fb69e73664c31:6fe\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "49"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:58 GMT"
+        },
+        {
+          "last-modified": "Thu, 18 Oct 2012 23:53:57 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80183dd68badcd1:720\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "2539"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:58 GMT"
+        },
+        {
+          "expires": "Mon, 10 Dec 2012 22:14:50 GMT"
+        },
+        {
+          "last-modified": "Tue, 10 Jul 2012 00:18:56 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "219"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:58 GMT"
+        },
+        {
+          "last-modified": "Tue, 10 Jul 2012 00:17:53 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"808e7072315ecd1:5f1\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "201"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:58 GMT"
+        },
+        {
+          "last-modified": "Wed, 18 Jul 2012 20:33:33 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "1623"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9vl*th%7Fbad%7F72%3D-13ac6788850-0x16f"
+        },
+        {
+          "cache-control": "private, max-age=86400"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:58 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9ve*t%28747%60e%7E6-13ac678862e-0xfb"
+        },
+        {
+          "cache-control": "private, max-age=86400"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:57 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9ve*t%28747%60e%7Eb-13ac6788670-0x141"
+        },
+        {
+          "cache-control": "private, max-age=86400"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:57 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9u%7E*t%28750g07p-13a4b38c06e-0x161"
+        },
+        {
+          "last-modified": "Tue, 09 Oct 2012 23:50:57 GMT"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "4212"
+        },
+        {
+          "cache-control": "max-age=29468235"
+        },
+        {
+          "expires": "Thu, 10 Oct 2013 15:09:13 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:58 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9u%7E*t%28750g07%3B-13a65e7cdbc-0x16b"
+        },
+        {
+          "last-modified": "Mon, 15 Oct 2012 19:11:16 GMT"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "5662"
+        },
+        {
+          "cache-control": "max-age=29915920"
+        },
+        {
+          "expires": "Tue, 15 Oct 2013 19:30:38 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:58 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9u%7E*t%28750g07m-13abdd493d5-0x16d"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 20:39:43 GMT"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "9184"
+        },
+        {
+          "cache-control": "max-age=31391044"
+        },
+        {
+          "expires": "Fri, 01 Nov 2013 21:16:02 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:58 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 31 Jan 2012 02:58:34 GMT"
+        },
+        {
+          "content-type": "text/css;charset=UTF-8"
+        },
+        {
+          "content-length": "3282"
+        },
+        {
+          "cache-control": "max-age=23333195"
+        },
+        {
+          "expires": "Wed, 31 Jul 2013 14:58:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 06 Sep 2012 16:51:31 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "5440"
+        },
+        {
+          "cache-control": "max-age=26536771"
+        },
+        {
+          "expires": "Fri, 06 Sep 2013 16:51:30 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Thu, 11 Oct 2012 19:15:19 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5148"
+        },
+        {
+          "cache-control": "max-age=31458789"
+        },
+        {
+          "expires": "Sat, 02 Nov 2013 16:05:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 27 Sep 2010 09:07:24 GMT"
+        },
+        {
+          "content-type": "text/css;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5679"
+        },
+        {
+          "cache-control": "public, max-age=31536000"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:31:59 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 19:19:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7150"
+        },
+        {
+          "cache-control": "max-age=31468533"
+        },
+        {
+          "expires": "Sat, 02 Nov 2013 18:47:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Wed, 24 Oct 2012 05:51:41 GMT"
+        },
+        {
+          "content-type": "text/css;charset=UTF-8"
+        },
+        {
+          "content-length": "5679"
+        },
+        {
+          "cache-control": "max-age=30644382"
+        },
+        {
+          "expires": "Thu, 24 Oct 2013 05:51:41 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 21:24:39 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5636"
+        },
+        {
+          "cache-control": "max-age=31450187"
+        },
+        {
+          "expires": "Sat, 02 Nov 2013 13:41:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 23:03:23 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7177"
+        },
+        {
+          "cache-control": "max-age=31488510"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 00:20:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 18:41:38 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "8702"
+        },
+        {
+          "cache-control": "max-age=31321403"
+        },
+        {
+          "expires": "Fri, 01 Nov 2013 01:55:22 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 14:29:39 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "13046"
+        },
+        {
+          "cache-control": "max-age=29637746"
+        },
+        {
+          "expires": "Sat, 12 Oct 2013 14:14:25 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9u%7E*tm63.%3C72om6%3E-13abcb35937-0x14e"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 21:07:34 GMT"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "60906"
+        },
+        {
+          "cache-control": "max-age=31372049"
+        },
+        {
+          "expires": "Fri, 01 Nov 2013 15:59:27 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:58 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 18 Sep 2012 01:10:29 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "42205"
+        },
+        {
+          "cache-control": "max-age=27517110"
+        },
+        {
+          "expires": "Wed, 18 Sep 2013 01:10:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 27 Sep 2010 09:07:24 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "53359"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "cache-control": "private, max-age=31536000"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:31:59 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:01 GMT"
+        },
+        {
+          "last-modified": "Tue, 16 Oct 2012 18:06:59 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "2583"
+        },
+        {
+          "etag": "\"80e3ea8c9abcd1:639\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9vl*th%7Fbad%7F710-13ac67892f3-0x131"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:01 GMT"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "set-cookie": "PS=T.0; Domain=main.ebayrtm.com; Expires=Sun, 03-Nov-2013 13:32:01 GMT; Path=/rtm"
+        },
+        {
+          "location": "http://srx.main.ebayrtm.com/rtm?RtmCmd&a=json&l=@@__@@__@@&g=c67883f113a0a56964e646c6ffaa1ac1&c=1H4sIAAAAAAAAAB2OwWrCQBCG74LvMOClLXR3Zsckm8gevLR4SEuJhx5ySdMVg6krujXap%2B8kMDDD%2F%2F18zKJqIryFKyADpgVTkWRQVlswSGY%2BOzGjK8Nf1%2FeNThTCQ9m03TGGy34Fm2P0PUgA7xV8AqGyKzhf64JShY%2Fw6ttD0OJBGYKX7ux34aZHKGIyTlbbfTu29S9KR0LDS%2Fec5yO27BLKs%2BkkJw6cvjFuH%2BOpLrQehkH5r%2Bau2vAzIWkxKjK5Sq3KeMxs5vzmY90flk%2Fz2T9Cveg66wAAAA%3D%3D&p=11527:11528:11529&di=11527:11528:11529&v=4&enc=UTF-8&bm=286807&ord=1351949521580&cg=c67885c613a0a0a9f6568b16ff5917ee&cb=vjo.dsf.assembly.VjClientAssembler._callback0&_vrdm=1351949521581&r=yes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:01 GMT"
+        },
+        {
+          "expires": "Mon, 10 Dec 2012 02:40:28 GMT"
+        },
+        {
+          "last-modified": "Thu, 09 Jul 2009 18:33:39 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "1406"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:01 GMT"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 23:46:56 GMT"
+        },
+        {
+          "last-modified": "Mon, 13 Jul 2009 22:43:33 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"8018ba59b4ca1:5d2\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "386"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:01 GMT"
+        },
+        {
+          "last-modified": "Thu, 09 Jul 2009 18:33:41 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "3155"
+        },
+        {
+          "etag": "\"80e3ea8c9abcd1:639\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9vl*th%7Fbad%7F715-13ac6789351-0x12a"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "4320"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:01 GMT"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "set-cookie": "HT=1351949521580%0211529%04287876%06261345%0311528%04286823%06260443%0311527%04286801%06203908; Domain=main.ebayrtm.com; Path=/rtm"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:01 GMT"
+        },
+        {
+          "expires": "Mon, 26 Nov 2012 01:07:49 GMT"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 18:48:16 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "92574"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:01 GMT"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 23:46:55 GMT"
+        },
+        {
+          "last-modified": "Thu, 29 Mar 2012 22:36:00 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"048ac50fcdcd1:603\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "35128"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9u%7E*t%28750g07m-133f0e5fedc-0x142"
+        },
+        {
+          "last-modified": "Tue, 29 Nov 2011 19:19:17 GMT"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "content-length": "545"
+        },
+        {
+          "cache-control": "max-age=30563305"
+        },
+        {
+          "expires": "Wed, 23 Oct 2013 07:20:26 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:02 GMT"
+        },
+        {
+          "expires": "Tue, 18 Dec 2012 00:25:08 GMT"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 00:26:02 GMT"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "22428"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:02 GMT"
+        },
+        {
+          "expires": "Tue, 18 Dec 2012 00:25:05 GMT"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 00:28:28 GMT"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "33895"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:02 GMT"
+        },
+        {
+          "expires": "Mon, 17 Dec 2012 16:09:55 GMT"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 18:41:38 GMT"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "38761"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:02 GMT"
+        },
+        {
+          "expires": "Mon, 17 Dec 2012 15:00:24 GMT"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 14:28:46 GMT"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "60078"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9u%7E*t%28750d%7F23-13abd599c11-0x167"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 20:14:10 GMT"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "72619"
+        },
+        {
+          "cache-control": "max-age=31382938"
+        },
+        {
+          "expires": "Fri, 01 Nov 2013 19:00:59 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9u%7E*tm63.%3C72om6%3E-13ac20abb51-0x14c"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 16:52:54 GMT"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "69800"
+        },
+        {
+          "cache-control": "max-age=31461635"
+        },
+        {
+          "expires": "Sat, 02 Nov 2013 16:52:36 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "nonsession=CgAFMABhSdlBNNTA5NTFjY2QuMC4xLjEuMTQ5LjMuMC4xAMoAIFn7Hk1jNjc4ODNmMTEzYTBhNTY5NjRlNjQ2YzZmZmFhMWFjMQDLAAFQlSPVMX8u5Z8*; Domain=.ebay.com; Expires=Sun, 03-Nov-2013 13:31:57 GMT; Path=/"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "image/x-icon"
+        },
+        {
+          "content-length": "1150"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:06 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 23:04:12 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 15:31:45 GMT"
+        },
+        {
+          "last-modified": "Sat, 16 Aug 2003 20:42:27 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "49"
+        },
+        {
+          "etag": "\"80fb69e73664c31:6fe\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 23:46:55 GMT"
+        },
+        {
+          "last-modified": "Thu, 18 Oct 2012 23:53:57 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80183dd68badcd1:720\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "2539"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "last-modified": "Thu, 30 Jul 2009 23:41:29 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "53"
+        },
+        {
+          "etag": "\"80e3ea8c9abcd1:639\""
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 15:14:28 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "expires": "Mon, 26 Nov 2012 05:56:41 GMT"
+        },
+        {
+          "last-modified": "Thu, 30 Jul 2009 23:41:33 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "53"
+        },
+        {
+          "etag": "\"80b4fd446f11ca1:876\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "lucky9=1959890; Domain=.ebay.com; Expires=Thu, 02-Nov-2017 13:32:07 GMT; Path=/"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-length": "24567"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "expires": "Sun, 16 Dec 2012 17:51:49 GMT"
+        },
+        {
+          "last-modified": "Sun, 26 Feb 2012 07:40:00 GMT"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1968"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 16:37:50 GMT"
+        },
+        {
+          "last-modified": "Tue, 07 Jul 2009 20:18:42 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "613"
+        },
+        {
+          "etag": "\"80fb69e73664c31:6fe\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 23:46:57 GMT"
+        },
+        {
+          "last-modified": "Thu, 23 Aug 2007 20:40:22 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80183dd68badcd1:720\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "229"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "expires": "Mon, 26 Nov 2012 05:56:41 GMT"
+        },
+        {
+          "last-modified": "Thu, 04 Oct 2007 21:44:36 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "1887"
+        },
+        {
+          "etag": "\"0bad4c1cf6c81:682\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 15:31:45 GMT"
+        },
+        {
+          "last-modified": "Sat, 16 Aug 2003 20:42:27 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80fb69e73664c31:6fe\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "49"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "expires": "Mon, 19 Nov 2012 22:20:32 GMT"
+        },
+        {
+          "last-modified": "Sat, 23 Apr 2011 09:37:40 GMT"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3936"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "expires": "Thu, 13 Dec 2012 18:43:54 GMT"
+        },
+        {
+          "last-modified": "Thu, 09 Sep 2010 17:31:30 GMT"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4059"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "expires": "Thu, 13 Dec 2012 18:24:38 GMT"
+        },
+        {
+          "last-modified": "Thu, 09 Sep 2010 17:15:08 GMT"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4397"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 19 Jan 2012 01:26:02 GMT"
+        },
+        {
+          "content-type": "text/css;charset=UTF-8"
+        },
+        {
+          "content-length": "10248"
+        },
+        {
+          "cache-control": "max-age=22290839"
+        },
+        {
+          "expires": "Fri, 19 Jul 2013 13:26:06 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 10 Nov 2011 13:27:41 GMT"
+        },
+        {
+          "content-type": "text/css;charset=UTF-8"
+        },
+        {
+          "content-length": "1794"
+        },
+        {
+          "cache-control": "max-age=16286156"
+        },
+        {
+          "expires": "Sat, 11 May 2013 01:28:03 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Sat, 19 May 2012 13:20:12 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2031"
+        },
+        {
+          "cache-control": "max-age=4358180"
+        },
+        {
+          "expires": "Mon, 24 Dec 2012 00:08:27 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 14:04:13 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2394"
+        },
+        {
+          "cache-control": "max-age=31533954"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 12:58:01 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Thu, 04 Oct 2012 13:43:50 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3680"
+        },
+        {
+          "cache-control": "max-age=31532824"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 12:39:11 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Sat, 16 Jun 2012 04:23:57 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3263"
+        },
+        {
+          "cache-control": "max-age=10191966"
+        },
+        {
+          "expires": "Fri, 01 Mar 2013 12:38:13 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Tue, 04 Sep 2012 13:46:03 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2469"
+        },
+        {
+          "cache-control": "max-age=26067492"
+        },
+        {
+          "expires": "Sun, 01 Sep 2013 06:30:19 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Sat, 17 Dec 2011 17:14:44 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "2521"
+        },
+        {
+          "cache-control": "max-age=19496613"
+        },
+        {
+          "expires": "Mon, 17 Jun 2013 05:15:40 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 15 Dec 2011 00:35:12 GMT"
+        },
+        {
+          "content-type": "text/css;charset=UTF-8"
+        },
+        {
+          "content-length": "9133"
+        },
+        {
+          "cache-control": "max-age=19263809"
+        },
+        {
+          "expires": "Fri, 14 Jun 2013 12:35:36 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 14:11:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3761"
+        },
+        {
+          "cache-control": "max-age=31534424"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:05:51 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Sun, 23 Sep 2012 00:16:12 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2956"
+        },
+        {
+          "cache-control": "max-age=27524859"
+        },
+        {
+          "expires": "Wed, 18 Sep 2013 03:19:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 14:13:08 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2236"
+        },
+        {
+          "cache-control": "max-age=31105641"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 13:59:28 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 07 May 2012 03:34:14 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1500"
+        },
+        {
+          "cache-control": "max-age=4657042"
+        },
+        {
+          "expires": "Thu, 27 Dec 2012 11:09:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Wed, 17 Oct 2012 21:46:06 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2528"
+        },
+        {
+          "cache-control": "max-age=28697569"
+        },
+        {
+          "expires": "Tue, 01 Oct 2013 17:04:56 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Tue, 02 Oct 2012 21:27:24 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1930"
+        },
+        {
+          "cache-control": "max-age=28812498"
+        },
+        {
+          "expires": "Thu, 03 Oct 2013 01:00:25 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Sat, 20 Oct 2012 02:57:28 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1722"
+        },
+        {
+          "cache-control": "max-age=30889406"
+        },
+        {
+          "expires": "Sun, 27 Oct 2013 01:55:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Tue, 17 Jul 2012 14:30:13 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2961"
+        },
+        {
+          "cache-control": "max-age=16431611"
+        },
+        {
+          "expires": "Sun, 12 May 2013 17:52:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Wed, 24 Oct 2012 14:14:04 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2160"
+        },
+        {
+          "cache-control": "max-age=30945129"
+        },
+        {
+          "expires": "Sun, 27 Oct 2013 17:24:16 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Thu, 04 Oct 2012 14:11:43 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2841"
+        },
+        {
+          "cache-control": "max-age=30221178"
+        },
+        {
+          "expires": "Sat, 19 Oct 2013 08:18:25 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 07 May 2012 13:59:59 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1541"
+        },
+        {
+          "cache-control": "max-age=7259332"
+        },
+        {
+          "expires": "Sat, 26 Jan 2013 14:00:59 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Wed, 06 Jun 2012 14:05:14 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2123"
+        },
+        {
+          "cache-control": "max-age=12334548"
+        },
+        {
+          "expires": "Tue, 26 Mar 2013 07:47:55 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Thu, 04 Oct 2012 14:21:18 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "947"
+        },
+        {
+          "cache-control": "max-age=27136636"
+        },
+        {
+          "expires": "Fri, 13 Sep 2013 15:29:23 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Thu, 04 Oct 2012 14:45:15 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1846"
+        },
+        {
+          "cache-control": "max-age=29813010"
+        },
+        {
+          "expires": "Mon, 14 Oct 2013 14:55:37 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 14:17:41 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2166"
+        },
+        {
+          "cache-control": "max-age=30506466"
+        },
+        {
+          "expires": "Tue, 22 Oct 2013 15:33:14 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:08 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Thu, 04 Oct 2012 13:48:57 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3964"
+        },
+        {
+          "cache-control": "max-age=31161579"
+        },
+        {
+          "expires": "Wed, 30 Oct 2013 05:31:47 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:08 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Thu, 04 Oct 2012 13:43:32 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4653"
+        },
+        {
+          "cache-control": "max-age=30556712"
+        },
+        {
+          "expires": "Wed, 23 Oct 2013 05:30:40 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:08 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 11 Sep 2012 18:42:51 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "31476"
+        },
+        {
+          "cache-control": "max-age=26975444"
+        },
+        {
+          "expires": "Wed, 11 Sep 2013 18:42:51 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Sat, 17 Dec 2011 17:14:45 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "11181"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "cache-control": "max-age=19496528"
+        },
+        {
+          "expires": "Mon, 17 Jun 2013 05:14:15 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Thu, 04 Oct 2012 14:19:33 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5580"
+        },
+        {
+          "cache-control": "max-age=31535661"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:26:28 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9vl*th%7Fbad%7F714-13ac678af80-0x141"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "903"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:08 GMT"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "set-cookie": "HT=1351949521580%0211529%04287876%06261345%0311528%04286823%06260443%0311527%04286801%06203908%011351949527269%02981%04-1%060%03980%04-1%060%03979%04-1%060%03688%04-1%060%03255%04-1%060; Domain=main.ebayrtm.com; Path=/rtm"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:09 GMT"
+        },
+        {
+          "expires": "Mon, 17 Dec 2012 16:40:39 GMT"
+        },
+        {
+          "last-modified": "Wed, 10 Jun 2009 16:58:56 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80fb69e73664c31:6fe\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "1161"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:09 GMT"
+        },
+        {
+          "expires": "Wed, 28 Nov 2012 05:06:23 GMT"
+        },
+        {
+          "last-modified": "Sat, 16 May 2009 01:16:00 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "1180"
+        },
+        {
+          "etag": "\"04864dfc3d5c91:5b1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-length": "66"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Fri, 19 Jun 2009 17:50:32 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"064b8706f1c91:682\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:09 GMT"
+        },
+        {
+          "expires": "Sat, 27 Oct 2012 08:29:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:09 GMT"
+        },
+        {
+          "expires": "Thu, 13 Dec 2012 19:35:46 GMT"
+        },
+        {
+          "last-modified": "Thu, 17 Mar 2011 21:09:01 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "13713"
+        },
+        {
+          "etag": "\"0bad4c1cf6c81:682\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 14 Feb 2012 08:00:47 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "53098"
+        },
+        {
+          "cache-control": "max-age=24560912"
+        },
+        {
+          "expires": "Wed, 14 Aug 2013 20:00:39 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 23:46:15 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "27209"
+        },
+        {
+          "cache-control": "max-age=31054448"
+        },
+        {
+          "expires": "Mon, 28 Oct 2013 23:46:15 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "397"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:10 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:10 GMT"
+        },
+        {
+          "expires": "Sat, 15 Dec 2012 09:56:28 GMT"
+        },
+        {
+          "last-modified": "Sat, 16 Aug 2003 20:42:27 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "49"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:10 GMT"
+        },
+        {
+          "last-modified": "Mon, 08 Mar 2010 19:32:35 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "146"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 20:38:55 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1918"
+        },
+        {
+          "cache-control": "max-age=30051310"
+        },
+        {
+          "expires": "Thu, 17 Oct 2013 09:07:17 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 18:00:33 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 18:12:07 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 18:12:07 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "26810"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "69603"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 23:04:12 GMT"
+        },
+        {
+          "content-type": "image/x-icon"
+        },
+        {
+          "content-length": "1150"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:11 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:12 GMT"
+        },
+        {
+          "expires": "Mon, 26 Nov 2012 00:29:24 GMT"
+        },
+        {
+          "last-modified": "Fri, 18 Mar 2005 23:03:54 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "260"
+        },
+        {
+          "etag": "\"04864dfc3d5c91:5b1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:12 GMT"
+        },
+        {
+          "expires": "Tue, 11 Dec 2012 20:45:48 GMT"
+        },
+        {
+          "last-modified": "Fri, 27 Aug 2010 00:22:53 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80183dd68badcd1:720\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "366"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:12 GMT"
+        },
+        {
+          "last-modified": "Fri, 18 Mar 2005 23:04:39 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "172"
+        },
+        {
+          "etag": "\"80e3ea8c9abcd1:639\""
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 16:57:28 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "lucky9=1959890; Domain=.ebay.com; Expires=Thu, 02-Nov-2017 13:32:12 GMT; Path=/"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-length": "90925"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:11 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 23:04:12 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:12 GMT"
+        },
+        {
+          "expires": "Thu, 13 Dec 2012 19:00:40 GMT"
+        },
+        {
+          "last-modified": "Thu, 09 Sep 2010 17:31:30 GMT"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "11504"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:12 GMT"
+        },
+        {
+          "expires": "Thu, 13 Dec 2012 19:00:40 GMT"
+        },
+        {
+          "last-modified": "Thu, 09 Sep 2010 17:31:30 GMT"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "11504"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Thu, 18 Oct 2012 22:46:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3962"
+        },
+        {
+          "cache-control": "max-age=29068398"
+        },
+        {
+          "expires": "Sun, 06 Oct 2013 00:05:30 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 17:53:50 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4670"
+        },
+        {
+          "cache-control": "max-age=31276058"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 13:19:50 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Thu, 11 Oct 2012 01:52:55 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5679"
+        },
+        {
+          "cache-control": "max-age=28834042"
+        },
+        {
+          "expires": "Thu, 03 Oct 2013 06:59:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Wed, 25 Jul 2012 20:50:41 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3929"
+        },
+        {
+          "cache-control": "max-age=17978904"
+        },
+        {
+          "expires": "Thu, 30 May 2013 15:40:36 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 06 Aug 2012 06:13:28 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2473"
+        },
+        {
+          "cache-control": "max-age=22036778"
+        },
+        {
+          "expires": "Tue, 16 Jul 2013 14:51:50 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 27 Sep 2010 09:07:24 GMT"
+        },
+        {
+          "content-type": "text/css;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "6172"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "cache-control": "private, max-age=31536000"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:32:12 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 16 Mar 2012 00:40:23 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "52950"
+        },
+        {
+          "cache-control": "max-age=27212892"
+        },
+        {
+          "expires": "Sat, 14 Sep 2013 12:40:24 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Sun, 27 May 2012 12:26:18 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "6163"
+        },
+        {
+          "cache-control": "max-age=17941535"
+        },
+        {
+          "expires": "Thu, 30 May 2013 05:17:47 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 13 Aug 2012 06:52:35 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4526"
+        },
+        {
+          "cache-control": "max-age=24498920"
+        },
+        {
+          "expires": "Wed, 14 Aug 2013 02:47:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:13 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 27 Sep 2010 09:07:24 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "48924"
+        },
+        {
+          "cache-control": "public, max-age=31536000"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:32:12 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:14 GMT"
+        },
+        {
+          "expires": "Mon, 17 Dec 2012 16:40:39 GMT"
+        },
+        {
+          "last-modified": "Wed, 19 Oct 2011 00:48:19 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80fb69e73664c31:6fe\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "275"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-length": "1145"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Tue, 15 Feb 2011 17:36:11 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80b7dad536cdcb1:854\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:14 GMT"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 23:46:55 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:14 GMT"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 04:59:25 GMT"
+        },
+        {
+          "last-modified": "Wed, 02 Feb 2011 19:43:17 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80183dd68badcd1:720\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "3546"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:14 GMT"
+        },
+        {
+          "expires": "Thu, 27 Sep 2012 23:15:40 GMT"
+        },
+        {
+          "last-modified": "Fri, 21 Jan 2011 20:52:52 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "6342"
+        },
+        {
+          "etag": "\"0aa782badb9cb1:682\""
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:14 GMT"
+        },
+        {
+          "last-modified": "Thu, 09 Sep 2010 03:40:20 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "10896"
+        },
+        {
+          "etag": "\"80e3ea8c9abcd1:639\""
+        },
+        {
+          "expires": "Sun, 16 Dec 2012 05:44:38 GMT"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:14 GMT"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 23:46:57 GMT"
+        },
+        {
+          "last-modified": "Fri, 22 Jun 2012 22:09:21 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "59719"
+        },
+        {
+          "etag": "\"04864dfc3d5c91:5b1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:14 GMT"
+        },
+        {
+          "last-modified": "Fri, 22 Jun 2012 22:09:21 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "59719"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 23:46:57 GMT"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4n%60rujfudlwc%3D9vt*ts67.62d5%3C%3E7-13ac678c943-0x1a4"
+        },
+        {
+          "cache-control": "private, no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/json"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:14 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "lucky9=1959890; Domain=.ebay.com; Expires=Thu, 02-Nov-2017 13:32:16 GMT; Path=/"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "80046"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:15 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 23:04:12 GMT"
+        },
+        {
+          "transaction": "uk.r+607b~`s,RcmdId FindingProductv4,RlogId p4pmiw%60jtb9%3Fuk.r%2B607b%7E%60s-13ac678cb27-0xb7"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:16 GMT"
+        },
+        {
+          "expires": "Mon, 17 Dec 2012 13:46:54 GMT"
+        },
+        {
+          "last-modified": "Thu, 09 Sep 2010 17:31:30 GMT"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "739"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:16 GMT"
+        },
+        {
+          "expires": "Thu, 22 Nov 2012 14:19:41 GMT"
+        },
+        {
+          "last-modified": "Sat, 23 Apr 2011 09:37:40 GMT"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1649"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:16 GMT"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 06:10:27 GMT"
+        },
+        {
+          "last-modified": "Fri, 18 Mar 2005 23:01:04 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "134"
+        },
+        {
+          "etag": "\"078525ce2cc51:586\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:16 GMT"
+        },
+        {
+          "expires": "Fri, 14 Dec 2012 05:08:13 GMT"
+        },
+        {
+          "last-modified": "Fri, 21 Oct 2005 18:47:40 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80fb69e73664c31:6fe\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "231"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:16 GMT"
+        },
+        {
+          "expires": "Sun, 09 Dec 2012 06:52:18 GMT"
+        },
+        {
+          "last-modified": "Tue, 06 Sep 2005 19:37:46 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80183dd68badcd1:720\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "643"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:16 GMT"
+        },
+        {
+          "expires": "Fri, 26 Oct 2012 04:43:31 GMT"
+        },
+        {
+          "last-modified": "Thu, 06 Oct 2005 21:29:14 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "369"
+        },
+        {
+          "etag": "\"0aa782badb9cb1:682\""
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-length": "199"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Fri, 21 Oct 2005 18:47:42 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80b7dad536cdcb1:854\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:16 GMT"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 23:46:55 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:16 GMT"
+        },
+        {
+          "last-modified": "Wed, 04 Mar 2009 03:12:30 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "2388"
+        },
+        {
+          "etag": "\"80e3ea8c9abcd1:639\""
+        },
+        {
+          "expires": "Sun, 16 Dec 2012 05:44:38 GMT"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:16 GMT"
+        },
+        {
+          "expires": "Mon, 19 Nov 2012 22:20:46 GMT"
+        },
+        {
+          "last-modified": "Thu, 09 Sep 2010 17:31:30 GMT"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1713"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:16 GMT"
+        },
+        {
+          "expires": "Sun, 11 Nov 2012 06:40:21 GMT"
+        },
+        {
+          "last-modified": "Thu, 09 Sep 2010 17:30:38 GMT"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1389"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:16 GMT"
+        },
+        {
+          "expires": "Mon, 26 Nov 2012 04:31:42 GMT"
+        },
+        {
+          "last-modified": "Fri, 18 Mar 2005 23:04:34 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80fb69e73664c31:6fe\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "141"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:16 GMT"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 23:46:56 GMT"
+        },
+        {
+          "last-modified": "Fri, 18 Mar 2005 23:05:11 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "136"
+        },
+        {
+          "etag": "\"80ad8befe2cc51:8e4\""
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:16 GMT"
+        },
+        {
+          "expires": "Thu, 29 Nov 2012 16:39:21 GMT"
+        },
+        {
+          "last-modified": "Tue, 02 Aug 2011 07:55:09 GMT"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "6651"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:16 GMT"
+        },
+        {
+          "expires": "Thu, 06 Dec 2012 09:42:11 GMT"
+        },
+        {
+          "last-modified": "Mon, 28 Mar 2011 14:55:59 GMT"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "13825"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "last-modified": "Sat, 16 Aug 2003 20:42:25 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "49"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 23:46:57 GMT"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "lucky9=1959890;Domain=.ebay.com;Expires=Thu, 02-Nov-2017 13:32:21 GMT;Path=/ "
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-length": "80046"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 23:04:12 GMT"
+        },
+        {
+          "transaction": "uk.r+607b~`s,RcmdId FindingProductv4,RlogId p4pmiw%60jtb9%3Fuk.r%2B607b%7E%60s-13ac678cb27-0xb7"
+        },
+        {
+          "rlogid": "t6ulcpjqcj9%3Fuk%601d72f%2B12%60b-13ac678e09e-0xc0"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "expires": "Sun, 18 Nov 2012 22:28:04 GMT"
+        },
+        {
+          "last-modified": "Thu, 04 Oct 2007 21:44:39 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "3179"
+        },
+        {
+          "etag": "\"078525ce2cc51:586\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "last-modified": "Fri, 27 Aug 2010 00:22:48 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "391"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 15:13:22 GMT"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "last-modified": "Fri, 18 Mar 2005 23:05:11 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "136"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "last-modified": "Thu, 06 Sep 2007 00:11:47 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "542"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 23:46:55 GMT"
+        },
+        {
+          "last-modified": "Thu, 06 Jul 2006 00:07:00 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"0aa151a90a0c61:5e2\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "43"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:22 GMT"
+        },
+        {
+          "last-modified": "Tue, 24 May 2011 22:33:41 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "1351"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 15:13:22 GMT"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "last-modified": "Thu, 06 Sep 2007 00:21:31 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80f7a0df1bf0c71:5b1\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "6386"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 25 Oct 2012 23:31:47 GMT"
+        },
+        {
+          "content-type": "text/css;charset=UTF-8"
+        },
+        {
+          "content-length": "3276"
+        },
+        {
+          "cache-control": "max-age=30794366"
+        },
+        {
+          "expires": "Fri, 25 Oct 2013 23:31:47 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 25 Oct 2012 23:31:47 GMT"
+        },
+        {
+          "content-type": "text/css;charset=UTF-8"
+        },
+        {
+          "content-length": "668"
+        },
+        {
+          "cache-control": "max-age=30794366"
+        },
+        {
+          "expires": "Fri, 25 Oct 2013 23:31:47 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Sat, 14 Jul 2012 00:50:47 GMT"
+        },
+        {
+          "content-type": "text/css;charset=UTF-8"
+        },
+        {
+          "content-length": "44"
+        },
+        {
+          "cache-control": "max-age=21813506"
+        },
+        {
+          "expires": "Sun, 14 Jul 2013 00:50:47 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 23:46:56 GMT"
+        },
+        {
+          "last-modified": "Tue, 02 Feb 2010 19:44:14 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "13817"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 27 Sep 2010 09:07:24 GMT"
+        },
+        {
+          "content-type": "text/css;charset=UTF-8"
+        },
+        {
+          "content-language": "cs-CZ"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "6172"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "cache-control": "private, max-age=31536000"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:32:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 03:28:30 GMT"
+        },
+        {
+          "content-type": "text/css;charset=UTF-8"
+        },
+        {
+          "content-length": "6661"
+        },
+        {
+          "cache-control": "max-age=31413369"
+        },
+        {
+          "expires": "Sat, 02 Nov 2013 03:28:30 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 06 Jul 2012 01:08:44 GMT"
+        },
+        {
+          "content-type": "text/css;charset=UTF-8"
+        },
+        {
+          "content-length": "351"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "cache-control": "max-age=21123378"
+        },
+        {
+          "expires": "Sat, 06 Jul 2013 01:08:39 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 03:07:31 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4553"
+        },
+        {
+          "cache-control": "max-age=29866596"
+        },
+        {
+          "expires": "Tue, 15 Oct 2013 05:48:57 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Sat, 22 Sep 2012 19:51:38 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4694"
+        },
+        {
+          "cache-control": "max-age=24377502"
+        },
+        {
+          "expires": "Mon, 12 Aug 2013 17:04:03 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 21:48:15 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5307"
+        },
+        {
+          "cache-control": "max-age=31498703"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 03:10:44 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 25 Oct 2012 23:32:05 GMT"
+        },
+        {
+          "content-type": "text/css;charset=UTF-8"
+        },
+        {
+          "content-length": "3014"
+        },
+        {
+          "cache-control": "max-age=30794343"
+        },
+        {
+          "expires": "Fri, 25 Oct 2013 23:31:24 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:22 GMT"
+        },
+        {
+          "expires": "Tue, 18 Dec 2012 13:32:22 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 17:53:41 GMT"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "15981"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:22 GMT"
+        },
+        {
+          "expires": "Sun, 18 Nov 2012 22:28:04 GMT"
+        },
+        {
+          "last-modified": "Fri, 25 Jun 2010 01:28:28 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "578"
+        },
+        {
+          "etag": "\"0c688b6514cb1:586\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 27 Sep 2010 09:07:24 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-language": "pt-BR"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9688"
+        },
+        {
+          "cache-control": "public, max-age=31536000"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:32:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:22 GMT"
+        },
+        {
+          "last-modified": "Tue, 20 Sep 2011 23:59:47 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "1780"
+        },
+        {
+          "etag": "\"80e3ea8c9abcd1:639\""
+        },
+        {
+          "expires": "Mon, 26 Nov 2012 00:03:41 GMT"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9u%7E*t%28750g07p-139944fe49b-0x176"
+        },
+        {
+          "last-modified": "Thu, 23 Aug 2012 17:24:32 GMT"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "content-length": "8722"
+        },
+        {
+          "cache-control": "max-age=26399474"
+        },
+        {
+          "expires": "Thu, 05 Sep 2013 02:43:36 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:22 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:22 GMT"
+        },
+        {
+          "last-modified": "Wed, 12 Jan 2011 20:27:09 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "342"
+        },
+        {
+          "expires": "Mon, 26 Nov 2012 16:35:19 GMT"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:22 GMT"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 23:46:55 GMT"
+        },
+        {
+          "last-modified": "Wed, 19 Oct 2011 01:17:47 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "6641"
+        },
+        {
+          "etag": "\"80af29e9fc8dcc1:8e4\""
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Wed, 11 Jul 2012 18:03:37 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2752"
+        },
+        {
+          "cache-control": "max-age=14608007"
+        },
+        {
+          "expires": "Sun, 21 Apr 2013 15:19:09 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:22 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:22 GMT"
+        },
+        {
+          "last-modified": "Tue, 07 Jul 2009 20:18:42 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "613"
+        },
+        {
+          "expires": "Mon, 26 Nov 2012 16:35:19 GMT"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "etag": "\"03d21f40ffc91:5b1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 12 Jul 2012 22:44:28 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "551"
+        },
+        {
+          "cache-control": "max-age=21719526"
+        },
+        {
+          "expires": "Fri, 12 Jul 2013 22:44:28 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:22 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:22 GMT"
+        },
+        {
+          "expires": "Mon, 17 Dec 2012 20:39:34 GMT"
+        },
+        {
+          "last-modified": "Tue, 20 Sep 2011 02:08:20 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80183dd68badcd1:720\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "17673"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "t6ulcpjqcj9%3Fuk%601d72f%2B4%603g-13ac678e4f2-0x104"
+        },
+        {
+          "set-cookie": "nonsession=CgADLAAFQlSPuMQDKACBZ+x5mYzY3OGU0YzgxM2EwYTVlNmM4ZDZjODQ2ZmZmOGYzYjlPrxuR;Domain=.raptor.ebaydesc.com;Expires=Sun, 03-Nov-2013 13:32:22 GMT;Path=/ "
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:22 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 00:03:20 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "54313"
+        },
+        {
+          "cache-control": "max-age=31401067"
+        },
+        {
+          "expires": "Sat, 02 Nov 2013 00:03:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:22 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 00:03:52 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "20701"
+        },
+        {
+          "cache-control": "max-age=31401093"
+        },
+        {
+          "expires": "Sat, 02 Nov 2013 00:03:55 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:22 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9ve*t%28747%60e%7E%3A-13ac678e523-0x15c"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "3577"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:22 GMT"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "set-cookie": "HT=1351949521580%0211529%04287876%06261345%0311528%04286823%06260443%0311527%04286801%06203908%011351949527269%02981%04-1%060%03980%04-1%060%03979%04-1%060%03688%04-1%060%03255%04-1%060%011351949541760%0211575%04-1%060%031527%04-1%060%03829%04-1%060%03912%04-1%060%03827%04-1%060%03876%04-1%060%03825%04-1%060%03433%04-1%060%031651%04-1%060%031650%04-1%060; Domain=main.ebayrtm.com; Path=/rtm"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 21:23:48 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "5138"
+        },
+        {
+          "cache-control": "max-age=31132229"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 21:22:52 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:23 GMT"
+        },
+        {
+          "last-modified": "Thu, 04 Oct 2007 21:44:39 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "3179"
+        },
+        {
+          "expires": "Fri, 14 Dec 2012 20:03:15 GMT"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "etag": "\"03d21f40ffc91:5b1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "lucky9=1959890; Domain=.ebay.com; Expires=Thu, 02-Nov-2017 13:32:23 GMT; Path=/"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "7004"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:23 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 23:04:12 GMT"
+        },
+        {
+          "transaction": "uk.r+607b~`s,RcmdId FindingProductv4,RlogId p4pmiw%60jtb9%3Fuk.r%2B607b%7E%60s-13ac678cb27-0xb7"
+        },
+        {
+          "rlogid": "t6ulcpjqcj9%3Fuk%601d72f%2B12%60b-13ac678e09e-0xc0"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:23 GMT"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 23:47:00 GMT"
+        },
+        {
+          "last-modified": "Fri, 27 Aug 2010 00:22:54 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "366"
+        },
+        {
+          "etag": "\"80af29e9fc8dcc1:8e4\""
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "304"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:23 GMT"
+        },
+        {
+          "expires": "Fri, 26 Oct 2012 04:43:31 GMT"
+        },
+        {
+          "last-modified": "Thu, 06 Oct 2005 21:29:14 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80fb69e73664c31:6fe\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "141"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:23 GMT"
+        },
+        {
+          "last-modified": "Mon, 25 Jul 2005 20:31:43 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "64"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 23:46:59 GMT"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "etag": "\"03d21f40ffc91:5b1\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:23 GMT"
+        },
+        {
+          "expires": "Sun, 18 Nov 2012 22:28:04 GMT"
+        },
+        {
+          "last-modified": "Tue, 25 Sep 2012 05:16:18 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "7623"
+        },
+        {
+          "etag": "\"0c688b6514cb1:586\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Fri, 19 Oct 2012 22:52:32 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "949"
+        },
+        {
+          "cache-control": "max-age=30273610"
+        },
+        {
+          "expires": "Sat, 19 Oct 2013 22:52:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:22 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Tue, 19 Jun 2012 05:08:42 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1069"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "cache-control": "max-age=19670318"
+        },
+        {
+          "expires": "Wed, 19 Jun 2013 05:31:01 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Thu, 25 Oct 2012 03:14:23 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "6931"
+        },
+        {
+          "cache-control": "max-age=30721319"
+        },
+        {
+          "expires": "Fri, 25 Oct 2013 03:14:22 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlog": "uh%60jk%3D9vj*ts67.21336g2-13ac678eef8"
+        },
+        {
+          "x-ebay-request-id": "13ac678e-ef80-a5ac-0760-c260ff104b3e!ajax.all.get!10.90.192.118!ebay.com[]"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:24 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:25 GMT"
+        },
+        {
+          "expires": "Sun, 18 Nov 2012 22:28:04 GMT"
+        },
+        {
+          "last-modified": "Thu, 04 Oct 2012 18:56:36 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "9521"
+        },
+        {
+          "etag": "\"0c688b6514cb1:586\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4n%60rujfudlwc%3D9un%7F4g65%60%283ab%3D-13ac678ef91-0x19c"
+        },
+        {
+          "cache-control": "private, no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/json"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:25 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "lucky9=1959890; Domain=.ebay.com; Expires=Thu, 02-Nov-2017 13:32:30 GMT; Path=/"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-length": "90235"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:30 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 23:04:12 GMT"
+        },
+        {
+          "transaction": "uk.r+607b~`s,RcmdId FindingProductv4,RlogId p4pmiw%60jtb9%3Fuk.r%2B607b%7E%60s-13ac678cb27-0xb7"
+        },
+        {
+          "rlogid": "t6ulcpjqcj9%3Fuk%601d72f%2B12%60b-13ac678e09e-0xc0"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "304"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:31 GMT"
+        },
+        {
+          "expires": "Thu, 27 Sep 2012 23:15:40 GMT"
+        },
+        {
+          "last-modified": "Fri, 21 Jan 2011 20:52:52 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "366"
+        },
+        {
+          "etag": "\"0aa782badb9cb1:682\""
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "lucky9=1959890; Domain=.ebay.com; Expires=Thu, 02-Nov-2017 13:32:32 GMT; Path=/"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "80050"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:31 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 23:04:12 GMT"
+        },
+        {
+          "transaction": "uk.r+607b~go,RcmdId FindingProductv4,RlogId p4pmiw%60jtb9%3Fuk.r%2B607b%7Ego-13ac6790aa0-0xb6"
+        },
+        {
+          "rlogid": "t6ulcpjqcj9%3Fuk%601d72f%2B12%60b-13ac678e09e-0xc0"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "304"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:32 GMT"
+        },
+        {
+          "expires": "Fri, 26 Oct 2012 04:43:31 GMT"
+        },
+        {
+          "last-modified": "Thu, 06 Oct 2005 21:29:14 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "366"
+        },
+        {
+          "etag": "\"0aa782badb9cb1:682\""
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:32 GMT"
+        },
+        {
+          "expires": "Fri, 14 Dec 2012 13:33:03 GMT"
+        },
+        {
+          "last-modified": "Wed, 02 May 2012 23:09:29 GMT"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1544"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4n%60rujfudlwc%3D9un%7F4g65%60%28c1eg-13ac67910d1-0x179"
+        },
+        {
+          "cache-control": "private, no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:32 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Tue, 29 May 2012 21:33:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4908"
+        },
+        {
+          "cache-control": "max-age=8305824"
+        },
+        {
+          "expires": "Thu, 07 Feb 2013 16:42:57 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:33 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "lucky9=1959890; Domain=.ebay.com; Expires=Thu, 02-Nov-2017 13:32:36 GMT; Path=/"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-length": "91130"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:36 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 23:04:12 GMT"
+        },
+        {
+          "transaction": "uk.r+607b~go,RcmdId FindingProductv4,RlogId p4pmiw%60jtb9%3Fuk.r%2B607b%7Ego-13ac6790aa0-0xb6"
+        },
+        {
+          "rlogid": "t6ulcpjqcj9%3Fuk%601d72f%2B12%60b-13ac678e09e-0xc0"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "304"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:37 GMT"
+        },
+        {
+          "expires": "Thu, 27 Sep 2012 23:15:40 GMT"
+        },
+        {
+          "last-modified": "Fri, 21 Jan 2011 20:52:52 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "366"
+        },
+        {
+          "etag": "\"0aa782badb9cb1:682\""
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "lucky9=1959890; Domain=.ebay.com; Expires=Thu, 02-Nov-2017 13:32:37 GMT; Path=/"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "80060"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:37 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 23:04:12 GMT"
+        },
+        {
+          "transaction": "v .r+616d2tu,RcmdId FindingProductv4,RlogId p4pmiw%60jtb9%3Fv%7F.r%2B616d2tu-13ac6791ff9-0xbc"
+        },
+        {
+          "rlogid": "t6ulcpjqcj9%3Fuk%601d72f%2B12%60b-13ac678e09e-0xc0"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "304"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:38 GMT"
+        },
+        {
+          "expires": "Fri, 26 Oct 2012 04:43:31 GMT"
+        },
+        {
+          "last-modified": "Thu, 06 Oct 2005 21:29:14 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "366"
+        },
+        {
+          "etag": "\"0aa782badb9cb1:682\""
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 27 Sep 2010 09:07:24 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1290"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "cache-control": "private, max-age=31536000"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:32:39 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:39 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cteonnt-length": "4588"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4n%60rujfudlwc%3D9un%7F4g66%60%283d30-13ac67928dc-0x197"
+        },
+        {
+          "cache-control": "private, no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:39 GMT"
+        },
+        {
+          "content-length": "42"
+        },
+        {
+          "set-cookie": "npii=btguid/c67883f113a0a56964e646c6ffaa1ac152765078^cguid/c67885c613a0a0a9f6568b16ff5917ee52765078^; Domain=.ebay.com; Expires=Sun, 03-Nov-2013 13:32:40 GMT; Path=/"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa ADMa DEVa PSDo PSAa OUR SAMo IND UNI COM NAV INT STA DEM PRE\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "lucky9=1959890; Domain=.ebay.com; Expires=Thu, 02-Nov-2017 13:32:39 GMT; Path=/"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-length": "91165"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:39 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 23:04:12 GMT"
+        },
+        {
+          "transaction": "v .r+616d2tu,RcmdId FindingProductv4,RlogId p4pmiw%60jtb9%3Fv%7F.r%2B616d2tu-13ac6791ff9-0xbc"
+        },
+        {
+          "rlogid": "t6ulcpjqcj9%3Fuk%601d72f%2B12%60b-13ac678e09e-0xc0"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4n%60rujfudlwc%3D9un%7F4g65%60%28555f-13ac6792d15-0x18d"
+        },
+        {
+          "cache-control": "private, no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:41 GMT"
+        },
+        {
+          "content-length": "42"
+        },
+        {
+          "set-cookie": "npii=bcguid/c67885c613a0a0a9f6568b16ff5917ee52765079^tguid/c67883f113a0a56964e646c6ffaa1ac152765079^; Domain=.ebay.com; Expires=Sun, 03-Nov-2013 13:32:41 GMT; Path=/"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa ADMa DEVa PSDo PSAa OUR SAMo IND UNI COM NAV INT STA DEM PRE\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "301"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "lucky9=1959890; Domain=.ebay.com; Expires=Thu, 02-Nov-2017 13:32:42 GMT; Path=/"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "location": "http://www.ebay.com/fashion/health-beauty"
+        },
+        {
+          "rlogid": "p4pmiw%60jtb9%3Fv%7F.wcc%60dh72%3C-13ac6793402"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:42 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "lucky9=1959890; Domain=.ebay.com; Expires=Thu, 02-Nov-2017 13:32:43 GMT; Path=/"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-length": "12792"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 23:04:12 GMT"
+        },
+        {
+          "transaction": "v .r+616d2tu,RcmdId FindingProductv4,RlogId p4pmiw%60jtb9%3Fv%7F.r%2B616d2tu-13ac6791ff9-0xbc"
+        },
+        {
+          "rlogid": "p4u%60tsjfgkpfiuf%3F%3Ctq%28qq.d%605g%6053-13ac679336d"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 23:47:45 GMT"
+        },
+        {
+          "last-modified": "Thu, 05 Jul 2012 18:43:18 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "2469"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Thu, 24 May 2012 16:22:27 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5850"
+        },
+        {
+          "cache-control": "max-age=31509956"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 06:18:39 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "access-control-allow-origin": "*"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 27 Sep 2010 09:07:24 GMT"
+        },
+        {
+          "content-type": "text/css;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5679"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "cache-control": "public, max-age=31536000"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:32:43 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cteonnt-length": "4588"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 15:54:54 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "6322"
+        },
+        {
+          "cache-control": "max-age=31522197"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 09:42:40 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "access-control-allow-origin": "*"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9u%7E*t%28750g07n-13aac9b9c70-0x176"
+        },
+        {
+          "last-modified": "Wed, 24 Oct 2012 22:29:19 GMT"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "250"
+        },
+        {
+          "cache-control": "max-age=31102053"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 13:00:16 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 26 Dec 2011 17:33:25 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5900"
+        },
+        {
+          "cache-control": "max-age=31504816"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 04:52:59 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "access-control-allow-origin": "*"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 15:32:58 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3953"
+        },
+        {
+          "cache-control": "max-age=31511815"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 06:49:38 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "access-control-allow-origin": "*"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 17:37:08 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4418"
+        },
+        {
+          "cache-control": "max-age=29623692"
+        },
+        {
+          "expires": "Sat, 12 Oct 2013 10:20:55 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 27 Sep 2010 09:07:24 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "10098"
+        },
+        {
+          "cache-control": "private, max-age=31536000"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:32:43 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "last-modified": "Tue, 07 Aug 2012 21:01:25 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"804039cedf74cd1:603\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "113266"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Tue, 07 Aug 2012 05:29:55 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7341"
+        },
+        {
+          "cache-control": "max-age=19386157"
+        },
+        {
+          "expires": "Sat, 15 Jun 2013 22:35:20 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "access-control-allow-origin": "*"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Tue, 23 Oct 2012 21:57:15 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7462"
+        },
+        {
+          "cache-control": "max-age=31508534"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 05:54:57 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "access-control-allow-origin": "*"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 02:39:26 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "10090"
+        },
+        {
+          "cache-control": "max-age=31501318"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 03:54:41 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "access-control-allow-origin": "*"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 16 Oct 2012 19:32:45 GMT"
+        },
+        {
+          "content-type": "text/css;charset=UTF-8"
+        },
+        {
+          "content-length": "6377"
+        },
+        {
+          "cache-control": "max-age=30002402"
+        },
+        {
+          "expires": "Wed, 16 Oct 2013 19:32:45 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Tue, 29 May 2012 19:40:07 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4488"
+        },
+        {
+          "cache-control": "max-age=7260395"
+        },
+        {
+          "expires": "Sat, 26 Jan 2013 14:19:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Fri, 20 Jul 2012 23:29:38 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4889"
+        },
+        {
+          "cache-control": "max-age=19908420"
+        },
+        {
+          "expires": "Fri, 21 Jun 2013 23:39:43 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Tue, 09 Oct 2012 14:02:17 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3638"
+        },
+        {
+          "cache-control": "max-age=28507880"
+        },
+        {
+          "expires": "Sun, 29 Sep 2013 12:24:03 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Tue, 02 Oct 2012 18:02:08 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5356"
+        },
+        {
+          "cache-control": "max-age=29198995"
+        },
+        {
+          "expires": "Mon, 07 Oct 2013 12:22:38 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "access-control-allow-origin": "*"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Thu, 12 Jul 2012 01:56:06 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4607"
+        },
+        {
+          "cache-control": "max-age=20432905"
+        },
+        {
+          "expires": "Fri, 28 Jun 2013 01:21:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 23 Jul 2012 16:18:08 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5128"
+        },
+        {
+          "cache-control": "max-age=23738740"
+        },
+        {
+          "expires": "Mon, 05 Aug 2013 07:38:23 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 16:44:35 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7892"
+        },
+        {
+          "cache-control": "max-age=31534799"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:12:42 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "access-control-allow-origin": "*"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Tue, 16 Oct 2012 03:33:23 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4234"
+        },
+        {
+          "cache-control": "max-age=29726488"
+        },
+        {
+          "expires": "Sun, 13 Oct 2013 14:54:11 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 20 Aug 2012 20:26:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3021"
+        },
+        {
+          "cache-control": "max-age=26204352"
+        },
+        {
+          "expires": "Mon, 02 Sep 2013 20:31:55 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Fri, 28 Sep 2012 15:22:25 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4919"
+        },
+        {
+          "cache-control": "max-age=30719689"
+        },
+        {
+          "expires": "Fri, 25 Oct 2013 02:47:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Sun, 22 Jul 2012 18:13:25 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4788"
+        },
+        {
+          "cache-control": "max-age=20831615"
+        },
+        {
+          "expires": "Tue, 02 Jul 2013 16:06:19 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:44 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Fri, 06 Jul 2012 20:15:28 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3987"
+        },
+        {
+          "cache-control": "max-age=17873930"
+        },
+        {
+          "expires": "Wed, 29 May 2013 10:31:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:44 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Thu, 16 Aug 2012 14:53:01 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4623"
+        },
+        {
+          "cache-control": "max-age=20477655"
+        },
+        {
+          "expires": "Fri, 28 Jun 2013 13:46:59 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:44 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Fri, 27 Jul 2012 17:58:05 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4821"
+        },
+        {
+          "cache-control": "max-age=20499738"
+        },
+        {
+          "expires": "Fri, 28 Jun 2013 19:55:02 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:44 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Fri, 13 Jul 2012 05:37:24 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5080"
+        },
+        {
+          "cache-control": "max-age=19887245"
+        },
+        {
+          "expires": "Fri, 21 Jun 2013 17:46:49 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:44 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 19:02:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "18863"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "cache-control": "max-age=40850"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 00:53:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Thu, 27 Sep 2012 13:24:40 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "10030"
+        },
+        {
+          "cache-control": "max-age=31521522"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 09:31:25 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "access-control-allow-origin": "*"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 16 Jul 2012 07:04:19 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "6320"
+        },
+        {
+          "cache-control": "max-age=23373247"
+        },
+        {
+          "expires": "Thu, 01 Aug 2013 02:06:51 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:44 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "access-control-allow-origin": "*"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9u%7E*t%28750g3%7E1-13a3ef29997-0x16d"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 05:17:21 GMT"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "60127"
+        },
+        {
+          "cache-control": "max-age=29262216"
+        },
+        {
+          "expires": "Tue, 08 Oct 2013 05:56:19 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Tue, 10 Jul 2012 21:28:46 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5983"
+        },
+        {
+          "cache-control": "max-age=23738926"
+        },
+        {
+          "expires": "Mon, 05 Aug 2013 07:41:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 14:51:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "11895"
+        },
+        {
+          "cache-control": "max-age=31510005"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 06:19:28 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 08:46:05 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7674"
+        },
+        {
+          "cache-control": "max-age=31245727"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 04:54:50 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Wed, 08 Aug 2012 18:20:46 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "12744"
+        },
+        {
+          "cache-control": "max-age=26388803"
+        },
+        {
+          "expires": "Wed, 04 Sep 2013 23:46:06 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Mon, 27 Aug 2012 19:38:43 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5852"
+        },
+        {
+          "cache-control": "max-age=27384452"
+        },
+        {
+          "expires": "Mon, 16 Sep 2013 12:20:15 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Tue, 22 Nov 2011 18:32:07 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "6016"
+        },
+        {
+          "cache-control": "max-age=31505442"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 05:03:25 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Sun, 23 Sep 2012 20:27:09 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "8741"
+        },
+        {
+          "cache-control": "max-age=28128091"
+        },
+        {
+          "expires": "Wed, 25 Sep 2013 02:54:14 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Thu, 25 Oct 2012 18:53:28 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5727"
+        },
+        {
+          "cache-control": "max-age=31502723"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 04:18:06 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Tue, 16 Oct 2012 19:32:46 GMT"
+        },
+        {
+          "content-type": "application/x-javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "54418"
+        },
+        {
+          "cache-control": "max-age=30002439"
+        },
+        {
+          "expires": "Wed, 16 Oct 2013 19:33:22 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:44 GMT"
+        },
+        {
+          "last-modified": "Tue, 22 May 2012 19:02:53 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "2288"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:44 GMT"
+        },
+        {
+          "expires": "Sun, 25 Nov 2012 23:46:56 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Aug 2011 00:39:15 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "cache-control": "max-age=3888000"
+        },
+        {
+          "content-length": "5743"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Sun, 15 Jul 2012 05:26:27 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "6174"
+        },
+        {
+          "cache-control": "max-age=20606181"
+        },
+        {
+          "expires": "Sun, 30 Jun 2013 01:29:05 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:44 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 20:13:40 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "8182"
+        },
+        {
+          "cache-control": "max-age=30802674"
+        },
+        {
+          "expires": "Sat, 26 Oct 2013 01:50:38 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:44 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9u%7E*t%28750g065-13911ec26be-0x16d"
+        },
+        {
+          "last-modified": "Wed, 08 Aug 2012 21:42:19 GMT"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "58636"
+        },
+        {
+          "cache-control": "max-age=24211902"
+        },
+        {
+          "expires": "Sat, 10 Aug 2013 19:04:25 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:44 GMT"
+        },
+        {
+          "last-modified": "Wed, 03 Oct 2012 22:05:50 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"804039cedf74cd1:603\""
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "content-length": "63909"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 15:58:50 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "13008"
+        },
+        {
+          "cache-control": "max-age=31535919"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:31:22 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4n%60rujfudlwc%3D9vt*ts67.4e6f0e0-13ac6793f33-0x19b"
+        },
+        {
+          "cache-control": "private, no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:45 GMT"
+        },
+        {
+          "content-length": "42"
+        },
+        {
+          "set-cookie": "npii=btguid/c67883f113a0a56964e646c6ffaa1ac15276507d^cguid/c67885c613a0a0a9f6568b16ff5917ee5276507d^; Domain=.ebay.com; Expires=Sun, 03-Nov-2013 13:32:45 GMT; Path=/"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa ADMa DEVa PSDo PSAa OUR SAMo IND UNI COM NAV INT STA DEM PRE\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "rlogid": "p4pphdlwc%3D9u%7E*t%28750g3%7Fo-13a40772552-0x169"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 05:19:14 GMT"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "115864"
+        },
+        {
+          "cache-control": "max-age=29287759"
+        },
+        {
+          "expires": "Tue, 08 Oct 2013 13:02:02 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-length": "2703"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Wed, 28 Mar 2012 22:30:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:44 GMT"
+        },
+        {
+          "expires": "Tue, 30 Oct 2012 19:27:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "lucky9=1959890; Domain=.ebay.com; Expires=Thu, 02-Nov-2017 13:32:58 GMT; Path=/"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/javascript;charset=UTF-8"
+        },
+        {
+          "content-length": "80064"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:32:58 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 23:04:12 GMT"
+        },
+        {
+          "transaction": "uk.r+607b~k|,RcmdId FindingProductv4,RlogId p4pmiw%60jtb9%3Fuk.r%2B607b%7Ek%7C-13ac6796fd6-0xc1"
+        },
+        {
+          "rlogid": "p4u%60tsjfgkpfiuf%3F%3Ctq%28qq.d%605g%6053-13ac679336d"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_26.json b/jetty-http2/http2-hpack/src/test/resources/data/story_26.json
new file mode 100644
index 0000000..143ced2
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_26.json
@@ -0,0 +1,4439 @@
+{
+  "context": "response",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "522"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:20 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "IVe/SwucJuBsLtVHWJw2PMdOTOxuEWUir5igQNThkTg="
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "cache-control": "public, max-age=17216869"
+        },
+        {
+          "expires": "Tue, 21 May 2013 19:18:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:44 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "text/css; charset=utf-8"
+        },
+        {
+          "last-modified": "Tue, 24 Apr 2012 22:13:35 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "95tUymdadFLd8Dpml8VnOoUG7KhisOwk74Kd/aIGfU0="
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "123"
+        },
+        {
+          "cache-control": "public, max-age=16394910"
+        },
+        {
+          "expires": "Sun, 12 May 2013 06:59:14 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:44 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "text/css; charset=utf-8"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:37:35 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "Qc0GcUiwi3io8aSRIdXaahYr6KKhphvV6NlN8vo/bD4="
+        },
+        {
+          "content-length": "14684"
+        },
+        {
+          "cache-control": "public, max-age=31067635"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 02:44:39 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:44 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:23 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "7exUqkoZxtfLseR1zLxJlXnpYK6MOognZuCKx7drdRo="
+        },
+        {
+          "content-length": "14438"
+        },
+        {
+          "cache-control": "public, max-age=24926560"
+        },
+        {
+          "expires": "Mon, 19 Aug 2013 00:53:24 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:44 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 17:08:56 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "eRvyJLXIvW3Vu9d+m439v+LGKqXiLSKmz7w9/xMAUpc="
+        },
+        {
+          "content-length": "17475"
+        },
+        {
+          "cache-control": "public, max-age=31124427"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 18:31:11 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:44 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "text/css; charset=utf-8"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 22:55:27 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "14hoEcywNNMBIVUS5B7AD7RDGiDvJ4BGeOVgJbBDzf0="
+        },
+        {
+          "content-length": "44191"
+        },
+        {
+          "cache-control": "public, max-age=31067635"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 02:44:39 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:44 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 18:34:48 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "41/HuGcFNMmys4cvGKlBeylojdVDP4+VBIf1giu3eNQ="
+        },
+        {
+          "content-length": "754"
+        },
+        {
+          "cache-control": "public, max-age=29985162"
+        },
+        {
+          "expires": "Wed, 16 Oct 2013 14:03:31 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:49 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Thu, 25 Oct 2012 16:05:53 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "oKQwv0JLYost+zqlv8x+C7MEL7zRBbeMomoc54M5RZY="
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2349"
+        },
+        {
+          "cache-control": "public, max-age=31067361"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 02:40:10 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:49 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "2626"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:08:50 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "zh8tRHKFtERIZ+K/eGiM1utm1H66OnOj1qwPAN7Ck9A="
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "cache-control": "public, max-age=31068570"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 03:00:19 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:49 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Fri, 28 Sep 2012 15:01:14 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "pricqIchHztHxKAQSidQiwGmRf62vAL6I7Oi0r/Ki08="
+        },
+        {
+          "content-length": "8036"
+        },
+        {
+          "cache-control": "public, max-age=31066940"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 02:33:09 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:49 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 21:42:19 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "Kur2FUUQjAQ0yPQJC9fvK56/+LWZHvyQF6Ce2Fuaf2k="
+        },
+        {
+          "content-length": "36302"
+        },
+        {
+          "cache-control": "public, max-age=31068470"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 02:58:39 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:49 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:02:51 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "wk2MWysJhw3Et7CRGMA1sE9HWuyzy8oCvtT2V7iPXeg="
+        },
+        {
+          "content-length": "8230"
+        },
+        {
+          "cache-control": "public, max-age=25639699"
+        },
+        {
+          "expires": "Tue, 27 Aug 2013 06:59:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:49 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 21:38:44 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "GMzzyj0B89LYf1zKH9hqxZekz5mYTmsuxwLugWyc2Gg="
+        },
+        {
+          "content-length": "4878"
+        },
+        {
+          "cache-control": "public, max-age=31068529"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 02:59:38 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:49 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 04:37:48 GMT"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:37:48 GMT"
+        },
+        {
+          "content-type": "application/ocsp-response"
+        },
+        {
+          "content-transfer-encoding": "binary"
+        },
+        {
+          "content-length": "1814"
+        },
+        {
+          "cache-control": "max-age=575215, public, no-transform, must-revalidate"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:53 GMT"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "connection": "Keep-Alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        },
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "x-fb-metrics": "{\"w\":53,\"r\":26,\"q\":0,\"a\":25}"
+        },
+        {
+          "x-fb-server": "10.74.89.23"
+        },
+        {
+          "x-fb-debug": "7iLjsQVXsunUKXe3NlV2ytaBGzQ0VHCkMX/J6rEuB6Y="
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:54 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "43"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "text/css; charset=utf-8"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 15:06:53 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "ur+THlFHeLotsmDlQWYPw2GRELyvg28JmE0JYVt56uo="
+        },
+        {
+          "content-length": "1155"
+        },
+        {
+          "cache-control": "public, max-age=31067714"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 02:46:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:54 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "text/css; charset=utf-8"
+        },
+        {
+          "last-modified": "Fri, 31 Aug 2012 22:13:28 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "6/fKHkRtBpT4oqBg33tFHk2pO6SDZlUG11Uq4/AlUIE="
+        },
+        {
+          "content-length": "516"
+        },
+        {
+          "cache-control": "public, max-age=26316304"
+        },
+        {
+          "expires": "Wed, 04 Sep 2013 02:55:58 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:54 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "232"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Sat, 21 Apr 2012 07:03:57 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "XtTsONeGHGs/1vRRv8cvNY1ciB3XqlrvnTq2GZXvnqM="
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "cache-control": "public, max-age=30419619"
+        },
+        {
+          "expires": "Mon, 21 Oct 2013 14:44:35 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:56 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Fri, 07 Sep 2012 15:18:40 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "E2JBYTapyXFjxTTVqkrekTVKDp1lDQQT/7YxcxfNU2U="
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "400"
+        },
+        {
+          "cache-control": "public, max-age=31066933"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 02:33:09 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:56 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 21:41:45 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "iPbLdjapQzRoatbOUDrN+exDj8EPHJAcsZ48pVtprtA="
+        },
+        {
+          "content-length": "35766"
+        },
+        {
+          "cache-control": "public, max-age=31068980"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 03:07:14 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:54 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 14:34:50 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "0ci0R5R2ivIVCRrwtG507Eej+LTK8dUL8dIiZp70+dU="
+        },
+        {
+          "content-length": "10902"
+        },
+        {
+          "cache-control": "public, max-age=31066965"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 02:33:40 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:55 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "text/css; charset=utf-8"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:38:28 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "P2Bq0ebVXjtf8GyQp1HHux8NxlftUMXZuY8XF+yaOVo="
+        },
+        {
+          "content-length": "4676"
+        },
+        {
+          "cache-control": "public, max-age=31088728"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 08:36:24 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:56 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "text/css; charset=utf-8"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:37:10 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "yHzV/c0w3ZyInkRbLCDrA0t5adSMyAG4prBOk+i+t6Y="
+        },
+        {
+          "content-length": "20791"
+        },
+        {
+          "cache-control": "public, max-age=31067654"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 02:45:10 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:56 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "11113"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 14:34:47 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "u363OvKFmnm717JBUXA5ePB8Ts0ppRI7+eEJwOOep6w="
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "cache-control": "public, max-age=31066988"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 02:34:04 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:56 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:02:57 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "Yty+Te4OzfswtmjzbJmJZaybyM0hxXiRU2NtHEbDuPE="
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "cache-control": "public, max-age=25753573"
+        },
+        {
+          "expires": "Wed, 28 Aug 2013 14:37:09 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:56 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:24 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "yKFyrxwqBiumMPfWvv4morUUsmz9djZtSdmCoQMnchs="
+        },
+        {
+          "content-length": "571"
+        },
+        {
+          "cache-control": "public, max-age=25753811"
+        },
+        {
+          "expires": "Wed, 28 Aug 2013 14:41:07 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:56 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:22 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "HbryxnP7HNa7kdTChA6BppSjLQw0gz9ZzESCqEH3/9k="
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "cache-control": "public, max-age=25753770"
+        },
+        {
+          "expires": "Wed, 28 Aug 2013 14:40:26 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:56 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Tue, 28 Aug 2012 01:20:00 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "edgqdu1lFmUW32Et2hHoiAsp9kFIch8QDiciO71cQ4w="
+        },
+        {
+          "content-length": "12817"
+        },
+        {
+          "cache-control": "public, max-age=26458041"
+        },
+        {
+          "expires": "Thu, 05 Sep 2013 18:18:17 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:56 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:09:30 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "rXXtxI3fPgNHe6wKIDRBR0xjttUNeG+BDQM8QfKQa+A="
+        },
+        {
+          "content-length": "11688"
+        },
+        {
+          "cache-control": "public, max-age=31068990"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 03:07:27 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:57 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "35165"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:06:47 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "fUJ2Nc9qJdBC1AnYFA5Vs1f7ozv+i/PTKO+Vep0A0HQ="
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "cache-control": "public, max-age=31068521"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 02:59:38 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:57 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:07:00 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "s9ZmJKnYGlEjIGo8xQzxlhVM4nilGHgcv1fhK1Z7F1w="
+        },
+        {
+          "content-length": "1028"
+        },
+        {
+          "cache-control": "public, max-age=31191849"
+        },
+        {
+          "expires": "Wed, 30 Oct 2013 13:15:07 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:58 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:07:08 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "hMQvA7xhuAspt5fOxedr0fWzQZNLkyizVtlmspzgVG8="
+        },
+        {
+          "content-length": "47844"
+        },
+        {
+          "cache-control": "public, max-age=31068990"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 03:07:27 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:57 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 19:17:24 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "1EkJKYLfWucaDVhZCEVAAo57HpAH7rvF4r9IwDXM2B8="
+        },
+        {
+          "content-length": "42391"
+        },
+        {
+          "cache-control": "public, max-age=31143832"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 23:54:49 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:57 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "13181"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:10:32 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "dO6OKUf38jDdtAnTrM28wZTBz9Y5hU/0EJdd1CkWGDs="
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "cache-control": "public, max-age=31068989"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 03:07:27 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:58 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 19:03:57 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "IlZ4dyc3v7fqrfiamqJbFeFTWRkUvEUs2L8KLXNa+5o="
+        },
+        {
+          "content-length": "23736"
+        },
+        {
+          "cache-control": "public, max-age=31478360"
+        },
+        {
+          "expires": "Sat, 02 Nov 2013 20:50:17 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:57 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 20:35:28 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "REVz0k4Gud7bedzv9KSTG2i1KOporb0T14mWht95MIE="
+        },
+        {
+          "content-length": "12969"
+        },
+        {
+          "cache-control": "public, max-age=31394885"
+        },
+        {
+          "expires": "Fri, 01 Nov 2013 21:39:03 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:58 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:06:44 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "VKvuYL/9rqvjXh7mr8LjSJmcgQLZ/a+Ztqj2aUsPacc="
+        },
+        {
+          "content-length": "8457"
+        },
+        {
+          "cache-control": "public, max-age=31088728"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 08:36:26 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:58 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        },
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "x-fb-metrics": "{\"w\":26,\"r\":18,\"q\":0,\"a\":30}"
+        },
+        {
+          "x-fb-server": "10.164.86.49"
+        },
+        {
+          "x-fb-debug": "egJridVr0Ohgw3QbFe66p8hTV/ZDa+ldtrrj55f1Dwg="
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "43"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        },
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "x-fb-metrics": "{\"w\":15,\"r\":74,\"q\":0,\"a\":21}"
+        },
+        {
+          "x-fb-server": "10.164.212.85"
+        },
+        {
+          "x-fb-debug": "7JVbUHGoJcLzIbHgkJPv0DSBycKYYPPorUc0i6OdRw8="
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "43"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        },
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "x-fb-metrics": "{\"w\":33,\"r\":14,\"q\":0,\"a\":27}"
+        },
+        {
+          "x-fb-server": "10.164.203.85"
+        },
+        {
+          "x-fb-debug": "SHFiC3r5rPZSoyQ6AT4o7Lrz58o2i0cRMRoLoKKAVLc="
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "10334"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        },
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "x-fb-metrics": "{\"w\":47,\"r\":27,\"q\":0,\"a\":24}"
+        },
+        {
+          "x-fb-server": "10.164.121.55"
+        },
+        {
+          "x-fb-debug": "B8TQ25HLrpUM+2nuhej+798G7ib2rXsLxKDRmmd6364="
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "79019"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:05 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "q1YlNQFhUrIi0HF88gF/s47itTMC0ALVS2i6Xo/eSFQ="
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "cache-control": "public, max-age=17216856"
+        },
+        {
+          "expires": "Tue, 21 May 2013 19:18:35 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:20 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "OOKrpYeJ1K2euVWUg0h3X4OLDU+bPXAhHe2ZbKmaIIo="
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "cache-control": "public, max-age=17216855"
+        },
+        {
+          "expires": "Tue, 21 May 2013 19:18:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-cnection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 21:42:28 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "BWYgCEbzeWyERD5oPP51t1mG+xnS0km1r6TZrds9BdY="
+        },
+        {
+          "content-length": "55530"
+        },
+        {
+          "cache-control": "public, max-age=31068989"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 03:07:27 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:58 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        },
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "x-fb-metrics": "{\"w\":47,\"r\":27,\"q\":0,\"a\":24}"
+        },
+        {
+          "x-fb-server": "10.164.121.55"
+        },
+        {
+          "x-fb-debug": "6DDnMStngO3Ec4qHVJLnouT/OjWIKWOh3p7X19lwA2E="
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "67"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "x-fb-debug": "DY+dO6Fs6HOjJLzXfO2vzcoACugopwtj+ZfSFe3+0Io="
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "67"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Mon, 15 Oct 2012 01:19:28 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "U3t5ojZAXSlz/rftvVXMdi+dQaAlCxv95u4nFdmaOpU="
+        },
+        {
+          "content-length": "6332"
+        },
+        {
+          "cache-control": "public, max-age=29865483"
+        },
+        {
+          "expires": "Tue, 15 Oct 2013 04:49:02 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:50:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:19 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "WkN9kzT0IbJnmPVAe/JpiO1KA3sDm5JiLNu+peaU22E="
+        },
+        {
+          "content-length": "1025"
+        },
+        {
+          "cache-control": "public, max-age=17216854"
+        },
+        {
+          "expires": "Tue, 21 May 2013 19:18:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:00 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-cnection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "7905"
+        },
+        {
+          "content-type": "text/css; charset=utf-8"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:38:51 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "flUDwRXAcKGlCZV+B6xp1kix2zMM2jCaLr8GXWfOS9o="
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "cache-control": "public, max-age=31191685"
+        },
+        {
+          "expires": "Wed, 30 Oct 2013 13:12:25 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:00 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "960"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Thu, 07 Jun 2012 20:17:10 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "s2bSrOgSOrnc1I2Y+hCmZNjO4JKRAsJvvEShk7xvQh0="
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "cache-control": "public, max-age=25753518"
+        },
+        {
+          "expires": "Wed, 28 Aug 2013 14:36:20 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:02 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Fri, 13 Jul 2012 13:05:49 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "dSqFMj3BQam7KrjoHsDUySNYx2e/ZA4jk+iLwQD5q+M="
+        },
+        {
+          "content-length": "1421"
+        },
+        {
+          "cache-control": "public, max-age=25753545"
+        },
+        {
+          "expires": "Wed, 28 Aug 2013 14:36:47 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:02 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-cnection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "3977"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 21:41:38 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "if1LyEGCEK6E/tHFIYqTdcReGf2YlH/8CNcvt0MSb5c="
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "cache-control": "public, max-age=31162173"
+        },
+        {
+          "expires": "Wed, 30 Oct 2013 05:00:35 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:02 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:03 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "0MQqsPt7SaQdEz9msJEk0wieC0zyyvfgvjy4gscfRm4="
+        },
+        {
+          "content-length": "316"
+        },
+        {
+          "cache-control": "public, max-age=25628126"
+        },
+        {
+          "expires": "Tue, 27 Aug 2013 03:46:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-cnection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "6779"
+        },
+        {
+          "last-modified": "Wed, 09 May 2012 22:55:50 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7899"
+        },
+        {
+          "last-modified": "Mon, 14 May 2012 09:15:54 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "8961"
+        },
+        {
+          "last-modified": "Fri, 10 Aug 2012 23:04:25 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        },
+        {
+          "expires": "Sat, 17 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7270"
+        },
+        {
+          "last-modified": "Thu, 17 May 2012 17:02:26 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        },
+        {
+          "expires": "Sat, 17 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "10284"
+        },
+        {
+          "last-modified": "Fri, 14 Sep 2012 13:43:01 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "6932"
+        },
+        {
+          "last-modified": "Tue, 15 May 2012 16:53:10 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "19404"
+        },
+        {
+          "last-modified": "Fri, 13 Jul 2012 21:38:17 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        },
+        {
+          "expires": "Sat, 17 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        },
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "x-fb-metrics": "{\"w\":23,\"r\":24,\"q\":0,\"a\":31}"
+        },
+        {
+          "x-fb-server": "10.164.204.89"
+        },
+        {
+          "x-fb-debug": "mhzgPOTS+rD7XyjD1gp3zWldoiZpmeeyK0sWCXxCmL8="
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:04 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "43"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        },
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "x-fb-metrics": "{\"w\":13,\"r\":137,\"q\":0,\"a\":23}"
+        },
+        {
+          "x-fb-server": "10.164.167.53"
+        },
+        {
+          "x-fb-debug": "uWC6Yw5Jjt8tp6GMW/0c7q4sQiyN+cfsFumyrajMSLE="
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:04 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "43"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        },
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "x-fb-metrics": "{\"w\":20,\"r\":43,\"q\":0,\"a\":30}"
+        },
+        {
+          "x-fb-server": "10.165.52.67"
+        },
+        {
+          "x-fb-debug": "K6O9zzGnsjkFUcjVnvogKEp8WyYKDD5/1SRA3JOqTz8="
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:04 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "10334"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        },
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "x-fb-metrics": "{\"w\":40,\"r\":33,\"q\":0,\"a\":22}"
+        },
+        {
+          "x-fb-server": "10.164.10.79"
+        },
+        {
+          "x-fb-debug": "gU+KRCRWrUp+aETSVFA2+QqzJ57Mry5y8i9NZISRzV4="
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:04 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "79019"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        },
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "x-fb-metrics": "{\"w\":40,\"r\":33,\"q\":0,\"a\":22}"
+        },
+        {
+          "x-fb-server": "10.164.10.79"
+        },
+        {
+          "x-fb-debug": "2KYdrNd+vAjbaW2+l9lZ0c9qQnQQuLC0uV+aDWEfnEs="
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:04 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "67"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "x-fb-debug": "ltZY31wZe0x9jjXZ+/GQMCIZ6L+UzLcVFaj4Ye8cEag="
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:04 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "67"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "32220"
+        },
+        {
+          "last-modified": "Mon, 15 Oct 2012 15:37:08 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "105703"
+        },
+        {
+          "last-modified": "Mon, 15 Oct 2012 15:38:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "36768"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 01:55:42 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "119574"
+        },
+        {
+          "last-modified": "Fri, 26 Oct 2012 09:41:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "659"
+        },
+        {
+          "content-type": "image/x-icon"
+        },
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:22 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "yE8mx2kOMcI8Q4MtoKCXYAXv7xSMQBGufoB0y/qkYEs="
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "cache-control": "public, max-age=16309260"
+        },
+        {
+          "expires": "Sat, 11 May 2013 07:12:06 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "6966"
+        },
+        {
+          "last-modified": "Thu, 17 May 2012 16:26:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        },
+        {
+          "expires": "Sat, 17 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4501"
+        },
+        {
+          "last-modified": "Fri, 06 Jul 2012 11:36:45 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "37432"
+        },
+        {
+          "last-modified": "Mon, 04 Jun 2012 08:35:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7198"
+        },
+        {
+          "last-modified": "Tue, 15 May 2012 16:45:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "13454"
+        },
+        {
+          "last-modified": "Thu, 31 May 2012 01:48:38 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "access-control-allow-origin": "http://www.facebook.com"
+        },
+        {
+          "access-control-allow-credentials": "true"
+        },
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:08 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "19537"
+        },
+        {
+          "last-modified": "Tue, 19 Jun 2012 08:51:27 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        },
+        {
+          "expires": "Sat, 17 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5842"
+        },
+        {
+          "last-modified": "Mon, 14 May 2012 22:03:47 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "6973"
+        },
+        {
+          "last-modified": "Tue, 22 May 2012 23:26:43 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7263"
+        },
+        {
+          "last-modified": "Mon, 11 Jun 2012 21:11:11 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "6222"
+        },
+        {
+          "last-modified": "Tue, 15 May 2012 02:10:10 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        },
+        {
+          "expires": "Sat, 17 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "8005"
+        },
+        {
+          "last-modified": "Fri, 13 Jul 2012 02:50:27 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7949"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 17:25:30 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5850"
+        },
+        {
+          "last-modified": "Wed, 23 May 2012 13:04:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4860"
+        },
+        {
+          "last-modified": "Fri, 18 May 2012 06:59:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "36615"
+        },
+        {
+          "last-modified": "Fri, 08 Jun 2012 09:18:35 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "26180"
+        },
+        {
+          "last-modified": "Fri, 01 Jun 2012 12:58:28 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "8551"
+        },
+        {
+          "last-modified": "Wed, 16 May 2012 00:19:20 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7021"
+        },
+        {
+          "last-modified": "Fri, 18 May 2012 08:58:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "8126"
+        },
+        {
+          "last-modified": "Thu, 17 May 2012 10:31:00 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "21780"
+        },
+        {
+          "last-modified": "Fri, 20 Jul 2012 20:43:14 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "16109"
+        },
+        {
+          "last-modified": "Fri, 08 Jun 2012 21:45:00 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5248"
+        },
+        {
+          "last-modified": "Tue, 15 May 2012 17:19:22 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7600"
+        },
+        {
+          "last-modified": "Tue, 15 May 2012 00:02:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "8148"
+        },
+        {
+          "last-modified": "Tue, 04 Sep 2012 05:25:17 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        },
+        {
+          "expires": "Sat, 17 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "23688"
+        },
+        {
+          "last-modified": "Tue, 05 Jun 2012 16:58:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        },
+        {
+          "expires": "Sat, 17 Nov 2012 12:51:10 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "32579"
+        },
+        {
+          "last-modified": "Fri, 15 Jun 2012 23:21:31 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "36154"
+        },
+        {
+          "last-modified": "Tue, 15 May 2012 16:53:04 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "8261"
+        },
+        {
+          "last-modified": "Thu, 17 May 2012 16:15:19 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "34603"
+        },
+        {
+          "last-modified": "Tue, 05 Jun 2012 19:33:30 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        },
+        {
+          "expires": "Sat, 17 Nov 2012 12:51:03 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "19320"
+        },
+        {
+          "last-modified": "Fri, 20 Jul 2012 22:33:10 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "text/css; charset=utf-8"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 21:59:56 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "cEr4CpqyPlutZEM5egM7EW1V/FoNLas8puqhILOyn6g="
+        },
+        {
+          "content-length": "1589"
+        },
+        {
+          "cache-control": "public, max-age=31191410"
+        },
+        {
+          "expires": "Wed, 30 Oct 2013 13:08:05 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:15 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-cnection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:34 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "SjbWzWIhc5uDeUgKzkah4oVawEfOfsqgn79tJvLiODA="
+        },
+        {
+          "content-length": "124"
+        },
+        {
+          "cache-control": "public, max-age=25632795"
+        },
+        {
+          "expires": "Tue, 27 Aug 2013 05:04:30 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:15 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-cnection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:02:59 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "8BYYADIiLWZPRqrmghOTJnnu5b75InjLJYums29XQC4="
+        },
+        {
+          "content-length": "178"
+        },
+        {
+          "cache-control": "public, max-age=25638838"
+        },
+        {
+          "expires": "Tue, 27 Aug 2013 06:45:13 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:15 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Fri, 26 Oct 2012 21:42:07 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "rg/3x10ePyW5+Yv14okaeMgQpdIDitUpRdeQlHd62wU="
+        },
+        {
+          "content-length": "3403"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "cache-control": "public, max-age=31099667"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 11:39:02 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:15 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:11:34 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "+G0d7Y1/nAK76h5l1ygZcgFyqkHdYYjzu9bN8TThTW0="
+        },
+        {
+          "content-length": "3794"
+        },
+        {
+          "cache-control": "public, max-age=31090886"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 09:12:42 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:16 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-cnection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Thu, 27 Sep 2012 22:19:28 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "Zx9+0hICgorbmj40+TVQqx/6DWk0JFijw5sOouOK4x8="
+        },
+        {
+          "content-length": "4316"
+        },
+        {
+          "cache-control": "public, max-age=31191442"
+        },
+        {
+          "expires": "Wed, 30 Oct 2013 13:08:38 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:16 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:02:59 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "y9gp03qLmGwdrjrggsFyxKUnduRuH6ZkhHy3J217wnA="
+        },
+        {
+          "content-length": "82"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "cache-control": "public, max-age=25628121"
+        },
+        {
+          "expires": "Tue, 27 Aug 2013 03:46:37 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:16 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:15 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "y31IzOtXz6QEqDb4Yh8nL9E7Jz3QdrtFTVTfJpFI67s="
+        },
+        {
+          "content-length": "281"
+        },
+        {
+          "cache-control": "public, max-age=25628127"
+        },
+        {
+          "expires": "Tue, 27 Aug 2013 03:46:43 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:16 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-cnection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:07:48 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "cdKo7nf6SbFgEUsu8p8ZpYkyd14IkSsYwu8pEpjIPW8="
+        },
+        {
+          "content-length": "18581"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "cache-control": "public, max-age=31068960"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 03:07:15 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:15 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "text/css; charset=utf-8"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:28:22 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "Mcoj0fymAm3BWRvLoE9uVgrJkXk8Wldn9hUKly6PE60="
+        },
+        {
+          "content-length": "686"
+        },
+        {
+          "cache-control": "public, max-age=31067324"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 02:40:01 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-cnection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "70824"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 14:35:10 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "U6CnJQe7lFM5/wvYBRcEyvixo284qs3dxFI4vIJ3Sfo="
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "cache-control": "public, max-age=31117935"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 16:43:30 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:15 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "6953"
+        },
+        {
+          "content-type": "application/x-shockwave-flash"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 18:56:50 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "8ROXKJ/K5IoNZG3RcJoN8LoohKyoDW2iTe6nY9hRINI="
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "cache-control": "public, max-age=260332"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 13:10:12 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "6953"
+        },
+        {
+          "content-type": "application/x-shockwave-flash"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 18:56:50 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "8ROXKJ/K5IoNZG3RcJoN8LoohKyoDW2iTe6nY9hRINI="
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "cache-control": "public, max-age=260331"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 13:10:12 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:21 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 17:45:29 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-fb-debug": "casrvtlqM38DGgUK+sC64wYFWqXchCM2wnMjgM8VC98="
+        },
+        {
+          "content-length": "15685"
+        },
+        {
+          "cache-control": "public, max-age=31299110"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 19:03:10 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-cnection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "1591"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "last-modified": "Thu, 20 Sep 2012 01:12:35 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "E9XqLqcAPtaMWK+vlxTTyhNPMewUq9nSCKax+m9KMwk="
+        },
+        {
+          "x-cnection": "close"
+        },
+        {
+          "cache-control": "public, max-age=28776235"
+        },
+        {
+          "expires": "Wed, 02 Oct 2013 14:15:24 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:51:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_27.json b/jetty-http2/http2-hpack/src/test/resources/data/story_27.json
new file mode 100644
index 0000000..0a0077d
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_27.json
@@ -0,0 +1,9890 @@
+{
+  "context": "response",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:12 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "set-cookie": "localization=en-us%3Bus%3Bus; expires=Sat, 01-Nov-2014 13:41:12 GMT; path=/; domain=.flickr.com"
+        },
+        {
+          "location": "http://www.flickr.com/"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "x-served-by": "www199.flickr.mud.yahoo.com"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "20"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:13 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 00:05:01 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-served-by": "www199.flickr.mud.yahoo.com"
+        },
+        {
+          "x-flickr-static": "1"
+        },
+        {
+          "cache-control": "no-store, no-cache, must-revalidate, max-age=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "via": "HTTP/1.1 r16.ycpi.mud.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ]), HTTP/1.1 r02.ycpi.mia.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ])"
+        },
+        {
+          "server": "YTS/1.20.20"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:15 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "private, no-store, max-age=0"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Wed, 31 Oct 2012 09:50:22 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "last-modified": "Fri, 06 Jul 2012 19:15:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-served-by": "www25.flickr.mud.yahoo.com"
+        },
+        {
+          "x-flickr-static": "1"
+        },
+        {
+          "cache-control": "max-age=315360000"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "age": "273053"
+        },
+        {
+          "via": "HTTP/1.1 r42.ycpi.mud.yahoo.net (YahooTrafficServer/1.20.20 [cHs f ]), HTTP/1.1 r02.ycpi.mia.yahoo.net (YahooTrafficServer/1.20.20 [cHs f ])"
+        },
+        {
+          "server": "YTS/1.20.20"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "35102"
+        },
+        {
+          "expires": "Mon, 28 Jul 2014 23:30:00 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 04:23:38 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "last-modified": "Tue, 06 Mar 2012 23:48:08 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "21830"
+        },
+        {
+          "x-served-by": "www145.flickr.mud.yahoo.com"
+        },
+        {
+          "expires": "Mon, 28 Jul 2014 23:30:00 GMT"
+        },
+        {
+          "cache-control": "max-age=315360000"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "age": "206257"
+        },
+        {
+          "via": "HTTP/1.1 r46.ycpi.mud.yahoo.net (YahooTrafficServer/1.20.20 [cHs f ]), HTTP/1.1 r9.ycpi.mia.yahoo.net (YahooTrafficServer/1.20.20 [cHs f ])"
+        },
+        {
+          "server": "YTS/1.20.20"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:15 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "last-modified": "Fri, 06 Jul 2012 19:15:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-served-by": "www187.flickr.mud.yahoo.com"
+        },
+        {
+          "x-flickr-static": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "via": "HTTP/1.1 r44.ycpi.mud.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ]), HTTP/1.1 r02.ycpi.mia.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ])"
+        },
+        {
+          "server": "YTS/1.20.20"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "35102"
+        },
+        {
+          "expires": "Mon, 28 Jul 2014 23:30:00 GMT"
+        },
+        {
+          "set-cookie": "localization=en-us%3Bus%3Bus; expires=Sat, 01-Nov-2014 13:41:15 GMT; path=/; domain=.flickr.com"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:16 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "set-cookie": "itsessionid10001561398679=aUqazlyMaa|fses10001561398679=; path=/; domain=.analytics.yahoo.com"
+        },
+        {
+          "ts": "0 355 dc10_ne1"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:17 GMT"
+        },
+        {
+          "cache-control": "no-cache, private, must-revalidate"
+        },
+        {
+          "content-length": "327"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "tracking-status": "fpc site tracked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:28:23 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://p3p.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV\""
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:00:19 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding,User-Agent"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "max-age=3600"
+        },
+        {
+          "content-type": "text/plain; charset=utf-8"
+        },
+        {
+          "age": "773"
+        },
+        {
+          "content-length": "111260"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "ATS/3.2.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:16 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:19 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "last-modified": "Fri, 06 Jul 2012 19:15:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-served-by": "www18.flickr.mud.yahoo.com"
+        },
+        {
+          "x-flickr-static": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "via": "HTTP/1.1 r48.ycpi.mud.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ]), HTTP/1.1 r02.ycpi.mia.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ])"
+        },
+        {
+          "server": "YTS/1.20.20"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "35102"
+        },
+        {
+          "expires": "Mon, 28 Jul 2014 23:30:00 GMT"
+        },
+        {
+          "set-cookie": "fldetectedlang=en-us; expires=Wed, 02-Jan-2013 13:41:19 GMT; path=/; domain=.flickr.com"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:20 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5002"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 10:30:08 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:33 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "45842"
+        },
+        {
+          "x-cache": "HIT from photocache510.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache510.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache510.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:20 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2849"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 10:51:39 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:30 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "88063"
+        },
+        {
+          "x-cache": "HIT from photocache540.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache540.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache540.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:20 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3533"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Thu, 27 Oct 2022 22:31:31 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:27 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "609449"
+        },
+        {
+          "x-cache": "HIT from photocache530.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache530.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache530.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:20 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "8165"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Sun, 03 Jul 2022 07:34:11 UTC"
+        },
+        {
+          "last-modified": "Tue, 10 Nov 2009 20:15:34 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "1332"
+        },
+        {
+          "x-cache": "HIT from photocache324.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache324.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache324.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:20 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "16040"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 10:51:39 UTC"
+        },
+        {
+          "last-modified": "Wed, 15 Sep 2010 19:43:32 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "104768"
+        },
+        {
+          "x-cache": "HIT from photocache518.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache518.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache518.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:20 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "16818"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 10:51:39 UTC"
+        },
+        {
+          "last-modified": "Wed, 15 Sep 2010 19:43:19 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "104768"
+        },
+        {
+          "x-cache": "HIT from photocache530.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache530.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache530.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:20 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "258838"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 09:14:20 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:34 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "3930"
+        },
+        {
+          "x-cache": "HIT from photocache534.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache534.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache534.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:20 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "15513"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 09:47:34 UTC"
+        },
+        {
+          "last-modified": "Mon, 06 Jun 2011 11:22:59 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "9645"
+        },
+        {
+          "x-cache": "HIT from photocache502.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache502.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache502.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:20 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "set-cookie": "itsessionid10001561398679=aUqazlyMaa|fses10001561398679=; path=/; domain=.analytics.yahoo.com"
+        },
+        {
+          "ts": "0 380 dc11_ne1"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:21 GMT"
+        },
+        {
+          "cache-control": "no-cache, private, must-revalidate"
+        },
+        {
+          "content-length": "46"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "tracking-status": "fpc site tracked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:21 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7878"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Wed, 20 Jul 2022 12:23:18 UTC"
+        },
+        {
+          "last-modified": "Mon, 23 Jun 2008 19:15:04 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "41746"
+        },
+        {
+          "x-cache": "HIT from photocache114.flickr.mud.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache114.flickr.mud.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache114.flickr.mud.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:21 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:21 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3339"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Sat, 01 Oct 2022 14:49:54 UTC"
+        },
+        {
+          "last-modified": "Mon, 01 Oct 2012 03:50:32 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "79702"
+        },
+        {
+          "x-cache": "HIT from photocache902.flickr.bf1.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache902.flickr.bf1.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache902.flickr.bf1.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:21 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "last-modified": "Fri, 06 Jul 2012 19:15:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-served-by": "www145.flickr.mud.yahoo.com"
+        },
+        {
+          "x-flickr-static": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/javascript; charset=utf-8"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "via": "HTTP/1.1 r02.ycpi.mud.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ]), HTTP/1.1 r02.ycpi.mia.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ])"
+        },
+        {
+          "server": "YTS/1.20.20"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "35102"
+        },
+        {
+          "expires": "Mon, 28 Jul 2014 23:30:00 GMT"
+        },
+        {
+          "set-cookie": "fldetectedlang=en-us; expires=Wed, 02-Jan-2013 13:41:19 GMT; path=/; domain=.flickr.com"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:22 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3403"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 11:01:02 UTC"
+        },
+        {
+          "last-modified": "Thu, 16 Sep 2010 17:19:47 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "146624"
+        },
+        {
+          "x-cache": "HIT from photocache538.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache538.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache538.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:22 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3018"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 11:35:06 UTC"
+        },
+        {
+          "last-modified": "Thu, 16 Sep 2010 17:19:31 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "498650"
+        },
+        {
+          "x-cache": "HIT from photocache509.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache509.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache509.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:22 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3493"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 11:01:02 UTC"
+        },
+        {
+          "last-modified": "Thu, 16 Sep 2010 17:19:49 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "184716"
+        },
+        {
+          "x-cache": "HIT from photocache507.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache507.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache507.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:22 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "19066"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 11:35:06 UTC"
+        },
+        {
+          "last-modified": "Thu, 16 Sep 2010 17:19:39 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "498650"
+        },
+        {
+          "x-cache": "HIT from photocache534.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache534.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache534.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:22 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "14587"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 11:35:06 UTC"
+        },
+        {
+          "last-modified": "Wed, 15 Sep 2010 19:44:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "498650"
+        },
+        {
+          "x-cache": "HIT from photocache512.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache512.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache512.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:22 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "16541"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 09:51:39 UTC"
+        },
+        {
+          "last-modified": "Wed, 15 Sep 2010 19:43:55 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "64145"
+        },
+        {
+          "x-cache": "HIT from photocache538.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache538.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache538.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:22 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "17669"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 11:35:06 UTC"
+        },
+        {
+          "last-modified": "Wed, 15 Sep 2010 19:43:48 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "498070"
+        },
+        {
+          "x-cache": "HIT from photocache536.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache536.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache536.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:22 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "17009"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 11:35:06 UTC"
+        },
+        {
+          "last-modified": "Wed, 15 Sep 2010 19:43:40 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "498070"
+        },
+        {
+          "x-cache": "HIT from photocache529.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache529.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache529.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:22 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "110090"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 09:50:49 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:31 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "104763"
+        },
+        {
+          "x-cache": "HIT from photocache508.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache508.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache508.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:22 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "121145"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 09:14:22 UTC"
+        },
+        {
+          "last-modified": "Wed, 15 Sep 2010 19:43:19 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "104763"
+        },
+        {
+          "x-cache": "HIT from photocache506.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache506.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache506.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:23 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "last-modified": "Fri, 06 Jul 2012 19:15:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-served-by": "www105.flickr.mud.yahoo.com"
+        },
+        {
+          "x-flickr-static": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "via": "HTTP/1.1 r08.ycpi.mud.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ]), HTTP/1.1 r02.ycpi.mia.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ])"
+        },
+        {
+          "server": "YTS/1.20.20"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "35102"
+        },
+        {
+          "expires": "Mon, 28 Jul 2014 23:30:00 GMT"
+        },
+        {
+          "set-cookie": "localization=en-us%3Bus%3Bus; expires=Sat, 01-Nov-2014 13:41:23 GMT; path=/; domain=.flickr.com"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:24 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "set-cookie": "itsessionid10001561398679=aUqazlyMaa|fses10001561398679=; path=/; domain=.analytics.yahoo.com"
+        },
+        {
+          "ts": "0 328 dc26_ne1"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:25 GMT"
+        },
+        {
+          "cache-control": "no-cache, private, must-revalidate"
+        },
+        {
+          "content-length": "46"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "tracking-status": "fpc site tracked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:24 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5372"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Sun, 24 Jul 2022 05:03:05 UTC"
+        },
+        {
+          "last-modified": "Sat, 10 Jul 2010 18:58:01 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "113797"
+        },
+        {
+          "x-cache": "HIT from photocache417.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache417.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache417.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:24 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:25 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "101072"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 09:13:50 UTC"
+        },
+        {
+          "last-modified": "Wed, 15 Sep 2010 19:43:33 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "399124"
+        },
+        {
+          "x-cache": "HIT from photocache502.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache502.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache502.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:25 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "last-modified": "Fri, 06 Jul 2012 19:15:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-served-by": "www135.flickr.mud.yahoo.com"
+        },
+        {
+          "x-flickr-static": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "age": "3"
+        },
+        {
+          "via": "HTTP/1.1 r34.ycpi.mud.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ]), HTTP/1.1 r02.ycpi.mia.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ])"
+        },
+        {
+          "server": "YTS/1.20.20"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "35102"
+        },
+        {
+          "expires": "Mon, 28 Jul 2014 23:30:00 GMT"
+        },
+        {
+          "set-cookie": "localization=en-us%3Bus%3Bus; expires=Sat, 01-Nov-2014 13:41:25 GMT; path=/; domain=.flickr.com"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:26 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "set-cookie": "itsessionid10001561398679=aUqazlyMaa|fses10001561398679=; path=/; domain=.analytics.yahoo.com"
+        },
+        {
+          "ts": "0 358 dc28_ne1"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:27 GMT"
+        },
+        {
+          "cache-control": "no-cache, private, must-revalidate"
+        },
+        {
+          "content-length": "46"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "tracking-status": "fpc site tracked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:26 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:26 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:27 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:27 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "131822"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 09:13:19 UTC"
+        },
+        {
+          "last-modified": "Wed, 15 Sep 2010 19:43:40 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "399125"
+        },
+        {
+          "x-cache": "HIT from photocache529.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache529.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache529.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:27 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "last-modified": "Fri, 06 Jul 2012 19:15:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-served-by": "www198.flickr.mud.yahoo.com"
+        },
+        {
+          "x-flickr-static": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "age": "3"
+        },
+        {
+          "via": "HTTP/1.1 r34.ycpi.mud.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ]), HTTP/1.1 r02.ycpi.mia.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ])"
+        },
+        {
+          "server": "YTS/1.20.20"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "35102"
+        },
+        {
+          "expires": "Mon, 28 Jul 2014 23:30:00 GMT"
+        },
+        {
+          "set-cookie": "localization=en-us%3Bus%3Bus; expires=Sat, 01-Nov-2014 13:41:27 GMT; path=/; domain=.flickr.com"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:28 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "set-cookie": "itsessionid10001561398679=aUqazlyMaa|fses10001561398679=; path=/; domain=.analytics.yahoo.com"
+        },
+        {
+          "ts": "0 366 dc36_ne1"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:29 GMT"
+        },
+        {
+          "cache-control": "no-cache, private, must-revalidate"
+        },
+        {
+          "content-length": "46"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "tracking-status": "fpc site tracked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:29 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:29 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "137767"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 09:13:04 UTC"
+        },
+        {
+          "last-modified": "Wed, 15 Sep 2010 19:43:48 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "959688"
+        },
+        {
+          "x-cache": "HIT from photocache512.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache512.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache512.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "last-modified": "Fri, 06 Jul 2012 19:15:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-served-by": "www24.flickr.bf1.yahoo.com"
+        },
+        {
+          "x-flickr-static": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "age": "1"
+        },
+        {
+          "via": "HTTP/1.1 r02.ycpi.mia.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ])"
+        },
+        {
+          "server": "YTS/1.20.20"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "35102"
+        },
+        {
+          "expires": "Mon, 28 Jul 2014 23:30:00 GMT"
+        },
+        {
+          "set-cookie": "localization=en-us%3Bus%3Bus; expires=Sat, 01-Nov-2014 13:41:30 GMT; path=/; domain=.flickr.com"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "9755"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 13:27:41 UTC"
+        },
+        {
+          "last-modified": "Mon, 04 Oct 2010 23:11:18 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "783768"
+        },
+        {
+          "x-cache": "HIT from photocache526.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache526.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache526.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "8018"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 13:27:41 UTC"
+        },
+        {
+          "last-modified": "Mon, 04 Oct 2010 23:11:16 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "783767"
+        },
+        {
+          "x-cache": "HIT from photocache521.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache521.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache521.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5509"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 13:27:41 UTC"
+        },
+        {
+          "last-modified": "Mon, 04 Oct 2010 23:11:19 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "849721"
+        },
+        {
+          "x-cache": "HIT from photocache517.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache517.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache517.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "24244"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 13:27:41 UTC"
+        },
+        {
+          "last-modified": "Mon, 04 Oct 2010 23:11:19 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "832233"
+        },
+        {
+          "x-cache": "HIT from photocache503.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache503.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache503.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "15699"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:49:46 UTC"
+        },
+        {
+          "last-modified": "Thu, 16 Sep 2010 17:19:54 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "184724"
+        },
+        {
+          "x-cache": "HIT from photocache535.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache535.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache535.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "26051"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 13:27:41 UTC"
+        },
+        {
+          "last-modified": "Thu, 16 Sep 2010 19:06:02 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "783767"
+        },
+        {
+          "x-cache": "HIT from photocache501.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache501.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache501.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "13263"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:38:08 UTC"
+        },
+        {
+          "last-modified": "Thu, 16 Sep 2010 17:19:31 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "216108"
+        },
+        {
+          "x-cache": "HIT from photocache525.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache525.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache525.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "19324"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Sun, 03 Jul 2022 22:23:27 UTC"
+        },
+        {
+          "last-modified": "Thu, 16 Sep 2010 17:19:49 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "301732"
+        },
+        {
+          "x-cache": "HIT from photocache539.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache539.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache539.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "21573"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 13:27:42 UTC"
+        },
+        {
+          "last-modified": "Thu, 16 Sep 2010 17:19:47 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "14644"
+        },
+        {
+          "x-cache": "HIT from photocache522.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache522.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache522.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "20730"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 13:27:42 UTC"
+        },
+        {
+          "last-modified": "Wed, 15 Sep 2010 19:44:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "301890"
+        },
+        {
+          "x-cache": "HIT from photocache528.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache528.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache528.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "32916"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:38:08 UTC"
+        },
+        {
+          "last-modified": "Thu, 16 Sep 2010 17:19:39 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "251785"
+        },
+        {
+          "x-cache": "HIT from photocache526.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache526.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache526.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "26574"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 13:27:42 UTC"
+        },
+        {
+          "last-modified": "Wed, 15 Sep 2010 19:43:55 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "832232"
+        },
+        {
+          "x-cache": "HIT from photocache506.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache506.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache506.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "27759"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 22:06:23 UTC"
+        },
+        {
+          "last-modified": "Wed, 15 Sep 2010 19:43:48 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "301883"
+        },
+        {
+          "x-cache": "HIT from photocache528.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache528.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache528.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "11409"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:38:10 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:31 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "832232"
+        },
+        {
+          "x-cache": "HIT from photocache524.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache524.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache524.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "26453"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Sun, 24 Jul 2022 04:56:22 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:33 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "3058"
+        },
+        {
+          "x-cache": "HIT from photocache526.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache526.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache526.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "23128"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 22:06:23 UTC"
+        },
+        {
+          "last-modified": "Wed, 15 Sep 2010 19:43:33 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "301877"
+        },
+        {
+          "x-cache": "HIT from photocache534.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache534.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache534.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "28275"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 22:06:23 UTC"
+        },
+        {
+          "last-modified": "Wed, 15 Sep 2010 19:43:40 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "301881"
+        },
+        {
+          "x-cache": "HIT from photocache505.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache505.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache505.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:30 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "26267"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 22:06:23 UTC"
+        },
+        {
+          "last-modified": "Wed, 15 Sep 2010 19:43:19 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "301876"
+        },
+        {
+          "x-cache": "HIT from photocache514.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache514.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache514.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:31 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "set-cookie": "itsessionid10001561398679=aUqazlyMaa|fses10001561398679=; path=/; domain=.analytics.yahoo.com"
+        },
+        {
+          "ts": "0 369 dc23_ne1"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:32 GMT"
+        },
+        {
+          "cache-control": "no-cache, private, must-revalidate"
+        },
+        {
+          "content-length": "46"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "tracking-status": "fpc site tracked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:31 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:31 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:31 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Wed, 31 Oct 2012 09:31:12 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "last-modified": "Tue, 06 Mar 2012 23:48:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-served-by": "www96.flickr.mud.yahoo.com"
+        },
+        {
+          "x-flickr-static": "1"
+        },
+        {
+          "cache-control": "max-age=1209600"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/vnd.microsoft.icon"
+        },
+        {
+          "age": "274220"
+        },
+        {
+          "via": "HTTP/1.1 r15.ycpi.mud.yahoo.net (YahooTrafficServer/1.20.20 [cHs f ]), HTTP/1.1 r02.ycpi.mia.yahoo.net (YahooTrafficServer/1.20.20 [cHs f ])"
+        },
+        {
+          "server": "YTS/1.20.20"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "6640"
+        },
+        {
+          "expires": "Mon, 28 Jul 2014 23:30:00 GMT"
+        },
+        {
+          "set-cookie": "localization=en-us%3Bus%3Bus; expires=Sat, 01-Nov-2014 13:41:30 GMT; path=/; domain=.flickr.com"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:33 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "last-modified": "Tue, 06 Mar 2012 23:48:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-served-by": "www1.flickr.mud.yahoo.com"
+        },
+        {
+          "x-flickr-static": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "via": "HTTP/1.1 r12.ycpi.mud.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ]), HTTP/1.1 r02.ycpi.mia.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ])"
+        },
+        {
+          "server": "YTS/1.20.20"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "6640"
+        },
+        {
+          "expires": "Mon, 28 Jul 2014 23:30:00 GMT"
+        },
+        {
+          "set-cookie": "localization=en-us%3Bus%3Bus; expires=Sat, 01-Nov-2014 13:41:33 GMT; path=/; domain=.flickr.com"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "19144"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:38:09 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:27 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "301872"
+        },
+        {
+          "x-cache": "HIT from photocache508.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache508.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache508.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "24110"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:38:09 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:04 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "840419"
+        },
+        {
+          "x-cache": "HIT from photocache505.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache505.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache505.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "32406"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 18:43:07 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "166451"
+        },
+        {
+          "x-cache": "HIT from photocache529.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache529.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache529.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "20059"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:38:09 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "382867"
+        },
+        {
+          "x-cache": "HIT from photocache505.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache505.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache505.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "23332"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:41:55 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:17 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "68360"
+        },
+        {
+          "x-cache": "HIT from photocache525.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache525.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache525.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "18543"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 11:24:48 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "458533"
+        },
+        {
+          "x-cache": "HIT from photocache538.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache538.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache538.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "15399"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Sun, 30 Oct 2022 01:48:16 UTC"
+        },
+        {
+          "last-modified": "Wed, 31 Mar 2010 17:47:11 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "424858"
+        },
+        {
+          "x-cache": "HIT from photocache324.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache324.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache324.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "29793"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Tue, 16 Aug 2022 22:34:17 UTC"
+        },
+        {
+          "last-modified": "Mon, 17 May 2010 22:00:34 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "840419"
+        },
+        {
+          "x-cache": "HIT from photocache401.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache401.flickr.ac4.yahoo.com:81"
+        },
+        {
+          "via": "1.1 photocache401.flickr.ac4.yahoo.com:81 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "13571"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 11:16:36 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "783188"
+        },
+        {
+          "x-cache": "HIT from photocache508.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache508.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache508.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "18149"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Sun, 12 Jun 2022 23:12:34 UTC"
+        },
+        {
+          "last-modified": "Mon, 17 May 2010 21:59:16 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "953364"
+        },
+        {
+          "x-cache": "HIT from photocache414.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache414.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache414.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "15403"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:38:09 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "388250"
+        },
+        {
+          "x-cache": "HIT from photocache529.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache529.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache529.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "14796"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 22:06:24 UTC"
+        },
+        {
+          "last-modified": "Mon, 17 May 2010 21:59:58 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "320180"
+        },
+        {
+          "x-cache": "HIT from photocache506.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache506.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache506.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "18710"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:38:09 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:24 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "840419"
+        },
+        {
+          "x-cache": "HIT from photocache531.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache531.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache531.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "32555"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Sun, 19 Jun 2022 15:01:08 UTC"
+        },
+        {
+          "last-modified": "Mon, 17 May 2010 22:00:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "58741"
+        },
+        {
+          "x-cache": "HIT from photocache412.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache412.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache412.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "13726"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:38:10 UTC"
+        },
+        {
+          "last-modified": "Mon, 17 May 2010 21:59:24 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "840419"
+        },
+        {
+          "x-cache": "HIT from photocache531.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache531.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache531.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "27660"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 22:06:36 UTC"
+        },
+        {
+          "last-modified": "Mon, 17 May 2010 21:59:47 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "320180"
+        },
+        {
+          "x-cache": "HIT from photocache526.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache526.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache526.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "19545"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:38:09 UTC"
+        },
+        {
+          "last-modified": "Mon, 17 May 2010 21:59:30 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "840419"
+        },
+        {
+          "x-cache": "HIT from photocache517.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache517.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache517.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "30518"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 16:28:03 UTC"
+        },
+        {
+          "last-modified": "Wed, 31 Mar 2010 17:47:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "49685"
+        },
+        {
+          "x-cache": "HIT from photocache507.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache507.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache507.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:34 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "set-cookie": "itsessionid10001561398679=aUqazlyMaa|fses10001561398679=; path=/; domain=.analytics.yahoo.com"
+        },
+        {
+          "ts": "0 310 dc33_ne1"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:35 GMT"
+        },
+        {
+          "cache-control": "no-cache, private, must-revalidate"
+        },
+        {
+          "content-length": "46"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "tracking-status": "fpc site tracked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:35 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:38 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "set-cookie": "itsessionid10001561398679=aUqazlyMaa|fses10001561398679=; path=/; domain=.analytics.yahoo.com"
+        },
+        {
+          "ts": "0 342 dc32_ne1"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:39 GMT"
+        },
+        {
+          "cache-control": "no-cache, private, must-revalidate"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "tracking-status": "site tracked"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:39 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "last-modified": "Tue, 06 Mar 2012 23:48:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-served-by": "www31.flickr.bf1.yahoo.com"
+        },
+        {
+          "x-flickr-static": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "age": "3"
+        },
+        {
+          "via": "HTTP/1.1 r02.ycpi.mia.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ])"
+        },
+        {
+          "server": "YTS/1.20.20"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "6640"
+        },
+        {
+          "expires": "Mon, 28 Jul 2014 23:30:00 GMT"
+        },
+        {
+          "set-cookie": "localization=en-us%3Bus%3Bus; expires=Sat, 01-Nov-2014 13:41:39 GMT; path=/; domain=.flickr.com"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:40 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "private, no-store, max-age=0"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:41 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "set-cookie": "itsessionid10001561398679=aUqazlyMaa|fses10001561398679=; path=/; domain=.analytics.yahoo.com"
+        },
+        {
+          "ts": "0 352 dc19_ne1"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:42 GMT"
+        },
+        {
+          "cache-control": "no-cache, private, must-revalidate"
+        },
+        {
+          "content-length": "46"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "tracking-status": "fpc site tracked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "imp=a$le#1351950101610_669834368_ap2101_int|; Domain=.teracent.net; Expires=Thu, 02-May-2013 13:41:41 GMT; Path=/tase"
+        },
+        {
+          "p3p": "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "expires": "Sat, 6 May 1995 12:00:00 GMT"
+        },
+        {
+          "cache-control": "post-check=0, pre-check=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:41 GMT"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:41 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:44 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "last-modified": "Tue, 06 Mar 2012 23:48:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-served-by": "www56.flickr.bf1.yahoo.com"
+        },
+        {
+          "x-flickr-static": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "via": "HTTP/1.1 r02.ycpi.mia.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ])"
+        },
+        {
+          "server": "YTS/1.20.20"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "6640"
+        },
+        {
+          "expires": "Mon, 28 Jul 2014 23:30:00 GMT"
+        },
+        {
+          "set-cookie": "localization=en-us%3Bus%3Bus; expires=Sat, 01-Nov-2014 13:41:44 GMT; path=/; domain=.flickr.com"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:44 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2830"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 07:50:16 UTC"
+        },
+        {
+          "last-modified": "Mon, 01 Nov 2010 05:41:21 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "4009"
+        },
+        {
+          "x-cache": "HIT from photocache501.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache501.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache501.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:44 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4884"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 07:44:25 UTC"
+        },
+        {
+          "last-modified": "Mon, 01 Nov 2010 05:41:51 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "159147"
+        },
+        {
+          "x-cache": "HIT from photocache520.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache520.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache520.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:44 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3513"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 07:49:35 UTC"
+        },
+        {
+          "last-modified": "Mon, 01 Nov 2010 05:41:18 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "4010"
+        },
+        {
+          "x-cache": "HIT from photocache507.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache507.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache507.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:44 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "6899"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 07:49:08 UTC"
+        },
+        {
+          "last-modified": "Mon, 01 Nov 2010 05:41:22 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "2328198"
+        },
+        {
+          "x-cache": "HIT from photocache518.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache518.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache518.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:44 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4695"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Thu, 03 Nov 2022 23:49:24 UTC"
+        },
+        {
+          "last-modified": "Mon, 01 Nov 2010 05:41:39 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "x-cache": "MISS from photocache514.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "MISS from photocache514.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache514.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:44 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2596"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 07:55:46 UTC"
+        },
+        {
+          "last-modified": "Mon, 04 Oct 2010 23:11:49 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431512"
+        },
+        {
+          "x-cache": "HIT from photocache518.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache518.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache518.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:44 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3516"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 17:53:36 UTC"
+        },
+        {
+          "last-modified": "Thu, 16 Sep 2010 17:19:31 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "302049"
+        },
+        {
+          "x-cache": "HIT from photocache501.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache501.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache501.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:44 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4922"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:34:28 UTC"
+        },
+        {
+          "last-modified": "Thu, 16 Sep 2010 17:19:47 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "36944"
+        },
+        {
+          "x-cache": "HIT from photocache522.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache522.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache522.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:44 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3158"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 07:46:15 UTC"
+        },
+        {
+          "last-modified": "Mon, 01 Nov 2010 05:41:39 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "2328157"
+        },
+        {
+          "x-cache": "HIT from photocache512.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache512.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache512.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:44 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4541"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:12 UTC"
+        },
+        {
+          "last-modified": "Thu, 16 Sep 2010 17:19:49 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "x-cache": "HIT from photocache507.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache507.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache507.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        },
+        {
+          "age": "302053"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:44 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4145"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 07:51:21 UTC"
+        },
+        {
+          "last-modified": "Mon, 01 Nov 2010 05:40:59 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "2328231"
+        },
+        {
+          "x-cache": "HIT from photocache508.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache508.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache508.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:44 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3419"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:06:37 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:57:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "650868"
+        },
+        {
+          "x-cache": "HIT from photocache506.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache506.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache506.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:44 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5035"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 20:41:31 UTC"
+        },
+        {
+          "last-modified": "Mon, 01 Nov 2010 05:41:02 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "3999"
+        },
+        {
+          "x-cache": "HIT from photocache534.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache534.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache534.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:44 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "private, no-store, max-age=0"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:45 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "set-cookie": "itsessionid10001561398679=aUqazlyMaa|fses10001561398679=; path=/; domain=.analytics.yahoo.com"
+        },
+        {
+          "ts": "0 305 dc9_ne1"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:46 GMT"
+        },
+        {
+          "cache-control": "no-cache, private, must-revalidate"
+        },
+        {
+          "content-length": "45"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "tracking-status": "fpc site tracked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:45 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5313"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Thu, 01 Sep 2022 04:55:06 UTC"
+        },
+        {
+          "last-modified": "Fri, 31 Aug 2012 18:28:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "959613"
+        },
+        {
+          "x-cache": "HIT from photocache906.flickr.bf1.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache906.flickr.bf1.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache906.flickr.bf1.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:45 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4675"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Wed, 07 Sep 2022 05:56:52 UTC"
+        },
+        {
+          "last-modified": "Thu, 06 Sep 2012 18:42:55 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "338945"
+        },
+        {
+          "x-cache": "HIT from photocache907.flickr.bf1.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache907.flickr.bf1.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache907.flickr.bf1.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:45 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7282"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Sun, 28 Aug 2022 09:31:01 UTC"
+        },
+        {
+          "last-modified": "Mon, 27 Aug 2012 22:28:20 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "73654"
+        },
+        {
+          "x-cache": "HIT from photocache924.flickr.bf1.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache924.flickr.bf1.yahoo.com:85"
+        },
+        {
+          "via": "1.1 photocache924.flickr.bf1.yahoo.com:85 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:45 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4242"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Thu, 01 Sep 2022 04:55:06 UTC"
+        },
+        {
+          "last-modified": "Fri, 31 Aug 2012 18:28:53 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "959613"
+        },
+        {
+          "x-cache": "HIT from photocache926.flickr.bf1.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache926.flickr.bf1.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache926.flickr.bf1.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:45 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4561"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Sun, 17 Jul 2022 03:19:16 UTC"
+        },
+        {
+          "last-modified": "Mon, 01 Nov 2010 05:41:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "4005"
+        },
+        {
+          "x-cache": "HIT from photocache203.flickr.bf1.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache203.flickr.bf1.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache203.flickr.bf1.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:45 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "6350"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Sun, 17 Jul 2022 04:55:35 UTC"
+        },
+        {
+          "last-modified": "Mon, 01 Nov 2010 16:18:41 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431728"
+        },
+        {
+          "x-cache": "HIT from photocache204.flickr.bf1.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache204.flickr.bf1.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache204.flickr.bf1.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:45 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3341"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Sun, 17 Jul 2022 18:09:37 UTC"
+        },
+        {
+          "last-modified": "Mon, 01 Nov 2010 05:41:14 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "2328215"
+        },
+        {
+          "x-cache": "HIT from photocache205.flickr.bf1.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache205.flickr.bf1.yahoo.com:85"
+        },
+        {
+          "via": "1.1 photocache205.flickr.bf1.yahoo.com:85 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:45 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7005"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 18 Jul 2022 01:41:12 UTC"
+        },
+        {
+          "last-modified": "Mon, 01 Nov 2010 05:41:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "4064"
+        },
+        {
+          "x-cache": "HIT from photocache202.flickr.bf1.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache202.flickr.bf1.yahoo.com:85"
+        },
+        {
+          "via": "1.1 photocache202.flickr.bf1.yahoo.com:85 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:45 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4068"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 18 Jul 2022 03:45:04 UTC"
+        },
+        {
+          "last-modified": "Mon, 01 Nov 2010 05:41:01 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "438025"
+        },
+        {
+          "x-cache": "HIT from photocache202.flickr.bf1.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache202.flickr.bf1.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache202.flickr.bf1.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:45 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7960"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 18 Jul 2022 03:44:32 UTC"
+        },
+        {
+          "last-modified": "Mon, 01 Nov 2010 05:41:20 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "2328207"
+        },
+        {
+          "x-cache": "HIT from photocache205.flickr.bf1.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache205.flickr.bf1.yahoo.com:85"
+        },
+        {
+          "via": "1.1 photocache205.flickr.bf1.yahoo.com:85 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:45 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:46 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4395"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 18 Jul 2022 03:45:05 UTC"
+        },
+        {
+          "last-modified": "Mon, 01 Nov 2010 05:40:57 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "2328241"
+        },
+        {
+          "x-cache": "HIT from photocache202.flickr.bf1.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache202.flickr.bf1.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache202.flickr.bf1.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:48 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "last-modified": "Tue, 06 Mar 2012 23:48:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-served-by": "www30.flickr.bf1.yahoo.com"
+        },
+        {
+          "x-flickr-static": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "age": "3"
+        },
+        {
+          "via": "HTTP/1.1 r02.ycpi.mia.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ])"
+        },
+        {
+          "server": "YTS/1.20.20"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "6640"
+        },
+        {
+          "expires": "Mon, 28 Jul 2014 23:30:00 GMT"
+        },
+        {
+          "set-cookie": "localization=en-us%3Bus%3Bus; expires=Sat, 01-Nov-2014 13:41:48 GMT; path=/; domain=.flickr.com"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3706"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:24 UTC"
+        },
+        {
+          "last-modified": "Mon, 17 May 2010 21:59:58 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "608527"
+        },
+        {
+          "x-cache": "HIT from photocache522.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache522.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache522.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4610"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 16:47:58 UTC"
+        },
+        {
+          "last-modified": "Wed, 04 Aug 2010 23:21:27 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "598783"
+        },
+        {
+          "x-cache": "HIT from photocache515.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache515.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache515.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2551"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:12 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:58:45 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "801137"
+        },
+        {
+          "x-cache": "HIT from photocache529.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache529.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache529.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2822"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 11:43:25 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:58:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "x-cache": "HIT from photocache504.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache504.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache504.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        },
+        {
+          "age": "151390"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4463"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 10:56:37 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:57:39 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "252496"
+        },
+        {
+          "x-cache": "HIT from photocache520.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache520.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache520.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1441"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:25 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:58:11 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "496025"
+        },
+        {
+          "x-cache": "HIT from photocache501.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache501.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache501.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3780"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Sat, 22 Oct 2022 00:35:44 UTC"
+        },
+        {
+          "last-modified": "Wed, 31 Mar 2010 17:47:11 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "988214"
+        },
+        {
+          "x-cache": "HIT from photocache312.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache312.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache312.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5215"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 24 Oct 2022 02:15:29 UTC"
+        },
+        {
+          "last-modified": "Wed, 31 Mar 2010 17:47:08 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431732"
+        },
+        {
+          "x-cache": "HIT from photocache324.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache324.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache324.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2610"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:24 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:49:08 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "872080"
+        },
+        {
+          "x-cache": "HIT from photocache520.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache520.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache520.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4241"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 08:00:12 UTC"
+        },
+        {
+          "last-modified": "Wed, 31 Mar 2010 17:47:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "2356"
+        },
+        {
+          "x-cache": "HIT from photocache513.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache513.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache513.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4461"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 10:10:07 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "301869"
+        },
+        {
+          "x-cache": "HIT from photocache505.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache505.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache505.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4292"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 13:51:59 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "258540"
+        },
+        {
+          "x-cache": "HIT from photocache521.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache521.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache521.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3353"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:34:28 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:49:11 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "x-cache": "HIT from photocache518.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache518.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache518.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        },
+        {
+          "age": "496025"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4008"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 20:42:08 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:57:10 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "435217"
+        },
+        {
+          "x-cache": "HIT from photocache522.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache522.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache522.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4081"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:43:52 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:58:39 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "435217"
+        },
+        {
+          "x-cache": "HIT from photocache521.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache521.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache521.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3996"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 15:30:11 UTC"
+        },
+        {
+          "last-modified": "Wed, 31 Mar 2010 17:46:59 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "872288"
+        },
+        {
+          "x-cache": "HIT from photocache522.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache522.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache522.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2178"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 20:42:08 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:58:44 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431529"
+        },
+        {
+          "x-cache": "HIT from photocache523.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache523.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache523.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3292"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 10:39:41 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:57:21 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431732"
+        },
+        {
+          "x-cache": "HIT from photocache533.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache533.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache533.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3415"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:34:28 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:57:34 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "89675"
+        },
+        {
+          "x-cache": "HIT from photocache522.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache522.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache522.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3963"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 15:19:56 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:59:09 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "x-cache": "HIT from photocache533.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache533.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache533.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        },
+        {
+          "age": "89675"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3036"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:34:28 UTC"
+        },
+        {
+          "last-modified": "Wed, 04 Aug 2010 23:21:23 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "245531"
+        },
+        {
+          "x-cache": "HIT from photocache511.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache511.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache511.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1843"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:34:28 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:58:40 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431517"
+        },
+        {
+          "x-cache": "HIT from photocache537.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache537.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache537.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "6971"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:34:28 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "301877"
+        },
+        {
+          "x-cache": "HIT from photocache537.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache537.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache537.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3968"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:24 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:49:02 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431731"
+        },
+        {
+          "x-cache": "HIT from photocache527.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache527.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache527.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:49 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "private, no-store, max-age=0"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:50 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "set-cookie": "itsessionid10001561398679=aUqazlyMaa|fses10001561398679=; path=/; domain=.analytics.yahoo.com"
+        },
+        {
+          "ts": "0 326 dc12_ne1"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:51 GMT"
+        },
+        {
+          "cache-control": "no-cache, private, must-revalidate"
+        },
+        {
+          "content-length": "46"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "tracking-status": "fpc site tracked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:50 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:50 GMT"
+        },
+        {
+          "server": "YTS/1.20.13"
+        },
+        {
+          "x-rightmedia-hostname": "raptor0740.rm.bf1.yahoo.com"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA\""
+        },
+        {
+          "location": "http://ad.yieldmanager.com/pixel?id=365081&t=2"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate, max-age=0"
+        },
+        {
+          "vary": "*"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:41:50 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:50 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4726"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 17:54:01 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:58:36 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "211089"
+        },
+        {
+          "x-cache": "HIT from photocache519.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache519.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache519.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4433"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 04 Jul 2022 00:08:57 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:49:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431736"
+        },
+        {
+          "x-cache": "HIT from photocache539.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache539.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache539.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2677"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:24 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:49:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431735"
+        },
+        {
+          "x-cache": "HIT from photocache524.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache524.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache524.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3081"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:24 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:57:54 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "164867"
+        },
+        {
+          "x-cache": "HIT from photocache511.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache511.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache511.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3457"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:34:28 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:58:39 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "435221"
+        },
+        {
+          "x-cache": "HIT from photocache526.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache526.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache526.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4433"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:12 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:58:42 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "424621"
+        },
+        {
+          "x-cache": "HIT from photocache528.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache528.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache528.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "6486"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:24 UTC"
+        },
+        {
+          "last-modified": "Wed, 31 Mar 2010 17:46:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431736"
+        },
+        {
+          "x-cache": "HIT from photocache540.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache540.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache540.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4899"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:12 UTC"
+        },
+        {
+          "last-modified": "Wed, 04 Aug 2010 23:21:41 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "x-cache": "HIT from photocache507.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache507.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache507.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        },
+        {
+          "age": "598778"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3981"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Sat, 15 Oct 2022 23:23:06 UTC"
+        },
+        {
+          "last-modified": "Wed, 31 Mar 2010 17:46:57 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431687"
+        },
+        {
+          "x-cache": "HIT from photocache311.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache311.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache311.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7338"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Sun, 12 Jun 2022 22:06:49 UTC"
+        },
+        {
+          "last-modified": "Mon, 17 May 2010 22:00:34 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "608533"
+        },
+        {
+          "x-cache": "HIT from photocache415.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache415.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache415.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5640"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:48:36 UTC"
+        },
+        {
+          "last-modified": "Wed, 31 Mar 2010 17:47:01 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "988205"
+        },
+        {
+          "x-cache": "HIT from photocache505.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache505.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache505.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4609"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:24 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:57:24 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "871819"
+        },
+        {
+          "x-cache": "HIT from photocache530.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache530.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache530.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3776"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 10:39:41 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:57:30 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431533"
+        },
+        {
+          "x-cache": "HIT from photocache531.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache531.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache531.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4551"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 11:35:21 UTC"
+        },
+        {
+          "last-modified": "Tue, 17 Aug 2010 18:40:02 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "415587"
+        },
+        {
+          "x-cache": "HIT from photocache522.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache522.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache522.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4452"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 20:41:31 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:57:44 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "36952"
+        },
+        {
+          "x-cache": "HIT from photocache505.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache505.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache505.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2023"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 20:45:55 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:57:45 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "x-cache": "HIT from photocache533.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache533.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache533.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        },
+        {
+          "age": "682487"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:51 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "last-modified": "Tue, 06 Mar 2012 23:48:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-served-by": "www144.flickr.mud.yahoo.com"
+        },
+        {
+          "x-flickr-static": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "age": "3"
+        },
+        {
+          "via": "HTTP/1.1 r29.ycpi.mud.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ]), HTTP/1.1 r02.ycpi.mia.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ])"
+        },
+        {
+          "server": "YTS/1.20.20"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "6640"
+        },
+        {
+          "expires": "Mon, 28 Jul 2014 23:30:00 GMT"
+        },
+        {
+          "set-cookie": "localization=en-us%3Bus%3Bus; expires=Sat, 01-Nov-2014 13:41:51 GMT; path=/; domain=.flickr.com"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4675"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 10:44:19 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:59:16 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "89679"
+        },
+        {
+          "x-cache": "HIT from photocache502.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache502.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache502.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3139"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 10:09:56 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:59:00 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "89670"
+        },
+        {
+          "x-cache": "HIT from photocache531.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache531.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache531.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3167"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:12 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:58:26 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431533"
+        },
+        {
+          "x-cache": "HIT from photocache515.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache515.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache515.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4227"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:25 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:57:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "89679"
+        },
+        {
+          "x-cache": "HIT from photocache505.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache505.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache505.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2768"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 11:43:02 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:57:09 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "x-cache": "HIT from photocache506.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache506.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache506.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        },
+        {
+          "age": "206489"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4375"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:24 UTC"
+        },
+        {
+          "last-modified": "Mon, 17 May 2010 21:59:30 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "988235"
+        },
+        {
+          "x-cache": "HIT from photocache525.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache525.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache525.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3506"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 18:52:47 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:57:36 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431534"
+        },
+        {
+          "x-cache": "HIT from photocache507.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache507.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache507.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3522"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:24 UTC"
+        },
+        {
+          "last-modified": "Mon, 17 May 2010 21:59:24 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "988233"
+        },
+        {
+          "x-cache": "HIT from photocache515.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache515.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache515.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:53 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "private, no-store, max-age=0"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:54 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "set-cookie": "itsessionid10001561398679=aUqazlyMaa|fses10001561398679=; path=/; domain=.analytics.yahoo.com"
+        },
+        {
+          "ts": "0 307 dc1_ne1"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:55 GMT"
+        },
+        {
+          "cache-control": "no-cache, private, must-revalidate"
+        },
+        {
+          "content-length": "45"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "tracking-status": "fpc site tracked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:54 GMT"
+        },
+        {
+          "server": "YTS/1.20.13"
+        },
+        {
+          "x-rightmedia-hostname": "raptor0291.rm.bf1.yahoo.com"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA\""
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate, max-age=0"
+        },
+        {
+          "vary": "*"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:41:54 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:54 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:54 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:54 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:54 GMT"
+        },
+        {
+          "server": "YTS/1.20.13"
+        },
+        {
+          "x-rightmedia-hostname": "raptor0921.rm.bf1.yahoo.com"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA\""
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate, max-age=0"
+        },
+        {
+          "vary": "*"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:41:54 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:54 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "location": "http://ad.yieldmanager.com/imp?Z=1x1&s=768714&T=3&_salt=2374354217&B=12&m=2&u=http%3A%2F%2Fwww.flickr.com%2Fphotos%2Fnasacommons%2Ftags%2Fnationalaeronauticsandspaceadministration%2Fpage3%2F&r=0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:55 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "last-modified": "Tue, 06 Mar 2012 23:48:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "x-served-by": "www13.flickr.mud.yahoo.com"
+        },
+        {
+          "x-flickr-static": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "via": "HTTP/1.1 r18.ycpi.mud.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ]), HTTP/1.1 r02.ycpi.mia.yahoo.net (YahooTrafficServer/1.20.20 [cMsSf ])"
+        },
+        {
+          "server": "YTS/1.20.20"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-length": "6640"
+        },
+        {
+          "expires": "Mon, 28 Jul 2014 23:30:00 GMT"
+        },
+        {
+          "set-cookie": "localization=en-us%3Bus%3Bus; expires=Sat, 01-Nov-2014 13:41:55 GMT; path=/; domain=.flickr.com"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5525"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 10:39:41 UTC"
+        },
+        {
+          "last-modified": "Wed, 04 Aug 2010 23:21:42 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "435224"
+        },
+        {
+          "x-cache": "HIT from photocache503.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache503.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache503.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4651"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 10:21:30 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:59:08 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "166264"
+        },
+        {
+          "x-cache": "HIT from photocache524.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache524.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache524.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4344"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:43:52 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "301880"
+        },
+        {
+          "x-cache": "HIT from photocache506.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache506.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache506.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4372"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:34:28 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:58:35 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431536"
+        },
+        {
+          "x-cache": "HIT from photocache525.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache525.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache525.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4446"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:34:28 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:58:44 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431689"
+        },
+        {
+          "x-cache": "HIT from photocache534.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache534.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache534.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4431"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:34:28 UTC"
+        },
+        {
+          "last-modified": "Wed, 31 Mar 2010 17:46:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "x-cache": "HIT from photocache511.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache511.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache511.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        },
+        {
+          "age": "431690"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "13813"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Sat, 03 Sep 2022 23:41:41 UTC"
+        },
+        {
+          "last-modified": "Mon, 17 May 2010 22:00:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "608533"
+        },
+        {
+          "x-cache": "HIT from photocache408.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache408.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache408.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2010"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:43:52 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:58:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431537"
+        },
+        {
+          "x-cache": "HIT from photocache535.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache535.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache535.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4596"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:24 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:27 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "301900"
+        },
+        {
+          "x-cache": "HIT from photocache540.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache540.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache540.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4383"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:25 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:58:51 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "x-cache": "HIT from photocache540.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache540.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache540.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        },
+        {
+          "age": "89682"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3501"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 08:02:11 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:59:15 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "89673"
+        },
+        {
+          "x-cache": "HIT from photocache506.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache506.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache506.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3829"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:11 UTC"
+        },
+        {
+          "last-modified": "Wed, 04 Aug 2010 23:21:23 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "871646"
+        },
+        {
+          "x-cache": "HIT from photocache523.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache523.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache523.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3781"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 20:46:07 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:49:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "435223"
+        },
+        {
+          "x-cache": "HIT from photocache502.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache502.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache502.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4186"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 20:41:31 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:58:51 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "363909"
+        },
+        {
+          "x-cache": "HIT from photocache524.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache524.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache524.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3814"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:43:52 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:59:15 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "x-cache": "HIT from photocache537.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache537.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache537.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        },
+        {
+          "age": "89682"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2478"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:25 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:58:11 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431536"
+        },
+        {
+          "x-cache": "HIT from photocache511.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache511.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache511.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "7387"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:34:28 UTC"
+        },
+        {
+          "last-modified": "Wed, 31 Mar 2010 17:47:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431739"
+        },
+        {
+          "x-cache": "HIT from photocache523.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache523.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache523.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5870"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:04:10 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:17 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "337938"
+        },
+        {
+          "x-cache": "HIT from photocache525.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache525.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache525.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "5202"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:40:12 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:57:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431738"
+        },
+        {
+          "x-cache": "HIT from photocache505.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache505.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache505.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2820"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:34:28 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:58:31 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "431536"
+        },
+        {
+          "x-cache": "HIT from photocache538.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache538.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache538.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3044"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:43:52 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:07:30 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "x-cache": "HIT from photocache516.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache516.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache516.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        },
+        {
+          "age": "2363"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "4834"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 12:34:28 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:59:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "89682"
+        },
+        {
+          "x-cache": "HIT from photocache522.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache522.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache522.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3365"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 10:56:07 UTC"
+        },
+        {
+          "last-modified": "Tue, 03 Aug 2010 22:58:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "252421"
+        },
+        {
+          "x-cache": "HIT from photocache528.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache528.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache528.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "3978"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "max-age=315360000,public"
+        },
+        {
+          "expires": "Mon, 30 May 2022 10:39:41 UTC"
+        },
+        {
+          "last-modified": "Mon, 30 Aug 2010 06:49:20 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "age": "872078"
+        },
+        {
+          "x-cache": "HIT from photocache532.flickr.ac4.yahoo.com"
+        },
+        {
+          "x-cache-lookup": "HIT from photocache532.flickr.ac4.yahoo.com:83"
+        },
+        {
+          "via": "1.1 photocache532.flickr.ac4.yahoo.com:83 (squid/2.7.STABLE9)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:56 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "private, no-store, max-age=0"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:57 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "set-cookie": "itsessionid10001561398679=aUqazlyMaa|fses10001561398679=; path=/; domain=.analytics.yahoo.com"
+        },
+        {
+          "ts": "0 372 dc33_ne1"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:58 GMT"
+        },
+        {
+          "cache-control": "no-cache, private, must-revalidate"
+        },
+        {
+          "content-length": "46"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "tracking-status": "fpc site tracked"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:57 GMT"
+        },
+        {
+          "server": "YTS/1.20.13"
+        },
+        {
+          "x-rightmedia-hostname": "raptor0663.rm.bf1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA\""
+        },
+        {
+          "location": "http://ad.yieldmanager.com/pixel?id=372009&t=2"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate, max-age=0"
+        },
+        {
+          "vary": "*"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:41:57 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:57 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:57 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:57 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:57 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:41:58 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://info.yahoo.com/w3c/p3p.xml\", CP=\"CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV\""
+        },
+        {
+          "cache-control": "no-cache, no-store, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_28.json b/jetty-http2/http2-hpack/src/test/resources/data/story_28.json
new file mode 100644
index 0000000..26c5a59
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_28.json
@@ -0,0 +1,5293 @@
+{
+  "context": "response",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":status": "301"
+        },
+        {
+          "location": "http://www.linkedin.com/"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:39 GMT"
+        },
+        {
+          "server": "lighttpd"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "X-LI-IDC=C1"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-li-uuid": "E2zvmRmjhYEFJpx7GePGrg=="
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:39 GMT"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 22:43:31 GMT"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "4224"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=31224822"
+        },
+        {
+          "expires": "Wed, 30 Oct 2013 22:47:23 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "1757"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=23972673"
+        },
+        {
+          "expires": "Thu, 08 Aug 2013 00:18:14 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 17:17:34 GMT"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "1104"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=31119071"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 17:24:52 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 22:43:30 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "4725"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=31225090"
+        },
+        {
+          "expires": "Wed, 30 Oct 2013 22:51:51 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 22:43:29 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "18531"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=31225288"
+        },
+        {
+          "expires": "Wed, 30 Oct 2013 22:55:09 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 22:43:30 GMT"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-li-uuid": "YP+9O9z6wRIwf5dQLCsAAA=="
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "81464"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=31224801"
+        },
+        {
+          "expires": "Wed, 30 Oct 2013 22:47:02 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "L1e=495eba97; path=/"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-li-uuid": "gLtcwO0VwxJQ3EsqHysAAA=="
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:43 GMT"
+        },
+        {
+          "age": "1"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Thu, 25 Oct 2012 19:08:05 GMT"
+        },
+        {
+          "content-type": "image/x-icon"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-li-uuid": "YP+9O9z6wRIwf5dQLCsAAA=="
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "361"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=31188041"
+        },
+        {
+          "expires": "Wed, 30 Oct 2013 12:34:24 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 19:11:14 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-li-uuid": "CCdnnfDTwhJwlNCV9ioAAA=="
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "max-age=31463444"
+        },
+        {
+          "expires": "Sat, 02 Nov 2013 17:04:28 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:44 GMT"
+        },
+        {
+          "content-length": "3489"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Mon, 13 Aug 2012 19:03:38 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1062"
+        },
+        {
+          "cache-control": "max-age=24472323"
+        },
+        {
+          "expires": "Tue, 13 Aug 2013 19:05:47 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:44 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:44 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-length": "14888"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 15:51:19 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 06:13:29 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 18:13:29 GMT"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "age": "25215"
+        },
+        {
+          "cache-control": "max-age=43200, public"
+        },
+        {
+          "server": "GFE/2.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Wed, 21 Jan 2004 19:51:30 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 14:30:09 GMT"
+        },
+        {
+          "expires": "Wed, 19 Apr 2000 11:43:00 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "age": "168216"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, proxy-revalidate"
+        },
+        {
+          "server": "GFE/2.0"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 14:30:09 GMT"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Wed, 19 Apr 2000 11:43:00 GMT"
+        },
+        {
+          "last-modified": "Wed, 21 Jan 2004 19:51:30 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, proxy-revalidate"
+        },
+        {
+          "age": "168216"
+        },
+        {
+          "server": "GFE/2.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Sat, 03-Nov-2012 13:13:45 GMT"
+        },
+        {
+          "etag": "M0-0eb75f26"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, no-transform, must-revalidate, max-age=604800"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 13:13:45 GMT"
+        },
+        {
+          "content-length": "2298"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:45 GMT"
+        },
+        {
+          "server": "QS"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "set-cookie": "mc=50951889-343da-16f7e-ae952; expires=Mon, 05-May-2014 13:13:45 GMT; path=/; domain=.quantserve.com"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR NID CURa ADMa DEVa PSAo PSDo OUR SAMa IND COM NAV\""
+        },
+        {
+          "cache-control": "private, no-cache, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 04 Aug 1978 12:00:00 GMT"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:45 GMT"
+        },
+        {
+          "server": "QS"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Sat, 17 Nov 2012 13:13:45 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:45 GMT"
+        },
+        {
+          "content-length": "1140"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "private, no-transform, max-age=1209600"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:45 GMT"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "lang=\"v=2&lang=en-us\"; Version=1; Domain=linkedin.com; Path=/"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-li-uuid": "jguBxDxCP8A3strRU6z0Sw=="
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:49 GMT"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "x-fs-uuid": "8e0b81c43c423fc037b2dad153acf44b"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "lighttpd"
+        },
+        {
+          "set-cookie": "lang=\"v=2&lang=en-us\"; Version=1; Domain=linkedin.com; Path=/"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-li-uuid": "jguBxDxCP8A3strRU6z0Sw=="
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "image/x-icon"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:49 GMT"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "x-fs-uuid": "8e0b81c43c423fc037b2dad153acf44b"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"1672258277\""
+        },
+        {
+          "last-modified": "Wed, 22 Jun 2011 20:28:00 GMT"
+        },
+        {
+          "content-length": "1150"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Thu, 16 Aug 2012 01:24:42 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1044"
+        },
+        {
+          "cache-control": "max-age=24721219"
+        },
+        {
+          "expires": "Fri, 16 Aug 2013 16:14:09 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:50 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Wed, 17 Oct 2012 23:09:52 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9168"
+        },
+        {
+          "cache-control": "max-age=30168335"
+        },
+        {
+          "expires": "Fri, 18 Oct 2013 17:19:25 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:50 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:51 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, no-cache, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 04 Aug 1978 12:00:00 GMT"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:51 GMT"
+        },
+        {
+          "server": "QS"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Wed, 21 Jan 2004 19:51:30 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 14:30:09 GMT"
+        },
+        {
+          "expires": "Wed, 19 Apr 2000 11:43:00 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "age": "168222"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, proxy-revalidate"
+        },
+        {
+          "server": "GFE/2.0"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:51 GMT"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 18:10:36 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-li-uuid": "eAzMxNUMwxJwGtyV9ioAAA=="
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "max-age=31525993"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 10:27:04 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:51 GMT"
+        },
+        {
+          "content-length": "223"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Sat, 01 Sep 2012 00:58:09 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-li-uuid": "CCdnnfDTwhJwlNCV9ioAAA=="
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "max-age=26048872"
+        },
+        {
+          "expires": "Sun, 01 Sep 2013 01:01:43 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:51 GMT"
+        },
+        {
+          "content-length": "11160"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "lang=\"v=2&lang=en-us\"; Version=1; Domain=linkedin.com; Path=/"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-li-uuid": "AZRbIR9V68fBQlYZzQoS1w=="
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:54 GMT"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "x-fs-uuid": "01945b211f55ebc7c1425619cd0a12d7"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"1672258277\""
+        },
+        {
+          "last-modified": "Wed, 22 Jun 2011 20:28:00 GMT"
+        },
+        {
+          "content-length": "4714"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, no-cache, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 04 Aug 1978 12:00:00 GMT"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:54 GMT"
+        },
+        {
+          "server": "QS"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:54 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Wed, 21 Jan 2004 19:51:30 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 14:30:09 GMT"
+        },
+        {
+          "expires": "Wed, 19 Apr 2000 11:43:00 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "age": "168226"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, proxy-revalidate"
+        },
+        {
+          "server": "GFE/2.0"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:54 GMT"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "lang=\"v=2&lang=en-us\"; Version=1; Domain=linkedin.com; Path=/"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-li-uuid": "wL1PItpHScLBRl0PVkiLLQ=="
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:59 GMT"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "x-fs-uuid": "c0bd4f22da4749c2c1465d0f56488b2d"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"1672258277\""
+        },
+        {
+          "last-modified": "Wed, 22 Jun 2011 20:28:00 GMT"
+        },
+        {
+          "content-length": "4714"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:59 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, no-cache, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 04 Aug 1978 12:00:00 GMT"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:59 GMT"
+        },
+        {
+          "server": "QS"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Wed, 21 Jan 2004 19:51:30 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 14:30:09 GMT"
+        },
+        {
+          "expires": "Wed, 19 Apr 2000 11:43:00 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "age": "168230"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, proxy-revalidate"
+        },
+        {
+          "server": "GFE/2.0"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:13:59 GMT"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "sl=\"delete me\"; Version=1; Max-Age=0; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-li-uuid": "vZHDyRjuiQCkhZBzyxGqrg=="
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:01 GMT"
+        },
+        {
+          "age": "3"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "x-fs-uuid": "bd91c3c918ee8900a4859073cb11aaae"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"1672258277\""
+        },
+        {
+          "last-modified": "Fri, 27 Nov 2009 06:27:21 GMT"
+        },
+        {
+          "content-length": "6176"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Tue, 02 Oct 2012 07:53:23 GMT"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "4012"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=28752189"
+        },
+        {
+          "expires": "Wed, 02 Oct 2013 07:57:11 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:02 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 17:17:34 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "628"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=3381907"
+        },
+        {
+          "expires": "Wed, 12 Dec 2012 16:39:09 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:02 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-length": "1044"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=31490642"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 00:38:04 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:02 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 18:36:32 GMT"
+        },
+        {
+          "x-li-uuid": "KMg5e7HswhIQwgDTIysAAA=="
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 00:20:08 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "17928"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=31230754"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 00:26:36 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:02 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Tue, 23 Oct 2012 10:10:40 GMT"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-li-uuid": "YP+9O9z6wRIwf5dQLCsAAA=="
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "11863"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=30574946"
+        },
+        {
+          "expires": "Wed, 23 Oct 2013 10:16:28 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:02 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 17:10:42 GMT"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "77011"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=30513689"
+        },
+        {
+          "expires": "Tue, 22 Oct 2013 17:15:31 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:02 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "352"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:05 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "sl=\"delete me\"; Version=1; Max-Age=0; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-li-uuid": "vZHDyRjuiQCkhZBzyxGqrg=="
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:04 GMT"
+        },
+        {
+          "age": "1"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "x-fs-uuid": "bd91c3c918ee8900a4859073cb11aaae"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"1672258277\""
+        },
+        {
+          "last-modified": "Fri, 27 Nov 2009 06:27:21 GMT"
+        },
+        {
+          "content-length": "6176"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 09:02:37 GMT"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 09:02:37 GMT"
+        },
+        {
+          "content-type": "application/ocsp-response"
+        },
+        {
+          "content-transfer-encoding": "binary"
+        },
+        {
+          "content-length": "1186"
+        },
+        {
+          "cache-control": "max-age=503312, public, no-transform, must-revalidate"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:05 GMT"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "connection": "Keep-Alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:06 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, no-cache, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 04 Aug 1978 12:00:00 GMT"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:06 GMT"
+        },
+        {
+          "server": "QS"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Wed, 21 Jan 2004 19:51:30 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 14:30:09 GMT"
+        },
+        {
+          "expires": "Wed, 19 Apr 2000 11:43:00 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "age": "168237"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, proxy-revalidate"
+        },
+        {
+          "server": "GFE/2.0"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 14:30:09 GMT"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Wed, 19 Apr 2000 11:43:00 GMT"
+        },
+        {
+          "last-modified": "Wed, 21 Jan 2004 19:51:30 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, proxy-revalidate"
+        },
+        {
+          "age": "168237"
+        },
+        {
+          "server": "GFE/2.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:06 GMT"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "X-LI-IDC=C1"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 22 Aug 2012 09:55:42 GMT"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:08 GMT"
+        },
+        {
+          "x-fs-uuid": "4062fd4fc89b6346ee2b61950a9840a5"
+        },
+        {
+          "x-li-uuid": "QGL9T8ibY0buK2GVCphApQ=="
+        },
+        {
+          "age": "1"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "sl=\"delete me\"; Version=1; Max-Age=0; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-li-uuid": "rDlCGMNjprrsLUOMpHhJIw=="
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:09 GMT"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "x-fs-uuid": "bd91c3c918ee8900a4859073cb11aaae"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"1672258277\""
+        },
+        {
+          "last-modified": "Fri, 27 Nov 2009 06:27:21 GMT"
+        },
+        {
+          "content-length": "0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "352"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:09 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "X-LI-IDC=C1"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 22 Aug 2012 09:55:42 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:09 GMT"
+        },
+        {
+          "x-fs-uuid": "4062fd4fc89b6346ee2b61950a9840a5"
+        },
+        {
+          "x-li-uuid": "CDPTy/MVwxKQFKu9mysAAA=="
+        },
+        {
+          "age": "0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Tue, 02 Oct 2012 17:09:44 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-li-uuid": "YP+9O9z6wRIwf5dQLCsAAA=="
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "64"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=28813847"
+        },
+        {
+          "expires": "Thu, 03 Oct 2013 01:04:56 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 19:11:14 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-li-uuid": "iA7sd9nTwhIQefs/LCsAAA=="
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "max-age=31463319"
+        },
+        {
+          "expires": "Sat, 02 Nov 2013 17:02:48 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:09 GMT"
+        },
+        {
+          "content-length": "603"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "1156"
+        },
+        {
+          "last-modified": "Fri, 18 Apr 2008 18:03:54 GMT"
+        },
+        {
+          "etag": "1208541834000"
+        },
+        {
+          "server": "Jetty(6.1.26)"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=5196477"
+        },
+        {
+          "expires": "Wed, 02 Jan 2013 16:42:07 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "3476"
+        },
+        {
+          "last-modified": "Thu, 01 Sep 2011 13:46:08 GMT"
+        },
+        {
+          "etag": "1314884768000"
+        },
+        {
+          "server": "Jetty(6.1.26)"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=29243668"
+        },
+        {
+          "expires": "Tue, 08 Oct 2013 00:28:38 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "1465"
+        },
+        {
+          "last-modified": "Wed, 15 Dec 2010 19:56:09 GMT"
+        },
+        {
+          "etag": "1292442969000"
+        },
+        {
+          "server": "Jetty(6.1.26)"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=5723024"
+        },
+        {
+          "expires": "Tue, 08 Jan 2013 18:57:54 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "1705"
+        },
+        {
+          "last-modified": "Wed, 13 May 2009 06:47:06 GMT"
+        },
+        {
+          "etag": "1242197226000"
+        },
+        {
+          "server": "Jetty(6.1.26)"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=28717727"
+        },
+        {
+          "expires": "Tue, 01 Oct 2013 22:22:57 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "1748"
+        },
+        {
+          "last-modified": "Mon, 13 Feb 2012 04:16:54 GMT"
+        },
+        {
+          "etag": "1329106614000"
+        },
+        {
+          "server": "Jetty(6.1.26)"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=29613032"
+        },
+        {
+          "expires": "Sat, 12 Oct 2013 07:04:42 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "2115"
+        },
+        {
+          "last-modified": "Mon, 06 Jun 2011 11:28:28 GMT"
+        },
+        {
+          "etag": "1307359708000"
+        },
+        {
+          "server": "Jetty(6.1.26)"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=29255048"
+        },
+        {
+          "expires": "Tue, 08 Oct 2013 03:38:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "2065"
+        },
+        {
+          "last-modified": "Fri, 15 Aug 2008 06:35:34 GMT"
+        },
+        {
+          "etag": "1218782134000"
+        },
+        {
+          "server": "Jetty(6.1.26)"
+        },
+        {
+          "cache-control": "max-age=23989474"
+        },
+        {
+          "expires": "Thu, 08 Aug 2013 04:58:44 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-cdn": "AKAM"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "1777"
+        },
+        {
+          "last-modified": "Sun, 06 Apr 2008 16:44:40 GMT"
+        },
+        {
+          "etag": "1207500280000"
+        },
+        {
+          "server": "Jetty(6.1.26)"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=24015458"
+        },
+        {
+          "expires": "Thu, 08 Aug 2013 12:11:48 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "2536"
+        },
+        {
+          "last-modified": "Sun, 17 Apr 2011 11:26:00 GMT"
+        },
+        {
+          "etag": "1303039560000"
+        },
+        {
+          "server": "Jetty(6.1.26)"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=30996570"
+        },
+        {
+          "expires": "Mon, 28 Oct 2013 07:23:40 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "1445"
+        },
+        {
+          "last-modified": "Sun, 14 Dec 2008 19:47:28 GMT"
+        },
+        {
+          "etag": "1229284048000"
+        },
+        {
+          "server": "Jetty(6.1.26)"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=31023826"
+        },
+        {
+          "expires": "Mon, 28 Oct 2013 14:57:56 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "11785"
+        },
+        {
+          "last-modified": "Tue, 21 Feb 2012 04:44:27 GMT"
+        },
+        {
+          "etag": "1329799467000"
+        },
+        {
+          "server": "Jetty(6.1.26)"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=29267475"
+        },
+        {
+          "expires": "Tue, 08 Oct 2013 07:05:25 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:11 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, no-cache, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 04 Aug 1978 12:00:00 GMT"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:11 GMT"
+        },
+        {
+          "server": "QS"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Wed, 21 Jan 2004 19:51:30 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 14:30:09 GMT"
+        },
+        {
+          "expires": "Wed, 19 Apr 2000 11:43:00 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "age": "168242"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, proxy-revalidate"
+        },
+        {
+          "server": "GFE/2.0"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 14:30:09 GMT"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Wed, 19 Apr 2000 11:43:00 GMT"
+        },
+        {
+          "last-modified": "Wed, 21 Jan 2004 19:51:30 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, proxy-revalidate"
+        },
+        {
+          "age": "168242"
+        },
+        {
+          "server": "GFE/2.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:11 GMT"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "1013"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:44:36 GMT"
+        },
+        {
+          "etag": "1351921476485"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=31508935"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 05:43:06 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:11 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-li-uuid": "uBgHimv9whIwouPuKysAAA=="
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "X-LI-IDC=C1"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 09 Aug 2012 02:40:28 GMT"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:12 GMT"
+        },
+        {
+          "x-fs-uuid": "b73d9dcff4c8d40067468ef689e05a93"
+        },
+        {
+          "x-li-uuid": "tz2dz/TI1ABnRo72ieBakw=="
+        },
+        {
+          "age": "1"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "6507"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "sl=\"delete me\"; Version=1; Max-Age=0; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-li-uuid": "+8Oyp3i1cl6p243WV3LM6g=="
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:13 GMT"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "x-fs-uuid": "bd91c3c918ee8900a4859073cb11aaae"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"1672258277\""
+        },
+        {
+          "last-modified": "Fri, 27 Nov 2009 06:27:21 GMT"
+        },
+        {
+          "content-length": "0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "537"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:13 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "2469"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:13 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "last-modified": "Tue, 08 May 2012 20:09:07 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 14:30:09 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 14:30:09 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "321"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "81845"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Tue, 21 Feb 2012 01:03:49 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 20:03:29 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 20:03:29 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "24156"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "61845"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 18:10:35 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "max-age=31525781"
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 10:23:54 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:13 GMT"
+        },
+        {
+          "content-length": "94"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "etag": "\"5f7cc9080cad02333445367dae64546d:1351006466\""
+        },
+        {
+          "last-modified": "Tue, 23 Oct 2012 15:34:26 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "max-age=3600"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:14 GMT"
+        },
+        {
+          "content-length": "1028"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Mon, 18 Jun 2012 13:12:57 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"eb63c14544dcd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/7.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "2955"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:14 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:14 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 16:25:49 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 16:25:49 GMT"
+        },
+        {
+          "etag": "46977404F0473696BBDC518B1845C60E809A3249"
+        },
+        {
+          "cache-control": "max-age=356494,public,no-transform,must-revalidate"
+        },
+        {
+          "x-ocsp-reponder-id": "t8edcaocsp6"
+        },
+        {
+          "content-length": "471"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "application/ocsp-response"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "etag": "\"65786c291a4603aa5150a1884452838d:1271351254\""
+        },
+        {
+          "last-modified": "Thu, 15 Apr 2010 17:07:29 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "max-age=2144448000"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:14 GMT"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "etag": "\"4cdd47b7bd15f75838435f1207ac1414:1351006993\""
+        },
+        {
+          "last-modified": "Tue, 23 Oct 2012 15:43:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "max-age=315360000"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:14 GMT"
+        },
+        {
+          "content-length": "12232"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "CP=\"COM NAV INT STA NID OUR IND NOI\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "set-cookie": "cckz=1mcwy3r; Domain=media6degrees.com; Expires=Thu, 02-May-2013 13:14:15 GMT; Path=/"
+        },
+        {
+          "location": "http://action.media6degrees.com/orbserv/nsjs?ncv=33&ns=299&pcv=39&nc=1&pixId=13086&cckz=true"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:14 GMT"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:15 GMT"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "X-LI-IDC=C1"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 17 Jul 2012 23:10:45 GMT"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:15 GMT"
+        },
+        {
+          "x-fs-uuid": "1034b0b6c77d1f91819a2d929764b582"
+        },
+        {
+          "x-li-uuid": "EDSwtsd9H5GBmi2Sl2S1gg=="
+        },
+        {
+          "age": "0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "6507"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "sl=\"delete me\"; Version=1; Max-Age=0; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-li-uuid": "iPSByYTV24172TMFAcPcSg=="
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:15 GMT"
+        },
+        {
+          "age": "0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "x-fs-uuid": "bd91c3c918ee8900a4859073cb11aaae"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"1672258277\""
+        },
+        {
+          "last-modified": "Fri, 27 Nov 2009 06:27:21 GMT"
+        },
+        {
+          "content-length": "0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "539"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:16 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "CP=\"COM NAV INT STA NID OUR IND NOI\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "set-cookie": "cckz=1mcwy3s; Domain=media6degrees.com; Expires=Thu, 02-May-2013 13:14:16 GMT; Path=/"
+        },
+        {
+          "location": "http://action.media6degrees.com/orbserv/nsjs?ncv=33&ns=299&pcv=39&nc=1&pixId=13086&cckz=true"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:16 GMT"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "CP=\"COM NAV INT STA NID OUR IND NOI\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "set-cookie": "JSESSIONID=CE33DFE7D94779C13B04C4D9B43D7792; Path=/orbserv; HttpOnly"
+        },
+        {
+          "content-type": "text/html;charset=ISO-8859-1"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "content-length": "5"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:15 GMT"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "841"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:16 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "u=8|0BAgYJ9UoGCfVKAAAAAAAAQEAAQIhdawAARg9fRc3AAAAAAT9PvgAAAAAAu9ZfgAAAAAO_VtUCBMBAAuBLQA; Version=1; Domain=.agkn.com; Max-Age=63072000; Expires=Mon, 03-Nov-2014 13:14:16 GMT; Path=/"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT\""
+        },
+        {
+          "expires": "Sat, 01 Jan 2000 00:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "image/gif;charset=ISO-8859-1"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:15 GMT"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "X-LI-IDC=C1"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 17 Jul 2012 23:10:45 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:16 GMT"
+        },
+        {
+          "x-fs-uuid": "1034b0b6c77d1f91819a2d929764b582"
+        },
+        {
+          "x-li-uuid": "EDSwtsd9H5GBmi2Sl2S1gg=="
+        },
+        {
+          "age": "0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "6507"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "2036"
+        },
+        {
+          "last-modified": "Thu, 29 Nov 2007 19:09:10 GMT"
+        },
+        {
+          "etag": "1196363350000"
+        },
+        {
+          "server": "Jetty(6.1.26)"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=31005797"
+        },
+        {
+          "expires": "Mon, 28 Oct 2013 09:57:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:16 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-li-uuid": "uBgHimv9whIwouPuKysAAA=="
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "access-control-allow-origin": "http://www.linkedin.com"
+        },
+        {
+          "last-modified": "Sat, 15 Sep 2012 06:22:35 GMT"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "max-age=27345738"
+        },
+        {
+          "expires": "Mon, 16 Sep 2013 01:16:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:16 GMT"
+        },
+        {
+          "content-length": "146"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "last-modified": "Tue, 03 Jul 2012 21:15:31 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 03:30:07 GMT"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 03:30:07 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "19787"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "35049"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "304"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Mon, 18 Jun 2012 13:12:57 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"eb63c14544dcd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/7.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "2955"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:16 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "etag": "\"84332e7556647543d5f87647f37a8a6d:1346087966\""
+        },
+        {
+          "last-modified": "Mon, 27 Aug 2012 17:19:26 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "max-age=600"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:16 GMT"
+        },
+        {
+          "content-length": "741"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:16 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, no-cache, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 04 Aug 1978 12:00:00 GMT"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:16 GMT"
+        },
+        {
+          "server": "QS"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Wed, 21 Jan 2004 19:51:30 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 14:30:09 GMT"
+        },
+        {
+          "expires": "Wed, 19 Apr 2000 11:43:00 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "age": "168247"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, proxy-revalidate"
+        },
+        {
+          "server": "GFE/2.0"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 14:30:09 GMT"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Wed, 19 Apr 2000 11:43:00 GMT"
+        },
+        {
+          "last-modified": "Wed, 21 Jan 2004 19:51:30 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, proxy-revalidate"
+        },
+        {
+          "age": "168247"
+        },
+        {
+          "server": "GFE/2.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "etag": "\"f13746374fa151b24abd8bf99a396878:1347294343\""
+        },
+        {
+          "last-modified": "Mon, 10 Sep 2012 16:25:43 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "max-age=2144448000"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:16 GMT"
+        },
+        {
+          "content-length": "1028"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "etag": "\"4d5ead3cfaa1fd96263197170ccaed07:1347294382\""
+        },
+        {
+          "last-modified": "Mon, 10 Sep 2012 16:26:22 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "1507"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "max-age=2144448000"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:16 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:16 GMT"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "X-LI-IDC=C1"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sun, 05 Aug 2012 15:35:43 GMT"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:18 GMT"
+        },
+        {
+          "x-fs-uuid": "e4dcbadff47540485aebb5d079a66252"
+        },
+        {
+          "x-li-uuid": "5Ny63/R1QEha67XQeaZiUg=="
+        },
+        {
+          "age": "0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "6507"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "sl=\"delete me\"; Version=1; Max-Age=0; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-li-uuid": "qwi+h66wCYWzSNcKexV4yw=="
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:18 GMT"
+        },
+        {
+          "age": "1"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "x-fs-uuid": "bd91c3c918ee8900a4859073cb11aaae"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"1672258277\""
+        },
+        {
+          "last-modified": "Fri, 27 Nov 2009 06:27:21 GMT"
+        },
+        {
+          "content-length": "0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "538"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:19 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "CP=\"COM NAV INT STA NID OUR IND NOI\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "set-cookie": "JSESSIONID=AA69DF8838B33636B86F3AD5917D28DD; Path=/orbserv; HttpOnly"
+        },
+        {
+          "content-type": "text/html;charset=ISO-8859-1"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "content-length": "5"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:19 GMT"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "859"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:19 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "X-LI-IDC=C1"
+        },
+        {
+          "p3p": "CP=\"CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE\""
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sun, 05 Aug 2012 15:35:43 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:19 GMT"
+        },
+        {
+          "x-fs-uuid": "e4dcbadff47540485aebb5d079a66252"
+        },
+        {
+          "x-li-uuid": "aGvE/vUVwxKwMlIRJCsAAA=="
+        },
+        {
+          "age": "0"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-length": "6507"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "u=8|0BAgYJ9UoGCfVKwAAAAABAQEAAQQhdawAARg9fRc3AAAAAAT9PvgAAAAAAu5WuAAAAAAO_VtUCBMBAAuBLQA; Version=1; Domain=.agkn.com; Max-Age=63072000; Expires=Mon, 03-Nov-2014 13:14:19 GMT; Path=/"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT\""
+        },
+        {
+          "expires": "Sat, 01 Jan 2000 00:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "image/gif;charset=ISO-8859-1"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:18 GMT"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-length": "3183"
+        },
+        {
+          "last-modified": "Tue, 04 Mar 2008 16:53:17 GMT"
+        },
+        {
+          "etag": "1204649597000"
+        },
+        {
+          "server": "Jetty(6.1.26)"
+        },
+        {
+          "x-cdn": "AKAM"
+        },
+        {
+          "cache-control": "max-age=31199347"
+        },
+        {
+          "expires": "Wed, 30 Oct 2013 15:43:26 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:19 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-li-uuid": "uBgHimv9whIwouPuKysAAA=="
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "304"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Mon, 18 Jun 2012 13:12:57 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"eb63c14544dcd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/7.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "2955"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:19 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:19 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, no-cache, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 04 Aug 1978 12:00:00 GMT"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:19 GMT"
+        },
+        {
+          "server": "QS"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Wed, 21 Jan 2004 19:51:30 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 14:30:09 GMT"
+        },
+        {
+          "expires": "Wed, 19 Apr 2000 11:43:00 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "age": "168250"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, proxy-revalidate"
+        },
+        {
+          "server": "GFE/2.0"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Thu, 01 Nov 2012 14:30:09 GMT"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Wed, 19 Apr 2000 11:43:00 GMT"
+        },
+        {
+          "last-modified": "Wed, 21 Jan 2004 19:51:30 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, proxy-revalidate"
+        },
+        {
+          "age": "168250"
+        },
+        {
+          "server": "GFE/2.0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:14:19 GMT"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_29.json b/jetty-http2/http2-hpack/src/test/resources/data/story_29.json
new file mode 100644
index 0000000..01bdbbf
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_29.json
@@ -0,0 +1,13780 @@
+{
+  "context": "response",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":status": "301"
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "location": "http://www.msn.com/"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:27 GMT"
+        },
+        {
+          "content-length": "142"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "p3p": "CP=\"NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OUR IND\""
+        },
+        {
+          "set-cookie": "SRCHUSR=AUTOREDIR=0&GEOVAR=&DOB=20121103; expires=Mon, 03-Nov-2014 13:29:29 GMT; domain=.msn.com; path=/"
+        },
+        {
+          "errorcodecount": "[0:0]"
+        },
+        {
+          "s": "CO3SCH010020101"
+        },
+        {
+          "edge-control": "no-store"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:28 GMT"
+        },
+        {
+          "content-length": "41648"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=43200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"808cfaf3c1ac81:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "age": "7374"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2007 15:02:13 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 23:26:35 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=86400,public"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"078def13c1fcd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "age": "33322"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Fri, 20 Apr 2012 21:31:28 GMT"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 04:14:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"083df89b6bac81:0\""
+        },
+        {
+          "server": "BLUMPPSTCA08"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "1162"
+        },
+        {
+          "age": "9388284"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Tue, 20 May 2008 20:17:34 GMT"
+        },
+        {
+          "expires": "Wed, 17 Jul 2013 21:38:05 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=86400,public"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"078def13c1fcd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "age": "33322"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Fri, 20 Apr 2012 21:31:28 GMT"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 04:14:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"096b38d19cc1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "417"
+        },
+        {
+          "age": "11654605"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Tue, 03 May 2011 20:32:28 GMT"
+        },
+        {
+          "expires": "Fri, 21 Jun 2013 16:06:04 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"99789f9faea8cd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "2712"
+        },
+        {
+          "age": "378940"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 19:20:21 GMT"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 04:13:49 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"d6db97976eb9cd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "3262"
+        },
+        {
+          "age": "37907"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 02:54:50 GMT"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 02:57:42 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"6c2a9d5170b1cd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "4648"
+        },
+        {
+          "age": "23683"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Tue, 23 Oct 2012 22:47:02 GMT"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 06:54:45 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/x-icon"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"0922651f38cb1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "4286"
+        },
+        {
+          "age": "9388299"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Tue, 10 Aug 2010 00:03:00 GMT"
+        },
+        {
+          "expires": "Wed, 17 Jul 2013 21:37:50 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"f9f8904b5ab9cd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "4352"
+        },
+        {
+          "age": "46151"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 00:29:32 GMT"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 00:40:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"8437263c89b8cd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "6131"
+        },
+        {
+          "age": "23313"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 23:33:02 GMT"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 07:00:56 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"54a642c148b9cd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "5522"
+        },
+        {
+          "age": "23304"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 22:23:59 GMT"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 07:01:05 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"f5d7f6f68b8cd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "4048"
+        },
+        {
+          "age": "23326"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 19:38:15 GMT"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 07:00:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"789825b3b68cc1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "7075"
+        },
+        {
+          "age": "304691"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Aug 2011 18:27:54 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 00:51:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"6a4618d83cb9cd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "11544"
+        },
+        {
+          "age": "59087"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 20:58:43 GMT"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 21:04:42 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"188d971c36b9cd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "3753"
+        },
+        {
+          "age": "23326"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 20:10:32 GMT"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 07:00:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80a9243afa8cd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "2135"
+        },
+        {
+          "age": "64967"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 19:24:57 GMT"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 19:26:42 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"da259a60afb9cd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "6786"
+        },
+        {
+          "age": "9961"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 10:38:35 GMT"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 10:43:28 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"3a2bfd7658b9cd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "6859"
+        },
+        {
+          "age": "47464"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 00:16:26 GMT"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 00:18:25 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"feefae84ab9cd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "7066"
+        },
+        {
+          "age": "23304"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 22:39:23 GMT"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 07:01:05 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"4b1b97dcc0b9cd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "14928"
+        },
+        {
+          "age": "2676"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 12:43:44 GMT"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 12:44:53 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80f314cf17b7cd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "23864"
+        },
+        {
+          "age": "290866"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 03:28:35 GMT"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 04:41:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"9c71d229a3b9cd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "7497"
+        },
+        {
+          "age": "14681"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 09:11:09 GMT"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 09:24:48 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=300"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 19:29:28 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"01c35bc2fa3cd1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=43200"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"91588811bb8bcd1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "2420"
+        },
+        {
+          "age": "41017"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Wed, 05 Sep 2012 23:06:23 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 14:05:53 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"0e49dbec5aecb1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "4082"
+        },
+        {
+          "age": "8615761"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Fri, 07 Jan 2011 23:51:04 GMT"
+        },
+        {
+          "expires": "Fri, 26 Jul 2013 20:13:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"ac1668bfc52ca1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "657"
+        },
+        {
+          "age": "159348"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Thu, 22 Oct 2009 09:46:35 GMT"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 17:13:42 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"803ab9aa463acd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "24630"
+        },
+        {
+          "age": "9388297"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Fri, 25 May 2012 07:19:05 GMT"
+        },
+        {
+          "expires": "Wed, 17 Jul 2013 21:37:53 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"02bfb6a29b7cd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "65670"
+        },
+        {
+          "age": "285810"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 05:34:38 GMT"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 06:06:00 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80d88a9463acd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "74"
+        },
+        {
+          "age": "8077925"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Fri, 25 May 2012 07:19:03 GMT"
+        },
+        {
+          "expires": "Fri, 02 Aug 2013 01:37:25 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"8097d798463acd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "48"
+        },
+        {
+          "age": "9389765"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Fri, 25 May 2012 07:18:35 GMT"
+        },
+        {
+          "expires": "Wed, 17 Jul 2013 21:13:25 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"5bc3dfd117b7cd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "6234"
+        },
+        {
+          "age": "290867"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 03:28:39 GMT"
+        },
+        {
+          "expires": "Thu, 31 Oct 2013 04:41:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"801e6b9c463acd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "1117"
+        },
+        {
+          "age": "8614139"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Fri, 25 May 2012 07:18:41 GMT"
+        },
+        {
+          "expires": "Fri, 26 Jul 2013 20:40:31 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"077efa8463acd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "age": "11574965"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Fri, 25 May 2012 07:19:02 GMT"
+        },
+        {
+          "expires": "Sat, 22 Jun 2013 14:13:25 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"8097d798463acd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "1142"
+        },
+        {
+          "age": "9388300"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Fri, 25 May 2012 07:18:35 GMT"
+        },
+        {
+          "expires": "Wed, 17 Jul 2013 21:37:50 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"8086f4a5463acd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "172"
+        },
+        {
+          "age": "9388300"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Fri, 25 May 2012 07:18:57 GMT"
+        },
+        {
+          "expires": "Wed, 17 Jul 2013 21:37:50 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"8016f7a74e67cc1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "421"
+        },
+        {
+          "age": "9389765"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Tue, 30 Aug 2011 19:54:41 GMT"
+        },
+        {
+          "expires": "Wed, 17 Jul 2013 21:13:25 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"9a7af237eb5cd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "5436"
+        },
+        {
+          "age": "462287"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 02:35:10 GMT"
+        },
+        {
+          "expires": "Tue, 29 Oct 2013 05:04:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "text/html; Charset=utf-8"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 19:29:28 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"01c35bc2fa3cd1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "content-length": "1640"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "3989"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "x-radid": "P10263730-T100595690-C40000000000114208"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "p3p": "CP=\"NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OUR IND\""
+        },
+        {
+          "set-cookie": "SRCHD=MS=2546729&D=2546729&AF=NOFORM; expires=Mon, 03-Nov-2014 13:29:30 GMT; domain=.msn.com; path=/"
+        },
+        {
+          "errorcodecount": "[0:0]"
+        },
+        {
+          "s": "CO3SCH010133009"
+        },
+        {
+          "edge-control": "no-store"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "content-length": "2197"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "cache-control": "private, no-cache, proxy-revalidate, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "location": "http://c.atdmt.com/c.gif?udc=true&di=340&pi=7317&ps=95101&lng=en-us&tp=http%3A%2F%2Fwww.msn.com%2Fdefaultwpe3w.aspx&rid=e32241cc231e4226b91543c154dd3b7e&rnd=1351949370023&rf=&scr=1366x768&RedC=c.msn.com&MXFR=3D632B5B5356602B36252F56575660EB"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "set-cookie": "MUID=3D632B5B5356602B36252F56575660EB&TUID=1; domain=.msn.com; expires=Mon, 03-Nov-2014 13:29:30 GMT; path=/;"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "content-length": "0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-length": "42"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-location": "http://spe.atdmt.com/images/pixel.gif"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:29 GMT"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "location": "http://s0.2mdn.net/viewad/3642305/1-1x1.gif"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "GFE/2.0"
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001001"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=1800"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"0287ded7fb9cd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/7.0"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "1811"
+        },
+        {
+          "age": "1765"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 04:58:56 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:30:04 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=1800"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80722a7c098cc1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/7.0"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "9346"
+        },
+        {
+          "age": "1170"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Tue, 01 Nov 2011 18:04:09 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:40:00 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=1800"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"0af38a5c098cc1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/7.0"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "20808"
+        },
+        {
+          "age": "1411"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Tue, 01 Nov 2011 18:04:06 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:35:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=1800"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"8091e4ec7fb9cd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/7.0"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "1142"
+        },
+        {
+          "age": "1226"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 04:58:55 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:39:04 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "cache-control": "private, no-cache, proxy-revalidate, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "location": "http://c.msn.com/c.gif?udc=true&di=340&pi=7317&ps=95101&lng=en-us&tp=http%3A%2F%2Fwww.msn.com%2Fdefaultwpe3w.aspx&rid=e32241cc231e4226b91543c154dd3b7e&rnd=1351949370023&rf=&scr=1366x768&MUID=39C1843BD7CB679E06238036D4CB670B&cb=1cdb9c7414258b0"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "set-cookie": "SRM_M=39C1843BD7CB679E06238036D4CB670B; domain=c.atdmt.com; expires=Mon, 03-Nov-2014 13:29:30 GMT; path=/;"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "content-length": "0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-cache, proxy-revalidate, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 20 Oct 2011 10:27:58 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"04baaef128fcc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "set-cookie": "ANONCHK=0; domain=c.msn.com; expires=Tue, 06-Nov-2012 13:29:30 GMT; path=/;"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=1800"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"299a82bdeb9cd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/7.0"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-length": "20046"
+        },
+        {
+          "age": "1074"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 15:28:42 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:36 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Fri, 17 Aug 2012 14:27:55 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 19:34:58 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 19:34:58 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "46"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "64473"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 07:00:23 GMT"
+        },
+        {
+          "server": "Jetty(6.1.22)"
+        },
+        {
+          "p3p": "policyref=\"/w3c/policy.xml\", CP=\"NOI DSP COR CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT\""
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "x-powered-by": "Mirror Image Internet"
+        },
+        {
+          "via": "1.1 bfi061004 (MII-APC/2.2)"
+        },
+        {
+          "x-mii-cache-hit": "1"
+        },
+        {
+          "content-length": "42"
+        },
+        {
+          "keep-alive": "timeout=2"
+        },
+        {
+          "connection": "Keep-Alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"0e2349e463acd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "93"
+        },
+        {
+          "age": "8077926"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:31 GMT"
+        },
+        {
+          "last-modified": "Fri, 25 May 2012 07:18:44 GMT"
+        },
+        {
+          "expires": "Fri, 02 Aug 2013 01:37:25 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "set-cookie": "pudm_AAAA=MLuxc4uHAF5HEldAttN+mTMH5l3UFcGfjYAvMSjMMwDWP3TDUWl1; Domain=.revsci.net; Expires=Sun, 03-Nov-2013 13:29:31 GMT; Path=/"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://js.revsci.net/w3c/rsip3p.xml\", CP=\"NON PSA PSD IVA IVD OTP SAM IND UNI PUR COM NAV INT DEM CNT STA PRE OTC HEA\""
+        },
+        {
+          "x-proc-data": "pd3-bgas02-0"
+        },
+        {
+          "content-type": "application/javascript;charset=ISO-8859-1"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "p3p": "CP=\"NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OUR IND\""
+        },
+        {
+          "set-cookie": "SRCHD=SM=1&MS=2546729&D=2546729&AF=NOFORM; expires=Mon, 03-Nov-2014 13:29:31 GMT; domain=.msn.com; path=/"
+        },
+        {
+          "errorcodecount": "[0:0]"
+        },
+        {
+          "s": "CO3SCH010120128"
+        },
+        {
+          "edge-control": "no-store"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:30 GMT"
+        },
+        {
+          "content-length": "1672"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"0a420aa463acd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "387"
+        },
+        {
+          "age": "11654712"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:31 GMT"
+        },
+        {
+          "last-modified": "Fri, 25 May 2012 07:19:04 GMT"
+        },
+        {
+          "expires": "Fri, 21 Jun 2013 16:04:19 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"05ba19a463acd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "4842"
+        },
+        {
+          "age": "11654572"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:32 GMT"
+        },
+        {
+          "last-modified": "Fri, 25 May 2012 07:18:38 GMT"
+        },
+        {
+          "expires": "Fri, 21 Jun 2013 16:06:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80b325a7463acd1:0\""
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "1105"
+        },
+        {
+          "age": "8614141"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:32 GMT"
+        },
+        {
+          "last-modified": "Fri, 25 May 2012 07:18:59 GMT"
+        },
+        {
+          "expires": "Fri, 26 Jul 2013 20:40:31 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "text/html; Charset=utf-8"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 19:29:28 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"01c35bc2fa3cd1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:32 GMT"
+        },
+        {
+          "content-length": "562"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "884"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "x-radid": "P10669318-T100595843-C108000000000115722"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "3114"
+        },
+        {
+          "content-type": "text/html; Charset=utf-8"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-radid": "P10603404-T100595756-C48000000000113484"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:31 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1323"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "text/html; Charset=utf-8"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 19:29:28 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"01c35bc2fa3cd1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:31 GMT"
+        },
+        {
+          "content-length": "1336"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "3147"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "x-radid": "P10720545-T100595939-C52000000000120598"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "406"
+        },
+        {
+          "content-type": "text/html; Charset=utf-8"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-radid": "P3782944-T100582739-C521263"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:31 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "325"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"0bd514f14ac31:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "content-length": "85"
+        },
+        {
+          "age": "12894277"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:32 GMT"
+        },
+        {
+          "last-modified": "Tue, 15 Jul 2003 16:49:38 GMT"
+        },
+        {
+          "expires": "Fri, 07 Jun 2013 07:44:55 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, max-age=31535999"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "2710"
+        },
+        {
+          "age": "3659370"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:32 GMT"
+        },
+        {
+          "expires": "Sun, 22 Sep 2013 05:00:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, max-age=31508189"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "9220"
+        },
+        {
+          "age": "3659358"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:32 GMT"
+        },
+        {
+          "expires": "Sat, 21 Sep 2013 21:16:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, max-age=31338077"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "3607"
+        },
+        {
+          "age": "3400121"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:32 GMT"
+        },
+        {
+          "expires": "Sun, 22 Sep 2013 22:02:08 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 09:35:33 GMT"
+        },
+        {
+          "etag": "\"1411999884f419ea8219bf9b531a9c66\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "application/javascript; charset=utf-8"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3260"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:32 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "CP=\"CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS IND UNI COM NAV INT\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "application/json; charset=utf-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:32 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "etag": "\"377d257f2d2e294916143c069141c1c5:1328738114\""
+        },
+        {
+          "last-modified": "Wed, 08 Feb 2012 21:55:14 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "CP=\"CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS IND UNI COM NAV INT\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:32 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:10:52 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "status": "200 OK"
+        },
+        {
+          "content-type": "application/javascript;charset=utf-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "889"
+        },
+        {
+          "server": "tfe"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate, post-check=0, pre-check=0"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:29:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:32 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "x-transaction": "49df427f743e57d8"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:29:32 GMT"
+        },
+        {
+          "expires": "Tue, 31 Mar 1981 05:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate, pre-check=0, post-check=0"
+        },
+        {
+          "set-cookie": "guest_id=v1%3A135194937257731566; Expires=Mon, 3-Nov-2014 13:29:32 GMT; Path=/; Domain=.twitter.com"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:32 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "65"
+        },
+        {
+          "server": "tfe"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 09:48:13 GMT"
+        },
+        {
+          "etag": "\"b036a791811effc968bfcb43fa6d6910\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "7242"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:32 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "p3p": "CP=\"CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS IND UNI COM NAV INT\""
+        },
+        {
+          "cache-control": "public, max-age=1800"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:34 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 16:28:26 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 16:28:26 GMT"
+        },
+        {
+          "etag": "412224A3234E88A2760468333271010BB1C6D1AA"
+        },
+        {
+          "cache-control": "max-age=355731,public,no-transform,must-revalidate"
+        },
+        {
+          "x-ocsp-reponder-id": "t8edcaocsp4"
+        },
+        {
+          "content-length": "471"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "application/ocsp-response"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "application/ocsp-response"
+        },
+        {
+          "content-transfer-encoding": "Binary"
+        },
+        {
+          "content-length": "1938"
+        },
+        {
+          "connection": "Close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:34 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 16:28:26 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 16:28:26 GMT"
+        },
+        {
+          "etag": "412224A3234E88A2760468333271010BB1C6D1AA"
+        },
+        {
+          "cache-control": "max-age=355731,public,no-transform,must-revalidate"
+        },
+        {
+          "x-ocsp-reponder-id": "t8edcaocsp4"
+        },
+        {
+          "content-length": "471"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "application/ocsp-response"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "x-aspnetmvc-version": "4.0"
+        },
+        {
+          "x-ua-compatible": "IE=Edge;chrome=1"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:35 GMT"
+        },
+        {
+          "content-length": "28018"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 06:48:54 GMT"
+        },
+        {
+          "server": "Jetty(6.1.22)"
+        },
+        {
+          "p3p": "policyref=\"/w3c/policy.xml\", CP=\"NOI DSP COR CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT\""
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "x-powered-by": "Mirror Image Internet"
+        },
+        {
+          "via": "1.1 bfi061001 (MII-APC/2.2)"
+        },
+        {
+          "x-mii-cache-hit": "1"
+        },
+        {
+          "content-length": "42"
+        },
+        {
+          "keep-alive": "timeout=2"
+        },
+        {
+          "connection": "Keep-Alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"80ebcf5152b0cd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-length": "6717"
+        },
+        {
+          "age": "1026619"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:35 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 12:39:47 GMT"
+        },
+        {
+          "expires": "Tue, 22 Oct 2013 16:19:16 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"0195ab552b0cd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-length": "8659"
+        },
+        {
+          "age": "1026617"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:35 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 12:42:34 GMT"
+        },
+        {
+          "expires": "Tue, 22 Oct 2013 16:19:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-cache, proxy-revalidate, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 20 Oct 2011 10:27:58 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"04baaef128fcc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "set-cookie": "ANONCHK=0; domain=c.msn.com; expires=Tue, 06-Nov-2012 13:29:30 GMT; path=/;"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:35 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"707a74ac52b0cd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-length": "9389"
+        },
+        {
+          "age": "1026617"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:35 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 12:42:19 GMT"
+        },
+        {
+          "expires": "Tue, 22 Oct 2013 16:19:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"f0edab8b52b0cd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-length": "3749"
+        },
+        {
+          "age": "1026645"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:35 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 12:41:24 GMT"
+        },
+        {
+          "expires": "Tue, 22 Oct 2013 16:18:50 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/x-icon"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "x-aspnetmvc-version": "4.0"
+        },
+        {
+          "x-ua-compatible": "IE=Edge;chrome=1"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:35 GMT"
+        },
+        {
+          "content-length": "4286"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 23:16:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"951751d2bdb7cd1:0\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001001"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:35 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431991"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "773"
+        },
+        {
+          "age": "416777"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:35 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 17:43:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431989"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "4747"
+        },
+        {
+          "age": "69970"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:35 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 18:03:14 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001004"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:35 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=423916"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "45125"
+        },
+        {
+          "age": "4791"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:35 GMT"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 09:55:00 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public,max-age=31536000"
+        },
+        {
+          "content-length": "42060"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"1ac2aef461a9cc1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "p3p": "CP=\"ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI\""
+        },
+        {
+          "vtag": "279606632500000000"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "age": "3987586"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:36 GMT"
+        },
+        {
+          "last-modified": "Tue, 22 Nov 2011 21:59:06 GMT"
+        },
+        {
+          "expires": "Wed, 18 Sep 2013 09:49:50 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:35 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "text/html; Charset=utf-8"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 19:29:28 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"01c35bc2fa3cd1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:36 GMT"
+        },
+        {
+          "content-length": "954"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "2008"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "x-radid": "P10723443-T100550693-C29000000000082620"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store, no-cache, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 15 Nov 2008 16:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.adnxs.com/w3c/policy/p3p.xml\", CP=\"NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE\""
+        },
+        {
+          "x-xss-protection": "0"
+        },
+        {
+          "set-cookie": "anj=Kfu=8fG7]PCxrx)0s]#%2L_'x%SEV/hnJip4FQV_eKj?9kb10I3SSI79ox)!lG@t]; path=/; expires=Fri, 01-Feb-2013 13:29:36 GMT; domain=.adnxs.com; HttpOnly"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:36 GMT"
+        },
+        {
+          "content-length": "615"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:35 GMT"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-length": "381"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "42"
+        },
+        {
+          "allow": "GET"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 04:51:56 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:36 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store, no-cache, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 15 Nov 2008 16:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.adnxs.com/w3c/policy/p3p.xml\", CP=\"NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE\""
+        },
+        {
+          "x-xss-protection": "0"
+        },
+        {
+          "set-cookie": "anj=Kfu=8fG7]PCxrx)0s]#%2L_'x%SEV/hnJip4FQV_eKj?9kb10I3SSI79ox)!lG@t]; path=/; expires=Fri, 01-Feb-2013 13:29:36 GMT; domain=.adnxs.com; HttpOnly"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:36 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-msadid": "300089389.300024620"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:36 GMT"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-length": "2290"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "40789"
+        },
+        {
+          "allow": "GET"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 21:57:40 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "20802"
+        },
+        {
+          "allow": "GET"
+        },
+        {
+          "expires": "Mon, 05 Nov 2012 06:30:42 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431968"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "4319"
+        },
+        {
+          "age": "1707"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 13:00:38 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431760"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "5321"
+        },
+        {
+          "age": "14923"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 09:16:54 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431996"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "4605"
+        },
+        {
+          "age": "46358"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 00:36:55 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431925"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "4097"
+        },
+        {
+          "age": "64344"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 19:35:58 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=432000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "4692"
+        },
+        {
+          "age": "32851"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 04:22:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431754"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "2555"
+        },
+        {
+          "age": "14924"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 09:16:47 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431758"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "4026"
+        },
+        {
+          "age": "54890"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 22:10:45 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431997"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "4589"
+        },
+        {
+          "age": "403007"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 21:32:47 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431990"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "3476"
+        },
+        {
+          "age": "82129"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:40:38 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431839"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "5927"
+        },
+        {
+          "age": "53455"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 22:36:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431993"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "4900"
+        },
+        {
+          "age": "83837"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:12:13 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431997"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "4420"
+        },
+        {
+          "age": "88061"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 13:01:53 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "application/octet-stream"
+        },
+        {
+          "content-length": "2209"
+        },
+        {
+          "allow": "GET"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 19:27:55 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431982"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "5496"
+        },
+        {
+          "age": "63170"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 19:56:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431991"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "3450"
+        },
+        {
+          "age": "89554"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 12:36:54 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431990"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "2271"
+        },
+        {
+          "age": "92961"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 11:40:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431991"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "4009"
+        },
+        {
+          "age": "86314"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 13:30:54 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431989"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "3779"
+        },
+        {
+          "age": "86708"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 13:24:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431976"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "3115"
+        },
+        {
+          "age": "69186"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 18:16:07 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431990"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "4867"
+        },
+        {
+          "age": "80624"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 15:05:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431993"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "5187"
+        },
+        {
+          "age": "140253"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 22:31:57 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431966"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "5244"
+        },
+        {
+          "age": "140817"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 22:22:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431931"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "3807"
+        },
+        {
+          "age": "303973"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Mon, 05 Nov 2012 01:02:15 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431977"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "4135"
+        },
+        {
+          "age": "143835"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 21:31:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431943"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "5096"
+        },
+        {
+          "age": "64149"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 19:39:31 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431988"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "3801"
+        },
+        {
+          "age": "125275"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 02:41:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431990"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "4499"
+        },
+        {
+          "age": "144182"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 21:26:25 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "application/json; charset=utf-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:37 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "x-aspnetmvc-version": "4.0"
+        },
+        {
+          "x-ua-compatible": "IE=Edge;chrome=1"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:42 GMT"
+        },
+        {
+          "content-length": "23449"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"0feb9575b2cd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-length": "5942"
+        },
+        {
+          "age": "717045"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:42 GMT"
+        },
+        {
+          "last-modified": "Wed, 24 Oct 2012 16:33:48 GMT"
+        },
+        {
+          "expires": "Sat, 26 Oct 2013 06:18:57 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"0f9f3446b2cd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-length": "8528"
+        },
+        {
+          "age": "717044"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:42 GMT"
+        },
+        {
+          "last-modified": "Wed, 24 Oct 2012 16:40:26 GMT"
+        },
+        {
+          "expires": "Sat, 26 Oct 2013 06:18:58 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"968a7a9552b0cd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-length": "8149"
+        },
+        {
+          "age": "1026651"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:42 GMT"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 12:41:40 GMT"
+        },
+        {
+          "expires": "Tue, 22 Oct 2013 16:18:51 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-cache, proxy-revalidate, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 20 Oct 2011 10:27:58 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"04baaef128fcc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "set-cookie": "ANONCHK=0; domain=c.msn.com; expires=Tue, 06-Nov-2012 13:29:30 GMT; path=/;"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:42 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/x-icon"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "x-aspnetmvc-version": "4.0"
+        },
+        {
+          "x-ua-compatible": "IE=Edge;chrome=1"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:42 GMT"
+        },
+        {
+          "content-length": "4286"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 23:16:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"951751d2bdb7cd1:0\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001004"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:42 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "text/html; Charset=utf-8"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 19:29:28 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"01c35bc2fa3cd1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:42 GMT"
+        },
+        {
+          "content-length": "954"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "2008"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "x-radid": "P10723443-T100550693-C29000000000082620"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001001"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:42 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, max-age=24"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "machine": "SN1********532"
+        },
+        {
+          "rendertime": "11/2/2012 8:14:13 AM"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "34971"
+        },
+        {
+          "age": "39"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:42 GMT"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 15:14:13 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:44:02 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store, no-cache, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 15 Nov 2008 16:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.adnxs.com/w3c/policy/p3p.xml\", CP=\"NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE\""
+        },
+        {
+          "x-xss-protection": "0"
+        },
+        {
+          "set-cookie": "anj=Kfu=8fG3x=Cxrx)0s]#%2L_'x%SEV/hnKu94FQV_eKj?9kb10I3SSI7:0wHz@)G?)i4ZhK; path=/; expires=Fri, 01-Feb-2013 13:29:43 GMT; domain=.adnxs.com; HttpOnly"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:43 GMT"
+        },
+        {
+          "content-length": "514"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, max-age=7775467"
+        },
+        {
+          "content-type": "text/css; charset=utf-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "machine": "SN1********532"
+        },
+        {
+          "rendertime": "11/2/2012 8:14:13 AM"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "27220"
+        },
+        {
+          "age": "226499"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:43 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 22:25:52 GMT"
+        },
+        {
+          "expires": "Tue, 29 Jan 2013 22:25:51 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public"
+        },
+        {
+          "content-length": "1465"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "age": "77450"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:43 GMT"
+        },
+        {
+          "last-modified": "Thu, 06 Sep 2012 03:42:16 GMT"
+        },
+        {
+          "expires": "Fri, 16 Nov 2012 15:58:54 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-msadid": "300089440.299934848"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:43 GMT"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-length": "514"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "3936"
+        },
+        {
+          "age": "1664"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:43 GMT"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 11:56:42 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 14:35:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "4646"
+        },
+        {
+          "age": "1653"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:43 GMT"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 02:42:24 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 17:14:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "14780"
+        },
+        {
+          "allow": "GET"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 04:45:54 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "41165"
+        },
+        {
+          "age": "1664"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:43 GMT"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 02:52:34 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 14:31:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "application/json; charset=utf-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "location": "http://m.adnxs.com/msftcookiehandler?t=1&c=MUID%3d39C1843BD7CB679E06238036D4CB670B"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:43 GMT"
+        },
+        {
+          "content-length": "13"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store, no-cache, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 15 Nov 2008 16:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.adnxs.com/w3c/policy/p3p.xml\", CP=\"NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE\""
+        },
+        {
+          "x-xss-protection": "0"
+        },
+        {
+          "set-cookie": "sess=1; path=/; expires=Sun, 04-Nov-2012 13:29:43 GMT; domain=.adnxs.com; HttpOnly"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:43 GMT"
+        },
+        {
+          "content-length": "43"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "7206"
+        },
+        {
+          "age": "1871"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:43 GMT"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 19:21:20 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 14:46:13 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "2833"
+        },
+        {
+          "age": "4319"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:43 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 01:22:37 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:57:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "4141"
+        },
+        {
+          "age": "1871"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:43 GMT"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 09:14:16 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 14:47:24 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, max-age=600"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:39:43 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "machine": "SN1********529"
+        },
+        {
+          "rendertime": "11/3/2012 6:29:43 AM"
+        },
+        {
+          "x-rendertime": "0.017 secs"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:43 GMT"
+        },
+        {
+          "content-length": "6790"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "7264"
+        },
+        {
+          "age": "4321"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:43 GMT"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 02:45:33 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:47:42 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, max-age=7776000"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "machine": "SN1********532"
+        },
+        {
+          "rendertime": "11/2/2012 8:14:13 AM"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "3083"
+        },
+        {
+          "age": "227101"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:44 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 22:24:43 GMT"
+        },
+        {
+          "expires": "Tue, 29 Jan 2013 22:24:43 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, max-age=7775989"
+        },
+        {
+          "content-type": "text/css; charset=utf-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "machine": "SN1********532"
+        },
+        {
+          "rendertime": "11/2/2012 8:14:13 AM"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "631"
+        },
+        {
+          "age": "227144"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:44 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 22:23:50 GMT"
+        },
+        {
+          "expires": "Tue, 29 Jan 2013 22:23:49 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "5366"
+        },
+        {
+          "age": "2169"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:44 GMT"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 23:46:05 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 14:23:35 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, max-age=7775981"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "5125"
+        },
+        {
+          "age": "227144"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:44 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 22:23:41 GMT"
+        },
+        {
+          "expires": "Tue, 29 Jan 2013 22:23:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "38544"
+        },
+        {
+          "age": "1664"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:44 GMT"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 02:46:18 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 14:32:00 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, max-age=7775962"
+        },
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "68447"
+        },
+        {
+          "age": "227086"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:44 GMT"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 22:24:21 GMT"
+        },
+        {
+          "expires": "Tue, 29 Jan 2013 22:24:20 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "machine": "SN1********525"
+        },
+        {
+          "rendertime": "11/3/2012 6:29:44 AM"
+        },
+        {
+          "x-rendertime": "0.003 secs"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:43 GMT"
+        },
+        {
+          "content-length": "1238"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "pragma": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "machine": "SN1********509"
+        },
+        {
+          "rendertime": "11/3/2012 6:29:44 AM"
+        },
+        {
+          "set-cookie": "zip=c:cz; domain=msn.com; expires=Sat, 10-Nov-2012 14:29:44 GMT; path=/"
+        },
+        {
+          "x-rendertime": "0.067 secs"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:44 GMT"
+        },
+        {
+          "content-length": "138"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "x-aspnetmvc-version": "4.0"
+        },
+        {
+          "x-ua-compatible": "IE=Edge;chrome=1"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:46 GMT"
+        },
+        {
+          "content-length": "25630"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 23:16:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"951751d2bdb7cd1:0\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-cache, proxy-revalidate, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 20 Oct 2011 10:27:58 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"04baaef128fcc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "set-cookie": "ANONCHK=0; domain=c.msn.com; expires=Tue, 06-Nov-2012 13:29:30 GMT; path=/;"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:47 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001001"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:47 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=422586"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "818"
+        },
+        {
+          "age": "321488"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:47 GMT"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 17:34:45 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "text/html; Charset=utf-8"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 19:29:28 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"01c35bc2fa3cd1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:47 GMT"
+        },
+        {
+          "content-length": "954"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "1996"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "x-radid": "P10723443-T100550693-C29000000000082620"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001005"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:47 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store, no-cache, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 15 Nov 2008 16:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.adnxs.com/w3c/policy/p3p.xml\", CP=\"NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE\""
+        },
+        {
+          "x-xss-protection": "0"
+        },
+        {
+          "set-cookie": "anj=Kfu=8fG68%Cxrx)0s]#%2L_'x%SEV/hnJPh4FQV_eKj?9AMF4:V)4hY/82QjU'-Rw1Ra^uI$+VZ; path=/; expires=Fri, 01-Feb-2013 13:29:47 GMT; domain=.adnxs.com; HttpOnly"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:47 GMT"
+        },
+        {
+          "content-length": "1463"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "ntcoent-length": "42"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "6:29:42 AM"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "trackingid": "3bd68bdc-1e91-410e-bd92-a85913c08914"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:47 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "54"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:47 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "application/json; charset=utf-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:47 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "must-revalidate"
+        },
+        {
+          "expires": "Mon, 05 Nov 2012 13:29:48 GMT"
+        },
+        {
+          "set-cookie": "fc=rqbE3Poup4Ofv8GxDEGHJ0T2mPet6qErhzJbX2aX0FVY8uK-xitYHevMNKV5qRPTQHHOFrDBExLyIrZ-jLRD_r3wc-cQ7FRKnITKYzO3zYV52dhK4dSErN9-EcLOAtq0; Domain=.turn.com; Expires=Thu, 02-May-2013 13:29:48 GMT; Path=/"
+        },
+        {
+          "content-type": "text/javascript;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:47 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "private, no-cache, no-store, must-revalidate"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:48 GMT"
+        },
+        {
+          "content-length": "4142"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "cache-control": "private, max-age=0, no-cache, no-store, must-revalidate, proxy-revalidate"
+        },
+        {
+          "expires": "Sat, 1 Jan 2000 01:01:00 GMT"
+        },
+        {
+          "last-modified": "Sat, 1 Jan 2000 01:01:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "AdifyServer"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "45"
+        },
+        {
+          "set-cookie": "s=1,2*50951c4c*3Q4liHxMwG*rZye1ewDYpnkdvSJkze6tOMY_w==*; path=/; expires=Mon, 03-Nov-2014 13:29:48 GMT; domain=afy11.net;"
+        },
+        {
+          "p3p": "policyref=\"http://ad.afy11.net/privacy.xml\", CP=\" NOI DSP NID ADMa DEVa PSAa PSDa OUR OTRa IND COM NAV STA OTC\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "cache-control": "no-store, no-cache, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 15 Nov 2008 16:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.adnxs.com/w3c/policy/p3p.xml\", CP=\"NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE\""
+        },
+        {
+          "x-xss-protection": "0"
+        },
+        {
+          "set-cookie": "sess=1; path=/; expires=Sun, 04-Nov-2012 13:29:49 GMT; domain=.adnxs.com; HttpOnly"
+        },
+        {
+          "location": "http://r.turn.com/r/bd?ddc=1&pid=54&cver=1&uid=3755642153863499992"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:49 GMT"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "content-type": "text/html; charset=ISO-8859-1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "GlassFish v3"
+        },
+        {
+          "p3p": "policyref=\"/bh/w3c/p3p.xml\", CP=\"NOI DSP COR NID CURa DEVa PSAa OUR BUS COM NAV INT\""
+        },
+        {
+          "set-cookie": "pb_rtb_ev=2-535461.3194305635051091579.0.0.1351949514647; Domain=.contextweb.com; Expires=Sun, 03-Nov-2013 13:31:54 GMT; Path=/"
+        },
+        {
+          "cw-server": "lga-app602"
+        },
+        {
+          "cache-control": "private, max-age=0, no-cache, no-store"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "content-type": "image/gif;charset=ISO-8859-1"
+        },
+        {
+          "content-language": "en-US"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:31:54 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "cache-control": "post-check=0, pre-check=0"
+        },
+        {
+          "content-location": "partner.html"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:49 GMT"
+        },
+        {
+          "expires": "Mon, 26 Jul 1997 05:00:00 GMT"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:29:49 GMT"
+        },
+        {
+          "location": "http://cdn.spotxchange.com/media/thumbs/pixel/pixel.gif"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR IND UNI COM NAV ADMa\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/0.9.8e-fips-rhel5"
+        },
+        {
+          "set-cookie": "partner-0=eNptzM0KgkAUQOF1vUvgzzCF0MJwkpGuF3WyGXcpBKOZLYLJ%2B%2FRJtGx7OHyc7fxVdOBsU4lSxifZiCQyaiJ8vAh7EaLNnNGZ1471rMOaGp3dmvTomUpuO5ocWmkxBA4q5nKsWZfeZ6PLZxswi8GwdAigh3dOwFB9Tf%2Bfeb0UP2fgcvlRFQTJOQA6u1wJh0r4OQ3L4%2B3XH6c7OqM%3D; expires=Sun, 03-Mar-2013 13:29:49 GMT; path=/; domain=.spotxchange.com"
+        },
+        {
+          "tcn": "choice"
+        },
+        {
+          "vary": "negotiate"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "location": "http://r.turn.com/r/cms/id/0/ddc/1/pid/18/uid/?google_gid=CAESEITR3tLElIgxNs25jzV8Md0&google_cver=1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:49 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "server": "Cookie Matcher"
+        },
+        {
+          "content-length": "300"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:49 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "cache-control": "public, max-age=30, proxy-revalidate"
+        },
+        {
+          "expires": "Mon, 26 Jul 1997 05:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "p3p": "CP=\"CUR ADM OUR NOR STA NID\""
+        },
+        {
+          "set-cookie": "i=cbdc52da-b3d4-4f79-bc70-3121d006fdfa; expires=Mon, 03-Nov-2014 13:29:49 GMT; path=/; domain=.openx.net"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:49 GMT"
+        },
+        {
+          "server": "Apache/2.2.3 (CentOS)"
+        },
+        {
+          "x-powered-by": "PHP/5.3.3"
+        },
+        {
+          "p3p": "CP=\"NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT\""
+        },
+        {
+          "set-cookie": "put_1185=3194305635051091579; expires=Wed, 02-Jan-2013 13:29:49 GMT; path=/; domain=.rubiconproject.com"
+        },
+        {
+          "content-length": "49"
+        },
+        {
+          "keep-alive": "timeout=30, max=9907"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:49 GMT"
+        },
+        {
+          "server": "Apache/2.2.22 (Ubuntu)"
+        },
+        {
+          "x-powered-by": "PHP/5.3.10-1ubuntu3.4"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "private, max-age=0, no-cache, max-age=86400, must-revalidate"
+        },
+        {
+          "p3p": "CP=\"CUR ADM OUR NOR STA NID\""
+        },
+        {
+          "set-cookie": "ljtrtb=eJyrVjJUslIyNrQ0MTYwNTM2NTA1NLA0NDW3VKoFAE9vBcg%3D; expires=Sun, 03-Nov-2013 13:29:49 GMT; path=/; domain=.lijit.com"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 13:29:49 GMT"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:48 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "uid=3194305635051091579; Domain=.turn.com; Expires=Thu, 02-May-2013 13:29:49 GMT; Path=/"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:49 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "uid=3194305635051091579; Domain=.turn.com; Expires=Thu, 02-May-2013 13:29:49 GMT; Path=/"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:49 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "uid=3194305635051091579; Domain=.turn.com; Expires=Thu, 02-May-2013 13:29:49 GMT; Path=/"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:49 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "adaptv/1.0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "set-cookie": "rtbData0=\"key=turn:value=3194305635051091579:expiresAt=Sat+Nov+10+05%3A29%3A49+PST+2012:32-Compatible=true\";Path=/;Domain=.adap.tv;Expires=Mon, 03-Nov-2014 13:29:49 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "W/\"21947-1351808321000\""
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 22:18:41 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "21947"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:48 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:49 GMT"
+        },
+        {
+          "server": "Apache/2.2.4 (Unix) DAV/2 mod_ssl/2.2.4 OpenSSL/0.9.7a mod_fastcgi/2.4.2"
+        },
+        {
+          "set-cookie": "PUBRETARGET=82_1446557389; domain=pubmatic.com; expires=Tue, 03-Nov-2015 13:29:49 GMT; path=/"
+        },
+        {
+          "content-length": "1"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC\""
+        },
+        {
+          "cache-control": "no-store, no-cache, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "text/html"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Thu, 26 May 2011 15:59:36 UTC"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "max-age=182357"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:50 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR DEVa TAIa OUR BUS UNI\""
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:29:50 GMT"
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:50 GMT"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "set-cookie": "CMDD=;domain=casalemedia.com;path=/;expires=Sun, 04 Nov 2012 13:29:50 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "p3p": "policyref=\"http://tag.admeld.com/w3c/p3p.xml\", CP=\"PSAo PSDo OUR SAM OTR BUS DSP ALL COR\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "expires": "Mon, 26 Jul 1997 05:00:00 GMT"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:50 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "none"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:50 GMT"
+        },
+        {
+          "expires": "Mon, 26 Jul 1997 05:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://files.adbrite.com/w3c/p3p.xml\",CP=\"NOI PSA PSD OUR IND UNI NAV DEM STA OTC\""
+        },
+        {
+          "server": "XPEHb/1.2"
+        },
+        {
+          "set-cookie": "rb2=CiQKBjc0MjY5Nxjxxt_6vwEiEzMxOTQzMDU2MzUwNTEwOTE1NzkQAQ; path=/; domain=.adbrite.com; expires=Fri, 01-Feb-2013 13:29:50 GMT"
+        },
+        {
+          "content-length": "59"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "none"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:50 GMT"
+        },
+        {
+          "expires": "Mon, 26 Jul 1997 05:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://files.adbrite.com/w3c/p3p.xml\",CP=\"NOI PSA PSD OUR IND UNI NAV DEM STA OTC\""
+        },
+        {
+          "server": "XPEHb/1.2"
+        },
+        {
+          "set-cookie": "rb2=CiUKBzExMTM4NzQY78bf-r8BIhMzMTk0MzA1NjM1MDUxMDkxNTc5EAE; path=/; domain=.adbrite.com; expires=Fri, 01-Feb-2013 13:29:50 GMT"
+        },
+        {
+          "content-length": "59"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "x-aspnetmvc-version": "4.0"
+        },
+        {
+          "x-ua-compatible": "IE=Edge;chrome=1"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:51 GMT"
+        },
+        {
+          "content-length": "24328"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 23:16:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"951751d2bdb7cd1:0\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"809c1885b2cd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-length": "7723"
+        },
+        {
+          "age": "717364"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:52 GMT"
+        },
+        {
+          "last-modified": "Wed, 24 Oct 2012 16:35:09 GMT"
+        },
+        {
+          "expires": "Sat, 26 Oct 2013 06:13:48 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"08343346b2cd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-length": "11495"
+        },
+        {
+          "age": "717363"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:52 GMT"
+        },
+        {
+          "last-modified": "Wed, 24 Oct 2012 16:39:58 GMT"
+        },
+        {
+          "expires": "Sat, 26 Oct 2013 06:13:49 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001003"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:51 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"4bbce916b2cd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-length": "10962"
+        },
+        {
+          "age": "717363"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:52 GMT"
+        },
+        {
+          "last-modified": "Wed, 24 Oct 2012 16:38:33 GMT"
+        },
+        {
+          "expires": "Sat, 26 Oct 2013 06:13:49 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-cache, proxy-revalidate, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 20 Oct 2011 10:27:58 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"04baaef128fcc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "set-cookie": "ANONCHK=0; domain=c.msn.com; expires=Tue, 06-Nov-2012 13:29:30 GMT; path=/;"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:52 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"cf3edfd75b2cd1:0\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-length": "2004"
+        },
+        {
+          "age": "717364"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:52 GMT"
+        },
+        {
+          "last-modified": "Wed, 24 Oct 2012 16:37:22 GMT"
+        },
+        {
+          "expires": "Sat, 26 Oct 2013 06:13:48 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "text/html; Charset=utf-8"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 19:29:28 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"01c35bc2fa3cd1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:52 GMT"
+        },
+        {
+          "content-length": "955"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "2008"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "x-radid": "P10723443-T100550693-C29000000000082620"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=309678"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "26369"
+        },
+        {
+          "age": "62302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:52 GMT"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 10:12:48 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001004"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:51 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=430622"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "45394"
+        },
+        {
+          "age": "62302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:52 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 19:48:32 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store, no-cache, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 15 Nov 2008 16:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.adnxs.com/w3c/policy/p3p.xml\", CP=\"NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE\""
+        },
+        {
+          "x-xss-protection": "0"
+        },
+        {
+          "set-cookie": "anj=Kfu=8fG5+^Cxrx)0s]#%2L_'x%SEV/hnK]14FQV_eKj?9AMF4:V)4hY/82QjU'-Rw1k^WD2#$i1)erK!!*m?S=+svq; path=/; expires=Fri, 01-Feb-2013 13:29:52 GMT; domain=.adnxs.com; HttpOnly"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:52 GMT"
+        },
+        {
+          "content-length": "1391"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "must-revalidate"
+        },
+        {
+          "expires": "Mon, 05 Nov 2012 13:29:52 GMT"
+        },
+        {
+          "set-cookie": "fc=PwF5GJAr9THO6EaVkyk6nl6s2gAVQMeB09yelt5Ns41Y8uK-xitYHevMNKV5qRPT6cGxTnB2KJjyGGqZV9P7973wc-cQ7FRKnITKYzO3zYV52dhK4dSErN9-EcLOAtq0; Domain=.turn.com; Expires=Thu, 02-May-2013 13:29:52 GMT; Path=/"
+        },
+        {
+          "content-type": "text/javascript;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:52 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "p3p": "CP=\"NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT\""
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "set-cookie": "p=1-dPmPP55J4f0S;Path=/;Domain=.rfihub.com"
+        },
+        {
+          "location": "http://ib.adnxs.com/pxj?bidder=18&seg=378601&action=setuids('672725195243299649','');&redir="
+        },
+        {
+          "content-length": "0"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store, no-cache, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 15 Nov 2008 16:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.adnxs.com/w3c/policy/p3p.xml\", CP=\"NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE\""
+        },
+        {
+          "x-xss-protection": "0"
+        },
+        {
+          "set-cookie": "anj=Kfu=8fG7DHCxrx)0s]#%2L_'x%SEV/hnK)x4FQV_eKj?9AMF4:V)4hY/82QjU'-Rw1k^WD2#$i1)erM67KPze!'cEZmBiRY; path=/; expires=Fri, 01-Feb-2013 13:29:52 GMT; domain=.adnxs.com; HttpOnly"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:52 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:52 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "application/json; charset=utf-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:52 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "private, no-cache, no-store, must-revalidate"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:52 GMT"
+        },
+        {
+          "content-length": "4142"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "uid=3194305635051091579; Domain=.turn.com; Expires=Thu, 02-May-2013 13:29:53 GMT; Path=/"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:53 GMT"
+        },
+        {
+          "location": "http://dpm.demdex.net/ibs:dpid=375&dpuuid=3194305635051091579"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "uid=3194305635051091579; Domain=.turn.com; Expires=Thu, 02-May-2013 13:29:53 GMT; Path=/"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:53 GMT"
+        },
+        {
+          "location": "http://tags.bluekai.com/site/4499?id=3194305635051091579"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "uid=3582991558377661871; Domain=.p-td.com; Expires=Thu, 02-May-2013 13:29:53 GMT; Path=/"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:53 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat,  03 Nov 2012 13:29:53 GMT"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "server": "AAWebServer"
+        },
+        {
+          "p3p": "policyref=\"http://www.adadvisor.net/w3c/p3p.xml\",CP=\"NOI NID\""
+        },
+        {
+          "content-length": "21"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "set-cookie": "ab=0001%3ATeN7H043oXvJ0Gd0I9Rzik4yxpbxTv3S; Domain=.adadvisor.net; Expires=Sat,  03 Nov 2013 13:29:53 GMT; Path=/"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT\""
+        },
+        {
+          "dcs": "la-dcs-3-1.internal.demdex.com 1.9.12"
+        },
+        {
+          "set-cookie": "demdex=24048888904140259620062165691276314735;Path=/;Domain=.demdex.net;Expires=Thu, 03-Nov-2022 23:37:33 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 2009 00:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "location": "http://dpm.demdex.net/demconf.jpg?et:ibs%7cdata:dpid=375&dpuuid=3194305635051091579"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "server": "Jetty(7.2.2.v20101205)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT\""
+        },
+        {
+          "dcs": "la-dcs-6-3.internal.demdex.com 1.9.12"
+        },
+        {
+          "set-cookie": "dpm=24048888904140259620062165691276314735;Path=/;Domain=.dpm.demdex.net;Expires=Thu, 03-Nov-2022 23:37:33 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 2009 00:00:00 GMT"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "sts": "OK"
+        },
+        {
+          "content-length": "308"
+        },
+        {
+          "server": "Jetty(7.2.2.v20101205)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "uid=3194305635051091579; Domain=.turn.com; Expires=Thu, 02-May-2013 13:29:53 GMT; Path=/"
+        },
+        {
+          "location": "http://segment-pixel.invitemedia.com/set_partner_uid?partnerID=402&sscs_active=1&partnerUID=3194305635051091579"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:53 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "uid=3194305635051091579; Domain=.turn.com; Expires=Thu, 02-May-2013 13:29:53 GMT; Path=/"
+        },
+        {
+          "location": "http://dpm.demdex.net/ibs:dpid=470&dpuuid=3194305635051091579"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:53 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT\""
+        },
+        {
+          "dcs": "la-dcs-6-4.internal.demdex.com 1.9.12"
+        },
+        {
+          "set-cookie": "dpm=24048888904140259620062165691276314735;Path=/;Domain=.dpm.demdex.net;Expires=Thu, 03-Nov-2022 23:37:33 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 2009 00:00:00 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "sts": "OK"
+        },
+        {
+          "content-length": "42"
+        },
+        {
+          "server": "Jetty(7.2.2.v20101205)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:53 GMT"
+        },
+        {
+          "set-cookie": "io_frequency=;Path=/;Domain=invitemedia.com;Expires=Thu, 01-Jan-1970 00:00:01 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"OTI DSP COR ADMo TAIo PSAo PSDo CONo OUR SAMo OTRo STP UNI PUR COM NAV INT DEM STA PRE LOC\""
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "location": "http://cm.g.doubleclick.net/pixel?google_nid=invitemedia&google_cm&google_hm=ZGdnc8YbR_itxPPM3K8lNw=="
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "server": "Jetty(7.3.1.v20110307)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "location": "http://g-pixel.invitemedia.com/gmatcher?google_gid=CAESEIZ7yBsa025UuJ5EUDIscrc&google_cver=1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "server": "Cookie Matcher"
+        },
+        {
+          "content-length": "293"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "set-cookie": "io_frequency=;Path=/;Domain=invitemedia.com;Expires=Thu, 01-Jan-1970 00:00:01 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"OTI DSP COR ADMo TAIo PSAo PSDo CONo OUR SAMo OTRo STP UNI PUR COM NAV INT DEM STA PRE LOC\""
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "server": "Jetty(7.3.1.v20110307)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "uid=3512552298351731296; Domain=.audienceiq.com; Expires=Thu, 02-May-2013 13:29:54 GMT; Path=/"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:53 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "uid=3819163497929337273; Domain=.audienceiq.com; Expires=Thu, 02-May-2013 13:29:54 GMT; Path=/"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "server": "Apache/2.2.3 (CentOS)"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR CUR ADMo DEVo PSAo PSDo OUR SAMo BUS UNI NAV\", policyref=\"http://tags.bluekai.com/w3c/p3p.xml\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store"
+        },
+        {
+          "set-cookie": "bkdc=wdc; expires=Mon, 03-Dec-2012 13:29:54 GMT; path=/; domain=.bluekai.com"
+        },
+        {
+          "bk-server": "f325"
+        },
+        {
+          "content-length": "62"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=430617"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "49975"
+        },
+        {
+          "age": "62304"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 19:48:27 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=402248"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "54206"
+        },
+        {
+          "age": "62304"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 11:55:38 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=404329"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "34129"
+        },
+        {
+          "age": "62304"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 12:30:19 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=430621"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "30171"
+        },
+        {
+          "age": "62303"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 19:48:32 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=424287"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "32018"
+        },
+        {
+          "age": "62303"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 18:02:58 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=427425"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "24185"
+        },
+        {
+          "age": "62303"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 18:55:16 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=272174"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "33943"
+        },
+        {
+          "age": "62303"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Mon, 05 Nov 2012 23:47:45 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=325871"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "52353"
+        },
+        {
+          "age": "62304"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 14:42:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=430158"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "29736"
+        },
+        {
+          "age": "62304"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 19:40:48 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=430924"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "16459"
+        },
+        {
+          "age": "62304"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 19:53:34 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=392023"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "16888"
+        },
+        {
+          "age": "62303"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 09:05:14 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=430621"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "39134"
+        },
+        {
+          "age": "62303"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 19:48:32 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=430616"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "18663"
+        },
+        {
+          "age": "62303"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 19:48:27 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=430616"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "22545"
+        },
+        {
+          "age": "62303"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 19:48:27 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=309680"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "48746"
+        },
+        {
+          "age": "62303"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 10:12:51 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=307453"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "32656"
+        },
+        {
+          "age": "62303"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 09:35:44 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431902"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "4473"
+        },
+        {
+          "age": "16748"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 08:49:08 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=429492"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "5239"
+        },
+        {
+          "age": "22750"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 06:28:56 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=426970"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "4784"
+        },
+        {
+          "age": "22751"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 05:46:53 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431944"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "3843"
+        },
+        {
+          "age": "50495"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 23:27:23 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431143"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "4058"
+        },
+        {
+          "age": "50541"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 23:13:16 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431761"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "3291"
+        },
+        {
+          "age": "84703"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 13:54:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=430621"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "34459"
+        },
+        {
+          "age": "62302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 19:48:33 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-cache, proxy-revalidate, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 20 Oct 2011 10:27:58 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"04baaef128fcc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "set-cookie": "ANONCHK=0; domain=c.msn.com; expires=Tue, 06-Nov-2012 13:29:30 GMT; path=/;"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:55 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "text/html; Charset=utf-8"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 19:29:28 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"01c35bc2fa3cd1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:55 GMT"
+        },
+        {
+          "content-length": "954"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "1996"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "x-radid": "P10723443-T100550693-C29000000000082620"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001006"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:55 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store, no-cache, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 15 Nov 2008 16:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.adnxs.com/w3c/policy/p3p.xml\", CP=\"NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE\""
+        },
+        {
+          "x-xss-protection": "0"
+        },
+        {
+          "set-cookie": "anj=Kfu=8fG4S]cvjr/?0P(*AuB-u**g1:XIFC`Ei'/AQwFYO^vhHR3SSI7:0ssX1ka!s@?zYs*/7]T1O`l^oQUpqMxHLk'kk[7/>IRq; path=/; expires=Fri, 01-Feb-2013 13:29:56 GMT; domain=.adnxs.com; HttpOnly"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:56 GMT"
+        },
+        {
+          "content-length": "1447"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "must-revalidate"
+        },
+        {
+          "expires": "Mon, 05 Nov 2012 13:29:56 GMT"
+        },
+        {
+          "set-cookie": "fc=2flUeaaDSas8xOI0IwXvS5DprXaL8T8Iioo9PyFO3fRY8uK-xitYHevMNKV5qRPT3ar07KU0y6i_uQzRwZVJBr3wc-cQ7FRKnITKYzO3zYV52dhK4dSErN9-EcLOAtq0; Domain=.turn.com; Expires=Thu, 02-May-2013 13:29:56 GMT; Path=/"
+        },
+        {
+          "content-type": "text/javascript;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:55 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001005"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:55 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001002"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:55 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=337125"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "47409"
+        },
+        {
+          "age": "62303"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 17:50:16 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:55 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html;charset=UTF-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "private, no-cache, no-store, must-revalidate"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:56 GMT"
+        },
+        {
+          "content-length": "4142"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=430158"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "40464"
+        },
+        {
+          "age": "62303"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:54 GMT"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 19:40:49 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "server": "Microsoft-IIS/7.0"
+        },
+        {
+          "p3p": "CP=\"NON DSP COR CURa PSA PSD OUR BUS NAV STA\""
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:55 GMT"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "vary": "Accept-Encoding"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-cache, proxy-revalidate, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 20 Oct 2011 10:27:58 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"04baaef128fcc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "set-cookie": "ANONCHK=0; domain=c.msn.com; expires=Tue, 06-Nov-2012 13:29:30 GMT; path=/;"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:56 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "text/html; Charset=utf-8"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 19:29:28 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"01c35bc2fa3cd1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:57 GMT"
+        },
+        {
+          "content-length": "1162"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "2685"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "x-radid": "P10661134-T100558395-C70000000000110100"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001005"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:57 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001004"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:56 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001005"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:57 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-length": "2346"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:57 GMT"
+        },
+        {
+          "location": "http://s0.2mdn.net/viewad/3642305/1-1x1.gif"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "DCLK-AdSvr"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "last-modified": "Tue, 08 May 2012 20:09:07 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 14:30:09 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 14:30:09 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "321"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "82788"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 24 May 2012 20:12:56 GMT"
+        },
+        {
+          "date": "Fri, 02 Nov 2012 20:51:00 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 20:51:00 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "16399"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "age": "59938"
+        },
+        {
+          "cache-control": "public, max-age=86400"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:57 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-cache, proxy-revalidate, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 20 Oct 2011 10:27:58 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"04baaef128fcc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "set-cookie": "ANONCHK=0; domain=c.msn.com; expires=Tue, 06-Nov-2012 13:29:30 GMT; path=/;"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:58 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "text/html; Charset=utf-8"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 19:29:28 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"01c35bc2fa3cd1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:59 GMT"
+        },
+        {
+          "content-length": "953"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "1996"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "x-radid": "P10723443-T100550693-C29000000000082620"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001006"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:58 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store, no-cache, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 15 Nov 2008 16:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.adnxs.com/w3c/policy/p3p.xml\", CP=\"NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE\""
+        },
+        {
+          "x-xss-protection": "0"
+        },
+        {
+          "set-cookie": "anj=Kfu=8fG2<rcvjr/?0P(*AuB-u**g1:XIB_LEi'/AQwFYO^vhHR3SSI7:0ssX1dkoAOc['^!Xu%1Q*<TAN0EGDS>RnOx8gy:7tmWz0W/8y; path=/; expires=Fri, 01-Feb-2013 13:29:59 GMT; domain=.adnxs.com; HttpOnly"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:59 GMT"
+        },
+        {
+          "content-length": "539"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001005"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:58 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001003"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:59 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-msadid": "300089440.299934848"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:58 GMT"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-length": "508"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "uid=3194305635051091579; Domain=.turn.com; Expires=Thu, 02-May-2013 13:29:59 GMT; Path=/"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:58 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:59 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-cache, proxy-revalidate, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 20 Oct 2011 10:27:58 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"04baaef128fcc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "set-cookie": "ANONCHK=0; domain=c.msn.com; expires=Tue, 06-Nov-2012 13:29:30 GMT; path=/;"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:00 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "text/html; Charset=utf-8"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 19:29:28 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"01c35bc2fa3cd1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:59 GMT"
+        },
+        {
+          "content-length": "954"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "2008"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "x-radid": "P10723443-T100550693-C29000000000082620"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001005"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:59 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001004"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:59 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001001"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:00 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store, no-cache, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 15 Nov 2008 16:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.adnxs.com/w3c/policy/p3p.xml\", CP=\"NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE\""
+        },
+        {
+          "x-xss-protection": "0"
+        },
+        {
+          "set-cookie": "anj=Kfu=8fG6kGcvjr/?0P(*AuB-u**g1:XIDv6Ei'/AQwFYO^vhHR3SSI7:0ssX1dl0I/A@=2rt>+)p4?5?fIu<PZksk:x)IOr/*M`m)sza^*g0Y08QVgH; path=/; expires=Fri, 01-Feb-2013 13:30:00 GMT; domain=.adnxs.com; HttpOnly"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:00 GMT"
+        },
+        {
+          "content-length": "536"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-msadid": "300089389.300024911"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:29:59 GMT"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-length": "2292"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:00 GMT"
+        },
+        {
+          "set-cookie": "io_frequency=;Path=/;Domain=invitemedia.com;Expires=Thu, 01-Jan-1970 00:00:01 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"OTI DSP COR ADMo TAIo PSAo PSDo CONo OUR SAMo OTRo STP UNI PUR COM NAV INT DEM STA PRE LOC\""
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "server": "Jetty(7.3.1.v20110307)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:00 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-cache, proxy-revalidate, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 20 Oct 2011 10:27:58 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"04baaef128fcc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "set-cookie": "ANONCHK=0; domain=c.msn.com; expires=Tue, 06-Nov-2012 13:29:30 GMT; path=/;"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:01 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "text/html; Charset=utf-8"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 19:29:28 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"01c35bc2fa3cd1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:02 GMT"
+        },
+        {
+          "content-length": "954"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "2008"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "x-radid": "P10723443-T100550693-C29000000000082620"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001006"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:01 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001001"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:01 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001004"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:01 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store, no-cache, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 15 Nov 2008 16:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.adnxs.com/w3c/policy/p3p.xml\", CP=\"NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE\""
+        },
+        {
+          "x-xss-protection": "0"
+        },
+        {
+          "set-cookie": "anj=Kfu=8fG10Qcvjr/?0P(*AuB-u**g1:XICjmEi'/AQwFYO^vhHR3SSI7:0ssX1dl0I/A@=2rt>+)p4?5?fIu<PZksk:8=1cxYEkOC%bAiN80044UhHvz!%M]c5$rYZ; path=/; expires=Fri, 01-Feb-2013 13:30:02 GMT; domain=.adnxs.com; HttpOnly"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:02 GMT"
+        },
+        {
+          "content-length": "555"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:02 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "mt2/2.6.2.2465 Sep 24 2012 22:21:34 ewr-pixel-x1 pid 0x7b39 31545"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA\""
+        },
+        {
+          "set-cookie": "uuid=50951c5a-a617-32b8-be76-b1fea84d696f; domain=.mathtag.com; path=/; expires=Sun, 03-Nov-2013 13:30:02 GMT"
+        },
+        {
+          "location": "http://sync.mathtag.com/sync/img?mt_exid=13&mt_exuid=3755642153863499992&mm_bnc"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-msadid": "300088980.299949017.299886085"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:01 GMT"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-length": "2684"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "33683"
+        },
+        {
+          "allow": "GET"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 04:46:52 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:02 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:02 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "server": "mt2/2.6.2.2465 Sep 24 2012 22:21:34 ewr-pixel-x6 pid 0x3dc6 15814"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA\""
+        },
+        {
+          "set-cookie": "mt_mop=13:1351949402|10002:1351949402; domain=.mathtag.com; path=/; expires=Mon, 03-Dec-2012 13:30:02 GMT"
+        },
+        {
+          "location": "http://tags.bluekai.com/site/2948?id=50951c5a-a617-32b8-be76-b1fea84d696f"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:02 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:02 GMT"
+        },
+        {
+          "server": "Apache/2.2.3 (CentOS)"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR CUR ADMo DEVo PSAo PSDo OUR SAMo BUS UNI NAV\", policyref=\"http://tags.bluekai.com/w3c/p3p.xml\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 13:30:02 GMT"
+        },
+        {
+          "cache-control": "max-age=86400, private"
+        },
+        {
+          "set-cookie": "bkdc=wdc; expires=Mon, 03-Dec-2012 13:30:02 GMT; path=/; domain=.bluekai.com"
+        },
+        {
+          "bk-server": "ed3c"
+        },
+        {
+          "content-length": "62"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-cache, proxy-revalidate, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 20 Oct 2011 10:27:58 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"04baaef128fcc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "set-cookie": "ANONCHK=0; domain=c.msn.com; expires=Tue, 06-Nov-2012 13:29:30 GMT; path=/;"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:02 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001005"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:02 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001003"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:03 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001001"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:02 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:03 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "1996"
+        },
+        {
+          "content-type": "text/html; Charset=utf-8"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-radid": "P10723443-T100550693-C29000000000082620"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:03 GMT"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "954"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store, no-cache, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 15 Nov 2008 16:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.adnxs.com/w3c/policy/p3p.xml\", CP=\"NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE\""
+        },
+        {
+          "x-xss-protection": "0"
+        },
+        {
+          "set-cookie": "anj=Kfu=8fG5`$cvjr/?0P(*AuB-u**g1:XIF)WEi'/AQwFYO^vhHR3SSI7:0ssX1dl0I/A@=2rt>+)p4?5?fIu<PZksk:8=1cxY3czU+5<.*N0EGE.[oe!wqakQLnSHY42'_N; path=/; expires=Fri, 01-Feb-2013 13:30:03 GMT; domain=.adnxs.com; HttpOnly"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:03 GMT"
+        },
+        {
+          "content-length": "534"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-msadid": "300089440.299934848"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:03 GMT"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-length": "509"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT\""
+        },
+        {
+          "dcs": "la-dcs-4-2.internal.demdex.com 1.9.12"
+        },
+        {
+          "set-cookie": "dpm=24048888904140259620062165691276314735;Path=/;Domain=.dpm.demdex.net;Expires=Thu, 03-Nov-2022 23:37:33 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 2009 00:00:00 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "sts": "OK"
+        },
+        {
+          "content-length": "42"
+        },
+        {
+          "server": "Jetty(7.2.2.v20101205)"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "server": "Microsoft-IIS/8.0"
+        },
+        {
+          "x-aspnetmvc-version": "4.0"
+        },
+        {
+          "x-ua-compatible": "IE=Edge;chrome=1"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-frame-options": "SAMEORIGIN"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:04 GMT"
+        },
+        {
+          "content-length": "26996"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 23:16:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"951751d2bdb7cd1:0\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "private, no-cache, proxy-revalidate, no-store"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "last-modified": "Thu, 20 Oct 2011 10:27:58 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"04baaef128fcc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "set-cookie": "ANONCHK=0; domain=c.msn.com; expires=Tue, 06-Nov-2012 13:29:30 GMT; path=/;"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:05 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001005"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:04 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, must-revalidate"
+        },
+        {
+          "content-type": "text/html; Charset=utf-8"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 19:29:28 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"01c35bc2fa3cd1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:05 GMT"
+        },
+        {
+          "content-length": "954"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "2008"
+        },
+        {
+          "expires": "Fri, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "x-radid": "P10723443-T100550693-C29000000000082620"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=426988"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "27953"
+        },
+        {
+          "age": "303593"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:05 GMT"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 23:46:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=416068"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "42814"
+        },
+        {
+          "age": "303593"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:05 GMT"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 20:44:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache, no-store, must-revalidate"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "last-modified": "Mon, 18 Jul 2011 19:03:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "etag": "\"a29327667d45cc1:0\""
+        },
+        {
+          "server": "Microsoft-IIS/7.5"
+        },
+        {
+          "s": "VIEMSNVM001002"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:05 GMT"
+        },
+        {
+          "content-length": "42"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store, no-cache, private"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Sat, 15 Nov 2008 16:00:00 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.adnxs.com/w3c/policy/p3p.xml\", CP=\"NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE\""
+        },
+        {
+          "x-xss-protection": "0"
+        },
+        {
+          "set-cookie": "anj=Kfu=8fG3H<cvjr/?0P(*AuB-u**g1:XIC8]Ei'/AQwFYO^vhHR3SSI7:0ssX1dl0I/A@=2rt>+)p4?5?fIu<PZksk:^@W+Nwgwmo%ACvi+5<.*N0Iu+9Y'W#w3TL$v$Kfc5PKO+; path=/; expires=Fri, 01-Feb-2013 13:30:05 GMT; domain=.adnxs.com; HttpOnly"
+        },
+        {
+          "content-type": "text/html; charset=utf-8"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:05 GMT"
+        },
+        {
+          "content-length": "607"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:06 GMT"
+        },
+        {
+          "server": "Jetty(6.1.22)"
+        },
+        {
+          "set-cookie": "wfivefivec=8293faeb-8917-4006-95bc-2d52d4cd2f6d;Path=/;Domain=.w55c.net;Expires=Mon, 03-Nov-14 13:30:06 GMT"
+        },
+        {
+          "p3p": "policyref=\"https://cts.w55c.net/ct/p3p_policy_ref.xml\", CP=\"UNI PUR COM INT STA OTC STP OUR CUR TAIo COR DSP NOI\""
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "x-powered-by": "Mirror Image Internet"
+        },
+        {
+          "content-length": "42"
+        },
+        {
+          "via": "1.1 ttn061005 (MII-APC/2.2)"
+        },
+        {
+          "keep-alive": "timeout=2"
+        },
+        {
+          "connection": "Keep-Alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-store"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "0"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-msadid": "300089440.299934848"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:05 GMT"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-length": "511"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "application/json; charset=utf-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:05 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:05 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Mon, 01 Jan 1990 00:00:00 GMT"
+        },
+        {
+          "cache-control": "private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate"
+        },
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=418020"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "41311"
+        },
+        {
+          "age": "303593"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:06 GMT"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 21:17:13 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=426681"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "47495"
+        },
+        {
+          "age": "303593"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:06 GMT"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 23:41:34 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431985"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA08"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA08"
+        },
+        {
+          "content-length": "26998"
+        },
+        {
+          "age": "385360"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:06 GMT"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 02:27:11 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431851"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA06"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA06"
+        },
+        {
+          "content-length": "27541"
+        },
+        {
+          "age": "327876"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:06 GMT"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 18:23:01 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431570"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "40200"
+        },
+        {
+          "age": "303592"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:06 GMT"
+        },
+        {
+          "expires": "Mon, 05 Nov 2012 01:03:04 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=426988"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "31967"
+        },
+        {
+          "age": "303593"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:06 GMT"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 23:46:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431525"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "45843"
+        },
+        {
+          "age": "303592"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:06 GMT"
+        },
+        {
+          "expires": "Mon, 05 Nov 2012 01:02:19 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=431595"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA07"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA07"
+        },
+        {
+          "content-length": "41590"
+        },
+        {
+          "age": "303593"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:06 GMT"
+        },
+        {
+          "expires": "Mon, 05 Nov 2012 01:03:28 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "public, must-revalidate, proxy-revalidate, max-age=426365"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "server": "CO1MPPSTCA05"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "p3p": "CP=\"BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo\""
+        },
+        {
+          "s": "CO1MPPSTCA05"
+        },
+        {
+          "content-length": "46706"
+        },
+        {
+          "age": "303593"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:30:06 GMT"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 23:36:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_30.json b/jetty-http2/http2-hpack/src/test/resources/data/story_30.json
new file mode 100644
index 0000000..6ecb39d
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_30.json
@@ -0,0 +1,28257 @@
+{
+  "context": "response",
+  "cases": [
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:05 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "location": "http://www.nytimes.com/"
+        },
+        {
+          "content-length": "207"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "text/html; charset=iso-8859-1"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:05 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR BUS OTC\""
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "content-length": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-type": "text/plain; charset=utf-8"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:05 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR BUS OTC\""
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "content-length": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-type": "text/plain; charset=utf-8"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 02 Oct 2012 23:33:57 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1054"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=242"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:43:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "915"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=75412"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 10:35:58 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:15 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "563"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=75368"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 10:35:14 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Thu, 11 Oct 2012 13:17:50 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "5433"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=71334"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:28:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 02 Oct 2012 23:33:51 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "11190"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=255"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:43:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:01:02 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "414"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=124"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:10 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 00:30:38 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1460"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=141"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:27 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "593"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=75423"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 10:36:09 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 00:30:43 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "14014"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=181"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:42:07 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 11 Oct 2012 13:32:22 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2864"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=71377"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:28:43 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 14 May 2010 15:09:30 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1204"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=41140"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 01:04:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 14 Sep 2011 21:26:27 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1330"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=249513"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 10:57:39 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Thu, 28 Jun 2012 19:00:53 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "1261"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=249513"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 10:57:39 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 01 Mar 2012 17:13:25 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "33140"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=121"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:07 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 14 May 2010 14:49:17 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "75"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=348760"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:31:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "769"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=63729"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:21:15 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 24 Oct 2012 22:07:11 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2335"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=501801"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 09:02:27 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 05 Jun 2012 14:20:01 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5065"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=139006"
+        },
+        {
+          "expires": "Mon, 05 Nov 2012 04:15:52 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 18:30:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9619"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=449914"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 18:37:40 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 22:09:43 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9453"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=463322"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 22:21:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:05 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "RMID=007f010022166047bee9002b; Expires=Sun, 03 Nov 2013 13:39:05 GMT; Path=/; Domain=.nytimes.com;"
+        },
+        {
+          "set-cookie": "adxcs=-; path=/; domain=.nytimes.com"
+        },
+        {
+          "vary": "Host"
+        },
+        {
+          "cteonnt-length": "174626"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 20:52:54 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "10651"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=548063"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 21:53:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 00:08:29 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9713"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=481042"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 03:16:28 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 13 Sep 2012 21:58:15 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "13397"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=50108"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 03:34:14 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 14:25:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "10596"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=43276"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 01:40:22 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 13 Sep 2012 21:58:23 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "857"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=50108"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 03:34:14 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 22:20:31 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "23526"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=60"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:40:06 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 19:26:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "9473"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=551938"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 22:58:04 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 20:54:29 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5048"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=63748"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:21:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 14 May 2010 14:49:17 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3428"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=348719"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:31:05 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 22:24:49 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9374"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=550656"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 22:36:42 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 01:15:10 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9656"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=561534"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 01:38:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 00:27:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "10211"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=564327"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 02:24:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 02:03:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9722"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568295"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:30:41 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 23:51:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9372"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=555580"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 23:58:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 17:14:51 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "22786"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=559540"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 01:04:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 01:28:33 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9942"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=564328"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 02:24:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 02:54:41 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9364"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568578"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:35:24 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 06:09:08 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "9404"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=578228"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 06:16:14 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 22:38:39 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "10217"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=478523"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 02:34:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 01:19:31 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9052"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568307"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:30:53 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 23:00:45 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9379"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=553121"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 23:17:47 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 19:02:49 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9989"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=538058"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 19:06:44 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 22:36:19 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "10950"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=531474"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 17:17:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 16:22:38 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "11381"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=529651"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 16:46:37 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 18:00:09 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "10322"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=534703"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 18:10:49 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 17:11:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "22643"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=537513"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 18:57:39 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 20:59:51 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8617"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=459081"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 21:10:27 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 19:29:35 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "10164"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=539911"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 19:37:37 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 05:22:48 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "9476"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=488920"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 05:27:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 22:29:10 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9077"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=551868"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 22:56:54 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 17:43:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "10600"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=540450"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 19:46:36 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 20:32:14 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9896"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=547139"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 21:38:05 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 14 May 2010 15:09:31 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "572"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=41141"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 01:04:47 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Tue, 28 Apr 2009 18:18:22 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "404"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=41148"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 01:04:54 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 14 Sep 2012 11:12:29 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2845"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=63810"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:22:36 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 13 Sep 2012 16:49:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3246"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=64066"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:26:52 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 22:45:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "18527"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=51883"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 04:03:49 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:01 GMT"
+        },
+        {
+          "p3p": "CP=\"IDC DSP COR DEVa TAIa OUR BUS UNI\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "nginx/0.7.59"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:21 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "402"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=61804"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 06:49:10 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:53 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "1108"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=33319"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 22:54:25 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Fri, 14 May 2010 14:50:23 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "3113"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=250845"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 11:19:51 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "132"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=82000"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 12:25:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "130"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=44124"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 01:54:30 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 12:22:59 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2027"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=141"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:27 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:04 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5636"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=39613"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 00:39:19 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 02:57:18 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "9333"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=592839"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 10:19:45 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 04:04:47 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "12380"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=574165"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 05:08:31 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 03:51:38 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "14526"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=574163"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 05:08:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 09:37:18 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "27338"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=592839"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 10:19:45 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 03:21:08 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "17678"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=574163"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 05:08:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:53 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "15086"
+        },
+        {
+          "content-type": "image/x-icon"
+        },
+        {
+          "cache-control": "private, max-age=47723"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 02:54:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 15 Oct 2012 20:38:16 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "14119"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=38721"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 00:24:27 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 11 Oct 2012 22:23:31 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "15038"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=77030"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 11:02:56 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:23 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "15051"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=39616"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 00:39:22 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 03:52:36 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "9914"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=574165"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 05:08:31 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 04:26:29 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "13388"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=574135"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 05:08:01 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 20:54:43 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=45924"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 02:24:30 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:06 GMT"
+        },
+        {
+          "content-length": "73046"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=39601"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 00:39:16 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:15 GMT"
+        },
+        {
+          "content-length": "1713"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 21:26:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "1246"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=45118"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 02:11:13 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:15 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:23 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9877"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=39601"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 00:39:16 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:15 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "328"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=63772"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:22:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:16 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:16 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:01 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "nginx/1.0.0"
+        },
+        {
+          "set-cookie": "nyt-m=0F8E3E619FFB422270FEEB659AA60437&e=i.1354338000&t=i.10&v=i.0&l=l.25.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1&n=i.2&g=i.0&er=i.1351949956&vr=l.4.0.0.0.0&pr=l.4.1.0.0.0&vp=i.0&gf=l.10.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1; expires=Thu, 02-Nov-2017 13:39:16 GMT; path=/; domain=.nytimes.com"
+        },
+        {
+          "content-length": "114"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "424"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=81965"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 12:25:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:16 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "504"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=81965"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 12:25:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:16 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Fri, 25 Mar 2011 19:37:16 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "68"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=1088067"
+        },
+        {
+          "expires": "Fri, 16 Nov 2012 03:53:44 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Fri, 25 Mar 2011 19:37:16 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "3422"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=279280"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 19:13:56 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:16 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "nncoection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "368"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=82007"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 12:26:04 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=39602"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 00:39:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:16 GMT"
+        },
+        {
+          "content-length": "8728"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 20:48:58 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "7020"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=39602"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 00:39:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:16 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 14 May 2010 14:49:17 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "193"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=349609"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:46:06 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 14 May 2010 15:30:45 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "193"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=349609"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:46:06 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 27 Feb 2010 03:33:33 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "192"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=349609"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:46:06 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 14 May 2010 14:49:17 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "192"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=349609"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:46:06 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:50:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "35113"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=592829"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 10:19:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:48:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "29467"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=592829"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 10:19:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:51:50 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "16823"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=592829"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 10:19:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "550"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=82007"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 12:26:04 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:52:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "16912"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=592829"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 10:19:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:49:19 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "25024"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=592829"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 10:19:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:49:48 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "24454"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=592829"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 10:19:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:50:15 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "30450"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=592829"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 10:19:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:51:23 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "19300"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=592829"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 10:19:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 12:34:42 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "10032"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=536866"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 18:47:03 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 03:00:09 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "9307"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=566721"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:04:38 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 04:58:40 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9354"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=573743"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 05:01:40 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 08 Jun 2012 19:24:51 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "49"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=349611"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:46:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR BUS OTC\""
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "4654"
+        },
+        {
+          "set-cookie": "PRpc=|HwqgHD3W:1|HrYwHDG0:1|HrYvHDG1:2|#;domain=ads.pointroll.com; path=/; expires=Mon, 03-Nov-2014 13:39:17 GMT;"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "186"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=72083"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:40:40 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "46"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=45062"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 02:10:19 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:53 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "188"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=80765"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 12:05:22 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:53 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "74"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=45140"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 02:11:37 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "cache-control": "max-age=1200"
+        },
+        {
+          "etag": "\"4c3fb0afe8567a750ed2a0ea49e6944fba16bf00\""
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-served-by": "apiservices-a004.krxd.net"
+        },
+        {
+          "x-request-backend": "controltag"
+        },
+        {
+          "x-config-age": "400"
+        },
+        {
+          "x-cache-hits": "103"
+        },
+        {
+          "x-age": "377"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "content-length": "26341"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:53 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "64"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=49385"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 03:22:22 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 05 Oct 2012 17:38:31 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2153"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=35030"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 23:23:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "159"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "5623"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 21:27:49 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=82032"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 12:26:28 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:16 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Tue, 01 Mar 2011 22:54:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "2078"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=279283"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 19:14:01 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "nncoection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Thu, 03 Mar 2011 19:32:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "593"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=279282"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 19:14:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "nncoection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Thu, 03 Mar 2011 19:32:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "1062"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=279282"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 19:14:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "nncoection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Thu, 03 Mar 2011 19:32:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "830"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=279285"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 19:14:03 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "nncoection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 14 Nov 2011 19:12:50 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1230"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=310332"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 03:51:30 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "46"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=49385"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 03:22:23 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "nncoection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Thu, 03 Mar 2011 19:32:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "319"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=279282"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 19:14:00 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "uid=3582991558377661871; Domain=.p-td.com; Expires=Thu, 02-May-2013 13:39:18 GMT; Path=/"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "content-length": "65"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "cache-control": "no-cache"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1968"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=39604"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 00:39:22 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "rts_AAAA=MLs37lVrcF5/ZLq6rynLbPIrYKIQNSvBay5eXmklcaqTTiLoOeuQVXo/ErioUh8fUwMfecUglqHQguFB4PZbqjfC/R139oOkeO9km0JPhPmAlXHZdbK2WUEIbFJNiFPRmQDogdoIloef2Ff8AdiQTdLWj97qwBkClC8B/JlbaEoMNL360/5sp2oAT08Y; Domain=.revsci.net; Expires=Sun, 03-Nov-2013 13:39:18 GMT; Path=/"
+        },
+        {
+          "x-proc-data": "pd3-bgas02-12"
+        },
+        {
+          "p3p": "policyref=\"http://js.revsci.net/w3c/rsip3p.xml\", CP=\"NON PSA PSD IVA IVD OTP SAM IND UNI PUR COM NAV INT DEM CNT STA PRE OTC HEA\""
+        },
+        {
+          "server": "RSI"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "content-type": "application/javascript;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:19 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR BUS OTC\""
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "content-length": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-type": "text/plain; charset=utf-8"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=39604"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 00:39:22 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        },
+        {
+          "content-length": "11292"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "x-amz-id-2": "DlMsa95OAPS0ALn9DdiKGfdHovCM2TvJb0VQCd4x9FF44D35U9YbOWNnUKKYQL89"
+        },
+        {
+          "x-amz-request-id": "8987CB21B2CF98CC"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:20 GMT"
+        },
+        {
+          "cache-control": "max-age=10"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:35:29 GMT"
+        },
+        {
+          "etag": "\"8254326a395317db7b197564fa83e476\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": ""
+        },
+        {
+          "content-length": "92155"
+        },
+        {
+          "server": "AmazonS3"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=39603"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 00:39:22 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:19 GMT"
+        },
+        {
+          "content-length": "645"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "6174"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=39603"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 00:39:22 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:19 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "303"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:19 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "location": "/dcsa5pgfq10000c9zuysqk0lm_6i8y/dcs.gif?dcsredirect=126&dcstlh=0&dcstlv=0&dcsdat=1351949959619&dcssip=www.nytimes.com&dcsuri=/&WT.co_f=130.129.68.73-2680109824.30259656&WT.vt_sid=130.129.68.73-2680109824.30259656.1351949959620&WT.vt_f_tlv=0&WT.tz=-4&WT.bh=9&WT.ul=en-US&WT.cd=24&WT.sr=1366x768&WT.jo=Yes&WT.ti=The%20New%20York%20Times%20-%20Breaking%20News,%20World%20News%20%26%20Multimedia&WT.js=Yes&WT.jv=1.7&WT.ct=unknown&WT.bs=994x649&WT.fi=No&WT.tv=1.0.7&WT.dl=0&WT.es=www.nytimes.com/&WT.z_fbc=&WT.cg_n=Homepage&WT.z_rcgn=Homepage&WT.z_gpt=Homepage&WT.z_nyts=&WT.z_nytd=&WT.z_rmid=007f010022166047bee9002b&WT.rv=0&WT.mc_ev=&WT.vt_f_tlh=0&WT.vt_f_d=1&WT.vt_f_s=1&WT.vt_f_a=1&WT.vt_f=1"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "set-cookie": "ACOOKIE=C8ctADEzMC4xMjkuNjguNzMtMjY4MDEwOTgyNC4zMDI1OTY1NgAAAAAAAAABAAAAmLwAAIcelVCHHpVQAQAAAHhHAACHHpVQhx6VUAAAAAA-; path=/; expires=Thu, 10-Dec-2015 10:27:34 GMT"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR NID ADM DEV PSA OUR IND UNI PUR COM NAV INT STA\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:19 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "set-cookie": "ACOOKIE=C8ctADEzMC4xMjkuNjguNzMtMjY4MDEwOTgyNC4zMDI1OTY1NgAAAAAAAAABAAAAmLwAAIcelVCHHpVQAQAAAHhHAACHHpVQhx6VUAAAAAA-; path=/; expires=Mon, 03-Nov-2014 13:39:19 GMT"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR NID ADM DEV PSA OUR IND UNI PUR COM NAV INT STA\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "67"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Mon, 27 Aug 2012 21:22:08 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "430"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=45030"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 02:09:49 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:19 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 21:27:48 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1103"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=82037"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 12:26:36 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:19 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "1766"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=45133"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 02:11:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:19 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "etag": "\"15850e53f035443e5db6f28f75a9c1ac:1351623427\""
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 18:57:04 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "max-age=1200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        },
+        {
+          "content-length": "17391"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "public, max-age=600"
+        },
+        {
+          "content-type": "text/javascript;charset=utf-8"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:18 GMT"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:31:16 GMT"
+        },
+        {
+          "server": "ECS (lhr/4BD8)"
+        },
+        {
+          "status": "200 OK"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-cache": "HIT"
+        },
+        {
+          "content-length": "9879"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:22 GMT"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 13:39:22 GMT"
+        },
+        {
+          "last-modified": "Tue, 31 Jul 2012 23:02:57 GMT"
+        },
+        {
+          "server": "ECS (lhr/4BF1)"
+        },
+        {
+          "x-cache": "HIT"
+        },
+        {
+          "content-length": "35"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "etag": "\"f523ab9a498518867f12ca24f39ed087:1310577714\""
+        },
+        {
+          "last-modified": "Wed, 13 Jul 2011 17:10:50 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "cache-control": "max-age=1200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:21 GMT"
+        },
+        {
+          "content-length": "14202"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=0"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:24 GMT"
+        },
+        {
+          "etag": "\"894881535586350a54ec0f6e94779ee35c2169bd\""
+        },
+        {
+          "x-age": "0"
+        },
+        {
+          "x-cache": "MISS"
+        },
+        {
+          "x-cache-hits": "0"
+        },
+        {
+          "x-kuid": "IAJ5Qqdp"
+        },
+        {
+          "x-request-backend": "user_data"
+        },
+        {
+          "x-served-by": "apiservices-a002.krxd.net"
+        },
+        {
+          "content-length": "100"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "cache-control": "private, no-cache, no-store"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:24 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.krxd.net/kruxcontent/p3p.xml\", CP=\"NON DSP COR NID OUR DEL SAM OTR UNR COM NAV INT DEM CNT STA PRE LOC OTC\""
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "set-cookie": "_kuid_=IAJ5QtWI; path=/; expires=Thu, 02-May-13 13:39:24 GMT; domain=.krxd.net"
+        },
+        {
+          "x-request-time": "D=250 t=1351949964465812"
+        },
+        {
+          "x-served-by": "beacon-a002.krxd.net"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:25 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR BUS OTC\""
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "content-length": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-type": "text/plain; charset=utf-8"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "public, max-age=604800"
+        },
+        {
+          "content-type": "text/css;charset=utf-8"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:21 GMT"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 10:41:53 GMT"
+        },
+        {
+          "server": "ECS (lhr/4B9B)"
+        },
+        {
+          "status": "200 OK"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-cache": "HIT"
+        },
+        {
+          "content-length": "54615"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "131"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=63879"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:24:07 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:28 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "130"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=41854"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 01:17:02 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:28 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "set-cookie": "ACOOKIE=C8ctADEzMC4xMjkuNjguNzMtMjY4MDEwOTgyNC4zMDI1OTY1NgAAAAAAAAABAAAAmLwAAJEelVCHHpVQAQAAAHhHAACRHpVQhx6VUAAAAAA-; path=/; expires=Mon, 03-Nov-2014 13:39:29 GMT"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR NID ADM DEV PSA OUR IND UNI PUR COM NAV INT STA\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "67"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "303"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "content-type": "text/plain"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "vary": "Host"
+        },
+        {
+          "location": "http://www.nytimes.com/glogin?URI=http://www.nytimes.com/2012/11/03/us/pennsylvania-omitted-poison-data-in-water-report.html&OQ=hpQ26_rQ3D0&OP=36bee93bQ2FQ27NgQ3FQ27zwQ3FQ27nnnQ27vQ3FoJQ27!N)ujNNQ3FQ2FQ27Q2FQ60Q22Q2FQ27Q22Q22Q27Q60Q20Q27TuQ27gSzzuwJEQ24zCQ240NoCQ3FQ3FS!0gNCuNz0!Q24Q3FQ240Cz0nQ24Q3FSj0jSgNjQ3FQ3AvQ3FoJ"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "302"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "set-cookie": "NYT-S=0MdTeGr8L1EDLDXrmvxADeHzL3eTxUhvw7deFz9JchiAIUFL2BEX5FWcV.Ynx4rkFI; expires=Mon, 03-Dec-2012 13:39:29 GMT; path=/; domain=.nytimes.com"
+        },
+        {
+          "location": "http://www.nytimes.com/2012/11/03/us/pennsylvania-omitted-poison-data-in-water-report.html?hp&_r=0"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "495"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=72064"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:40:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "539"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=30984"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 22:15:53 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "777"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=70943"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:21:52 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "172"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=55043"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 04:56:52 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 21:27:04 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "7026"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=67908"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:31:17 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "set-cookie": "NYT-S=0MdTeGr8L1EDLDXrmvxADeHzL3eTxUhvw7deFz9JchiAIUFL2BEX5FWcV.Ynx4rkFI; expires=Mon, 03-Dec-2012 13:39:29 GMT; path=/; domain=.nytimes.com"
+        },
+        {
+          "location": "http://www.nytimes.com/2012/11/03/us/pennsylvania-omitted-poison-data-in-water-report.html?hp&_r=0"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "NYT-S=0MTlTX5YhqzXfDXrmvxADeHBiKThPzJplXdeFz9JchiAJK89nlVaR7bsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "vary": "Host"
+        },
+        {
+          "cteonnt-length": "61027"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 21:27:04 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3093"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=71366"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:28:55 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:04 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5636"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=71943"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:38:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Mon, 15 Oct 2012 20:38:16 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "2481"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=70868"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:20:37 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 15 Oct 2012 20:38:16 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1241"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=67395"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:22:44 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:01 GMT"
+        },
+        {
+          "p3p": "CP=\"IDC DSP COR DEVa TAIa OUR BUS UNI\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "nginx/0.7.59"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR PSAo PSDo OUR BUS OTC\""
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "x-aspnet-version": "2.0.50727"
+        },
+        {
+          "content-length": "1"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-type": "text/plain; charset=utf-8"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:11:43 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "568"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=72065"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:40:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1307"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=67397"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:22:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 20:48:58 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "47727"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=66869"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:13:58 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 17 Sep 2012 20:20:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2093"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=70944"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:21:53 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "693"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=67422"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:23:11 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2045"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=71899"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:37:48 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1052"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=71981"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:39:10 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:11:43 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2466"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=72115"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:41:24 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "885"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=70944"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:21:53 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 10 Sep 2012 21:02:50 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3686"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=67060"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:17:09 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "636"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=72224"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:43:13 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "850"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=70987"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:22:36 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1057"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=70895"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:21:04 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 20:47:43 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1577"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=70868"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:20:37 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "546"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=71763"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:35:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MTlTX5YhqzXfDXrmvxADeHBiKThPzJplXdeFz9JchiAJK89nlVaR7bsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:15 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1911"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=71744"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:35:13 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "648"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=66989"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:15:58 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "NYT-S=0MWfXncvqFxdbDXrmvxADeHBiKThPzJplXdeFz9JchiAJYOVLIKocjgsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cteonnt-length": "45"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "59"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "956"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=66847"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:13:36 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "303"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "location": "http://d1aivi5dp2wry5.cloudfront.net/pixel.gif"
+        },
+        {
+          "p3p": "CP=\"NOI PSAo OUR IND COM NAV STA\""
+        },
+        {
+          "server": "Microsoft-IIS/7.0"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 25 Mar 2011 19:37:15 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1110"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=251474"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 11:30:43 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:16 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "525"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=70973"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:22:22 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "522"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=66881"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:14:10 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1766"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=63849"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:23:38 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "864"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=72341"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:45:10 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5039"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=66914"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:14:43 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 11 Oct 2012 22:21:50 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "561"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=70935"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:21:44 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 26 Apr 2012 15:13:40 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8381"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=351783"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 15:22:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Thu, 04 Nov 2010 16:47:55 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "1896"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=51812"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 04:03:01 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 17 Sep 2012 18:13:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5551"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=71858"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:37:07 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 01:19:31 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "15650"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=571282"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:20:51 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 22:23:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "22905"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=51812"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 04:03:01 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1713"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=70944"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:21:53 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Fri, 11 Sep 2009 17:35:00 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "69"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=72168"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:42:17 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 30 May 2012 16:54:32 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "13402"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=18685"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 18:50:54 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8728"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=67350"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:21:59 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "656"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=67439"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:23:28 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5248"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=70974"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:22:23 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:04 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "1103"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=70946"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:21:55 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-amz-id-2": "YvVdaXFdQYBoLiHhS/Pvn3QQnQ4PguJp3trhCHZSnIIo5NT7S98Tdyovty62vHSG"
+        },
+        {
+          "x-amz-request-id": "CD0C61042E9125AE"
+        },
+        {
+          "date": "Thu, 05 Jul 2012 20:17:51 GMT"
+        },
+        {
+          "cache-control": "max-age=600000"
+        },
+        {
+          "last-modified": "Wed, 28 Sep 2011 20:00:18 GMT"
+        },
+        {
+          "etag": "\"df3e567d6f16d040326c7a0ea29a4f41\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "AmazonS3"
+        },
+        {
+          "age": "64616"
+        },
+        {
+          "x-amz-cf-id": "oorNbpV0j8hpPM9RfynFxe0GrjwY7QWan8Mzs8SdZ-6uuC5_pgLgZA=="
+        },
+        {
+          "via": "1.0 2cfcdac9b945cce88c21cc3f30d884cd.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "126"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=67490"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:24:19 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:01 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "nginx/1.0.0"
+        },
+        {
+          "set-cookie": "nyt-m=8F26281382200A491A2301632AB3A6B8&e=i.1354338000&t=i.10&v=i.1&l=l.25.2802408197.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1&n=i.2&g=i.0&er=i.1351949956&vr=l.4.1.0.0.0&pr=l.4.2.0.0.0&vp=i.0&gf=l.10.2802408197.-1.-1.-1.-1.-1.-1.-1.-1.-1; expires=Thu, 02-Nov-2017 13:39:29 GMT; path=/; domain=.nytimes.com"
+        },
+        {
+          "content-length": "113"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 16 Oct 2012 21:00:10 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5399"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=66914"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:14:43 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1401"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=71732"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:35:01 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Wed, 02 Mar 2011 21:46:12 GMT"
+        },
+        {
+          "etag": "\"195-49d86d768f100\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-host": "b103 D=2883"
+        },
+        {
+          "keep-alive": "timeout=120, max=990"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "age": "93     "
+        },
+        {
+          "content-length": "405"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3831"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=71853"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:37:02 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 21:26:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "1246"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=70966"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:22:15 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "37497"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=72227"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:43:16 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:23 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9877"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=70946"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:21:55 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "424"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=71023"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:23:12 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "268"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=67682"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:27:31 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "873"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=70936"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:21:45 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:11:33 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "368"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=71023"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:23:12 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3481"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=71854"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:37:03 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "550"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=70868"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:20:37 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=51842"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 04:03:31 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "content-length": "9458"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2328"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=51833"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 04:03:22 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 21:27:04 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2619"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=51842"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 04:03:31 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "129"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=51812"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 04:03:01 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 21:27:49 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "35"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=42508"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 01:27:57 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:53 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "68"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=69239"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:53:28 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "46"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=71028"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:23:17 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:53 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1147"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=66888"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:14:17 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:29 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 01 Mar 2011 22:54:04 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2078"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=251463"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 11:30:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 03 Mar 2011 19:32:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "593"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=251463"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 11:30:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 03 Mar 2011 19:32:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1062"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=251463"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 11:30:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 03 Mar 2011 19:32:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "830"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=251463"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 11:30:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "46"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=65132"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:45:02 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 03 Mar 2011 19:32:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "319"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=251463"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 11:30:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 25 Mar 2011 19:37:14 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "68"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=1148040"
+        },
+        {
+          "expires": "Fri, 16 Nov 2012 20:33:30 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MSC2NhKvY9wzDXrmvxADeHz0Rn194VZRXdeFz9JchiAJYOVLIKocjgsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "set-cookie": "ALT_ID=007f010046a161bb587e0031; Expires=Sun, 03 Nov 2013 13:39:30 GMT; Path=/; Domain=.nytimes.com;"
+        },
+        {
+          "ntcoent-length": "89"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "99"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MSC2NhKvY9wzDXrmvxADeHz0Rn194VZRXdeFz9JchiAJYOVLIKocjgsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "156"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "set-cookie": "ALT_ID=007f010046a161bb587e0031; Expires=Sun, 03 Nov 2013 13:39:30 GMT; Path=/; Domain=.nytimes.com;"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "522"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MSC2NhKvY9wzDXrmvxADeHz0Rn194VZRXdeFz9JchiAJYOVLIKocjgsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "5623"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 11 Oct 2012 22:51:23 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5799"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=351376"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 15:15:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 10:59:57 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9147"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=336431"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 11:06:41 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 17:13:57 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9389"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=445021"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 17:16:31 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 11 Oct 2012 22:48:20 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5801"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=349648"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:46:58 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 04:10:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "9726"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=402546"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 05:28:36 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 02:47:04 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8968"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568247"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:30:17 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "2160"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "384"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=66991"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:16:01 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3710"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=71770"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:35:40 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1435"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=72025"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:39:55 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "193"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=66872"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:14:02 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "11292"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=67441"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:23:31 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1968"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=70895"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:21:05 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "uid=3582991558377661871; Domain=.p-td.com; Expires=Thu, 02-May-2013 13:39:30 GMT; Path=/"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "645"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=67389"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:22:39 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "6174"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=63855"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:23:45 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MSC2NhKvY9wzDXrmvxADeHz0Rn194VZRXdeFz9JchiAJYOVLIKocjgsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "1008"
+        },
+        {
+          "last-modified": "Thu, 05 Jul 2012 20:14:20 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=86400, private"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "nncoection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "set-cookie": "ALT_ID=007f010046a161bb587e0031; Expires=Sun, 03 Nov 2013 13:39:30 GMT; Path=/; Domain=.nytimes.com;"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "max-age=86400, private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "451"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "303"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "location": "/dcsypfq3j00000gsclwfljaeo_6i3w/dcs.gif?dcsredirect=112&dcstlh=0&dcstlv=0&dcsdat=1351949970618&dcssip=www.nytimes.com&dcsuri=/2012/11/03/us/pennsylvania-omitted-poison-data-in-water-report.html&dcsqry=%3Fhp%26_r=0&dcsref=http://www.nytimes.com/&WT.co_f=130.129.68.73-2680109824.30259656&WT.vt_sid=130.129.68.73-2680109824.30259656.1351949959620&WT.tz=-4&WT.bh=9&WT.ul=en-US&WT.cd=24&WT.sr=1366x768&WT.jo=Yes&WT.ti=Pennsylvania%20Omitted%20Poison%20Data%20in%20Water%20Report%20-%20NYTimes.com&WT.js=Yes&WT.jv=1.7&WT.ct=unknown&WT.bs=994x649&WT.fi=No&WT.tv=1.0.7&WT.dl=0&WT.es=www.nytimes.com/2012/11/03/us/pennsylvania-omitted-poison-data-in-water-report.html&WT.z_cad=1&WT.z_fbc=0&WT.cg_n=U.S.&WT.z_rcgn=U.S.&WT.z_gpt=Article&WT.z_gpst=News&WT.cre=The%20New%20York%20Times&WT.z_nyts=0MSC2NhKvY9wzDXrmvxADeHz0Rn194VZRXdeFz9JchiAJYOVLIKocjgsV.Ynx4rkFI&WT.z_nytd=&WT.z_rmid=007f010022166047bee9002b&WT.z_ref=nytimes.com&WT.rv=0&WT.z_hdl=Pennsylvania%20Omitted%20Poison%20Data%20in%20Water%20Report&WT.z_aid=nyta-100000001882561&WT.z_pud=20121102&WT.z_put=Archive&WT.z.gsg=Archive&WT.z_gat=1987-Present&WT.z_pua=free&WT.z_clmst=JON%20HURDLE&WT.z_puv=Normal&WT.z_pudr=1%20Day&WT.z_pyr=2012&WT.mc_ev=&WT.vt_f_tlv=&WT.vt_f_tlh=1351949969&WT.vt_f_d=&WT.vt_f_s=&WT.vt_f_a=&WT.vt_f="
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "set-cookie": "ACOOKIE=C8ctADEzMC4xMjkuNjguNzMtMjY4MDEwOTgyNC4zMDI1OTY1NgAAAAAAAAACAAAAmLwAAJEelVCHHpVQ9r0AAJIelVCSHpVQAQAAAHhHAACSHpVQhx6VUAAAAAA-; path=/; expires=Thu, 10-Dec-2015 10:27:34 GMT"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR NID ADM DEV PSA OUR IND UNI PUR COM NAV INT STA\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "rts_AAAA=MLs3719rcF5/JLq6ryuLbPLJXeyC9jZZv+I7SU4qR++R9DDoNb/ysNCSXuwJ979WKhzt9zeOAxNfu6nTWtMntzlCge0zMN6tn5CjIsSTK5oUfaLnJaYMq4VYwS5vxNRs6EHC1nNdLw29SQ2GQ1OzYMBqy0e3FBBr8pVvZLpT4SSw1y6vIpitypkpC3SUacb3M5M=; Domain=.revsci.net; Expires=Sun, 03-Nov-2013 13:39:30 GMT; Path=/"
+        },
+        {
+          "x-proc-data": "pd3-bgas09-2"
+        },
+        {
+          "p3p": "policyref=\"http://js.revsci.net/w3c/rsip3p.xml\", CP=\"NON PSA PSD IVA IVD OTP SAM IND UNI PUR COM NAV INT DEM CNT STA PRE OTC HEA\""
+        },
+        {
+          "server": "RSI"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "content-type": "application/javascript;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MSC2NhKvY9wzDXrmvxADeHz0Rn194VZRXdeFz9JchiAJYOVLIKocjgsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "684"
+        },
+        {
+          "last-modified": "Thu, 05 Jul 2012 19:11:21 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=86400, private"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "set-cookie": "ACOOKIE=C8ctADEzMC4xMjkuNjguNzMtMjY4MDEwOTgyNC4zMDI1OTY1NgAAAAAAAAACAAAAmLwAAJEelVCHHpVQ9r0AAJIelVCSHpVQAQAAAHhHAACSHpVQhx6VUAAAAAA-; path=/; expires=Mon, 03-Nov-2014 13:39:30 GMT"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR NID ADM DEV PSA OUR IND UNI PUR COM NAV INT STA\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "67"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 27 Aug 2012 21:22:08 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "430"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=67493"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:24:23 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 14 Mar 2012 16:16:16 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2791"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=547136"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 21:38:26 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 21:27:48 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1103"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=43733"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 01:48:23 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1330"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=72392"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:46:02 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "1261"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=72392"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:46:02 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1687"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=67920"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:31:30 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "74"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=67981"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:32:31 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 17 Jul 2012 16:21:31 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1029"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=72522"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:48:12 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 17 Jul 2012 16:21:31 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "108"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=70940"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:21:50 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "73"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=67925"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:31:35 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "set-cookie": "ALT_ID=007f010046a161bb587e0031; Expires=Sun, 03 Nov 2013 13:39:30 GMT; Path=/; Domain=.nytimes.com;"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "max-age=604800, private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1211"
+        },
+        {
+          "last-modified": "Wed, 14 Mar 2012 16:16:16 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MSC2NhKvY9wzDXrmvxADeHz0Rn194VZRXdeFz9JchiAJYOVLIKocjgsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "684"
+        },
+        {
+          "last-modified": "Thu, 05 Jul 2012 19:11:21 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=86400, private"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 20:42:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "10779"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=66917"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:14:47 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 12:45:53 GMT"
+        },
+        {
+          "server": "safe"
+        },
+        {
+          "cache-control": "public, max-age=3600"
+        },
+        {
+          "content-length": "141"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "x-frame-options": "ALLOWALL"
+        },
+        {
+          "age": "3217"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-type": "application/ocsp-response"
+        },
+        {
+          "content-length": "1330"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:30 GMT"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "access-control-allow-origin": "*"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:22 GMT"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "x-fb-debug": "viBL2OtZRmc+1Eqe26sXit4heGPBgfLwrdCHHhHx73Y="
+        },
+        {
+          "content-length": "1916"
+        },
+        {
+          "cache-control": "public, max-age=25750987"
+        },
+        {
+          "expires": "Wed, 28 Aug 2013 14:42:38 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:31 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "cache-control": "private, no-cache, no-store"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:31 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.krxd.net/kruxcontent/p3p.xml\", CP=\"NON DSP COR NID OUR DEL SAM OTR UNR COM NAV INT DEM CNT STA PRE LOC OTC\""
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "set-cookie": "_kuid_=IAJ5QtWI; path=/; expires=Thu, 02-May-13 13:39:31 GMT; domain=.krxd.net"
+        },
+        {
+          "x-request-time": "D=263 t=1351949971765301"
+        },
+        {
+          "x-served-by": "beacon-a006.krxd.net"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=1800"
+        },
+        {
+          "content-type": "text/javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:31 GMT"
+        },
+        {
+          "etag": "\"ad69b1e55307637e8f511c3651fe4a796330656f\""
+        },
+        {
+          "x-age": "0"
+        },
+        {
+          "x-cache": "MISS"
+        },
+        {
+          "x-cache-hits": "0"
+        },
+        {
+          "x-kuid": "IAJ5QtWI"
+        },
+        {
+          "x-request-backend": "user_data"
+        },
+        {
+          "x-served-by": "apiservices-a002.krxd.net"
+        },
+        {
+          "content-length": "117"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:31 GMT"
+        },
+        {
+          "content-type": "image/x-icon"
+        },
+        {
+          "set-cookie": "NYT-S=0MSC2NhKvY9wzDXrmvxADeHz0Rn194VZRXdeFz9JchiAJYOVLIKocjgsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "684"
+        },
+        {
+          "last-modified": "Thu, 05 Jul 2012 19:11:21 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=86400, private"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-length": "1406"
+        },
+        {
+          "last-modified": "Fri, 03 Aug 2012 23:51:15 GMT"
+        },
+        {
+          "etag": "\"57e-501c63f3\""
+        },
+        {
+          "accept-ranges": "bytes"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 11:36:59 GMT"
+        },
+        {
+          "etag": "\"30-4cd95ab8fecc0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-host": "b205 D=2031"
+        },
+        {
+          "keep-alive": "timeout=120, max=972"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:31 GMT"
+        },
+        {
+          "age": "161    "
+        },
+        {
+          "content-length": "48"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:30:44 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5873"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=419"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:46:30 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:31 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 15 Jul 2010 17:33:38 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "583"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=251500"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 11:31:12 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:32 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 25 Oct 2007 19:58:55 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "79"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=251499"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 11:31:11 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:32 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "etag": "\"d04742eb975012ec5e5aecce3effd7ce:1350417145\""
+        },
+        {
+          "last-modified": "Tue, 25 Sep 2012 18:41:40 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:31 GMT"
+        },
+        {
+          "content-length": "3167"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/0.7.67"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:32 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:15 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "235"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=50212"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 03:36:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:12:26 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "402"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=70900"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:21:20 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:53 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1108"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=45394"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 02:16:14 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "content-type": "image/x-icon"
+        },
+        {
+          "set-cookie": "NYT-S=0MuwkWjSilDpbDXrmvxADeHGJBFC9b9qDRdeFz9JchiAKuaKkdl/6loIV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "684"
+        },
+        {
+          "last-modified": "Thu, 05 Jul 2012 19:11:21 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=86400, private"
+        },
+        {
+          "vary": "Host"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-length": "1406"
+        },
+        {
+          "last-modified": "Fri, 03 Aug 2012 23:51:15 GMT"
+        },
+        {
+          "etag": "\"57e-501c63f3\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "ntcoent-length": "142315"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:20:34 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2017"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=64909"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:41:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 05 Jul 2012 21:20:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1687"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=43"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:40:23 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 13:51:54 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9372"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=519781"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 14:02:41 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 18:59:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "21158"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=451415"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 19:03:15 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 02:58:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9420"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=480982"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 03:16:02 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 24 May 2012 19:30:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1217"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=31"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:40:11 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:01 GMT"
+        },
+        {
+          "p3p": "CP=\"IDC DSP COR DEVa TAIa OUR BUS UNI\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "nginx/0.7.59"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 17 May 2012 20:43:15 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "586"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=57"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:40:37 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 05 Jul 2012 21:20:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "17724"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=44"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:40:24 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "586"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=70933"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:21:53 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:24 GMT"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "set-cookie": "ALT_ID=007f010046a161bb587e0031; Expires=Sun, 03 Nov 2013 13:39:30 GMT; Path=/; Domain=.nytimes.com;"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "max-age=604800, private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1211"
+        },
+        {
+          "last-modified": "Wed, 14 Mar 2012 16:16:16 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MlRvbBBJvPrbDXrmvxADeHGBFC0o.wGyedeFz9JchiAKuaKkdl/6loIV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "593"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=72068"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:40:48 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "380"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=76028"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 10:46:48 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1435"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=67567"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:25:47 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 10:03:09 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "6703"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568282"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:31:02 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 15:35:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "10892"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 00:21:48 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "9029"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 16:05:06 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "10524"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568298"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:31:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2045"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=71054"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:23:54 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "416"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=71053"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:23:53 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 19:05:57 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "31084"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "402"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=71054"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:23:54 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Fri, 20 May 2011 16:30:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "9829"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:14:44 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "526"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=50213"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 14 May 2010 14:49:17 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "67"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=217288"
+        },
+        {
+          "expires": "Tue, 06 Nov 2012 02:01:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 21 Apr 2010 19:31:17 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "507"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=307895"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 03:11:15 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 21 Apr 2010 19:31:17 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1578"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=358516"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 17:14:56 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 03 Mar 2010 22:58:31 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1927"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=601439"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 12:43:39 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 19:39:26 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "10726"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568482"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:34:22 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 23 Oct 2012 05:20:00 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9316"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 28 Dec 2006 14:20:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "183"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=349196"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:39:36 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 04:24:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "13748"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 10:40:02 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8817"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Fri, 14 Mar 2008 23:03:40 GMT"
+        },
+        {
+          "etag": "\"19f-4486dae50ab00\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-host": "b203 D=1778"
+        },
+        {
+          "keep-alive": "timeout=120, max=997"
+        },
+        {
+          "content-type": "application/javascript"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "age": "43     "
+        },
+        {
+          "content-length": "415"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:01 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "nginx/1.0.0"
+        },
+        {
+          "set-cookie": "nyt-m=65755B60FD3DAC5F62160A7CED54655D&e=i.1354338000&t=i.10&v=i.1&l=l.25.2802408197.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1&n=i.2&g=i.0&er=i.1351949956&vr=l.4.1.0.0.0&pr=l.4.3.0.0.0&vp=i.0&gf=l.10.2802408197.-1.-1.-1.-1.-1.-1.-1.-1.-1; expires=Thu, 02-Nov-2017 13:39:40 GMT; path=/; domain=.nytimes.com"
+        },
+        {
+          "content-length": "114"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 19:28:25 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8578"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 29 Oct 2012 18:53:28 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "40163"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 00:59:01 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "31146"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=582958"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 07:35:38 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Mon, 22 Oct 2012 17:24:54 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "16403"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 27 Oct 2012 18:43:40 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "11670"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=308055"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 03:13:55 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 28 Apr 2010 14:36:08 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "987"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=568614"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 28 Apr 2010 14:36:08 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2533"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=568614"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 19 Sep 2012 16:22:54 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "14479"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568614"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 09 Apr 2012 21:40:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "14215"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568614"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Thu, 11 Dec 2008 21:32:53 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "2981"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=568614"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 17:09:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "13040"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=43242"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 01:40:22 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 28 Apr 2009 18:18:22 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "441"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=43242"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 01:40:22 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 21:41:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "14372"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=54908"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 04:54:48 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 01 Apr 2009 23:28:14 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1305"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=30976"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 22:15:56 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 20 Mar 2012 16:46:14 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "16641"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=76250"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 10:50:30 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "public, max-age=600"
+        },
+        {
+          "content-type": "text/javascript;charset=utf-8"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:40 GMT"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:32:42 GMT"
+        },
+        {
+          "server": "ECS (lhr/4BB6)"
+        },
+        {
+          "status": "200 OK"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-cache": "HIT"
+        },
+        {
+          "content-length": "9160"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:53 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "64"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=70518"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:14:59 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:15:29 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2092"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "cache-control": "private, max-age=86400"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 23 Sep 2011 19:12:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1453"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=47"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:40:28 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:53 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "119"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=65032"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:43:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:53 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1261"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=65032"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:43:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:53 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "188"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=70571"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:15:52 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:14:45 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "74"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=70936"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:21:57 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 28 Aug 2012 21:17:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "880"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=64971"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:42:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "4164"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=76141"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 10:48:42 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "230"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=64971"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:42:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2404"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=64971"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:42:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "5136"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=64867"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:40:48 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "29137"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=64954"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:42:15 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5752"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=64971"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:42:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "723"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=76141"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 10:48:42 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "set-cookie": "ALT_ID=007f010046a161bb587e0031; Expires=Sun, 03 Nov 2013 13:39:30 GMT; Path=/; Domain=.nytimes.com;"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "586"
+        },
+        {
+          "last-modified": "Thu, 06 Dec 2007 12:15:43 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "vary": "Host"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MlRvbBBJvPrbDXrmvxADeHGBFC0o.wGyedeFz9JchiAKuaKkdl/6loIV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "etag": "\"14f8931-69a-4409d16c699c0\""
+        },
+        {
+          "cteonnt-length": "1690"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 14 May 2010 14:50:15 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "170"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=348768"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:32:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 14 May 2010 14:50:15 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "106"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=348768"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:32:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Fri, 14 May 2010 14:50:15 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "3113"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=348768"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:32:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2303"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=64971"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:42:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "16036"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=64972"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:42:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 31 Aug 2010 02:21:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "783"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=64970"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:42:31 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 17 Jan 2011 01:28:46 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1930"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=86400"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Wed, 24 Jun 2009 19:31:51 GMT"
+        },
+        {
+          "etag": "\"1506ccd-181-46d1d28b0d7c0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cteonnt-length": "385"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "233"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "1875"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "x-frame-options": "ALLOWALL"
+        },
+        {
+          "age": "3217"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1313"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=64974"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:42:35 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:04 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "956"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=65049"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:43:50 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 24 Apr 2012 15:30:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "7711"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568612"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 23 Jun 2011 19:37:35 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8232"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568612"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Tue, 28 Feb 2012 20:00:47 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "8082"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568612"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 23 Jun 2011 20:05:40 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8047"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568612"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 16 Mar 2012 15:04:36 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8295"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568612"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "rts_AAAA=MLs37yNvMF5jo9YXjSnP7LCTHV9qwwoXglYNnSgoXY6BgbxUe/dD4KFNMYHqMNEyxe2rbNMTaq4ZLc54Mwg8CSJxvNnh/ajkRBOJfEPCwjrLmcL1OEvcVlVd6ZL/LHB0ixoNHfgWDborMHCUfZtXPvcBFlRNv7qTCM+wn7NY4LUipF+V+epFmBpnIArrjDPO; Domain=.revsci.net; Expires=Sun, 03-Nov-2013 13:39:41 GMT; Path=/"
+        },
+        {
+          "x-proc-data": "pd3-bgas12-2"
+        },
+        {
+          "p3p": "policyref=\"http://js.revsci.net/w3c/rsip3p.xml\", CP=\"NON PSA PSD IVA IVD OTP SAM IND UNI PUR COM NAV INT DEM CNT STA PRE OTC HEA\""
+        },
+        {
+          "server": "RSI"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "content-type": "application/javascript;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 29 Mar 2011 21:16:30 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8374"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568612"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "303"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "location": "/dcsaon9rw0000008ifmgqtaeo_2f9c/dcs.gif?dcsredirect=112&dcstlh=0&dcstlv=0&dcsdat=1351949981735&dcssip=www.nytimes.com&dcsuri=/pages/science/index.html&dcsref=http://www.nytimes.com/2012/11/03/us/pennsylvania-omitted-poison-data-in-water-report.html%3Fhp%26_r=0&WT.co_f=130.129.68.73-2680109824.30259656&WT.vt_sid=130.129.68.73-2680109824.30259656.1351949959620&WT.tz=-4&WT.bh=9&WT.ul=en-US&WT.cd=24&WT.sr=1366x768&WT.jo=Yes&WT.ti=Science%20News%20-%20The%20New%20York%20Times&WT.js=Yes&WT.jv=1.7&WT.ct=unknown&WT.bs=994x649&WT.fi=No&WT.tv=1.0.7&WT.dl=0&WT.es=www.nytimes.com/pages/science/index.html&WT.cg_n=Science&WT.z_rcgn=Science&WT.z_gpt=Section%20Front&WT.z_nyts=0MlRvbBBJvPrbDXrmvxADeHGBFC0o.wGyedeFz9JchiAKuaKkdl/6loIV.Ynx4rkFI&WT.z_nytd=&WT.z_rmid=007f010022166047bee9002b&WT.z_ref=nytimes.com&WT.rv=0&WT.mc_ev=&WT.vt_f_tlv=&WT.vt_f_tlh=1351949981&WT.vt_f_d=&WT.vt_f_s=&WT.vt_f_a=&WT.vt_f="
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "set-cookie": "ACOOKIE=C8ctADEzMC4xMjkuNjguNzMtMjY4MDEwOTgyNC4zMDI1OTY1NgAAAAAAAAADAAAAmLwAAJEelVCHHpVQ9r0AAJIelVCSHpVQ+r0AAJ0elVCdHpVQAQAAAHhHAACdHpVQhx6VUAAAAAA-; path=/; expires=Thu, 10-Dec-2015 10:27:34 GMT"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR NID ADM DEV PSA OUR IND UNI PUR COM NAV INT STA\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 08 Sep 2011 15:52:38 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8274"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568612"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 29 Mar 2011 21:21:57 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8001"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568612"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Mon, 04 Apr 2011 17:44:15 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "8310"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568612"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 13 Mar 2012 15:48:45 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8162"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 29 Mar 2011 19:24:18 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8410"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 29 Mar 2011 19:26:27 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8253"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 30 Mar 2011 20:20:51 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8372"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 29 Mar 2011 19:25:21 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8030"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Wed, 24 Jun 2009 19:31:51 GMT"
+        },
+        {
+          "etag": "\"1506ccd-181-46d1d28b0d7c0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cteonnt-length": "385"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "74"
+        },
+        {
+          "ntcoent-length": "62"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Fri, 09 Mar 2012 18:41:14 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "8093"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 29 Mar 2011 21:31:02 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8036"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 14 Mar 2012 19:42:04 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8124"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 29 Mar 2011 21:33:45 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8207"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 29 Mar 2011 21:36:23 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8363"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 29 Mar 2011 21:41:44 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8151"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568613"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:36:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "set-cookie": "ACOOKIE=C8ctADEzMC4xMjkuNjguNzMtMjY4MDEwOTgyNC4zMDI1OTY1NgAAAAAAAAADAAAAmLwAAJEelVCHHpVQ9r0AAJIelVCSHpVQ+r0AAJ0elVCdHpVQAQAAAHhHAACdHpVQhx6VUAAAAAA-; path=/; expires=Mon, 03-Nov-2014 13:39:41 GMT"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR NID ADM DEV PSA OUR IND UNI PUR COM NAV INT STA\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "67"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 17 Mar 2010 16:56:32 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "20"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "cache-control": "private, max-age=64931"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:41:52 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "last-modified": "Tue, 31 Jul 2012 23:02:57 GMT"
+        },
+        {
+          "server": "ECS (lhr/4BF1)"
+        },
+        {
+          "x-cache": "HIT"
+        },
+        {
+          "content-length": "35"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "public, max-age=604800"
+        },
+        {
+          "content-type": "text/css;charset=utf-8"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:41 GMT"
+        },
+        {
+          "last-modified": "Sun, 28 Oct 2012 04:22:00 GMT"
+        },
+        {
+          "server": "ECS (lhr/4BB5)"
+        },
+        {
+          "status": "200 OK"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "x-cache": "HIT"
+        },
+        {
+          "content-length": "136727"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "cache-control": "private, no-cache, no-store"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:43 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.krxd.net/kruxcontent/p3p.xml\", CP=\"NON DSP COR NID OUR DEL SAM OTR UNR COM NAV INT DEM CNT STA PRE LOC OTC\""
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "set-cookie": "_kuid_=IAJ5QtWI; path=/; expires=Thu, 02-May-13 13:39:43 GMT; domain=.krxd.net"
+        },
+        {
+          "x-request-time": "D=245 t=1351949983602996"
+        },
+        {
+          "x-served-by": "beacon-a006.krxd.net"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/0.7.67"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:43 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 21 Aug 2012 20:06:02 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1780"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=72048"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:40:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:45 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "511"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=72077"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:41:02 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:45 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 16:29:48 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "6000"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=571763"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:29:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:45 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 16:26:29 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "6454"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=571763"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:29:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:45 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:45 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "156"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "NYT-S=0Ma.K9EWB.dlLDXrmvxADeHD./oTk5S0O8deFz9JchiAImJkOx2rgxzsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "vary": "Host"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "ntcoent-length": "64765"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 17:02:58 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8653"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=571763"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:29:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:45 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 20:54:29 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "21379"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=71749"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:35:34 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:45 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 14:47:21 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "15456"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=571763"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:29:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:45 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 14:29:59 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "49747"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=571763"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:29:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:45 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 20:15:59 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3168"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=72146"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:42:12 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 14 Jun 2012 20:14:49 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "10547"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=49875"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 03:31:01 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:01 GMT"
+        },
+        {
+          "p3p": "CP=\"IDC DSP COR DEVa TAIa OUR BUS UNI\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "nginx/0.7.59"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "303"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:45 GMT"
+        },
+        {
+          "location": "http://d1aivi5dp2wry5.cloudfront.net/pixel.gif"
+        },
+        {
+          "p3p": "CP=\"NOI PSAo OUR IND COM NAV STA\""
+        },
+        {
+          "server": "Microsoft-IIS/7.0"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:01 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "nginx/1.0.0"
+        },
+        {
+          "set-cookie": "nyt-m=39895E64FA29A782E08DBEA5DC0005A0&e=i.1354338000&t=i.10&v=i.2&l=l.25.2802408197.2634689326.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1&n=i.2&g=i.0&er=i.1351949956&vr=l.4.2.0.0.0&pr=l.4.4.0.0.0&vp=i.0&gf=l.10.2802408197.2634689326.-1.-1.-1.-1.-1.-1.-1.-1; expires=Thu, 02-Nov-2017 13:39:46 GMT; path=/; domain=.nytimes.com"
+        },
+        {
+          "content-length": "113"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "NYT-S=0MKyyIqtYtFvnDXrmvxADeHJm9OXN6YxpedeFz9JchiAIrvq48TSAR4YV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "ntcoent-length": "50"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "67"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "NYT-S=0MKyyIqtYtFvnDXrmvxADeHJm9OXN6YxpedeFz9JchiAIrvq48TSAR4YV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cteonnt-length": "45"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "59"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "304"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-amz-id-2": "YvVdaXFdQYBoLiHhS/Pvn3QQnQ4PguJp3trhCHZSnIIo5NT7S98Tdyovty62vHSG"
+        },
+        {
+          "x-amz-request-id": "CD0C61042E9125AE"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        },
+        {
+          "cache-control": "max-age=600000"
+        },
+        {
+          "last-modified": "Wed, 28 Sep 2011 20:00:18 GMT"
+        },
+        {
+          "etag": "\"df3e567d6f16d040326c7a0ea29a4f41\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "server": "AmazonS3"
+        },
+        {
+          "age": "64633"
+        },
+        {
+          "x-amz-cf-id": "kbjTp1EH_MixUnZ7pqHXKi1pQZ7tCItHqSP2iVMrIwMt36MEvhC5bQ=="
+        },
+        {
+          "via": "1.0 2cfcdac9b945cce88c21cc3f30d884cd.cloudfront.net (CloudFront)"
+        },
+        {
+          "x-cache": "Hit from cloudfront"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/javascript; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "993"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "x-frame-options": "ALLOWALL"
+        },
+        {
+          "age": "3217"
+        },
+        {
+          "content-disposition": "attachment"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "NYT-S=0MKyyIqtYtFvnDXrmvxADeHJm9OXN6YxpedeFz9JchiAIrvq48TSAR4YV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "vary": "Host"
+        },
+        {
+          "cteonnt-length": "1220"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "767"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "156"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "522"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "59"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "NYT-S=0MrbR7PgLIdPLDXrmvxADeHJm9OXN6YxpedeFz9JchiAIa2oeaXI7u7sV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cteonnt-length": "45"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5623"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/javascript; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "1071"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "x-frame-options": "ALLOWALL"
+        },
+        {
+          "age": "3217"
+        },
+        {
+          "content-disposition": "attachment"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "uid=3582991558377661871; Domain=.p-td.com; Expires=Thu, 02-May-2013 13:39:46 GMT; Path=/"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:45 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "rts_AAAA=MLs3MVVvMC5/TPbCQtB9rewZ4ac3sWtlL/To9pTTnVflQ7/pHvfl9TutghgWq8BWX5hkGMxwV0G2TYPnu7UrqddmXeJqDHsu7UtpznAhQDBIXp76SiJpTi8Xt/SyOHvyVjspIxogIORYGOkXT50L77u7Afv+N5dTX/mGL4zVQJ5xgVd7PhAxSnfU7wMqMA10uXsSVCgB; Domain=.revsci.net; Expires=Sun, 03-Nov-2013 13:39:46 GMT; Path=/"
+        },
+        {
+          "x-proc-data": "pd3-bgas14-2"
+        },
+        {
+          "p3p": "policyref=\"http://js.revsci.net/w3c/rsip3p.xml\", CP=\"NON PSA PSD IVA IVD OTP SAM IND UNI PUR COM NAV INT DEM CNT STA PRE OTC HEA\""
+        },
+        {
+          "server": "RSI"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "content-type": "application/javascript;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "67"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=75225"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 10:33:31 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "set-cookie": "ACOOKIE=C8ctADEzMC4xMjkuNjguNzMtMjY4MDEwOTgyNC4zMDI1OTY1NgAAAAAAAAADAAAAmLwAAJEelVCHHpVQ9r0AAKIelVCSHpVQ+r0AAJ0elVCdHpVQAQAAAHhHAACiHpVQhx6VUAAAAAA-; path=/; expires=Mon, 03-Nov-2014 13:39:46 GMT"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR NID ADM DEV PSA OUR IND UNI PUR COM NAV INT STA\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "67"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:46 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "421"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "NYT-S=0MCYDgCh5sLPnDXrmvxADeHJm9OXN6YxpedeFz9JchiAI32QSUxrnkuIV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cteonnt-length": "611"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:47 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "216"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:47 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "677"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1270"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=65537"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:52:04 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:47 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 01 Oct 2012 22:20:20 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "850"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=82550"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 12:35:37 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:47 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 25 Oct 2007 19:58:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "78"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=343858"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 13:10:45 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:47 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:47 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "1625"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 25 Jun 2012 18:51:15 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "193"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=348897"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:34:44 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:47 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "cache-control": "private, no-cache, no-store"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:47 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.krxd.net/kruxcontent/p3p.xml\", CP=\"NON DSP COR NID OUR DEL SAM OTR UNR COM NAV INT DEM CNT STA PRE LOC OTC\""
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "set-cookie": "_kuid_=IAJ5QtWI; path=/; expires=Thu, 02-May-13 13:39:47 GMT; domain=.krxd.net"
+        },
+        {
+          "x-request-time": "D=261 t=1351949987674149"
+        },
+        {
+          "x-served-by": "beacon-a002.krxd.net"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/0.7.67"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:47 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 25 Jun 2012 18:51:15 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "195"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=348898"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:34:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:48 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:48 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "1625"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 17 Nov 2011 21:55:54 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1439"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=348897"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:34:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:49 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 27 Sep 2011 18:42:47 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "120"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=348920"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:35:09 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:49 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 17 Nov 2010 22:08:39 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "79"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=348893"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:34:42 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:49 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 17 Nov 2010 22:08:39 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "444"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=348893"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:34:42 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:49 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:53 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "314"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=69564"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:59:13 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:49 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "x-amz-id-2": "ceFRS1NFRp8F1PuWGjAzR4CMD8nHMNrIGG1K803RtQWtRwA6ZZIyFDi3hvyD0rEU"
+        },
+        {
+          "x-amz-request-id": "1F4B6B1CFD329F7B"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:50 GMT"
+        },
+        {
+          "last-modified": "Mon, 20 Aug 2012 08:07:13 GMT"
+        },
+        {
+          "etag": "\"327b3e51a98ec9a7794030292d94bfdd\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "content-length": "2329"
+        },
+        {
+          "server": "AmazonS3"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 11 Nov 2011 21:24:38 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "992"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=348902"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:34:52 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:50 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:52 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "1625"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MPfF5c8nIM93DXrmvxADeHz.PZL72gaixdeFz9JchiAI32QSUxrnkuIV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 20:18:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "4913"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=75470"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 10:37:42 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:52 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 25 Oct 2012 15:40:30 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9921"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=62694"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:04:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:52 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:52 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:01 GMT"
+        },
+        {
+          "p3p": "CP=\"IDC DSP COR DEVa TAIa OUR BUS UNI\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "nginx/0.7.59"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:52 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "59"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MVMayrSvblfnDXrmvxADeHz.PZL72gaixdeFz9JchiALEJMkToPY7aYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "45"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:38:56 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "216"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MrRmN0I2VxMLDXrmvxADeHx2AlW/TY.ZkdeFz9JchiAI32QSUxrnkuIV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:52 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:01 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "nginx/1.0.0"
+        },
+        {
+          "set-cookie": "nyt-m=484D5CE2EC7396EB483BD34967CEFAEA&e=i.1354338000&t=i.10&v=i.2&l=l.25.2802408197.2634689326.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1&n=i.2&g=i.0&er=i.1351949956&vr=l.4.2.0.0.0&pr=l.4.5.0.0.0&vp=i.0&gf=l.10.2802408197.2634689326.-1.-1.-1.-1.-1.-1.-1.-1; expires=Thu, 02-Nov-2017 13:39:52 GMT; path=/; domain=.nytimes.com"
+        },
+        {
+          "content-length": "113"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/javascript; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:53 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "1064"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "x-frame-options": "ALLOWALL"
+        },
+        {
+          "age": "3217"
+        },
+        {
+          "content-disposition": "attachment"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "last-modified": "Thu, 12 Apr 2012 20:48:26 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:53 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:39:53 GMT"
+        },
+        {
+          "cache-control": "public, max-age=0"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "175"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:53 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "216"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0M3MAhi1As7rzDXrmvxADeHIS37KQvQCBqdeFz9JchiAI32QSUxrnkuIV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:53 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "522"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0M3MAhi1As7rzDXrmvxADeHIS37KQvQCBqdeFz9JchiAI32QSUxrnkuIV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "cache-control": "private"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:53 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "NYT-S=0MsUPd65dnaE7DXrmvxADeHIS37KQvQCBqdeFz9JchiALEJMkToPY7aYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cteonnt-length": "45"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "59"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:53 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "156"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "last-modified": "Mon, 27 Aug 2012 09:47:24 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:53 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:39:53 GMT"
+        },
+        {
+          "cache-control": "public, max-age=0"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "846"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:53 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "5623"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0M3MAhi1As7rzDXrmvxADeHIS37KQvQCBqdeFz9JchiAI32QSUxrnkuIV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "cache-control": "private"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "uid=3582991558377661871; Domain=.p-td.com; Expires=Thu, 02-May-2013 13:39:53 GMT; Path=/"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:53 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/javascript; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:53 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "1015"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "x-frame-options": "ALLOWALL"
+        },
+        {
+          "age": "3217"
+        },
+        {
+          "content-disposition": "attachment"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:53 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "rts_AAAA=MLs38VNrMF5/o7ZYjynLbLK61Fp4LCE4qYA8/Pkh6qaTfl607NSARhRSu/Fzrhux2ZemT7dtNzdkLuaRJQuxoxMjsTLW4MWkvPvMQEm63fgskbXcOyhmIGhAp8smwaMCPqeCAzEoxoL8g46HoNIA8DP6t0XbPL6ADv/liREWAhRB2zl4cdzIiQpdChU6FSzIgUundpLxZgo=; Domain=.revsci.net; Expires=Sun, 03-Nov-2013 13:39:53 GMT; Path=/"
+        },
+        {
+          "x-proc-data": "pd3-bgas07-3"
+        },
+        {
+          "p3p": "policyref=\"http://js.revsci.net/w3c/rsip3p.xml\", CP=\"NON PSA PSD IVA IVD OTP SAM IND UNI PUR COM NAV INT DEM CNT STA PRE OTC HEA\""
+        },
+        {
+          "server": "RSI"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "content-type": "application/javascript;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:53 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:53 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "5623"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MsUPd65dnaE7DXrmvxADeHIS37KQvQCBqdeFz9JchiALEJMkToPY7aYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "cache-control": "private"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:53 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "216"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:53 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "1625"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MsUPd65dnaE7DXrmvxADeHIS37KQvQCBqdeFz9JchiALEJMkToPY7aYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "cache-control": "private"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:53 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "674"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "cache-control": "private, no-cache, no-store"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:54 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.krxd.net/kruxcontent/p3p.xml\", CP=\"NON DSP COR NID OUR DEL SAM OTR UNR COM NAV INT DEM CNT STA PRE LOC OTC\""
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "set-cookie": "_kuid_=IAJ5QtWI; path=/; expires=Thu, 02-May-13 13:39:54 GMT; domain=.krxd.net"
+        },
+        {
+          "x-request-time": "D=261 t=1351949994087668"
+        },
+        {
+          "x-served-by": "beacon-a006.krxd.net"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/0.7.67"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:54 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:55 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "1625"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MsUPd65dnaE7DXrmvxADeHIS37KQvQCBqdeFz9JchiALEJMkToPY7aYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "cache-control": "private"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 19 Sep 2012 14:55:07 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9556"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=18600"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 18:49:57 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "1625"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MzziEIMyxqcHDXrmvxADeHFvzcPY0HhncdeFz9JchiALEJMkToPY7aYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "cache-control": "private"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:01 GMT"
+        },
+        {
+          "p3p": "CP=\"IDC DSP COR DEVa TAIa OUR BUS UNI\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "nginx/0.7.59"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:01 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "nginx/1.0.0"
+        },
+        {
+          "set-cookie": "nyt-m=BB78456D636A55DD29717BF2DF3A713D&e=i.1354338000&t=i.10&v=i.2&l=l.25.2802408197.2634689326.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1&n=i.2&g=i.0&er=i.1351949956&vr=l.4.2.0.0.0&pr=l.4.6.0.0.0&vp=i.0&gf=l.10.2802408197.2634689326.-1.-1.-1.-1.-1.-1.-1.-1; expires=Thu, 02-Nov-2017 13:39:57 GMT; path=/; domain=.nytimes.com"
+        },
+        {
+          "content-length": "113"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "1625"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MzziEIMyxqcHDXrmvxADeHFvzcPY0HhncdeFz9JchiALEJMkToPY7aYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "cache-control": "private"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "674"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MzziEIMyxqcHDXrmvxADeHFvzcPY0HhncdeFz9JchiALEJMkToPY7aYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/javascript; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "1086"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "x-frame-options": "ALLOWALL"
+        },
+        {
+          "age": "3217"
+        },
+        {
+          "content-disposition": "attachment"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "1625"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MzziEIMyxqcHDXrmvxADeHFvzcPY0HhncdeFz9JchiALEJMkToPY7aYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "cache-control": "private"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "522"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "156"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MzziEIMyxqcHDXrmvxADeHFvzcPY0HhncdeFz9JchiALEJMkToPY7aYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "1625"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MzziEIMyxqcHDXrmvxADeHFvzcPY0HhncdeFz9JchiALEJMkToPY7aYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "cache-control": "private"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "5623"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MzziEIMyxqcHDXrmvxADeHFvzcPY0HhncdeFz9JchiALEJMkToPY7aYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/javascript; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "982"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "x-frame-options": "ALLOWALL"
+        },
+        {
+          "age": "3217"
+        },
+        {
+          "content-disposition": "attachment"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "last-modified": "Thu, 12 Apr 2012 20:48:26 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "cache-control": "public, max-age=0"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "175"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "rts_AAAA=MLs38VVrcF5/ZLq6rynLbPIrDNNqLmAVAjAcmlywO48hlDb+EIf12DpSuoFj6R+qKjtBkmg2hwh475ZyhKkLcXnOHD8snyDB8tqBczw0L+1ELClDEhhnAWZEtcBDLaM8gpIzDffofr8PXgb4mdcdsGQEwxlXd7J5w1a+LaHURhUo7KSjHyswVRH8QuXMXjpbXabRMAqNp3YYzXPS12ub; Domain=.revsci.net; Expires=Sun, 03-Nov-2013 13:39:57 GMT; Path=/"
+        },
+        {
+          "x-proc-data": "pd3-bgas11-2"
+        },
+        {
+          "p3p": "policyref=\"http://js.revsci.net/w3c/rsip3p.xml\", CP=\"NON PSA PSD IVA IVD OTP SAM IND UNI PUR COM NAV INT DEM CNT STA PRE OTC HEA\""
+        },
+        {
+          "server": "RSI"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "content-type": "application/javascript;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "421"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MQAEyqJ3kflHDXrmvxADeHFvzcPY0HhncdeFz9JchiAIul1FwAbE3OsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "611"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "uid=3582991558377661871; Domain=.p-td.com; Expires=Thu, 02-May-2013 13:39:57 GMT; Path=/"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:58 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "674"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MzziEIMyxqcHDXrmvxADeHFvzcPY0HhncdeFz9JchiALEJMkToPY7aYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:58 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "216"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "last-modified": "Mon, 27 Aug 2012 09:47:24 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:39:57 GMT"
+        },
+        {
+          "cache-control": "public, max-age=0"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "server": "sffe"
+        },
+        {
+          "content-length": "846"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:58 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "1625"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MzziEIMyxqcHDXrmvxADeHFvzcPY0HhncdeFz9JchiALEJMkToPY7aYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "cache-control": "private, no-cache, no-store"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:58 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.krxd.net/kruxcontent/p3p.xml\", CP=\"NON DSP COR NID OUR DEL SAM OTR UNR COM NAV INT DEM CNT STA PRE LOC OTC\""
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "set-cookie": "_kuid_=IAJ5QtWI; path=/; expires=Thu, 02-May-13 13:39:58 GMT; domain=.krxd.net"
+        },
+        {
+          "x-request-time": "D=258 t=1351949998446073"
+        },
+        {
+          "x-served-by": "beacon-a006.krxd.net"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/0.7.67"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:39:58 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:00 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "1625"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MzziEIMyxqcHDXrmvxADeHFvzcPY0HhncdeFz9JchiALEJMkToPY7aYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:03 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "1625"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0M0SovqlRxK8PDXrmvxADeHKjc4hKLrMXGdeFz9JchiAI7clrZeQfNdsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "vary": "Host"
+        },
+        {
+          "ntcoent-length": "59049"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:03 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:01 GMT"
+        },
+        {
+          "p3p": "CP=\"IDC DSP COR DEVa TAIa OUR BUS UNI\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "nginx/0.7.59"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:03 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "59"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "NYT-S=0MMbUZRWJFzCHDXrmvxADeHKjc4hKLrMXGdeFz9JchiALVSSvxGfo9IYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cteonnt-length": "45"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:03 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0M0SovqlRxK8PDXrmvxADeHKjc4hKLrMXGdeFz9JchiAI7clrZeQfNdsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:03 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:01 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "nginx/1.0.0"
+        },
+        {
+          "set-cookie": "nyt-m=A04BB1C6D05156CDD246EFA62A7CC3A3&e=i.1354338000&t=i.10&v=i.2&l=l.25.2802408197.2634689326.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1&n=i.2&g=i.0&er=i.1351949956&vr=l.4.2.0.0.0&pr=l.4.7.0.0.0&vp=i.0&gf=l.10.2802408197.2634689326.-1.-1.-1.-1.-1.-1.-1.-1; expires=Thu, 02-Nov-2017 13:40:03 GMT; path=/; domain=.nytimes.com"
+        },
+        {
+          "content-length": "113"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/javascript; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:03 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "1065"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "x-frame-options": "ALLOWALL"
+        },
+        {
+          "age": "3217"
+        },
+        {
+          "content-disposition": "attachment"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:03 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0M0SovqlRxK8PDXrmvxADeHKjc4hKLrMXGdeFz9JchiAI7clrZeQfNdsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "vary": "Host"
+        },
+        {
+          "cteonnt-length": "1240"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "777"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:03 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "522"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:03 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0M0SovqlRxK8PDXrmvxADeHKjc4hKLrMXGdeFz9JchiAI7clrZeQfNdsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:03 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "156"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/javascript; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:03 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "1013"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "x-frame-options": "ALLOWALL"
+        },
+        {
+          "age": "3217"
+        },
+        {
+          "content-disposition": "attachment"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:03 GMT"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5623"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:03 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "rts_AAAA=MLs37lNrMF5/o7ZYjynLbLK6rQEBceRsik1IRXIEfZYJjiQapJzwsXeZjT0U5HMKHV3mXKvvaQ4FLg4p3hY87Lr+QiD9QLBuC5Vhn49p+QQ/emsZO26pJ7Jdh6OeXLf4hds9p5K2fB19Ja95VikymGQrDgRB3gOb5zehMs2tUQJAktvEjgSgsPeIBsEg8ddP/NbMOovVC1aBKj+1; Domain=.revsci.net; Expires=Sun, 03-Nov-2013 13:40:03 GMT; Path=/"
+        },
+        {
+          "x-proc-data": "pd3-bgas14-2"
+        },
+        {
+          "p3p": "policyref=\"http://js.revsci.net/w3c/rsip3p.xml\", CP=\"NON PSA PSD IVA IVD OTP SAM IND UNI PUR COM NAV INT DEM CNT STA PRE OTC HEA\""
+        },
+        {
+          "server": "RSI"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "content-type": "application/javascript;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:03 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "uid=3582991558377661871; Domain=.p-td.com; Expires=Thu, 02-May-2013 13:40:03 GMT; Path=/"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:03 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:03 GMT"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5623"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0M0SovqlRxK8PDXrmvxADeHKjc4hKLrMXGdeFz9JchiAI7clrZeQfNdsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:04 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "674"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:04 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0M0SovqlRxK8PDXrmvxADeHKjc4hKLrMXGdeFz9JchiAI7clrZeQfNdsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "216"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:04 GMT"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1628"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0M0SovqlRxK8PDXrmvxADeHKjc4hKLrMXGdeFz9JchiAI7clrZeQfNdsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "cache-control": "private, no-cache, no-store"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:04 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.krxd.net/kruxcontent/p3p.xml\", CP=\"NON DSP COR NID OUR DEL SAM OTR UNR COM NAV INT DEM CNT STA PRE LOC OTC\""
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "set-cookie": "_kuid_=IAJ5QtWI; path=/; expires=Thu, 02-May-13 13:40:04 GMT; domain=.krxd.net"
+        },
+        {
+          "x-request-time": "D=274 t=1351950004445628"
+        },
+        {
+          "x-served-by": "beacon-a006.krxd.net"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/0.7.67"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:04 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 23:48:23 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3699"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=79"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:23 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:04 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:05 GMT"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1628"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0M0SovqlRxK8PDXrmvxADeHKjc4hKLrMXGdeFz9JchiAI7clrZeQfNdsV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:14 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1397"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=55146"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 04:59:15 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "ntcoent-length": "135910"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1628"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MZmF2WzRIAizDXrmvxADeHI4U72bYMorSdeFz9JchiALVSSvxGfo9IYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "vary": "Host"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 17 Sep 2012 20:00:23 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1566"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=202"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:43:31 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 02:21:37 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "9333"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=564467"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 02:27:56 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 17:00:35 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8948"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=530746"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 17:05:55 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1276"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=64897"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:41:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Mon, 17 Sep 2012 20:00:10 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "19737"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=202"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:43:31 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "248"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=64919"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:42:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:15 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "921"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=20124"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 19:15:33 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 04:10:50 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "10427"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=571269"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:21:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "59"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "NYT-S=0Ma.K9EWB.dlLDXrmvxADeHI4U72bYMorSdeFz9JchiALJvjis/thrUYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cteonnt-length": "45"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 02:54:41 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "33089"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=573548"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:59:17 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 00:13:15 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "8950"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=559591"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 01:06:40 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:18:13 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "431"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/css"
+        },
+        {
+          "cache-control": "private, max-age=64941"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:42:30 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 01 Mar 2012 17:13:24 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "52128"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=97"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:41:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 06:54:58 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "10027"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=580777"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 06:59:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:01 GMT"
+        },
+        {
+          "p3p": "CP=\"IDC DSP COR DEVa TAIa OUR BUS UNI\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "nginx/0.7.59"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 03:35:34 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9303"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=573129"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:52:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 00:50:49 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "10045"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=559835"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 01:10:44 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 23:02:10 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "10110"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=552339"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 23:05:48 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 02:40:24 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9118"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=568308"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 03:31:57 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 02 Oct 2007 16:06:30 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "3308"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=573548"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:59:17 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 22:25:29 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "14634"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=573549"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:59:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 04:22:34 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "14341"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=573549"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:59:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 17:50:19 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "16624"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=361320"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 18:02:09 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:01 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "nginx/1.0.0"
+        },
+        {
+          "set-cookie": "nyt-m=918B6703052398FA5C152AAC782FA51F&e=i.1354338000&t=i.10&v=i.2&l=l.25.2802408197.2634689326.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1&n=i.2&g=i.0&er=i.1351949956&vr=l.4.2.0.0.0&pr=l.4.8.0.0.0&vp=i.0&gf=l.10.2802408197.2634689326.-1.-1.-1.-1.-1.-1.-1.-1; expires=Thu, 02-Nov-2017 13:40:09 GMT; path=/; domain=.nytimes.com"
+        },
+        {
+          "content-length": "114"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 30 Oct 2012 22:51:43 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "15006"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=573549"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:59:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 20:07:29 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "51622"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=369068"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 20:11:17 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 02:55:22 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "19143"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=394445"
+        },
+        {
+          "expires": "Thu, 08 Nov 2012 03:14:14 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 23:23:53 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "9474"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=553714"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 23:28:43 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 04:48:38 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8030"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=573439"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:57:28 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 20 Jun 2012 14:59:39 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "10115"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=573549"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:59:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 20 Aug 2009 21:16:01 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2105"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=351563"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 15:19:32 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 04:00:27 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "35977"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=573549"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:59:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Tue, 27 Apr 2010 17:46:57 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "1787"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=349039"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:37:28 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 14 Oct 2011 20:04:24 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "8189"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=573550"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:59:19 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 17 Jun 2011 13:57:26 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2824"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=573550"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:59:19 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 15 Nov 2011 19:33:43 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "11967"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=573550"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:59:19 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 10 Jun 2011 13:57:17 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2404"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=573152"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:52:41 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 02 Jun 2011 21:47:45 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "17489"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=352377"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 15:33:06 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Tue, 31 Jul 2012 15:09:43 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "7708"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=573550"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:59:19 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 23 Mar 2007 20:45:48 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "4035"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=573550"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:59:19 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 03 Jun 2010 13:02:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1660"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=352377"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 15:33:06 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 21 Jun 2012 18:52:41 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "11884"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=75841"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 10:44:10 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 31 Oct 2012 21:41:52 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "17667"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=50037"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 03:34:06 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 05 Jul 2012 20:15:36 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2092"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "cache-control": "private, max-age=86400"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 13:40:10 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:10 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Wed, 24 Jun 2009 19:31:51 GMT"
+        },
+        {
+          "etag": "\"1506ccd-181-46d1d28b0d7c0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cteonnt-length": "385"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "233"
+        },
+        {
+          "ntcoent-length": "62"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 13 Jan 2011 15:17:04 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1870"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=86400"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 13:40:10 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:10 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:10 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Wed, 24 Jun 2009 19:31:51 GMT"
+        },
+        {
+          "etag": "\"1506ccd-181-46d1d28b0d7c0\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cteonnt-length": "385"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "74"
+        },
+        {
+          "ntcoent-length": "62"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:10 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "1866"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "x-frame-options": "ALLOWALL"
+        },
+        {
+          "age": "3217"
+        },
+        {
+          "content-disposition": "attachment"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=604800"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:10 GMT"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 13:40:10 GMT"
+        },
+        {
+          "last-modified": "Tue, 31 Jul 2012 23:02:57 GMT"
+        },
+        {
+          "server": "ECS (lhr/4BF1)"
+        },
+        {
+          "x-cache": "HIT"
+        },
+        {
+          "content-length": "35"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Thu, 15 Dec 2011 19:05:45 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=52304"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 04:11:53 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:09 GMT"
+        },
+        {
+          "content-length": "42039"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:14:45 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "66"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=71036"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 09:24:08 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "247"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=64954"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:42:46 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:05 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2289"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=64924"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:42:16 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 04 Aug 2012 21:19:03 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "2443"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=64924"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 07:42:16 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:12 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "vary": "Cookie"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:38:24 +0000"
+        },
+        {
+          "cache-control": "max-age=132, must-revalidate"
+        },
+        {
+          "keep-alive": "timeout=60, max=940"
+        },
+        {
+          "connection": "Keep-Alive"
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 18 Mar 2009 18:50:08 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "188"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=349116"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:38:48 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 18 Mar 2009 18:50:08 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "106"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=349122"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:38:54 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 18 Mar 2009 18:50:08 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "131"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=349122"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:38:54 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 09 Sep 2009 16:10:20 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "351"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=349157"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:39:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Wed, 09 Sep 2009 16:10:20 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "224"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "cache-control": "private, max-age=349157"
+        },
+        {
+          "expires": "Wed, 07 Nov 2012 14:39:29 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/javascript; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:12 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "872"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "x-frame-options": "ALLOWALL"
+        },
+        {
+          "age": "3217"
+        },
+        {
+          "content-disposition": "attachment"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:12 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "rts_AAAA=MLs38FVrcF5/ZLq6rynLbPIrzBMgf6gCZEFYbnEyqJwHBZC0garfrvMOIs+B939ykqVLVck4XSTGQIMvPdVthDcyttnh/a+rfKsxItpUfG2D5pA4KGuH2gGpHenDN3B0M6eEi6BWcidf0I+ZlqmL9bIpDHIKu64kT0YghPKjDoejnlzus5jQeqqP4igBfBMSRX3hgEHkgrccVaMsrutxL45k8Cggfg==; Domain=.revsci.net; Expires=Sun, 03-Nov-2013 13:40:12 GMT; Path=/"
+        },
+        {
+          "x-proc-data": "pd4-bgas03-2"
+        },
+        {
+          "p3p": "policyref=\"http://js.revsci.net/w3c/rsip3p.xml\", CP=\"NON PSA PSD IVA IVD OTP SAM IND UNI PUR COM NAV INT DEM CNT STA PRE OTC HEA\""
+        },
+        {
+          "server": "RSI"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "content-type": "application/javascript;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:12 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 03:08:29 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "18011"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=573549"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:59:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "303"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:12 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "location": "/dcsj5tb4n100000sl76culaeo_4f3w/dcs.gif?dcsredirect=112&dcstlh=0&dcstlv=0&dcsdat=1351950012922&dcssip=www.nytimes.com&dcsuri=/pages/nyregion/index.html&dcsref=http://www.nytimes.com/2012/11/04/education/edlife/a-new-kind-of-tutoring-aims-to-make-students-smarter.html%3Fpagewanted=4%26ref=science&WT.co_f=130.129.68.73-2680109824.30259656&WT.vt_sid=130.129.68.73-2680109824.30259656.1351949959620&WT.tz=-4&WT.bh=9&WT.ul=en-US&WT.cd=24&WT.sr=1366x768&WT.jo=Yes&WT.ti=New%20York%20Region%20News%20-%20The%20New%20York%20Times&WT.js=Yes&WT.jv=1.7&WT.ct=unknown&WT.bs=994x649&WT.fi=No&WT.tv=1.0.7&WT.dl=0&WT.es=www.nytimes.com/pages/nyregion/index.html&WT.cg_n=N.Y./Region&WT.z_rcgn=N.Y./Region&WT.z_gpt=Section%20Front&WT.z_nyts=0Ma.K9EWB.dlLDXrmvxADeHI4U72bYMorSdeFz9JchiALJvjis/thrUYV.Ynx4rkFI&WT.z_nytd=&WT.z_rmid=007f010022166047bee9002b&WT.z_ref=nytimes.com&WT.rv=0&WT.mc_ev=&WT.vt_f_tlv=&WT.vt_f_tlh=1351950010&WT.vt_f_d=&WT.vt_f_s=&WT.vt_f_a=&WT.vt_f="
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "set-cookie": "ACOOKIE=C8ctADEzMC4xMjkuNjguNzMtMjY4MDEwOTgyNC4zMDI1OTY1NgAAAAAAAAAEAAAAmLwAAJEelVCHHpVQ9r0AALkelVCSHpVQ+r0AAJ0elVCdHpVQ970AALwelVC8HpVQAQAAAHhHAAC8HpVQhx6VUAAAAAA-; path=/; expires=Thu, 10-Dec-2015 10:27:34 GMT"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR NID ADM DEV PSA OUR IND UNI PUR COM NAV INT STA\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 03:06:34 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "25015"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=573549"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:59:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 03:06:11 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "25206"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=573549"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 04:59:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:12 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "304"
+        },
+        {
+          "x-amz-id-2": "d90CCR9lSoaaNwupUMIdb/ey0mevoBrnI3ZRtI8HHFRBEUtsLjtNMBWb2X6DprZz"
+        },
+        {
+          "x-amz-request-id": "D6FC61A73C17CF70"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:14 GMT"
+        },
+        {
+          "cache-control": "max-age=10"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 13:35:29 GMT"
+        },
+        {
+          "etag": "\"8254326a395317db7b197564fa83e476\""
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-type": ""
+        },
+        {
+          "content-length": "92155"
+        },
+        {
+          "server": "AmazonS3"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:13 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "set-cookie": "ACOOKIE=C8ctADEzMC4xMjkuNjguNzMtMjY4MDEwOTgyNC4zMDI1OTY1NgAAAAAAAAAEAAAAmLwAAJEelVCHHpVQ9r0AALkelVCSHpVQ+r0AAJ0elVCdHpVQ970AAL0elVC8HpVQAQAAAHhHAAC9HpVQhx6VUAAAAAA-; path=/; expires=Mon, 03-Nov-2014 13:40:13 GMT"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR NID ADM DEV PSA OUR IND UNI PUR COM NAV INT STA\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "67"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 07:39:41 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=300"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:45:12 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:12 GMT"
+        },
+        {
+          "content-length": "4073"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/png"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:13 GMT"
+        },
+        {
+          "etag": "\"fb5af56cb67780c01fb3516e7c3f74e3\""
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:40:13 GMT"
+        },
+        {
+          "last-modified": "Wed, 04 Apr 2012 20:38:25 GMT"
+        },
+        {
+          "server": "ECS (lhr/4BA4)"
+        },
+        {
+          "x-amz-id-2": "cBUUBPPZMto6skduFezdQ+9bNRCuwVjOvgFgohhb4PfZdlrYG33n3GM2BJ25YTtq"
+        },
+        {
+          "x-amz-request-id": "6758CF2C16F8B0C0"
+        },
+        {
+          "x-cache": "HIT"
+        },
+        {
+          "content-length": "1662"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:13 GMT"
+        },
+        {
+          "etag": "\"0940a52ad7b3435f775918b80b088f27\""
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:40:13 GMT"
+        },
+        {
+          "last-modified": "Thu, 30 Sep 2010 12:29:59 GMT"
+        },
+        {
+          "server": "ECS (lhr/4BCC)"
+        },
+        {
+          "x-amz-id-2": "jDnDMjao+nUL4vfffUU3TFPTyN1KxJt9Dy6uCIra3CbwdS9wgqVrVK02Lhf++2Kk"
+        },
+        {
+          "x-amz-request-id": "296BB691837A53B5"
+        },
+        {
+          "x-cache": "HIT"
+        },
+        {
+          "content-length": "980"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:13 GMT"
+        },
+        {
+          "etag": "\"7e3ff7f7848a81a63b6e2e0bfb394799\""
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:40:13 GMT"
+        },
+        {
+          "last-modified": "Sun, 12 Jun 2011 15:43:21 GMT"
+        },
+        {
+          "server": "ECS (lhr/4BA1)"
+        },
+        {
+          "x-amz-id-2": "QHLqCpOps7vUVMXN1QzHCNBpV3eM2RaV2CNFSW7QQ5BQSiaY2U04JVbdV76t6uPA"
+        },
+        {
+          "x-amz-request-id": "4E56272125A99862"
+        },
+        {
+          "x-cache": "HIT"
+        },
+        {
+          "content-length": "2607"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:13 GMT"
+        },
+        {
+          "etag": "\"3ff974032fd77223fd059c6d234ebb43\""
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:40:13 GMT"
+        },
+        {
+          "last-modified": "Tue, 14 Jun 2011 16:57:49 GMT"
+        },
+        {
+          "server": "ECS (lhr/4BDF)"
+        },
+        {
+          "x-amz-id-2": "q0tabYbFY5+80zmAw4/5X92+LUMhsasmJRWZU8wZxF7S+TYVyMgxcBM47nT2KV2t"
+        },
+        {
+          "x-amz-request-id": "5C17C42AD2E36B99"
+        },
+        {
+          "x-cache": "HIT"
+        },
+        {
+          "content-length": "3219"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:13 GMT"
+        },
+        {
+          "etag": "\"ac105110a13a3d24f2b5d502fb0db4e8\""
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:40:13 GMT"
+        },
+        {
+          "last-modified": "Tue, 16 Jun 2009 22:22:00 GMT"
+        },
+        {
+          "server": "ECS (lhr/4BAD)"
+        },
+        {
+          "x-amz-id-2": "AlVWqZvxNaFzFrxq+Lo/jRl878iwJzLMeSmnDalUQWo33DvFg3BUtTZnEF+yRJ5W"
+        },
+        {
+          "x-amz-request-id": "F6C83DE008C7DEFA"
+        },
+        {
+          "x-cache": "HIT"
+        },
+        {
+          "content-length": "1673"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "cache-control": "max-age=31536000"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:13 GMT"
+        },
+        {
+          "etag": "\"6c157f6f56910c50a03faa81d54546bd\""
+        },
+        {
+          "expires": "Sun, 03 Nov 2013 13:40:13 GMT"
+        },
+        {
+          "last-modified": "Tue, 06 Sep 2011 20:24:40 GMT"
+        },
+        {
+          "server": "ECS (lhr/4BAC)"
+        },
+        {
+          "x-amz-id-2": "KFCqXFOHRJbWl2rZ7FfvRitLrhcAZnqUIfhUqkDIDZOQB0cgxkSjAlC9Qh0pOvZ3"
+        },
+        {
+          "x-amz-request-id": "8BF259D47606A786"
+        },
+        {
+          "x-cache": "HIT"
+        },
+        {
+          "content-length": "2437"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "cache-control": "private, no-cache, no-store"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:13 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.krxd.net/kruxcontent/p3p.xml\", CP=\"NON DSP COR NID OUR DEL SAM OTR UNR COM NAV INT DEM CNT STA PRE LOC OTC\""
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "set-cookie": "_kuid_=IAJ5QtWI; path=/; expires=Thu, 02-May-13 13:40:13 GMT; domain=.krxd.net"
+        },
+        {
+          "x-request-time": "D=271 t=1351950013983899"
+        },
+        {
+          "x-served-by": "beacon-a002.krxd.net"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/0.7.67"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:14 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 19:52:17 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "15613"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=564661"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 02:31:18 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Tue, 03 Apr 2012 15:22:24 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "1955"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=299"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:45:16 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 02:54:40 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "14642"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=579064"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 06:31:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 02 Nov 2012 19:54:59 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "15613"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=547394"
+        },
+        {
+          "expires": "Fri, 09 Nov 2012 21:43:31 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MA4.kVz1KQmzDXrmvxADeHK.rUS.yFrOJdeFz9JchiALJvjis/thrUYV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "216"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:01 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "nginx/1.0.0"
+        },
+        {
+          "set-cookie": "nyt-m=8FF27B7C7E22BE437F4E72563691B5C2&e=i.1354338000&t=i.10&v=i.3&l=l.25.2802408197.2634689326.1254883451.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1&n=i.2&g=i.0&er=i.1351949956&vr=l.4.3.0.0.0&pr=l.4.9.0.0.0&vp=i.0&gf=l.10.2802408197.2634689326.1254883451.-1.-1.-1.-1.-1.-1.-1; expires=Thu, 02-Nov-2017 13:40:17 GMT; path=/; domain=.nytimes.com"
+        },
+        {
+          "content-length": "113"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "cache-control": "max-age=0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:01 GMT"
+        },
+        {
+          "p3p": "CP=\"IDC DSP COR DEVa TAIa OUR BUS UNI\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "server": "nginx/0.7.59"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "303"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:16 GMT"
+        },
+        {
+          "location": "http://d1aivi5dp2wry5.cloudfront.net/pixel.gif"
+        },
+        {
+          "p3p": "CP=\"NOI PSAo OUR IND COM NAV STA\""
+        },
+        {
+          "server": "Microsoft-IIS/7.0"
+        },
+        {
+          "x-aspnet-version": "4.0.30319"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MP9kmlu11B5nDXrmvxADeHK.rUS.yFrOJdeFz9JchiAKfXJAEEJyUmIV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "59"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "45"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "NYT-S=0MP9kmlu11B5nDXrmvxADeHK.rUS.yFrOJdeFz9JchiAKfXJAEEJyUmIV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "ntcoent-length": "50"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "67"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Thu, 01 Nov 2012 20:54:29 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "7020"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=76680"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 10:58:17 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:49:48 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "41440"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=579064"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 06:31:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:50:15 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "53346"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=579064"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 06:31:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:48:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "55860"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=579064"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 06:31:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:49:19 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "46030"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=579064"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 06:31:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:51:50 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "25431"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=579064"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 06:31:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:52:12 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "27683"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=579064"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 06:31:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:50:56 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "71084"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=579064"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 06:31:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/html; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "1966"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "x-frame-options": "ALLOWALL"
+        },
+        {
+          "age": "3217"
+        },
+        {
+          "content-disposition": "attachment"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 05:51:23 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-length": "34384"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/jpeg"
+        },
+        {
+          "cache-control": "private, max-age=579064"
+        },
+        {
+          "expires": "Sat, 10 Nov 2012 06:31:21 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/javascript; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:18 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "1024"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "x-frame-options": "ALLOWALL"
+        },
+        {
+          "age": "3217"
+        },
+        {
+          "content-disposition": "attachment"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:18 GMT"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "521"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:18 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0M6GemS05ruUDDXrmvxADeHAjAqSvifpeXdeFz9JchiAKfXJAEEJyUmIV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:18 GMT"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-length": "156"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:18 GMT"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MMaQ/2qmmFHvDXrmvxADeHAjAqSvifpeXdeFz9JchiAIcUoUNnYFX3YV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cteonnt-length": "45"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "content-length": "59"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:18 GMT"
+        },
+        {
+          "server": "nginx/1.0.10"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5623"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "p3p": "policyref=\"http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml\", CP=\"CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""
+        },
+        {
+          "content-type": "text/javascript; charset=UTF-8"
+        },
+        {
+          "x-content-type-options": "nosniff"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:18 GMT"
+        },
+        {
+          "server": "cafe"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-length": "979"
+        },
+        {
+          "x-xss-protection": "1; mode=block"
+        },
+        {
+          "x-frame-options": "ALLOWALL"
+        },
+        {
+          "age": "3217"
+        },
+        {
+          "content-disposition": "attachment"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache-Coyote/1.1"
+        },
+        {
+          "p3p": "policyref=\"/w3c/p3p.xml\", CP=\"NOI CURa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI NAV\""
+        },
+        {
+          "cache-control": "max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "set-cookie": "uid=3582991558377661871; Domain=.p-td.com; Expires=Thu, 02-May-2013 13:40:18 GMT; Path=/"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:18 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "keep-alive": "timeout=20"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "p3p": "policyref=\"http://www.imrworldwide.com/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA ADM OUR IND UNI NAV COM\""
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "set-cookie": "rts_AAAA=MLs3MV9rcF5/e8raSsB8J1a8xoyhfqgGdE1oaHcypJ43DeCuFAmr4KFNP2NyUKmpJDKN5oHAaw4FLg6p/xU87LpGBP1V8Vwc/u8nqIWD9h6mituy2I3ef/nmfXXys59Ro9/kQ77nLnGIV6iKi6h89ib3bNEkAgz8RVtHEqb8hpvCshkDOJUx9+7dGislj1zxURVYlAk37LbXfBKtqErQegJsJj8=; Domain=.revsci.net; Expires=Sun, 03-Nov-2013 13:40:18 GMT; Path=/"
+        },
+        {
+          "x-proc-data": "pd4-bgas09-2"
+        },
+        {
+          "p3p": "policyref=\"http://js.revsci.net/w3c/rsip3p.xml\", CP=\"NON PSA PSD IVA IVD OTP SAM IND UNI PUR COM NAV INT DEM CNT STA PRE OTC HEA\""
+        },
+        {
+          "server": "RSI"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "Thu, 01 Jan 1970 00:00:00 GMT"
+        },
+        {
+          "content-type": "application/javascript;charset=UTF-8"
+        },
+        {
+          "transfer-encoding": "chunked"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "connection": "close"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:18 GMT"
+        },
+        {
+          "server": "Microsoft-IIS/6.0"
+        },
+        {
+          "x-powered-by": "ASP.NET"
+        },
+        {
+          "set-cookie": "ACOOKIE=C8ctADEzMC4xMjkuNjguNzMtMjY4MDEwOTgyNC4zMDI1OTY1NgAAAAAAAAAEAAAAmLwAAJEelVCHHpVQ9r0AALkelVCSHpVQ+r0AAJ0elVCdHpVQ970AAMIelVC8HpVQAQAAAHhHAADCHpVQhx6VUAAAAAA-; path=/; expires=Mon, 03-Nov-2014 13:40:18 GMT"
+        },
+        {
+          "p3p": "CP=\"NOI DSP COR NID ADM DEV PSA OUR IND UNI PUR COM NAV INT STA\""
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "expires": "-1"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "67"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:18 GMT"
+        },
+        {
+          "server": "Sun-ONE-Web-Server/6.1"
+        },
+        {
+          "ntcoent-length": "1068"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "application/json"
+        },
+        {
+          "cache-control": "private"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "5623"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "x-powered-by": "PHP/5.2.9"
+        },
+        {
+          "content-type": "text/html"
+        },
+        {
+          "set-cookie": "NYT-S=0MMaQ/2qmmFHvDXrmvxADeHAjAqSvifpeXdeFz9JchiAIcUoUNnYFX3YV.Ynx4rkFI; path=/; domain=.nytimes.com"
+        },
+        {
+          "expires": "Thu, 01 Dec 1994 16:00:00 GMT"
+        },
+        {
+          "cache-control": "no-cache"
+        },
+        {
+          "pragma": "no-cache"
+        },
+        {
+          "transfer-encoding": "chunked"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "last-modified": "Fri, 12 Oct 2012 00:14:49 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "content-length": "13551"
+        },
+        {
+          "cneonction": "close"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "cache-control": "private, max-age=68002"
+        },
+        {
+          "expires": "Sun, 04 Nov 2012 08:33:40 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:18 GMT"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "last-modified": "Sat, 03 Nov 2012 07:39:41 GMT"
+        },
+        {
+          "accept-ranges": "bytes"
+        },
+        {
+          "vary": "Accept-Encoding"
+        },
+        {
+          "content-encoding": "gzip"
+        },
+        {
+          "nncoection": "close"
+        },
+        {
+          "content-type": "application/x-javascript"
+        },
+        {
+          "cache-control": "private, max-age=300"
+        },
+        {
+          "expires": "Sat, 03 Nov 2012 13:45:17 GMT"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:17 GMT"
+        },
+        {
+          "content-length": "4073"
+        },
+        {
+          "connection": "keep-alive"
+        },
+        {
+          "cneonction": "close"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "204"
+        },
+        {
+          "cache-control": "private, no-cache, no-store"
+        },
+        {
+          "content-length": "0"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:19 GMT"
+        },
+        {
+          "p3p": "policyref=\"http://cdn.krxd.net/kruxcontent/p3p.xml\", CP=\"NON DSP COR NID OUR DEL SAM OTR UNR COM NAV INT DEM CNT STA PRE LOC OTC\""
+        },
+        {
+          "server": "Apache"
+        },
+        {
+          "set-cookie": "_kuid_=IAJ5QtWI; path=/; expires=Thu, 02-May-13 13:40:19 GMT; domain=.krxd.net"
+        },
+        {
+          "x-request-time": "D=259 t=1351950019348818"
+        },
+        {
+          "x-served-by": "beacon-a002.krxd.net"
+        },
+        {
+          "connection": "keep-alive"
+        }
+      ]
+    },
+    {
+      "headers": [
+        {
+          ":status": "200"
+        },
+        {
+          "server": "nginx/0.7.67"
+        },
+        {
+          "date": "Sat, 03 Nov 2012 13:40:19 GMT"
+        },
+        {
+          "content-type": "image/gif"
+        },
+        {
+          "content-length": "43"
+        },
+        {
+          "connection": "close"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/data/story_31.json b/jetty-http2/http2-hpack/src/test/resources/data/story_31.json
new file mode 100644
index 0000000..62f43e2
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/data/story_31.json
@@ -0,0 +1,4555 @@
+{
+  "cases": [
+    {
+      "seqno": 0, 
+      "headers": [
+        {
+          "content-length": "522"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "expires": "Tue, 21 May 2013 19:18:33 GMT"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:20 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "public, max-age=17216869"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:44 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/gif"
+        }, 
+        {
+          "x-fb-debug": "IVe/SwucJuBsLtVHWJw2PMdOTOxuEWUir5igQNThkTg="
+        }
+      ]
+    }, 
+    {
+      "seqno": 1, 
+      "headers": [
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Sun, 12 May 2013 06:59:14 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "content-length": "123"
+        }, 
+        {
+          "last-modified": "Tue, 24 Apr 2012 22:13:35 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=16394910"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:44 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "text/css; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "95tUymdadFLd8Dpml8VnOoUG7KhisOwk74Kd/aIGfU0="
+        }
+      ]
+    }, 
+    {
+      "seqno": 2, 
+      "headers": [
+        {
+          "content-length": "14684"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 02:44:39 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:37:35 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31067635"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:44 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "text/css; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "Qc0GcUiwi3io8aSRIdXaahYr6KKhphvV6NlN8vo/bD4="
+        }
+      ]
+    }, 
+    {
+      "seqno": 3, 
+      "headers": [
+        {
+          "content-length": "14438"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "expires": "Mon, 19 Aug 2013 00:53:24 GMT"
+        }, 
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:23 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "public, max-age=24926560"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:44 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "7exUqkoZxtfLseR1zLxJlXnpYK6MOognZuCKx7drdRo="
+        }
+      ]
+    }, 
+    {
+      "seqno": 4, 
+      "headers": [
+        {
+          "content-length": "17475"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 18:31:11 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Mon, 29 Oct 2012 17:08:56 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31124427"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:44 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "eRvyJLXIvW3Vu9d+m439v+LGKqXiLSKmz7w9/xMAUpc="
+        }
+      ]
+    }, 
+    {
+      "seqno": 5, 
+      "headers": [
+        {
+          "content-length": "44191"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 02:44:39 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 22:55:27 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31067635"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:44 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "text/css; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "14hoEcywNNMBIVUS5B7AD7RDGiDvJ4BGeOVgJbBDzf0="
+        }
+      ]
+    }, 
+    {
+      "seqno": 6, 
+      "headers": [
+        {
+          "content-length": "754"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Wed, 16 Oct 2013 14:03:31 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Fri, 12 Oct 2012 18:34:48 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=29985162"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:49 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "41/HuGcFNMmys4cvGKlBeylojdVDP4+VBIf1giu3eNQ="
+        }
+      ]
+    }, 
+    {
+      "seqno": 7, 
+      "headers": [
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 02:40:10 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "content-length": "2349"
+        }, 
+        {
+          "last-modified": "Thu, 25 Oct 2012 16:05:53 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31067361"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:49 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "oKQwv0JLYost+zqlv8x+C7MEL7zRBbeMomoc54M5RZY="
+        }
+      ]
+    }, 
+    {
+      "seqno": 8, 
+      "headers": [
+        {
+          "content-length": "2626"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 03:00:19 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:08:50 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31068570"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:49 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "zh8tRHKFtERIZ+K/eGiM1utm1H66OnOj1qwPAN7Ck9A="
+        }
+      ]
+    }, 
+    {
+      "seqno": 9, 
+      "headers": [
+        {
+          "content-length": "8036"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 02:33:09 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Fri, 28 Sep 2012 15:01:14 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31066940"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:49 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "pricqIchHztHxKAQSidQiwGmRf62vAL6I7Oi0r/Ki08="
+        }
+      ]
+    }, 
+    {
+      "seqno": 10, 
+      "headers": [
+        {
+          "content-length": "36302"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 02:58:39 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Sat, 27 Oct 2012 21:42:19 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31068470"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:49 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "Kur2FUUQjAQ0yPQJC9fvK56/+LWZHvyQF6Ce2Fuaf2k="
+        }
+      ]
+    }, 
+    {
+      "seqno": 11, 
+      "headers": [
+        {
+          "content-length": "8230"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 27 Aug 2013 06:59:08 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:02:51 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=25639699"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:49 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "wk2MWysJhw3Et7CRGMA1sE9HWuyzy8oCvtT2V7iPXeg="
+        }
+      ]
+    }, 
+    {
+      "seqno": 12, 
+      "headers": [
+        {
+          "content-length": "4878"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 02:59:38 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Sat, 27 Oct 2012 21:38:44 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31068529"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:49 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "GMzzyj0B89LYf1zKH9hqxZekz5mYTmsuxwLugWyc2Gg="
+        }
+      ]
+    }, 
+    {
+      "seqno": 13, 
+      "headers": [
+        {
+          "content-length": "1814"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "content-transfer-encoding": "binary"
+        }, 
+        {
+          "expires": "Sat, 10 Nov 2012 04:37:48 GMT"
+        }, 
+        {
+          "last-modified": "Sat, 03 Nov 2012 04:37:48 GMT"
+        }, 
+        {
+          "connection": "Keep-Alive"
+        }, 
+        {
+          "cache-control": "max-age=575215, public, no-transform, must-revalidate"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:53 GMT"
+        }, 
+        {
+          "nncoection": "close"
+        }, 
+        {
+          "content-type": "application/ocsp-response"
+        }
+      ]
+    }, 
+    {
+      "seqno": 14, 
+      "headers": [
+        {
+          "content-length": "43"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "x-fb-metrics": "{\"w\":53,\"r\":26,\"q\":0,\"a\":25}"
+        }, 
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        }, 
+        {
+          "x-fb-server": "10.74.89.23"
+        }, 
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "pragma": "no-cache"
+        }, 
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:54 GMT"
+        }, 
+        {
+          "content-type": "image/gif"
+        }, 
+        {
+          "x-fb-debug": "7iLjsQVXsunUKXe3NlV2ytaBGzQ0VHCkMX/J6rEuB6Y="
+        }
+      ]
+    }, 
+    {
+      "seqno": 15, 
+      "headers": [
+        {
+          "content-length": "1155"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 02:46:08 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 15:06:53 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31067714"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:54 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "text/css; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "ur+THlFHeLotsmDlQWYPw2GRELyvg28JmE0JYVt56uo="
+        }
+      ]
+    }, 
+    {
+      "seqno": 16, 
+      "headers": [
+        {
+          "content-length": "516"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Wed, 04 Sep 2013 02:55:58 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Fri, 31 Aug 2012 22:13:28 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=26316304"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:54 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "text/css; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "6/fKHkRtBpT4oqBg33tFHk2pO6SDZlUG11Uq4/AlUIE="
+        }
+      ]
+    }, 
+    {
+      "seqno": 17, 
+      "headers": [
+        {
+          "content-length": "232"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Mon, 21 Oct 2013 14:44:35 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Sat, 21 Apr 2012 07:03:57 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=30419619"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:56 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "XtTsONeGHGs/1vRRv8cvNY1ciB3XqlrvnTq2GZXvnqM="
+        }
+      ]
+    }, 
+    {
+      "seqno": 18, 
+      "headers": [
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 02:33:09 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "content-length": "400"
+        }, 
+        {
+          "last-modified": "Fri, 07 Sep 2012 15:18:40 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31066933"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:56 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "E2JBYTapyXFjxTTVqkrekTVKDp1lDQQT/7YxcxfNU2U="
+        }
+      ]
+    }, 
+    {
+      "seqno": 19, 
+      "headers": [
+        {
+          "content-length": "35766"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 03:07:14 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Sat, 27 Oct 2012 21:41:45 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31068980"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:54 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "iPbLdjapQzRoatbOUDrN+exDj8EPHJAcsZ48pVtprtA="
+        }
+      ]
+    }, 
+    {
+      "seqno": 20, 
+      "headers": [
+        {
+          "content-length": "10902"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 02:33:40 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 14:34:50 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31066965"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:55 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "0ci0R5R2ivIVCRrwtG507Eej+LTK8dUL8dIiZp70+dU="
+        }
+      ]
+    }, 
+    {
+      "seqno": 21, 
+      "headers": [
+        {
+          "content-length": "4676"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 08:36:24 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:38:28 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31088728"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:56 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "text/css; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "P2Bq0ebVXjtf8GyQp1HHux8NxlftUMXZuY8XF+yaOVo="
+        }
+      ]
+    }, 
+    {
+      "seqno": 22, 
+      "headers": [
+        {
+          "content-length": "20791"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 02:45:10 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:37:10 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31067654"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:56 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "text/css; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "yHzV/c0w3ZyInkRbLCDrA0t5adSMyAG4prBOk+i+t6Y="
+        }
+      ]
+    }, 
+    {
+      "seqno": 23, 
+      "headers": [
+        {
+          "content-length": "11113"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 02:34:04 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 14:34:47 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31066988"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:56 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "u363OvKFmnm717JBUXA5ePB8Ts0ppRI7+eEJwOOep6w="
+        }
+      ]
+    }, 
+    {
+      "seqno": 24, 
+      "headers": [
+        {
+          "content-length": "43"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Wed, 28 Aug 2013 14:37:09 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:02:57 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=25753573"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:56 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/gif"
+        }, 
+        {
+          "x-fb-debug": "Yty+Te4OzfswtmjzbJmJZaybyM0hxXiRU2NtHEbDuPE="
+        }
+      ]
+    }, 
+    {
+      "seqno": 25, 
+      "headers": [
+        {
+          "content-length": "571"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Wed, 28 Aug 2013 14:41:07 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:24 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=25753811"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:56 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "yKFyrxwqBiumMPfWvv4morUUsmz9djZtSdmCoQMnchs="
+        }
+      ]
+    }, 
+    {
+      "seqno": 26, 
+      "headers": [
+        {
+          "content-length": "43"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Wed, 28 Aug 2013 14:40:26 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:22 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=25753770"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:56 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/gif"
+        }, 
+        {
+          "x-fb-debug": "HbryxnP7HNa7kdTChA6BppSjLQw0gz9ZzESCqEH3/9k="
+        }
+      ]
+    }, 
+    {
+      "seqno": 27, 
+      "headers": [
+        {
+          "content-length": "12817"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Thu, 05 Sep 2013 18:18:17 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Tue, 28 Aug 2012 01:20:00 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=26458041"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:56 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "edgqdu1lFmUW32Et2hHoiAsp9kFIch8QDiciO71cQ4w="
+        }
+      ]
+    }, 
+    {
+      "seqno": 28, 
+      "headers": [
+        {
+          "content-length": "11688"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 03:07:27 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:09:30 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31068990"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:57 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "rXXtxI3fPgNHe6wKIDRBR0xjttUNeG+BDQM8QfKQa+A="
+        }
+      ]
+    }, 
+    {
+      "seqno": 29, 
+      "headers": [
+        {
+          "content-length": "35165"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 02:59:38 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:06:47 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31068521"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:57 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "fUJ2Nc9qJdBC1AnYFA5Vs1f7ozv+i/PTKO+Vep0A0HQ="
+        }
+      ]
+    }, 
+    {
+      "seqno": 30, 
+      "headers": [
+        {
+          "content-length": "1028"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Wed, 30 Oct 2013 13:15:07 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:07:00 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31191849"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:58 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "s9ZmJKnYGlEjIGo8xQzxlhVM4nilGHgcv1fhK1Z7F1w="
+        }
+      ]
+    }, 
+    {
+      "seqno": 31, 
+      "headers": [
+        {
+          "content-length": "47844"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 03:07:27 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:07:08 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31068990"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:57 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "hMQvA7xhuAspt5fOxedr0fWzQZNLkyizVtlmspzgVG8="
+        }
+      ]
+    }, 
+    {
+      "seqno": 32, 
+      "headers": [
+        {
+          "content-length": "42391"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 23:54:49 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Mon, 29 Oct 2012 19:17:24 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31143832"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:57 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "1EkJKYLfWucaDVhZCEVAAo57HpAH7rvF4r9IwDXM2B8="
+        }
+      ]
+    }, 
+    {
+      "seqno": 33, 
+      "headers": [
+        {
+          "content-length": "13181"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 03:07:27 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:10:32 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31068989"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:58 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "dO6OKUf38jDdtAnTrM28wZTBz9Y5hU/0EJdd1CkWGDs="
+        }
+      ]
+    }, 
+    {
+      "seqno": 34, 
+      "headers": [
+        {
+          "content-length": "23736"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Sat, 02 Nov 2013 20:50:17 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Fri, 02 Nov 2012 19:03:57 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31478360"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:57 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "IlZ4dyc3v7fqrfiamqJbFeFTWRkUvEUs2L8KLXNa+5o="
+        }
+      ]
+    }, 
+    {
+      "seqno": 35, 
+      "headers": [
+        {
+          "content-length": "12969"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Fri, 01 Nov 2013 21:39:03 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Thu, 01 Nov 2012 20:35:28 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31394885"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:58 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "REVz0k4Gud7bedzv9KSTG2i1KOporb0T14mWht95MIE="
+        }
+      ]
+    }, 
+    {
+      "seqno": 36, 
+      "headers": [
+        {
+          "content-length": "8457"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 08:36:26 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:06:44 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31088728"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:58 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "VKvuYL/9rqvjXh7mr8LjSJmcgQLZ/a+Ztqj2aUsPacc="
+        }
+      ]
+    }, 
+    {
+      "seqno": 37, 
+      "headers": [
+        {
+          "content-length": "43"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "x-fb-metrics": "{\"w\":26,\"r\":18,\"q\":0,\"a\":30}"
+        }, 
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        }, 
+        {
+          "x-fb-server": "10.164.86.49"
+        }, 
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "pragma": "no-cache"
+        }, 
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:59 GMT"
+        }, 
+        {
+          "content-type": "image/gif"
+        }, 
+        {
+          "x-fb-debug": "egJridVr0Ohgw3QbFe66p8hTV/ZDa+ldtrrj55f1Dwg="
+        }
+      ]
+    }, 
+    {
+      "seqno": 38, 
+      "headers": [
+        {
+          "content-length": "43"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "x-fb-metrics": "{\"w\":15,\"r\":74,\"q\":0,\"a\":21}"
+        }, 
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        }, 
+        {
+          "x-fb-server": "10.164.212.85"
+        }, 
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "pragma": "no-cache"
+        }, 
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:59 GMT"
+        }, 
+        {
+          "content-type": "image/gif"
+        }, 
+        {
+          "x-fb-debug": "7JVbUHGoJcLzIbHgkJPv0DSBycKYYPPorUc0i6OdRw8="
+        }
+      ]
+    }, 
+    {
+      "seqno": 39, 
+      "headers": [
+        {
+          "content-length": "10334"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "x-fb-metrics": "{\"w\":33,\"r\":14,\"q\":0,\"a\":27}"
+        }, 
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        }, 
+        {
+          "x-fb-server": "10.164.203.85"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "pragma": "no-cache"
+        }, 
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:59 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }, 
+        {
+          "x-fb-debug": "SHFiC3r5rPZSoyQ6AT4o7Lrz58o2i0cRMRoLoKKAVLc="
+        }
+      ]
+    }, 
+    {
+      "seqno": 40, 
+      "headers": [
+        {
+          "content-length": "79019"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "x-fb-metrics": "{\"w\":47,\"r\":27,\"q\":0,\"a\":24}"
+        }, 
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        }, 
+        {
+          "x-fb-server": "10.164.121.55"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "pragma": "no-cache"
+        }, 
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:59 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }, 
+        {
+          "x-fb-debug": "B8TQ25HLrpUM+2nuhej+798G7ib2rXsLxKDRmmd6364="
+        }
+      ]
+    }, 
+    {
+      "seqno": 41, 
+      "headers": [
+        {
+          "content-length": "43"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 21 May 2013 19:18:35 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:05 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=17216856"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:59 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/gif"
+        }, 
+        {
+          "x-fb-debug": "q1YlNQFhUrIi0HF88gF/s47itTMC0ALVS2i6Xo/eSFQ="
+        }
+      ]
+    }, 
+    {
+      "seqno": 42, 
+      "headers": [
+        {
+          "content-length": "43"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 21 May 2013 19:18:34 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:20 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=17216855"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:59 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/gif"
+        }, 
+        {
+          "x-fb-debug": "OOKrpYeJ1K2euVWUg0h3X4OLDU+bPXAhHe2ZbKmaIIo="
+        }
+      ]
+    }, 
+    {
+      "seqno": 43, 
+      "headers": [
+        {
+          "content-length": "55530"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 03:07:27 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Sat, 27 Oct 2012 21:42:28 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31068989"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:58 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "BWYgCEbzeWyERD5oPP51t1mG+xnS0km1r6TZrds9BdY="
+        }
+      ]
+    }, 
+    {
+      "seqno": 44, 
+      "headers": [
+        {
+          "content-length": "67"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "x-fb-metrics": "{\"w\":47,\"r\":27,\"q\":0,\"a\":24}"
+        }, 
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        }, 
+        {
+          "x-fb-server": "10.164.121.55"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "pragma": "no-cache"
+        }, 
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:59 GMT"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "6DDnMStngO3Ec4qHVJLnouT/OjWIKWOh3p7X19lwA2E="
+        }
+      ]
+    }, 
+    {
+      "seqno": 45, 
+      "headers": [
+        {
+          "content-length": "67"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:59 GMT"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "DY+dO6Fs6HOjJLzXfO2vzcoACugopwtj+ZfSFe3+0Io="
+        }
+      ]
+    }, 
+    {
+      "seqno": 46, 
+      "headers": [
+        {
+          "content-length": "6332"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 15 Oct 2013 04:49:02 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Mon, 15 Oct 2012 01:19:28 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=29865483"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:50:59 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "U3t5ojZAXSlz/rftvVXMdi+dQaAlCxv95u4nFdmaOpU="
+        }
+      ]
+    }, 
+    {
+      "seqno": 47, 
+      "headers": [
+        {
+          "content-length": "1025"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 21 May 2013 19:18:34 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:19 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=17216854"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:00 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/gif"
+        }, 
+        {
+          "x-fb-debug": "WkN9kzT0IbJnmPVAe/JpiO1KA3sDm5JiLNu+peaU22E="
+        }
+      ]
+    }, 
+    {
+      "seqno": 48, 
+      "headers": [
+        {
+          "content-length": "7905"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Wed, 30 Oct 2013 13:12:25 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:38:51 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31191685"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:00 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "text/css; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "flUDwRXAcKGlCZV+B6xp1kix2zMM2jCaLr8GXWfOS9o="
+        }
+      ]
+    }, 
+    {
+      "seqno": 49, 
+      "headers": [
+        {
+          "content-length": "960"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Wed, 28 Aug 2013 14:36:20 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Thu, 07 Jun 2012 20:17:10 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=25753518"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:02 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "s2bSrOgSOrnc1I2Y+hCmZNjO4JKRAsJvvEShk7xvQh0="
+        }
+      ]
+    }, 
+    {
+      "seqno": 50, 
+      "headers": [
+        {
+          "content-length": "1421"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Wed, 28 Aug 2013 14:36:47 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Fri, 13 Jul 2012 13:05:49 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=25753545"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:02 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "dSqFMj3BQam7KrjoHsDUySNYx2e/ZA4jk+iLwQD5q+M="
+        }
+      ]
+    }, 
+    {
+      "seqno": 51, 
+      "headers": [
+        {
+          "content-length": "3977"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Wed, 30 Oct 2013 05:00:35 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Sat, 27 Oct 2012 21:41:38 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31162173"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:02 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "if1LyEGCEK6E/tHFIYqTdcReGf2YlH/8CNcvt0MSb5c="
+        }
+      ]
+    }, 
+    {
+      "seqno": 52, 
+      "headers": [
+        {
+          "content-length": "316"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 27 Aug 2013 03:46:29 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:03 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=25628126"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "0MQqsPt7SaQdEz9msJEk0wieC0zyyvfgvjy4gscfRm4="
+        }
+      ]
+    }, 
+    {
+      "seqno": 53, 
+      "headers": [
+        {
+          "content-length": "6779"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Wed, 09 May 2012 22:55:50 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 54, 
+      "headers": [
+        {
+          "content-length": "7899"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Mon, 14 May 2012 09:15:54 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 55, 
+      "headers": [
+        {
+          "content-length": "8961"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "expires": "Sat, 17 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "last-modified": "Fri, 10 Aug 2012 23:04:25 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 56, 
+      "headers": [
+        {
+          "content-length": "7270"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "expires": "Sat, 17 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "last-modified": "Thu, 17 May 2012 17:02:26 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 57, 
+      "headers": [
+        {
+          "content-length": "10284"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Fri, 14 Sep 2012 13:43:01 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 58, 
+      "headers": [
+        {
+          "content-length": "6932"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Tue, 15 May 2012 16:53:10 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 59, 
+      "headers": [
+        {
+          "content-length": "19404"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "expires": "Sat, 17 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "last-modified": "Fri, 13 Jul 2012 21:38:17 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 60, 
+      "headers": [
+        {
+          "content-length": "43"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "x-fb-metrics": "{\"w\":23,\"r\":24,\"q\":0,\"a\":31}"
+        }, 
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        }, 
+        {
+          "x-fb-server": "10.164.204.89"
+        }, 
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "pragma": "no-cache"
+        }, 
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:04 GMT"
+        }, 
+        {
+          "content-type": "image/gif"
+        }, 
+        {
+          "x-fb-debug": "mhzgPOTS+rD7XyjD1gp3zWldoiZpmeeyK0sWCXxCmL8="
+        }
+      ]
+    }, 
+    {
+      "seqno": 61, 
+      "headers": [
+        {
+          "content-length": "43"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "x-fb-metrics": "{\"w\":13,\"r\":137,\"q\":0,\"a\":23}"
+        }, 
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        }, 
+        {
+          "x-fb-server": "10.164.167.53"
+        }, 
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "pragma": "no-cache"
+        }, 
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:04 GMT"
+        }, 
+        {
+          "content-type": "image/gif"
+        }, 
+        {
+          "x-fb-debug": "uWC6Yw5Jjt8tp6GMW/0c7q4sQiyN+cfsFumyrajMSLE="
+        }
+      ]
+    }, 
+    {
+      "seqno": 62, 
+      "headers": [
+        {
+          "content-length": "10334"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "x-fb-metrics": "{\"w\":20,\"r\":43,\"q\":0,\"a\":30}"
+        }, 
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        }, 
+        {
+          "x-fb-server": "10.165.52.67"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "pragma": "no-cache"
+        }, 
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:04 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }, 
+        {
+          "x-fb-debug": "K6O9zzGnsjkFUcjVnvogKEp8WyYKDD5/1SRA3JOqTz8="
+        }
+      ]
+    }, 
+    {
+      "seqno": 63, 
+      "headers": [
+        {
+          "content-length": "79019"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "x-fb-metrics": "{\"w\":40,\"r\":33,\"q\":0,\"a\":22}"
+        }, 
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        }, 
+        {
+          "x-fb-server": "10.164.10.79"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "pragma": "no-cache"
+        }, 
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:04 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }, 
+        {
+          "x-fb-debug": "gU+KRCRWrUp+aETSVFA2+QqzJ57Mry5y8i9NZISRzV4="
+        }
+      ]
+    }, 
+    {
+      "seqno": 64, 
+      "headers": [
+        {
+          "content-length": "67"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "x-fb-metrics": "{\"w\":40,\"r\":33,\"q\":0,\"a\":22}"
+        }, 
+        {
+          "expires": "Thu, 1 Apr 2004 01:01:01 GMT"
+        }, 
+        {
+          "x-fb-server": "10.164.10.79"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "last-modified": "Thu, 1 Apr 2004 01:01:00 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "pragma": "no-cache"
+        }, 
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:04 GMT"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "2KYdrNd+vAjbaW2+l9lZ0c9qQnQQuLC0uV+aDWEfnEs="
+        }
+      ]
+    }, 
+    {
+      "seqno": 65, 
+      "headers": [
+        {
+          "content-length": "67"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:04 GMT"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "ltZY31wZe0x9jjXZ+/GQMCIZ6L+UzLcVFaj4Ye8cEag="
+        }
+      ]
+    }, 
+    {
+      "seqno": 66, 
+      "headers": [
+        {
+          "content-length": "32220"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Mon, 15 Oct 2012 15:37:08 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "content-type": "image/png"
+        }
+      ]
+    }, 
+    {
+      "seqno": 67, 
+      "headers": [
+        {
+          "content-length": "105703"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Mon, 15 Oct 2012 15:38:03 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "content-type": "image/png"
+        }
+      ]
+    }, 
+    {
+      "seqno": 68, 
+      "headers": [
+        {
+          "content-length": "36768"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Thu, 01 Nov 2012 01:55:42 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "content-type": "image/gif"
+        }
+      ]
+    }, 
+    {
+      "seqno": 69, 
+      "headers": [
+        {
+          "content-length": "119574"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Fri, 26 Oct 2012 09:41:12 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "content-type": "image/png"
+        }
+      ]
+    }, 
+    {
+      "seqno": 70, 
+      "headers": [
+        {
+          "content-length": "659"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Sat, 11 May 2013 07:12:06 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:22 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=16309260"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:06 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/x-icon"
+        }, 
+        {
+          "x-fb-debug": "yE8mx2kOMcI8Q4MtoKCXYAXv7xSMQBGufoB0y/qkYEs="
+        }
+      ]
+    }, 
+    {
+      "seqno": 71, 
+      "headers": [
+        {
+          "content-length": "6966"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "expires": "Sat, 17 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "last-modified": "Thu, 17 May 2012 16:26:06 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 72, 
+      "headers": [
+        {
+          "content-length": "4501"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Fri, 06 Jul 2012 11:36:45 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 73, 
+      "headers": [
+        {
+          "content-length": "37432"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Mon, 04 Jun 2012 08:35:52 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 74, 
+      "headers": [
+        {
+          "content-length": "7198"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Tue, 15 May 2012 16:45:13 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 75, 
+      "headers": [
+        {
+          "content-length": "13454"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Thu, 31 May 2012 01:48:38 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/png"
+        }
+      ]
+    }, 
+    {
+      "seqno": 76, 
+      "headers": [
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "transfer-encoding": "chunked"
+        }, 
+        {
+          "access-control-allow-credentials": "true"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "pragma": "no-cache"
+        }, 
+        {
+          "cache-control": "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:08 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "http://www.facebook.com"
+        }, 
+        {
+          "content-type": "application/json"
+        }
+      ]
+    }, 
+    {
+      "seqno": 77, 
+      "headers": [
+        {
+          "content-length": "19537"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "expires": "Sat, 17 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "last-modified": "Tue, 19 Jun 2012 08:51:27 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/png"
+        }
+      ]
+    }, 
+    {
+      "seqno": 78, 
+      "headers": [
+        {
+          "content-length": "5842"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Mon, 14 May 2012 22:03:47 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 79, 
+      "headers": [
+        {
+          "content-length": "6973"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Tue, 22 May 2012 23:26:43 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 80, 
+      "headers": [
+        {
+          "content-length": "7263"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Mon, 11 Jun 2012 21:11:11 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 81, 
+      "headers": [
+        {
+          "content-length": "6222"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "expires": "Sat, 17 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "last-modified": "Tue, 15 May 2012 02:10:10 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 82, 
+      "headers": [
+        {
+          "content-length": "8005"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Fri, 13 Jul 2012 02:50:27 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 83, 
+      "headers": [
+        {
+          "content-length": "7949"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Wed, 31 Oct 2012 17:25:30 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 84, 
+      "headers": [
+        {
+          "content-length": "5850"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Wed, 23 May 2012 13:04:05 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 85, 
+      "headers": [
+        {
+          "content-length": "4860"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Fri, 18 May 2012 06:59:13 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 86, 
+      "headers": [
+        {
+          "content-length": "36615"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Fri, 08 Jun 2012 09:18:35 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/png"
+        }
+      ]
+    }, 
+    {
+      "seqno": 87, 
+      "headers": [
+        {
+          "content-length": "26180"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Fri, 01 Jun 2012 12:58:28 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/png"
+        }
+      ]
+    }, 
+    {
+      "seqno": 88, 
+      "headers": [
+        {
+          "content-length": "8551"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Wed, 16 May 2012 00:19:20 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:10 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 89, 
+      "headers": [
+        {
+          "content-length": "7021"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Fri, 18 May 2012 08:58:03 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:10 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 90, 
+      "headers": [
+        {
+          "content-length": "8126"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Thu, 17 May 2012 10:31:00 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:10 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 91, 
+      "headers": [
+        {
+          "content-length": "21780"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Fri, 20 Jul 2012 20:43:14 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:10 GMT"
+        }, 
+        {
+          "content-type": "image/png"
+        }
+      ]
+    }, 
+    {
+      "seqno": 92, 
+      "headers": [
+        {
+          "content-length": "16109"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Fri, 08 Jun 2012 21:45:00 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/png"
+        }
+      ]
+    }, 
+    {
+      "seqno": 93, 
+      "headers": [
+        {
+          "content-length": "5248"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Tue, 15 May 2012 17:19:22 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 94, 
+      "headers": [
+        {
+          "content-length": "7600"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Tue, 15 May 2012 00:02:13 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 95, 
+      "headers": [
+        {
+          "content-length": "8148"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "expires": "Sat, 17 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "last-modified": "Tue, 04 Sep 2012 05:25:17 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 96, 
+      "headers": [
+        {
+          "content-length": "23688"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "expires": "Sat, 17 Nov 2012 12:51:10 GMT"
+        }, 
+        {
+          "last-modified": "Tue, 05 Jun 2012 16:58:56 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:10 GMT"
+        }, 
+        {
+          "content-type": "image/png"
+        }
+      ]
+    }, 
+    {
+      "seqno": 97, 
+      "headers": [
+        {
+          "content-length": "32579"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Fri, 15 Jun 2012 23:21:31 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/png"
+        }
+      ]
+    }, 
+    {
+      "seqno": 98, 
+      "headers": [
+        {
+          "content-length": "36154"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Tue, 15 May 2012 16:53:04 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/png"
+        }
+      ]
+    }, 
+    {
+      "seqno": 99, 
+      "headers": [
+        {
+          "content-length": "8261"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Thu, 17 May 2012 16:15:19 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/jpeg"
+        }
+      ]
+    }, 
+    {
+      "seqno": 100, 
+      "headers": [
+        {
+          "content-length": "34603"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "expires": "Sat, 17 Nov 2012 12:51:03 GMT"
+        }, 
+        {
+          "last-modified": "Tue, 05 Jun 2012 19:33:30 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/png"
+        }
+      ]
+    }, 
+    {
+      "seqno": 101, 
+      "headers": [
+        {
+          "content-length": "19320"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "accept-ranges": "bytes"
+        }, 
+        {
+          "last-modified": "Fri, 20 Jul 2012 22:33:10 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "max-age=1209600"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:09 GMT"
+        }, 
+        {
+          "content-type": "image/png"
+        }
+      ]
+    }, 
+    {
+      "seqno": 102, 
+      "headers": [
+        {
+          "content-length": "1589"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Wed, 30 Oct 2013 13:08:05 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Sat, 27 Oct 2012 21:59:56 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31191410"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:15 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "text/css; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "cEr4CpqyPlutZEM5egM7EW1V/FoNLas8puqhILOyn6g="
+        }
+      ]
+    }, 
+    {
+      "seqno": 103, 
+      "headers": [
+        {
+          "content-length": "124"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 27 Aug 2013 05:04:30 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:34 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=25632795"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:15 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "SjbWzWIhc5uDeUgKzkah4oVawEfOfsqgn79tJvLiODA="
+        }
+      ]
+    }, 
+    {
+      "seqno": 104, 
+      "headers": [
+        {
+          "content-length": "178"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "expires": "Tue, 27 Aug 2013 06:45:13 GMT"
+        }, 
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:02:59 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          "cache-control": "public, max-age=25638838"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:15 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "8BYYADIiLWZPRqrmghOTJnnu5b75InjLJYums29XQC4="
+        }
+      ]
+    }, 
+    {
+      "seqno": 105, 
+      "headers": [
+        {
+          "content-length": "3403"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 11:39:02 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Fri, 26 Oct 2012 21:42:07 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31099667"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:15 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "rg/3x10ePyW5+Yv14okaeMgQpdIDitUpRdeQlHd62wU="
+        }
+      ]
+    }, 
+    {
+      "seqno": 106, 
+      "headers": [
+        {
+          "content-length": "3794"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 09:12:42 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:11:34 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31090886"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:16 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "+G0d7Y1/nAK76h5l1ygZcgFyqkHdYYjzu9bN8TThTW0="
+        }
+      ]
+    }, 
+    {
+      "seqno": 107, 
+      "headers": [
+        {
+          "content-length": "4316"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Wed, 30 Oct 2013 13:08:38 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Thu, 27 Sep 2012 22:19:28 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31191442"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:16 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "Zx9+0hICgorbmj40+TVQqx/6DWk0JFijw5sOouOK4x8="
+        }
+      ]
+    }, 
+    {
+      "seqno": 108, 
+      "headers": [
+        {
+          "content-length": "82"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 27 Aug 2013 03:46:37 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:02:59 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=25628121"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:16 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "y9gp03qLmGwdrjrggsFyxKUnduRuH6ZkhHy3J217wnA="
+        }
+      ]
+    }, 
+    {
+      "seqno": 109, 
+      "headers": [
+        {
+          "content-length": "281"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 27 Aug 2013 03:46:43 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Thu, 12 Apr 2012 03:03:15 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=25628127"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:16 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "y31IzOtXz6QEqDb4Yh8nL9E7Jz3QdrtFTVTfJpFI67s="
+        }
+      ]
+    }, 
+    {
+      "seqno": 110, 
+      "headers": [
+        {
+          "content-length": "18581"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 03:07:15 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:07:48 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31068960"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:15 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "cdKo7nf6SbFgEUsu8p8ZpYkyd14IkSsYwu8pEpjIPW8="
+        }
+      ]
+    }, 
+    {
+      "seqno": 111, 
+      "headers": [
+        {
+          "content-length": "686"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 02:40:01 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 21:28:22 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31067324"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:17 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "text/css; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "Mcoj0fymAm3BWRvLoE9uVgrJkXk8Wldn9hUKly6PE60="
+        }
+      ]
+    }, 
+    {
+      "seqno": 112, 
+      "headers": [
+        {
+          "content-length": "70824"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 29 Oct 2013 16:43:30 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Sun, 28 Oct 2012 14:35:10 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31117935"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:15 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "image/png"
+        }, 
+        {
+          "x-fb-debug": "U6CnJQe7lFM5/wvYBRcEyvixo284qs3dxFI4vIJ3Sfo="
+        }
+      ]
+    }, 
+    {
+      "seqno": 113, 
+      "headers": [
+        {
+          "content-length": "6953"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 06 Nov 2012 13:10:12 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Mon, 29 Oct 2012 18:56:50 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=260332"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:20 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-shockwave-flash"
+        }, 
+        {
+          "x-fb-debug": "8ROXKJ/K5IoNZG3RcJoN8LoohKyoDW2iTe6nY9hRINI="
+        }
+      ]
+    }, 
+    {
+      "seqno": 114, 
+      "headers": [
+        {
+          "content-length": "6953"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Tue, 06 Nov 2012 13:10:12 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Mon, 29 Oct 2012 18:56:50 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=260331"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:21 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-shockwave-flash"
+        }, 
+        {
+          "x-fb-debug": "8ROXKJ/K5IoNZG3RcJoN8LoohKyoDW2iTe6nY9hRINI="
+        }
+      ]
+    }, 
+    {
+      "seqno": 115, 
+      "headers": [
+        {
+          "content-length": "15685"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Thu, 31 Oct 2013 19:03:10 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Tue, 30 Oct 2012 17:45:29 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=31299110"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:20 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "casrvtlqM38DGgUK+sC64wYFWqXchCM2wnMjgM8VC98="
+        }
+      ]
+    }, 
+    {
+      "seqno": 116, 
+      "headers": [
+        {
+          "content-length": "1591"
+        }, 
+        {
+          "x-content-type-options": "nosniff"
+        }, 
+        {
+          "content-encoding": "gzip"
+        }, 
+        {
+          "expires": "Wed, 02 Oct 2013 14:15:24 GMT"
+        }, 
+        {
+          "vary": "Accept-Encoding"
+        }, 
+        {
+          "x-cnection": "close"
+        }, 
+        {
+          "last-modified": "Thu, 20 Sep 2012 01:12:35 GMT"
+        }, 
+        {
+          "connection": "keep-alive"
+        }, 
+        {
+          ":status": "200"
+        }, 
+        {
+          "cache-control": "public, max-age=28776235"
+        }, 
+        {
+          "date": "Sat, 03 Nov 2012 12:51:29 GMT"
+        }, 
+        {
+          "access-control-allow-origin": "*"
+        }, 
+        {
+          "content-type": "application/x-javascript; charset=utf-8"
+        }, 
+        {
+          "x-fb-debug": "E9XqLqcAPtaMWK+vlxTTyhNPMewUq9nSCKax+m9KMwk="
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/jetty-http2/http2-hpack/src/test/resources/jetty-logging.properties b/jetty-http2/http2-hpack/src/test/resources/jetty-logging.properties
new file mode 100644
index 0000000..e40e8e4
--- /dev/null
+++ b/jetty-http2/http2-hpack/src/test/resources/jetty-logging.properties
@@ -0,0 +1,3 @@
+org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
+org.eclipse.jetty.http2.LEVEL=INFO
+org.eclipse.jetty.http2.hpack.LEVEL=INFO
diff --git a/jetty-http2/http2-http-client-transport/pom.xml b/jetty-http2/http2-http-client-transport/pom.xml
new file mode 100644
index 0000000..db8bcd3
--- /dev/null
+++ b/jetty-http2/http2-http-client-transport/pom.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.eclipse.jetty.http2</groupId>
+        <artifactId>http2-parent</artifactId>
+        <version>9.3.6-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>http2-http-client-transport</artifactId>
+    <name>Jetty :: HTTP2 :: HTTP Client Transport</name>
+
+    <properties>
+        <bundle-symbolic-name>${project.groupId}.client.http</bundle-symbolic-name>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>copy</goal>
+                        </goals>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>org.mortbay.jetty.alpn</groupId>
+                                    <artifactId>alpn-boot</artifactId>
+                                    <version>${alpn.version}</version>
+                                    <type>jar</type>
+                                    <overWrite>false</overWrite>
+                                    <outputDirectory>${project.build.directory}/alpn</outputDirectory>
+                                </artifactItem>
+                            </artifactItems>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <argLine>-Xbootclasspath/p:${project.build.directory}/alpn/alpn-boot-${alpn.version}.jar</argLine>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-client</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty.http2</groupId>
+            <artifactId>http2-client</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpChannelOverHTTP2.java b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpChannelOverHTTP2.java
new file mode 100644
index 0000000..72223e2
--- /dev/null
+++ b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpChannelOverHTTP2.java
@@ -0,0 +1,88 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client.http;
+
+import org.eclipse.jetty.client.HttpChannel;
+import org.eclipse.jetty.client.HttpDestination;
+import org.eclipse.jetty.client.HttpExchange;
+import org.eclipse.jetty.client.HttpReceiver;
+import org.eclipse.jetty.client.HttpSender;
+import org.eclipse.jetty.client.api.Result;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+
+public class HttpChannelOverHTTP2 extends HttpChannel
+{
+    private final HttpConnectionOverHTTP2 connection;
+    private final Session session;
+    private final HttpSenderOverHTTP2 sender;
+    private final HttpReceiverOverHTTP2 receiver;
+
+    public HttpChannelOverHTTP2(HttpDestination destination, HttpConnectionOverHTTP2 connection, Session session)
+    {
+        super(destination);
+        this.connection = connection;
+        this.session = session;
+        this.sender = new HttpSenderOverHTTP2(this);
+        this.receiver = new HttpReceiverOverHTTP2(this);
+    }
+
+    public Session getSession()
+    {
+        return session;
+    }
+
+    public Stream.Listener getStreamListener()
+    {
+        return receiver;
+    }
+
+    @Override
+    protected HttpSender getHttpSender()
+    {
+        return sender;
+    }
+
+    @Override
+    protected HttpReceiver getHttpReceiver()
+    {
+        return receiver;
+    }
+
+    @Override
+    public void send()
+    {
+        HttpExchange exchange = getHttpExchange();
+        if (exchange != null)
+            sender.send(exchange);
+    }
+
+    @Override
+    public void release()
+    {
+        connection.release(this);
+    }
+
+    @Override
+    public void exchangeTerminated(HttpExchange exchange, Result result)
+    {
+        super.exchangeTerminated(exchange, result);
+        release();
+    }
+}
diff --git a/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpClientTransportOverHTTP2.java b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpClientTransportOverHTTP2.java
new file mode 100644
index 0000000..ea16c18
--- /dev/null
+++ b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpClientTransportOverHTTP2.java
@@ -0,0 +1,157 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client.http;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.util.Map;
+
+import org.eclipse.jetty.alpn.client.ALPNClientConnectionFactory;
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.HttpClientTransport;
+import org.eclipse.jetty.client.HttpDestination;
+import org.eclipse.jetty.client.Origin;
+import org.eclipse.jetty.client.api.Connection;
+import org.eclipse.jetty.http.HttpScheme;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.client.HTTP2Client;
+import org.eclipse.jetty.http2.client.HTTP2ClientConnectionFactory;
+import org.eclipse.jetty.io.ClientConnectionFactory;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.ssl.SslClientConnectionFactory;
+import org.eclipse.jetty.util.Promise;
+import org.eclipse.jetty.util.annotation.ManagedAttribute;
+import org.eclipse.jetty.util.annotation.ManagedObject;
+import org.eclipse.jetty.util.component.ContainerLifeCycle;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+
+@ManagedObject("The HTTP/2 client transport")
+public class HttpClientTransportOverHTTP2 extends ContainerLifeCycle implements HttpClientTransport
+{
+    private final HTTP2Client client;
+    private ClientConnectionFactory connectionFactory;
+    private HttpClient httpClient;
+
+    public HttpClientTransportOverHTTP2(HTTP2Client client)
+    {
+        this.client = client;
+    }
+
+    @ManagedAttribute(value = "The number of selectors", readonly = true)
+    public int getSelectors()
+    {
+        return client.getSelectors();
+    }
+
+    @Override
+    protected void doStart() throws Exception
+    {
+        if (!client.isStarted())
+        {
+            client.setExecutor(httpClient.getExecutor());
+            client.setScheduler(httpClient.getScheduler());
+            client.setByteBufferPool(httpClient.getByteBufferPool());
+            client.setConnectTimeout(httpClient.getConnectTimeout());
+            client.setIdleTimeout(httpClient.getIdleTimeout());
+        }
+        addBean(client);
+        super.doStart();
+
+        this.connectionFactory = new HTTP2ClientConnectionFactory();
+        client.setClientConnectionFactory((endPoint, context) ->
+        {
+            HttpDestination destination = (HttpDestination)context.get(HTTP_DESTINATION_CONTEXT_KEY);
+            return destination.getClientConnectionFactory().newConnection(endPoint, context);
+        });
+    }
+
+    @Override
+    protected void doStop() throws Exception
+    {
+        super.doStop();
+        removeBean(client);
+    }
+
+    @Override
+    public void setHttpClient(HttpClient client)
+    {
+        httpClient = client;
+    }
+
+    @Override
+    public HttpDestination newHttpDestination(Origin origin)
+    {
+        return new HttpDestinationOverHTTP2(httpClient, origin);
+    }
+
+    @Override
+    public void connect(InetSocketAddress address, Map<String, Object> context)
+    {
+        client.setConnectTimeout(httpClient.getConnectTimeout());
+
+        final HttpDestination destination = (HttpDestination)context.get(HTTP_DESTINATION_CONTEXT_KEY);
+        @SuppressWarnings("unchecked")
+        final Promise<Connection> connection = (Promise<Connection>)context.get(HTTP_CONNECTION_PROMISE_CONTEXT_KEY);
+
+        Session.Listener listener = new Session.Listener.Adapter()
+        {
+            @Override
+            public void onFailure(Session session, Throwable failure)
+            {
+                destination.abort(failure);
+            }
+        };
+
+        final Promise<Session> promise = new Promise<Session>()
+        {
+            @Override
+            public void succeeded(Session session)
+            {
+                connection.succeeded(newHttpConnection(destination, session));
+            }
+
+            @Override
+            public void failed(Throwable failure)
+            {
+                connection.failed(failure);
+            }
+        };
+
+        SslContextFactory sslContextFactory = null;
+        if (HttpScheme.HTTPS.is(destination.getScheme()))
+            sslContextFactory = httpClient.getSslContextFactory();
+
+        client.connect(sslContextFactory, address, listener, promise, context);
+    }
+
+    @Override
+    public org.eclipse.jetty.io.Connection newConnection(EndPoint endPoint, Map<String, Object> context) throws IOException
+    {
+        ClientConnectionFactory factory = connectionFactory;
+        SslContextFactory sslContextFactory = (SslContextFactory)context.get(SslClientConnectionFactory.SSL_CONTEXT_FACTORY_CONTEXT_KEY);
+        if (sslContextFactory != null)
+            factory = new ALPNClientConnectionFactory(client.getExecutor(), factory, client.getProtocols());
+        return factory.newConnection(endPoint, context);
+    }
+
+    protected HttpConnectionOverHTTP2 newHttpConnection(HttpDestination destination, Session session)
+    {
+        return new HttpConnectionOverHTTP2(destination, session);
+    }
+}
diff --git a/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpConnectionOverHTTP2.java b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpConnectionOverHTTP2.java
new file mode 100644
index 0000000..0ad973f
--- /dev/null
+++ b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpConnectionOverHTTP2.java
@@ -0,0 +1,82 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client.http;
+
+import java.nio.channels.AsynchronousCloseException;
+import java.util.Set;
+
+import org.eclipse.jetty.client.HttpChannel;
+import org.eclipse.jetty.client.HttpConnection;
+import org.eclipse.jetty.client.HttpDestination;
+import org.eclipse.jetty.client.HttpExchange;
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.ConcurrentHashSet;
+
+public class HttpConnectionOverHTTP2 extends HttpConnection
+{
+    private final Set<HttpChannel> channels = new ConcurrentHashSet<>();
+    private final Session session;
+
+    public HttpConnectionOverHTTP2(HttpDestination destination, Session session)
+    {
+        super(destination);
+        this.session = session;
+    }
+
+    @Override
+    protected void send(HttpExchange exchange)
+    {
+        normalizeRequest(exchange.getRequest());
+        // One connection maps to N channels, so for each exchange we create a new channel.
+        HttpChannel channel = new HttpChannelOverHTTP2(getHttpDestination(), this, session);
+        channels.add(channel);
+        if (channel.associate(exchange))
+            channel.send();
+        else
+            channel.release();
+    }
+
+    protected void release(HttpChannel channel)
+    {
+        channels.remove(channel);
+    }
+
+    @Override
+    public void close()
+    {
+        // First close then abort, to be sure that the connection cannot be reused
+        // from an onFailure() handler or by blocking code waiting for completion.
+        getHttpDestination().close(this);
+        session.close(ErrorCode.NO_ERROR.code, null, Callback.NOOP);
+        abort(new AsynchronousCloseException());
+    }
+
+    private void abort(Throwable failure)
+    {
+        for (HttpChannel channel : channels)
+        {
+            HttpExchange exchange = channel.getHttpExchange();
+            if (exchange != null)
+                exchange.getRequest().abort(failure);
+        }
+        channels.clear();
+    }
+}
diff --git a/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpDestinationOverHTTP2.java b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpDestinationOverHTTP2.java
new file mode 100644
index 0000000..b83d523
--- /dev/null
+++ b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpDestinationOverHTTP2.java
@@ -0,0 +1,38 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client.http;
+
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.HttpExchange;
+import org.eclipse.jetty.client.MultiplexHttpDestination;
+import org.eclipse.jetty.client.Origin;
+
+public class HttpDestinationOverHTTP2 extends MultiplexHttpDestination<HttpConnectionOverHTTP2>
+{
+    public HttpDestinationOverHTTP2(HttpClient client, Origin origin)
+    {
+        super(client, origin);
+    }
+
+    @Override
+    protected void send(HttpConnectionOverHTTP2 connection, HttpExchange exchange)
+    {
+        connection.send(exchange);
+    }
+}
diff --git a/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpReceiverOverHTTP2.java b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpReceiverOverHTTP2.java
new file mode 100644
index 0000000..e473fa9
--- /dev/null
+++ b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpReceiverOverHTTP2.java
@@ -0,0 +1,118 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client.http;
+
+import java.io.IOException;
+
+import org.eclipse.jetty.client.HttpChannel;
+import org.eclipse.jetty.client.HttpExchange;
+import org.eclipse.jetty.client.HttpReceiver;
+import org.eclipse.jetty.client.HttpResponse;
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PushPromiseFrame;
+import org.eclipse.jetty.http2.frames.ResetFrame;
+import org.eclipse.jetty.util.Callback;
+
+public class HttpReceiverOverHTTP2 extends HttpReceiver implements Stream.Listener
+{
+    public HttpReceiverOverHTTP2(HttpChannel channel)
+    {
+        super(channel);
+    }
+
+    @Override
+    protected HttpChannelOverHTTP2 getHttpChannel()
+    {
+        return (HttpChannelOverHTTP2)super.getHttpChannel();
+    }
+
+    @Override
+    public void onHeaders(Stream stream, HeadersFrame frame)
+    {
+        HttpExchange exchange = getHttpExchange();
+        if (exchange == null)
+            return;
+
+        HttpResponse response = exchange.getResponse();
+        MetaData.Response metaData = (MetaData.Response)frame.getMetaData();
+        response.version(metaData.getVersion()).status(metaData.getStatus()).reason(metaData.getReason());
+
+        if (responseBegin(exchange))
+        {
+            HttpFields headers = metaData.getFields();
+            for (HttpField header : headers)
+            {
+                if (!responseHeader(exchange, header))
+                    return;
+            }
+
+            if (responseHeaders(exchange))
+            {
+                if (frame.isEndStream())
+                    responseSuccess(exchange);
+            }
+        }
+    }
+
+    @Override
+    public Stream.Listener onPush(Stream stream, PushPromiseFrame frame)
+    {
+        // Not supported.
+        stream.reset(new ResetFrame(stream.getId(), ErrorCode.REFUSED_STREAM_ERROR.code), Callback.NOOP);
+        return null;
+    }
+
+    @Override
+    public void onData(Stream stream, DataFrame frame, Callback callback)
+    {
+        HttpExchange exchange = getHttpExchange();
+        if (exchange == null)
+            return;
+
+        if (responseContent(exchange, frame.getData(), callback))
+        {
+            if (frame.isEndStream())
+                responseSuccess(exchange);
+        }
+    }
+
+    @Override
+    public void onReset(Stream stream, ResetFrame frame)
+    {
+        HttpExchange exchange = getHttpExchange();
+        if (exchange == null)
+            return;
+
+        ErrorCode error = ErrorCode.from(frame.getError());
+        String reason = error == null ? "reset" : error.name().toLowerCase();
+        exchange.getRequest().abort(new IOException(reason));
+    }
+
+    @Override
+    public void onTimeout(Stream stream, Throwable failure)
+    {
+        responseFailure(failure);
+    }
+}
diff --git a/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpSenderOverHTTP2.java b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpSenderOverHTTP2.java
new file mode 100644
index 0000000..a4cfaae
--- /dev/null
+++ b/jetty-http2/http2-http-client-transport/src/main/java/org/eclipse/jetty/http2/client/http/HttpSenderOverHTTP2.java
@@ -0,0 +1,109 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client.http;
+
+import org.eclipse.jetty.client.HttpContent;
+import org.eclipse.jetty.client.HttpExchange;
+import org.eclipse.jetty.client.HttpSender;
+import org.eclipse.jetty.client.api.Request;
+import org.eclipse.jetty.http.HttpURI;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.Promise;
+
+public class HttpSenderOverHTTP2 extends HttpSender
+{
+    private Stream stream;
+
+    public HttpSenderOverHTTP2(HttpChannelOverHTTP2 channel)
+    {
+        super(channel);
+    }
+
+    @Override
+    protected HttpChannelOverHTTP2 getHttpChannel()
+    {
+        return (HttpChannelOverHTTP2)super.getHttpChannel();
+    }
+
+    @Override
+    protected void sendHeaders(HttpExchange exchange, final HttpContent content, final Callback callback)
+    {
+        final Request request = exchange.getRequest();
+        HttpURI uri = new HttpURI(request.getScheme(), request.getHost(), request.getPort(), request.getPath(), null, request.getQuery(), null);
+        MetaData.Request metaData = new MetaData.Request(request.getMethod(), uri, HttpVersion.HTTP_2, request.getHeaders());
+        HeadersFrame headersFrame = new HeadersFrame(metaData, null, !content.hasContent());
+        HttpChannelOverHTTP2 channel = getHttpChannel();
+        Promise<Stream> promise = new Promise<Stream>()
+        {
+            @Override
+            public void succeeded(Stream stream)
+            {
+                HttpSenderOverHTTP2.this.stream = stream;
+                stream.setIdleTimeout(request.getIdleTimeout());
+
+                if (content.hasContent() && !expects100Continue(request))
+                {
+                    boolean advanced = content.advance();
+                    boolean lastContent = content.isLast();
+                    if (advanced || lastContent)
+                    {
+                        DataFrame dataFrame = new DataFrame(stream.getId(), content.getByteBuffer(), lastContent);
+                        stream.data(dataFrame, callback);
+                        return;
+                    }
+                }
+                callback.succeeded();
+            }
+
+            @Override
+            public void failed(Throwable failure)
+            {
+                callback.failed(failure);
+            }
+        };
+        // TODO optimize the send of HEADERS and DATA frames.
+        channel.getSession().newStream(headersFrame, promise, channel.getStreamListener());
+    }
+
+    @Override
+    protected void sendContent(HttpExchange exchange, HttpContent content, Callback callback)
+    {
+        if (content.isConsumed())
+        {
+            callback.succeeded();
+        }
+        else
+        {
+            DataFrame frame = new DataFrame(stream.getId(), content.getByteBuffer(), content.isLast());
+            stream.data(frame, callback);
+        }
+    }
+
+    @Override
+    protected void reset()
+    {
+        super.reset();
+        stream = null;
+    }
+}
diff --git a/jetty-http2/http2-http-client-transport/src/test/java/org/eclipse/jetty/http2/client/http/HttpClientTransportOverHTTP2Test.java b/jetty-http2/http2-http-client-transport/src/test/java/org/eclipse/jetty/http2/client/http/HttpClientTransportOverHTTP2Test.java
new file mode 100644
index 0000000..7a061ec
--- /dev/null
+++ b/jetty-http2/http2-http-client-transport/src/test/java/org/eclipse/jetty/http2/client/http/HttpClientTransportOverHTTP2Test.java
@@ -0,0 +1,78 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.client.http;
+
+import java.util.concurrent.Executor;
+
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.http2.client.HTTP2Client;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class HttpClientTransportOverHTTP2Test
+{
+    @Test
+    public void testPropertiesAreForwarded() throws Exception
+    {
+        HTTP2Client http2Client = new HTTP2Client();
+        HttpClient httpClient = new HttpClient(new HttpClientTransportOverHTTP2(http2Client), null);
+        Executor executor = new QueuedThreadPool();
+        httpClient.setExecutor(executor);
+        httpClient.setConnectTimeout(13);
+        httpClient.setIdleTimeout(17);
+
+        httpClient.start();
+
+        Assert.assertTrue(http2Client.isStarted());
+        Assert.assertSame(httpClient.getExecutor(), http2Client.getExecutor());
+        Assert.assertSame(httpClient.getScheduler(), http2Client.getScheduler());
+        Assert.assertSame(httpClient.getByteBufferPool(), http2Client.getByteBufferPool());
+        Assert.assertEquals(httpClient.getConnectTimeout(), http2Client.getConnectTimeout());
+        Assert.assertEquals(httpClient.getIdleTimeout(), http2Client.getIdleTimeout());
+
+        httpClient.stop();
+
+        Assert.assertTrue(http2Client.isStopped());
+    }
+
+    @Ignore
+    @Test
+    public void testExternalServer() throws Exception
+    {
+        HTTP2Client http2Client = new HTTP2Client();
+        SslContextFactory sslContextFactory = new SslContextFactory();
+        HttpClient httpClient = new HttpClient(new HttpClientTransportOverHTTP2(http2Client), sslContextFactory);
+        Executor executor = new QueuedThreadPool();
+        httpClient.setExecutor(executor);
+
+        httpClient.start();
+
+//        ContentResponse response = httpClient.GET("https://http2.akamai.com/");
+        ContentResponse response = httpClient.GET("https://webtide.com/");
+
+        Assert.assertEquals(HttpStatus.OK_200, response.getStatus());
+
+        httpClient.stop();
+    }
+}
diff --git a/jetty-http2/http2-http-client-transport/src/test/resources/jetty-logging.properties b/jetty-http2/http2-http-client-transport/src/test/resources/jetty-logging.properties
new file mode 100644
index 0000000..287d283
--- /dev/null
+++ b/jetty-http2/http2-http-client-transport/src/test/resources/jetty-logging.properties
@@ -0,0 +1,5 @@
+org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
+#org.eclipse.jetty.client.LEVEL=DEBUG
+org.eclipse.jetty.http2.hpack.LEVEL=INFO
+#org.eclipse.jetty.http2.LEVEL=DEBUG
+#org.eclipse.jetty.io.ssl.LEVEL=DEBUG
diff --git a/jetty-http2/http2-server/pom.xml b/jetty-http2/http2-server/pom.xml
new file mode 100644
index 0000000..b24322a
--- /dev/null
+++ b/jetty-http2/http2-server/pom.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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/xsd/maven-4.0.0.xsd">
+  <parent>
+    <groupId>org.eclipse.jetty.http2</groupId>
+    <artifactId>http2-parent</artifactId>
+    <version>9.3.6-SNAPSHOT</version>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>http2-server</artifactId>
+  <name>Jetty :: HTTP2 :: Server</name>
+
+ <properties>
+    <bundle-symbolic-name>${project.groupId}.server</bundle-symbolic-name>
+  </properties>
+
+  <build>
+    <plugins>
+    </plugins>
+  </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.eclipse.jetty.http2</groupId>
+            <artifactId>http2-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-server</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty.alpn</groupId>
+            <artifactId>alpn-api</artifactId>
+            <version>${alpn.api.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-servlet</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-servlets</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-alpn-server</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty.toolchain</groupId>
+            <artifactId>jetty-test-helper</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/jetty-http2/http2-server/src/main/config/etc/jetty-http2.xml b/jetty-http2/http2-server/src/main/config/etc/jetty-http2.xml
new file mode 100644
index 0000000..b23f25b
--- /dev/null
+++ b/jetty-http2/http2-server/src/main/config/etc/jetty-http2.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<!-- ============================================================= -->
+<!-- Configure a HTTP2 on the ssl connector.                       -->
+<!-- ============================================================= -->
+<Configure id="sslConnector" class="org.eclipse.jetty.server.ServerConnector">
+  <Call name="addConnectionFactory">
+    <Arg>
+      <New class="org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory">
+        <Arg name="config"><Ref refid="sslHttpConfig"/></Arg>
+        <Set name="maxConcurrentStreams"><Property name="jetty.http2.maxConcurrentStreams" deprecated="http2.maxConcurrentStreams" default="1024"/></Set>
+        <Set name="initialStreamSendWindow"><Property name="jetty.http2.initialStreamSendWindow" default="65535"/></Set>
+      </New>
+    </Arg>
+  </Call>
+
+  <Ref refid="sslContextFactory">
+    <Set name="CipherComparator">
+      <Get class="org.eclipse.jetty.http2.HTTP2Cipher" name="COMPARATOR"/>
+    </Set>
+    <Set name="useCipherSuitesOrder">true</Set>
+  </Ref>
+
+</Configure>
+
diff --git a/jetty-http2/http2-server/src/main/config/etc/jetty-http2c.xml b/jetty-http2/http2-server/src/main/config/etc/jetty-http2c.xml
new file mode 100644
index 0000000..ccd3af1
--- /dev/null
+++ b/jetty-http2/http2-server/src/main/config/etc/jetty-http2c.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<!-- ============================================================= -->
+<!-- Configure a HTTP2 on the ssl connector.                       -->
+<!-- ============================================================= -->
+<Configure id="httpConnector" class="org.eclipse.jetty.server.ServerConnector">
+  <Call name="addConnectionFactory">
+    <Arg>
+      <New class="org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory">
+        <Arg name="config"><Ref refid="httpConfig"/></Arg>
+        <Set name="maxConcurrentStreams"><Property name="jetty.http2c.maxConcurrentStreams" deprecated="http2.maxConcurrentStreams" default="1024"/></Set>
+        <Set name="initialStreamSendWindow"><Property name="jetty.http2c.initialStreamSendWindow" default="65535"/></Set>
+      </New>
+    </Arg>
+  </Call>
+</Configure>
+
diff --git a/jetty-http2/http2-server/src/main/config/modules/http2.mod b/jetty-http2/http2-server/src/main/config/modules/http2.mod
new file mode 100644
index 0000000..585c1fa
--- /dev/null
+++ b/jetty-http2/http2-server/src/main/config/modules/http2.mod
@@ -0,0 +1,20 @@
+#
+# HTTP2 Support Module
+#
+
+[depend]
+ssl
+alpn
+
+[lib]
+lib/http2/*.jar
+
+[xml]
+etc/jetty-http2.xml
+
+[ini-template]
+## Max number of concurrent streams per connection
+# jetty.http2.maxConcurrentStreams=1024
+
+## Initial stream send (server to client) window
+# jetty.http2.initialStreamSendWindow=65535
diff --git a/jetty-http2/http2-server/src/main/config/modules/http2c.mod b/jetty-http2/http2-server/src/main/config/modules/http2c.mod
new file mode 100644
index 0000000..1c78016
--- /dev/null
+++ b/jetty-http2/http2-server/src/main/config/modules/http2c.mod
@@ -0,0 +1,22 @@
+#
+# HTTP2 Clear Text Support Module
+# This module adds support for HTTP/2 clear text to the
+# HTTP/1 clear text connector (defined in jetty-http.xml).
+# The resulting connector will accept both HTTP/1 and HTTP/2 connections.
+#
+
+[depend]
+http
+
+[lib]
+lib/http2/*.jar
+
+[xml]
+etc/jetty-http2c.xml
+
+[ini-template]
+## Max number of concurrent streams per connection
+# jetty.http2c.maxConcurrentStreams=1024
+
+## Initial stream send (server to client) window
+# jetty.http2c.initialStreamSendWindow=65535
diff --git a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/AbstractHTTP2ServerConnectionFactory.java b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/AbstractHTTP2ServerConnectionFactory.java
new file mode 100644
index 0000000..f625aaa
--- /dev/null
+++ b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/AbstractHTTP2ServerConnectionFactory.java
@@ -0,0 +1,134 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.server;
+
+import java.util.Objects;
+
+import org.eclipse.jetty.http2.BufferingFlowControlStrategy;
+import org.eclipse.jetty.http2.FlowControlStrategy;
+import org.eclipse.jetty.http2.HTTP2Connection;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.generator.Generator;
+import org.eclipse.jetty.http2.parser.ServerParser;
+import org.eclipse.jetty.io.Connection;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.server.AbstractConnectionFactory;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.util.annotation.Name;
+
+public abstract class AbstractHTTP2ServerConnectionFactory extends AbstractConnectionFactory
+{
+    private int maxDynamicTableSize = 4096;
+    private int initialStreamSendWindow = FlowControlStrategy.DEFAULT_WINDOW_SIZE;
+    private int maxConcurrentStreams = -1;
+    private int maxHeaderBlockFragment = 0;
+    private final HttpConfiguration httpConfiguration;
+
+    public AbstractHTTP2ServerConnectionFactory(@Name("config") HttpConfiguration httpConfiguration)
+    {
+        this(httpConfiguration,"h2","h2-17","h2-16","h2-15","h2-14");
+    }
+
+    protected AbstractHTTP2ServerConnectionFactory(@Name("config") HttpConfiguration httpConfiguration, String... protocols)
+    {
+        super(protocols);
+        this.httpConfiguration = Objects.requireNonNull(httpConfiguration);
+    }
+
+    public int getMaxDynamicTableSize()
+    {
+        return maxDynamicTableSize;
+    }
+
+    public void setMaxDynamicTableSize(int maxDynamicTableSize)
+    {
+        this.maxDynamicTableSize = maxDynamicTableSize;
+    }
+
+    public int getInitialStreamSendWindow()
+    {
+        return initialStreamSendWindow;
+    }
+
+    public void setInitialStreamSendWindow(int initialStreamSendWindow)
+    {
+        this.initialStreamSendWindow = initialStreamSendWindow;
+    }
+
+    public int getMaxConcurrentStreams()
+    {
+        return maxConcurrentStreams;
+    }
+
+    public void setMaxConcurrentStreams(int maxConcurrentStreams)
+    {
+        this.maxConcurrentStreams = maxConcurrentStreams;
+    }
+
+    public int getMaxHeaderBlockFragment()
+    {
+        return maxHeaderBlockFragment;
+    }
+
+    public void setMaxHeaderBlockFragment(int maxHeaderBlockFragment)
+    {
+        this.maxHeaderBlockFragment = maxHeaderBlockFragment;
+    }
+
+    public HttpConfiguration getHttpConfiguration()
+    {
+        return httpConfiguration;
+    }
+
+    @Override
+    public Connection newConnection(Connector connector, EndPoint endPoint)
+    {
+        ServerSessionListener listener = newSessionListener(connector, endPoint);
+
+        Generator generator = new Generator(connector.getByteBufferPool(), getMaxDynamicTableSize(), getMaxHeaderBlockFragment());
+        FlowControlStrategy flowControl = newFlowControlStrategy();
+        HTTP2ServerSession session = new HTTP2ServerSession(connector.getScheduler(), endPoint, generator, listener, flowControl);
+        session.setMaxLocalStreams(getMaxConcurrentStreams());
+        session.setMaxRemoteStreams(getMaxConcurrentStreams());
+        // For a single stream in a connection, there will be a race between
+        // the stream idle timeout and the connection idle timeout. However,
+        // the typical case is that the connection will be busier and the
+        // stream idle timeout will expire earlier that the connection's.
+        session.setStreamIdleTimeout(endPoint.getIdleTimeout());
+
+        ServerParser parser = newServerParser(connector, session);
+        HTTP2Connection connection = new HTTP2ServerConnection(connector.getByteBufferPool(), connector.getExecutor(),
+                        endPoint, httpConfiguration, parser, session, getInputBufferSize(), listener);
+
+        return configure(connection, connector, endPoint);
+    }
+
+    protected FlowControlStrategy newFlowControlStrategy()
+    {
+        return new BufferingFlowControlStrategy(getInitialStreamSendWindow(), 0.5F);
+    }
+
+    protected abstract ServerSessionListener newSessionListener(Connector connector, EndPoint endPoint);
+
+    protected ServerParser newServerParser(Connector connector, ServerParser.Listener listener)
+    {
+        return new ServerParser(connector.getByteBufferPool(), listener, getMaxDynamicTableSize(), getHttpConfiguration().getRequestHeaderSize());
+    }
+}
diff --git a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/ByteBufferCallback.java b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/ByteBufferCallback.java
new file mode 100644
index 0000000..0bc629c
--- /dev/null
+++ b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/ByteBufferCallback.java
@@ -0,0 +1,68 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.server;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.util.Callback;
+
+public class ByteBufferCallback implements Callback
+{
+    private final ByteBufferPool byteBufferPool;
+    private final ByteBuffer buffer;
+    private final Callback callback;
+
+    public ByteBufferCallback(ByteBufferPool byteBufferPool, ByteBuffer buffer, Callback callback)
+    {
+        this.byteBufferPool = byteBufferPool;
+        this.buffer = buffer;
+        this.callback = callback;
+    }
+
+    @Override
+    public boolean isNonBlocking()
+    {
+        return callback.isNonBlocking();
+    }
+    
+    public ByteBuffer getByteBuffer()
+    {
+        return buffer;
+    }
+
+    @Override
+    public void succeeded()
+    {
+        recycle();
+        callback.succeeded();
+    }
+
+    @Override
+    public void failed(Throwable x)
+    {
+        recycle();
+        callback.failed(x);
+    }
+
+    private void recycle()
+    {
+        byteBufferPool.release(buffer);
+    }
+}
diff --git a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2CServerConnectionFactory.java b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2CServerConnectionFactory.java
new file mode 100644
index 0000000..e9276a8
--- /dev/null
+++ b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2CServerConnectionFactory.java
@@ -0,0 +1,78 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.server;
+
+import org.eclipse.jetty.http.BadMessageException;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.MetaData.Request;
+import org.eclipse.jetty.io.Connection;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.server.ConnectionFactory;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.util.annotation.Name;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+
+/* ------------------------------------------------------------ */
+/** HTTP2 Clear Text Connection factory.
+ * <p>This extension of HTTP2ServerConnection Factory sets the
+ * protocol name to "h2c" as used by the clear text upgrade mechanism
+ * for HTTP2 and marks all TLS ciphers as unacceptable.
+ * </p>
+ * <p>If used in combination with a {@link HttpConnectionFactory} as the
+ * default protocol, this factory can support the non-standard direct
+ * update mechanism, where a HTTP1 request of the form "PRI * HTTP/2.0"
+ * is used to trigger a switch to a HTTP2 connection.    This approach
+ * allows a single port to accept either HTTP/1 or HTTP/2 direct
+ * connections.
+ */
+public class HTTP2CServerConnectionFactory extends HTTP2ServerConnectionFactory implements ConnectionFactory.Upgrading
+{
+    private static final Logger LOG = Log.getLogger(HTTP2CServerConnectionFactory.class);
+
+    public HTTP2CServerConnectionFactory(@Name("config") HttpConfiguration httpConfiguration)
+    {
+        super(httpConfiguration,"h2c","h2c-17","h2c-16","h2c-15","h2c-14");
+    }
+
+    @Override
+    public boolean isAcceptable(String protocol, String tlsProtocol, String tlsCipher)
+    {
+        // Never use TLS with h2c
+        return false;
+    }
+
+    @Override
+    public Connection upgradeConnection(Connector connector, EndPoint endPoint, Request request, HttpFields response101) throws BadMessageException
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("{} upgraded {}{}", this, request.toString(), request.getFields());
+
+        if (request.getContentLength() > 0)
+            return null;
+
+        HTTP2ServerConnection connection = (HTTP2ServerConnection)newConnection(connector, endPoint);
+        if (connection.upgrade(request))
+            return connection;
+        return null;
+    }
+}
diff --git a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerConnection.java b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerConnection.java
new file mode 100644
index 0000000..68dd541
--- /dev/null
+++ b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerConnection.java
@@ -0,0 +1,204 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.server;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Queue;
+import java.util.concurrent.Executor;
+
+import org.eclipse.jetty.http.BadMessageException;
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http.MetaData.Request;
+import org.eclipse.jetty.http2.HTTP2Connection;
+import org.eclipse.jetty.http2.ISession;
+import org.eclipse.jetty.http2.IStream;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PrefaceFrame;
+import org.eclipse.jetty.http2.frames.SettingsFrame;
+import org.eclipse.jetty.http2.parser.ServerParser;
+import org.eclipse.jetty.http2.parser.SettingsBodyParser;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.Connection;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.util.B64Code;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.ConcurrentArrayQueue;
+import org.eclipse.jetty.util.TypeUtil;
+
+public class HTTP2ServerConnection extends HTTP2Connection implements Connection.UpgradeTo
+{
+    private final Queue<HttpChannelOverHTTP2> channels = new ConcurrentArrayQueue<>();
+    private final ServerSessionListener listener;
+    private final HttpConfiguration httpConfig;
+    private final List<Frame> upgradeFrames = new ArrayList<>();
+
+    public HTTP2ServerConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, HttpConfiguration httpConfig, ServerParser parser, ISession session, int inputBufferSize, ServerSessionListener listener)
+    {
+        super(byteBufferPool, executor, endPoint, parser, session, inputBufferSize);
+        this.listener = listener;
+        this.httpConfig = httpConfig;
+    }
+
+    @Override
+    protected ServerParser getParser()
+    {
+        return (ServerParser)super.getParser();
+    }
+
+    @Override
+    public void onUpgradeTo(ByteBuffer buffer)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("HTTP2 onUpgradeTo {} {}", this, BufferUtil.toDetailString(buffer));
+        setInputBuffer(buffer);
+    }
+
+    @Override
+    public void onOpen()
+    {
+        notifyAccept(getSession());
+        for (Frame frame : upgradeFrames)
+            getSession().onFrame(frame);
+        super.onOpen();
+    }
+
+    private void notifyAccept(ISession session)
+    {
+        try
+        {
+            listener.onAccept(session);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+        }
+    }
+
+    public void onNewStream(Connector connector, IStream stream, HeadersFrame frame)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Processing {} on {}", frame, stream);
+        HttpChannelOverHTTP2 channel = provideHttpChannel(connector, stream);
+        Runnable task = channel.onRequest(frame);
+        if (task != null)
+            offerTask(task, false);
+    }
+
+    public void onData(IStream stream, DataFrame frame, Callback callback)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Processing {} on {}", frame, stream);
+        HttpChannelOverHTTP2 channel = (HttpChannelOverHTTP2)stream.getAttribute(IStream.CHANNEL_ATTRIBUTE);
+        Runnable task = channel.requestContent(frame, callback);
+        if (task != null)
+            offerTask(task, false);
+    }
+
+    public void push(Connector connector, IStream stream, MetaData.Request request)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Processing push {} on {}", request, stream);
+        HttpChannelOverHTTP2 channel = provideHttpChannel(connector, stream);
+        Runnable task = channel.onPushRequest(request);
+        if (task != null)
+            offerTask(task, true);
+    }
+
+    private HttpChannelOverHTTP2 provideHttpChannel(Connector connector, IStream stream)
+    {
+        HttpChannelOverHTTP2 channel = channels.poll();
+        if (channel != null)
+        {
+            channel.getHttpTransport().setStream(stream);
+            if (LOG.isDebugEnabled())
+                LOG.debug("Recycling channel {} for {}", channel, this);
+        }
+        else
+        {
+            HttpTransportOverHTTP2 transport = new HttpTransportOverHTTP2(connector, this);
+            transport.setStream(stream);
+            channel = new ServerHttpChannelOverHTTP2(connector, httpConfig, getEndPoint(), transport);
+            if (LOG.isDebugEnabled())
+                LOG.debug("Creating channel {} for {}", channel, this);
+        }
+        stream.setAttribute(IStream.CHANNEL_ATTRIBUTE, channel);
+        return channel;
+    }
+
+    public boolean upgrade(Request request)
+    {
+        if (HttpMethod.PRI.is(request.getMethod()))
+        {
+            getParser().directUpgrade();
+        }
+        else
+        {
+            HttpField settingsField = request.getFields().getField(HttpHeader.HTTP2_SETTINGS);
+            if (settingsField == null)
+                throw new BadMessageException("Missing " + HttpHeader.HTTP2_SETTINGS + " header");
+            String value = settingsField.getValue();
+            final byte[] settings = B64Code.decodeRFC4648URL(value == null ? "" : value);
+
+            if (LOG.isDebugEnabled())
+                LOG.debug("{} settings {}",this,TypeUtil.toHexString(settings));
+
+            SettingsFrame settingsFrame = SettingsBodyParser.parseBody(BufferUtil.toBuffer(settings));
+            if (settingsFrame == null)
+            {
+                LOG.warn("Invalid {} header value: {}", HttpHeader.HTTP2_SETTINGS, value);
+                throw new BadMessageException();
+            }
+
+            getParser().standardUpgrade();
+
+            upgradeFrames.add(new PrefaceFrame());
+            upgradeFrames.add(settingsFrame);
+            // Remember the request to send a response from onOpen().
+            upgradeFrames.add(new HeadersFrame(1, request, null, true));
+        }
+        return true;
+    }
+
+    private class ServerHttpChannelOverHTTP2 extends HttpChannelOverHTTP2
+    {
+        public ServerHttpChannelOverHTTP2(Connector connector, HttpConfiguration configuration, EndPoint endPoint, HttpTransportOverHTTP2 transport)
+        {
+            super(connector, configuration, endPoint, transport);
+        }
+
+        @Override
+        public void onCompleted()
+        {
+            super.onCompleted();
+            recycle();
+            channels.offer(this);
+        }
+    }
+}
diff --git a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerConnectionFactory.java b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerConnectionFactory.java
new file mode 100644
index 0000000..55627f8
--- /dev/null
+++ b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerConnectionFactory.java
@@ -0,0 +1,150 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.server;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.HTTP2Cipher;
+import org.eclipse.jetty.http2.IStream;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PushPromiseFrame;
+import org.eclipse.jetty.http2.frames.ResetFrame;
+import org.eclipse.jetty.http2.frames.SettingsFrame;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.NegotiatingServerConnection.CipherDiscriminator;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.annotation.Name;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+public class HTTP2ServerConnectionFactory extends AbstractHTTP2ServerConnectionFactory implements CipherDiscriminator
+{
+    private static final Logger LOG = Log.getLogger(HTTP2ServerConnectionFactory.class);
+
+    public HTTP2ServerConnectionFactory(@Name("config") HttpConfiguration httpConfiguration)
+    {
+        super(httpConfiguration);
+    }
+    
+    protected HTTP2ServerConnectionFactory(@Name("config") HttpConfiguration httpConfiguration,String... protocols)
+    {
+        super(httpConfiguration,protocols);
+    }
+
+    @Override
+    protected ServerSessionListener newSessionListener(Connector connector, EndPoint endPoint)
+    {
+        return new HTTPServerSessionListener(connector, endPoint);
+    }
+
+    @Override
+    public boolean isAcceptable(String protocol, String tlsProtocol, String tlsCipher)
+    {
+        // TODO remove this draft 14 protection
+        // Implement 9.2.2
+        boolean acceptable = "h2-14".equals(protocol) || !(HTTP2Cipher.isBlackListProtocol(tlsProtocol) && HTTP2Cipher.isBlackListCipher(tlsCipher));
+        if (LOG.isDebugEnabled())
+            LOG.debug("proto={} tls={} cipher={} 9.2.2-acceptable={}",protocol,tlsProtocol,tlsCipher,acceptable);
+        return acceptable;
+    }
+
+    private class HTTPServerSessionListener extends ServerSessionListener.Adapter implements Stream.Listener
+    {
+        private final Connector connector;
+        private final EndPoint endPoint;
+
+        public HTTPServerSessionListener(Connector connector, EndPoint endPoint)
+        {
+            this.connector = connector;
+            this.endPoint = endPoint;
+        }
+
+        private HTTP2ServerConnection getConnection()
+        {
+            return (HTTP2ServerConnection)endPoint.getConnection();
+        }
+
+        @Override
+        public Map<Integer, Integer> onPreface(Session session)
+        {
+            Map<Integer, Integer> settings = new HashMap<>();
+            settings.put(SettingsFrame.HEADER_TABLE_SIZE, getMaxDynamicTableSize());
+            settings.put(SettingsFrame.INITIAL_WINDOW_SIZE, getInitialStreamSendWindow());
+            int maxConcurrentStreams = getMaxConcurrentStreams();
+            if (maxConcurrentStreams >= 0)
+                settings.put(SettingsFrame.MAX_CONCURRENT_STREAMS, maxConcurrentStreams);
+            return settings;
+        }
+
+        @Override
+        public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+        {
+            getConnection().onNewStream(connector, (IStream)stream, frame);
+            return frame.isEndStream() ? null : this;
+        }
+
+        @Override
+        public void onHeaders(Stream stream, HeadersFrame frame)
+        {
+            // Servers do not receive responses.
+            close(stream, "response_headers");
+        }
+
+        @Override
+        public Stream.Listener onPush(Stream stream, PushPromiseFrame frame)
+        {
+            // Servers do not receive pushes.
+            close(stream, "push_promise");
+            return null;
+        }
+
+        @Override
+        public void onData(Stream stream, DataFrame frame, Callback callback)
+        {
+            getConnection().onData((IStream)stream, frame, callback);
+        }
+
+        @Override
+        public void onReset(Stream stream, ResetFrame frame)
+        {
+            // TODO:
+        }
+
+        @Override
+        public void onTimeout(Stream stream, Throwable x)
+        {
+            // TODO
+        }
+
+        private void close(Stream stream, String reason)
+        {
+            final Session session = stream.getSession();
+            session.close(ErrorCode.PROTOCOL_ERROR.code, reason, Callback.NOOP);
+        }
+    }
+
+}
diff --git a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerSession.java b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerSession.java
new file mode 100644
index 0000000..59fede5
--- /dev/null
+++ b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerSession.java
@@ -0,0 +1,130 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.server;
+
+import java.util.Collections;
+import java.util.Map;
+
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.FlowControlStrategy;
+import org.eclipse.jetty.http2.HTTP2Session;
+import org.eclipse.jetty.http2.IStream;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.frames.Frame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PushPromiseFrame;
+import org.eclipse.jetty.http2.frames.SettingsFrame;
+import org.eclipse.jetty.http2.generator.Generator;
+import org.eclipse.jetty.http2.parser.ServerParser;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.Scheduler;
+
+public class HTTP2ServerSession extends HTTP2Session implements ServerParser.Listener
+{
+    private static final Logger LOG = Log.getLogger(HTTP2ServerSession.class);
+
+    private final ServerSessionListener listener;
+
+    public HTTP2ServerSession(Scheduler scheduler, EndPoint endPoint, Generator generator, ServerSessionListener listener, FlowControlStrategy flowControl)
+    {
+        super(scheduler, endPoint, generator, listener, flowControl, 2);
+        this.listener = listener;
+    }
+
+    @Override
+    public void onPreface()
+    {
+        // SPEC: send a SETTINGS frame upon receiving the preface.
+        Map<Integer, Integer> settings = notifyPreface(this);
+        if (settings == null)
+            settings = Collections.emptyMap();
+        SettingsFrame frame = new SettingsFrame(settings, false);
+        // TODO: consider sending a WINDOW_UPDATE to enlarge the session send window of the client.
+        frames(null, Callback.NOOP, frame, Frame.EMPTY_ARRAY);
+    }
+
+    @Override
+    public void onHeaders(HeadersFrame frame)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Received {}", frame);
+
+        MetaData metaData = frame.getMetaData();
+        if (metaData.isRequest())
+        {
+            IStream stream = createRemoteStream(frame.getStreamId());
+            if (stream != null)
+            {
+                stream.process(frame, Callback.NOOP);
+                Stream.Listener listener = notifyNewStream(stream, frame);
+                stream.setListener(listener);
+            }
+        }
+        else
+        {
+            onConnectionFailure(ErrorCode.INTERNAL_ERROR.code, "invalid_request");
+        }
+    }
+
+    @Override
+    public void onPushPromise(PushPromiseFrame frame)
+    {
+        onConnectionFailure(ErrorCode.PROTOCOL_ERROR.code, "push_promise");
+    }
+
+    private Map<Integer, Integer> notifyPreface(Session session)
+    {
+        try
+        {
+            return listener.onPreface(session);
+        }
+        catch (Throwable x)
+        {
+            LOG.info("Failure while notifying listener " + listener, x);
+            return null;
+        }
+    }
+
+    @Override
+    public void onFrame(Frame frame)
+    {
+        switch (frame.getType())
+        {
+            case PREFACE:
+                onPreface();
+                break;
+            case SETTINGS:
+                // SPEC: the required reply to this SETTINGS frame is the 101 response.
+                onSettings((SettingsFrame)frame, false);
+                break;
+            case HEADERS:
+                onHeaders((HeadersFrame)frame);
+                break;
+            default:
+                super.onFrame(frame);
+                break;
+        }
+    }
+}
diff --git a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpChannelOverHTTP2.java b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpChannelOverHTTP2.java
new file mode 100644
index 0000000..fc29410
--- /dev/null
+++ b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpChannelOverHTTP2.java
@@ -0,0 +1,249 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.server;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpGenerator;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpHeaderValue;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http.PreEncodedHttpField;
+import org.eclipse.jetty.http2.IStream;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.HttpChannel;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpInput;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+public class HttpChannelOverHTTP2 extends HttpChannel
+{
+    private static final Logger LOG = Log.getLogger(HttpChannelOverHTTP2.class);
+    private static final HttpField SERVER_VERSION = new PreEncodedHttpField(HttpHeader.SERVER, HttpConfiguration.SERVER_VERSION);
+    private static final HttpField POWERED_BY = new PreEncodedHttpField(HttpHeader.X_POWERED_BY, HttpConfiguration.SERVER_VERSION);
+
+    private boolean _expect100Continue;
+    private boolean _delayedUntilContent;
+
+    public HttpChannelOverHTTP2(Connector connector, HttpConfiguration configuration, EndPoint endPoint, HttpTransportOverHTTP2 transport)
+    {
+        super(connector, configuration, endPoint, transport);
+    }
+
+    private IStream getStream()
+    {
+        return getHttpTransport().getStream();
+    }
+
+    @Override
+    public boolean isExpecting100Continue()
+    {
+        return _expect100Continue;
+    }
+
+    public Runnable onRequest(HeadersFrame frame)
+    {
+        MetaData.Request request = (MetaData.Request)frame.getMetaData();
+        HttpFields fields = request.getFields();
+
+        // HTTP/2 sends the Host header as the :authority
+        // pseudo-header, so we need to synthesize a Host header.
+        if (!fields.contains(HttpHeader.HOST))
+        {
+            String authority = request.getURI().getAuthority();
+            if (authority != null)
+            {
+                // Lower-case to be consistent with other HTTP/2 headers.
+                fields.put("host", authority);
+            }
+        }
+
+        _expect100Continue = fields.contains(HttpHeader.EXPECT, HttpHeaderValue.CONTINUE.asString());
+
+        HttpFields response = getResponse().getHttpFields();
+        if (getHttpConfiguration().getSendServerVersion())
+            response.add(SERVER_VERSION);
+        if (getHttpConfiguration().getSendXPoweredBy())
+            response.add(POWERED_BY);
+
+        onRequest(request);
+
+        boolean endStream = frame.isEndStream();
+        if (endStream)
+            onRequestComplete();
+
+        _delayedUntilContent = getHttpConfiguration().isDelayDispatchUntilContent() &&
+                !endStream && !_expect100Continue;
+
+        if (LOG.isDebugEnabled())
+        {
+            Stream stream = getStream();
+            LOG.debug("HTTP2 Request #{}/{}, delayed={}:{}{} {} {}{}{}",
+                    stream.getId(), Integer.toHexString(stream.getSession().hashCode()),
+                    _delayedUntilContent, System.lineSeparator(),
+                    request.getMethod(), request.getURI(), request.getVersion(),
+                    System.lineSeparator(), fields);
+        }
+
+        return _delayedUntilContent ? null : this;
+    }
+
+    public Runnable onPushRequest(MetaData.Request request)
+    {
+        onRequest(request);
+        getRequest().setAttribute("org.eclipse.jetty.pushed", Boolean.TRUE);
+        onRequestComplete();
+
+        if (LOG.isDebugEnabled())
+        {
+            Stream stream = getStream();
+            LOG.debug("HTTP2 PUSH Request #{}/{}:{}{} {} {}{}{}",
+                    stream.getId(), Integer.toHexString(stream.getSession().hashCode()), System.lineSeparator(),
+                    request.getMethod(), request.getURI(), request.getVersion(),
+                    System.lineSeparator(), request.getFields());
+        }
+
+        return this;
+    }
+
+    @Override
+    public HttpTransportOverHTTP2 getHttpTransport()
+    {
+        return (HttpTransportOverHTTP2)super.getHttpTransport();
+    }
+
+    @Override
+    public void recycle()
+    {
+        _expect100Continue = false;
+        _delayedUntilContent = false;
+        super.recycle();
+        getHttpTransport().recycle();
+    }
+
+    @Override
+    protected void commit(MetaData.Response info)
+    {
+        super.commit(info);
+        if (LOG.isDebugEnabled())
+        {
+            Stream stream = getStream();
+            LOG.debug("HTTP2 Commit Response #{}/{}:{}{} {} {}{}{}",
+                    stream.getId(), Integer.toHexString(stream.getSession().hashCode()), System.lineSeparator(), info.getVersion(), info.getStatus(), info.getReason(),
+                    System.lineSeparator(), info.getFields());
+        }
+    }
+
+    public Runnable requestContent(DataFrame frame, final Callback callback)
+    {
+        // We must copy the data since we do not know when the
+        // application will consume its bytes (we queue them by
+        // calling onContent()), and we cannot stop the parsing
+        // since there may be frames for other streams.
+        final ByteBufferPool byteBufferPool = getByteBufferPool();
+        ByteBuffer original = frame.getData();
+        int length = original.remaining();
+        final ByteBuffer copy = byteBufferPool.acquire(length, original.isDirect());
+        BufferUtil.clearToFill(copy);
+        copy.put(original).flip();
+
+        boolean handle = onContent(new HttpInput.Content(copy)
+        {
+            @Override
+            public boolean isNonBlocking()
+            {
+                return callback.isNonBlocking();
+            }
+
+            @Override
+            public void succeeded()
+            {
+                byteBufferPool.release(copy);
+                callback.succeeded();
+            }
+
+            @Override
+            public void failed(Throwable x)
+            {
+                byteBufferPool.release(copy);
+                callback.failed(x);
+            }
+        });
+
+        boolean endStream = frame.isEndStream();
+        if (endStream)
+            handle |= onRequestComplete();
+
+        if (LOG.isDebugEnabled())
+        {
+            Stream stream = getStream();
+            LOG.debug("HTTP2 Request #{}/{}: {} bytes of {} content, handle: {}",
+                    stream.getId(),
+                    Integer.toHexString(stream.getSession().hashCode()),
+                    length,
+                    endStream ? "last" : "some",
+                    handle);
+        }
+
+        boolean delayed = _delayedUntilContent;
+        _delayedUntilContent = false;
+
+        return handle || delayed ? this : null;
+    }
+
+    /**
+     * If the associated response has the Expect header set to 100 Continue,
+     * then accessing the input stream indicates that the handler/servlet
+     * is ready for the request body and thus a 100 Continue response is sent.
+     *
+     * @throws IOException if the InputStream cannot be created
+     */
+    @Override
+    public void continue100(int available) throws IOException
+    {
+        // If the client is expecting 100 CONTINUE, then send it now.
+        // TODO: consider using an AtomicBoolean ?
+        if (isExpecting100Continue())
+        {
+            _expect100Continue = false;
+
+            // is content missing?
+            if (available == 0)
+            {
+                if (getResponse().isCommitted())
+                    throw new IOException("Committed before 100 Continues");
+
+                boolean committed = sendResponse(HttpGenerator.CONTINUE_100_INFO, null, false);
+                if (!committed)
+                    throw new IOException("Concurrent commit while trying to send 100-Continue");
+            }
+        }
+    }
+}
diff --git a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpTransportOverHTTP2.java b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpTransportOverHTTP2.java
new file mode 100644
index 0000000..0588930
--- /dev/null
+++ b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HttpTransportOverHTTP2.java
@@ -0,0 +1,231 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.server;
+
+import java.nio.ByteBuffer;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.IStream;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PushPromiseFrame;
+import org.eclipse.jetty.http2.frames.ResetFrame;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.HttpChannel;
+import org.eclipse.jetty.server.HttpTransport;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.Promise;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+public class HttpTransportOverHTTP2 implements HttpTransport
+{
+    private static final Logger LOG = Log.getLogger(HttpTransportOverHTTP2.class);
+
+    private final AtomicBoolean commit = new AtomicBoolean();
+    private final Callback commitCallback = new CommitCallback();
+    private final Connector connector;
+    private final HTTP2ServerConnection connection;
+    private IStream stream;
+
+    public HttpTransportOverHTTP2(Connector connector, HTTP2ServerConnection connection)
+    {
+        this.connector = connector;
+        this.connection = connection;
+    }
+
+    @Override
+    public boolean isOptimizedForDirectBuffers()
+    {
+        // Because sent buffers are passed directly to the endpoint without
+        // copying we can defer to the endpoint
+        return connection.getEndPoint().isOptimizedForDirectBuffers();
+    }
+    
+    public IStream getStream()
+    {
+        return stream;
+    }
+
+    public void setStream(IStream stream)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("{} setStream {}", this, stream.getId());
+        this.stream = stream;
+    }
+
+    public void recycle()
+    {
+        this.stream = null;
+        commit.set(false);
+    }
+
+    @Override
+    public void send(MetaData.Response info, boolean isHeadRequest, ByteBuffer content, boolean lastContent, Callback callback)
+    {
+        // info != null | content != 0 | last = true => commit + send/end
+        // info != null | content != 0 | last = false => commit + send
+        // info != null | content == 0 | last = true => commit/end
+        // info != null | content == 0 | last = false => commit
+        // info == null | content != 0 | last = true => send/end
+        // info == null | content != 0 | last = false => send
+        // info == null | content == 0 | last = true => send/end
+        // info == null | content == 0 | last = false => noop
+
+        boolean hasContent = BufferUtil.hasContent(content) && !isHeadRequest;
+
+        if (info != null)
+        {
+            if (commit.compareAndSet(false, true))
+            {
+                if (hasContent)
+                {
+                    commit(info, false, commitCallback);
+                    send(content, lastContent, callback);
+                }
+                else
+                {
+                    commit(info, lastContent, callback);
+                }
+            }
+            else
+            {
+                callback.failed(new IllegalStateException("committed"));
+            }
+        }
+        else
+        {
+            if (hasContent || lastContent)
+            {
+                send(content, lastContent, callback);
+            }
+            else
+            {
+                callback.succeeded();
+            }
+        }
+    }
+
+    @Override
+    public boolean isPushSupported()
+    {
+        return stream.getSession().isPushEnabled();
+    }
+
+    @Override
+    public void push(final MetaData.Request request)
+    {
+        if (!stream.getSession().isPushEnabled())
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("HTTP/2 Push disabled for {}", request);
+            return;
+        }
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("HTTP/2 Push {}",request);
+        
+        stream.push(new PushPromiseFrame(stream.getId(), 0, request), new Promise<Stream>()
+        {
+            @Override
+            public void succeeded(Stream pushStream)
+            {
+                connection.push(connector, (IStream)pushStream, request);
+            }
+
+            @Override
+            public void failed(Throwable x)
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Could not push " + request, x);
+            }
+        }, new Stream.Listener.Adapter()); // TODO: handle reset from the client ?
+    }
+
+    private void commit(MetaData.Response info, boolean endStream, Callback callback)
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("HTTP2 Response #{}:{}{} {}{}{}",
+                    stream.getId(), System.lineSeparator(), HttpVersion.HTTP_2, info.getStatus(),
+                    System.lineSeparator(), info.getFields());
+        }
+
+        HeadersFrame frame = new HeadersFrame(stream.getId(), info, null, endStream);
+        stream.headers(frame, callback);
+    }
+
+    private void send(ByteBuffer content, boolean lastContent, Callback callback)
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("HTTP2 Response #{}: {} content bytes{}",
+                    stream.getId(), content.remaining(), lastContent ? " (last chunk)" : "");
+        }
+        DataFrame frame = new DataFrame(stream.getId(), content, lastContent);
+        stream.data(frame, callback);
+    }
+
+    @Override
+    public void onCompleted()
+    {
+        if (!stream.isClosed())
+        {
+            // If the stream is not closed, it is still reading the request content.
+            // Send a reset to the other end so that it stops sending data.
+            stream.reset(new ResetFrame(stream.getId(), ErrorCode.CANCEL_STREAM_ERROR.code), Callback.NOOP);
+            // Now that this stream is reset, in-flight data frames will be consumed and discarded.
+            // Consume the existing queued data frames to avoid stalling the flow control.
+            HttpChannel channel = (HttpChannel)stream.getAttribute(IStream.CHANNEL_ATTRIBUTE);
+            channel.getRequest().getHttpInput().consumeAll();
+        }
+    }
+
+    @Override
+    public void abort(Throwable failure)
+    {
+        IStream stream = this.stream;
+        if (LOG.isDebugEnabled())
+            LOG.debug("HTTP2 Response #{} aborted", stream == null ? -1 : stream.getId());
+        if (stream != null)
+            stream.reset(new ResetFrame(stream.getId(), ErrorCode.INTERNAL_ERROR.code), Callback.NOOP);
+    }
+
+    private class CommitCallback implements Callback.NonBlocking
+    {   
+        @Override
+        public void succeeded()
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("HTTP2 Response #{} committed", stream.getId());
+        }
+
+        @Override
+        public void failed(Throwable x)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("HTTP2 Response #" + stream.getId() + " failed to commit", x);
+        }
+    }
+}
diff --git a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/RawHTTP2ServerConnectionFactory.java b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/RawHTTP2ServerConnectionFactory.java
new file mode 100644
index 0000000..923fc64
--- /dev/null
+++ b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/RawHTTP2ServerConnectionFactory.java
@@ -0,0 +1,41 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.server;
+
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.HttpConfiguration;
+
+public class RawHTTP2ServerConnectionFactory extends AbstractHTTP2ServerConnectionFactory
+{
+    private final ServerSessionListener listener;
+
+    public RawHTTP2ServerConnectionFactory(HttpConfiguration httpConfiguration,ServerSessionListener listener)
+    {
+        super(httpConfiguration);
+        this.listener = listener;
+    }
+
+    @Override
+    protected ServerSessionListener newSessionListener(Connector connector, EndPoint endPoint)
+    {
+        return listener;
+    }
+}
diff --git a/jetty-http2/http2-server/src/test/java/org/eclipse/jetty/http2/server/AbstractServerTest.java b/jetty-http2/http2-server/src/test/java/org/eclipse/jetty/http2/server/AbstractServerTest.java
new file mode 100644
index 0000000..d1bad45
--- /dev/null
+++ b/jetty-http2/http2-server/src/test/java/org/eclipse/jetty/http2/server/AbstractServerTest.java
@@ -0,0 +1,128 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.server;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.Socket;
+import java.net.SocketTimeoutException;
+import java.nio.ByteBuffer;
+
+import javax.servlet.http.HttpServlet;
+
+import org.eclipse.jetty.http.HostPortHttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpScheme;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.generator.Generator;
+import org.eclipse.jetty.http2.parser.Parser;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.MappedByteBufferPool;
+import org.eclipse.jetty.server.ConnectionFactory;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.toolchain.test.TestTracker;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.junit.After;
+import org.junit.Rule;
+
+public class AbstractServerTest
+{
+    @Rule
+    public TestTracker tracker = new TestTracker();
+    protected ServerConnector connector;
+    protected ByteBufferPool byteBufferPool;
+    protected Generator generator;
+    protected Server server;
+    protected String path;
+
+    protected void startServer(HttpServlet servlet) throws Exception
+    {
+        prepareServer(new HTTP2ServerConnectionFactory(new HttpConfiguration()));
+        ServletContextHandler context = new ServletContextHandler(server, "/");
+        context.addServlet(new ServletHolder(servlet), path);
+        server.start();
+    }
+
+    protected void startServer(ServerSessionListener listener) throws Exception
+    {
+        prepareServer(new RawHTTP2ServerConnectionFactory(new HttpConfiguration(),listener));
+        server.start();
+    }
+
+    private void prepareServer(ConnectionFactory connectionFactory)
+    {
+        QueuedThreadPool serverExecutor = new QueuedThreadPool();
+        serverExecutor.setName("server");
+        server = new Server(serverExecutor);
+        connector = new ServerConnector(server, connectionFactory);
+        server.addConnector(connector);
+        path = "/test";
+        byteBufferPool = new MappedByteBufferPool();
+        generator = new Generator(byteBufferPool);
+    }
+
+    protected MetaData.Request newRequest(String method, HttpFields fields)
+    {
+        String host = "localhost";
+        int port = connector.getLocalPort();
+        String authority = host + ":" + port;
+        return new MetaData.Request(method, HttpScheme.HTTP, new HostPortHttpField(authority), path, HttpVersion.HTTP_2, fields);
+    }
+
+    @After
+    public void dispose() throws Exception
+    {
+        if (server!=null)
+            server.stop();
+    }
+
+    protected boolean parseResponse(Socket client, Parser parser) throws IOException
+    {
+        return parseResponse(client, parser, 1000);
+    }
+
+    protected boolean parseResponse(Socket client, Parser parser, long timeout) throws IOException
+    {
+        byte[] buffer = new byte[2048];
+        InputStream input = client.getInputStream();
+        client.setSoTimeout((int)timeout);
+        while (true)
+        {
+            try
+            {
+                int read = input.read(buffer);
+                if (read < 0)
+                    return true;
+                parser.parse(ByteBuffer.wrap(buffer, 0, read));
+                if (client.isClosed())
+                    return true;
+            }
+            catch (SocketTimeoutException x)
+            {
+                return false;
+            }
+        }
+    }
+}
diff --git a/jetty-http2/http2-server/src/test/java/org/eclipse/jetty/http2/server/CloseTest.java b/jetty-http2/http2-server/src/test/java/org/eclipse/jetty/http2/server/CloseTest.java
new file mode 100644
index 0000000..e7ad905
--- /dev/null
+++ b/jetty-http2/http2-server/src/test/java/org/eclipse/jetty/http2/server/CloseTest.java
@@ -0,0 +1,254 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.server;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.HTTP2Session;
+import org.eclipse.jetty.http2.api.Session;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.frames.GoAwayFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PrefaceFrame;
+import org.eclipse.jetty.http2.frames.SettingsFrame;
+import org.eclipse.jetty.http2.parser.Parser;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.RuntimeIOException;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.Callback;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class CloseTest extends AbstractServerTest
+{
+    @Test
+    public void testClientAbruptlyClosesConnection() throws Exception
+    {
+        final CountDownLatch closeLatch = new CountDownLatch(1);
+        final AtomicReference<Session> sessionRef = new AtomicReference<>();
+        startServer(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                try
+                {
+                    sessionRef.set(stream.getSession());
+                    MetaData.Response response = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                    // Reply with HEADERS.
+                    stream.headers(new HeadersFrame(stream.getId(), response, null, true), Callback.NOOP);
+                    closeLatch.await(5, TimeUnit.SECONDS);
+                    return null;
+                }
+                catch (InterruptedException x)
+                {
+                    return null;
+                }
+            }
+        });
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        generator.control(lease, new PrefaceFrame());
+        generator.control(lease, new SettingsFrame(new HashMap<>(), false));
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        generator.control(lease, new HeadersFrame(1, metaData, null, true));
+
+        try (Socket client = new Socket("localhost", connector.getLocalPort()))
+        {
+            OutputStream output = client.getOutputStream();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+            {
+                output.write(BufferUtil.toArray(buffer));
+            }
+
+            Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+            {
+                @Override
+                public void onHeaders(HeadersFrame frame)
+                {
+                    try
+                    {
+                        // Close the connection just after
+                        // receiving the response headers.
+                        client.close();
+                        closeLatch.countDown();
+                    }
+                    catch (IOException x)
+                    {
+                        throw new RuntimeIOException(x);
+                    }
+                }
+            }, 4096, 8192);
+
+            parseResponse(client, parser);
+
+            // We need to give some time to the server to receive and process the TCP FIN.
+            Thread.sleep(1000);
+
+            Session session = sessionRef.get();
+            Assert.assertTrue(session.isClosed());
+            Assert.assertTrue(((HTTP2Session)session).isDisconnected());
+        }
+    }
+
+    @Test
+    public void testClientSendsGoAwayButDoesNotCloseConnectionServerCloses() throws Exception
+    {
+        final AtomicReference<Session> sessionRef = new AtomicReference<>();
+        startServer(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                sessionRef.set(stream.getSession());
+                MetaData.Response response = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                stream.headers(new HeadersFrame(stream.getId(), response, null, true), Callback.NOOP);
+                return null;
+            }
+        });
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        generator.control(lease, new PrefaceFrame());
+        generator.control(lease, new SettingsFrame(new HashMap<>(), false));
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        generator.control(lease, new HeadersFrame(1, metaData, null, true));
+        generator.control(lease, new GoAwayFrame(1, ErrorCode.NO_ERROR.code, "OK".getBytes("UTF-8")));
+
+        try (Socket client = new Socket("localhost", connector.getLocalPort()))
+        {
+            OutputStream output = client.getOutputStream();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+            {
+                output.write(BufferUtil.toArray(buffer));
+            }
+
+            // Don't close the connection; the server should close.
+
+            final CountDownLatch responseLatch = new CountDownLatch(1);
+            Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+            {
+                @Override
+                public void onHeaders(HeadersFrame frame)
+                {
+                    // Even if we sent the GO_AWAY immediately after the
+                    // HEADERS, the server is able to send us the response.
+                    responseLatch.countDown();
+                }
+            }, 4096, 8192);
+
+            parseResponse(client, parser);
+
+            Assert.assertTrue(responseLatch.await(5, TimeUnit.SECONDS));
+
+            // Wait for the server to close.
+            Thread.sleep(1000);
+
+            // Client received the TCP FIN from server.
+            Assert.assertEquals(-1, client.getInputStream().read());
+
+            // Server is closed.
+            Session session = sessionRef.get();
+            Assert.assertTrue(session.isClosed());
+            Assert.assertTrue(((HTTP2Session)session).isDisconnected());
+        }
+    }
+
+    @Test
+    public void testServerSendsGoAwayClientDoesNotCloseServerIdleTimeout() throws Exception
+    {
+        final long idleTimeout = 1000;
+        final AtomicReference<Session> sessionRef = new AtomicReference<>();
+        startServer(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                stream.setIdleTimeout(10 * idleTimeout);
+                sessionRef.set(stream.getSession());
+                MetaData.Response response = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                stream.headers(new HeadersFrame(stream.getId(), response, null, true), Callback.NOOP);
+                stream.getSession().close(ErrorCode.NO_ERROR.code, "OK", Callback.NOOP);
+                return null;
+            }
+        });
+        connector.setIdleTimeout(idleTimeout);
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        generator.control(lease, new PrefaceFrame());
+        generator.control(lease, new SettingsFrame(new HashMap<>(), false));
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        generator.control(lease, new HeadersFrame(1, metaData, null, true));
+
+        try (Socket client = new Socket("localhost", connector.getLocalPort()))
+        {
+            OutputStream output = client.getOutputStream();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+            {
+                output.write(BufferUtil.toArray(buffer));
+            }
+
+            final CountDownLatch responseLatch = new CountDownLatch(1);
+            final CountDownLatch closeLatch = new CountDownLatch(1);
+            Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+            {
+                @Override
+                public void onHeaders(HeadersFrame frame)
+                {
+                    responseLatch.countDown();
+                }
+
+                @Override
+                public void onGoAway(GoAwayFrame frame)
+                {
+                    closeLatch.countDown();
+                }
+            }, 4096, 8192);
+
+            parseResponse(client, parser);
+
+            Assert.assertTrue(responseLatch.await(5, TimeUnit.SECONDS));
+            Assert.assertTrue(closeLatch.await(5, TimeUnit.SECONDS));
+
+            // Don't close the connection.
+
+            // Wait for the server to idle timeout.
+            Thread.sleep(2 * idleTimeout);
+
+            // Client received the TCP FIN from server.
+            Assert.assertEquals(-1, client.getInputStream().read());
+
+            // Server is closed.
+            Session session = sessionRef.get();
+            Assert.assertTrue(session.isClosed());
+            Assert.assertTrue(((HTTP2Session)session).isDisconnected());
+        }
+    }
+}
diff --git a/jetty-http2/http2-server/src/test/java/org/eclipse/jetty/http2/server/HTTP2CServer.java b/jetty-http2/http2-server/src/test/java/org/eclipse/jetty/http2/server/HTTP2CServer.java
new file mode 100644
index 0000000..b28ac49
--- /dev/null
+++ b/jetty-http2/http2-server/src/test/java/org/eclipse/jetty/http2/server/HTTP2CServer.java
@@ -0,0 +1,83 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.server;
+
+import java.io.IOException;
+import java.net.Socket;
+import java.util.Date;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.io.Connection;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.SocketCustomizationListener;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+
+public class HTTP2CServer extends Server
+{
+    public HTTP2CServer(int port)
+    {
+        HttpConfiguration config = new HttpConfiguration();
+        // HTTP + HTTP/2 connector
+        
+        HttpConnectionFactory http1 = new HttpConnectionFactory(config);
+        HTTP2CServerConnectionFactory http2c = new HTTP2CServerConnectionFactory(config);
+        ServerConnector connector = new ServerConnector(this,http1,http2c);
+        connector.setPort(port);
+        addConnector(connector);
+
+        ((QueuedThreadPool)getThreadPool()).setName("server");
+
+        setHandler(new SimpleHandler());
+        
+    }
+
+    public static void main(String... args ) throws Exception
+    {
+        HTTP2CServer server = new HTTP2CServer(8080);
+        server.start();
+    }
+
+    private static class SimpleHandler extends AbstractHandler
+    {
+        @Override
+        public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+        {
+            baseRequest.setHandled(true);
+            String code=request.getParameter("code");
+            if (code!=null)
+                response.setStatus(Integer.parseInt(code));
+
+            response.setHeader("Custom","Value");
+            response.setContentType("text/plain");
+            String content = "Hello from Jetty using "+request.getProtocol() +"\n";
+            content+="uri="+request.getRequestURI()+"\n";
+            content+="date="+new Date()+"\n";
+            response.setContentLength(content.length());
+            response.getOutputStream().print(content);
+        }
+    }
+}
diff --git a/jetty-http2/http2-server/src/test/java/org/eclipse/jetty/http2/server/HTTP2CServerTest.java b/jetty-http2/http2-server/src/test/java/org/eclipse/jetty/http2/server/HTTP2CServerTest.java
new file mode 100644
index 0000000..dad6e1e
--- /dev/null
+++ b/jetty-http2/http2-server/src/test/java/org/eclipse/jetty/http2/server/HTTP2CServerTest.java
@@ -0,0 +1,279 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.server;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.eclipse.jetty.http.HostPortHttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpScheme;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PrefaceFrame;
+import org.eclipse.jetty.http2.frames.SettingsFrame;
+import org.eclipse.jetty.http2.generator.Generator;
+import org.eclipse.jetty.http2.parser.Parser;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.MappedByteBufferPool;
+import org.eclipse.jetty.server.NetworkConnector;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.Utf8StringBuilder;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+public class HTTP2CServerTest extends AbstractServerTest
+{
+    private HTTP2CServer _server;
+    private int _port;
+
+    @Before
+    public void before() throws Exception
+    {
+        _server = new HTTP2CServer(0);
+        _server.start();
+        _port = ((NetworkConnector)_server.getConnectors()[0]).getLocalPort();
+    }
+
+    @After
+    public void after() throws Exception
+    {
+        _server.stop();
+    }
+
+    @Test
+    public void testHTTP_1_0_Simple() throws Exception
+    {
+        try (Socket client = new Socket("localhost", _port))
+        {
+            client.getOutputStream().write("GET / HTTP/1.0\r\n\r\n".getBytes(StandardCharsets.ISO_8859_1));
+            client.getOutputStream().flush();
+
+            String response = IO.toString(client.getInputStream());
+
+            assertThat(response, containsString("HTTP/1.1 200 OK"));
+            assertThat(response, containsString("Hello from Jetty using HTTP/1.0"));
+        }
+    }
+
+    @Test
+    public void testHTTP_1_1_Simple() throws Exception
+    {
+        try (Socket client = new Socket("localhost", _port))
+        {
+            client.getOutputStream().write("GET /one HTTP/1.1\r\nHost: localhost\r\n\r\n".getBytes(StandardCharsets.ISO_8859_1));
+            client.getOutputStream().write("GET /two HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n".getBytes(StandardCharsets.ISO_8859_1));
+            client.getOutputStream().flush();
+
+            String response = IO.toString(client.getInputStream());
+
+            assertThat(response, containsString("HTTP/1.1 200 OK"));
+            assertThat(response, containsString("Hello from Jetty using HTTP/1.1"));
+            assertThat(response, containsString("uri=/one"));
+            assertThat(response, containsString("uri=/two"));
+        }
+    }
+
+    @Test
+    public void testHTTP_1_1_Upgrade() throws Exception
+    {
+        try (Socket client = new Socket("localhost", _port))
+        {
+            OutputStream output = client.getOutputStream();
+            output.write(("" +
+                    "GET /one HTTP/1.1\r\n" +
+                    "Host: localhost\r\n" +
+                    "Connection: Upgrade, HTTP2-Settings\r\n" +
+                    "Upgrade: h2c\r\n" +
+                    "HTTP2-Settings: \r\n" +
+                    "\r\n").getBytes(StandardCharsets.ISO_8859_1));
+            output.flush();
+
+            InputStream input = client.getInputStream();
+            Utf8StringBuilder upgrade = new Utf8StringBuilder();
+            int crlfs = 0;
+            while (true)
+            {
+                int read = input.read();
+                if (read == '\r' || read == '\n')
+                    ++crlfs;
+                else
+                    crlfs = 0;
+                upgrade.append((byte)read);
+                if (crlfs == 4)
+                    break;
+            }
+
+            assertTrue(upgrade.toString().startsWith("HTTP/1.1 101 "));
+
+            byteBufferPool = new MappedByteBufferPool();
+            generator = new Generator(byteBufferPool);
+
+            final AtomicReference<HeadersFrame> headersRef = new AtomicReference<>();
+            final AtomicReference<DataFrame> dataRef = new AtomicReference<>();
+            final AtomicReference<CountDownLatch> latchRef = new AtomicReference<>(new CountDownLatch(2));
+            Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+            {
+                @Override
+                public void onHeaders(HeadersFrame frame)
+                {
+                    headersRef.set(frame);
+                    latchRef.get().countDown();
+                }
+
+                @Override
+                public void onData(DataFrame frame)
+                {
+                    dataRef.set(frame);
+                    latchRef.get().countDown();
+                }
+            }, 4096, 8192);
+
+            parseResponse(client, parser);
+
+            Assert.assertTrue(latchRef.get().await(5, TimeUnit.SECONDS));
+
+            HeadersFrame response = headersRef.get();
+            Assert.assertNotNull(response);
+            MetaData.Response responseMetaData = (MetaData.Response)response.getMetaData();
+            Assert.assertEquals(200, responseMetaData.getStatus());
+
+            DataFrame responseData = dataRef.get();
+            Assert.assertNotNull(responseData);
+
+            String content = BufferUtil.toString(responseData.getData());
+
+            // The upgrade request is seen as HTTP/1.1.
+            assertThat(content, containsString("Hello from Jetty using HTTP/1.1"));
+            assertThat(content, containsString("uri=/one"));
+
+            // Send a HTTP/2 request.
+            headersRef.set(null);
+            dataRef.set(null);
+            latchRef.set(new CountDownLatch(2));
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            generator.control(lease, new PrefaceFrame());
+            generator.control(lease, new SettingsFrame(new HashMap<>(), false));
+            MetaData.Request metaData = new MetaData.Request("GET", HttpScheme.HTTP, new HostPortHttpField("localhost:" + _port), "/two", HttpVersion.HTTP_2, new HttpFields());
+            generator.control(lease, new HeadersFrame(3, metaData, null, true));
+            for (ByteBuffer buffer : lease.getByteBuffers())
+                output.write(BufferUtil.toArray(buffer));
+            output.flush();
+
+            parseResponse(client, parser);
+
+            Assert.assertTrue(latchRef.get().await(5, TimeUnit.SECONDS));
+
+            response = headersRef.get();
+            Assert.assertNotNull(response);
+            responseMetaData = (MetaData.Response)response.getMetaData();
+            Assert.assertEquals(200, responseMetaData.getStatus());
+
+            responseData = dataRef.get();
+            Assert.assertNotNull(responseData);
+
+            content = BufferUtil.toString(responseData.getData());
+
+            assertThat(content, containsString("Hello from Jetty using HTTP/2.0"));
+            assertThat(content, containsString("uri=/two"));
+        }
+    }
+
+    @Test
+    public void testHTTP_2_0_Direct() throws Exception
+    {
+        final CountDownLatch latch = new CountDownLatch(3);
+
+        byteBufferPool = new MappedByteBufferPool();
+        generator = new Generator(byteBufferPool);
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        generator.control(lease, new PrefaceFrame());
+        generator.control(lease, new SettingsFrame(new HashMap<>(), false));
+        MetaData.Request metaData = new MetaData.Request("GET", HttpScheme.HTTP, new HostPortHttpField("localhost:" + _port), "/test", HttpVersion.HTTP_2, new HttpFields());
+        generator.control(lease, new HeadersFrame(1, metaData, null, true));
+
+        try (Socket client = new Socket("localhost", _port))
+        {
+            OutputStream output = client.getOutputStream();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+            {
+                output.write(BufferUtil.toArray(buffer));
+            }
+
+            final AtomicReference<HeadersFrame> headersRef = new AtomicReference<>();
+            final AtomicReference<DataFrame> dataRef = new AtomicReference<>();
+            Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+            {
+                @Override
+                public void onSettings(SettingsFrame frame)
+                {
+                    latch.countDown();
+                }
+
+                @Override
+                public void onHeaders(HeadersFrame frame)
+                {
+                    headersRef.set(frame);
+                    latch.countDown();
+                }
+
+                @Override
+                public void onData(DataFrame frame)
+                {
+                    dataRef.set(frame);
+                    latch.countDown();
+                }
+            }, 4096, 8192);
+
+            parseResponse(client, parser);
+
+            Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+
+            HeadersFrame response = headersRef.get();
+            Assert.assertNotNull(response);
+            MetaData.Response responseMetaData = (MetaData.Response)response.getMetaData();
+            Assert.assertEquals(200, responseMetaData.getStatus());
+
+            DataFrame responseData = dataRef.get();
+            Assert.assertNotNull(responseData);
+
+            String s = BufferUtil.toString(responseData.getData());
+
+            assertThat(s, containsString("Hello from Jetty using HTTP/2.0"));
+            assertThat(s, containsString("uri=/test"));
+        }
+    }
+}
diff --git a/jetty-http2/http2-server/src/test/java/org/eclipse/jetty/http2/server/HTTP2ServerTest.java b/jetty-http2/http2-server/src/test/java/org/eclipse/jetty/http2/server/HTTP2ServerTest.java
new file mode 100644
index 0000000..554a5b4
--- /dev/null
+++ b/jetty-http2/http2-server/src/test/java/org/eclipse/jetty/http2/server/HTTP2ServerTest.java
@@ -0,0 +1,588 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http2.server;
+
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.nio.ByteBuffer;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.SocketChannel;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.ErrorCode;
+import org.eclipse.jetty.http2.Flags;
+import org.eclipse.jetty.http2.api.Stream;
+import org.eclipse.jetty.http2.api.server.ServerSessionListener;
+import org.eclipse.jetty.http2.frames.DataFrame;
+import org.eclipse.jetty.http2.frames.FrameType;
+import org.eclipse.jetty.http2.frames.GoAwayFrame;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PingFrame;
+import org.eclipse.jetty.http2.frames.PrefaceFrame;
+import org.eclipse.jetty.http2.frames.PriorityFrame;
+import org.eclipse.jetty.http2.frames.SettingsFrame;
+import org.eclipse.jetty.http2.generator.Generator;
+import org.eclipse.jetty.http2.parser.Parser;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.ManagedSelector;
+import org.eclipse.jetty.io.SelectChannelEndPoint;
+import org.eclipse.jetty.server.HttpChannel;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.log.StdErrLog;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class HTTP2ServerTest extends AbstractServerTest
+{
+    @Test
+    public void testNoPrefaceBytes() throws Exception
+    {
+        startServer(new HttpServlet(){});
+
+        // No preface bytes.
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        generator.control(lease, new HeadersFrame(1, metaData, null, true));
+
+        try (Socket client = new Socket("localhost", connector.getLocalPort()))
+        {
+            OutputStream output = client.getOutputStream();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+            {
+                output.write(BufferUtil.toArray(buffer));
+            }
+
+            final CountDownLatch latch = new CountDownLatch(1);
+            Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+            {
+                @Override
+                public void onGoAway(GoAwayFrame frame)
+                {
+                    latch.countDown();
+                }
+            }, 4096, 8192);
+
+            parseResponse(client, parser);
+
+            Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+        }
+    }
+
+    @Test
+    public void testRequestResponseNoContent() throws Exception
+    {
+        final CountDownLatch latch = new CountDownLatch(3);
+        startServer(new HttpServlet()
+        {
+            @Override
+            protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+            {
+                latch.countDown();
+            }
+        });
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        generator.control(lease, new PrefaceFrame());
+        generator.control(lease, new SettingsFrame(new HashMap<>(), false));
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        generator.control(lease, new HeadersFrame(1, metaData, null, true));
+
+        try (Socket client = new Socket("localhost", connector.getLocalPort()))
+        {
+            OutputStream output = client.getOutputStream();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+            {
+                output.write(BufferUtil.toArray(buffer));
+            }
+
+            final AtomicReference<HeadersFrame> frameRef = new AtomicReference<>();
+            Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+            {
+                @Override
+                public void onSettings(SettingsFrame frame)
+                {
+                    latch.countDown();
+                }
+
+                @Override
+                public void onHeaders(HeadersFrame frame)
+                {
+                    frameRef.set(frame);
+                    latch.countDown();
+                }
+            }, 4096, 8192);
+
+            parseResponse(client, parser);
+
+            Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+
+            HeadersFrame response = frameRef.get();
+            Assert.assertNotNull(response);
+            MetaData.Response responseMetaData = (MetaData.Response)response.getMetaData();
+            Assert.assertEquals(200, responseMetaData.getStatus());
+        }
+    }
+
+    @Test
+    public void testRequestResponseContent() throws Exception
+    {
+        final byte[] content = "Hello, world!".getBytes(StandardCharsets.UTF_8);
+        final CountDownLatch latch = new CountDownLatch(4);
+        startServer(new HttpServlet()
+        {
+            @Override
+            protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+            {
+                latch.countDown();
+                resp.getOutputStream().write(content);
+            }
+        });
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        generator.control(lease, new PrefaceFrame());
+        generator.control(lease, new SettingsFrame(new HashMap<>(), false));
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        generator.control(lease, new HeadersFrame(1, metaData, null, true));
+
+        try (Socket client = new Socket("localhost", connector.getLocalPort()))
+        {
+            OutputStream output = client.getOutputStream();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+            {
+                output.write(BufferUtil.toArray(buffer));
+            }
+
+            final AtomicReference<HeadersFrame> headersRef = new AtomicReference<>();
+            final AtomicReference<DataFrame> dataRef = new AtomicReference<>();
+            Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+            {
+                @Override
+                public void onSettings(SettingsFrame frame)
+                {
+                    latch.countDown();
+                }
+
+                @Override
+                public void onHeaders(HeadersFrame frame)
+                {
+                    headersRef.set(frame);
+                    latch.countDown();
+                }
+
+                @Override
+                public void onData(DataFrame frame)
+                {
+                    dataRef.set(frame);
+                    latch.countDown();
+                }
+            }, 4096, 8192);
+
+            parseResponse(client, parser);
+
+            Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+
+            HeadersFrame response = headersRef.get();
+            Assert.assertNotNull(response);
+            MetaData.Response responseMetaData = (MetaData.Response)response.getMetaData();
+            Assert.assertEquals(200, responseMetaData.getStatus());
+
+            DataFrame responseData = dataRef.get();
+            Assert.assertNotNull(responseData);
+            Assert.assertArrayEquals(content, BufferUtil.toArray(responseData.getData()));
+        }
+    }
+
+    @Test
+    public void testBadPingWrongPayload() throws Exception
+    {
+        startServer(new HttpServlet(){});
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        generator.control(lease, new PrefaceFrame());
+        generator.control(lease, new SettingsFrame(new HashMap<>(), false));
+        generator.control(lease, new PingFrame(new byte[8], false));
+        // Modify the length of the frame to a wrong one.
+        lease.getByteBuffers().get(2).putShort(0, (short)7);
+
+        final CountDownLatch latch = new CountDownLatch(1);
+        try (Socket client = new Socket("localhost", connector.getLocalPort()))
+        {
+            OutputStream output = client.getOutputStream();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+            {
+                output.write(BufferUtil.toArray(buffer));
+            }
+
+            Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+            {
+                @Override
+                public void onGoAway(GoAwayFrame frame)
+                {
+                    Assert.assertEquals(ErrorCode.FRAME_SIZE_ERROR.code, frame.getError());
+                    latch.countDown();
+                }
+            }, 4096, 8192);
+
+            parseResponse(client, parser);
+
+            Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+        }
+    }
+
+    @Test
+    public void testBadPingWrongStreamId() throws Exception
+    {
+        startServer(new HttpServlet(){});
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        generator.control(lease, new PrefaceFrame());
+        generator.control(lease, new SettingsFrame(new HashMap<>(), false));
+        generator.control(lease, new PingFrame(new byte[8], false));
+        // Modify the streamId of the frame to non zero.
+        lease.getByteBuffers().get(2).putInt(4, 1);
+
+        final CountDownLatch latch = new CountDownLatch(1);
+        try (Socket client = new Socket("localhost", connector.getLocalPort()))
+        {
+            OutputStream output = client.getOutputStream();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+            {
+                output.write(BufferUtil.toArray(buffer));
+            }
+
+            Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+            {
+                @Override
+                public void onGoAway(GoAwayFrame frame)
+                {
+                    Assert.assertEquals(ErrorCode.PROTOCOL_ERROR.code, frame.getError());
+                    latch.countDown();
+                }
+            }, 4096, 8192);
+
+            parseResponse(client, parser);
+
+            Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+        }
+    }
+
+    @Test
+    public void testCommitFailure() throws Exception
+    {
+        final long delay = 1000;
+        final AtomicBoolean broken = new AtomicBoolean();
+        startServer(new HttpServlet()
+        {
+            @Override
+            protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+            {
+                try
+                {
+                    // Wait for the SETTINGS frames to be exchanged.
+                    Thread.sleep(delay);
+                    broken.set(true);
+                }
+                catch (InterruptedException x)
+                {
+                    throw new InterruptedIOException();
+                }
+            }
+        });
+        server.stop();
+
+        ServerConnector connector2 = new ServerConnector(server, new HTTP2ServerConnectionFactory(new HttpConfiguration()))
+        {
+            @Override
+            protected SelectChannelEndPoint newEndPoint(SocketChannel channel, ManagedSelector selectSet, SelectionKey key) throws IOException
+            {
+                return new SelectChannelEndPoint(channel, selectSet, key, getScheduler(), getIdleTimeout())
+                {
+                    @Override
+                    public void write(Callback callback, ByteBuffer... buffers) throws IllegalStateException
+                    {
+                        if (broken.get())
+                            callback.failed(new IOException("explicitly_thrown_by_test"));
+                        else
+                            super.write(callback, buffers);
+                    }
+                };
+            }
+        };
+        server.addConnector(connector2);
+        server.start();
+
+        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+        generator.control(lease, new PrefaceFrame());
+        generator.control(lease, new SettingsFrame(new HashMap<>(), false));
+        MetaData.Request metaData = newRequest("GET", new HttpFields());
+        generator.control(lease, new HeadersFrame(1, metaData, null, true));
+        try (Socket client = new Socket("localhost", connector2.getLocalPort()))
+        {
+            OutputStream output = client.getOutputStream();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+                output.write(BufferUtil.toArray(buffer));
+
+            // The server will close the connection abruptly since it
+            // cannot write and therefore cannot even send the GO_AWAY.
+            Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter(), 4096, 8192);
+            boolean closed = parseResponse(client, parser, 2 * delay);
+            Assert.assertTrue(closed);
+        }
+    }
+
+    @Test
+    public void testNonISOHeader() throws Exception
+    {
+        StdErrLog logger = StdErrLog.getLogger(HttpChannel.class);
+        logger.setHideStacks(true);
+        try
+        {
+            startServer(new HttpServlet()
+            {
+                @Override
+                protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+                {
+                    // Invalid header name, the connection must be closed.
+                    response.setHeader("Euro_(\u20AC)", "42");
+                }
+            });
+
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            generator.control(lease, new PrefaceFrame());
+            generator.control(lease, new SettingsFrame(new HashMap<>(), false));
+            MetaData.Request metaData = newRequest("GET", new HttpFields());
+            generator.control(lease, new HeadersFrame(1, metaData, null, true));
+
+            try (Socket client = new Socket("localhost", connector.getLocalPort()))
+            {
+                OutputStream output = client.getOutputStream();
+                for (ByteBuffer buffer : lease.getByteBuffers())
+                    output.write(BufferUtil.toArray(buffer));
+                output.flush();
+
+                Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter(), 4096, 8192);
+                boolean closed = parseResponse(client, parser);
+
+                Assert.assertTrue(closed);
+            }
+        }
+        finally
+        {
+            logger.setHideStacks(false);
+        }
+    }
+
+    @Test
+    public void testRequestWithContinuationFrames() throws Exception
+    {
+        testRequestWithContinuationFrames(null, () ->
+        {
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            generator.control(lease, new PrefaceFrame());
+            generator.control(lease, new SettingsFrame(new HashMap<>(), false));
+            MetaData.Request metaData = newRequest("GET", new HttpFields());
+            generator.control(lease, new HeadersFrame(1, metaData, null, true));
+            return lease;
+        });
+    }
+
+    @Test
+    public void testRequestWithPriorityWithContinuationFrames() throws Exception
+    {
+        PriorityFrame priority = new PriorityFrame(1, 13, 200, true);
+        testRequestWithContinuationFrames(priority, () ->
+        {
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            generator.control(lease, new PrefaceFrame());
+            generator.control(lease, new SettingsFrame(new HashMap<>(), false));
+            MetaData.Request metaData = newRequest("GET", new HttpFields());
+            generator.control(lease, new HeadersFrame(1, metaData, priority, true));
+            return lease;
+        });
+    }
+
+    @Test
+    public void testRequestWithContinuationFramesWithEmptyHeadersFrame() throws Exception
+    {
+        testRequestWithContinuationFrames(null, () ->
+        {
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            generator.control(lease, new PrefaceFrame());
+            generator.control(lease, new SettingsFrame(new HashMap<>(), false));
+            MetaData.Request metaData = newRequest("GET", new HttpFields());
+            generator.control(lease, new HeadersFrame(1, metaData, null, true));
+            // Take the HeadersFrame header and set the length to zero.
+            List<ByteBuffer> buffers = lease.getByteBuffers();
+            ByteBuffer headersFrameHeader = buffers.get(2);
+            headersFrameHeader.put(0, (byte)0);
+            headersFrameHeader.putShort(1, (short)0);
+            // Insert a CONTINUATION frame header for the body of the HEADERS frame.
+            lease.insert(3, buffers.get(4).slice(), false);
+            return lease;
+        });
+    }
+
+    @Test
+    public void testRequestWithPriorityWithContinuationFramesWithEmptyHeadersFrame() throws Exception
+    {
+        PriorityFrame priority = new PriorityFrame(1, 13, 200, true);
+        testRequestWithContinuationFrames(null, () ->
+        {
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            generator.control(lease, new PrefaceFrame());
+            generator.control(lease, new SettingsFrame(new HashMap<>(), false));
+            MetaData.Request metaData = newRequest("GET", new HttpFields());
+            generator.control(lease, new HeadersFrame(1, metaData, priority, true));
+            // Take the HeadersFrame header and set the length to just the priority frame.
+            List<ByteBuffer> buffers = lease.getByteBuffers();
+            ByteBuffer headersFrameHeader = buffers.get(2);
+            headersFrameHeader.put(0, (byte)0);
+            headersFrameHeader.putShort(1, (short)PriorityFrame.PRIORITY_LENGTH);
+            // Insert a CONTINUATION frame header for the body of the HEADERS frame.
+            lease.insert(3, buffers.get(4).slice(), false);
+            return lease;
+        });
+    }
+
+    @Test
+    public void testRequestWithContinuationFramesWithEmptyContinuationFrame() throws Exception
+    {
+        testRequestWithContinuationFrames(null, () ->
+        {
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            generator.control(lease, new PrefaceFrame());
+            generator.control(lease, new SettingsFrame(new HashMap<>(), false));
+            MetaData.Request metaData = newRequest("GET", new HttpFields());
+            generator.control(lease, new HeadersFrame(1, metaData, null, true));
+            // Take the ContinuationFrame header, duplicate it, and set the length to zero.
+            List<ByteBuffer> buffers = lease.getByteBuffers();
+            ByteBuffer continuationFrameHeader = buffers.get(4);
+            ByteBuffer duplicate = ByteBuffer.allocate(continuationFrameHeader.remaining());
+            duplicate.put(continuationFrameHeader).flip();
+            continuationFrameHeader.flip();
+            continuationFrameHeader.put(0, (byte)0);
+            continuationFrameHeader.putShort(1, (short)0);
+            // Insert a CONTINUATION frame header for the body of the previous CONTINUATION frame.
+            lease.insert(5, duplicate, false);
+            return lease;
+        });
+    }
+
+    @Test
+    public void testRequestWithContinuationFramesWithEmptyLastContinuationFrame() throws Exception
+    {
+        testRequestWithContinuationFrames(null, () ->
+        {
+            ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+            generator.control(lease, new PrefaceFrame());
+            generator.control(lease, new SettingsFrame(new HashMap<>(), false));
+            MetaData.Request metaData = newRequest("GET", new HttpFields());
+            generator.control(lease, new HeadersFrame(1, metaData, null, true));
+            // Take the last CONTINUATION frame and reset the flag.
+            List<ByteBuffer> buffers = lease.getByteBuffers();
+            ByteBuffer continuationFrameHeader = buffers.get(buffers.size() - 2);
+            continuationFrameHeader.put(4, (byte)0);
+            // Add a last, empty, CONTINUATION frame.
+            ByteBuffer last = ByteBuffer.wrap(new byte[]{
+                    0, 0, 0, // Length
+                    (byte)FrameType.CONTINUATION.getType(),
+                    (byte)Flags.END_HEADERS,
+                    0, 0, 0, 1 // Stream ID
+            });
+            lease.append(last, false);
+            return lease;
+        });
+    }
+
+    private void testRequestWithContinuationFrames(PriorityFrame priorityFrame, Callable<ByteBufferPool.Lease> frames) throws Exception
+    {
+        final CountDownLatch serverLatch = new CountDownLatch(1);
+        startServer(new ServerSessionListener.Adapter()
+        {
+            @Override
+            public Stream.Listener onNewStream(Stream stream, HeadersFrame frame)
+            {
+                if (priorityFrame != null)
+                {
+                    PriorityFrame priority = frame.getPriority();
+                    Assert.assertNotNull(priority);
+                    Assert.assertEquals(priorityFrame.getStreamId(), priority.getStreamId());
+                    Assert.assertEquals(priorityFrame.getParentStreamId(), priority.getParentStreamId());
+                    Assert.assertEquals(priorityFrame.getWeight(), priority.getWeight());
+                    Assert.assertEquals(priorityFrame.isExclusive(), priority.isExclusive());
+                }
+
+                serverLatch.countDown();
+
+                MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, 200, new HttpFields());
+                HeadersFrame responseFrame = new HeadersFrame(stream.getId(), metaData, null, true);
+                stream.headers(responseFrame, Callback.NOOP);
+                return null;
+            }
+        });
+        generator = new Generator(byteBufferPool, 4096, 4);
+
+        ByteBufferPool.Lease lease = frames.call();
+
+        try (Socket client = new Socket("localhost", connector.getLocalPort()))
+        {
+            OutputStream output = client.getOutputStream();
+            for (ByteBuffer buffer : lease.getByteBuffers())
+                output.write(BufferUtil.toArray(buffer));
+            output.flush();
+
+            Assert.assertTrue(serverLatch.await(5, TimeUnit.SECONDS));
+
+            final CountDownLatch clientLatch = new CountDownLatch(1);
+            Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
+            {
+                @Override
+                public void onHeaders(HeadersFrame frame)
+                {
+                    if (frame.isEndStream())
+                        clientLatch.countDown();
+                }
+            }, 4096, 8192);
+            boolean closed = parseResponse(client, parser);
+
+            Assert.assertTrue(clientLatch.await(5, TimeUnit.SECONDS));
+            Assert.assertFalse(closed);
+        }
+    }
+}
diff --git a/jetty-http2/http2-server/src/test/resources/jetty-logging.properties b/jetty-http2/http2-server/src/test/resources/jetty-logging.properties
new file mode 100644
index 0000000..13f7aba
--- /dev/null
+++ b/jetty-http2/http2-server/src/test/resources/jetty-logging.properties
@@ -0,0 +1,3 @@
+org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
+org.eclipse.jetty.http2.hpack.LEVEL=INFO
+#org.eclipse.jetty.http2.LEVEL=DEBUG
diff --git a/jetty-http2/pom.xml b/jetty-http2/pom.xml
new file mode 100644
index 0000000..9911183
--- /dev/null
+++ b/jetty-http2/pom.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>jetty-project</artifactId>
+    <groupId>org.eclipse.jetty</groupId>
+    <version>9.3.6-SNAPSHOT</version>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.eclipse.jetty.http2</groupId>
+  <artifactId>http2-parent</artifactId>
+  <packaging>pom</packaging>
+  <name>Jetty :: HTTP2</name>
+
+  <modules>
+    <module>http2-alpn-tests</module>
+    <module>http2-client</module>
+    <module>http2-common</module>
+    <module>http2-hpack</module>
+    <module>http2-http-client-transport</module>
+    <module>http2-server</module>
+  </modules>
+
+</project>
diff --git a/jetty-infinispan/pom.xml b/jetty-infinispan/pom.xml
new file mode 100644
index 0000000..39584c7
--- /dev/null
+++ b/jetty-infinispan/pom.xml
@@ -0,0 +1,66 @@
+<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>
+    <groupId>org.eclipse.jetty</groupId>
+    <artifactId>jetty-project</artifactId>
+    <version>9.3.6-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>jetty-infinispan</artifactId>
+  <name>Jetty :: Infinispan Session Managers</name>
+  <url>http://www.eclipse.org/jetty</url>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.infinispan</bundle-symbolic-name>
+    <infinispan.version>7.1.1.Final</infinispan.version>
+  </properties>
+  <build>
+    <defaultGoal>install</defaultGoal>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+            <configuration>
+              <descriptorRefs>
+                <descriptorRef>config</descriptorRef>
+              </descriptorRefs>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>artifact-jar</id>
+            <goals>
+              <goal>jar</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <archive>
+            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+          </archive>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  <dependencies>
+    <dependency>
+         <groupId>org.infinispan</groupId>
+         <artifactId>infinispan-core</artifactId>
+         <version>${infinispan.version}</version>
+    </dependency>
+    <dependency>
+       <groupId>org.eclipse.jetty</groupId>
+       <artifactId>jetty-server</artifactId>
+       <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/jetty-infinispan/src/main/config/etc/jetty-infinispan.xml b/jetty-infinispan/src/main/config/etc/jetty-infinispan.xml
new file mode 100644
index 0000000..49d7ab6
--- /dev/null
+++ b/jetty-infinispan/src/main/config/etc/jetty-infinispan.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+
+  <!-- ===================================================================== -->
+  <!-- Get a reference to the default local cache.                           -->
+  <!-- ===================================================================== -->
+  <New id="local" class="org.infinispan.manager.DefaultCacheManager">
+     <Get id="cache" name="cache"></Get>
+  </New>
+
+  <!-- ===================================================================== -->
+  <!-- Get a reference to a hotrod client for a remote cache.               -->
+  <!-- Change the name of the cache to match your setup.                    -->
+  <!-- ===================================================================== -->
+  <!--
+  <New id="hotrodMgr" class="org.infinispan.client.hotrod.RemoteCacheManager">
+    <Call id="cache" name="getCache">
+      <Arg>sessions</Arg>
+    </Call>
+  </New>
+  -->
+
+
+  <!-- ===================================================================== -->
+  <!-- Configure a SessionIdManager with the cache selected above.          -->
+  <!-- ===================================================================== -->
+  <Set name="sessionIdManager">
+    <New id="idMgr" class="org.eclipse.jetty.session.infinispan.InfinispanSessionIdManager">
+      <Arg>
+        <Ref refid="Server"/>
+      </Arg>
+      <Set name="workerName"><Property name="jetty.infinispanSession.workerName" default="node1"/></Set>
+      <Set name="cache"><Ref refid="cache"/></Set>
+    </New>
+  </Set>
+
+</Configure>
diff --git a/jetty-infinispan/src/main/config/modules/infinispan.mod b/jetty-infinispan/src/main/config/modules/infinispan.mod
new file mode 100644
index 0000000..afa39fc
--- /dev/null
+++ b/jetty-infinispan/src/main/config/modules/infinispan.mod
@@ -0,0 +1,33 @@
+#
+# Jetty Infinispan module
+#
+
+[depend]
+annotations
+webapp
+
+[files]
+maven://org.infinispan/infinispan-core/7.1.1.Final|lib/infinispan/infinispan-core-7.1.1.Final.jar
+maven://org.infinispan/infinispan-commons/7.1.1.Final|lib/infinispan/infinispan-commons-7.1.1.Final.jar
+maven://org.jgroups/jgroups/3.6.1.Final|lib/infinispan/jgroups-3.6.1.Final.jar
+maven://org.jboss.marshalling/jboss-marshalling-osgi/1.4.4.Final|lib/infinispan/jboss-marshalling-osgi-1.4.4.Final.jar
+maven://org.jboss.logging/jboss-logging/3.1.2.GA|lib/infinispan/jboss-logging-3.1.2.GA.jar
+
+[lib]
+lib/jetty-infinispan-${jetty.version}.jar
+lib/infinispan/*.jar
+
+[xml]
+etc/jetty-infinispan.xml
+
+[license]
+Infinispan is an open source project hosted on Github and released under the Apache 2.0 license.
+http://infinispan.org/
+http://www.apache.org/licenses/LICENSE-2.0.html
+
+[ini-template]
+## Infinispan Session config
+
+## Unique identifier for this node in the cluster
+# jetty.infinispanSession.workerName=node1
+
diff --git a/jetty-infinispan/src/main/java/org/eclipse/jetty/session/infinispan/InfinispanSessionIdManager.java b/jetty-infinispan/src/main/java/org/eclipse/jetty/session/infinispan/InfinispanSessionIdManager.java
new file mode 100644
index 0000000..d7da914
--- /dev/null
+++ b/jetty-infinispan/src/main/java/org/eclipse/jetty/session/infinispan/InfinispanSessionIdManager.java
@@ -0,0 +1,374 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.session.infinispan;
+
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.SessionManager;
+import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.server.session.AbstractSession;
+import org.eclipse.jetty.server.session.AbstractSessionIdManager;
+import org.eclipse.jetty.server.session.SessionHandler;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.infinispan.commons.api.BasicCache;
+
+
+
+
+/**
+ * InfinispanSessionIdManager
+ *
+ * Maintain a set of in-use session ids. This session id manager does NOT locally store 
+ * a list of in-use sesssion ids, but rather stores them in the cluster cache. Thus,
+ * all operations to this session manager involve interaction with a possibly remote
+ * cache.
+ * 
+ * For each session id that is in-use, an entry of the following form is put into 
+ * the cluster cache:
+ * <pre>
+ *   ("__o.e.j.s.infinispanIdMgr__"+[id], [id])
+ * </pre>
+ * where [id] is the id of the session.
+ * 
+ * If the first session to be added is not immortal (ie it has a timeout on it) then
+ * the corresponding session id is entered into infinispan with an idle expiry timeout
+ * equivalent to double the session's timeout (the multiplier is configurable).
+ * 
+ * 
+ * Having one entry per in-use session id means that there is no contention on
+ * cache entries (as would be the case if a single entry was kept containing a 
+ * list of in-use session ids).
+ * 
+ * 
+ */
+public class InfinispanSessionIdManager extends AbstractSessionIdManager
+{
+    private  final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session");
+    public final static String ID_KEY = "__o.e.j.s.infinispanIdMgr__";
+    public static final int DEFAULT_IDLE_EXPIRY_MULTIPLE = 2;
+    protected BasicCache<String,Object> _cache;
+    private Server _server;
+    private int _idleExpiryMultiple = DEFAULT_IDLE_EXPIRY_MULTIPLE;
+
+    
+    
+    
+    
+    public InfinispanSessionIdManager(Server server)
+    {
+        super();
+        _server = server;
+    }
+
+    public InfinispanSessionIdManager(Server server, Random random)
+    {
+       super(random);
+       _server = server;
+    }
+
+    
+    
+    /** 
+     * Start the id manager.
+     * @see org.eclipse.jetty.server.session.AbstractSessionIdManager#doStart()
+     */
+    @Override
+    protected void doStart() throws Exception
+    {
+        super.doStart();
+    }
+
+    
+    
+    /** 
+     * Stop the id manager
+     * @see org.eclipse.jetty.server.session.AbstractSessionIdManager#doStop()
+     */
+    @Override
+    protected void doStop() throws Exception
+    {
+        super.doStop();
+    }
+
+    
+   
+
+    
+    /** 
+     * Check to see if the given session id is being
+     * used by a session in any context.
+     * 
+     * This method will consult the cluster.
+     * 
+     * @see org.eclipse.jetty.server.SessionIdManager#idInUse(java.lang.String)
+     */
+    @Override
+    public boolean idInUse(String id)
+    {
+        if (id == null)
+            return false;
+        
+        String clusterId = getClusterId(id);
+        
+        //ask the cluster - this should also tickle the idle expiration timer on the sessionid entry
+        //keeping it valid
+        try
+        {
+            return exists(clusterId);
+        }
+        catch (Exception e)
+        {
+            LOG.warn("Problem checking inUse for id="+clusterId, e);
+            return false;
+        }
+        
+    }
+
+    /** 
+     * Remember a new in-use session id.
+     * 
+     * This will save the in-use session id to the cluster.
+     * 
+     * @see org.eclipse.jetty.server.SessionIdManager#addSession(javax.servlet.http.HttpSession)
+     */
+    @Override
+    public void addSession(HttpSession session)
+    {
+        if (session == null)
+            return;
+
+        //insert into the cache and set an idle expiry on the entry that
+        //is based off the max idle time configured for the session. If the
+        //session is immortal, then there is no idle expiry on the corresponding
+        //session id
+        if (session.getMaxInactiveInterval() == 0)
+            insert (((AbstractSession)session).getClusterId());
+        else
+            insert (((AbstractSession)session).getClusterId(), session.getMaxInactiveInterval() * getIdleExpiryMultiple());
+    }
+    
+    
+    public void setIdleExpiryMultiple (int multiplier)
+    {
+        if (multiplier <= 1)
+        {
+            LOG.warn("Idle expiry multiple of {} for session ids set to less than minimum. Using value of {} instead.", multiplier, DEFAULT_IDLE_EXPIRY_MULTIPLE);
+        }
+        _idleExpiryMultiple = multiplier;
+    }
+
+    public int getIdleExpiryMultiple ()
+    {
+        return _idleExpiryMultiple;
+    }
+    
+    
+    /** 
+     * Remove a session id from the list of in-use ids.
+     * 
+     * This will remvove the corresponding session id from the cluster.
+     * 
+     * @see org.eclipse.jetty.server.SessionIdManager#removeSession(javax.servlet.http.HttpSession)
+     */
+    @Override
+    public void removeSession(HttpSession session)
+    {
+        if (session == null)
+            return;
+
+        //delete from the cache
+        delete (((AbstractSession)session).getClusterId());
+    }
+
+    /** 
+     * Remove a session id. This compels all other contexts who have a session
+     * with the same id to also remove it.
+     * 
+     * @see org.eclipse.jetty.server.SessionIdManager#invalidateAll(java.lang.String)
+     */
+    @Override
+    public void invalidateAll(String id)
+    {
+        //delete the session id from list of in-use sessions
+        delete (id);
+
+
+        //tell all contexts that may have a session object with this id to
+        //get rid of them
+        Handler[] contexts = _server.getChildHandlersByClass(ContextHandler.class);
+        for (int i=0; contexts!=null && i<contexts.length; i++)
+        {
+            SessionHandler sessionHandler = ((ContextHandler)contexts[i]).getChildHandlerByClass(SessionHandler.class);
+            if (sessionHandler != null)
+            {
+                SessionManager manager = sessionHandler.getSessionManager();
+
+                if (manager != null && manager instanceof InfinispanSessionManager)
+                {
+                    ((InfinispanSessionManager)manager).invalidateSession(id);
+                }
+            }
+        }
+
+    }
+
+    /** 
+     * Change a session id. 
+     * 
+     * Typically this occurs when a previously existing session has passed through authentication.
+     * 
+     * @see org.eclipse.jetty.server.session.AbstractSessionIdManager#renewSessionId(java.lang.String, java.lang.String, javax.servlet.http.HttpServletRequest)
+     */
+    @Override
+    public void renewSessionId(String oldClusterId, String oldNodeId, HttpServletRequest request)
+    {
+        //generate a new id
+        String newClusterId = newSessionId(request.hashCode());
+
+        delete(oldClusterId);
+        insert(newClusterId);
+
+
+        //tell all contexts to update the id 
+        Handler[] contexts = _server.getChildHandlersByClass(ContextHandler.class);
+        for (int i=0; contexts!=null && i<contexts.length; i++)
+        {
+            SessionHandler sessionHandler = ((ContextHandler)contexts[i]).getChildHandlerByClass(SessionHandler.class);
+            if (sessionHandler != null) 
+            {
+                SessionManager manager = sessionHandler.getSessionManager();
+
+                if (manager != null && manager instanceof InfinispanSessionManager)
+                {
+                    ((InfinispanSessionManager)manager).renewSessionId(oldClusterId, oldNodeId, newClusterId, getNodeId(newClusterId, request));
+                }
+            }
+        }
+
+    }
+
+    /**
+     * Get the cache.
+     * @return the cache
+     */
+    public BasicCache<String,Object> getCache() 
+    {
+        return _cache;
+    }
+
+    /**
+     * Set the cache.
+     * @param cache the cache
+     */
+    public void setCache(BasicCache<String,Object> cache) 
+    {
+        this._cache = cache;
+    }
+    
+    
+    
+    /**
+     * Do any operation to the session id in the cache to
+     * ensure its idle expiry time moves forward
+     * @param id the session id
+     */
+    public void touch (String id)
+    {
+        exists(id);
+    }
+    
+    
+    
+    /**
+     * Ask the cluster if a particular id exists.
+     * 
+     * @param id the session id
+     * @return true if exists
+     */
+    protected boolean exists (String id)
+    {
+        if (_cache == null)
+            throw new IllegalStateException ("No cache");
+        
+        return _cache.containsKey(makeKey(id));
+    }
+    
+
+    /**
+     * Put a session id into the cluster.
+     * 
+     * @param id the session id
+     */
+    protected void insert (String id)
+    {        
+        if (_cache == null)
+            throw new IllegalStateException ("No cache");
+        
+        _cache.putIfAbsent(makeKey(id), id);
+    }
+    
+    
+    /**
+     * Put a session id into the cluster with an idle expiry.
+     * 
+     * @param id the session id
+     * @param idleTimeOutSec idle timeout in seconds
+     */
+    protected void insert (String id, long idleTimeOutSec)
+    {
+        if (_cache == null)
+            throw new IllegalStateException ("No cache");
+        
+        _cache.putIfAbsent(makeKey(id),id,-1L, TimeUnit.SECONDS, idleTimeOutSec, TimeUnit.SECONDS);
+    }
+   
+    
+    /**
+     * Remove a session id from the cluster.
+     * 
+     * @param id the session id
+     */
+    protected void delete (String id)
+    {
+        if (_cache == null)
+            throw new IllegalStateException ("No cache");
+        
+        _cache.remove(makeKey(id));
+    }
+    
+    
+
+    /**
+     * Generate a unique cache key from the session id.
+     * 
+     * @param id the session id
+     * @return unique cache id
+     */
+    protected String makeKey (String id)
+    {
+        return ID_KEY+id;
+    }
+}
diff --git a/jetty-infinispan/src/main/java/org/eclipse/jetty/session/infinispan/InfinispanSessionManager.java b/jetty-infinispan/src/main/java/org/eclipse/jetty/session/infinispan/InfinispanSessionManager.java
new file mode 100644
index 0000000..039263a
--- /dev/null
+++ b/jetty-infinispan/src/main/java/org/eclipse/jetty/session/infinispan/InfinispanSessionManager.java
@@ -0,0 +1,1170 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.session.infinispan;
+
+import java.io.IOException;
+import java.io.ObjectStreamException;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.ReentrantLock;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.server.handler.ContextHandler.Context;
+import org.eclipse.jetty.server.session.AbstractSession;
+import org.eclipse.jetty.server.session.AbstractSessionManager;
+import org.eclipse.jetty.server.session.MemSession;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.ScheduledExecutorScheduler;
+import org.eclipse.jetty.util.thread.Scheduler;
+import org.infinispan.Cache;
+import org.infinispan.commons.api.BasicCache;
+import org.omg.CORBA._IDLTypeStub;
+
+/**
+ * InfinispanSessionManager
+ * 
+ * The data for a session relevant to a particular context is stored in an Infinispan (clustered) cache:
+ * <pre>
+ * Key:   is the id of the session + the context path + the vhost for the context 
+ * Value: is the data of the session
+ * </pre>
+ * 
+ * The key is necessarily complex because the same session id can be in-use by more than one
+ * context. In this case, the contents of the session will strictly be different for each
+ * context, although the id will be the same.
+ * 
+ * Sessions are also kept in local memory when they are used by this session manager. This allows
+ * multiple different request threads in the same context to call Request.getSession() and
+ * obtain the same object.
+ * 
+ * This session manager support scavenging, which is only done over the set of sessions in its
+ * local memory. This can result in some sessions being "stranded" in the cluster cache if no
+ * session manager is currently managing it (eg the node managing the session crashed and it
+ * was never requested on another node).
+ * 
+ */
+public class InfinispanSessionManager extends AbstractSessionManager
+{
+    private  final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session");
+    
+    /**
+     * Clustered cache of sessions
+     */
+    private BasicCache<String, Object> _cache;
+    
+    
+    /**
+     * Sessions known to this node held in memory
+     */
+    private ConcurrentHashMap<String, InfinispanSessionManager.Session> _sessions;
+
+    
+    /**
+     * The length of time a session can be in memory without being checked against
+     * the cluster. A value of 0 indicates that the session is never checked against
+     * the cluster - the current node is considered to be the master for the session.
+     *
+     */
+    private long _staleIntervalSec = 0;
+    
+    protected Scheduler.Task _task; //scavenge task
+    protected Scheduler _scheduler;
+    protected Scavenger _scavenger;
+    protected long _scavengeIntervalMs = 1000L * 60 * 10; //10mins
+    protected boolean _ownScheduler;
+    
+    
+
+    /**
+     * Scavenger
+     *
+     */
+    protected class Scavenger implements Runnable
+    {
+
+        @Override
+        public void run()
+        {
+           try
+           {
+               scavenge();
+           }
+           finally
+           {
+               if (_scheduler != null && _scheduler.isRunning())
+                   _task = _scheduler.schedule(this, _scavengeIntervalMs, TimeUnit.MILLISECONDS);
+           }
+        }
+    }
+    
+    
+    /*
+     * Every time a Session is put into the cache one of these objects
+     * is created to copy the data out of the in-memory session, and 
+     * every time an object is read from the cache one of these objects
+     * a fresh Session object is created based on the data held by this
+     * object.
+     */
+    public class SerializableSessionData implements Serializable
+    {
+        /**
+         * 
+         */
+        private static final long serialVersionUID = -7779120106058533486L;
+        String clusterId;
+        String contextPath;
+        String vhost;
+        long accessed;
+        long lastAccessed;
+        long createTime;
+        long cookieSetTime;
+        String lastNode;
+        long expiry;
+        long maxInactive;
+        Map<String, Object> attributes;
+
+        public SerializableSessionData()
+        {
+
+        }
+
+       
+       public SerializableSessionData(Session s)
+       {
+           clusterId = s.getClusterId();
+           contextPath = s.getContextPath();
+           vhost = s.getVHost();
+           accessed = s.getAccessed();
+           lastAccessed = s.getLastAccessedTime();
+           createTime = s.getCreationTime();
+           cookieSetTime = s.getCookieSetTime();
+           lastNode = s.getLastNode();
+           expiry = s.getExpiry();
+           maxInactive = s.getMaxInactiveInterval();
+           attributes = s.getAttributeMap(); // TODO pointer, not a copy
+       }
+        
+        private void writeObject(java.io.ObjectOutputStream out) throws IOException
+        {  
+            out.writeUTF(clusterId); //session id
+            out.writeUTF(contextPath); //context path
+            out.writeUTF(vhost); //first vhost
+
+            out.writeLong(accessed);//accessTime
+            out.writeLong(lastAccessed); //lastAccessTime
+            out.writeLong(createTime); //time created
+            out.writeLong(cookieSetTime);//time cookie was set
+            out.writeUTF(lastNode); //name of last node managing
+      
+            out.writeLong(expiry); 
+            out.writeLong(maxInactive);
+            out.writeObject(attributes);
+        }
+        
+        private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException
+        {
+            clusterId = in.readUTF();
+            contextPath = in.readUTF();
+            vhost = in.readUTF();
+            
+            accessed = in.readLong();//accessTime
+            lastAccessed = in.readLong(); //lastAccessTime
+            createTime = in.readLong(); //time created
+            cookieSetTime = in.readLong();//time cookie was set
+            lastNode = in.readUTF(); //last managing node
+            expiry = in.readLong(); 
+            maxInactive = in.readLong();
+            attributes = (HashMap<String,Object>)in.readObject();
+        }
+        
+    }
+    
+ 
+    
+    
+    /**
+     * Session
+     *
+     * Representation of a session in local memory.
+     */
+    public class Session extends MemSession
+    {
+        
+        private ReentrantLock _lock = new ReentrantLock();
+        
+        /**
+         * The (canonical) context path for with which this session is associated
+         */
+        private String _contextPath;
+        
+        
+        
+        /**
+         * The time in msec since the epoch at which this session should expire
+         */
+        private long _expiryTime; 
+        
+        
+        /**
+         * Time in msec since the epoch at which this session was last read from cluster
+         */
+        private long _lastSyncTime;
+        
+        
+        /**
+         * The workername of last node known to be managing the session
+         */
+        private String _lastNode;
+        
+        
+        /**
+         * If dirty, session needs to be (re)sent to cluster
+         */
+        protected boolean _dirty=false;
+        
+        
+     
+
+        /**
+         * Any virtual hosts for the context with which this session is associated
+         */
+        private String _vhost;
+
+        
+        /**
+         * Count of how many threads are active in this session
+         */
+        private AtomicInteger _activeThreads = new AtomicInteger(0);
+        
+        
+        
+        
+        /**
+         * A new session.
+         * 
+         * @param request the request
+         */
+        protected Session (HttpServletRequest request)
+        {
+            super(InfinispanSessionManager.this,request);
+            long maxInterval = getMaxInactiveInterval();
+            _expiryTime = (maxInterval <= 0 ? 0 : (System.currentTimeMillis() + maxInterval*1000L));
+            _lastNode = getSessionIdManager().getWorkerName();
+           setVHost(InfinispanSessionManager.getVirtualHost(_context));
+           setContextPath(InfinispanSessionManager.getContextPath(_context));
+           _activeThreads.incrementAndGet(); //access will not be called on a freshly created session so increment here
+        }
+        
+        
+        protected Session (SerializableSessionData sd)
+        {
+            super(InfinispanSessionManager.this, sd.createTime, sd.accessed, sd.clusterId);
+            _expiryTime = (sd.maxInactive <= 0 ? 0 : (System.currentTimeMillis() + sd.maxInactive*1000L));
+            setLastNode(sd.lastNode);
+            setContextPath(sd.contextPath);
+            setVHost(sd.vhost);
+            addAttributes(sd.attributes);
+        }
+        
+        
+        /**
+         * A restored session.
+         * 
+         * @param sessionId the session id
+         * @param created time created
+         * @param accessed time last accessed
+         * @param maxInterval max expiry interval
+         */
+        protected Session (String sessionId, long created, long accessed, long maxInterval)
+        {
+            super(InfinispanSessionManager.this, created, accessed, sessionId);
+            _expiryTime = (maxInterval <= 0 ? 0 : (System.currentTimeMillis() + maxInterval*1000L));
+        }
+        
+        /** 
+         * Called on entry to the session.
+         * 
+         * @see org.eclipse.jetty.server.session.AbstractSession#access(long)
+         */
+        @Override
+        protected boolean access(long time)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Access session({}) for context {} on worker {}", getId(), getContextPath(), getSessionIdManager().getWorkerName());
+            try
+            {
+
+                long now = System.currentTimeMillis();
+                //lock so that no other thread can call access or complete until the first one has refreshed the session object if necessary
+                _lock.lock();
+                //a request thread is entering
+                if (_activeThreads.incrementAndGet() == 1)
+                {
+                    //if the first thread, check that the session in memory is not stale, if we're checking for stale sessions
+                    if (getStaleIntervalSec() > 0  && (now - getLastSyncTime()) >= (getStaleIntervalSec() * 1000L))
+                    {
+                        if (LOG.isDebugEnabled())
+                            LOG.debug("Acess session({}) for context {} on worker {} stale session. Reloading.", getId(), getContextPath(), getSessionIdManager().getWorkerName());
+                        refresh();
+                    }
+                }
+            }
+            catch (Exception e)
+            {
+                LOG.warn(e);
+            }
+            finally
+            {            
+                _lock.unlock();
+            }
+
+            if (super.access(time))
+            {
+                int maxInterval=getMaxInactiveInterval();
+                _expiryTime = (maxInterval <= 0 ? 0 : (time + maxInterval*1000L));
+                return true;
+            }
+            return false;
+        }
+
+
+        /**
+         * Exit from session
+         * @see org.eclipse.jetty.server.session.AbstractSession#complete()
+         */
+        @Override
+        protected void complete()
+        {
+            super.complete();
+
+            //lock so that no other thread that might be calling access can proceed until this complete is done
+            _lock.lock();
+
+            try
+            {
+                //if this is the last request thread to be in the session
+                if (_activeThreads.decrementAndGet() == 0)
+                {
+                    try
+                    {
+                        //an invalid session will already have been removed from the
+                        //local session map and deleted from the cluster. If its valid save
+                        //it to the cluster.
+                        //TODO consider doing only periodic saves if only the last access
+                        //time to the session changes
+                        if (isValid())
+                        {
+                            //if session still valid && its dirty or stale or never been synced, write it to the cluster
+                            //otherwise, we just keep the updated last access time in memory
+                            if (_dirty || getLastSyncTime() == 0 || isStale(System.currentTimeMillis()))
+                            {
+                                willPassivate();
+                                save(this);
+                                didActivate();
+                            }
+                        }
+                    }
+                    catch (Exception e)
+                    {
+                        LOG.warn("Problem saving session({})",getId(), e);
+                    } 
+                    finally
+                    {
+                        _dirty = false;
+                    }
+                }
+            }
+            finally
+            {
+                _lock.unlock();
+            }
+        }
+        
+        /** Test if the session is stale
+         * @param atTime time when stale
+         * @return true if stale
+         */
+        protected boolean isStale (long atTime)
+        {
+            return (getStaleIntervalSec() > 0) && (atTime - getLastSyncTime() >= (getStaleIntervalSec()*1000L));
+        }
+        
+        
+        /** Test if the session is dirty
+         * @return true if dirty
+         */
+        protected boolean isDirty ()
+        {
+            return _dirty;
+        }
+
+        /** 
+         * Expire the session.
+         * 
+         * @see org.eclipse.jetty.server.session.AbstractSession#timeout()
+         */
+        @Override
+        protected void timeout()
+        {
+            super.timeout();
+        }
+        
+      
+        
+        /**
+         * Reload the session from the cluster. If the node that
+         * last managed the session from the cluster is ourself,
+         * then the session does not need refreshing.
+         * NOTE: this method MUST be called with sufficient locks
+         * in place to prevent 2 or more concurrent threads from
+         * simultaneously updating the session.
+         */
+        private void refresh ()
+        {
+            //get fresh copy from the cluster
+            Session fresh = load(makeKey(getClusterId(), _context));
+
+            //if the session no longer exists, invalidate
+            if (fresh == null)
+            {
+                invalidate();
+                return;
+            }
+
+            //cluster copy assumed to be the same as we were the last
+            //node to manage it
+            if (fresh.getLastNode().equals(getLastNode()))
+                return;
+
+            setLastNode(getSessionIdManager().getWorkerName());
+            
+            //prepare for refresh
+            willPassivate();
+
+            //if fresh has no attributes, remove them
+            if (fresh.getAttributes() == 0)
+                this.clearAttributes();
+            else
+            {
+                //reconcile attributes
+                for (String key:fresh.getAttributeMap().keySet())
+                {
+                    Object freshvalue = fresh.getAttribute(key);
+
+                    //session does not already contain this attribute, so bind it
+                    if (getAttribute(key) == null)
+                    { 
+                        doPutOrRemove(key,freshvalue);
+                        bindValue(key,freshvalue);
+                    }
+                    else //session already contains this attribute, update its value
+                    {
+                        doPutOrRemove(key,freshvalue);
+                    }
+
+                }
+                // cleanup, remove values from session, that don't exist in data anymore:
+                for (String key : getNames())
+                {
+                    if (fresh.getAttribute(key) == null)
+                    {
+                        Object oldvalue = getAttribute(key);
+                        doPutOrRemove(key,null);
+                        unbindValue(key,oldvalue);
+                    }
+                }
+            }
+            //finish refresh
+            didActivate();
+        }
+
+
+        public void setExpiry (long expiry)
+        {
+            _expiryTime = expiry;
+        }
+        
+
+        public long getExpiry ()
+        {
+            return _expiryTime;
+        }
+        
+        public void swapId (String newId, String newNodeId)
+        {
+            //TODO probably synchronize rather than use the access/complete lock?
+            _lock.lock();
+            setClusterId(newId);
+            setNodeId(newNodeId);
+            _lock.unlock();
+        }
+        
+        @Override
+        public void setAttribute (String name, Object value)
+        {
+            Object old = changeAttribute(name, value);
+            if (value == null && old == null)
+                return; //if same as remove attribute but attribute was already removed, no change
+            
+           _dirty = true;
+        }
+        
+        
+        public String getContextPath()
+        {
+            return _contextPath;
+        }
+
+
+        public void setContextPath(String contextPath)
+        {
+            this._contextPath = contextPath;
+        }
+
+
+        public String getVHost()
+        {
+            return _vhost;
+        }
+
+
+        public void setVHost(String vhost)
+        {
+            this._vhost = vhost;
+        }
+        
+        public String getLastNode()
+        {
+            return _lastNode;
+        }
+
+
+        public void setLastNode(String lastNode)
+        {
+            _lastNode = lastNode;
+        }
+
+
+        public long getLastSyncTime()
+        {
+            return _lastSyncTime;
+        }
+
+
+        public void setLastSyncTime(long lastSyncTime)
+        {
+            _lastSyncTime = lastSyncTime;
+        }
+
+    }
+
+
+
+    
+    /**
+     * Start the session manager.
+     *
+     * @see org.eclipse.jetty.server.session.AbstractSessionManager#doStart()
+     */
+    @Override
+    public void doStart() throws Exception
+    {
+        if (_sessionIdManager == null)
+            throw new IllegalStateException("No session id manager defined");
+        
+        if (_cache == null)
+            throw new IllegalStateException("No session cache defined");
+        
+        _sessions = new ConcurrentHashMap<String, Session>();
+
+        //try and use a common scheduler, fallback to own
+        _scheduler = getSessionHandler().getServer().getBean(Scheduler.class);
+        if (_scheduler == null)
+        {
+            _scheduler = new ScheduledExecutorScheduler();
+            _ownScheduler = true;
+            _scheduler.start();
+        }
+        else if (!_scheduler.isStarted())
+            throw new IllegalStateException("Shared scheduler not started");
+ 
+        setScavengeInterval(getScavengeInterval());
+        
+        super.doStart();
+    }
+
+
+    /**
+     * Stop the session manager.
+     *
+     * @see org.eclipse.jetty.server.session.AbstractSessionManager#doStop()
+     */
+    @Override
+    public void doStop() throws Exception
+    {
+        super.doStop();
+
+        if (_task!=null)
+            _task.cancel();
+        _task=null;
+        if (_ownScheduler && _scheduler !=null)
+            _scheduler.stop();
+        _scheduler = null;
+        
+        _sessions.clear();
+        _sessions = null;
+    }
+    
+    
+    
+    /**
+     * Look for sessions in local memory that have expired.
+     */
+    /**
+     * 
+     */
+    public void scavenge ()
+    {
+        Set<String> candidateIds = new HashSet<String>();
+        long now = System.currentTimeMillis();
+        
+        LOG.info("SessionManager for context {} scavenging at {} ", getContextPath(getContext()), now);
+        for (Map.Entry<String, Session> entry:_sessions.entrySet())
+        {
+            long expiry = entry.getValue().getExpiry();
+            if (expiry > 0 && expiry < now)
+                candidateIds.add(entry.getKey());
+        }
+
+        for (String candidateId:candidateIds)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Session {} expired ", candidateId);
+            
+            Session candidateSession = _sessions.get(candidateId);
+            if (candidateSession != null)
+            {
+                //double check the state of the session in the cache, as the
+                //session may have migrated to another node. This leaves a window
+                //where the cached session may have been changed by another node
+                Session cachedSession = load(makeKey(candidateId, _context));
+                if (cachedSession == null)
+                {
+                   if (LOG.isDebugEnabled()) LOG.debug("Locally expired session({}) does not exist in cluster ",candidateId);
+                    //the session no longer exists, do a full invalidation
+                    candidateSession.timeout();
+                }
+                else if (getSessionIdManager().getWorkerName().equals(cachedSession.getLastNode()))
+                {
+                    if (LOG.isDebugEnabled()) LOG.debug("Expiring session({}) local to session manager",candidateId);
+                    //if I am the master of the session then it can be timed out
+                    candidateSession.timeout();
+                }
+                else
+                {
+                    //some other node is the master of the session, simply remove it from my memory
+                    if (LOG.isDebugEnabled()) LOG.debug("Session({}) not local to this session manager, removing from local memory", candidateId);
+                    candidateSession.willPassivate();
+                    _sessions.remove(candidateSession.getClusterId());
+                }
+
+            }
+        }
+    }
+    
+    
+
+    public long getScavengeInterval ()
+    {
+        return _scavengeIntervalMs/1000;
+    }
+
+    
+    
+    /**
+     * Set the interval between runs of the scavenger. It should not be run too
+     * often.
+     * 
+     * 
+     * @param sec scavenge interval in seconds
+     */
+    public void setScavengeInterval (long sec)
+    {
+        if (sec<=0)
+            sec=60;
+
+        long old_period=_scavengeIntervalMs;
+        long period=sec*1000L;
+
+        _scavengeIntervalMs=period;
+
+        //add a bit of variability into the scavenge time so that not all
+        //nodes with the same scavenge time sync up
+        long tenPercent = _scavengeIntervalMs/10;
+        if ((System.currentTimeMillis()%2) == 0)
+            _scavengeIntervalMs += tenPercent;
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("Scavenging every "+_scavengeIntervalMs+" ms");
+        
+        synchronized (this)
+        {
+            if (_scheduler != null && (period!=old_period || _task==null))
+            {
+                if (_task!=null)
+                    _task.cancel();
+                if (_scavenger == null)
+                    _scavenger = new Scavenger();
+                
+                _task = _scheduler.schedule(_scavenger,_scavengeIntervalMs,TimeUnit.MILLISECONDS);
+            }
+        }
+    }
+    
+    
+    
+
+    /**
+     * Get the clustered cache instance.
+     * 
+     * @return the cache
+     */
+    public BasicCache<String, Object> getCache() 
+    {
+        return _cache;
+    }
+
+    
+    
+    /**
+     * Set the clustered cache instance.
+     * 
+     * @param cache the cache
+     */
+    public void setCache (BasicCache<String, Object> cache) 
+    {
+        this._cache = cache;
+    }
+
+
+    
+    
+    
+    public long getStaleIntervalSec()
+    {
+        return _staleIntervalSec;
+    }
+
+
+    public void setStaleIntervalSec(long staleIntervalSec)
+    {
+        _staleIntervalSec = staleIntervalSec;
+    }
+
+
+    /** 
+     * Add a new session for the context related to this session manager
+     * 
+     * @see org.eclipse.jetty.server.session.AbstractSessionManager#addSession(org.eclipse.jetty.server.session.AbstractSession)
+     */
+    @Override
+    protected void addSession(AbstractSession session)
+    {
+        if (session==null)
+            return;
+        
+        if (LOG.isDebugEnabled()) LOG.debug("Adding session({}) to session manager for context {} on worker {}",session.getClusterId(), getContextPath(getContext()),getSessionIdManager().getWorkerName() + " with lastnode="+((Session)session).getLastNode());
+        _sessions.put(session.getClusterId(), (Session)session);
+        
+        try
+        {     
+                session.willPassivate();
+                save(((InfinispanSessionManager.Session)session));
+                session.didActivate();
+            
+        }
+        catch (Exception e)
+        {
+            LOG.warn("Unable to store new session id="+session.getId() , e);
+        }
+    }
+
+    /** 
+     * Ask the cluster for the session.
+     * 
+     * @see org.eclipse.jetty.server.session.AbstractSessionManager#getSession(java.lang.String)
+     */
+    @Override
+    public AbstractSession getSession(String idInCluster)
+    {
+        Session session = null;
+
+        //try and find the session in this node's memory
+        Session memSession = (Session)_sessions.get(idInCluster);
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("getSession({}) {} in session map",idInCluster,(memSession==null?"not":""));
+
+        long now = System.currentTimeMillis();
+        try
+        {
+            //if the session is not in this node's memory, then load it from the cluster cache
+            if (memSession == null)
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("getSession({}): loading session data from cluster", idInCluster);
+
+                session = load(makeKey(idInCluster, _context));
+                if (session != null)
+                {
+                    //We retrieved a session with the same key from the database
+
+                    //Check that it wasn't expired
+                    if (session.getExpiry() > 0 && session.getExpiry() <= now)
+                    {
+                        if (LOG.isDebugEnabled()) LOG.debug("getSession ({}): Session expired", idInCluster);
+                        //ensure that the session id for the expired session is deleted so that a new session with the 
+                        //same id cannot be created (because the idInUse() test would succeed)
+                        ((InfinispanSessionIdManager)getSessionIdManager()).removeSession(session);
+                        return null;  
+                    }
+
+                    //Update the last worker node to me
+                    session.setLastNode(getSessionIdManager().getWorkerName());                            
+                    //TODO consider saving session here if lastNode was not this node
+
+                    //Check that another thread hasn't loaded the same session
+                    Session existingSession = _sessions.putIfAbsent(idInCluster, session);
+                    if (existingSession != null)
+                    {
+                        //use the one that the other thread inserted
+                        session = existingSession;
+                        LOG.debug("getSession({}): using session loaded by another request thread ", idInCluster);
+                    }
+                    else
+                    {
+                        //indicate that the session was reinflated
+                        session.didActivate();
+                        LOG.debug("getSession({}): loaded session from cluster", idInCluster);
+                    }
+                    return session;
+                }
+                else
+                {
+                    //The requested session does not exist anywhere in the cluster
+                    LOG.debug("getSession({}): No session in cluster matching",idInCluster);
+                    return null;
+                }
+            }
+            else
+            {
+               //The session exists in this node's memory
+               LOG.debug("getSession({}): returning session from local memory ", memSession.getClusterId());
+                return memSession;
+            }
+        }
+        catch (Exception e)
+        {
+            LOG.warn("Unable to load session="+idInCluster, e);
+            return null;
+        }
+    }
+    
+    
+
+    /** 
+     * The session manager is stopping.
+     * 
+     * @see org.eclipse.jetty.server.session.AbstractSessionManager#shutdownSessions()
+     */
+    @Override
+    protected void shutdownSessions() throws Exception
+    {
+        Set<String> keys = new HashSet<String>(_sessions.keySet());
+        for (String key:keys)
+        {
+            Session session = _sessions.remove(key); //take the session out of the session list
+            //If the session is dirty, then write it to the cluster.
+            //If the session is simply stale do NOT write it to the cluster, as some other node
+            //may have started managing that session - this means that the last accessed/expiry time
+            //will not be updated, meaning it may look like it can expire sooner than it should.
+            try
+            {
+                if (session.isDirty())
+                {
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Saving dirty session {} before exiting ", session.getId());
+                    save(session);
+                }
+            }
+            catch (Exception e)
+            {
+                LOG.warn(e);
+            }
+        }
+    }
+
+
+    @Override
+    protected AbstractSession newSession(HttpServletRequest request)
+    {
+        return new Session(request);
+    }
+
+    /** 
+     * Remove a session from local memory, and delete it from
+     * the cluster cache.
+     * 
+     * @see org.eclipse.jetty.server.session.AbstractSessionManager#removeSession(java.lang.String)
+     */
+    @Override
+    protected boolean removeSession(String idInCluster)
+    {
+        Session session = (Session)_sessions.remove(idInCluster);
+        try
+        {
+            if (session != null)
+                delete(session);
+        }
+        catch (Exception e)
+        {
+            LOG.warn("Problem deleting session id="+idInCluster, e);
+        }
+        return session!=null;
+    }
+    
+    
+    
+    
+    @Override
+    public void renewSessionId(String oldClusterId, String oldNodeId, String newClusterId, String newNodeId)
+    {
+        Session session = null;
+        try
+        {
+            //take the session with that id out of our managed list
+            session = (Session)_sessions.remove(oldClusterId);
+            if (session != null)
+            {
+                //TODO consider transactionality and ramifications if the session is live on another node
+                delete(session); //delete the old session from the cluster  
+                session.swapId(newClusterId, newNodeId); //update the session
+                _sessions.put(newClusterId, session); //put it into managed list under new key
+                save(session); //put the session under the new id into the cluster
+            }
+        }
+        catch (Exception e)
+        {
+            LOG.warn(e);
+        }
+
+        super.renewSessionId(oldClusterId, oldNodeId, newClusterId, newNodeId);
+    }
+
+
+    /**
+     * Load a session from the clustered cache.
+     * 
+     * @param key the session key
+     * @return the session
+     */
+    protected Session load (String key)
+    {
+        if (_cache == null)
+            throw new IllegalStateException("No cache");
+        
+        if (LOG.isDebugEnabled()) LOG.debug("Loading session {} from cluster", key);
+
+        SerializableSessionData storableSession = (SerializableSessionData)_cache.get(key);
+        if (storableSession == null)
+        {
+            if (LOG.isDebugEnabled()) LOG.debug("No session {} in cluster ",key);
+            return null;
+        }
+        else
+        {
+            Session session = new Session (storableSession);
+            session.setLastSyncTime(System.currentTimeMillis());
+            return session;
+        }
+    }
+    
+    
+    
+    /**
+     * Save or update the session to the cluster cache
+     * 
+     * @param session the session
+     * @throws Exception if unable to save
+     */
+    protected void save (InfinispanSessionManager.Session session)
+    throws Exception
+    {
+        if (_cache == null)
+            throw new IllegalStateException("No cache");
+        
+        if (LOG.isDebugEnabled()) LOG.debug("Writing session {} to cluster", session.getId());
+    
+        SerializableSessionData storableSession = new SerializableSessionData(session);
+
+        //Put an idle timeout on the cache entry if the session is not immortal - 
+        //if no requests arrive at any node before this timeout occurs, or no node 
+        //scavenges the session before this timeout occurs, the session will be removed.
+        //NOTE: that no session listeners can be called for this.
+        InfinispanSessionIdManager sessionIdManager = (InfinispanSessionIdManager)getSessionIdManager();
+        if (storableSession.maxInactive > 0)
+            _cache.put(makeKey(session, _context), storableSession, -1, TimeUnit.SECONDS, storableSession.maxInactive*sessionIdManager.getIdleExpiryMultiple(), TimeUnit.SECONDS);
+        else
+            _cache.put(makeKey(session, _context), storableSession);
+        
+        //tickle the session id manager to keep the sessionid entry for this session up-to-date
+        sessionIdManager.touch(session.getClusterId());
+        
+        session.setLastSyncTime(System.currentTimeMillis());
+    }
+    
+    
+    
+    /**
+     * Remove the session from the cluster cache.
+     * 
+     * @param session the session
+     */
+    protected void delete (InfinispanSessionManager.Session session)
+    {  
+        if (_cache == null)
+            throw new IllegalStateException("No cache");
+        if (LOG.isDebugEnabled()) LOG.debug("Removing session {} from cluster", session.getId());
+        _cache.remove(makeKey(session, _context));
+    }
+
+    
+    /**
+     * Invalidate a session for this context with the given id
+     * 
+     * @param idInCluster session id in cluster
+     */
+    public void invalidateSession (String idInCluster)
+    {
+        Session session = (Session)_sessions.get(idInCluster);
+
+        if (session != null)
+        {
+            session.invalidate();
+        }
+    }
+
+    
+    /**
+     * Make a unique key for this session.
+     * As the same session id can be used across multiple contexts, to
+     * make it unique, the key must be composed of:
+     * <ol>
+     * <li>the id</li>
+     * <li>the context path</li>
+     * <li>the virtual hosts</li>
+     * </ol>
+     * 
+     *TODO consider the difference between getClusterId and getId
+     * @param session
+     * @return
+     */
+    private String makeKey (Session session, Context context)
+    {
+       return makeKey(session.getId(), context);
+    }
+    
+    /**
+     * Make a unique key for this session.
+     * As the same session id can be used across multiple contexts, to
+     * make it unique, the key must be composed of:
+     * <ol>
+     * <li>the id</li>
+     * <li>the context path</li>
+     * <li>the virtual hosts</li>
+     * </ol>
+     * 
+     *TODO consider the difference between getClusterId and getId
+     * @param session
+     * @return
+     */
+    private String makeKey (String id, Context context)
+    {
+        String key = getContextPath(context);
+        key = key + "_" + getVirtualHost(context);
+        key = key+"_"+id;
+        return key;
+    }
+    
+    /**
+     * Turn the context path into an acceptable string
+     * 
+     * @param context
+     * @return
+     */
+    private static String getContextPath (ContextHandler.Context context)
+    {
+        return canonicalize (context.getContextPath());
+    }
+
+    /**
+     * Get the first virtual host for the context.
+     *
+     * Used to help identify the exact session/contextPath.
+     *
+     * @return 0.0.0.0 if no virtual host is defined
+     */
+    private static String getVirtualHost (ContextHandler.Context context)
+    {
+        String vhost = "0.0.0.0";
+
+        if (context==null)
+            return vhost;
+
+        String [] vhosts = context.getContextHandler().getVirtualHosts();
+        if (vhosts==null || vhosts.length==0 || vhosts[0]==null)
+            return vhost;
+
+        return vhosts[0];
+    }
+
+    /**
+     * Make an acceptable name from a context path.
+     *
+     * @param path
+     * @return
+     */
+    private static String canonicalize (String path)
+    {
+        if (path==null)
+            return "";
+
+        return path.replace('/', '_').replace('.','_').replace('\\','_');
+    }
+
+}
diff --git a/jetty-infinispan/src/main/java/org/eclipse/jetty/session/infinispan/WebAppMarshaller.java b/jetty-infinispan/src/main/java/org/eclipse/jetty/session/infinispan/WebAppMarshaller.java
new file mode 100644
index 0000000..0a6fd2c
--- /dev/null
+++ b/jetty-infinispan/src/main/java/org/eclipse/jetty/session/infinispan/WebAppMarshaller.java
@@ -0,0 +1,84 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.session.infinispan;
+
+import org.infinispan.commons.marshall.jboss.AbstractJBossMarshaller;
+import org.jboss.marshalling.ContextClassResolver;
+
+
+/**
+ * WebAppMarshaller
+ *
+ * An implementation of the AbstractJBossMarshaller code that is just
+ * enough to provide a ContextClassResolver that will use the Thread Context Classloader
+ * in order to deserialize session attribute classes.  
+ * 
+ * This is necessary because the standard infinispan marshaller (GenericJBossMarshaller) uses the
+ * classloader of the loader that loaded itself. When using the infinispan module in Jetty, all of
+ * the infinispan classes will be on the container classpath. That means that the GenericJBossMarshaller
+ * returns the container classloader which is unable to load any webapp classes. This class ensures
+ * that it is always the webapp's classloader that will be used.
+ * 
+ * In order to use this class, you should put a hotrod-client.properties file into the
+ * ${jetty.base}/resources directory that contains this line:
+ * 
+ * infinispan.client.hotrod.marshaller=org.eclipse.jetty.session.infinispan.WebAppMarshaller
+ * 
+ * You will also need to add the following lines to a context xml file for your webapp to
+ * permit the webapp's classloader to see the org.eclipse.jetty.session.infinispan classes for
+ * the deserialization to work correctly:
+ * 
+ *  &lt;Call name="prependServerClass"&gt;
+ *   &lt;Arg&gt;-org.eclipse.jetty.session.infinispan.&lt;/Arg&gt;
+ * &lt;/Call&gt;
+ *
+ */
+public class WebAppMarshaller extends AbstractJBossMarshaller 
+{
+
+    /**
+     * WebAppContextClassResolver
+     *
+     * Provides the Thread Context Classloader to use for deserializing.
+     * 
+     */
+    public static class WebAppContextClassResolver extends ContextClassResolver
+    {
+        public WebAppContextClassResolver ()
+        {
+            super();
+        }
+
+        @Override
+        protected ClassLoader getClassLoader()
+        {
+            return Thread.currentThread().getContextClassLoader();
+        }
+    }
+
+
+
+    public WebAppMarshaller ()
+    {
+        super();		
+        baseCfg.setClassResolver(new WebAppContextClassResolver());                         
+    }
+
+
+}
diff --git a/jetty-io/pom.xml b/jetty-io/pom.xml
index 0d82512..127b2b5 100644
--- a/jetty-io/pom.xml
+++ b/jetty-io/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <artifactId>jetty-project</artifactId>
     <groupId>org.eclipse.jetty</groupId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-io</artifactId>
@@ -31,35 +31,6 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-           </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>artifact-jar</id>
-            <goals>
-              <goal>jar</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
         <configuration>
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractConnection.java b/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractConnection.java
index dfcd906..1ae1a7a 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractConnection.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractConnection.java
@@ -23,12 +23,10 @@
 import java.util.concurrent.Executor;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicReference;
 
 import org.eclipse.jetty.util.Callback;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.util.thread.NonBlockingThread;
 
 /**
  * <p>A convenience base implementation of {@link Connection}.</p>
@@ -41,31 +39,20 @@
 {
     private static final Logger LOG = Log.getLogger(AbstractConnection.class);
 
-    public static final boolean EXECUTE_ONFILLABLE=true;
-
     private final List<Listener> listeners = new CopyOnWriteArrayList<>();
-    private final AtomicReference<State> _state = new AtomicReference<>(IDLE);
     private final long _created=System.currentTimeMillis();
     private final EndPoint _endPoint;
     private final Executor _executor;
     private final Callback _readCallback;
-    private final boolean _executeOnfillable;
     private int _inputBufferSize=2048;
 
     protected AbstractConnection(EndPoint endp, Executor executor)
     {
-        this(endp,executor,EXECUTE_ONFILLABLE);
-    }
-
-    protected AbstractConnection(EndPoint endp, Executor executor, final boolean executeOnfillable)
-    {
         if (executor == null)
             throw new IllegalArgumentException("Executor must not be null!");
         _endPoint = endp;
         _executor = executor;
         _readCallback = new ReadCallback();
-        _executeOnfillable=executeOnfillable;
-        _state.set(IDLE);
     }
 
     @Override
@@ -89,9 +76,26 @@
         return _executor;
     }
 
+    @Deprecated
+    public boolean isDispatchIO()
+    {
+        return false;
+    }
+
     protected void failedCallback(final Callback callback, final Throwable x)
     {
-        if (NonBlockingThread.isNonBlockingThread())
+        if (callback.isNonBlocking())
+        {
+            try
+            {
+                callback.failed(x);
+            }
+            catch (Exception e)
+            {
+                LOG.warn(e);
+            }
+        }
+        else
         {
             try
             {
@@ -100,7 +104,14 @@
                     @Override
                     public void run()
                     {
-                        callback.failed(x);
+                        try
+                        {
+                            callback.failed(x);
+                        }
+                        catch (Exception e)
+                        {
+                            LOG.warn(e);
+                        }
                     }
                 });
             }
@@ -110,10 +121,6 @@
                 callback.failed(x);
             }
         }
-        else
-        {
-            callback.failed(x);
-        }
     }
 
     /**
@@ -126,30 +133,12 @@
     {
         if (LOG.isDebugEnabled())
             LOG.debug("fillInterested {}",this);
-
-        while(true)
-        {
-            State state=_state.get();
-            if (next(state,state.fillInterested()))
-                break;
-        }
+        getEndPoint().fillInterested(_readCallback);
     }
 
-    public void fillInterested(Callback callback)
+    public boolean isFillInterested()
     {
-        if (LOG.isDebugEnabled())
-            LOG.debug("fillInterested {}",this);
-
-        while(true)
-        {
-            State state=_state.get();
-            // TODO yuck
-            if (state instanceof FillingInterestedCallback && ((FillingInterestedCallback)state)._callback==callback)
-                break;
-            State next=new FillingInterestedCallback(callback,state);
-            if (next(state,next))
-                break;
-        }
+        return getEndPoint().isFillInterested();
     }
 
     /**
@@ -176,12 +165,12 @@
                 if (_endPoint.isOutputShutdown())
                     _endPoint.close();
                 else
+                {
                     _endPoint.shutdownOutput();
+                    fillInterested();
+                }
             }
         }
-
-        if (_endPoint.isOpen())
-            fillInterested();
     }
 
     /**
@@ -258,334 +247,24 @@
     @Override
     public String toString()
     {
-        return String.format("%s@%x[%s,%s]",
+        return String.format("%s@%x[%s]",
                 getClass().getSimpleName(),
                 hashCode(),
-                _state.get(),
                 _endPoint);
     }
 
-    public boolean next(State state, State next)
-    {
-        if (next==null)
-            return true;
-        if(_state.compareAndSet(state,next))
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("{}-->{} {}",state,next,this);
-            if (next!=state)
-                next.onEnter(AbstractConnection.this);
-            return true;
-        }
-        return false;
-    }
-
-    private static final class IdleState extends State
-    {
-        private IdleState()
-        {
-            super("IDLE");
-        }
-
-        @Override
-        State fillInterested()
-        {
-            return FILL_INTERESTED;
-        }
-    }
-
-
-    private static final class FillInterestedState extends State
-    {
-        private FillInterestedState()
-        {
-            super("FILL_INTERESTED");
-        }
-
-        @Override
-        public void onEnter(AbstractConnection connection)
-        {
-            connection.getEndPoint().fillInterested(connection._readCallback);
-        }
-
-        @Override
-        State fillInterested()
-        {
-            return this;
-        }
-
-        @Override
-        public State onFillable()
-        {
-            return FILLING;
-        }
-
-        @Override
-        State onFailed()
-        {
-            return IDLE;
-        }
-    }
-
-
-    private static final class RefillingState extends State
-    {
-        private RefillingState()
-        {
-            super("REFILLING");
-        }
-
-        @Override
-        State fillInterested()
-        {
-            return FILLING_FILL_INTERESTED;
-        }
-
-        @Override
-        public State onFilled()
-        {
-            return IDLE;
-        }
-    }
-
-
-    private static final class FillingFillInterestedState extends State
-    {
-        private FillingFillInterestedState(String name)
-        {
-            super(name);
-        }
-
-        @Override
-        State fillInterested()
-        {
-            return this;
-        }
-
-        State onFilled()
-        {
-            return FILL_INTERESTED;
-        }
-    }
-
-
-    private static final class FillingState extends State
-    {
-        private FillingState()
-        {
-            super("FILLING");
-        }
-
-        @Override
-        public void onEnter(AbstractConnection connection)
-        {
-            if (connection._executeOnfillable)
-                connection.getExecutor().execute(connection._runOnFillable);
-            else
-                connection._runOnFillable.run();
-        }
-
-        @Override
-        State fillInterested()
-        {
-            return FILLING_FILL_INTERESTED;
-        }
-
-        @Override
-        public State onFilled()
-        {
-            return IDLE;
-        }
-    }
-
-
-    public static class State
-    {
-        private final String _name;
-        State(String name)
-        {
-            _name=name;
-        }
-
-        @Override
-        public String toString()
-        {
-            return _name;
-        }
-
-        void onEnter(AbstractConnection connection)
-        {
-        }
-
-        State fillInterested()
-        {
-            throw new IllegalStateException(this.toString());
-        }
-
-        State onFillable()
-        {
-            throw new IllegalStateException(this.toString());
-        }
-
-        State onFilled()
-        {
-            throw new IllegalStateException(this.toString());
-        }
-
-        State onFailed()
-        {
-            throw new IllegalStateException(this.toString());
-        }
-    }
-
-
-    public static final State IDLE=new IdleState();
-
-    public static final State FILL_INTERESTED=new FillInterestedState();
-
-    public static final State FILLING=new FillingState();
-
-    public static final State REFILLING=new RefillingState();
-
-    public static final State FILLING_FILL_INTERESTED=new FillingFillInterestedState("FILLING_FILL_INTERESTED");
-
-    public class NestedState extends State
-    {
-        private final State _nested;
-
-        NestedState(State nested)
-        {
-            super("NESTED("+nested+")");
-            _nested=nested;
-        }
-        NestedState(String name,State nested)
-        {
-            super(name+"("+nested+")");
-            _nested=nested;
-        }
-
-        @Override
-        State fillInterested()
-        {
-            return new NestedState(_nested.fillInterested());
-        }
-
-        @Override
-        State onFillable()
-        {
-            return new NestedState(_nested.onFillable());
-        }
-
-        @Override
-        State onFilled()
-        {
-            return new NestedState(_nested.onFilled());
-        }
-    }
-
-
-    public class FillingInterestedCallback extends NestedState
-    {
-        private final Callback _callback;
-
-        FillingInterestedCallback(Callback callback,State nested)
-        {
-            super("FILLING_INTERESTED_CALLBACK",nested==FILLING?REFILLING:nested);
-            _callback=callback;
-        }
-
-        @Override
-        void onEnter(final AbstractConnection connection)
-        {
-            Callback callback=new Callback()
-            {
-                @Override
-                public void succeeded()
-                {
-                    while(true)
-                    {
-                        State state = connection._state.get();
-                        if (!(state instanceof NestedState))
-                            break;
-                        State nested=((NestedState)state)._nested;
-                        if (connection.next(state,nested))
-                            break;
-                    }
-                    _callback.succeeded();
-                }
-
-                @Override
-                public void failed(Throwable x)
-                {
-                    while(true)
-                    {
-                        State state = connection._state.get();
-                        if (!(state instanceof NestedState))
-                            break;
-                        State nested=((NestedState)state)._nested;
-                        if (connection.next(state,nested))
-                            break;
-                    }
-                    _callback.failed(x);
-                }
-            };
-
-            connection.getEndPoint().fillInterested(callback);
-        }
-    }
-
-    private final Runnable _runOnFillable = new Runnable()
-    {
-        @Override
-        public void run()
-        {
-            try
-            {
-                onFillable();
-            }
-            finally
-            {
-                while(true)
-                {
-                    State state=_state.get();
-                    if (next(state,state.onFilled()))
-                        break;
-                }
-            }
-        }
-    };
-
-
     private class ReadCallback implements Callback
     {
         @Override
         public void succeeded()
         {
-            while(true)
-            {
-                State state=_state.get();
-                if (next(state,state.onFillable()))
-                    break;
-            }
+            onFillable();
         }
 
         @Override
         public void failed(final Throwable x)
         {
-            _executor.execute(new Runnable()
-            {
-                @Override
-                public void run()
-                {
-                    while(true)
-                    {
-                        State state=_state.get();
-                        if (next(state,state.onFailed()))
-                            break;
-                    }
-                    onFillInterestedFailed(x);
-                }
-            });
+            onFillInterestedFailed(x);
         }
 
         @Override
@@ -593,5 +272,5 @@
         {
             return String.format("AC.ReadCB@%x{%s}", AbstractConnection.this.hashCode(),AbstractConnection.this);
         }
-    };
+    }
 }
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractEndPoint.java b/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractEndPoint.java
index 19abf0b..0444f78 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractEndPoint.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractEndPoint.java
@@ -40,16 +40,16 @@
     private final FillInterest _fillInterest = new FillInterest()
     {
         @Override
-        protected boolean needsFill() throws IOException
+        protected void needsFillInterest() throws IOException
         {
-            return AbstractEndPoint.this.needsFill();
+            AbstractEndPoint.this.needsFillInterest();
         }
     };
-    
+
     private final WriteFlusher _writeFlusher = new WriteFlusher(this)
     {
         @Override
-        protected void onIncompleteFlushed()
+        protected void onIncompleteFlush()
         {
             AbstractEndPoint.this.onIncompleteFlush();
         }
@@ -79,7 +79,7 @@
     {
         return _remote;
     }
-    
+
     @Override
     public Connection getConnection()
     {
@@ -93,6 +93,12 @@
     }
 
     @Override
+    public boolean isOptimizedForDirectBuffers()
+    {
+        return false;
+    }
+
+    @Override
     public void onOpen()
     {
         if (LOG.isDebugEnabled())
@@ -109,7 +115,7 @@
         _writeFlusher.onClose();
         _fillInterest.onClose();
     }
-    
+
     @Override
     public void close()
     {
@@ -124,6 +130,12 @@
     }
 
     @Override
+    public boolean isFillInterested()
+    {
+        return _fillInterest.isInterested();
+    }
+
+    @Override
     public void write(Callback callback, ByteBuffer... buffers) throws IllegalStateException
     {
         _writeFlusher.write(callback, buffers);
@@ -131,9 +143,9 @@
 
     protected abstract void onIncompleteFlush();
 
-    protected abstract boolean needsFill() throws IOException;
+    protected abstract void needsFillInterest() throws IOException;
 
-    protected FillInterest getFillInterest()
+    public FillInterest getFillInterest()
     {
         return _fillInterest;
     }
@@ -150,17 +162,17 @@
         boolean input_shutdown=isInputShutdown();
         boolean fillFailed = _fillInterest.onFail(timeout);
         boolean writeFailed = _writeFlusher.onFail(timeout);
-        
+
         // If the endpoint is half closed and there was no fill/write handling, then close here.
-        // This handles the situation where the connection has completed its close handling 
+        // This handles the situation where the connection has completed its close handling
         // and the endpoint is half closed, but the other party does not complete the close.
         // This perhaps should not check for half closed, however the servlet spec case allows
-        // for a dispatched servlet or suspended request to extend beyond the connections idle 
-        // time.  So if this test would always close an idle endpoint that is not handled, then 
+        // for a dispatched servlet or suspended request to extend beyond the connections idle
+        // time.  So if this test would always close an idle endpoint that is not handled, then
         // we would need a mode to ignore timeouts for some HTTP states
         if (isOpen() && (output_shutdown || input_shutdown) && !(fillFailed || writeFailed))
             close();
-        else 
+        else
             LOG.debug("Ignored idle endpoint {}",this);
     }
 
@@ -171,12 +183,12 @@
 
         if (LOG.isDebugEnabled())
             LOG.debug("{} upgradeing from {} to {}", this, old_connection, newConnection);
-        
+
         ByteBuffer prefilled = (old_connection instanceof Connection.UpgradeFrom)
                 ?((Connection.UpgradeFrom)old_connection).onUpgradeFrom():null;
         old_connection.onClose();
         old_connection.getEndPoint().setConnection(newConnection);
-        
+
         if (newConnection instanceof Connection.UpgradeTo)
             ((Connection.UpgradeTo)newConnection).onUpgradeTo(prefilled);
         else if (BufferUtil.hasContent(prefilled))
@@ -184,20 +196,28 @@
 
         newConnection.onOpen();
     }
-    
+
     @Override
     public String toString()
     {
+        Class<?> c=getClass();
+        String name=c.getSimpleName();
+        while (name.length()==0 && c.getSuperclass()!=null)
+        {
+            c=c.getSuperclass();
+            name=c.getSimpleName();
+        }
+
         return String.format("%s@%x{%s<->%d,%s,%s,%s,%s,%s,%d/%d,%s}",
-                getClass().getSimpleName(),
+                name,
                 hashCode(),
                 getRemoteAddress(),
                 getLocalAddress().getPort(),
                 isOpen()?"Open":"CLOSED",
                 isInputShutdown()?"ISHUT":"in",
                 isOutputShutdown()?"OSHUT":"out",
-                _fillInterest.isInterested()?"R":"-",
-                _writeFlusher.isInProgress()?"W":"-",
+                _fillInterest.toStateString(),
+                _writeFlusher.toStateString(),
                 getIdleFor(),
                 getIdleTimeout(),
                 getConnection()==null?null:getConnection().getClass().getSimpleName());
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayEndPoint.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayEndPoint.java
index 331eb25..cbaebf7 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayEndPoint.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayEndPoint.java
@@ -18,16 +18,20 @@
 
 package org.eclipse.jetty.io;
 
+import java.io.EOFException;
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.nio.ByteBuffer;
 import java.nio.channels.ClosedChannelException;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
+import java.util.Queue;
 
+import org.eclipse.jetty.util.ArrayQueue;
 import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.Locker;
 import org.eclipse.jetty.util.thread.Scheduler;
 
 
@@ -39,14 +43,24 @@
 {
     static final Logger LOG = Log.getLogger(ByteArrayEndPoint.class);
     public final static InetSocketAddress NOIP=new InetSocketAddress(0);
+    private static final ByteBuffer EOF = BufferUtil.allocate(0);
 
-    protected volatile ByteBuffer _in;
-    protected volatile ByteBuffer _out;
-    protected volatile boolean _ishut;
-    protected volatile boolean _oshut;
-    protected volatile boolean _closed;
-    protected volatile boolean _growOutput;
+    private final Runnable _runFillable = new Runnable()
+    {
+        @Override
+        public void run()
+        {
+            getFillInterest().fillable();
+        }
+    };
 
+    private final Locker _locker = new Locker();
+    private final Queue<ByteBuffer> _inQ = new ArrayQueue<>();
+    private ByteBuffer _out;
+    private boolean _ishut;
+    private boolean _oshut;
+    private boolean _closed;
+    private boolean _growOutput;
 
     /* ------------------------------------------------------------ */
     /**
@@ -59,7 +73,8 @@
 
     /* ------------------------------------------------------------ */
     /**
-     *
+     * @param input the input bytes
+     * @param outputSize the output size
      */
     public ByteArrayEndPoint(byte[] input, int outputSize)
     {
@@ -68,7 +83,8 @@
 
     /* ------------------------------------------------------------ */
     /**
-     *
+     * @param input the input string (converted to bytes using default encoding charset)
+     * @param outputSize the output size
      */
     public ByteArrayEndPoint(String input, int outputSize)
     {
@@ -97,15 +113,12 @@
     public ByteArrayEndPoint(Scheduler timer, long idleTimeoutMs, ByteBuffer input, ByteBuffer output)
     {
         super(timer,NOIP,NOIP);
-        _in=input==null?BufferUtil.EMPTY_BUFFER:input;
+        if (BufferUtil.hasContent(input))
+            addInput(input);
         _out=output==null?BufferUtil.allocate(1024):output;
         setIdleTimeout(idleTimeoutMs);
     }
 
-
-
-
-
     /* ------------------------------------------------------------ */
     @Override
     protected void onIncompleteFlush()
@@ -114,52 +127,94 @@
     }
 
     /* ------------------------------------------------------------ */
+    protected void execute(Runnable task)
+    {
+        new Thread(task,"BAEPoint-"+Integer.toHexString(hashCode())).start();
+    }
+
+    /* ------------------------------------------------------------ */
     @Override
-    protected boolean needsFill() throws IOException
+    protected void needsFillInterest() throws IOException
     {
-        if (_closed)
-            throw new ClosedChannelException();
-        return _in == null || BufferUtil.hasContent(_in);
-    }
+        try(Locker.Lock lock = _locker.lock())
+        {
+            if (_closed)
+                throw new ClosedChannelException();
 
-    /* ------------------------------------------------------------ */
-    /**
-     * @return Returns the in.
-     */
-    public ByteBuffer getIn()
-    {
-        return _in;
+            ByteBuffer in = _inQ.peek();
+            if (BufferUtil.hasContent(in) || in==EOF)
+                execute(_runFillable);
+        }
     }
 
     /* ------------------------------------------------------------ */
     /**
      */
-    public void setInputEOF()
+    public void addInputEOF()
     {
-        _in = null;
+        addInput((ByteBuffer)null);
     }
 
     /* ------------------------------------------------------------ */
     /**
      * @param in The in to set.
      */
-    public void setInput(ByteBuffer in)
+    public void addInput(ByteBuffer in)
     {
-        _in = in;
-        if (in == null || BufferUtil.hasContent(in))
-            getFillInterest().fillable();
+        boolean fillable=false;
+        try(Locker.Lock lock = _locker.lock())
+        {
+            if (_inQ.peek()==EOF)
+                throw new RuntimeIOException(new EOFException());
+            boolean was_empty=_inQ.isEmpty();
+            if (in==null)
+            {
+                _inQ.add(EOF);
+                fillable=true;
+            }
+            if (BufferUtil.hasContent(in))
+            {
+                _inQ.add(in);
+                fillable=was_empty;
+            }
+        }
+        if (fillable)
+            _runFillable.run();
+    }
+
+    public void addInputAndExecute(ByteBuffer in)
+    {
+        boolean fillable=false;
+        try(Locker.Lock lock = _locker.lock())
+        {
+            if (_inQ.peek()==EOF)
+                throw new RuntimeIOException(new EOFException());
+            boolean was_empty=_inQ.isEmpty();
+            if (in==null)
+            {
+                _inQ.add(EOF);
+                fillable=true;
+            }
+            if (BufferUtil.hasContent(in))
+            {
+                _inQ.add(in);
+                fillable=was_empty;
+            }
+        }
+        if (fillable)
+            execute(_runFillable);
     }
 
     /* ------------------------------------------------------------ */
-    public void setInput(String s)
+    public void addInput(String s)
     {
-        setInput(BufferUtil.toBuffer(s,StandardCharsets.UTF_8));
+        addInput(BufferUtil.toBuffer(s,StandardCharsets.UTF_8));
     }
 
     /* ------------------------------------------------------------ */
-    public void setInput(String s,Charset charset)
+    public void addInput(String s,Charset charset)
     {
-        setInput(BufferUtil.toBuffer(s,charset));
+        addInput(BufferUtil.toBuffer(s,charset));
     }
 
     /* ------------------------------------------------------------ */
@@ -182,6 +237,7 @@
 
     /* ------------------------------------------------------------ */
     /**
+     * @param charset the charset to encode the output as
      * @return Returns the out.
      */
     public String getOutputString(Charset charset)
@@ -212,6 +268,7 @@
 
     /* ------------------------------------------------------------ */
     /**
+     * @param charset the charset to encode the output as
      * @return Returns the out.
      */
     public String takeOutputString(Charset charset)
@@ -237,7 +294,10 @@
     @Override
     public boolean isOpen()
     {
-        return !_closed;
+        try(Locker.Lock lock = _locker.lock())
+        {
+            return !_closed;
+        }
     }
 
     /* ------------------------------------------------------------ */
@@ -246,7 +306,10 @@
     @Override
     public boolean isInputShutdown()
     {
-        return _ishut||_closed;
+        try(Locker.Lock lock = _locker.lock())
+        {
+            return _ishut||_closed;
+        }
     }
 
     /* ------------------------------------------------------------ */
@@ -255,15 +318,24 @@
     @Override
     public boolean isOutputShutdown()
     {
-        return _oshut||_closed;
+        try(Locker.Lock lock = _locker.lock())
+        {
+            return _oshut||_closed;
+        }
     }
 
     /* ------------------------------------------------------------ */
-    private void shutdownInput()
+    public void shutdownInput()
     {
-        _ishut=true;
-        if (_oshut)
-            close();
+        boolean close=false;
+        try(Locker.Lock lock = _locker.lock())
+        {
+            _ishut=true;
+            if (_oshut && !_closed)
+                close=_closed=true;
+        }
+        if (close)
+            super.close();
     }
 
     /* ------------------------------------------------------------ */
@@ -273,9 +345,15 @@
     @Override
     public void shutdownOutput()
     {
-        _oshut=true;
-        if (_ishut)
-            close();
+        boolean close=false;
+        try(Locker.Lock lock = _locker.lock())
+        {
+            _oshut=true;
+            if (_ishut && !_closed)
+                close=_closed=true;
+        }
+        if (close)
+            super.close();
     }
 
     /* ------------------------------------------------------------ */
@@ -285,8 +363,14 @@
     @Override
     public void close()
     {
-        super.close();
-        _closed=true;
+        boolean close=false;
+        try(Locker.Lock lock = _locker.lock())
+        {
+            if (!_closed)
+                close=_closed=_ishut=_oshut=true;
+        }
+        if (close)
+            super.close();
     }
 
     /* ------------------------------------------------------------ */
@@ -305,13 +389,44 @@
     @Override
     public int fill(ByteBuffer buffer) throws IOException
     {
-        if (_closed)
-            throw new EofException("CLOSED");
-        if (_in==null)
-            shutdownInput();
-        if (_ishut)
-            return -1;
-        int filled=BufferUtil.append(buffer,_in);
+        int filled=0;
+        boolean close=false;
+        try(Locker.Lock lock = _locker.lock())
+        {
+            while(true)
+            {
+                if (_closed)
+                    throw new EofException("CLOSED");
+
+                if (_ishut)
+                    return -1;
+
+                if (_inQ.isEmpty())
+                    break;
+
+                ByteBuffer in= _inQ.peek();
+                if (in==EOF)
+                {
+                    _ishut=true;
+                    if (_oshut)
+                        close=_closed=true;
+                    filled=-1;
+                    break;
+                }
+
+                if (BufferUtil.hasContent(in))
+                {
+                    filled=BufferUtil.append(buffer,in);
+                    if (BufferUtil.isEmpty(in))
+                        _inQ.poll();
+                    break;
+                }
+                _inQ.poll();
+            }
+        }
+
+        if (close)
+            super.close();
         if (filled>0)
             notIdle();
         return filled;
@@ -373,7 +488,7 @@
         _ishut=false;
         _oshut=false;
         _closed=false;
-        _in=null;
+        _inQ.clear();
         BufferUtil.clear(_out);
     }
 
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java
index 6f75ed2..0f2d8be 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java
@@ -19,6 +19,10 @@
 package org.eclipse.jetty.io;
 
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jetty.util.BufferUtil;
 
 /**
  * <p>A {@link ByteBuffer} pool.</p>
@@ -48,4 +52,67 @@
      * @see #acquire(int, boolean)
      */
     public void release(ByteBuffer buffer);
+
+    public static class Lease
+    {
+        private final ByteBufferPool byteBufferPool;
+        private final List<ByteBuffer> buffers;
+        private final List<Boolean> recycles;
+
+        public Lease(ByteBufferPool byteBufferPool)
+        {
+            this.byteBufferPool = byteBufferPool;
+            this.buffers = new ArrayList<>();
+            this.recycles = new ArrayList<>();
+        }
+
+        public ByteBuffer acquire(int capacity, boolean direct)
+        {
+            ByteBuffer buffer = byteBufferPool.acquire(capacity, direct);
+            BufferUtil.clearToFill(buffer);
+            return buffer;
+        }
+
+        public void append(ByteBuffer buffer, boolean recycle)
+        {
+            buffers.add(buffer);
+            recycles.add(recycle);
+        }
+
+        public void insert(int index, ByteBuffer buffer, boolean recycle)
+        {
+            buffers.add(index, buffer);
+            recycles.add(index, recycle);
+        }
+
+        public List<ByteBuffer> getByteBuffers()
+        {
+            return buffers;
+        }
+
+        public long getTotalLength()
+        {
+            long length = 0;
+            for (int i = 0; i < buffers.size(); ++i)
+                length += buffers.get(i).remaining();
+            return length;
+        }
+
+        public int getSize()
+        {
+            return buffers.size();
+        }
+
+        public void recycle()
+        {
+            for (int i = 0; i < buffers.size(); ++i)
+            {
+                ByteBuffer buffer = buffers.get(i);
+                if (recycles.get(i))
+                    byteBufferPool.release(buffer);
+            }
+            buffers.clear();
+            recycles.clear();
+        }
+    }
 }
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ChannelEndPoint.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ChannelEndPoint.java
index 40e4ba4..306e74f 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ChannelEndPoint.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ChannelEndPoint.java
@@ -23,7 +23,6 @@
 import java.net.Socket;
 import java.nio.ByteBuffer;
 import java.nio.channels.ByteChannel;
-import java.nio.channels.GatheringByteChannel;
 import java.nio.channels.SocketChannel;
 
 import org.eclipse.jetty.util.BufferUtil;
@@ -39,7 +38,7 @@
 {
     private static final Logger LOG = Log.getLogger(ChannelEndPoint.class);
 
-    private final ByteChannel _channel;
+    private final SocketChannel _channel;
     private final Socket _socket;
     private volatile boolean _ishut;
     private volatile boolean _oshut;
@@ -49,11 +48,17 @@
         super(scheduler,
             (InetSocketAddress)channel.socket().getLocalSocketAddress(),
             (InetSocketAddress)channel.socket().getRemoteSocketAddress());
-        _channel = channel;
+        _channel=channel;
         _socket=channel.socket();
     }
 
     @Override
+    public boolean isOptimizedForDirectBuffers()
+    {
+        return true;
+    }
+
+    @Override
     public boolean isOpen()
     {
         return _channel.isOpen();
@@ -163,13 +168,13 @@
     @Override
     public boolean flush(ByteBuffer... buffers) throws IOException
     {
-        int flushed=0;
+        long flushed=0;
         try
         {
             if (buffers.length==1)
                 flushed=_channel.write(buffers[0]);
-            else if (buffers.length>1 && _channel instanceof GatheringByteChannel)
-                flushed= (int)((GatheringByteChannel)_channel).write(buffers,0,buffers.length);
+            else if (buffers.length>1)
+                flushed=_channel.write(buffers,0,buffers.length);
             else
             {
                 for (ByteBuffer b : buffers)
@@ -225,7 +230,7 @@
     }
 
     @Override
-    protected boolean needsFill() throws IOException
+    protected void needsFillInterest() throws IOException
     {
         throw new UnsupportedOperationException();
     }
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ClientConnectionFactory.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ClientConnectionFactory.java
index 1d96155..f0f87cc 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ClientConnectionFactory.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ClientConnectionFactory.java
@@ -19,12 +19,8 @@
 package org.eclipse.jetty.io;
 
 import java.io.IOException;
-import java.nio.ByteBuffer;
 import java.util.Map;
 
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
 /**
  * Factory for client-side {@link Connection} instances.
  */
@@ -38,53 +34,4 @@
      * @throws IOException if the connection cannot be created
      */
     public Connection newConnection(EndPoint endPoint, Map<String, Object> context) throws IOException;
-
-    public static class Helper
-    {
-        private static Logger LOG = Log.getLogger(Helper.class);
-
-        private Helper()
-        {
-        }
-
-        /**
-         * Replaces the given {@code oldConnection} with the given {@code newConnection} on the
-         * {@link EndPoint} associated with {@code oldConnection}, performing connection lifecycle management.
-         * <p />
-         * The {@code oldConnection} will be closed by invoking {@link org.eclipse.jetty.io.Connection#onClose()}
-         * and the {@code newConnection} will be opened by invoking {@link org.eclipse.jetty.io.Connection#onOpen(ByteBuffer)}.
-         * @param oldConnection the old connection to replace
-         * @param newConnection the new connection replacement
-         */
-        public static void replaceConnection(Connection oldConnection, Connection newConnection)
-        {
-            close(oldConnection);
-            oldConnection.getEndPoint().setConnection(newConnection);
-            open(newConnection);
-        }
-
-        private static void open(Connection connection)
-        {
-            try
-            {
-                connection.onOpen();
-            }
-            catch (Throwable x)
-            {
-                LOG.debug(x);
-            }
-        }
-
-        private static void close(Connection connection)
-        {
-            try
-            {
-                connection.onClose();
-            }
-            catch (Throwable x)
-            {
-                LOG.debug(x);
-            }
-        }
-    }
 }
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/Connection.java b/jetty-io/src/main/java/org/eclipse/jetty/io/Connection.java
index 41336d5..a0f7a5d 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/Connection.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/Connection.java
@@ -21,11 +21,13 @@
 import java.io.Closeable;
 import java.nio.ByteBuffer;
 
+import org.eclipse.jetty.util.component.Container;
+
 /**
  * <p>A {@link Connection} is associated to an {@link EndPoint} so that I/O events
  * happening on the {@link EndPoint} can be processed by the {@link Connection}.</p>
- * <p>A typical implementation of {@link Connection} overrides {@link #onOpen(ByteBuffer)} to
- * {@link EndPoint#fillInterested(Callback) set read interest} on the {@link EndPoint},
+ * <p>A typical implementation of {@link Connection} overrides {@link #onOpen()} to
+ * {@link EndPoint#fillInterested(org.eclipse.jetty.util.Callback) set read interest} on the {@link EndPoint},
  * and when the {@link EndPoint} signals read readyness, this {@link Connection} can
  * read bytes from the network and interpret them.</p>
  */
@@ -78,7 +80,7 @@
         /**
          * <p>Callback method invoked when this {@link Connection} is upgraded.</p>
          * <p>This must be called before {@link #onOpen()}.</p>
-         * @param prefilledBuffer An optional buffer that can contain prefilled data. Typically this
+         * @param prefilled An optional buffer that can contain prefilled data. Typically this
          * results from an upgrade of one protocol to the other where the old connection has buffered
          * data destined for the new connection.  The new connection must take ownership of the buffer
          * and is responsible for returning it to the buffer pool
@@ -86,6 +88,16 @@
         void onUpgradeTo(ByteBuffer prefilled);
     }
     
+    
+    /* ------------------------------------------------------------ */
+    /** 
+     * <p>A Listener for connection events.</p>
+     * <p>Listeners can be added to a {@link Connection} to get open and close events.
+     * The AbstractConnectionFactory implements a pattern where objects implement
+     * this interface that have been added via {@link Container#addBean(Object)} to
+     * the Connector or ConnectionFactory are added as listeners to all new connections
+     * </p>
+     */
     public interface Listener
     {
         public void onOpened(Connection connection);
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/EndPoint.java b/jetty-io/src/main/java/org/eclipse/jetty/io/EndPoint.java
index 2eb75a5..cb1cda8 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/EndPoint.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/EndPoint.java
@@ -26,33 +26,35 @@
 import java.nio.channels.WritePendingException;
 
 import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.FutureCallback;
+import org.eclipse.jetty.util.IteratingCallback;
 
 /**
  *
  * A transport EndPoint
- * 
+ *
  * <h3>Asynchronous Methods</h3>
- * <p>The asynchronous scheduling methods of {@link EndPoint} 
+ * <p>The asynchronous scheduling methods of {@link EndPoint}
  * has been influenced by NIO.2 Futures and Completion
  * handlers, but does not use those actual interfaces because they have
  * some inefficiencies.</p>
  * <p>This class will frequently be used in conjunction with some of the utility
  * implementations of {@link Callback}, such as {@link FutureCallback} and
- * {@link ExecutorCallback}. Examples are:</p>
+ * {@link IteratingCallback}. Examples are:</p>
  *
  * <h3>Blocking Read</h3>
  * <p>A FutureCallback can be used to block until an endpoint is ready to be filled
- * from:
+ * from:</p>
  * <blockquote><pre>
  * FutureCallback&lt;String&gt; future = new FutureCallback&lt;&gt;();
  * endpoint.fillInterested("ContextObj",future);
  * ...
  * String context = future.get(); // This blocks
  * int filled=endpoint.fill(mybuffer);
- * </pre></blockquote></p>
+ * </pre></blockquote>
  *
  * <h3>Dispatched Read</h3>
- * <p>By using a different callback, the read can be done asynchronously in its own dispatched thread:
+ * <p>By using a different callback, the read can be done asynchronously in its own dispatched thread:</p>
  * <blockquote><pre>
  * endpoint.fillInterested("ContextObj",new ExecutorCallback&lt;String&gt;(executor)
  * {
@@ -63,22 +65,22 @@
  *   }
  *   public void onFailed(String context,Throwable cause) {...}
  * });
- * </pre></blockquote></p>
+ * </pre></blockquote>
  * <p>The executor callback can also be customized to not dispatch in some circumstances when
  * it knows it can use the callback thread and does not need to dispatch.</p>
  *
  * <h3>Blocking Write</h3>
  * <p>The write contract is that the callback complete is not called until all data has been
- * written or there is a failure.  For blocking this looks like:
+ * written or there is a failure.  For blocking this looks like:</p>
  * <blockquote><pre>
  * FutureCallback&lt;String&gt; future = new FutureCallback&lt;&gt;();
  * endpoint.write("ContextObj",future,headerBuffer,contentBuffer);
  * String context = future.get(); // This blocks
- * </pre></blockquote></p>
+ * </pre></blockquote>
  *
  * <h3>Dispatched Write</h3>
  * <p>Note also that multiple buffers may be passed in write so that gather writes
- * can be done:
+ * can be done:</p>
  * <blockquote><pre>
  * endpoint.write("ContextObj",new ExecutorCallback&lt;String&gt;(executor)
  * {
@@ -89,7 +91,7 @@
  *   }
  *   public void onFailed(String context,Throwable cause) {...}
  * },headerBuffer,contentBuffer);
- * </pre></blockquote></p>
+ * </pre></blockquote>
  */
 public interface EndPoint extends Closeable
 {
@@ -158,7 +160,7 @@
      * operation, the position is unchanged and the limit is increased to reflect the new data filled.
      * @return an <code>int</code> value indicating the number of bytes
      * filled or -1 if EOF is read or the input is shutdown.
-     * @throws EofException If the endpoint is closed.
+     * @throws IOException if the endpoint is closed.
      */
     int fill(ByteBuffer buffer) throws IOException;
 
@@ -167,10 +169,10 @@
      * Flush data from the passed header/buffer to this endpoint.  As many bytes as can be consumed
      * are taken from the header/buffer position up until the buffer limit.  The header/buffers position
      * is updated to indicate how many bytes have been consumed.
-     * @return True IFF all the buffers have been consumed and the endpoint has flushed the data to its 
+     * @param buffer the buffers to flush
+     * @return True IFF all the buffers have been consumed and the endpoint has flushed the data to its
      * destination (ie is not buffering any data).
-     *
-     * @throws EofException If the endpoint is closed or output is shutdown.
+     * @throws IOException If the endpoint is closed or output is shutdown.
      */
     boolean flush(ByteBuffer... buffer) throws IOException;
 
@@ -184,13 +186,13 @@
     /** Get the max idle time in ms.
      * <p>The max idle time is the time the endpoint can be idle before
      * extraordinary handling takes place.
-     * @return the max idle time in ms or if ms <= 0 implies an infinite timeout
+     * @return the max idle time in ms or if ms &lt;= 0 implies an infinite timeout
      */
     long getIdleTimeout();
 
     /* ------------------------------------------------------------ */
     /** Set the idle timeout.
-     * @param idleTimeout the idle timeout in MS. Timeout <= 0 implies an infinite timeout
+     * @param idleTimeout the idle timeout in MS. Timeout &lt;= 0 implies an infinite timeout
      */
     void setIdleTimeout(long idleTimeout);
 
@@ -204,6 +206,12 @@
     void fillInterested(Callback callback) throws ReadPendingException;
 
     /**
+     * @return whether {@link #fillInterested(Callback)} has been called, but {@link #fill(ByteBuffer)} has not yet
+     * been called
+     */
+    boolean isFillInterested();
+
+    /**
      * <p>Writes the given buffers via {@link #flush(ByteBuffer...)} and invokes callback methods when either
      * all the data has been flushed or an error occurs.</p>
      *
@@ -238,6 +246,11 @@
      */
     void onClose();
 
+    /** Is the endpoint optimized for DirectBuffer usage
+     * @return True if direct buffers can be used optimally.
+     */
+    boolean isOptimizedForDirectBuffers();
+
 
     /** Upgrade connections.
      * Close the old connection, update the endpoint and open the new connection.
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/FillInterest.java b/jetty-io/src/main/java/org/eclipse/jetty/io/FillInterest.java
index 5294c17..b5c48c4 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/FillInterest.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/FillInterest.java
@@ -21,115 +21,138 @@
 import java.io.IOException;
 import java.nio.channels.ClosedChannelException;
 import java.nio.channels.ReadPendingException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.concurrent.atomic.AtomicReference;
 
 import org.eclipse.jetty.util.Callback;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
-
-/* ------------------------------------------------------------ */
-/** 
+/**
  * A Utility class to help implement {@link EndPoint#fillInterested(Callback)}
  * by keeping state and calling the context and callback objects.
- * 
  */
 public abstract class FillInterest
 {
     private final static Logger LOG = Log.getLogger(FillInterest.class);
     private final AtomicReference<Callback> _interested = new AtomicReference<>(null);
+    private Throwable _lastSet;
 
-    /* ------------------------------------------------------------ */
     protected FillInterest()
     {
     }
 
-    /* ------------------------------------------------------------ */
-    /** Call to register interest in a callback when a read is possible.
-     * The callback will be called either immediately if {@link #needsFill()} 
+    /**
+     * Call to register interest in a callback when a read is possible.
+     * The callback will be called either immediately if {@link #needsFillInterest()}
      * returns true or eventually once {@link #fillable()} is called.
-     * @param callback
-     * @throws ReadPendingException
+     *
+     * @param callback the callback to register
+     * @throws ReadPendingException if unable to read due to pending read op
      */
-    public <C> void register(Callback callback) throws ReadPendingException
+    public void register(Callback callback) throws ReadPendingException
     {
-        if (callback==null)
+        if (callback == null)
             throw new IllegalArgumentException();
-        
-        if (!_interested.compareAndSet(null,callback))
+
+        if (_interested.compareAndSet(null, callback))
         {
-            LOG.warn("Read pending for "+_interested.get()+" prevented "+callback);
+            if (LOG.isDebugEnabled())
+            {
+                LOG.debug("{} register {}",this,callback);
+                _lastSet=new Throwable(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()) + ":" + Thread.currentThread().getName());
+            }
+        }
+        else
+        {
+            LOG.warn("Read pending for {} prevented {}", _interested, callback);
+            if (LOG.isDebugEnabled())
+                LOG.warn("callback set at ",_lastSet);
             throw new ReadPendingException();
         }
         try
         {
-            if (needsFill())
-                fillable();
+            if (LOG.isDebugEnabled())
+                LOG.debug("{} register {}",this,callback);
+            needsFillInterest();
         }
-        catch(IOException e)
+        catch (Throwable e)
         {
             onFail(e);
         }
     }
 
-    /* ------------------------------------------------------------ */
-    /** Call to signal that a read is now possible.
+    /**
+     * Call to signal that a read is now possible.
      */
     public void fillable()
     {
-        Callback callback=_interested.get();
-        if (callback!=null && _interested.compareAndSet(callback,null))
+        Callback callback = _interested.get();
+        if (LOG.isDebugEnabled())
+            LOG.debug("{} fillable {}",this,callback);
+        if (callback != null && _interested.compareAndSet(callback, null))
             callback.succeeded();
+        else if (LOG.isDebugEnabled())
+            LOG.debug("{} lost race {}",this,callback);
     }
 
-    /* ------------------------------------------------------------ */
     /**
      * @return True if a read callback has been registered
      */
     public boolean isInterested()
     {
-        return _interested.get()!=null;
+        return _interested.get() != null;
     }
     
-    /* ------------------------------------------------------------ */
-    /** Call to signal a failure to a registered interest
+    public boolean isCallbackNonBlocking()
+    {
+        Callback callback = _interested.get();
+        return callback!=null && callback.isNonBlocking();
+    }
+
+    /**
+     * Call to signal a failure to a registered interest
+     *
+     * @param cause the cause of the failure
      * @return true if the cause was passed to a {@link Callback} instance
      */
     public boolean onFail(Throwable cause)
     {
-        Callback callback=_interested.get();
-        if (callback!=null && _interested.compareAndSet(callback,null))
+        Callback callback = _interested.get();
+        if (callback != null && _interested.compareAndSet(callback, null))
         {
             callback.failed(cause);
             return true;
         }
         return false;
     }
-    
-    /* ------------------------------------------------------------ */
+
     public void onClose()
     {
-        Callback callback=_interested.get();
-        if (callback!=null && _interested.compareAndSet(callback,null))
+        Callback callback = _interested.get();
+        if (callback != null && _interested.compareAndSet(callback, null))
             callback.failed(new ClosedChannelException());
     }
-    
-    /* ------------------------------------------------------------ */
+
     @Override
     public String toString()
     {
-        return String.format("FillInterest@%x{%b,%s}",hashCode(),_interested.get(),_interested.get());
+        return String.format("FillInterest@%x{%b,%s}", hashCode(), _interested.get()!=null, _interested.get());
     }
+
     
-    /* ------------------------------------------------------------ */
-    /** Register the read interest 
+    public String toStateString()
+    {
+        return _interested.get()==null?"-":"FI";
+    }
+
+    /**
+     * Register the read interest
      * Abstract method to be implemented by the Specific ReadInterest to
-     * enquire if a read is immediately possible and if not to schedule a future
-     * call to {@link #fillable()} or {@link #onFail(Throwable)}
-     * @return true if a read is possible
-     * @throws IOException
+     * schedule a future call to {@link #fillable()} or {@link #onFail(Throwable)}
+     *
+     * @throws IOException if unable to fulfill interest in fill
      */
-    abstract protected boolean needsFill() throws IOException;
-    
-    
+    abstract protected void needsFillInterest() throws IOException;
 }
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/IdleTimeout.java b/jetty-io/src/main/java/org/eclipse/jetty/io/IdleTimeout.java
index a8ee171..eec11e0 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/IdleTimeout.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/IdleTimeout.java
@@ -28,7 +28,7 @@
 
 /**
  * An Abstract implementation of an Idle Timeout.
- * <p/>
+ * <p>
  * This implementation is optimised that timeout operations are not cancelled on
  * every operation. Rather timeout are allowed to expire and a check is then made
  * to see when the last operation took place.  If the idle timeout has not expired,
@@ -61,6 +61,11 @@
         _scheduler = scheduler;
     }
 
+    public Scheduler getScheduler()
+    {
+        return _scheduler;
+    }
+    
     public long getIdleTimestamp()
     {
         return _idleTimestamp;
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java
new file mode 100644
index 0000000..d2a33bf
--- /dev/null
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java
@@ -0,0 +1,754 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.io;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.net.ConnectException;
+import java.net.SocketTimeoutException;
+import java.nio.channels.CancelledKeyException;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.Selector;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Queue;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.eclipse.jetty.util.component.AbstractLifeCycle;
+import org.eclipse.jetty.util.component.ContainerLifeCycle;
+import org.eclipse.jetty.util.component.Dumpable;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.ExecutionStrategy;
+import org.eclipse.jetty.util.thread.Locker;
+import org.eclipse.jetty.util.thread.Scheduler;
+
+/**
+ * <p>{@link ManagedSelector} wraps a {@link Selector} simplifying non-blocking operations on channels.</p>
+ * <p>{@link ManagedSelector} runs the select loop, which waits on {@link Selector#select()} until events
+ * happen for registered channels. When events happen, it notifies the {@link EndPoint} associated
+ * with the channel.</p>
+ */
+public class ManagedSelector extends AbstractLifeCycle implements Runnable, Dumpable
+{
+    private static final Logger LOG = Log.getLogger(ManagedSelector.class);
+
+    private final Locker _locker = new Locker();
+    private boolean _selecting = false;
+    private final Queue<Runnable> _actions = new ArrayDeque<>();
+    private final SelectorManager _selectorManager;
+    private final int _id;
+    private final ExecutionStrategy _strategy;
+    private Selector _selector;
+
+    public ManagedSelector(SelectorManager selectorManager, int id)
+    {
+        _selectorManager = selectorManager;
+        _id = id;
+        _strategy = ExecutionStrategy.Factory.instanceFor(new SelectorProducer(), selectorManager.getExecutor());
+        setStopTimeout(5000);
+    }
+
+    @Override
+    protected void doStart() throws Exception
+    {
+        super.doStart();
+        _selector = newSelector();
+    }
+
+    protected Selector newSelector() throws IOException
+    {
+        return Selector.open();
+    }
+
+    public int size()
+    {
+        Selector s = _selector;
+        if (s == null)
+            return 0;
+        return s.keys().size();
+    }
+
+    @Override
+    protected void doStop() throws Exception
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Stopping {}", this);
+        CloseEndPoints close_endps = new CloseEndPoints();
+        submit(close_endps);
+        close_endps.await(getStopTimeout());
+        super.doStop();
+        CloseSelector close_selector = new CloseSelector();
+        submit(close_selector);
+        close_selector.await(getStopTimeout());
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("Stopped {}", this);
+    }
+
+    public void submit(Runnable change)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Queued change {} on {}", change, this);
+
+        Selector selector = null;
+        try (Locker.Lock lock = _locker.lock())
+        {
+            _actions.offer(change);
+            if (_selecting)
+            {
+                selector = _selector;
+                // To avoid the extra select wakeup.
+                _selecting = false;
+            }
+        }
+        if (selector != null)
+            selector.wakeup();
+    }
+
+    @Override
+    public void run()
+    {
+        _strategy.execute();
+    }
+
+    /**
+     * A {@link SelectableEndPoint} is an {@link EndPoint} that wish to be
+     * notified of non-blocking events by the {@link ManagedSelector}.
+     */
+    public interface SelectableEndPoint extends EndPoint
+    {
+        /**
+         * Callback method invoked when a read or write events has been
+         * detected by the {@link ManagedSelector} for this endpoint.
+         *
+         * @return a job that may block or null
+         */
+        Runnable onSelected();
+
+        /**
+         * Callback method invoked when all the keys selected by the
+         * {@link ManagedSelector} for this endpoint have been processed.
+         */
+        void updateKey();
+    }
+
+    private class SelectorProducer implements ExecutionStrategy.Producer
+    {
+        private Set<SelectionKey> _keys = Collections.emptySet();
+        private Iterator<SelectionKey> _cursor = Collections.emptyIterator();
+
+        @Override
+        public Runnable produce()
+        {
+            while (true)
+            {
+                Runnable task = processSelected();
+                if (task != null)
+                    return task;
+
+                Runnable action = runActions();
+                if (action != null)
+                    return action;
+
+                update();
+
+                if (!select())
+                    return null;
+            }
+        }
+
+        private Runnable runActions()
+        {
+            while (true)
+            {
+                Runnable action;
+                try (Locker.Lock lock = _locker.lock())
+                {
+                    action = _actions.poll();
+                    if (action == null)
+                    {
+                        // No more actions, so we need to select
+                        _selecting = true;
+                        return null;
+                    }
+                }
+
+                if (action instanceof Product)
+                    return action;
+
+                // Running the change may queue another action.
+                runChange(action);
+            }
+        }
+
+        private void runChange(Runnable change)
+        {
+            try
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Running change {}", change);
+                change.run();
+            }
+            catch (Throwable x)
+            {
+                LOG.debug("Could not run change " + change, x);
+            }
+        }
+
+        private boolean select()
+        {
+            try
+            {
+                Selector selector = _selector;
+                if (selector != null && selector.isOpen())
+                {
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Selector loop waiting on select");
+                    int selected = selector.select();
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Selector loop woken up from select, {}/{} selected", selected, selector.keys().size());
+
+                    try (Locker.Lock lock = _locker.lock())
+                    {
+                        // finished selecting
+                        _selecting = false;
+                    }
+
+                    _keys = selector.selectedKeys();
+                    _cursor = _keys.iterator();
+
+                    return true;
+                }
+            }
+            catch (Throwable x)
+            {
+                closeNoExceptions(_selector);
+                if (isRunning())
+                    LOG.warn(x);
+                else
+                    LOG.debug(x);
+            }
+            return false;
+        }
+
+        private Runnable processSelected()
+        {
+            while (_cursor.hasNext())
+            {
+                SelectionKey key = _cursor.next();
+                if (key.isValid())
+                {
+                    Object attachment = key.attachment();
+                    try
+                    {
+                        if (attachment instanceof SelectableEndPoint)
+                        {
+                            // Try to produce a task
+                            Runnable task = ((SelectableEndPoint)attachment).onSelected();
+                            if (task != null)
+                                return task;
+                        }
+                        else if (key.isConnectable())
+                        {
+                            Runnable task = processConnect(key, (Connect)attachment);
+                            if (task != null)
+                                return task;
+                        }
+                        else if (key.isAcceptable())
+                        {
+                            processAccept(key);
+                        }
+                        else
+                        {
+                            throw new IllegalStateException("key=" + key + ", att=" + attachment + ", iOps=" + key.interestOps() + ", rOps=" + key.readyOps());
+                        }
+                    }
+                    catch (CancelledKeyException x)
+                    {
+                        LOG.debug("Ignoring cancelled key for channel {}", key.channel());
+                        if (attachment instanceof EndPoint)
+                            closeNoExceptions((EndPoint)attachment);
+                    }
+                    catch (Throwable x)
+                    {
+                        LOG.warn("Could not process key for channel " + key.channel(), x);
+                        if (attachment instanceof EndPoint)
+                            closeNoExceptions((EndPoint)attachment);
+                    }
+                }
+                else
+                {
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Selector loop ignoring invalid key for channel {}", key.channel());
+                    Object attachment = key.attachment();
+                    if (attachment instanceof EndPoint)
+                        closeNoExceptions((EndPoint)attachment);
+                }
+            }
+            return null;
+        }
+
+        private void update()
+        {
+            for (SelectionKey key : _keys)
+                updateKey(key);
+            _keys.clear();
+        }
+
+        private void updateKey(SelectionKey key)
+        {
+            Object attachment = key.attachment();
+            if (attachment instanceof SelectableEndPoint)
+                ((SelectableEndPoint)attachment).updateKey();
+        }
+    }
+
+    private interface Product extends Runnable
+    {
+    }
+
+    private Runnable processConnect(SelectionKey key, final Connect connect)
+    {
+        SocketChannel channel = (SocketChannel)key.channel();
+        try
+        {
+            key.attach(connect.attachment);
+            boolean connected = _selectorManager.finishConnect(channel);
+            if (LOG.isDebugEnabled())
+                LOG.debug("Connected {} {}", connected, channel);
+            if (connected)
+            {
+                if (connect.timeout.cancel())
+                {
+                    key.interestOps(0);
+                    return new CreateEndPoint(channel, key)
+                    {
+                        @Override
+                        protected void failed(Throwable failure)
+                        {
+                            super.failed(failure);
+                            connect.failed(failure);
+                        }
+                    };
+                }
+                else
+                {
+                    throw new SocketTimeoutException("Concurrent Connect Timeout");
+                }
+            }
+            else
+            {
+                throw new ConnectException();
+            }
+        }
+        catch (Throwable x)
+        {
+            connect.failed(x);
+            return null;
+        }
+    }
+
+    private void processAccept(SelectionKey key)
+    {
+        ServerSocketChannel server = (ServerSocketChannel)key.channel();
+        SocketChannel channel = null;
+        try
+        {
+            while ((channel = server.accept()) != null)
+            {
+                _selectorManager.accepted(channel);
+            }
+        }
+        catch (Throwable x)
+        {
+            closeNoExceptions(channel);
+            LOG.warn("Accept failed for channel " + channel, x);
+        }
+    }
+
+    private void closeNoExceptions(Closeable closeable)
+    {
+        try
+        {
+            if (closeable != null)
+                closeable.close();
+        }
+        catch (Throwable x)
+        {
+            LOG.ignore(x);
+        }
+    }
+
+    private EndPoint createEndPoint(SocketChannel channel, SelectionKey selectionKey) throws IOException
+    {
+        EndPoint endPoint = _selectorManager.newEndPoint(channel, this, selectionKey);
+        _selectorManager.endPointOpened(endPoint);
+        Connection connection = _selectorManager.newConnection(channel, endPoint, selectionKey.attachment());
+        endPoint.setConnection(connection);
+        selectionKey.attach(endPoint);
+        _selectorManager.connectionOpened(connection);
+        if (LOG.isDebugEnabled())
+            LOG.debug("Created {}", endPoint);
+        return endPoint;
+    }
+
+    public void destroyEndPoint(final EndPoint endPoint)
+    {
+        final Connection connection = endPoint.getConnection();
+        submit(new Product()
+        {
+            @Override
+            public void run()
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Destroyed {}", endPoint);
+                if (connection != null)
+                    _selectorManager.connectionClosed(connection);
+                _selectorManager.endPointClosed(endPoint);
+            }
+        });
+    }
+
+    @Override
+    public String dump()
+    {
+        return ContainerLifeCycle.dump(this);
+    }
+
+    @Override
+    public void dump(Appendable out, String indent) throws IOException
+    {
+        out.append(String.valueOf(this)).append(" id=").append(String.valueOf(_id)).append(System.lineSeparator());
+
+        Selector selector = _selector;
+        if (selector != null && selector.isOpen())
+        {
+            final ArrayList<Object> dump = new ArrayList<>(selector.keys().size() * 2);
+
+            DumpKeys dumpKeys = new DumpKeys(dump);
+            submit(dumpKeys);
+            dumpKeys.await(5, TimeUnit.SECONDS);
+
+            ContainerLifeCycle.dump(out, indent, dump);
+        }
+    }
+
+    @Override
+    public String toString()
+    {
+        Selector selector = _selector;
+        return String.format("%s id=%s keys=%d selected=%d",
+                super.toString(),
+                _id,
+                selector != null && selector.isOpen() ? selector.keys().size() : -1,
+                selector != null && selector.isOpen() ? selector.selectedKeys().size() : -1);
+    }
+
+    private class DumpKeys implements Runnable
+    {
+        private final CountDownLatch latch = new CountDownLatch(1);
+        private final List<Object> _dumps;
+
+        private DumpKeys(List<Object> dumps)
+        {
+            this._dumps = dumps;
+        }
+
+        @Override
+        public void run()
+        {
+            Selector selector = _selector;
+            if (selector != null && selector.isOpen())
+            {
+                Set<SelectionKey> keys = selector.keys();
+                _dumps.add(selector + " keys=" + keys.size());
+                for (SelectionKey key : keys)
+                {
+                    try
+                    {
+                        _dumps.add(String.format("SelectionKey@%x{i=%d}->%s", key.hashCode(), key.interestOps(), key.attachment()));
+                    }
+                    catch (Throwable x)
+                    {
+                        LOG.ignore(x);
+                    }
+                }
+            }
+            latch.countDown();
+        }
+
+        public boolean await(long timeout, TimeUnit unit)
+        {
+            try
+            {
+                return latch.await(timeout, unit);
+            }
+            catch (InterruptedException x)
+            {
+                return false;
+            }
+        }
+    }
+
+    class Acceptor implements Runnable
+    {
+        private final ServerSocketChannel _channel;
+
+        public Acceptor(ServerSocketChannel channel)
+        {
+            this._channel = channel;
+        }
+
+        @Override
+        public void run()
+        {
+            try
+            {
+                SelectionKey key = _channel.register(_selector, SelectionKey.OP_ACCEPT, null);
+                if (LOG.isDebugEnabled())
+                    LOG.debug("{} acceptor={}", this, key);
+            }
+            catch (Throwable x)
+            {
+                closeNoExceptions(_channel);
+                LOG.warn(x);
+            }
+        }
+    }
+
+    class Accept implements Runnable
+    {
+        private final SocketChannel channel;
+        private final Object attachment;
+
+        Accept(SocketChannel channel, Object attachment)
+        {
+            this.channel = channel;
+            this.attachment = attachment;
+        }
+
+        @Override
+        public void run()
+        {
+            try
+            {
+                final SelectionKey key = channel.register(_selector, 0, attachment);
+                submit(new CreateEndPoint(channel, key));
+            }
+            catch (Throwable x)
+            {
+                closeNoExceptions(channel);
+                LOG.debug(x);
+            }
+        }
+    }
+
+    private class CreateEndPoint implements Product
+    {
+        private final SocketChannel channel;
+        private final SelectionKey key;
+
+        public CreateEndPoint(SocketChannel channel, SelectionKey key)
+        {
+            this.channel = channel;
+            this.key = key;
+        }
+
+        @Override
+        public void run()
+        {
+            try
+            {
+                createEndPoint(channel, key);
+            }
+            catch (Throwable x)
+            {
+                LOG.debug(x);
+                failed(x);
+            }
+        }
+
+        protected void failed(Throwable failure)
+        {
+            closeNoExceptions(channel);
+            LOG.debug(failure);
+        }
+    }
+
+    class Connect implements Runnable
+    {
+        private final AtomicBoolean failed = new AtomicBoolean();
+        private final SocketChannel channel;
+        private final Object attachment;
+        private final Scheduler.Task timeout;
+
+        Connect(SocketChannel channel, Object attachment)
+        {
+            this.channel = channel;
+            this.attachment = attachment;
+            this.timeout = ManagedSelector.this._selectorManager.getScheduler().schedule(new ConnectTimeout(this), ManagedSelector.this._selectorManager.getConnectTimeout(), TimeUnit.MILLISECONDS);
+        }
+
+        @Override
+        public void run()
+        {
+            try
+            {
+                channel.register(_selector, SelectionKey.OP_CONNECT, this);
+            }
+            catch (Throwable x)
+            {
+                failed(x);
+            }
+        }
+
+        private void failed(Throwable failure)
+        {
+            if (failed.compareAndSet(false, true))
+            {
+                timeout.cancel();
+                closeNoExceptions(channel);
+                ManagedSelector.this._selectorManager.connectionFailed(channel, failure, attachment);
+            }
+        }
+    }
+
+    private class ConnectTimeout implements Runnable
+    {
+        private final Connect connect;
+
+        private ConnectTimeout(Connect connect)
+        {
+            this.connect = connect;
+        }
+
+        @Override
+        public void run()
+        {
+            SocketChannel channel = connect.channel;
+            if (channel.isConnectionPending())
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Channel {} timed out while connecting, closing it", channel);
+                connect.failed(new SocketTimeoutException("Connect Timeout"));
+            }
+        }
+    }
+
+    private class CloseEndPoints implements Runnable
+    {
+        private final CountDownLatch _latch = new CountDownLatch(1);
+        private CountDownLatch _allClosed;
+
+        @Override
+        public void run()
+        {
+            List<EndPoint> end_points = new ArrayList<>();
+            for (SelectionKey key : _selector.keys())
+            {
+                if (key.isValid())
+                {
+                    Object attachment = key.attachment();
+                    if (attachment instanceof EndPoint)
+                        end_points.add((EndPoint)attachment);
+                }
+            }
+
+            int size = end_points.size();
+            if (LOG.isDebugEnabled())
+                LOG.debug("Closing {} endPoints on {}", size, ManagedSelector.this);
+
+            _allClosed = new CountDownLatch(size);
+            _latch.countDown();
+
+            for (EndPoint endp : end_points)
+                submit(new EndPointCloser(endp, _allClosed));
+
+            if (LOG.isDebugEnabled())
+                LOG.debug("Closed {} endPoints on {}", size, ManagedSelector.this);
+        }
+
+        public boolean await(long timeout)
+        {
+            try
+            {
+                return _latch.await(timeout, TimeUnit.MILLISECONDS) &&
+                        _allClosed.await(timeout, TimeUnit.MILLISECONDS);
+            }
+            catch (InterruptedException x)
+            {
+                return false;
+            }
+        }
+    }
+
+    private class EndPointCloser implements Product
+    {
+        private final EndPoint _endPoint;
+        private final CountDownLatch _latch;
+
+        private EndPointCloser(EndPoint endPoint, CountDownLatch latch)
+        {
+            _endPoint = endPoint;
+            _latch = latch;
+        }
+
+        @Override
+        public void run()
+        {
+            closeNoExceptions(_endPoint.getConnection());
+            _latch.countDown();
+        }
+    }
+
+    private class CloseSelector implements Runnable
+    {
+        private CountDownLatch _latch = new CountDownLatch(1);
+
+        @Override
+        public void run()
+        {
+            Selector selector = _selector;
+            _selector = null;
+            closeNoExceptions(selector);
+            _latch.countDown();
+        }
+
+        public boolean await(long timeout)
+        {
+            try
+            {
+                return _latch.await(timeout, TimeUnit.MILLISECONDS);
+            }
+            catch (InterruptedException x)
+            {
+                return false;
+            }
+        }
+    }
+}
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/NegotiatingClientConnection.java b/jetty-io/src/main/java/org/eclipse/jetty/io/NegotiatingClientConnection.java
index f72714f..3490c1c 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/NegotiatingClientConnection.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/NegotiatingClientConnection.java
@@ -19,7 +19,6 @@
 package org.eclipse.jetty.io;
 
 import java.io.IOException;
-import java.nio.ByteBuffer;
 import java.util.Map;
 import java.util.concurrent.Executor;
 
@@ -109,9 +108,7 @@
         EndPoint endPoint = getEndPoint();
         try
         {
-            Connection oldConnection = endPoint.getConnection();
-            Connection newConnection = connectionFactory.newConnection(endPoint, context);
-            ClientConnectionFactory.Helper.replaceConnection(oldConnection, newConnection);
+            endPoint.upgrade(connectionFactory.newConnection(endPoint, context));
         }
         catch (Throwable x)
         {
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/NetworkTrafficListener.java b/jetty-io/src/main/java/org/eclipse/jetty/io/NetworkTrafficListener.java
index d73bb5c..6bc3635 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/NetworkTrafficListener.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/NetworkTrafficListener.java
@@ -67,7 +67,7 @@
     /**
      * <p>Callback method invoked when a connection to a remote client has been closed.</p>
      * <p>The {@code socket} parameter is already closed when this method is called, so it
-     * cannot be queried for socket address information of the remote client.<br />
+     * cannot be queried for socket address information of the remote client.<br>
      * However, the {@code socket} parameter is the same object passed to {@link #opened(Socket)},
      * so it is possible to map socket information in {@link #opened(Socket)} and retrieve it
      * in this method.
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/NetworkTrafficSelectChannelEndPoint.java b/jetty-io/src/main/java/org/eclipse/jetty/io/NetworkTrafficSelectChannelEndPoint.java
index f6a6843..8628960 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/NetworkTrafficSelectChannelEndPoint.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/NetworkTrafficSelectChannelEndPoint.java
@@ -35,7 +35,7 @@
 
     private final List<NetworkTrafficListener> listeners;
 
-    public NetworkTrafficSelectChannelEndPoint(SocketChannel channel, SelectorManager.ManagedSelector selectSet, SelectionKey key, Scheduler scheduler, long idleTimeout, List<NetworkTrafficListener> listeners) throws IOException
+    public NetworkTrafficSelectChannelEndPoint(SocketChannel channel, ManagedSelector selectSet, SelectionKey key, Scheduler scheduler, long idleTimeout, List<NetworkTrafficListener> listeners) throws IOException
     {
         super(channel, selectSet, key, scheduler, idleTimeout);
         this.listeners = listeners;
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/SelectChannelEndPoint.java b/jetty-io/src/main/java/org/eclipse/jetty/io/SelectChannelEndPoint.java
index 4dc4778..b45c39b 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/SelectChannelEndPoint.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/SelectChannelEndPoint.java
@@ -22,144 +22,236 @@
 import java.nio.channels.SelectionKey;
 import java.nio.channels.SocketChannel;
 import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
 
-import org.eclipse.jetty.io.SelectorManager.ManagedSelector;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.Locker;
 import org.eclipse.jetty.util.thread.Scheduler;
 
 /**
  * An ChannelEndpoint that can be scheduled by {@link SelectorManager}.
  */
-public class SelectChannelEndPoint extends ChannelEndPoint implements SelectorManager.SelectableEndPoint
+public class SelectChannelEndPoint extends ChannelEndPoint implements ManagedSelector.SelectableEndPoint
 {
     public static final Logger LOG = Log.getLogger(SelectChannelEndPoint.class);
 
-    private final Runnable _updateTask = new Runnable()
-    {
-        @Override
-        public void run()
-        {
-            try
-            {
-                if (getChannel().isOpen())
-                {
-                    int oldInterestOps = _key.interestOps();
-                    int newInterestOps = _interestOps.get();
-                    if (newInterestOps != oldInterestOps)
-                        setKeyInterests(oldInterestOps, newInterestOps);
-                }
-            }
-            catch (CancelledKeyException x)
-            {
-                LOG.debug("Ignoring key update for concurrently closed channel {}", this);
-                close();
-            }
-            catch (Exception x)
-            {
-                LOG.warn("Ignoring key update for " + this, x);
-                close();
-            }
-        }
-    };
+    private final Locker _locker = new Locker();
+    private boolean _updatePending;
 
     /**
      * true if {@link ManagedSelector#destroyEndPoint(EndPoint)} has not been called
      */
     private final AtomicBoolean _open = new AtomicBoolean();
-    private final SelectorManager.ManagedSelector _selector;
+    private final ManagedSelector _selector;
     private final SelectionKey _key;
     /**
-     * The desired value for {@link SelectionKey#interestOps()}
+     * The current value for {@link SelectionKey#interestOps()}.
      */
-    private final AtomicInteger _interestOps = new AtomicInteger();
+    private int _currentInterestOps;
+    /**
+     * The desired value for {@link SelectionKey#interestOps()}.
+     */
+    private int _desiredInterestOps;
+
+    private final Runnable _runUpdateKey = new Runnable()
+    {
+        @Override
+        public void run()
+        {
+            updateKey();
+        }
+
+        @Override
+        public String toString()
+        {
+            return SelectChannelEndPoint.this.toString()+":runUpdateKey";
+        }
+    };
+    private final Runnable _runFillable = new Runnable()
+    {
+        @Override
+        public void run()
+        {
+            getFillInterest().fillable();
+        }
+
+        @Override
+        public String toString()
+        {
+            return SelectChannelEndPoint.this.toString()+":runFillable";
+        }
+    };
+    private final Runnable _runCompleteWrite = new Runnable()
+    {
+        @Override
+        public void run()
+        {
+            getWriteFlusher().completeWrite();
+        }
+
+        @Override
+        public String toString()
+        {
+            return SelectChannelEndPoint.this.toString()+":runCompleteWrite";
+        }
+    };
+    private final Runnable _runFillableCompleteWrite = new Runnable()
+    {
+        @Override
+        public void run()
+        {
+            getFillInterest().fillable();
+            getWriteFlusher().completeWrite();
+        }
+
+        @Override
+        public String toString()
+        {
+            return SelectChannelEndPoint.this.toString()+":runFillableCompleteWrite";
+        }
+    };
 
     public SelectChannelEndPoint(SocketChannel channel, ManagedSelector selector, SelectionKey key, Scheduler scheduler, long idleTimeout)
     {
-        super(scheduler,channel);
+        super(scheduler, channel);
         _selector = selector;
         _key = key;
         setIdleTimeout(idleTimeout);
     }
 
     @Override
-    protected boolean needsFill()
+    protected void needsFillInterest()
     {
-        updateLocalInterests(SelectionKey.OP_READ, true);
-        return false;
+        changeInterests(SelectionKey.OP_READ);
     }
 
     @Override
     protected void onIncompleteFlush()
     {
-        updateLocalInterests(SelectionKey.OP_WRITE, true);
+        changeInterests(SelectionKey.OP_WRITE);
     }
 
     @Override
-    public void onSelected()
+    public Runnable onSelected()
     {
-        assert _selector.isSelectorThread();
-        int oldInterestOps = _key.interestOps();
+        /**
+         * This method may run concurrently with {@link #changeInterests(int)}.
+         */
+
         int readyOps = _key.readyOps();
-        int newInterestOps = oldInterestOps & ~readyOps;
-        setKeyInterests(oldInterestOps, newInterestOps);
-        updateLocalInterests(readyOps, false);
-        if (_key.isReadable())
-            getFillInterest().fillable();
-        if (_key.isWritable())
-            getWriteFlusher().completeWrite();
+        int oldInterestOps;
+        int newInterestOps;
+        try (Locker.Lock lock = _locker.lock())
+        {
+            _updatePending = true;
+            // Remove the readyOps, that here can only be OP_READ or OP_WRITE (or both).
+            oldInterestOps = _desiredInterestOps;
+            newInterestOps = oldInterestOps & ~readyOps;
+            _desiredInterestOps = newInterestOps;
+        }
+
+
+        boolean readable = (readyOps & SelectionKey.OP_READ) != 0;
+        boolean writable = (readyOps & SelectionKey.OP_WRITE) != 0;
+
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("onSelected {}->{} r={} w={} for {}", oldInterestOps, newInterestOps, readable, writable, this);
+        
+        // Run non-blocking code immediately.
+        // This producer knows that this non-blocking code is special
+        // and that it must be run in this thread and not fed to the
+        // ExecutionStrategy, which could not have any thread to run these
+        // tasks (or it may starve forever just after having run them).
+        if (readable && getFillInterest().isCallbackNonBlocking())
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Direct readable run {}",this);
+            _runFillable.run();
+            readable = false;
+        }
+        if (writable && getWriteFlusher().isCallbackNonBlocking())
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Direct writable run {}",this);
+            _runCompleteWrite.run();
+            writable = false;
+        }
+
+        // return task to complete the job
+        Runnable task= readable ? (writable ? _runFillableCompleteWrite : _runFillable)
+                : (writable ? _runCompleteWrite : null);
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("task {}",task);
+        return task;
     }
 
-
-    private void updateLocalInterests(int operation, boolean add)
+    @Override
+    public void updateKey()
     {
-        while (true)
+        /**
+         * This method may run concurrently with {@link #changeInterests(int)}.
+         */
+
+        try
         {
-            int oldInterestOps = _interestOps.get();
+            int oldInterestOps;
             int newInterestOps;
-            if (add)
-                newInterestOps = oldInterestOps | operation;
-            else
-                newInterestOps = oldInterestOps & ~operation;
-
-            if (isInputShutdown())
-                newInterestOps &= ~SelectionKey.OP_READ;
-            if (isOutputShutdown())
-                newInterestOps &= ~SelectionKey.OP_WRITE;
-
-            if (newInterestOps != oldInterestOps)
+            try (Locker.Lock lock = _locker.lock())
             {
-                if (_interestOps.compareAndSet(oldInterestOps, newInterestOps))
+                _updatePending = false;
+                oldInterestOps = _currentInterestOps;
+                newInterestOps = _desiredInterestOps;
+                if (oldInterestOps != newInterestOps)
                 {
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("Local interests updating {} -> {} for {}", oldInterestOps, newInterestOps, this);
-                    _selector.updateKey(_updateTask);
-                }
-                else
-                {
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("Local interests update conflict: now {}, was {}, attempted {} for {}", _interestOps.get(), oldInterestOps, newInterestOps, this);
-                    continue;
+                    _currentInterestOps = newInterestOps;
+                    _key.interestOps(newInterestOps);
                 }
             }
-            else
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Ignoring local interests update {} -> {} for {}", oldInterestOps, newInterestOps, this);
-            }
-            break;
+
+            if (LOG.isDebugEnabled())
+                LOG.debug("Key interests updated {} -> {} on {}", oldInterestOps, newInterestOps, this);
+        }
+        catch (CancelledKeyException x)
+        {
+            LOG.debug("Ignoring key update for concurrently closed channel {}", this);
+            close();
+        }
+        catch (Throwable x)
+        {
+            LOG.warn("Ignoring key update for " + this, x);
+            close();
         }
     }
 
-
-    private void setKeyInterests(int oldInterestOps, int newInterestOps)
+    private void changeInterests(int operation)
     {
-        _key.interestOps(newInterestOps);
+        /**
+         * This method may run concurrently with
+         * {@link #updateKey()} and {@link #onSelected()}.
+         */
+
+        int oldInterestOps;
+        int newInterestOps;
+        boolean pending;
+        try (Locker.Lock lock = _locker.lock())
+        {
+            pending = _updatePending;
+            oldInterestOps = _desiredInterestOps;
+            newInterestOps = oldInterestOps | operation;
+            if (newInterestOps != oldInterestOps)
+                _desiredInterestOps = newInterestOps;
+        }
+
         if (LOG.isDebugEnabled())
-            LOG.debug("Key interests updated {} -> {} on {}", oldInterestOps, newInterestOps, this);
+            LOG.debug("changeInterests p={} {}->{} for {}", pending, oldInterestOps, newInterestOps, this);
+
+        if (!pending)
+            _selector.submit(_runUpdateKey);
     }
 
+
     @Override
     public void close()
     {
@@ -189,23 +281,22 @@
     @Override
     public String toString()
     {
-        // Do NOT use synchronized (this)
-        // because it's very easy to deadlock when debugging is enabled.
         // We do a best effort to print the right toString() and that's it.
         try
         {
-            boolean valid = _key!=null && _key.isValid();
+            boolean valid = _key != null && _key.isValid();
             int keyInterests = valid ? _key.interestOps() : -1;
             int keyReadiness = valid ? _key.readyOps() : -1;
-            return String.format("%s{io=%d,kio=%d,kro=%d}",
+            return String.format("%s{io=%d/%d,kio=%d,kro=%d}",
                     super.toString(),
-                    _interestOps.get(),
+                    _currentInterestOps,
+                    _desiredInterestOps,
                     keyInterests,
                     keyReadiness);
         }
-        catch (CancelledKeyException x)
+        catch (Throwable x)
         {
-            return String.format("%s{io=%s,kio=-2,kro=-2}", super.toString(), _interestOps.get());
+            return String.format("%s{io=%s,kio=-2,kro=-2}", super.toString(), _desiredInterestOps);
         }
     }
 }
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/SelectorManager.java b/jetty-io/src/main/java/org/eclipse/jetty/io/SelectorManager.java
index e421571..9dfe8db 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/SelectorManager.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/SelectorManager.java
@@ -18,36 +18,21 @@
 
 package org.eclipse.jetty.io;
 
-import java.io.Closeable;
 import java.io.IOException;
-import java.net.ConnectException;
+import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.net.SocketAddress;
-import java.net.SocketTimeoutException;
-import java.nio.channels.CancelledKeyException;
 import java.nio.channels.SelectionKey;
-import java.nio.channels.Selector;
 import java.nio.channels.ServerSocketChannel;
 import java.nio.channels.SocketChannel;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Queue;
-import java.util.Set;
-import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
 
-import org.eclipse.jetty.util.ConcurrentArrayQueue;
 import org.eclipse.jetty.util.TypeUtil;
-import org.eclipse.jetty.util.annotation.ManagedAttribute;
 import org.eclipse.jetty.util.component.AbstractLifeCycle;
 import org.eclipse.jetty.util.component.ContainerLifeCycle;
 import org.eclipse.jetty.util.component.Dumpable;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.util.thread.NonBlockingThread;
 import org.eclipse.jetty.util.thread.Scheduler;
 
 /**
@@ -58,18 +43,15 @@
  */
 public abstract class SelectorManager extends AbstractLifeCycle implements Dumpable
 {
-    public static final String SUBMIT_KEY_UPDATES = "org.eclipse.jetty.io.SelectorManager.submitKeyUpdates";
     public static final int DEFAULT_CONNECT_TIMEOUT = 15000;
     protected static final Logger LOG = Log.getLogger(SelectorManager.class);
-    private final static boolean __submitKeyUpdates = Boolean.valueOf(System.getProperty(SUBMIT_KEY_UPDATES, "true"));
-    
+
     private final Executor executor;
     private final Scheduler scheduler;
     private final ManagedSelector[] _selectors;
     private long _connectTimeout = DEFAULT_CONNECT_TIMEOUT;
     private long _selectorIndex;
-    private int _priorityDelta;
-    
+
     protected SelectorManager(Executor executor, Scheduler scheduler)
     {
         this(executor, scheduler, (Runtime.getRuntime().availableProcessors() + 1) / 2);
@@ -77,7 +59,7 @@
 
     protected SelectorManager(Executor executor, Scheduler scheduler, int selectors)
     {
-        if (selectors<=0)
+        if (selectors <= 0)
             throw new IllegalArgumentException("No selectors");
         this.executor = executor;
         this.scheduler = scheduler;
@@ -114,42 +96,25 @@
         _connectTimeout = milliseconds;
     }
 
-
-    @ManagedAttribute("The priority delta to apply to selector threads")
+    /**
+     * @return the selector priority delta
+     * @deprecated not implemented
+     */
+    @Deprecated
     public int getSelectorPriorityDelta()
     {
-        return _priorityDelta;
+        return 0;
     }
 
     /**
-     * Sets the selector thread priority delta to the given amount.
-     * <p>This allows the selector threads to run at a different priority.
-     * Typically this would be used to lower the priority to give preference
-     * to handling previously accepted connections rather than accepting
-     * new connections.</p>
-     *
-     * @param selectorPriorityDelta the amount to change the thread priority
-     *                              delta to (may be negative)
-     * @see Thread#getPriority()
+     * @param selectorPriorityDelta the selector priority delta
+     * @deprecated not implemented
      */
+    @Deprecated
     public void setSelectorPriorityDelta(int selectorPriorityDelta)
     {
-        int oldDelta = _priorityDelta;
-        _priorityDelta = selectorPriorityDelta;
-        if (oldDelta != selectorPriorityDelta && isStarted())
-        {
-            for (ManagedSelector selector : _selectors)
-            {
-                Thread thread = selector._thread;
-                if (thread != null)
-                {
-                    int deltaDiff = selectorPriorityDelta - oldDelta;
-                    thread.setPriority(Math.max(Thread.MIN_PRIORITY, Math.min(Thread.MAX_PRIORITY, thread.getPriority() - deltaDiff)));
-                }
-            }
-        }
     }
-    
+
     /**
      * Executes the given task in a different thread.
      *
@@ -168,14 +133,45 @@
         return _selectors.length;
     }
 
-    private ManagedSelector chooseSelector()
+    private ManagedSelector chooseSelector(SocketChannel channel)
     {
+        // Ideally we would like to have all connections from the same client end
+        // up on the same selector (to try to avoid smearing the data from a single 
+        // client over all cores), but because of proxies, the remote address may not
+        // really be the client - so we have to hedge our bets to ensure that all
+        // channels don't end up on the one selector for a proxy.
+        ManagedSelector candidate1 = null;
+        if (channel != null)
+        {
+            try
+            {
+                SocketAddress remote = channel.getRemoteAddress();
+                if (remote instanceof InetSocketAddress)
+                {
+                    byte[] addr = ((InetSocketAddress)remote).getAddress().getAddress();
+                    if (addr != null)
+                    {
+                        int s = addr[addr.length - 1] & 0xFF;
+                        candidate1 = _selectors[s % getSelectorCount()];
+                    }
+                }
+            }
+            catch (IOException x)
+            {
+                LOG.ignore(x);
+            }
+        }
+
         // The ++ increment here is not atomic, but it does not matter,
         // so long as the value changes sometimes, then connections will
         // be distributed over the available selectors.
         long s = _selectorIndex++;
         int index = (int)(s % getSelectorCount());
-        return _selectors[index];
+        ManagedSelector candidate2 = _selectors[index];
+
+        if (candidate1 == null || candidate1.size() >= candidate2.size() * 2)
+            return candidate2;
+        return candidate1;
     }
 
     /**
@@ -190,11 +186,12 @@
      */
     public void connect(SocketChannel channel, Object attachment)
     {
-        ManagedSelector set = chooseSelector();
+        ManagedSelector set = chooseSelector(channel);
         set.submit(set.new Connect(channel, attachment));
     }
 
     /**
+     * @param channel the channel to accept
      * @see #accept(SocketChannel, Object)
      */
     public void accept(SocketChannel channel)
@@ -209,29 +206,29 @@
      * just after a non-blocking connect via {@link SocketChannel#connect(SocketAddress)} that completed
      * successfully.</p>
      *
-     * @param channel the channel to register
+     * @param channel    the channel to register
      * @param attachment the attachment object
      */
     public void accept(SocketChannel channel, Object attachment)
     {
-        final ManagedSelector selector = chooseSelector();
+        final ManagedSelector selector = chooseSelector(channel);
         selector.submit(selector.new Accept(channel, attachment));
     }
-    
+
     /**
      * <p>Registers a server channel for accept operations.
      * When a {@link SocketChannel} is accepted from the given {@link ServerSocketChannel}
      * then the {@link #accepted(SocketChannel)} method is called, which must be
      * overridden by a derivation of this class to handle the accepted channel
-     * 
+     *
      * @param server the server channel to register
      */
     public void acceptor(ServerSocketChannel server)
     {
-        final ManagedSelector selector = chooseSelector();
+        final ManagedSelector selector = chooseSelector(null);
         selector.submit(selector.new Acceptor(server));
     }
-    
+
     /**
      * Callback method when a channel is accepted from the {@link ServerSocketChannel}
      * passed to {@link #acceptor(ServerSocketChannel)}.
@@ -239,7 +236,7 @@
      * be overridden by subclasses if a server channel is provided.
      *
      * @param channel the
-     * @throws IOException
+     * @throws IOException if unable to accept channel
      */
     protected void accepted(SocketChannel channel) throws IOException
     {
@@ -255,7 +252,7 @@
             ManagedSelector selector = newSelector(i);
             _selectors[i] = selector;
             selector.start();
-            execute(new NonBlockingThread(selector));
+            execute(selector);
         }
     }
 
@@ -267,7 +264,7 @@
      */
     protected ManagedSelector newSelector(int id)
     {
-        return new ManagedSelector(id);
+        return new ManagedSelector(this, id);
     }
 
     @Override
@@ -344,8 +341,8 @@
      * <p>Callback method invoked when a non-blocking connect cannot be completed.</p>
      * <p>By default it just logs with level warning.</p>
      *
-     * @param channel the channel that attempted the connect
-     * @param ex the exception that caused the connect to fail
+     * @param channel    the channel that attempted the connect
+     * @param ex         the exception that caused the connect to fail
      * @param attachment the attachment object associated at registration
      */
     protected void connectionFailed(SocketChannel channel, Throwable ex, Object attachment)
@@ -358,14 +355,14 @@
      * <p>This method is invoked as a result of the registration of a channel via {@link #connect(SocketChannel, Object)}
      * or {@link #accept(SocketChannel)}.</p>
      *
-     * @param channel   the channel associated to the endpoint
-     * @param selector the selector the channel is registered to
-     * @param selectionKey      the selection key
+     * @param channel      the channel associated to the endpoint
+     * @param selector     the selector the channel is registered to
+     * @param selectionKey the selection key
      * @return a new endpoint
      * @throws IOException if the endPoint cannot be created
      * @see #newConnection(SocketChannel, EndPoint, Object)
      */
-    protected abstract EndPoint newEndPoint(SocketChannel channel, SelectorManager.ManagedSelector selector, SelectionKey selectionKey) throws IOException;
+    protected abstract EndPoint newEndPoint(SocketChannel channel, ManagedSelector selector, SelectionKey selectionKey) throws IOException;
 
     /**
      * <p>Factory method to create {@link Connection}.</p>
@@ -374,7 +371,7 @@
      * @param endpoint   the endpoint
      * @param attachment the attachment
      * @return a new connection
-     * @throws IOException
+     * @throws IOException if unable to create new connection
      * @see #newEndPoint(SocketChannel, ManagedSelector, SelectionKey)
      */
     public abstract Connection newConnection(SocketChannel channel, EndPoint endpoint, Object attachment) throws IOException;
@@ -391,674 +388,4 @@
         ContainerLifeCycle.dumpObject(out, this);
         ContainerLifeCycle.dump(out, indent, TypeUtil.asList(_selectors));
     }
-
-    private enum State
-    {
-        CHANGES, MORE_CHANGES, SELECT, WAKEUP, PROCESS
-    }
-
-    /**
-     * <p>{@link ManagedSelector} wraps a {@link Selector} simplifying non-blocking operations on channels.</p>
-     * <p>{@link ManagedSelector} runs the select loop, which waits on {@link Selector#select()} until events
-     * happen for registered channels. When events happen, it notifies the {@link EndPoint} associated
-     * with the channel.</p>
-     */
-    public class ManagedSelector extends AbstractLifeCycle implements Runnable, Dumpable
-    {
-        private final AtomicReference<State> _state= new AtomicReference<>(State.PROCESS);
-        private final Queue<Runnable> _changes = new ConcurrentArrayQueue<>();
-        private final int _id;
-        private Selector _selector;
-        private volatile Thread _thread;
-
-        public ManagedSelector(int id)
-        {
-            _id = id;
-            setStopTimeout(5000);
-        }
-
-        @Override
-        protected void doStart() throws Exception
-        {
-            super.doStart();
-            _selector = Selector.open();
-            _state.set(State.PROCESS);
-        }
-
-        @Override
-        protected void doStop() throws Exception
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Stopping {}", this);
-            Stop stop = new Stop();
-            submit(stop);
-            stop.await(getStopTimeout());
-            if (LOG.isDebugEnabled())
-                LOG.debug("Stopped {}", this);
-        }
-
-        /**
-         * Submit a task to update a selector key.  If the System property {@link SelectorManager#SUBMIT_KEY_UPDATES}
-         * is set true (default is false), the task is passed to {@link #submit(Runnable)}.   Otherwise it is run immediately and the selector 
-         * woken up if need be.   
-         * @param update the update to a key
-         */
-        public void updateKey(Runnable update)
-        {
-            if (__submitKeyUpdates)
-            {
-                submit(update);
-            }
-            else
-            {
-                // Run only 1 change at once
-                synchronized (this)
-                {
-                    runChange(update);
-                }
-                if (_state.compareAndSet(State.SELECT, State.WAKEUP))
-                   wakeup();
-            }
-        }
-        
-        /**
-         * <p>Submits a change to be executed in the selector thread.</p>
-         * <p>Changes may be submitted from any thread, and the selector thread woken up
-         * (if necessary) to execute the change.</p>
-         *
-         * @param change the change to submit
-         */
-        public void submit(Runnable change)
-        {
-            // This method may be called from the selector thread, and therefore
-            // we could directly run the change without queueing, but this may
-            // lead to stack overflows on a busy server, so we always offer the
-            // change to the queue and process the state.
-
-            _changes.offer(change);
-            if (LOG.isDebugEnabled())
-                LOG.debug("Queued change {}", change);
-
-            out: while (true)
-            {
-                switch (_state.get())
-                {
-                    case SELECT:
-                        // Avoid multiple wakeup() calls if we the CAS fails
-                        if (!_state.compareAndSet(State.SELECT, State.WAKEUP))
-                            continue;
-                        wakeup();
-                        break out;
-                    case CHANGES:
-                        // Tell the selector thread that we have more changes.
-                        // If we fail to CAS, we possibly need to wakeup(), so loop.
-                        if (_state.compareAndSet(State.CHANGES, State.MORE_CHANGES))
-                            break out;
-                        continue;
-                    case WAKEUP:
-                        // Do nothing, we have already a wakeup scheduled
-                        break out;
-                    case MORE_CHANGES:
-                        // Do nothing, we already notified the selector thread of more changes
-                        break out;
-                    case PROCESS:
-                        // Do nothing, the changes will be run after the processing
-                        break out;
-                    default:
-                        throw new IllegalStateException();
-                }
-            }
-        }
-
-        private void runChanges()
-        {
-            Runnable change;
-            while ((change = _changes.poll()) != null)
-                runChange(change);
-        }
-
-        protected void runChange(Runnable change)
-        {
-            try
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Running change {}", change);
-                change.run();
-            }
-            catch (Throwable x)
-            {
-                LOG.debug("Could not run change " + change, x);
-            }
-        }
-
-        @Override
-        public void run()
-        {
-            _thread = Thread.currentThread();
-            String name = _thread.getName();
-            int priority = _thread.getPriority();
-            try
-            {
-                if (_priorityDelta != 0)
-                    _thread.setPriority(Math.max(Thread.MIN_PRIORITY, Math.min(Thread.MAX_PRIORITY, priority + _priorityDelta)));
-
-                _thread.setName(String.format("%s-selector-%s@%h/%d", name, SelectorManager.this.getClass().getSimpleName(), SelectorManager.this.hashCode(), _id));
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Starting {} on {}", _thread, this);
-                while (isRunning())
-                    select();
-                while(isStopping())
-                    runChanges();
-            }
-            finally
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Stopped {} on {}", _thread, this);
-                _thread.setName(name);
-                if (_priorityDelta != 0)
-                    _thread.setPriority(priority);
-            }
-        }
-
-        /**
-         * <p>Process changes and waits on {@link Selector#select()}.</p>
-         *
-         * @see #submit(Runnable)
-         */
-        public void select()
-        {
-            boolean debug = LOG.isDebugEnabled();
-            try
-            {
-                _state.set(State.CHANGES);
-
-                // Run the changes, and only exit if we ran all changes
-                out: while(true)
-                {
-                    switch (_state.get())
-                    {
-                        case CHANGES:
-                            runChanges();
-                            if (_state.compareAndSet(State.CHANGES, State.SELECT))
-                                break out;
-                            continue;
-                        case MORE_CHANGES:
-                            runChanges();
-                            _state.set(State.CHANGES);
-                            continue;
-                        default:
-                            throw new IllegalStateException();    
-                    }
-                }
-                // Must check first for SELECT and *then* for WAKEUP
-                // because we read the state twice in the assert, and
-                // it could change from SELECT to WAKEUP in between.
-                assert _state.get() == State.SELECT || _state.get() == State.WAKEUP;
-
-                if (debug)
-                    LOG.debug("Selector loop waiting on select");
-                int selected = _selector.select();
-                if (debug)
-                    LOG.debug("Selector loop woken up from select, {}/{} selected", selected, _selector.keys().size());
-
-                _state.set(State.PROCESS);
-
-                Set<SelectionKey> selectedKeys = _selector.selectedKeys();
-                for (SelectionKey key : selectedKeys)
-                {
-                    if (key.isValid())
-                    {
-                        processKey(key);
-                    }
-                    else
-                    {
-                        if (debug)
-                            LOG.debug("Selector loop ignoring invalid key for channel {}", key.channel());
-                        Object attachment = key.attachment();
-                        if (attachment instanceof EndPoint)
-                            ((EndPoint)attachment).close();
-                    }
-                }
-                selectedKeys.clear();
-            }
-            catch (Throwable x)
-            {
-                if (isRunning())
-                    LOG.warn(x);
-                else
-                    LOG.ignore(x);
-            }
-        }
-
-        private void processKey(SelectionKey key)
-        {
-            Object attachment = key.attachment();
-            try
-            {
-                if (attachment instanceof SelectableEndPoint)
-                {
-                    ((SelectableEndPoint)attachment).onSelected();
-                }
-                else if (key.isConnectable())
-                {
-                    processConnect(key, (Connect)attachment);
-                }
-                else if (key.isAcceptable())
-                {
-                    processAccept(key);
-                }
-                else
-                {
-                    throw new IllegalStateException();
-                }
-            }
-            catch (CancelledKeyException x)
-            {
-                LOG.debug("Ignoring cancelled key for channel {}", key.channel());
-                if (attachment instanceof EndPoint)
-                    closeNoExceptions((EndPoint)attachment);
-            }
-            catch (Throwable x)
-            {
-                LOG.warn("Could not process key for channel " + key.channel(), x);
-                if (attachment instanceof EndPoint)
-                    closeNoExceptions((EndPoint)attachment);
-            }
-        }
-
-        private void processConnect(SelectionKey key, Connect connect)
-        {
-            SocketChannel channel = (SocketChannel)key.channel();
-            try
-            {
-                key.attach(connect.attachment);
-                boolean connected = finishConnect(channel);
-                if (connected)
-                {
-                    if (connect.timeout.cancel())
-                    {
-                        key.interestOps(0);
-                        EndPoint endpoint = createEndPoint(channel, key);
-                        key.attach(endpoint);
-                    }
-                    else
-                    {
-                        throw new SocketTimeoutException("Concurrent Connect Timeout");
-                    }
-                }
-                else
-                {
-                    throw new ConnectException();
-                }
-            }
-            catch (Throwable x)
-            {
-                connect.failed(x);
-            }
-        }
-        
-        private void processAccept(SelectionKey key)
-        {
-            ServerSocketChannel server = (ServerSocketChannel)key.channel();
-            SocketChannel channel = null;
-            try
-            {
-                while ((channel = server.accept()) != null)
-                {
-                    accepted(channel);
-                }
-            }
-            catch (Throwable x)
-            {
-                closeNoExceptions(channel);
-                LOG.warn("Accept failed for channel " + channel, x);
-            }
-        }
-
-        private void closeNoExceptions(Closeable closeable)
-        {
-            try
-            {
-                if (closeable != null)
-                    closeable.close();
-            }
-            catch (Throwable x)
-            {
-                LOG.ignore(x);
-            }
-        }
-
-        public void wakeup()
-        {
-            _selector.wakeup();
-        }
-
-        public boolean isSelectorThread()
-        {
-            return Thread.currentThread() == _thread;
-        }
-
-        private EndPoint createEndPoint(SocketChannel channel, SelectionKey selectionKey) throws IOException
-        {
-            EndPoint endPoint = newEndPoint(channel, this, selectionKey);
-            endPointOpened(endPoint);
-            Connection connection = newConnection(channel, endPoint, selectionKey.attachment());
-            endPoint.setConnection(connection);
-            connectionOpened(connection);
-            if (LOG.isDebugEnabled())
-                LOG.debug("Created {}", endPoint);
-            return endPoint;
-        }
-
-        public void destroyEndPoint(EndPoint endPoint)
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Destroyed {}", endPoint);
-            Connection connection = endPoint.getConnection();
-            if (connection != null)
-                connectionClosed(connection);
-            endPointClosed(endPoint);
-        }
-
-        @Override
-        public String dump()
-        {
-            return ContainerLifeCycle.dump(this);
-        }
-
-        @Override
-        public void dump(Appendable out, String indent) throws IOException
-        {
-            out.append(String.valueOf(this)).append(" id=").append(String.valueOf(_id)).append("\n");
-
-            Thread selecting = _thread;
-
-            Object where = "not selecting";
-            StackTraceElement[] trace = selecting == null ? null : selecting.getStackTrace();
-            if (trace != null)
-            {
-                for (StackTraceElement t : trace)
-                    if (t.getClassName().startsWith("org.eclipse.jetty."))
-                    {
-                        where = t;
-                        break;
-                    }
-            }
-
-            Selector selector = _selector;
-            if (selector != null && selector.isOpen())
-            {
-                final ArrayList<Object> dump = new ArrayList<>(selector.keys().size() * 2);
-                dump.add(where);
-
-                DumpKeys dumpKeys = new DumpKeys(dump);
-                submit(dumpKeys);
-                dumpKeys.await(5, TimeUnit.SECONDS);
-
-                ContainerLifeCycle.dump(out, indent, dump);
-            }
-        }
-
-        public void dumpKeysState(List<Object> dumps)
-        {
-            Selector selector = _selector;
-            Set<SelectionKey> keys = selector.keys();
-            dumps.add(selector + " keys=" + keys.size());
-            for (SelectionKey key : keys)
-            {
-                if (key.isValid())
-                    dumps.add(key.attachment() + " iOps=" + key.interestOps() + " rOps=" + key.readyOps());
-                else
-                    dumps.add(key.attachment() + " iOps=-1 rOps=-1");
-            }
-        }
-
-        @Override
-        public String toString()
-        {
-            Selector selector = _selector;
-            return String.format("%s keys=%d selected=%d",
-                    super.toString(),
-                    selector != null && selector.isOpen() ? selector.keys().size() : -1,
-                    selector != null && selector.isOpen() ? selector.selectedKeys().size() : -1);
-        }
-
-        private class DumpKeys implements Runnable
-        {
-            private final CountDownLatch latch = new CountDownLatch(1);
-            private final List<Object> _dumps;
-
-            private DumpKeys(List<Object> dumps)
-            {
-                this._dumps = dumps;
-            }
-
-            @Override
-            public void run()
-            {
-                dumpKeysState(_dumps);
-                latch.countDown();
-            }
-
-            public boolean await(long timeout, TimeUnit unit)
-            {
-                try
-                {
-                    return latch.await(timeout, unit);
-                }
-                catch (InterruptedException x)
-                {
-                    return false;
-                }
-            }
-        }
-
-        private class Acceptor implements Runnable
-        {
-            private final ServerSocketChannel _channel;
-
-            public Acceptor(ServerSocketChannel channel)
-            {
-                this._channel = channel;
-            }
-
-            @Override
-            public void run()
-            {
-                try
-                {
-                    SelectionKey key = _channel.register(_selector, SelectionKey.OP_ACCEPT, null);
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("{} acceptor={}", this, key);
-                }
-                catch (Throwable x)
-                {
-                    closeNoExceptions(_channel);
-                    LOG.warn(x);
-                }
-            }
-        }
-
-        private class Accept implements Runnable
-        {
-            private final SocketChannel channel;
-            private final Object attachment;
-
-            private Accept(SocketChannel channel, Object attachment)
-            {
-                this.channel = channel;
-                this.attachment = attachment;
-            }
-
-            @Override
-            public void run()
-            {
-                try
-                {
-                    SelectionKey key = channel.register(_selector, 0, attachment);
-                    EndPoint endpoint = createEndPoint(channel, key);
-                    key.attach(endpoint);
-                }
-                catch (Throwable x)
-                {
-                    closeNoExceptions(channel);
-                    LOG.debug(x);
-                }
-            }
-        }
-
-        private class Connect implements Runnable
-        {
-            private final AtomicBoolean failed = new AtomicBoolean();
-            private final SocketChannel channel;
-            private final Object attachment;
-            private final Scheduler.Task timeout;
-
-            private Connect(SocketChannel channel, Object attachment)
-            {
-                this.channel = channel;
-                this.attachment = attachment;
-                this.timeout = scheduler.schedule(new ConnectTimeout(this), getConnectTimeout(), TimeUnit.MILLISECONDS);
-            }
-
-            @Override
-            public void run()
-            {
-                try
-                {
-                    channel.register(_selector, SelectionKey.OP_CONNECT, this);
-                }
-                catch (Throwable x)
-                {
-                    failed(x);
-                }
-            }
-
-            private void failed(Throwable failure)
-            {
-                if (failed.compareAndSet(false, true))
-                {
-                    timeout.cancel();
-                    closeNoExceptions(channel);
-                    connectionFailed(channel, failure, attachment);
-                }
-            }
-        }
-
-        private class ConnectTimeout implements Runnable
-        {
-            private final Connect connect;
-
-            private ConnectTimeout(Connect connect)
-            {
-                this.connect = connect;
-            }
-
-            @Override
-            public void run()
-            {
-                SocketChannel channel = connect.channel;
-                if (channel.isConnectionPending())
-                {
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("Channel {} timed out while connecting, closing it", channel);
-                    connect.failed(new SocketTimeoutException("Connect Timeout"));
-                }
-            }
-        }
-
-        private class Stop implements Runnable
-        {
-            private final CountDownLatch latch = new CountDownLatch(1);
-
-            @Override
-            public void run()
-            {
-                try
-                {
-                    for (SelectionKey key : _selector.keys())
-                    {
-                        Object attachment = key.attachment();
-                        if (attachment instanceof EndPoint)
-                        {
-                            EndPointCloser closer = new EndPointCloser((EndPoint)attachment);
-                            execute(closer);
-                            // We are closing the SelectorManager, so we want to block the
-                            // selector thread here until we have closed all EndPoints.
-                            // This is different than calling close() directly, because close()
-                            // can wait forever, while here we are limited by the stop timeout.
-                            closer.await(getStopTimeout());
-                        }
-                    }
-
-                    closeNoExceptions(_selector);
-                }
-                finally
-                {
-                    latch.countDown();
-                }
-            }
-
-            public boolean await(long timeout)
-            {
-                try
-                {
-                    return latch.await(timeout, TimeUnit.MILLISECONDS);
-                }
-                catch (InterruptedException x)
-                {
-                    return false;
-                }
-            }
-        }
-
-        private class EndPointCloser implements Runnable
-        {
-            private final CountDownLatch latch = new CountDownLatch(1);
-            private final EndPoint endPoint;
-
-            private EndPointCloser(EndPoint endPoint)
-            {
-                this.endPoint = endPoint;
-            }
-
-            @Override
-            public void run()
-            {
-                try
-                {
-                    closeNoExceptions(endPoint.getConnection());
-                }
-                finally
-                {
-                    latch.countDown();
-                }
-            }
-
-            private boolean await(long timeout)
-            {
-                try
-                {
-                    return latch.await(timeout, TimeUnit.MILLISECONDS);
-                }
-                catch (InterruptedException x)
-                {
-                    return false;
-                }
-            }
-        }
-    }
-
-    /**
-     * A {@link SelectableEndPoint} is an {@link EndPoint} that wish to be notified of
-     * non-blocking events by the {@link ManagedSelector}.
-     */
-    public interface SelectableEndPoint extends EndPoint
-    {
-        /**
-         * <p>Callback method invoked when a read or write events has been detected by the {@link ManagedSelector}
-         * for this endpoint.</p>
-         */
-        void onSelected();
-    }
 }
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/UncheckedPrintWriter.java b/jetty-io/src/main/java/org/eclipse/jetty/io/UncheckedPrintWriter.java
deleted file mode 100644
index dd10e47..0000000
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/UncheckedPrintWriter.java
+++ /dev/null
@@ -1,683 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.io;
-
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.io.Writer;
-
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/* ------------------------------------------------------------ */
-/**
- * A wrapper for the {@link java.io.PrintWriter} that re-throws the instances of
- * {@link java.io.IOException} thrown by the underlying implementation of
- * {@link java.io.Writer} as {@link RuntimeIOException} instances.
- */
-public class UncheckedPrintWriter extends PrintWriter
-{
-    private static final Logger LOG = Log.getLogger(UncheckedPrintWriter.class);
-
-    private boolean _autoFlush = false;
-    private IOException _ioException;
-    private boolean _isClosed = false;
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Line separator string. This is the value of the line.separator property
-     * at the moment that the stream was created.
-     */
-    private String _lineSeparator;
-
-    public UncheckedPrintWriter(Writer out)
-    {
-        this(out,false);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Create a new PrintWriter.
-     * 
-     * @param out
-     *            A character-output stream
-     * @param autoFlush
-     *            A boolean; if true, the println() methods will flush the
-     *            output buffer
-     */
-    public UncheckedPrintWriter(Writer out, boolean autoFlush)
-    {
-        super(out,autoFlush);
-        this._autoFlush = autoFlush;
-        this._lineSeparator = System.getProperty("line.separator");
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Create a new PrintWriter, without automatic line flushing, from an
-     * existing OutputStream. This convenience constructor creates the necessary
-     * intermediate OutputStreamWriter, which will convert characters into bytes
-     * using the default character encoding.
-     * 
-     * @param out
-     *            An output stream
-     * 
-     * @see java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream)
-     */
-    public UncheckedPrintWriter(OutputStream out)
-    {
-        this(out,false);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Create a new PrintWriter from an existing OutputStream. This convenience
-     * constructor creates the necessary intermediate OutputStreamWriter, which
-     * will convert characters into bytes using the default character encoding.
-     * 
-     * @param out
-     *            An output stream
-     * @param autoFlush
-     *            A boolean; if true, the println() methods will flush the
-     *            output buffer
-     * 
-     * @see java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream)
-     */
-    public UncheckedPrintWriter(OutputStream out, boolean autoFlush)
-    {
-        this(new BufferedWriter(new OutputStreamWriter(out)),autoFlush);
-    }
-    
-    
-    /* ------------------------------------------------------------ */
-    public boolean checkError()
-    {
-        return _ioException!=null || super.checkError();
-    }
-    
-    /* ------------------------------------------------------------ */
-    private void setError(Throwable th)
-    {
-      
-        super.setError();
-
-        if (th instanceof IOException)
-            _ioException=(IOException)th;
-        else
-        {
-            _ioException=new IOException(String.valueOf(th));
-            _ioException.initCause(th);
-        }
-
-        if (LOG.isDebugEnabled())
-            LOG.debug(th);
-    }
-
-
-    @Override
-    protected void setError()
-    {
-        setError(new IOException());
-    }
-
-    /* ------------------------------------------------------------ */
-    /** Check to make sure that the stream has not been closed */
-    private void isOpen() throws IOException
-    {       
-        if (_ioException!=null)
-            throw new RuntimeIOException(_ioException); 
-        
-        if (_isClosed)
-            throw new IOException("Stream closed");
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Flush the stream.
-     */
-    @Override
-    public void flush()
-    {
-        try
-        {
-            synchronized (lock)
-            {
-                isOpen();
-                out.flush();
-            }
-        }
-        catch (IOException ex)
-        {
-            setError(ex);
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Close the stream.
-     */
-    @Override
-    public void close()
-    {
-        try
-        {
-            synchronized (lock)
-            {
-                out.close();
-                _isClosed = true;
-            }
-        }
-        catch (IOException ex)
-        {
-            setError(ex);
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Write a single character.
-     * 
-     * @param c
-     *            int specifying a character to be written.
-     */
-    @Override
-    public void write(int c)
-    {
-        try
-        {
-            synchronized (lock)
-            {
-                isOpen();
-                out.write(c);
-            }
-        }
-        catch (InterruptedIOException x)
-        {
-            Thread.currentThread().interrupt();
-        }
-        catch (IOException ex)
-        {
-            setError(ex);
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Write a portion of an array of characters.
-     * 
-     * @param buf
-     *            Array of characters
-     * @param off
-     *            Offset from which to start writing characters
-     * @param len
-     *            Number of characters to write
-     */
-    @Override
-    public void write(char buf[], int off, int len)
-    {
-        try
-        {
-            synchronized (lock)
-            {
-                isOpen();
-                out.write(buf,off,len);
-            }
-        }
-        catch (InterruptedIOException x)
-        {
-            Thread.currentThread().interrupt();
-        }
-        catch (IOException ex)
-        {
-            setError(ex);
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Write an array of characters. This method cannot be inherited from the
-     * Writer class because it must suppress I/O exceptions.
-     * 
-     * @param buf
-     *            Array of characters to be written
-     */
-    @Override
-    public void write(char buf[])
-    { 
-        this.write(buf,0,buf.length);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Write a portion of a string.
-     * 
-     * @param s
-     *            A String
-     * @param off
-     *            Offset from which to start writing characters
-     * @param len
-     *            Number of characters to write
-     */
-    @Override
-    public void write(String s, int off, int len)
-    {
-        try
-        {
-            synchronized (lock)
-            {
-                isOpen();
-                out.write(s,off,len);
-            }
-        }
-        catch (InterruptedIOException x)
-        {
-            Thread.currentThread().interrupt();
-        }
-        catch (IOException ex)
-        {
-            setError(ex);
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Write a string. This method cannot be inherited from the Writer class
-     * because it must suppress I/O exceptions.
-     * 
-     * @param s
-     *            String to be written
-     */
-    @Override
-    public void write(String s)
-    {
-        this.write(s,0,s.length());
-    }
-
-    private void newLine()
-    {
-        try
-        {
-            synchronized (lock)
-            {
-                isOpen();
-                out.write(_lineSeparator);
-                if (_autoFlush)
-                    out.flush();
-            }
-        }
-        catch (InterruptedIOException x)
-        {
-            Thread.currentThread().interrupt();
-        }
-        catch (IOException ex)
-        {
-            setError(ex);
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Print a boolean value. The string produced by <code>{@link
-     * java.lang.String#valueOf(boolean)}</code> is translated into bytes
-     * according to the platform's default character encoding, and these bytes
-     * are written in exactly the manner of the <code>{@link
-     * #write(int)}</code> method.
-     * 
-     * @param b
-     *            The <code>boolean</code> to be printed
-     */
-    @Override
-    public void print(boolean b)
-    {
-        this.write(b?"true":"false");
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Print a character. The character is translated into one or more bytes
-     * according to the platform's default character encoding, and these bytes
-     * are written in exactly the manner of the <code>{@link
-     * #write(int)}</code> method.
-     * 
-     * @param c
-     *            The <code>char</code> to be printed
-     */
-    @Override
-    public void print(char c)
-    {
-        this.write(c);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Print an integer. The string produced by <code>{@link
-     * java.lang.String#valueOf(int)}</code> is translated into bytes according
-     * to the platform's default character encoding, and these bytes are written
-     * in exactly the manner of the <code>{@link #write(int)}</code> method.
-     * 
-     * @param i
-     *            The <code>int</code> to be printed
-     * @see java.lang.Integer#toString(int)
-     */
-    @Override
-    public void print(int i)
-    {
-        this.write(String.valueOf(i));
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Print a long integer. The string produced by <code>{@link
-     * java.lang.String#valueOf(long)}</code> is translated into bytes according
-     * to the platform's default character encoding, and these bytes are written
-     * in exactly the manner of the <code>{@link #write(int)}</code> method.
-     * 
-     * @param l
-     *            The <code>long</code> to be printed
-     * @see java.lang.Long#toString(long)
-     */
-    @Override
-    public void print(long l)
-    {
-        this.write(String.valueOf(l));
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Print a floating-point number. The string produced by <code>{@link
-     * java.lang.String#valueOf(float)}</code> is translated into bytes
-     * according to the platform's default character encoding, and these bytes
-     * are written in exactly the manner of the <code>{@link #write(int)}</code>
-     * method.
-     * 
-     * @param f
-     *            The <code>float</code> to be printed
-     * @see java.lang.Float#toString(float)
-     */
-    @Override
-    public void print(float f)
-    {
-        this.write(String.valueOf(f));
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Print a double-precision floating-point number. The string produced by
-     * <code>{@link java.lang.String#valueOf(double)}</code> is translated into
-     * bytes according to the platform's default character encoding, and these
-     * bytes are written in exactly the manner of the <code>{@link
-     * #write(int)}</code> method.
-     * 
-     * @param d
-     *            The <code>double</code> to be printed
-     * @see java.lang.Double#toString(double)
-     */
-    @Override
-    public void print(double d)
-    {
-        this.write(String.valueOf(d));
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Print an array of characters. The characters are converted into bytes
-     * according to the platform's default character encoding, and these bytes
-     * are written in exactly the manner of the <code>{@link #write(int)}</code>
-     * method.
-     * 
-     * @param s
-     *            The array of chars to be printed
-     * 
-     * @throws NullPointerException
-     *             If <code>s</code> is <code>null</code>
-     */
-    @Override
-    public void print(char s[])
-    {
-        this.write(s);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Print a string. If the argument is <code>null</code> then the string
-     * <code>"null"</code> is printed. Otherwise, the string's characters are
-     * converted into bytes according to the platform's default character
-     * encoding, and these bytes are written in exactly the manner of the
-     * <code>{@link #write(int)}</code> method.
-     * 
-     * @param s
-     *            The <code>String</code> to be printed
-     */
-    @Override
-    public void print(String s)
-    {
-        if (s == null)
-        {
-            s = "null";
-        }
-        this.write(s);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Print an object. The string produced by the <code>{@link
-     * java.lang.String#valueOf(Object)}</code> method is translated into bytes
-     * according to the platform's default character encoding, and these bytes
-     * are written in exactly the manner of the <code>{@link #write(int)}</code>
-     * method.
-     * 
-     * @param obj
-     *            The <code>Object</code> to be printed
-     * @see java.lang.Object#toString()
-     */
-    @Override
-    public void print(Object obj)
-    {
-        this.write(String.valueOf(obj));
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Terminate the current line by writing the line separator string. The line
-     * separator string is defined by the system property
-     * <code>line.separator</code>, and is not necessarily a single newline
-     * character (<code>'\n'</code>).
-     */
-    @Override
-    public void println()
-    {
-        this.newLine();
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Print a boolean value and then terminate the line. This method behaves as
-     * though it invokes <code>{@link #print(boolean)}</code> and then
-     * <code>{@link #println()}</code>.
-     * 
-     * @param x
-     *            the <code>boolean</code> value to be printed
-     */
-    @Override
-    public void println(boolean x)
-    {
-        synchronized (lock)
-        {
-            this.print(x);
-            this.println();
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Print a character and then terminate the line. This method behaves as
-     * though it invokes <code>{@link #print(char)}</code> and then <code>{@link
-     * #println()}</code>.
-     * 
-     * @param x
-     *            the <code>char</code> value to be printed
-     */
-    @Override
-    public void println(char x)
-    {
-        synchronized (lock)
-        {
-            this.print(x);
-            this.println();
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Print an integer and then terminate the line. This method behaves as
-     * though it invokes <code>{@link #print(int)}</code> and then <code>{@link
-     * #println()}</code>.
-     * 
-     * @param x
-     *            the <code>int</code> value to be printed
-     */
-    @Override
-    public void println(int x)
-    {
-        synchronized (lock)
-        {
-            this.print(x);
-            this.println();
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Print a long integer and then terminate the line. This method behaves as
-     * though it invokes <code>{@link #print(long)}</code> and then
-     * <code>{@link #println()}</code>.
-     * 
-     * @param x
-     *            the <code>long</code> value to be printed
-     */
-    @Override
-    public void println(long x)
-    {
-        synchronized (lock)
-        {
-            this.print(x);
-            this.println();
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Print a floating-point number and then terminate the line. This method
-     * behaves as though it invokes <code>{@link #print(float)}</code> and then
-     * <code>{@link #println()}</code>.
-     * 
-     * @param x
-     *            the <code>float</code> value to be printed
-     */
-    @Override
-    public void println(float x)
-    {
-        synchronized (lock)
-        {
-            this.print(x);
-            this.println();
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Print a double-precision floating-point number and then terminate the
-     * line. This method behaves as though it invokes <code>{@link
-     * #print(double)}</code> and then <code>{@link #println()}</code>.
-     * 
-     * @param x
-     *            the <code>double</code> value to be printed
-     */
-    /* ------------------------------------------------------------ */
-    @Override
-    public void println(double x)
-    {
-        synchronized (lock)
-        {
-            this.print(x);
-            this.println();
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Print an array of characters and then terminate the line. This method
-     * behaves as though it invokes <code>{@link #print(char[])}</code> and then
-     * <code>{@link #println()}</code>.
-     * 
-     * @param x
-     *            the array of <code>char</code> values to be printed
-     */
-    @Override
-    public void println(char x[])
-    {
-        synchronized (lock)
-        {
-            this.print(x);
-            this.println();
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Print a String and then terminate the line. This method behaves as though
-     * it invokes <code>{@link #print(String)}</code> and then
-     * <code>{@link #println()}</code>.
-     * 
-     * @param x
-     *            the <code>String</code> value to be printed
-     */
-    @Override
-    public void println(String x)
-    {
-        synchronized (lock)
-        {
-            this.print(x);
-            this.println();
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Print an Object and then terminate the line. This method behaves as
-     * though it invokes <code>{@link #print(Object)}</code> and then
-     * <code>{@link #println()}</code>.
-     * 
-     * @param x
-     *            the <code>Object</code> value to be printed
-     */
-    @Override
-    public void println(Object x)
-    {
-        synchronized (lock)
-        {
-            this.print(x);
-            this.println();
-        }
-    }
-}
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/WriteFlusher.java b/jetty-io/src/main/java/org/eclipse/jetty/io/WriteFlusher.java
index 93ff173..f2dea7d 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/WriteFlusher.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/WriteFlusher.java
@@ -37,10 +37,9 @@
 /**
  * A Utility class to help implement {@link EndPoint#write(Callback, ByteBuffer...)} by calling
  * {@link EndPoint#flush(ByteBuffer...)} until all content is written.
- * The abstract method {@link #onIncompleteFlushed()} is called when not all content has been written after a call to
- * flush and should organise for the {@link #completeWrite()} method to be called when a subsequent call to flush
+ * The abstract method {@link #onIncompleteFlush()} is called when not all content has been written after a call to
+ * flush and should organize for the {@link #completeWrite()} method to be called when a subsequent call to flush
  * should  be able to make more progress.
- * <p>
  */
 abstract public class WriteFlusher
 {
@@ -269,25 +268,37 @@
             if (_callback!=null)
                 _callback.succeeded();
         }
+        
+        boolean isCallbackNonBlocking()
+        {
+            return _callback!=null && _callback.isNonBlocking();
+        }
     }
 
+    public boolean isCallbackNonBlocking()
+    {
+        State s = _state.get();
+        return (s instanceof PendingState) && ((PendingState)s).isCallbackNonBlocking();
+    }
+    
     /**
      * Abstract call to be implemented by specific WriteFlushers. It should schedule a call to {@link #completeWrite()}
      * or {@link #onFail(Throwable)} when appropriate.
      */
-    abstract protected void onIncompleteFlushed();
+    abstract protected void onIncompleteFlush();
 
     /**
      * Tries to switch state to WRITING. If successful it writes the given buffers to the EndPoint. If state transition
      * fails it'll fail the callback.
      *
      * If not all buffers can be written in one go it creates a new <code>PendingState</code> object to preserve the state
-     * and then calls {@link #onIncompleteFlushed()}. The remaining buffers will be written in {@link #completeWrite()}.
+     * and then calls {@link #onIncompleteFlush()}. The remaining buffers will be written in {@link #completeWrite()}.
      *
      * If all buffers have been written it calls callback.complete().
      *
      * @param callback the callback to call on either failed or complete
      * @param buffers the buffers to flush to the endpoint
+     * @throws WritePendingException if unable to write due to prior pending write
      */
     public void write(Callback callback, ByteBuffer... buffers) throws WritePendingException
     {
@@ -308,7 +319,7 @@
                     LOG.debug("flushed incomplete");
                 PendingState pending=new PendingState(buffers, callback);
                 if (updateState(__WRITING,pending))
-                    onIncompleteFlushed();
+                    onIncompleteFlush();
                 else
                     fail(pending);
                 return;
@@ -336,7 +347,7 @@
 
 
     /**
-     * Complete a write that has not completed and that called {@link #onIncompleteFlushed()} to request a call to this
+     * Complete a write that has not completed and that called {@link #onIncompleteFlush()} to request a call to this
      * method when a call to {@link EndPoint#flush(ByteBuffer...)} is likely to be able to progress.
      *
      * It tries to switch from PENDING to COMPLETING. If state transition fails, then it does nothing as the callback
@@ -371,7 +382,7 @@
                 if (buffers!=pending.getBuffers())
                     pending=new PendingState(buffers, pending._callback);
                 if (updateState(__COMPLETING,pending))
-                    onIncompleteFlushed();
+                    onIncompleteFlush();
                 else
                     fail(pending);
                 return;
@@ -397,7 +408,7 @@
     /** Flush the buffers iteratively until no progress is made
      * @param buffers The buffers to flush
      * @return The unflushed buffers, or null if all flushed
-     * @throws IOException
+     * @throws IOException if unable to flush
      */
     protected ByteBuffer[] flush(ByteBuffer[] buffers) throws IOException
     {
@@ -408,6 +419,9 @@
             boolean flushed=_endPoint.flush(buffers);
             int r=buffers.length==0?0:buffers[0].remaining();
             
+            if (LOG.isDebugEnabled())
+                LOG.debug("Flushed={} {}/{}+{} {}",flushed,before-r,before,buffers.length-1,this);
+            
             if (flushed)
                 return null;
             
@@ -429,6 +443,9 @@
             if (not_empty>0)
                 buffers=Arrays.copyOfRange(buffers,not_empty,buffers.length);
         }        
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("!fully flushed {}",this);
         
         // If buffers is null, then flush has returned false but has consumed all the data!
         // This is probably SSL being unable to flush the encrypted buffer, so return EMPTY_BUFFERS
@@ -505,4 +522,23 @@
     {
         return String.format("WriteFlusher@%x{%s}", hashCode(), _state.get());
     }
+    
+    public String toStateString()
+    {
+        switch(_state.get().getType())
+        {
+            case WRITING:
+                return "W";
+            case PENDING:
+                return "P";
+            case COMPLETING:
+                return "C";
+            case IDLE:
+                return "-";
+            case FAILED:
+                return "F";
+            default:
+                return "?";
+        }
+    }
 }
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslClientConnectionFactory.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslClientConnectionFactory.java
index 265aa99..c1cbbc7 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslClientConnectionFactory.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslClientConnectionFactory.java
@@ -31,6 +31,7 @@
 
 public class SslClientConnectionFactory implements ClientConnectionFactory
 {
+    public static final String SSL_CONTEXT_FACTORY_CONTEXT_KEY = "ssl.context.factory";
     public static final String SSL_PEER_HOST_CONTEXT_KEY = "ssl.peer.host";
     public static final String SSL_PEER_PORT_CONTEXT_KEY = "ssl.peer.port";
     public static final String SSL_ENGINE_CONTEXT_KEY = "ssl.engine";
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
index 0527438..ca32841 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
@@ -21,8 +21,8 @@
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.channels.ClosedChannelException;
-import java.util.Arrays;
 import java.util.concurrent.Executor;
+
 import javax.net.ssl.SSLEngine;
 import javax.net.ssl.SSLEngineResult;
 import javax.net.ssl.SSLEngineResult.HandshakeStatus;
@@ -35,7 +35,6 @@
 import org.eclipse.jetty.io.Connection;
 import org.eclipse.jetty.io.EndPoint;
 import org.eclipse.jetty.io.EofException;
-import org.eclipse.jetty.io.FillInterest;
 import org.eclipse.jetty.io.RuntimeIOException;
 import org.eclipse.jetty.io.SelectChannelEndPoint;
 import org.eclipse.jetty.io.WriteFlusher;
@@ -87,8 +86,9 @@
     private ByteBuffer _decryptedInput;
     private ByteBuffer _encryptedInput;
     private ByteBuffer _encryptedOutput;
-    private final boolean _encryptedDirectBuffers = false;
+    private final boolean _encryptedDirectBuffers = true;
     private final boolean _decryptedDirectBuffers = false;
+    private boolean _renegotiationAllowed;
     private final Runnable _runCompletWrite = new Runnable()
     {
         @Override
@@ -97,13 +97,20 @@
             _decryptedEndPoint.getWriteFlusher().completeWrite();
         }
     };
-    private boolean _renegotiationAllowed;
+    private final Runnable _runFillable = new Runnable()
+    {
+        @Override
+        public void run()
+        {
+            _decryptedEndPoint.getFillInterest().fillable();
+        }
+    };
 
     public SslConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine sslEngine)
     {
-        // This connection does not execute calls to onfillable, so they will be called by the selector thread.
-        // onfillable does not block and will only wakeup another thread to do the actual reading and handling.
-        super(endPoint, executor, !EXECUTE_ONFILLABLE);
+        // This connection does not execute calls to onFillable(), so they will be called by the selector thread.
+        // onFillable() does not block and will only wakeup another thread to do the actual reading and handling.
+        super(endPoint, executor);
         this._bufferPool = byteBufferPool;
         this._sslEngine = sslEngine;
         this._decryptedEndPoint = newDecryptedEndPoint();
@@ -190,7 +197,7 @@
             if (_decryptedEndPoint._flushRequiresFillToProgress)
             {
                 _decryptedEndPoint._flushRequiresFillToProgress = false;
-                getExecutor().execute(_runCompletWrite);
+                _runCompletWrite.run();
             }
         }
 
@@ -272,7 +279,7 @@
                 }
                 if (fillable)
                     getFillInterest().fillable();
-                getExecutor().execute(_runCompletWrite);
+                _runCompletWrite.run();
             }
 
             @Override
@@ -326,12 +333,6 @@
         }
 
         @Override
-        protected FillInterest getFillInterest()
-        {
-            return super.getFillInterest();
-        }
-
-        @Override
         public void setIdleTimeout(long idleTimeout)
         {
             super.setIdleTimeout(idleTimeout);
@@ -355,7 +356,7 @@
             synchronized (DecryptedEndPoint.this)
             {
                 if (DEBUG)
-                    LOG.debug("onIncompleteFlush {}", getEndPoint());
+                    LOG.debug("onIncompleteFlush {}", SslConnection.this);
                 // If we have pending output data,
                 if (BufferUtil.hasContent(_encryptedOutput))
                 {
@@ -368,7 +369,8 @@
                 {
                     // check if we are actually read blocked in order to write
                     _flushRequiresFillToProgress = true;
-                    SslConnection.this.fillInterested();
+
+                    ensureFillInterested();
                 }
                 else
                 {
@@ -394,15 +396,14 @@
                 else
                 {
                     // try to flush what is pending
-                    // because this is a special case (see above) we could probably
-                    // avoid the dispatch, but best to be sure
+                    // execute to avoid recursion
                     getExecutor().execute(_runCompletWrite);
                 }
             }
         }
 
         @Override
-        protected boolean needsFill() throws IOException
+        protected void needsFillInterest() throws IOException
         {
             // This means that the decrypted data consumer has called the fillInterested
             // method on the DecryptedEndPoint, so we have to work out if there is
@@ -412,11 +413,12 @@
             synchronized (DecryptedEndPoint.this)
             {
                 // Do we already have some app data, then app can fill now so return true
-                if (BufferUtil.hasContent(_decryptedInput))
-                    return true;
+                boolean fillable = (BufferUtil.hasContent(_decryptedInput))
+                        // or if we have encryptedInput and have not underflowed yet, the it is worth trying a fill
+                        || BufferUtil.hasContent(_encryptedInput) && !_underFlown;
 
                 // If we have no encrypted data to decrypt OR we have some, but it is not enough
-                if (BufferUtil.isEmpty(_encryptedInput) || _underFlown)
+                if (!fillable)
                 {
                     // We are not ready to read data
 
@@ -437,23 +439,15 @@
                             // we have already written the net data
                             // pretend we are readable so the wrap is done by next readable callback
                             _fillRequiresFlushToProgress = false;
-                            return true;
+                            fillable=true;
                         }
                     }
-                    else
-                    {
-                        // Normal readable callback
-                        // Get called back on onfillable when then is more data to fill
-                        SslConnection.this.fillInterested();
-                    }
-
-                    return false;
                 }
-                else
-                {
-                    // We are ready to read data
-                    return true;
-                }
+                
+                if (fillable)
+                    getExecutor().execute(_runFillable);
+                else 
+                    ensureFillInterested();
             }
         }
 
@@ -477,8 +471,6 @@
         @Override
         public synchronized int fill(ByteBuffer buffer) throws IOException
         {
-            if (DEBUG)
-                LOG.debug("{} fill enter", SslConnection.this);
             try
             {
                 // Do we already have some decrypted data?
@@ -505,8 +497,6 @@
                 {
                     // Let's try reading some encrypted data... even if we have some already.
                     int net_filled = getEndPoint().fill(_encryptedInput);
-                    if (DEBUG)
-                        LOG.debug("{} filled {} encrypted bytes", SslConnection.this, net_filled);
 
                     decryption: while (true)
                     {
@@ -523,7 +513,10 @@
                             BufferUtil.flipToFlush(app_in, pos);
                         }
                         if (DEBUG)
-                            LOG.debug("{} unwrap {}", SslConnection.this, unwrapResult);
+                        {
+                            LOG.debug("{} net={} unwrap {}", SslConnection.this, net_filled, unwrapResult.toString().replace('\n',' '));
+                            LOG.debug("{} filled {}",SslConnection.this,BufferUtil.toHexSummary(buffer));
+                        }
 
                         HandshakeStatus handshakeStatus = _sslEngine.getHandshakeStatus();
                         HandshakeStatus unwrapHandshakeStatus = unwrapResult.getHandshakeStatus();
@@ -583,8 +576,9 @@
                                 {
                                     _handshaken = true;
                                     if (DEBUG)
-                                        LOG.debug("{} {} handshake completed", SslConnection.this,
-                                                _sslEngine.getUseClientMode() ? "client-side" : "resumed session server-side");
+                                        LOG.debug("{} {} handshook {}/{}", SslConnection.this,
+                                                _sslEngine.getUseClientMode() ? "client" : "resumed server",
+                                                _sslEngine.getSession().getProtocol(),_sslEngine.getSession().getCipherSuite());
                                 }
 
                                 // Check whether renegotiation is allowed
@@ -661,6 +655,13 @@
                     }
                 }
             }
+            catch (IllegalStateException e)
+            {
+                // Some internal error in SSLEngine
+                LOG.debug(e);
+                getEndPoint().close();
+                throw new EofException(e);
+            }
             catch (Exception e)
             {
                 getEndPoint().close();
@@ -685,8 +686,6 @@
                     _bufferPool.release(_decryptedInput);
                     _decryptedInput = null;
                 }
-                if (DEBUG)
-                    LOG.debug("{} fill exit", SslConnection.this);
             }
         }
 
@@ -711,10 +710,13 @@
             // will return 0 (even if some handshake bytes were flushed and filled).
             // it is the applications responsibility to call flush again - either in a busy loop
             // or better yet by using EndPoint#write to do the flushing.
-
+            
             if (DEBUG)
-                LOG.debug("{} flush enter {}", SslConnection.this, Arrays.toString(appOuts));
-            int consumed=0;
+            {
+                for (ByteBuffer b : appOuts)
+                    LOG.debug("{} flush {}", SslConnection.this, BufferUtil.toHexSummary(b));
+            }
+            
             try
             {
                 if (_cannotAcceptMoreAppDataToFlush)
@@ -736,17 +738,15 @@
                     SSLEngineResult wrapResult;
                     try
                     {
-                        wrapResult=_sslEngine.wrap(appOuts, _encryptedOutput);
+                        wrapResult = _sslEngine.wrap(appOuts, _encryptedOutput);
                     }
                     finally
                     {
                         BufferUtil.flipToFlush(_encryptedOutput, pos);
                     }
-                    
                     if (DEBUG)
-                        LOG.debug("{} wrap {}", SslConnection.this, wrapResult);
-                    if (wrapResult.bytesConsumed()>0)
-                        consumed+=wrapResult.bytesConsumed();
+                        LOG.debug("{} wrap {}", SslConnection.this, wrapResult.toString().replace('\n',' '));
+                    
                     Status wrapResultStatus = wrapResult.getStatus();
 
                     boolean allConsumed=true;
@@ -783,13 +783,13 @@
 
                         default:
                             if (DEBUG)
-                                LOG.debug("{} {} {}", this, wrapResultStatus, BufferUtil.toDetailString(_encryptedOutput));
+                                LOG.debug("{} wrap {} {}", SslConnection.this, wrapResultStatus, BufferUtil.toHexSummary(_encryptedOutput));
 
                             if (wrapResult.getHandshakeStatus() == HandshakeStatus.FINISHED && !_handshaken)
                             {
                                 _handshaken = true;
                                 if (DEBUG)
-                                    LOG.debug("{} {} handshake completed", SslConnection.this, "server-side");
+                                    LOG.debug("{} server handshook complete {}/{}", SslConnection.this, _sslEngine.getSession().getProtocol(),_sslEngine.getSession().getCipherSuite());
                             }
 
                             HandshakeStatus handshakeStatus = _sslEngine.getHandshakeStatus();
@@ -852,8 +852,6 @@
             }
             finally
             {
-                if (DEBUG)
-                    LOG.debug("{} flush exit, consumed {}", SslConnection.this, consumed);
                 releaseEncryptedOutputBuffer();
             }
         }
@@ -888,9 +886,12 @@
             {
                 try
                 {
-                    _sslEngine.closeOutbound();
-                    flush(BufferUtil.EMPTY_BUFFER); // Send close handshake
-                    SslConnection.this.fillInterested(); // seek reply FIN or RST or close handshake
+                    synchronized (this) // TODO review synchronized boundary
+                    {
+                        _sslEngine.closeOutbound();
+                        flush(BufferUtil.EMPTY_BUFFER); // Send close handshake
+                        ensureFillInterested();
+                    }
                 }
                 catch (Exception e)
                 {
@@ -900,6 +901,12 @@
             }
         }
 
+        private void ensureFillInterested()
+        {
+            if (!SslConnection.this.isFillInterested())
+                SslConnection.this.fillInterested();
+        }
+        
         @Override
         public boolean isOutputShutdown()
         {
@@ -909,10 +916,10 @@
         @Override
         public void close()
         {
-            super.close();
             // First send the TLS Close Alert, then the FIN
             shutdownOutput();
             getEndPoint().close();
+            super.close();
         }
 
         @Override
diff --git a/jetty-io/src/test/java/org/eclipse/jetty/io/ByteArrayEndPointTest.java b/jetty-io/src/test/java/org/eclipse/jetty/io/ByteArrayEndPointTest.java
index c10c9a5..4fabdea 100644
--- a/jetty-io/src/test/java/org/eclipse/jetty/io/ByteArrayEndPointTest.java
+++ b/jetty-io/src/test/java/org/eclipse/jetty/io/ByteArrayEndPointTest.java
@@ -18,8 +18,10 @@
 
 package org.eclipse.jetty.io;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.greaterThan;
 import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
@@ -29,6 +31,7 @@
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
 import org.eclipse.jetty.toolchain.test.AdvancedRunner;
@@ -64,7 +67,7 @@
     public void testFill() throws Exception
     {
         ByteArrayEndPoint endp = new ByteArrayEndPoint();
-        endp.setInput("test input");
+        endp.addInput("test input");
 
         ByteBuffer buffer = BufferUtil.allocate(1024);
 
@@ -73,13 +76,13 @@
 
         assertEquals(0,endp.fill(buffer));
 
-        endp.setInput(" more");
+        endp.addInput(" more");
         assertEquals(5,endp.fill(buffer));
         assertEquals("test input more",BufferUtil.toString(buffer));
 
         assertEquals(0,endp.fill(buffer));
 
-        endp.setInput((ByteBuffer)null);
+        endp.addInput((ByteBuffer)null);
 
         assertEquals(-1,endp.fill(buffer));
 
@@ -96,7 +99,7 @@
         }
 
         endp.reset();
-        endp.setInput("and more");
+        endp.addInput("and more");
         buffer = BufferUtil.allocate(4);
 
         assertEquals(4,endp.fill(buffer));
@@ -105,7 +108,6 @@
         BufferUtil.clear(buffer);
         assertEquals(4,endp.fill(buffer));
         assertEquals("more",BufferUtil.toString(buffer));
-
     }
 
     @Test
@@ -155,12 +157,13 @@
     public void testReadable() throws Exception
     {
         ByteArrayEndPoint endp = new ByteArrayEndPoint(_scheduler, 5000);
-        endp.setInput("test input");
+        endp.addInput("test input");
 
         ByteBuffer buffer = BufferUtil.allocate(1024);
         FutureCallback fcb = new FutureCallback();
 
         endp.fillInterested(fcb);
+        fcb.get(100,TimeUnit.MILLISECONDS);
         assertTrue(fcb.isDone());
         assertEquals(null, fcb.get());
         assertEquals(10, endp.fill(buffer));
@@ -168,10 +171,12 @@
 
         fcb = new FutureCallback();
         endp.fillInterested(fcb);
+        Thread.sleep(100);
         assertFalse(fcb.isDone());
         assertEquals(0, endp.fill(buffer));
 
-        endp.setInput(" more");
+        endp.addInput(" more");
+        fcb.get(1000,TimeUnit.MILLISECONDS);
         assertTrue(fcb.isDone());
         assertEquals(null, fcb.get());
         assertEquals(5, endp.fill(buffer));
@@ -179,16 +184,18 @@
 
         fcb = new FutureCallback();
         endp.fillInterested(fcb);
+        Thread.sleep(100);
         assertFalse(fcb.isDone());
         assertEquals(0, endp.fill(buffer));
 
-        endp.setInput((ByteBuffer)null);
+        endp.addInput((ByteBuffer)null);
         assertTrue(fcb.isDone());
         assertEquals(null, fcb.get());
         assertEquals(-1, endp.fill(buffer));
 
         fcb = new FutureCallback();
         endp.fillInterested(fcb);
+        fcb.get(1000,TimeUnit.MILLISECONDS);
         assertTrue(fcb.isDone());
         assertEquals(null, fcb.get());
         assertEquals(-1, endp.fill(buffer));
@@ -197,10 +204,9 @@
 
         fcb = new FutureCallback();
         endp.fillInterested(fcb);
-        assertTrue(fcb.isDone());
         try
         {
-            fcb.get();
+            fcb.get(1000,TimeUnit.MILLISECONDS);
             fail();
         }
         catch (ExecutionException e)
@@ -264,7 +270,7 @@
     {
         long idleTimeout = 500;
         ByteArrayEndPoint endp = new ByteArrayEndPoint(_scheduler, idleTimeout);
-        endp.setInput("test");
+        endp.addInput("test");
         endp.setGrowOutput(false);
         endp.setOutput(BufferUtil.allocate(5));
 
@@ -278,6 +284,7 @@
         FutureCallback fcb = new FutureCallback();
 
         endp.fillInterested(fcb);
+        fcb.get(100,TimeUnit.MILLISECONDS);
         assertTrue(fcb.isDone());
         assertEquals(null, fcb.get());
         assertEquals(4, endp.fill(buffer));
diff --git a/jetty-io/src/test/java/org/eclipse/jetty/io/IOTest.java b/jetty-io/src/test/java/org/eclipse/jetty/io/IOTest.java
index 573d1b0..cc38b8ee 100644
--- a/jetty-io/src/test/java/org/eclipse/jetty/io/IOTest.java
+++ b/jetty-io/src/test/java/org/eclipse/jetty/io/IOTest.java
@@ -18,11 +18,6 @@
 
 package org.eclipse.jetty.io;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -43,7 +38,6 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
-import org.eclipse.jetty.io.ClientConnectionFactory.Helper;
 import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
 import org.eclipse.jetty.toolchain.test.OS;
 import org.eclipse.jetty.util.BufferUtil;
@@ -51,6 +45,11 @@
 import org.junit.Assert;
 import org.junit.Test;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
 public class IOTest
 {
     @Test
@@ -437,9 +436,9 @@
         connector.bind(null);
         InetSocketAddress addr=(InetSocketAddress)connector.getLocalAddress();
         Future<AsynchronousSocketChannel> acceptor = connector.accept();
-        
+
         AsynchronousSocketChannel client = AsynchronousSocketChannel.open();
-        
+
         client.connect(new InetSocketAddress("127.0.0.1",addr.getPort())).get(5, TimeUnit.SECONDS);
 
         AsynchronousSocketChannel server = acceptor.get(5, TimeUnit.SECONDS);
@@ -457,14 +456,14 @@
 
         Assert.assertEquals(ByteBuffer.wrap(data), read);
     }
-    
+
     @Test
     public void testGatherWrite() throws Exception
     {
         File dir = MavenTestingUtils.getTargetTestingDir();
         if (!dir.exists())
             dir.mkdir();
-        
+
         File file = File.createTempFile("test",".txt",dir);
         file.deleteOnExit();
         FileChannel out = FileChannel.open(file.toPath(),
@@ -472,7 +471,7 @@
                 StandardOpenOption.READ,
                 StandardOpenOption.WRITE,
                 StandardOpenOption.DELETE_ON_CLOSE);
-        
+
         ByteBuffer[] buffers = new ByteBuffer[4096];
         long expected=0;
         for (int i=0;i<buffers.length;i++)
@@ -480,9 +479,9 @@
             buffers[i]=BufferUtil.toBuffer(i);
             expected+=buffers[i].remaining();
         }
-        
+
         long wrote = IO.write(out,buffers,0,buffers.length);
-        
+
         assertEquals(expected,wrote);
 
         for (int i=0;i<buffers.length;i++)
diff --git a/jetty-io/src/test/java/org/eclipse/jetty/io/MappedByteBufferPoolTest.java b/jetty-io/src/test/java/org/eclipse/jetty/io/MappedByteBufferPoolTest.java
index 3f49157..507b864 100644
--- a/jetty-io/src/test/java/org/eclipse/jetty/io/MappedByteBufferPoolTest.java
+++ b/jetty-io/src/test/java/org/eclipse/jetty/io/MappedByteBufferPoolTest.java
@@ -32,7 +32,6 @@
 
 import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.util.StringUtil;
-import org.hamcrest.Matchers;
 import org.junit.Test;
 
 public class MappedByteBufferPoolTest
@@ -91,6 +90,7 @@
     /**
      * In a scenario where MappedByteBufferPool is being used improperly, such as releasing a buffer that wasn't created/acquired by the MappedByteBufferPool,
      * an assertion is tested for.
+     * @throws Exception test failure
      */
     @Test
     public void testReleaseAssertion() throws Exception
diff --git a/jetty-io/src/test/java/org/eclipse/jetty/io/SelectChannelEndPointTest.java b/jetty-io/src/test/java/org/eclipse/jetty/io/SelectChannelEndPointTest.java
index ac42bbd..77e004c 100644
--- a/jetty-io/src/test/java/org/eclipse/jetty/io/SelectChannelEndPointTest.java
+++ b/jetty-io/src/test/java/org/eclipse/jetty/io/SelectChannelEndPointTest.java
@@ -41,6 +41,7 @@
 import java.util.concurrent.TimeUnit;
 
 import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.Callback;
 import org.eclipse.jetty.util.FutureCallback;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
@@ -116,6 +117,7 @@
 
     public class TestConnection extends AbstractConnection
     {
+        volatile FutureCallback _blockingRead;
         ByteBuffer _in = BufferUtil.allocate(32 * 1024);
         ByteBuffer _out = BufferUtil.allocate(32 * 1024);
         long _last = -1;
@@ -133,8 +135,29 @@
         }
 
         @Override
-        public synchronized void onFillable()
+        public void onFillInterestedFailed(Throwable cause)
         {
+            Callback blocking = _blockingRead;
+            if (blocking!=null)
+            {
+                _blockingRead=null;
+                blocking.failed(cause);
+                return;
+            }
+            super.onFillInterestedFailed(cause);
+        }
+        
+        @Override
+        public void onFillable()
+        {
+            Callback blocking = _blockingRead;
+            if (blocking!=null)
+            {
+                _blockingRead=null;
+                blocking.succeeded();
+                return;
+            }
+            
             EndPoint _endp = getEndPoint();
             try
             {
@@ -145,6 +168,7 @@
                     progress = false;
 
                     // Fill the input buffer with everything available
+                    BufferUtil.compact(_in);
                     if (BufferUtil.isFull(_in))
                         throw new IllegalStateException("FULL " + BufferUtil.toDetailString(_in));
                     int filled = _endp.fill(_in);
@@ -154,9 +178,9 @@
                     // If the tests wants to block, then block
                     while (_blockAt > 0 && _endp.isOpen() && _in.remaining() < _blockAt)
                     {
-                        FutureCallback blockingRead = new FutureCallback();
-                        fillInterested(blockingRead);
-                        blockingRead.get();
+                        FutureCallback future = _blockingRead = new FutureCallback();
+                        fillInterested();
+                        future.get();
                         filled = _endp.fill(_in);
                         progress |= filled > 0;
                     }
@@ -183,6 +207,9 @@
                     if (_endp.isInputShutdown())
                         _endp.shutdownOutput();
                 }
+
+                if (_endp.isOpen())
+                    fillInterested();
             }
             catch (ExecutionException e)
             {
@@ -209,8 +236,6 @@
             }
             finally
             {
-                if (_endp.isOpen())
-                    fillInterested();
             }
         }
     }
diff --git a/jetty-io/src/test/java/org/eclipse/jetty/io/SelectorManagerTest.java b/jetty-io/src/test/java/org/eclipse/jetty/io/SelectorManagerTest.java
index d36ef49..66d39d3 100644
--- a/jetty-io/src/test/java/org/eclipse/jetty/io/SelectorManagerTest.java
+++ b/jetty-io/src/test/java/org/eclipse/jetty/io/SelectorManagerTest.java
@@ -120,7 +120,7 @@
             long timeout = connectTimeout * 2;
             timeoutConnection.set(timeout);
             final CountDownLatch latch1 = new CountDownLatch(1);
-            selectorManager.connect(client1, new Callback.Adapter()
+            selectorManager.connect(client1, new Callback()
             {
                 @Override
                 public void failed(Throwable x)
@@ -141,7 +141,7 @@
                 client2.connect(address);
                 timeoutConnection.set(0);
                 final CountDownLatch latch2 = new CountDownLatch(1);
-                selectorManager.connect(client2, new Callback.Adapter()
+                selectorManager.connect(client2, new Callback()
                 {
                     @Override
                     public void succeeded()
diff --git a/jetty-io/src/test/java/org/eclipse/jetty/io/SslConnectionTest.java b/jetty-io/src/test/java/org/eclipse/jetty/io/SslConnectionTest.java
index 24b3811..0ec33fb 100644
--- a/jetty-io/src/test/java/org/eclipse/jetty/io/SslConnectionTest.java
+++ b/jetty-io/src/test/java/org/eclipse/jetty/io/SslConnectionTest.java
@@ -35,7 +35,6 @@
 import javax.net.ssl.SSLEngine;
 import javax.net.ssl.SSLSocket;
 
-import org.eclipse.jetty.io.SelectorManager.ManagedSelector;
 import org.eclipse.jetty.io.ssl.SslConnection;
 import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
 import org.eclipse.jetty.util.BufferUtil;
@@ -170,7 +169,7 @@
 
         public TestConnection(EndPoint endp)
         {
-            super(endp, _threadPool,true);
+            super(endp, _threadPool);
         }
 
         @Override
@@ -277,7 +276,6 @@
         len=5;
         while(len>0)
             len-=client.getInputStream().read(buffer);
-        Assert.assertEquals(1, _dispatches.get());
 
         client.close();
     }
@@ -309,7 +307,7 @@
     public void testBlockedWrite() throws Exception
     {
         Socket client = newClient();
-        client.setSoTimeout(60000);
+        client.setSoTimeout(5000);
 
         SocketChannel server = _connector.accept();
         server.configureBlocking(false);
diff --git a/jetty-io/src/test/java/org/eclipse/jetty/io/WriteFlusherTest.java b/jetty-io/src/test/java/org/eclipse/jetty/io/WriteFlusherTest.java
index 3ec6d0e..fe01caa 100644
--- a/jetty-io/src/test/java/org/eclipse/jetty/io/WriteFlusherTest.java
+++ b/jetty-io/src/test/java/org/eclipse/jetty/io/WriteFlusherTest.java
@@ -77,7 +77,7 @@
         _flusher = new WriteFlusher(_endp)
         {
             @Override
-            protected void onIncompleteFlushed()
+            protected void onIncompleteFlush()
             {
                 _flushIncomplete.set(true);
             }
@@ -275,7 +275,7 @@
         }
 
         @Override
-        protected void onIncompleteFlushed()
+        protected void onIncompleteFlush()
         {
             _scheduler.schedule(this, 1 + _random.nextInt(9), TimeUnit.MILLISECONDS);
         }
@@ -368,7 +368,7 @@
             }
 
             @Override
-            protected void onIncompleteFlushed()
+            protected void onIncompleteFlush()
             {
             }
         };
@@ -469,7 +469,7 @@
         final WriteFlusher writeFlusher = new WriteFlusher(_endPointMock)
         {
             @Override
-            protected void onIncompleteFlushed()
+            protected void onIncompleteFlush()
             {
             }
         };
@@ -529,7 +529,7 @@
         final WriteFlusher writeFlusher = new WriteFlusher(new EndPointConcurrentAccessToIncompleteWriteAndOnFailMock(writeCalledLatch, failedCalledLatch))
         {
             @Override
-            protected void onIncompleteFlushed()
+            protected void onIncompleteFlush()
             {
                 onIncompleteFlushedCalledLatch.countDown();
                 try
@@ -622,7 +622,7 @@
         final WriteFlusher writeFlusher = new WriteFlusher(endp)
         {
             @Override
-            protected void onIncompleteFlushed()
+            protected void onIncompleteFlush()
             {
                 executor.submit(new Runnable() 
                 { 
diff --git a/jetty-io/src/test/resources/jetty-logging.properties b/jetty-io/src/test/resources/jetty-logging.properties
index d4922ad..257743e 100644
--- a/jetty-io/src/test/resources/jetty-logging.properties
+++ b/jetty-io/src/test/resources/jetty-logging.properties
@@ -1,2 +1,5 @@
 org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
 org.eclipse.jetty.LEVEL=INFO
+#org.eclipse.jetty.io.AbstractConnection.LEVEL=DEBUG
+#org.eclipse.jetty.io.ManagedSelector.LEVEL=DEBUG
+#org.eclipse.jetty.io.ssl.SslConnection.LEVEL=DEBUG
diff --git a/jetty-jaas/pom.xml b/jetty-jaas/pom.xml
index 9b796c1..9dfbb4f 100644
--- a/jetty-jaas/pom.xml
+++ b/jetty-jaas/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-jaas</artifactId>
@@ -13,52 +13,6 @@
   </properties>
   <build>
     <plugins>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-               <_versionpolicy> </_versionpolicy>
-               <Import-Package>javax.sql.*,javax.security.*,javax.naming.*,
-               javax.servlet.*;version="[2.6.0,3.2)",
-               *</Import-Package>
-              </instructions>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
       <!-- always include the sources to be able to prepare the eclipse-jetty-SDK feature
       with a snapshot. -->
       <plugin>
diff --git a/jetty-jaas/src/main/config/etc/jetty-jaas.xml b/jetty-jaas/src/main/config/etc/jetty-jaas.xml
index 9381d10..4e42594 100644
--- a/jetty-jaas/src/main/config/etc/jetty-jaas.xml
+++ b/jetty-jaas/src/main/config/etc/jetty-jaas.xml
@@ -1,9 +1,8 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
 
-
     <!-- ======================================================== -->
     <!-- java.security.auth.login.config System property          -->
     <!-- This is usually a runtime parameter to the jvm, but      -->
@@ -11,7 +10,7 @@
     <!-- ======================================================== -->
     <Call class="java.lang.System" name="setProperty">
       <Arg>java.security.auth.login.config</Arg>
-      <Arg><Property name="jetty.base" default="." />/<Property name="jaas.login.conf" default="etc/login.conf"/></Arg>
+      <Arg><Property name="jetty.base" default="." />/<Property name="jetty.jaas.login.conf" deprecated="jaas.login.conf" default="etc/login.conf"/></Arg>
     </Call>
 
 </Configure>
diff --git a/jetty-jaas/src/main/config/modules/jaas.mod b/jetty-jaas/src/main/config/modules/jaas.mod
index 4932140..fee3f59 100644
--- a/jetty-jaas/src/main/config/modules/jaas.mod
+++ b/jetty-jaas/src/main/config/modules/jaas.mod
@@ -12,5 +12,6 @@
 etc/jetty-jaas.xml
 
 [ini-template]
-## JAAS Configuration
-jaas.login.conf=etc/login.conf
+## The file location (relative to $jetty.base) for the
+## JAAS "java.security.auth.login.config" system property
+# jetty.jaas.login.conf=etc/login.conf
diff --git a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASGroup.java b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASGroup.java
index 94d09f2..46263c9 100644
--- a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASGroup.java
+++ b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASGroup.java
@@ -24,15 +24,12 @@
 import java.util.HashSet;
 import java.util.Iterator;
 
-
 public class JAASGroup implements Group 
 {
     public static final String ROLES = "__roles__";
     
     private String _name = null;
     private HashSet<Principal> _members = null;
-    
-    
    
     public JAASGroup(String n)
     {
@@ -41,42 +38,21 @@
     }
    
     /* ------------------------------------------------------------ */
-    /**
-     *
-     * @param principal <description>
-     * @return <description>
-     */
     public synchronized boolean addMember(Principal principal)
     {
         return _members.add(principal);
     }
 
-    /**
-     *
-     * @param principal <description>
-     * @return <description>
-     */
     public synchronized boolean removeMember(Principal principal)
     {
         return _members.remove(principal);
     }
 
-    /**
-     *
-     * @param principal <description>
-     * @return <description>
-     */
     public boolean isMember(Principal principal)
     {
         return _members.contains(principal);
     }
 
-
-    
-    /**
-     *
-     * @return <description>
-     */
     public Enumeration<? extends Principal> members()
     {
 
@@ -105,23 +81,11 @@
         return new MembersEnumeration (_members.iterator());
     }
 
-
-    /**
-     *
-     * @return <description>
-     */
     public int hashCode()
     {
         return getName().hashCode();
     }
 
-
-    
-    /**
-     *
-     * @param object <description>
-          * @return <description>
-     */
     public boolean equals(Object object)
     {
         if (! (object instanceof JAASGroup))
@@ -130,23 +94,14 @@
         return ((JAASGroup)object).getName().equals(getName());
     }
 
-    /**
-     *
-     * @return <description>
-     */
     public String toString()
     {
         return getName();
     }
 
-    /**
-     *
-     * @return <description>
-     */
     public String getName()
     {
         
         return _name;
     }
-
 }
diff --git a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASLoginService.java b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASLoginService.java
index b0d05d9..778d228 100644
--- a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASLoginService.java
+++ b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASLoginService.java
@@ -34,14 +34,13 @@
 import javax.security.auth.callback.UnsupportedCallbackException;
 import javax.security.auth.login.LoginContext;
 import javax.security.auth.login.LoginException;
+import javax.servlet.ServletRequest;
 
 import org.eclipse.jetty.jaas.callback.ObjectCallback;
 import org.eclipse.jetty.jaas.callback.RequestParameterCallback;
 import org.eclipse.jetty.security.DefaultIdentityService;
 import org.eclipse.jetty.security.IdentityService;
 import org.eclipse.jetty.security.LoginService;
-import org.eclipse.jetty.server.HttpChannel;
-import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.UserIdentity;
 import org.eclipse.jetty.util.Loader;
 import org.eclipse.jetty.util.component.AbstractLifeCycle;
@@ -49,9 +48,9 @@
 import org.eclipse.jetty.util.log.Logger;
 
 /* ---------------------------------------------------- */
-/** JAASLoginService
+/** 
+ * JAASLoginService
  *
- * @org.apache.xbean.XBean element="jaasUserRealm" description="Creates a UserRealm suitable for use with JAAS"
  */
 public class JAASLoginService extends AbstractLifeCycle implements LoginService
 {
@@ -181,7 +180,8 @@
     }
 
     /* ------------------------------------------------------------ */
-    public UserIdentity login(final String username,final Object credentials)
+    @Override
+    public UserIdentity login(final String username,final Object credentials, final ServletRequest request)
     {
         try
         {
@@ -210,17 +210,9 @@
                             }
                             else if (callback instanceof RequestParameterCallback)
                             {
-                                HttpChannel channel = HttpChannel.getCurrentHttpChannel();
-
-                                if (channel == null)
-                                    return;
-                                Request request = channel.getRequest();
-
-                                if (request != null)
-                                {
-                                    RequestParameterCallback rpc = (RequestParameterCallback)callback;
+                                RequestParameterCallback rpc = (RequestParameterCallback)callback;
+                                if (request!=null)
                                     rpc.setParameterValues(Arrays.asList(request.getParameterValues(rpc.getParameterName())));
-                                }
                             }
                             else
                                 throw new UnsupportedCallbackException(callback);
@@ -230,7 +222,7 @@
             }
             else
             {
-                Class clazz = Loader.loadClass(getClass(), _callbackHandlerClass);
+                Class<?> clazz = Loader.loadClass(getClass(), _callbackHandlerClass);
                 callbackHandler = (CallbackHandler)clazz.newInstance();
             }
             //set up the login context
diff --git a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASPrincipal.java b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASPrincipal.java
index 6b72097..2f4c806 100644
--- a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASPrincipal.java
+++ b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASPrincipal.java
@@ -21,41 +21,22 @@
 import java.io.Serializable;
 import java.security.Principal;
 
-
-
-/* ---------------------------------------------------- */
-/** JAASPrincipal
- * <p>Impl class of Principal interface.
- *
- * <p><h4>Notes</h4>
+/** 
+ * JAASPrincipal
  * <p>
- *
- * <p><h4>Usage</h4>
- * <pre>
- */
-/*
- * </pre>
- *
- * @see
- * @version 1.0 Tue Apr 15 2003
- * 
+ * Impl class of Principal interface.
  */
 public class JAASPrincipal implements Principal, Serializable
 {
-    /**
-     * 
-     */
     private static final long serialVersionUID = -5538962177019315479L;
     
     private String _name = null;
     
-    
     public JAASPrincipal(String userName)
     {
         this._name = userName;
     }
 
-
     public boolean equals (Object p)
     {
         if (! (p instanceof JAASPrincipal))
@@ -64,26 +45,20 @@
         return getName().equals(((JAASPrincipal)p).getName());
     }
 
-
     public int hashCode ()
     {
         return getName().hashCode();
     }
 
-
     public String getName ()
     {
         return this._name;
     }
 
-
     public String toString ()
     {
         return getName();
     }
-    
-
-    
 }
 
     
diff --git a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASRole.java b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASRole.java
index 1f8fbd4..e5054fa 100644
--- a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASRole.java
+++ b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASRole.java
@@ -18,13 +18,8 @@
 
 package org.eclipse.jetty.jaas;
 
-
 public class JAASRole extends JAASPrincipal
 {
-    
-    /**
-     * 
-     */
     private static final long serialVersionUID = 3465114254970134526L;
 
     public JAASRole(String name)
diff --git a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASUserPrincipal.java b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASUserPrincipal.java
index cbc72ca..9af2943 100644
--- a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASUserPrincipal.java
+++ b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/JAASUserPrincipal.java
@@ -23,15 +23,11 @@
 import javax.security.auth.Subject;
 import javax.security.auth.login.LoginContext;
 
-
-
-/* ---------------------------------------------------- */
-/** JAASUserPrincipal
- * <p>Implements the JAAS version of the
+/** 
+ * JAASUserPrincipal
+ * <p>
+ * Implements the JAAS version of the
  *  org.eclipse.jetty.http.UserPrincipal interface.
- *
- * @version $Id: JAASUserPrincipal.java 4780 2009-03-17 15:36:08Z jesse $
- *
  */
 public class JAASUserPrincipal implements Principal
 {
@@ -40,7 +36,6 @@
     private final LoginContext _loginContext;
 
     /* ------------------------------------------------ */
-
     public JAASUserPrincipal(String name, Subject subject, LoginContext loginContext)
     {
         this._name = name;
diff --git a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/RoleCheckPolicy.java b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/RoleCheckPolicy.java
index 7d96d9a..6588cdd 100644
--- a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/RoleCheckPolicy.java
+++ b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/RoleCheckPolicy.java
@@ -21,7 +21,6 @@
 import java.security.Principal;
 import java.security.acl.Group;
 
-
 public interface RoleCheckPolicy 
 {
     /* ------------------------------------------------ */
diff --git a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/StrictRoleCheckPolicy.java b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/StrictRoleCheckPolicy.java
index 5e2961a..6ca8653 100644
--- a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/StrictRoleCheckPolicy.java
+++ b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/StrictRoleCheckPolicy.java
@@ -31,7 +31,6 @@
  * 
  *
  * 
- * @org.apache.xbean.XBean description ="Check only topmost role in stack of roles for user"
  */
 public class StrictRoleCheckPolicy implements RoleCheckPolicy
 {
diff --git a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/callback/DefaultCallbackHandler.java b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/callback/DefaultCallbackHandler.java
index 7aa65fe..13bce13 100644
--- a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/callback/DefaultCallbackHandler.java
+++ b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/callback/DefaultCallbackHandler.java
@@ -29,28 +29,11 @@
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.util.security.Password;
 
-
-
-/* ---------------------------------------------------- */
-/** DefaultUsernameCredentialCallbackHandler
- * <p>
- *
- * <p><h4>Notes</h4>
- * <p>
- *
- * <p><h4>Usage</h4>
- * <pre>
- */
-/*
- * </pre>
- *
- * @see
- * @version 1.0 Tue Apr 15 2003
- *
+/** 
+ * DefaultUsernameCredentialCallbackHandler
  */
 public class DefaultCallbackHandler extends AbstractCallbackHandler
 {
-
     private Request _request;
 
     public void setRequest (Request request)
diff --git a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/callback/ObjectCallback.java b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/callback/ObjectCallback.java
index cb99be1..2b36aeb 100644
--- a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/callback/ObjectCallback.java
+++ b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/callback/ObjectCallback.java
@@ -20,31 +20,16 @@
 
 import javax.security.auth.callback.Callback;
 
-
-/* ---------------------------------------------------- */
-/** ObjectCallback
- *
- * <p>Can be used as a LoginModule Callback to
+/** 
+ * ObjectCallback
+ * <p>
+ * Can be used as a LoginModule Callback to
  * obtain a user's credential as an Object, rather than
  * a char[], to which some credentials may not be able
  * to be converted
- *
- * <p><h4>Notes</h4>
- * <p>
- *
- * <p><h4>Usage</h4>
- * <pre>
- */
-/*
- * </pre>
- *
- * @see
- * @version 1.0 Tue Apr 15 2003
- * 
  */
 public class ObjectCallback implements Callback
 {
-
     protected Object _object;
     
     public void setObject(Object o)
@@ -57,11 +42,8 @@
         return _object;
     }
 
-
     public void clearObject ()
     {
         _object = null;
     }
-    
-    
 }
diff --git a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/callback/RequestParameterCallback.java b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/callback/RequestParameterCallback.java
index 38f0c01..27fdc07 100644
--- a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/callback/RequestParameterCallback.java
+++ b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/callback/RequestParameterCallback.java
@@ -22,18 +22,12 @@
 
 import javax.security.auth.callback.Callback;
 
-
 /**
- *
  * RequestParameterCallback
- *
+ * <p>
  * Allows a JAAS callback handler to access any parameter from the j_security_check FORM.
  * This means that a LoginModule can access form fields other than the j_username and j_password
  * fields, and use it, for example, to authenticate a user.
- *
- *
- * @version $Revision: 4780 $ $Date: 2009-03-17 16:36:08 +0100 (Tue, 17 Mar 2009) $
- *
  */
 public class RequestParameterCallback implements Callback
 {
diff --git a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/AbstractDatabaseLoginModule.java b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/AbstractDatabaseLoginModule.java
index 0a5b49e..1a2e141 100644
--- a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/AbstractDatabaseLoginModule.java
+++ b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/AbstractDatabaseLoginModule.java
@@ -54,12 +54,9 @@
     private String dbUserRoleTableUserField;
     private String dbUserRoleTableRoleField;
 
-
-
-
     /**
      * @return a java.sql.Connection from the database
-     * @throws Exception
+     * @throws Exception if unable to get the connection
      */
     public abstract Connection getConnection () throws Exception;
 
@@ -68,7 +65,7 @@
     /* ------------------------------------------------ */
     /** Load info from database
      * @param userName user info to load
-     * @exception SQLException
+     * @exception Exception if unable to get the user info
      */
     public UserInfo getUserInfo (String userName)
         throws Exception
diff --git a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/AbstractLoginModule.java b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/AbstractLoginModule.java
index 5f6624d..67b2f54 100644
--- a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/AbstractLoginModule.java
+++ b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/AbstractLoginModule.java
@@ -44,7 +44,6 @@
  *
  * Abstract base class for all LoginModules. Subclasses should
  * just need to implement getUserInfo method.
- *
  */
 public abstract class AbstractLoginModule implements LoginModule
 {
@@ -109,8 +108,6 @@
         }
     }
 
-
-
     public Subject getSubject ()
     {
         return this.subject;
@@ -162,7 +159,7 @@
     }
     /**
      * @see javax.security.auth.spi.LoginModule#abort()
-     * @throws LoginException
+     * @throws LoginException if unable to abort
      */
     public boolean abort() throws LoginException
     {
@@ -173,7 +170,7 @@
     /**
      * @see javax.security.auth.spi.LoginModule#commit()
      * @return true if committed, false if not (likely not authenticated)
-     * @throws LoginException
+     * @throws LoginException if unable to commit
      */
     public boolean commit() throws LoginException
     {
@@ -215,7 +212,7 @@
     /**
      * @see javax.security.auth.spi.LoginModule#login()
      * @return true if is authenticated, false otherwise
-     * @throws LoginException
+     * @throws LoginException if unable to login
      */
     public boolean login() throws LoginException
     {
@@ -278,7 +275,7 @@
     /**
      * @see javax.security.auth.spi.LoginModule#logout()
      * @return true always
-     * @throws LoginException
+     * @throws LoginException if unable to logout
      */
     public boolean logout() throws LoginException
     {
@@ -288,10 +285,10 @@
 
     /**
      * @see javax.security.auth.spi.LoginModule#initialize(javax.security.auth.Subject, javax.security.auth.callback.CallbackHandler, java.util.Map, java.util.Map)
-     * @param subject
-     * @param callbackHandler
-     * @param sharedState
-     * @param options
+     * @param subject the subject
+     * @param callbackHandler the callback handler
+     * @param sharedState the shared state map
+     * @param options the option map
      */
     public void initialize(Subject subject, CallbackHandler callbackHandler,
             Map<String,?> sharedState, Map<String,?> options)
diff --git a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/DataSourceLoginModule.java b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/DataSourceLoginModule.java
index 5035b38..27a7cfb 100644
--- a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/DataSourceLoginModule.java
+++ b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/DataSourceLoginModule.java
@@ -42,12 +42,15 @@
     private DataSource dataSource;
 
     /* ------------------------------------------------ */
-    /** Init LoginModule.
+    /** 
+     * Init LoginModule.
+     * <p>
      * Called once by JAAS after new instance created.
-     * @param subject
-     * @param callbackHandler
-     * @param sharedState
-     * @param options
+     * 
+     * @param subject the subject
+     * @param callbackHandler the callback handler
+     * @param sharedState the shared state map
+     * @param options the option map
      */
     public void initialize(Subject subject,
                            CallbackHandler callbackHandler,
@@ -70,21 +73,15 @@
         }
     }
 
-
     /**
      * Get a connection from the DataSource
      * @see AbstractDatabaseLoginModule#getConnection()
      * @return the connection for the datasource
-     * @throws Exception
+     * @throws Exception if unable to get the connection
      */
     public Connection getConnection ()
     throws Exception
     {
         return dataSource.getConnection();
     }
-
-
-
-
-
 }
diff --git a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/JDBCLoginModule.java b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/JDBCLoginModule.java
index 6a0c106..86ca234 100644
--- a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/JDBCLoginModule.java
+++ b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/JDBCLoginModule.java
@@ -29,22 +29,14 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
-
-
-/* ---------------------------------------------------- */
-/** JDBCLoginModule
- * <p>JAAS LoginModule to retrieve user information from
- *  a database and authenticate the user.
- *
- * <p><h4>Notes</h4>
+/** 
+ * JDBCLoginModule
+ * <p>
+ * JAAS LoginModule to retrieve user information from
+ * a database and authenticate the user.
+ * <h1>Notes</h1>
  * <p>This version uses plain old JDBC connections NOT
  * Datasources.
- *
- * <p><h4>Usage</h4>
- * <pre>
- * </pre>
- *
- * @version 1.0 Tue Apr 15 2003
  */
 public class JDBCLoginModule extends AbstractDatabaseLoginModule
 {
@@ -55,12 +47,11 @@
     private String dbUserName;
     private String dbPassword;
 
-
     /**
      * Get a connection from the DriverManager
      * @see AbstractDatabaseLoginModule#getConnection()
      * @return the connection for this datasource
-     * @throws Exception
+     * @throws Exception if unable to get the connection
      */
     public Connection getConnection ()
     throws Exception
@@ -80,12 +71,15 @@
 
 
     /* ------------------------------------------------ */
-    /** Init LoginModule.
+    /** 
+     * Init LoginModule.
+     * <p>
      * Called once by JAAS after new instance created.
-     * @param subject
-     * @param callbackHandler
-     * @param sharedState
-     * @param options
+     * 
+     * @param subject the subject
+     * @param callbackHandler the callback handler
+     * @param sharedState the shared state map
+     * @param options the options map
      */
     public void initialize(Subject subject,
                            CallbackHandler callbackHandler,
diff --git a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/LdapLoginModule.java b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/LdapLoginModule.java
index d297520..c66ff43 100644
--- a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/LdapLoginModule.java
+++ b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/LdapLoginModule.java
@@ -49,15 +49,12 @@
 
 /**
  * A LdapLoginModule for use with JAAS setups
- * <p/>
+ * <p>
  * The jvm should be started with the following parameter:
- * <br><br>
- * <code>
+ * <pre>
  * -Djava.security.auth.login.config=etc/ldap-loginModule.conf
- * </code>
- * <br><br>
+ * </pre>
  * and an example of the ldap-loginModule.conf would be:
- * <br><br>
  * <pre>
  * ldaploginmodule {
  *    org.eclipse.jetty.server.server.plus.jaas.spi.LdapLoginModule required
@@ -80,11 +77,7 @@
  *    roleMemberAttribute="uniqueMember"
  *    roleObjectClass="groupOfUniqueNames";
  *    };
- *  </pre>
- *
- *
- *
- *
+ * </pre>
  */
 public class LdapLoginModule extends AbstractLoginModule
 {
@@ -137,7 +130,7 @@
 
     /**
      * name of the attribute that a users password is stored under
-     * <p/>
+     * <p>
      * NOTE: not always accessible, see force binding login
      */
     private String _userPasswordAttribute = "userPassword";
@@ -185,15 +178,15 @@
 
     /**
      * get the available information about the user
-     * <p/>
+     * <p>
      * for this LoginModule, the credential can be null which will result in a
      * binding ldap authentication scenario
-     * <p/>
+     * <p>
      * roles are also an optional concept if required
      *
-     * @param username
+     * @param username the user name
      * @return the userinfo for the username
-     * @throws Exception
+     * @throws Exception if unable to get the user info
      */
     public UserInfo getUserInfo(String username) throws Exception
     {
@@ -244,7 +237,7 @@
 
     /**
      * attempts to get the users credentials from the users context
-     * <p/>
+     * <p>
      * NOTE: this is not an user authenticated operation
      *
      * @param username
@@ -307,7 +300,7 @@
 
     /**
      * attempts to get the users roles from the root context
-     * <p/>
+     * <p>
      * NOTE: this is not an user authenticated operation
      *
      * @param dirContext
@@ -373,13 +366,13 @@
 
     /**
      * since ldap uses a context bind for valid authentication checking, we override login()
-     * <p/>
+     * <p>
      * if credentials are not available from the users context or if we are forcing the binding check
      * then we try a binding authentication check, otherwise if we have the users encoded password then
      * we can try authentication via that mechanic
      *
      * @return true if authenticated, false otherwise
-     * @throws LoginException
+     * @throws LoginException if unable to login
      */
     public boolean login() throws LoginException
     {
@@ -450,9 +443,9 @@
     /**
      * password supplied authentication check
      *
-     * @param webCredential
+     * @param webCredential the web credential
      * @return true if authenticated
-     * @throws LoginException
+     * @throws LoginException if unable to login
      */
     protected boolean credentialLogin(Object webCredential) throws LoginException
     {
@@ -466,10 +459,11 @@
      * has an ACI (access control instruction) that allow the access to any user or at least
      * for the user that logs in.
      *
-     * @param username
-     * @param password
+     * @param username the user name
+     * @param password the password
      * @return true always
-     * @throws LoginException
+     * @throws LoginException if unable to bind the login
+     * @throws NamingException if failure to bind login
      */
     public boolean bindingLogin(String username, Object password) throws LoginException, NamingException
     {
@@ -524,12 +518,13 @@
 
     /**
      * Init LoginModule.
+     * <p>
      * Called once by JAAS after new instance is created.
      *
-     * @param subject
-     * @param callbackHandler
-     * @param sharedState
-     * @param options
+     * @param subject the subect
+     * @param callbackHandler the callback handler
+     * @param sharedState the shared state map
+     * @param options the option map
      */
     public void initialize(Subject subject,
                            CallbackHandler callbackHandler,
diff --git a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/PropertyFileLoginModule.java b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/PropertyFileLoginModule.java
index 828c75c..097d943 100644
--- a/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/PropertyFileLoginModule.java
+++ b/jetty-jaas/src/main/java/org/eclipse/jetty/jaas/spi/PropertyFileLoginModule.java
@@ -36,8 +36,6 @@
 
 /**
  * PropertyFileLoginModule
- *
- *
  */
 public class PropertyFileLoginModule extends AbstractLoginModule
 {
@@ -55,10 +53,11 @@
      *
      * @see javax.security.auth.spi.LoginModule#initialize(javax.security.auth.Subject, javax.security.auth.callback.CallbackHandler, java.util.Map,
      *      java.util.Map)
-     * @param subject
-     * @param callbackHandler
-     * @param sharedState
-     * @param options
+     *      
+     * @param subject the subject
+     * @param callbackHandler the callback handler
+     * @param sharedState the shared state map
+     * @param options the options map
      */
     public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options)
     {
@@ -104,8 +103,8 @@
     /**
      * Don't implement this as we want to pre-fetch all of the users.
      *
-     * @param userName
-     * @throws Exception
+     * @param userName the user name
+     * @throws Exception if unable to get the user information
      */
     public UserInfo getUserInfo(String userName) throws Exception
     {
diff --git a/jetty-jaspi/pom.xml b/jetty-jaspi/pom.xml
index b7970bf..41dfb14 100644
--- a/jetty-jaspi/pom.xml
+++ b/jetty-jaspi/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-jaspi</artifactId>
@@ -10,57 +10,10 @@
   <description>Jetty security infrastructure</description>
   <url>http://www.eclipse.org/jetty</url>
   <properties>
-    <bundle-symbolic-name>${project.groupId}.jaspi</bundle-symbolic-name>
+    <bundle-symbolic-name>${project.groupId}.security.jaspi</bundle-symbolic-name>
   </properties>
   <build>
     <plugins>
-     <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-                <Import-Package>javax.servlet.*;version="[2.6.0,3.2)",*</Import-Package>
-                <Export-Package>org.eclipse.jetty.security.jaspi.*;version="${parsedVersion.osgiVersion}"</Export-Package>
-              </instructions>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <!--
-        Required for OSGI
-        -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>               
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
diff --git a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/JaspiAuthenticator.java b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/JaspiAuthenticator.java
index 682a1df..99fc95d 100644
--- a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/JaspiAuthenticator.java
+++ b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/JaspiAuthenticator.java
@@ -121,7 +121,7 @@
     @Override
     public UserIdentity login(String username, Object password, ServletRequest request)
     { 
-        UserIdentity user = _loginService.login(username, password);
+        UserIdentity user = _loginService.login(username, password, request);
         if (user != null)
         {
             renewSession((HttpServletRequest)request, null);
diff --git a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/JaspiAuthenticatorFactory.java b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/JaspiAuthenticatorFactory.java
index 0e35e99..9cb280b 100644
--- a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/JaspiAuthenticatorFactory.java
+++ b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/JaspiAuthenticatorFactory.java
@@ -135,6 +135,8 @@
      * If {@link #setServiceSubject(Subject)} has not been used to 
      * set a subject, then the {@link Server#getBeans(Class)} method is
      * used to look for a Subject.
+     * @param server the server to pull the Subject from
+     * @return the subject
      */
     protected Subject findServiceSubject(Server server)
     {
@@ -151,6 +153,9 @@
      * If {@link #setServerName(String)} has not been called, then
      * use the name of the a principal in the service subject.
      * If not found, return "server".
+     * @param server not used
+     * @param subject the subject to use
+     * @return the server name from the subject (or default value if not found in subject or principals)
      */
     protected String findServerName(Server server, Subject subject)
     {
diff --git a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/JaspiMessageInfo.java b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/JaspiMessageInfo.java
index e0ae5b1..43f6d8b 100644
--- a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/JaspiMessageInfo.java
+++ b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/JaspiMessageInfo.java
@@ -27,11 +27,8 @@
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 
-
 /**
  * Almost an implementation of jaspi MessageInfo.
- *
- * @version $Rev: 4660 $ $Date: 2009-02-25 17:29:53 +0100 (Wed, 25 Feb 2009) $
  */
 public class JaspiMessageInfo implements MessageInfo
 {
diff --git a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/ServletCallbackHandler.java b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/ServletCallbackHandler.java
index ea4136d..fa07964 100644
--- a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/ServletCallbackHandler.java
+++ b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/ServletCallbackHandler.java
@@ -39,10 +39,7 @@
 import org.eclipse.jetty.server.UserIdentity;
 
 /**
- * 
  * Idiot class required by jaspi stupidity
- * 
- * @version $Rev: 4793 $ $Date: 2009-03-19 00:00:01 +0100 (Thu, 19 Mar 2009) $
  */
 public class ServletCallbackHandler implements CallbackHandler
 {
@@ -74,7 +71,7 @@
                 PasswordValidationCallback passwordValidationCallback = (PasswordValidationCallback) callback;
                 Subject subject = passwordValidationCallback.getSubject();
 
-                UserIdentity user = _loginService.login(passwordValidationCallback.getUsername(),passwordValidationCallback.getPassword());
+                UserIdentity user = _loginService.login(passwordValidationCallback.getUsername(),passwordValidationCallback.getPassword(), null);
                 
                 if (user!=null)
                 {
@@ -91,7 +88,7 @@
                         credentialValidationCallback.getUsername(),
                         credentialValidationCallback.getCredential());
 
-                UserIdentity user = _loginService.login(credentialValidationCallback.getUsername(),credentialValidationCallback.getCredential());
+                UserIdentity user = _loginService.login(credentialValidationCallback.getUsername(),credentialValidationCallback.getCredential(), null);
 
                 if (user!=null)
                 {
diff --git a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/SimpleAuthConfig.java b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/SimpleAuthConfig.java
index 49b1f6d..864a3e0 100644
--- a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/SimpleAuthConfig.java
+++ b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/SimpleAuthConfig.java
@@ -26,9 +26,6 @@
 import javax.security.auth.message.config.ServerAuthConfig;
 import javax.security.auth.message.config.ServerAuthContext;
 
-/**
- * @version $Rev: 4660 $ $Date: 2009-02-25 17:29:53 +0100 (Wed, 25 Feb 2009) $
- */
 public class SimpleAuthConfig implements ServerAuthConfig
 {
     public static final String HTTP_SERVLET = "HttpServlet";
diff --git a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/BaseAuthModule.java b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/BaseAuthModule.java
index 3de4e33..f223d5a 100644
--- a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/BaseAuthModule.java
+++ b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/BaseAuthModule.java
@@ -45,9 +45,6 @@
 import org.eclipse.jetty.util.security.Credential;
 import org.eclipse.jetty.util.security.Password;
 
-/**
- * @version $Rev: 4792 $ $Date: 2009-03-18 22:55:52 +0100 (Wed, 18 Mar 2009) $
- */
 public class BaseAuthModule implements ServerAuthModule, ServerAuthContext
 {
     private static final Class[] SUPPORTED_MESSAGE_TYPES = new Class[] { HttpServletRequest.class, HttpServletResponse.class };
diff --git a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/BasicAuthModule.java b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/BasicAuthModule.java
index 4821833..dbe28c3 100644
--- a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/BasicAuthModule.java
+++ b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/BasicAuthModule.java
@@ -36,10 +36,7 @@
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.security.Constraint;
 
-/**
- * @deprecated use *ServerAuthentication
- * @version $Rev: 4660 $ $Date: 2009-02-25 17:29:53 +0100 (Wed, 25 Feb 2009) $
- */
+@Deprecated
 public class BasicAuthModule extends BaseAuthModule
 {
     private static final Logger LOG = Log.getLogger(BasicAuthModule.class);
diff --git a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/ClientCertAuthModule.java b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/ClientCertAuthModule.java
index 94dc89c..f046d0c 100644
--- a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/ClientCertAuthModule.java
+++ b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/ClientCertAuthModule.java
@@ -34,10 +34,7 @@
 import org.eclipse.jetty.util.security.Constraint;
 import org.eclipse.jetty.util.security.Password;
 
-/**
- * @deprecated use *ServerAuthentication
- * @version $Rev: 4530 $ $Date: 2009-02-13 00:47:44 +0100 (Fri, 13 Feb 2009) $
- */
+@Deprecated
 public class ClientCertAuthModule extends BaseAuthModule
 {
 
diff --git a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/DigestAuthModule.java b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/DigestAuthModule.java
index 800cbc9..b3b1229 100644
--- a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/DigestAuthModule.java
+++ b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/DigestAuthModule.java
@@ -42,15 +42,11 @@
 import org.eclipse.jetty.util.security.Constraint;
 import org.eclipse.jetty.util.security.Credential;
 
-/**
- * @deprecated use *ServerAuthentication
- * @version $Rev: 4627 $ $Date: 2009-02-20 00:07:19 +0100 (Fri, 20 Feb 2009) $
- */
+@Deprecated
 public class DigestAuthModule extends BaseAuthModule
 {
     private static final Logger LOG = Log.getLogger(DigestAuthModule.class);
 
-
     protected long maxNonceAge = 0;
 
     protected long nonceSecret = this.hashCode() ^ System.currentTimeMillis();
@@ -213,11 +209,10 @@
     }
 
     /**
-     * @param nonce
+     * @param nonce the nonce
      * @param timestamp should be timestamp of request.
      * @return -1 for a bad nonce, 0 for a stale none, 1 for a good nonce
      */
-    /* ------------------------------------------------------------ */
     public int checkNonce(String nonce, long timestamp)
     {
         try
diff --git a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/FormAuthModule.java b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/FormAuthModule.java
index 7b35848..4c5678c 100644
--- a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/FormAuthModule.java
+++ b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/FormAuthModule.java
@@ -33,7 +33,6 @@
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
-import org.eclipse.jetty.security.CrossContextPsuedoSession;
 import org.eclipse.jetty.security.authentication.DeferredAuthentication;
 import org.eclipse.jetty.security.authentication.LoginCallbackImpl;
 import org.eclipse.jetty.security.authentication.SessionAuthentication;
@@ -45,10 +44,7 @@
 import org.eclipse.jetty.util.security.Constraint;
 import org.eclipse.jetty.util.security.Password;
 
-/**
- * @deprecated use *ServerAuthentication
- * @version $Rev: 4792 $ $Date: 2009-03-18 22:55:52 +0100 (Wed, 18 Mar 2009) $
- */
+@Deprecated
 public class FormAuthModule extends BaseAuthModule
 {
     private static final Logger LOG = Log.getLogger(FormAuthModule.class);
@@ -79,7 +75,6 @@
 
     private String _formLoginPath;
 
-    private CrossContextPsuedoSession<UserInfo> ssoSource;
 
     public FormAuthModule()
     {
@@ -92,17 +87,6 @@
         setErrorPage(errorPage);
     }
 
-    /**
-     * @deprecated
-     */
-    public FormAuthModule(CallbackHandler callbackHandler, CrossContextPsuedoSession<UserInfo> ssoSource, 
-                          String loginPage, String errorPage)
-    {
-        super(callbackHandler);
-        this.ssoSource = ssoSource;
-        setLoginPage(loginPage);
-        setErrorPage(errorPage);
-    }
 
     @Override
     public void initialize(MessagePolicy requestPolicy, MessagePolicy responsePolicy, 
@@ -112,7 +96,6 @@
         super.initialize(requestPolicy, responsePolicy, handler, options);
         setLoginPage((String) options.get(LOGIN_PAGE_KEY));
         setErrorPage((String) options.get(ERROR_PAGE_KEY));
-        ssoSource = (CrossContextPsuedoSession<UserInfo>) options.get(SSO_SOURCE_KEY);
     }
 
     private void setLoginPage(String path)
@@ -232,17 +215,7 @@
 
                 return AuthStatus.SUCCESS;  
             }
-            else if (ssoSource != null)
-            {
-                UserInfo userInfo = ssoSource.fetch(request);
-                if (userInfo != null)
-                {
-                    boolean success = tryLogin(messageInfo, clientSubject, response, session, userInfo.getUserName(), new Password(new String(userInfo.getPassword())));
-                    if (success) { return AuthStatus.SUCCESS; }
-                }
-            }
             
-           
 
             // if we can't send challenge
             if (DeferredAuthentication.isDeferred(response))
@@ -311,12 +284,6 @@
                 }
             }
 
-            // Sign-on to SSO mechanism
-            if (ssoSource != null)
-            {
-                UserInfo userInfo = new UserInfo(username, pwdChars);
-                ssoSource.store(userInfo, response);
-            }
             return true;
         }
         return false;
diff --git a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/UserInfo.java b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/UserInfo.java
index 3cbdf96..de555d3 100644
--- a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/UserInfo.java
+++ b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/modules/UserInfo.java
@@ -20,9 +20,6 @@
 
 import java.util.Arrays;
 
-/**
- * @version $Rev: 4466 $ $Date: 2009-02-10 23:42:54 +0100 (Tue, 10 Feb 2009) $
- */
 public class UserInfo
 {
     private final String userName;
diff --git a/jetty-jmx/pom.xml b/jetty-jmx/pom.xml
index ae20e5e..1d043c1 100644
--- a/jetty-jmx/pom.xml
+++ b/jetty-jmx/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-jmx</artifactId>
@@ -15,52 +15,6 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-                <Import-Package>javax.management.*,*</Import-Package>
-              </instructions>
-            </configuration>
-           </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <!--
-        Required for OSGI
-        -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
         <configuration>
diff --git a/jetty-jmx/src/main/config/etc/jetty-jmx-remote.xml b/jetty-jmx/src/main/config/etc/jetty-jmx-remote.xml
index 3527d8b..bd6cbc6 100644
--- a/jetty-jmx/src/main/config/etc/jetty-jmx-remote.xml
+++ b/jetty-jmx/src/main/config/etc/jetty-jmx-remote.xml
@@ -1,28 +1,39 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
+  <!-- =========================================================== -->
+  <!-- Set the java.rmi.server.hostname property in case you've    -->
+  <!-- got a misconfigured /etc/hosts entry or the like.           -->
+  <!-- =========================================================== -->
+  <!--
+  <Call class="java.lang.System" name="setProperty">
+    <Arg>java.rmi.server.hostname</Arg>
+    <Arg>127.0.0.1</Arg>
+  </Call>
+  -->
+
   <!-- Add a remote JMX connector. The parameters of the constructor
-       below specify the JMX service URL, and the object name string for the
-       connector server bean. The parameters of the JMXServiceURL constructor
-       specify the protocol that clients will use to connect to the remote JMX
-       connector (RMI), the hostname of the server (local hostname), port number
-       (automatically assigned), and the URL path. Note that URL path contains
-       the RMI registry hostname and port number, that may need to be modified
-       in order to comply with the firewall requirements.
+  below specify the JMX service URL, and the object name string for the
+  connector server bean. The parameters of the JMXServiceURL constructor
+  specify the protocol that clients will use to connect to the remote JMX
+  connector (RMI), the hostname of the server (local hostname), port number
+  (automatically assigned), and the URL path. Note that URL path contains
+  the RMI registry hostname and port number, that may need to be modified
+  in order to comply with the firewall requirements.
   -->
   <Call name="addBean">
     <Arg>
       <New id="ConnectorServer" class="org.eclipse.jetty.jmx.ConnectorServer">
-	<Arg>
-	  <New class="javax.management.remote.JMXServiceURL">
-	    <Arg type="java.lang.String">rmi</Arg>
-	    <Arg type="java.lang.String" />
-	    <Arg type="java.lang.Integer"><Property name="jetty.jmxrmiport" default="1099"/></Arg>
-	    <Arg type="java.lang.String">/jndi/rmi://<Property name="jetty.jmxrmihost" default="localhost"/>:<Property name="jetty.jmxrmiport" default="1099"/>/jmxrmi</Arg>
-	  </New>
-	</Arg>
-	<Arg>org.eclipse.jetty.jmx:name=rmiconnectorserver</Arg>
+        <Arg>
+          <New class="javax.management.remote.JMXServiceURL">
+            <Arg type="java.lang.String">rmi</Arg>
+            <Arg type="java.lang.String"><Property name="jetty.jmxremote.rmihost" deprecated="jetty.jmxrmihost" default="localhost"/></Arg>
+            <Arg type="java.lang.Integer"><Property name="jetty.jmxremote.rmiport" deprecated="jetty.jmxrmiport" default="1099"/></Arg>
+            <Arg type="java.lang.String">/jndi/rmi://<Property name="jetty.jmxremote.rmihost" deprecated="jetty.jmxrmihost" default="localhost"/>:<Property name="jetty.jmxremote.rmiport" deprecated="jetty.jmxrmiport" default="1099"/>/jmxrmi</Arg>
+          </New>
+        </Arg>
+        <Arg>org.eclipse.jetty.jmx:name=rmiconnectorserver</Arg>
       </New>
     </Arg>
   </Call>
diff --git a/jetty-jmx/src/main/config/etc/jetty-jmx.xml b/jetty-jmx/src/main/config/etc/jetty-jmx.xml
index aca96f7..e07ea74 100644
--- a/jetty-jmx/src/main/config/etc/jetty-jmx.xml
+++ b/jetty-jmx/src/main/config/etc/jetty-jmx.xml
@@ -1,20 +1,9 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
 
   <!-- =========================================================== -->
-  <!-- Set the java.rmi.server.hostname property in case you've    -->
-  <!-- got a misconfigured /etc/hosts entry or the like.           -->
-  <!-- =========================================================== -->
-  <!--
-  <Call class="java.lang.System" name="setProperty">
-    <Arg>java.rmi.server.hostname</Arg>
-    <Arg>127.0.0.1</Arg>
-  </Call>
-  -->
-
-  <!-- =========================================================== -->
   <!-- Get the platform mbean server                               -->
   <!-- =========================================================== -->
   <Call id="MBeanServer" class="java.lang.management.ManagementFactory"
diff --git a/jetty-jmx/src/main/config/modules/jmx-remote.mod b/jetty-jmx/src/main/config/modules/jmx-remote.mod
index b6be74a..f8a5111 100644
--- a/jetty-jmx/src/main/config/modules/jmx-remote.mod
+++ b/jetty-jmx/src/main/config/modules/jmx-remote.mod
@@ -9,10 +9,8 @@
 etc/jetty-jmx-remote.xml
 
 [ini-template]
-## JMX Configuration
-## Enable for an open port accessible by remote machines
-# jetty.jmxrmihost=localhost
-# jetty.jmxrmiport=1099
-## Strictly speaking you shouldn't need --exec to use this in most environments.
-## If this isn't working, make sure you enable --exec as well
-# -Dcom.sun.management.jmxremote
+## The host/address to bind RMI to
+# jetty.jmxremote.rmihost=localhost
+
+## The port RMI listens to
+# jetty.jmxremote.rmiport=1099
diff --git a/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ConnectorServer.java b/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ConnectorServer.java
index 9257478..303641b 100644
--- a/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ConnectorServer.java
+++ b/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ConnectorServer.java
@@ -57,7 +57,7 @@
      * The actual address of the new connector server, as returned
      * by its getAddress method, will not necessarily be exactly the same.
      * @param name object name string to be assigned to connector server bean
-     * @throws Exception
+     * @throws Exception if unable to setup connector server
      */
     public ConnectorServer(JMXServiceURL serviceURL, String name)
         throws Exception
@@ -77,7 +77,7 @@
      * be Strings. The appropriate type of each associated value depends on
      * the attribute. The contents of environment are not changed by this call.
      * @param name object name string to be assigned to connector server bean
-     * @throws Exception
+     * @throws Exception if unable to create connector server
      */
     public ConnectorServer(JMXServiceURL svcUrl, Map<String,?> environment, String name)
          throws Exception
diff --git a/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ObjectMBean.java b/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ObjectMBean.java
index 376ab56..33a3a59 100644
--- a/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ObjectMBean.java
+++ b/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/ObjectMBean.java
@@ -59,18 +59,18 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
-/* ------------------------------------------------------------ */
-/** ObjectMBean.
+/** 
+ * ObjectMBean.
+ * <p>
  * A dynamic MBean that can wrap an arbitary Object instance.
  * the attributes and methods exposed by this bean are controlled by
  * the merge of property bundles discovered by names related to all
  * superclasses and all superinterfaces.
- *
+ * <p>
  * Attributes and methods exported may be "Object" and must exist on the
  * wrapped object, or "MBean" and must exist on a subclass of OBjectMBean
  * or "MObject" which exists on the wrapped object, but whose values are
  * converted to MBean object names.
- *
  */
 public class ObjectMBean implements DynamicMBean
 {
@@ -592,7 +592,7 @@
      * getter and setter methods. Descriptions are obtained with a call to findDescription with the
      * attribute name.
      *
-     * @param method
+     * @param method the method to define
      * @param attributeAnnotation "description" or "access:description" or "type:access:description"  where type is
      * one of: <ul>
      * <li>"Object" The field/method is on the managed object.
@@ -601,6 +601,7 @@
      * <li>"MMBean" The field/method is on the mbean proxy object and value should be converted to MBean reference
      * </ul>
      * the access is either "RW" or "RO".
+     * @return the mbean attribute info for the method
      */
     public MBeanAttributeInfo defineAttribute(Method method, ManagedAttribute attributeAnnotation)
     {
diff --git a/jetty-jndi/pom.xml b/jetty-jndi/pom.xml
index 79910d7..3c54d98 100644
--- a/jetty-jndi/pom.xml
+++ b/jetty-jndi/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-jndi</artifactId>
@@ -15,52 +15,6 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-                <Import-Package>javax.naming.*,*</Import-Package>
-              </instructions>
-            </configuration>
-           </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <!--
-        Required for OSGI
-        -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
         <configuration>
diff --git a/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/BindingEnumeration.java b/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/BindingEnumeration.java
index 4d56ee1..5c78275 100644
--- a/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/BindingEnumeration.java
+++ b/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/BindingEnumeration.java
@@ -25,14 +25,8 @@
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
 
-/** BindingEnumeration
- * <p>Implementation of NamingEnumeration
- *
- * <p><h4>Notes</h4>
- * <p>Used to return results of Context.listBindings();
- *
- * <p><h4>Usage</h4>
- *
+/** 
+ * BindingEnumeration
  */
 public class BindingEnumeration implements NamingEnumeration<Binding>
 {
diff --git a/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/ContextFactory.java b/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/ContextFactory.java
index 8be866c..aa4e9d6 100644
--- a/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/ContextFactory.java
+++ b/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/ContextFactory.java
@@ -37,30 +37,25 @@
 
 
 /**
- * ContextFactory.java
- *
+ * ContextFactory
+ * <p>
  * This is an object factory that produces a jndi naming
  * context based on a classloader.
- *
- *  It is used for the java:comp context.
- *
- *  This object factory is bound at java:comp. When a
- *  lookup arrives for java:comp,  this object factory
- *  is invoked and will return a context specific to
- *  the caller's environment (so producing the java:comp/env
- *  specific to a webapp).
- *
- *  The context selected is based on classloaders. First
- *  we try looking at the thread context classloader if it is set, and walk its
- *  hierarchy, creating a context if none is found. If the thread context classloader
- *  is not set, then we use the classloader associated with the current Context.
- *  
- *  If there is no current context, or no classloader, we return null.
- *
- * Created: Fri Jun 27 09:26:40 2003
- *
- *
- *
+ * <p>
+ * It is used for the <code>java:comp</code> context.
+ * <p>
+ * This object factory is bound at <code>java:comp</code>. When a
+ * lookup arrives for java:comp,  this object factory
+ * is invoked and will return a context specific to
+ * the caller's environment (so producing the <code>java:comp/env</code>
+ * specific to a webapp).
+ * <p>
+ * The context selected is based on classloaders. First
+ * we try looking at the thread context classloader if it is set, and walk its
+ * hierarchy, creating a context if none is found. If the thread context classloader
+ * is not set, then we use the classloader associated with the current Context.
+ * <p> 
+ * If there is no current context, or no classloader, we return null.
  */
 public class ContextFactory implements ObjectFactory
 {
@@ -87,15 +82,15 @@
 
     /**
      * Find or create a context which pertains to a classloader.
-     *
+     * <p>
      * If the thread context classloader is set, we try to find an already-created naming context
      * for it. If one does not exist, we walk its classloader hierarchy until one is found, or we 
      * run out of parent classloaders. In the latter case, we will create a new naming context associated
      * with the original thread context classloader.
-     * 
+     * <p>
      * If the thread context classloader is not set, we obtain the classloader from the current 
      * jetty Context, and look for an already-created naming context. 
-     * 
+     * <p>
      * If there is no current jetty Context, or it has no associated classloader, we 
      * return null.
      * @see javax.naming.spi.ObjectFactory#getObjectInstance(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable)
@@ -177,12 +172,13 @@
 
     /**
      * Create a new NamingContext.
-     * @param obj
-     * @param loader
-     * @param env
-     * @param name
-     * @param parentCtx
-     * @throws Exception
+     * @param obj the object to create
+     * @param loader the classloader for the naming context
+     * @param env the jndi env for the entry
+     * @param name the name of the entry
+     * @param parentCtx the parent context of the entry
+     * @return the newly created naming context
+     * @throws Exception if unable to create a new naming context
      */
     public NamingContext newNamingContext(Object obj, ClassLoader loader, Hashtable env, Name name, Context parentCtx)
     throws Exception
@@ -201,7 +197,8 @@
   
     /**
      * Find the naming Context for the given classloader
-     * @param loader
+     * @param loader the classloader for the context
+     * @return the context for the classloader
      */
     public Context getContextForClassLoader(ClassLoader loader)
     {
diff --git a/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/DataSourceCloser.java b/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/DataSourceCloser.java
index e50aa9d..8d2af86 100644
--- a/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/DataSourceCloser.java
+++ b/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/DataSourceCloser.java
@@ -24,6 +24,7 @@
 
 import javax.sql.DataSource;
 
+import org.eclipse.jetty.util.component.ContainerLifeCycle;
 import org.eclipse.jetty.util.component.Destroyable;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
diff --git a/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/NameEnumeration.java b/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/NameEnumeration.java
index 424ddaf..df5e377 100644
--- a/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/NameEnumeration.java
+++ b/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/NameEnumeration.java
@@ -25,14 +25,8 @@
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
 
-/** NameEnumeration
- * <p>Implementation of NamingEnumeration interface.
- *
- * <p><h4>Notes</h4>
- * <p>Used for returning results of Context.list();
- *
- * <p><h4>Usage</h4>
- *
+/** 
+ * NameEnumeration
  */
 public class NameEnumeration implements NamingEnumeration<NameClassPair>
 {
diff --git a/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/NamingContext.java b/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/NamingContext.java
index 980d89f..f96d06c 100644
--- a/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/NamingContext.java
+++ b/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/NamingContext.java
@@ -18,7 +18,6 @@
 
 package org.eclipse.jetty.jndi;
 
-
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -48,13 +47,13 @@
 import org.eclipse.jetty.util.component.Dumpable;
 import org.eclipse.jetty.util.log.Logger;
 
-
-/*------------------------------------------------*/
-/** NamingContext
- * <p>Implementation of Context interface.
- *
- * <p><h4>Notes</h4>
- * <p>All Names are expected to be Compound, not Composite.
+/** 
+ * NamingContext
+ * <p>
+ * Implementation of Context interface.
+ * <p>
+ * <b>Notes:</b>
+ * All Names are expected to be Compound, not Composite.
  */
 @SuppressWarnings("unchecked")
 public class NamingContext implements Context, Cloneable, Dumpable
@@ -178,11 +177,6 @@
     }
 
     /*------------------------------------------------*/
-    /**
-     * Setter for _parser
-     *
-     *
-     */
     public void setNameParser (NameParser parser)
     {
         _parser = parser;
@@ -1261,6 +1255,7 @@
      *
      * @param name a <code>Name</code> value
      * @param obj an <code>Object</code> value
+     * @throws NameAlreadyBoundException if name already bound
      */
     public void addBinding (Name name, Object obj) throws NameAlreadyBoundException
     {
@@ -1337,7 +1332,7 @@
     /*------------------------------------------------*/
     /**
      * Remove leading or trailing empty components from
-     * name. Eg "/comp/env/" -> "comp/env"
+     * name. Eg "/comp/env/" -&gt; "comp/env"
      *
      * @param name the name to normalize
      * @return normalized name
diff --git a/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/NamingUtil.java b/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/NamingUtil.java
index 1a98c41..5a0c9c0 100644
--- a/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/NamingUtil.java
+++ b/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/NamingUtil.java
@@ -33,13 +33,7 @@
 
 
 /**
- * Util.java
- *
- *
- * Created: Tue Jul  1 18:26:17 2003
- *
- *
- * @version 1.0
+ * Naming Utility Methods
  */
 public class NamingUtil
 {
@@ -53,6 +47,7 @@
      * @param ctx the context into which to bind
      * @param nameStr the name relative to context to bind
      * @param obj the object to be bound
+     * @return the bound context
      * @exception NamingException if an error occurs
      */
     public static Context bind (Context ctx, String nameStr, Object obj)
@@ -112,7 +107,7 @@
      * @param ctx the context containing the name for which to list the bindings
      * @param name the name in the context to list
      * @return map: key is fully qualified name, value is the bound object
-     * @throws NamingException
+     * @throws NamingException if unable to flatten bindings
      */
     public static Map flattenBindings (Context ctx, String name)
     throws NamingException
diff --git a/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/factories/MailSessionReference.java b/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/factories/MailSessionReference.java
index 141dd3a..255c841 100644
--- a/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/factories/MailSessionReference.java
+++ b/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/factories/MailSessionReference.java
@@ -92,17 +92,8 @@
         {
             this.password = password;
         }
-
-
     };
 
-
-
-
-
-    /**
-     *
-     */
     public MailSessionReference()
     {
        super ("javax.mail.Session", MailSessionReference.class.getName(), null);
@@ -117,7 +108,7 @@
      * @param arg2 not used
      * @param arg3 not used
      * @return the object found
-     * @throws Exception
+     * @throws Exception if unable to get object instance
      */
     public Object getObjectInstance(Object ref, Name arg1, Context arg2, Hashtable arg3) throws Exception
     {
diff --git a/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/java/javaRootURLContext.java b/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/java/javaRootURLContext.java
index 6dc0907..f6b94af 100644
--- a/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/java/javaRootURLContext.java
+++ b/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/java/javaRootURLContext.java
@@ -37,14 +37,12 @@
 
 
 
-/** javaRootURLContext
- * <p>This is the root of the java: url namespace
- *
- * <p><h4>Notes</h4>
- * <p>Thanks to Rickard Oberg for the idea of binding an ObjectFactory at "comp".
- *
- * <p><h4>Usage</h4>
- * <pre>
+/** 
+ * javaRootURLContext
+ * <p>
+ * This is the root of the <code>java:</code> url namespace
+ * <p>
+ * (Thanks to Rickard Oberg for the idea of binding an ObjectFactory at "comp")
  */
 public class javaRootURLContext implements Context
 {
diff --git a/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/java/javaURLContextFactory.java b/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/java/javaURLContextFactory.java
index 3215c79..d59b26d 100644
--- a/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/java/javaURLContextFactory.java
+++ b/jetty-jndi/src/main/java/org/eclipse/jetty/jndi/java/javaURLContextFactory.java
@@ -29,14 +29,10 @@
 import org.eclipse.jetty.util.log.Logger;
 
 
-/** javaURLContextFactory
- * <p>This is the URL context factory for the java: URL.
- *
- * <p><h4>Notes</h4>
+/** 
+ * javaURLContextFactory
  * <p>
- *
- * <p><h4>Usage</h4>
- * <pre>
+ * This is the URL context factory for the <code>java:</code> URL.
  */
 public class javaURLContextFactory implements ObjectFactory
 {
diff --git a/jetty-jsp/pom.xml b/jetty-jsp/pom.xml
deleted file mode 100644
index 92d7139..0000000
--- a/jetty-jsp/pom.xml
+++ /dev/null
@@ -1,104 +0,0 @@
-<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>
-    <groupId>org.eclipse.jetty</groupId>
-    <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>jetty-jsp</artifactId>
-  <name>Jetty :: Glassfish JSP Implementation</name>
-  <url>http://www.eclipse.org/jetty</url>
-  <packaging>jar</packaging>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-
-    <dependency>
-        <groupId>org.eclipse.jetty</groupId>
-        <artifactId>jetty-util</artifactId>
-        <version>${project.version}</version>
-        <scope>provided</scope>
-    </dependency>
-    <dependency>
-        <groupId>org.eclipse.jetty</groupId>
-        <artifactId>jetty-server</artifactId>
-        <version>${project.version}</version>
-        <scope>provided</scope>
-    </dependency>
-
-    <!-- Schemas -->
-    <dependency>
-      <groupId>org.eclipse.jetty.toolchain</groupId>
-      <artifactId>jetty-schemas</artifactId>
-    </dependency>
-
-    <!-- servlet api -->
-    <dependency>
-       <groupId>javax.servlet</groupId>
-       <artifactId>javax.servlet-api</artifactId>
-    </dependency>
-
-    <!-- JSP Api -->
-    <dependency>
-      <groupId>javax.servlet.jsp</groupId>
-      <artifactId>javax.servlet.jsp-api</artifactId>
-    </dependency>
-    <!-- JSP Impl -->
-    <dependency>
-      <groupId>org.glassfish.web</groupId>
-      <artifactId>javax.servlet.jsp</artifactId>
-    </dependency>
-
-    <!-- JSTL Api -->
-    <dependency>
-       <groupId>org.eclipse.jetty.orbit</groupId>
-       <artifactId>javax.servlet.jsp.jstl</artifactId>
-    </dependency>
-    <!-- JSTL Impl -->
-    <dependency>
-       <groupId>org.glassfish.web</groupId>
-       <artifactId>javax.servlet.jsp.jstl</artifactId>
-    </dependency>
-
-    <!-- EL Api -->
-    <!-- Not needed as glassfish impl jars contain also the api classes
-    <dependency>
-      <groupId>javax.el</groupId>
-      <artifactId>javax.el-api</artifactId>
-    </dependency>
-    -->
-
-    <!-- EL Impl -->
-    <dependency>
-        <groupId>org.glassfish</groupId>
-        <artifactId>javax.el</artifactId>
-    </dependency>
-
-
-    <!-- Eclipse Java Compiler (for JSP Compilation) -->
-    <dependency>
-      <groupId>org.eclipse.jetty.orbit</groupId>
-      <artifactId>org.eclipse.jdt.core</artifactId>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/jetty-jsp/src/main/config/modules/jsp-impl/glassfish-jsp.mod b/jetty-jsp/src/main/config/modules/jsp-impl/glassfish-jsp.mod
deleted file mode 100644
index 130d2b3..0000000
--- a/jetty-jsp/src/main/config/modules/jsp-impl/glassfish-jsp.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Glassfish JSP Module
-#
-[name]
-jsp-impl
-
-[lib]
-lib/jsp/*.jar
diff --git a/jetty-jsp/src/main/config/modules/jsp-impl/glassfish-jstl.mod b/jetty-jsp/src/main/config/modules/jsp-impl/glassfish-jstl.mod
deleted file mode 100644
index 4b8e6f3..0000000
--- a/jetty-jsp/src/main/config/modules/jsp-impl/glassfish-jstl.mod
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Glassfish JSTL
-[name]
-jstl-impl
-
-# This file is empty as glassfish jstl is provided by glassfish jsp
diff --git a/jetty-jsp/src/main/java/org/eclipse/jetty/jsp/JettyJspServlet.java b/jetty-jsp/src/main/java/org/eclipse/jetty/jsp/JettyJspServlet.java
deleted file mode 100644
index 05a9d51..0000000
--- a/jetty-jsp/src/main/java/org/eclipse/jetty/jsp/JettyJspServlet.java
+++ /dev/null
@@ -1,107 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.jsp;
-
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.jasper.servlet.JspServlet;
-import org.eclipse.jetty.server.handler.ContextHandler;
-import org.eclipse.jetty.util.URIUtil;
-import org.eclipse.jetty.util.resource.Resource;
-
-
-/**
- * JettyJspServlet
- *
- * Wrapper for the jsp servlet that handles receiving requests mapped from 
- * jsp-property-groups. Mappings could be wildcard urls like "/*", which would
- * include welcome files, but we need those to be handled by the DefaultServlet.
- */
-public class JettyJspServlet extends JspServlet
-{
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -5387857473125086791L;
-
-    @Override
-    public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
-    {
-        
-        
-        HttpServletRequest request = null;
-        if (req instanceof HttpServletRequest)
-            request = (HttpServletRequest)req;
-        else
-            throw new ServletException("Request not HttpServletRequest");
-
-        String servletPath=null;
-        String pathInfo=null;
-        if (request.getAttribute("javax.servlet.include.request_uri")!=null)
-        {
-            servletPath=(String)request.getAttribute("javax.servlet.include.servlet_path");
-            pathInfo=(String)request.getAttribute("javax.servlet.include.path_info");
-            if (servletPath==null)
-            {
-                servletPath=request.getServletPath();
-                pathInfo=request.getPathInfo();
-            }
-        }
-        else
-        {
-            servletPath = request.getServletPath();
-            pathInfo = request.getPathInfo();
-        }
-        
-        String pathInContext = URIUtil.addPaths(servletPath,pathInfo);
-        String jspFile = getInitParameter("jspFile");
-        
-        //if the request is for a jsp file then fall through to the jsp servlet
-        if (jspFile == null)
-        {
-            if (pathInContext.endsWith("/"))
-            {
-                //dispatch via forward to the default servlet
-                getServletContext().getNamedDispatcher("default").forward(req, resp);
-                return;
-            }
-            else
-            {      
-                //check if it resolves to a directory
-                Resource resource = ((ContextHandler.Context)getServletContext()).getContextHandler().getResource(pathInContext);           
-                if (resource!=null && resource.isDirectory())
-                {
-                    //dispatch via forward to the default servlet
-                    getServletContext().getNamedDispatcher("default").forward(req, resp);
-                    return;
-                }
-            }
-        }
-
-        //fall through to the normal jsp servlet handling
-        super.service(req, resp);
-    }
-
-    
-}
diff --git a/jetty-jsp/src/main/resources/readme.txt b/jetty-jsp/src/main/resources/readme.txt
deleted file mode 100644
index 39d448b..0000000
--- a/jetty-jsp/src/main/resources/readme.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This jar file is purely to work around a problem with the Maven Dependency plugin.
-Several modules in jetty use the Dependency plugin to copy or unpack the dependencies of  other modules.
-However, the Dependency plugin is not capable of unpacking or copying a dependency of type 'pom', which
-this module is, as it consists purely of external dependencies needed to run jsp.
diff --git a/jetty-jspc-maven-plugin/pom.xml b/jetty-jspc-maven-plugin/pom.xml
index 281b1a0..096a92e 100644
--- a/jetty-jspc-maven-plugin/pom.xml
+++ b/jetty-jspc-maven-plugin/pom.xml
@@ -2,31 +2,34 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-jspc-maven-plugin</artifactId>
   <packaging>maven-plugin</packaging>
   <name>Jetty :: Jetty JSPC Maven Plugin</name>
   <properties>
+    <bundle-symbolic-name>${project.groupId}.jspc.plugin</bundle-symbolic-name>
   </properties>
   <build>
     <plugins>
       <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
         <configuration>
           <skip>true</skip>
         </configuration>
       </plugin>
       <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-plugin-plugin</artifactId>
-        <version>2.9</version>
+        <version>3.4</version>
         <executions>
           <execution>
             <id>exec-plugin-doc</id>
             <phase>generate-sources</phase>
             <goals>
-              <goal>xdoc</goal>
+              <goal>descriptor</goal>
               <goal>helpmojo</goal>
             </goals>
           </execution>
diff --git a/jetty-jspc-maven-plugin/src/main/java/org/eclipse/jetty/jspc/plugin/JspcMojo.java b/jetty-jspc-maven-plugin/src/main/java/org/eclipse/jetty/jspc/plugin/JspcMojo.java
index a6e8755..bfc8cab 100644
--- a/jetty-jspc-maven-plugin/src/main/java/org/eclipse/jetty/jspc/plugin/JspcMojo.java
+++ b/jetty-jspc-maven-plugin/src/main/java/org/eclipse/jetty/jspc/plugin/JspcMojo.java
@@ -25,55 +25,48 @@
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.net.URI;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
-import java.util.regex.Pattern;
 
 import org.apache.jasper.JspC;
+import org.apache.jasper.servlet.JspCServletContext;
+import org.apache.jasper.servlet.TldScanner;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.project.MavenProject;
+import org.apache.tomcat.JarScanner;
+import org.apache.tomcat.util.scan.StandardJarScanner;
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.StringUtils;
 import org.eclipse.jetty.util.IO;
-import org.eclipse.jetty.util.PatternMatcher;
 import org.eclipse.jetty.util.resource.Resource;
 
 /**
- * <p>
  * This goal will compile jsps for a webapp so that they can be included in a
  * war.
- * </p>
  * <p>
- * At runtime, the plugin will use the jsp2.0 jspc compiler if you are running
- * on a 1.4 or lower jvm. If you are using a 1.5 jvm, then the jsp2.1 compiler
- * will be selected. (this is the same behaviour as the <a
- * href="http://jetty.mortbay.org/maven-plugin">jetty plugin</a> for executing
- * webapps).
+ * At runtime, the plugin will use the jspc compiler to precompile jsps and tags.
  * </p>
  * <p>
  * Note that the same java compiler will be used as for on-the-fly compiled
  * jsps, which will be the Eclipse java compiler.
- * </p>
- * 
  * <p>
  * See <a
- * href="http://docs.codehaus.org/display/JETTY/Maven+Jetty+Jspc+Plugin">Usage
+ * href="https://www.eclipse.org/jetty/documentation/current/jetty-jspc-maven-plugin.html">Usage
  * Guide</a> for instructions on using this plugin.
  * </p>
- * 
- * @author janb
- * 
  * @goal jspc
  * @phase process-classes
- * @requiresDependencyResolution compile
+ * @requiresDependencyResolution compile+runtime
  * @description Runs jspc compiler to produce .java and .class files
  */
 public class JspcMojo extends AbstractMojo
@@ -87,13 +80,42 @@
      *
      * Add some extra setters to standard JspC class to help configure it
      * for running in maven.
+     * 
+     * TODO move all setters on the plugin onto this jspc class instead.
      */
     public static class JettyJspC extends JspC
     {
+   
+        private boolean scanAll;
+        
         public void setClassLoader (ClassLoader loader)
         {
             this.loader = loader;
         }
+        
+       public void setScanAllDirectories (boolean scanAll)
+       {
+           this.scanAll = scanAll;
+       }
+       
+       public boolean getScanAllDirectories ()
+       {
+           return this.scanAll;
+       }
+       
+
+        @Override
+        protected TldScanner newTldScanner(JspCServletContext context, boolean namespaceAware, boolean validate, boolean blockExternal)
+        {            
+            if (context != null && context.getAttribute(JarScanner.class.getName()) == null) 
+            {
+                StandardJarScanner jarScanner = new StandardJarScanner();             
+                jarScanner.setScanAllDirectories(getScanAllDirectories());
+                context.setAttribute(JarScanner.class.getName(), jarScanner);
+            }
+                
+            return super.newTldScanner(context, namespaceAware, validate, blockExternal);
+        }      
     }
     
     
@@ -110,7 +132,7 @@
      * The artifacts for the project.
      * 
      * @since jetty-7.6.3
-     * @parameter expression="${project.artifacts}"
+     * @parameter default-value="${project.artifacts}"
      * @readonly
      */
     private Set projectArtifacts;
@@ -119,7 +141,7 @@
     /**
      * The maven project.
      * 
-     * @parameter expression="${project}"
+     * @parameter default-value="${project}"
      * @required
      * @readonly
      */
@@ -130,7 +152,7 @@
     /**
      * The artifacts for the plugin itself.
      * 
-     * @parameter expression="${plugin.artifacts}"
+     * @parameter default-value="${plugin.artifacts}"
      * @readonly
      */
     private List pluginArtifacts;
@@ -215,7 +237,7 @@
     /**
      * The location of the compiled classes for the webapp
      * 
-     * @parameter expression="${project.build.outputDirectory}"
+     * @parameter default-value="${project.build.outputDirectory}"
      */
     private File classesDirectory;
 
@@ -229,6 +251,19 @@
     
     
     /**
+     * Source version - if not set defaults to jsp default (currently 1.7)
+     * @parameter 
+     */
+    private String sourceVersion;
+    
+    
+    /**
+     * Target version - if not set defaults to jsp default (currently 1.7)
+     * @parameter 
+     */
+    private String targetVersion;
+    
+    /**
      * 
      * The JspC instance being used to compile the jsps.
      * 
@@ -237,7 +272,14 @@
     private JettyJspC jspc;
 
 
-
+    /**
+     * Whether dirs on the classpath should be scanned as well as jars.
+     * True by default. This allows for scanning for tlds of dependent projects that
+     * are in the reactor as unassembled jars.
+     * 
+     * @parameter default-value=true
+     */
+    private boolean scanAllDirectories;
     
 
     public void execute() throws MojoExecutionException, MojoFailureException
@@ -251,7 +293,11 @@
             getLog().info("webXml="+webXml);
             getLog().info("insertionMarker="+ (insertionMarker == null || insertionMarker.equals("") ? END_OF_WEBAPP : insertionMarker));
             getLog().info("keepSources=" + keepSources);
-            getLog().info("mergeFragment=" + mergeFragment);            
+            getLog().info("mergeFragment=" + mergeFragment);  
+            if (sourceVersion != null)
+                getLog().info("sourceVersion="+sourceVersion);
+            if (targetVersion != null)
+                getLog().info("targetVersion="+targetVersion);
         }
         try
         {
@@ -274,21 +320,17 @@
         List<URL> webAppUrls = setUpWebAppClassPath();
         
         //set up the classpath of the container (ie jetty and jsp jars)
-        String sysClassPath = setUpSysClassPath();
-        
-        //get the list of system classpath jars that contain tlds
-        List<URL> tldJarUrls = getSystemJarsWithTlds();
-        
-        for (URL u:tldJarUrls)
-        {
-            if (getLog().isDebugEnabled())
-                getLog().debug(" sys jar with tlds: "+u);
-            webAppUrls.add(u);
-        }
+        Set<URL> pluginJars = getPluginJars();
+        Set<URL> providedJars = getProvidedScopeJars(pluginJars);
+ 
 
+        //Make a classloader so provided jars will be on the classpath
+        List<URL> sysUrls = new ArrayList<URL>();      
+        sysUrls.addAll(providedJars);     
+        URLClassLoader sysClassLoader = new URLClassLoader((URL[])sysUrls.toArray(new URL[0]), currentClassLoader);
       
-        //use the classpaths as the classloader
-        URLClassLoader webAppClassLoader = new URLClassLoader((URL[]) webAppUrls.toArray(new URL[0]), currentClassLoader);
+        //make a classloader with the webapp classpath
+        URLClassLoader webAppClassLoader = new URLClassLoader((URL[]) webAppUrls.toArray(new URL[0]), sysClassLoader);
         StringBuffer webAppClassPath = new StringBuffer();
 
         for (int i = 0; i < webAppUrls.size(); i++)
@@ -311,26 +353,40 @@
         if (jspc == null)
             jspc = new JettyJspC();
         
+
         jspc.setWebXmlFragment(webXmlFragment);
         jspc.setUriroot(webAppSourceDirectory);     
         jspc.setOutputDir(generatedClasses);
-        jspc.setClassPath(sysClassPath+System.getProperty("path.separator")+webAppClassPath.toString());
         jspc.setClassLoader(fakeWebAppClassLoader);
+        jspc.setScanAllDirectories(scanAllDirectories);
         jspc.setCompile(true);
+        if (sourceVersion != null)
+            jspc.setCompilerSourceVM(sourceVersion);
+        if (targetVersion != null)
+            jspc.setCompilerTargetVM(targetVersion);
 
         // JspC#setExtensions() does not exist, so 
         // always set concrete list of files that will be processed.
         String jspFiles = getJspFiles(webAppSourceDirectory);
-        getLog().info("Compiling "+jspFiles);
-        getLog().info("Includes="+includes);
-        getLog().info("Excludes="+excludes);
-        jspc.setJspFiles(jspFiles);
+       
+        try
+        {
+            if (jspFiles == null | jspFiles.equals(""))
+            {
+                getLog().info("No files selected to precompile");
+            }
+            else
+            {
+                getLog().info("Compiling "+jspFiles+" from includes="+includes+" excludes="+excludes);
+                jspc.setJspFiles(jspFiles);
+                jspc.execute();
+            }
+        }
+        finally
+        {
 
-        getLog().info("Files selected to precompile: " + jspFiles);
-
-        jspc.execute();
-
-        Thread.currentThread().setContextClassLoader(currentClassLoader);
+            Thread.currentThread().setContextClassLoader(currentClassLoader);
+        }
     }
 
     private String getJspFiles(String webAppSourceDirectory)
@@ -345,7 +401,7 @@
      * Until Jasper supports the option to generate the srcs in a different dir
      * than the classes, this is the best we can do.
      * 
-     * @throws Exception
+     * @throws Exception if unable to clean srcs
      */
     public void cleanupSrcs() throws Exception
     {
@@ -391,7 +447,7 @@
      * If you dont specify the insertionMarker, then the fragment will be
      * inserted at the end of the file just before the &lt;/webapp&gt;
      * 
-     * @throws Exception
+     * @throws Exception if unable to merge the web xml
      */
     public void mergeWebXml() throws Exception
     {
@@ -406,58 +462,63 @@
                 return;
             }
 
-            File fragmentWebXml = new File(webXmlFragment);
-            if (!fragmentWebXml.exists())
+            File fragmentWebXml = new File(webXmlFragment);         
+            File mergedWebXml = new File(fragmentWebXml.getParentFile(), "web.xml");
+
+            try (BufferedReader webXmlReader = new BufferedReader(new FileReader(webXml));
+                 PrintWriter mergedWebXmlWriter = new PrintWriter(new FileWriter(mergedWebXml))) 
             {
-                getLog().info("No fragment web.xml file generated");
-            }
-            File mergedWebXml = new File(fragmentWebXml.getParentFile(),
-            "web.xml");
-            try (BufferedReader webXmlReader = new BufferedReader(new FileReader(
-                    webXml));
-                 PrintWriter mergedWebXmlWriter = new PrintWriter(new FileWriter(
-                    mergedWebXml))) {
 
-                // read up to the insertion marker or the </webapp> if there is no
-                // marker
-                boolean atInsertPoint = false;
-                boolean atEOF = false;
-                String marker = (insertionMarker == null
-                        || insertionMarker.equals("") ? END_OF_WEBAPP : insertionMarker);
-                while (!atInsertPoint && !atEOF)
+                if (!fragmentWebXml.exists())
                 {
-                    String line = webXmlReader.readLine();
-                    if (line == null)
-                        atEOF = true;
-                    else if (line.indexOf(marker) >= 0)
-                    {
-                        atInsertPoint = true;
-                    }
-                    else
-                    {
-                        mergedWebXmlWriter.println(line);
-                    }
-                }
-                
-                if (atEOF && !atInsertPoint)
-                    throw new IllegalStateException("web.xml does not contain insertionMarker "+insertionMarker);
-                
-                //put in a context init-param to flag that the contents have been precompiled
-                mergedWebXmlWriter.println("<context-param><param-name>"+PRECOMPILED_FLAG+"</param-name><param-value>true</param-value></context-param>");
-                
-
-                // put in the generated fragment
-                try (BufferedReader fragmentWebXmlReader = new BufferedReader(
-                        new FileReader(fragmentWebXml))) {
-                    IO.copy(fragmentWebXmlReader, mergedWebXmlWriter);
-
-                    // if we inserted just before the </web-app>, put it back in
-                    if (marker.equals(END_OF_WEBAPP))
-                        mergedWebXmlWriter.println(END_OF_WEBAPP);
-
-                    // copy in the rest of the original web.xml file
+                    getLog().info("No fragment web.xml file generated");
+                    //just copy existing web.xml to expected position
                     IO.copy(webXmlReader, mergedWebXmlWriter);
                 }
+                else
+                {
+                    // read up to the insertion marker or the </webapp> if there is no
+                    // marker
+                    boolean atInsertPoint = false;
+                    boolean atEOF = false;
+                    String marker = (insertionMarker == null
+                            || insertionMarker.equals("") ? END_OF_WEBAPP : insertionMarker);
+                    while (!atInsertPoint && !atEOF)
+                    {
+                        String line = webXmlReader.readLine();
+                        if (line == null)
+                            atEOF = true;
+                        else if (line.indexOf(marker) >= 0)
+                        {
+                            atInsertPoint = true;
+                        }
+                        else
+                        {
+                            mergedWebXmlWriter.println(line);
+                        }
+                    }
+
+                    if (atEOF && !atInsertPoint)
+                        throw new IllegalStateException("web.xml does not contain insertionMarker "+insertionMarker);
+
+                    //put in a context init-param to flag that the contents have been precompiled
+                    mergedWebXmlWriter.println("<context-param><param-name>"+PRECOMPILED_FLAG+"</param-name><param-value>true</param-value></context-param>");
+
+
+                    // put in the generated fragment
+                    try (BufferedReader fragmentWebXmlReader = 
+                            new BufferedReader(new FileReader(fragmentWebXml))) 
+                    {
+                        IO.copy(fragmentWebXmlReader, mergedWebXmlWriter);
+
+                        // if we inserted just before the </web-app>, put it back in
+                        if (marker.equals(END_OF_WEBAPP))
+                            mergedWebXmlWriter.println(END_OF_WEBAPP);
+
+                        // copy in the rest of the original web.xml file
+                        IO.copy(webXmlReader, mergedWebXmlWriter);
+                    }
+                }
             }
         }
     }
@@ -510,87 +571,63 @@
     }
     
     
-    private String setUpSysClassPath () throws Exception
+    
+    /**
+     * @return
+     * @throws MalformedURLException
+     */
+    private Set<URL> getPluginJars () throws MalformedURLException
     {
-        StringBuffer buff = new StringBuffer();
-        
-        //Put each of the plugin's artifacts onto the system classpath for jspc
+        HashSet<URL> pluginJars = new HashSet<>();
         for (Iterator<Artifact> iter = pluginArtifacts.iterator(); iter.hasNext(); )
         {
             Artifact pluginArtifact = iter.next();
             if ("jar".equalsIgnoreCase(pluginArtifact.getType()))
             {
                 if (getLog().isDebugEnabled()) { getLog().debug("Adding plugin artifact "+pluginArtifact);}
-                buff.append(pluginArtifact.getFile().getAbsolutePath());
-                if (iter.hasNext())
-                    buff.append(File.pathSeparator);
+                pluginJars.add(pluginArtifact.getFile().toURI().toURL());
             }
         }
         
+        return pluginJars;
+    }
+    
+    
+    
+    /**
+     * @param pluginJars
+     * @return
+     * @throws MalformedURLException
+     */
+    private Set<URL>  getProvidedScopeJars (Set<URL> pluginJars) throws MalformedURLException
+    {
+        if (!useProvidedScope)
+            return Collections.emptySet();
         
-        if (useProvidedScope)
-        {
-            for ( Iterator<Artifact> iter = projectArtifacts.iterator(); iter.hasNext(); )
-            {                   
-                Artifact artifact = iter.next();
-                if (Artifact.SCOPE_PROVIDED.equals(artifact.getScope()))
+        HashSet<URL> providedJars = new HashSet<>();
+        
+        for ( Iterator<Artifact> iter = projectArtifacts.iterator(); iter.hasNext(); )
+        {                   
+            Artifact artifact = iter.next();
+            if (Artifact.SCOPE_PROVIDED.equals(artifact.getScope()))
+            {
+                //test to see if the provided artifact was amongst the plugin artifacts
+                URL jar = artifact.getFile().toURI().toURL();
+                if (!pluginJars.contains(jar))
                 {
-                    //test to see if the provided artifact was amongst the plugin artifacts
-                    String path = artifact.getFile().getAbsolutePath();
-                    if (! buff.toString().contains(path))
-                    {
-                        if (buff.length() != 0)
-                            buff.append(File.pathSeparator);
-                        buff.append(path);
-                        if (getLog().isDebugEnabled()) { getLog().debug("Adding provided artifact: "+artifact);}
-                    }  
-                    else
-                    {
-                        if (getLog().isDebugEnabled()) { getLog().debug("Skipping provided artifact: "+artifact);}
-                    }
+                    providedJars.add(jar);
+                    if (getLog().isDebugEnabled()) { getLog().debug("Adding provided artifact: "+artifact);}
+                }  
+                else
+                {
+                    if (getLog().isDebugEnabled()) { getLog().debug("Skipping provided artifact: "+artifact);}
                 }
             }
         }
-
-        return buff.toString();
+        return providedJars;
     }
 
     
-    /**
-     * Glassfish jsp requires that we set up the list of system jars that have
-     * tlds in them.
-     * 
-     * This method is a little fragile, as it relies on knowing that the jstl jars
-     * are the only ones in the system path that contain tlds.
-     * @return
-     * @throws Exception
-     */
-    private List<URL> getSystemJarsWithTlds() throws Exception
-    {
-        getLog().debug("tld pattern=" + tldJarNamePatterns);   
-        final List<URL> list = new ArrayList<URL>();
-        List<URI> artifactUris = new ArrayList<URI>();
-        Pattern pattern = Pattern.compile(tldJarNamePatterns);
-        for (Iterator<Artifact> iter = pluginArtifacts.iterator(); iter.hasNext(); )
-        {
-            Artifact pluginArtifact = iter.next();
-            Resource res = Resource.newResource(pluginArtifact.getFile());
-            getLog().debug("scan jar: "+res.getURI());
-            artifactUris.add(res.getURI());
-        }
-        
-        PatternMatcher matcher = new PatternMatcher()
-        {
-            public void matched(URI uri) throws Exception
-            {
-                //uri of system artifact matches pattern defining list of jars known to contain tlds
-                list.add(uri.toURL());
-            }
-        };
-        matcher.match(pattern, artifactUris.toArray(new URI[artifactUris.size()]), false);
-        
-        return list;
-    }
     
     private File getWebXmlFile ()
     throws IOException
diff --git a/jetty-maven-plugin/pom.xml b/jetty-maven-plugin/pom.xml
index 089149d..d68e496 100644
--- a/jetty-maven-plugin/pom.xml
+++ b/jetty-maven-plugin/pom.xml
@@ -2,15 +2,17 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-maven-plugin</artifactId>
   <packaging>maven-plugin</packaging>
   <name>Jetty :: Jetty Maven Plugin</name>
+  <description>Jetty maven plugins</description>
   <properties>
     <mavenVersion>3.0.3</mavenVersion>
-    <pluginToolsVersion>3.1</pluginToolsVersion>
+    <pluginToolsVersion>3.4</pluginToolsVersion>
+    <bundle-symbolic-name>${project.groupId}.maven.plugin</bundle-symbolic-name>
   </properties>
   <build>
     <plugins>
@@ -29,7 +31,6 @@
             <id>exec-plugin-doc</id>
             <phase>generate-sources</phase>
             <goals>
-              <goal>xdoc</goal>
               <goal>helpmojo</goal>
             </goals>
           </execution>
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/AbstractJettyMojo.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/AbstractJettyMojo.java
index 3e373a1..caa79c5 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/AbstractJettyMojo.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/AbstractJettyMojo.java
@@ -18,7 +18,6 @@
 
 package org.eclipse.jetty.maven.plugin;
 
-
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.InputStream;
@@ -40,34 +39,23 @@
 import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.util.FileUtils;
 import org.eclipse.jetty.security.LoginService;
-import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.RequestLog;
+import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ShutdownMonitor;
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
 import org.eclipse.jetty.server.handler.HandlerCollection;
-import org.eclipse.jetty.util.Scanner;
+import org.eclipse.jetty.util.PathWatcher;
+import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.resource.Resource;
 import org.eclipse.jetty.xml.XmlConfiguration;
 
-
-
 /**
- * AbstractJettyMojo
- *
  * Common base class for most jetty mojos.
- * 
- * 
  */
 public abstract class AbstractJettyMojo extends AbstractMojo
 {
     /**
-     * 
-     */
-    public String PORT_SYSPROPERTY = "jetty.port";
-    
-    
-    /**
      * Whether or not to include dependencies on the plugin's classpath with &lt;scope&gt;provided&lt;/scope&gt;
      * Use WITH CAUTION as you may wind up with duplicate jars/classes.
      * 
@@ -76,7 +64,6 @@
      */
     protected boolean useProvidedScope;
     
-    
     /**
      * List of goals that are NOT to be used
      * 
@@ -85,9 +72,6 @@
      */
     protected String[] excludedGoals;
     
-
-  
-    
     /**
      * List of other contexts to set up. Consider using instead
      * the &lt;jettyXml&gt; element to specify external jetty xml config file. 
@@ -98,7 +82,6 @@
      */
     protected ContextHandler[] contextHandlers;
     
-    
     /**
      * List of security realms to set up. Consider using instead
      * the &lt;jettyXml&gt; element to specify external jetty xml config file. 
@@ -108,7 +91,6 @@
      * @parameter
      */
     protected LoginService[] loginServices;
-    
 
     /**
      * A RequestLog implementation to use for the webapp at runtime.
@@ -120,7 +102,6 @@
      */
     protected RequestLog requestLog;
     
-    
     /**
      * An instance of org.eclipse.jetty.webapp.WebAppContext that represents the webapp.
      * Use any of its setters to configure the webapp. This is the preferred and most
@@ -131,25 +112,23 @@
      */
     protected JettyWebAppContext webApp;
 
-
     /**
      * The interval in seconds to scan the webapp for changes 
      * and restart the context if necessary. Ignored if reload
      * is enabled. Disabled by default.
      * 
-     * @parameter expression="${jetty.scanIntervalSeconds}" default-value="0"
+     * @parameter property="jetty.scanIntervalSeconds" default-value="0"
      * @required
      */
     protected int scanIntervalSeconds;
     
-    
     /**
      * reload can be set to either 'automatic' or 'manual'
      *
      * if 'manual' then the context can be reloaded by a linefeed in the console
      * if 'automatic' then traditional reloading on changed files is enabled.
      * 
-     * @parameter expression="${jetty.reload}" default-value="automatic"
+     * @parameter property="jetty.reload" default-value="automatic"
      */
     protected String reload;
 
@@ -161,7 +140,7 @@
      * that have been set on the command line, by the JVM, or directly 
      * in the POM via systemProperties. Optional.
      * 
-     * @parameter expression="${jetty.systemPropertiesFile}"
+     * @parameter property="jetty.systemPropertiesFile"
      */
     protected File systemPropertiesFile;
 
@@ -207,17 +186,15 @@
     /**
      * Use the dump() facility of jetty to print out the server configuration to logging
      * 
-     * @parameter expression"${dumponStart}" default-value="false"
+     * @parameter property="dumponStart" default-value="false"
      */
     protected boolean dumpOnStart;
     
-   
-    
     
     /**  
      * Skip this mojo execution.
      * 
-     * @parameter expression="${jetty.skip}" default-value="false"
+     * @parameter property="jetty.skip" default-value="false"
      */
     protected boolean skip;
 
@@ -235,7 +212,7 @@
     /**
      * The maven project.
      *
-     * @parameter expression="${project}"
+     * @parameter default-value="${project}"
      * @readonly
      */
     protected MavenProject project;
@@ -244,14 +221,14 @@
     /**
      * The artifacts for the project.
      * 
-     * @parameter expression="${project.artifacts}"
+     * @parameter default-value="${project.artifacts}"
      * @readonly
      */
     protected Set projectArtifacts;
     
     
     /** 
-     * @parameter expression="${mojoExecution}" 
+     * @parameter default-value="${mojoExecution}" 
      * @readonly
      */
     protected org.apache.maven.plugin.MojoExecution execution;
@@ -260,7 +237,7 @@
     /**
      * The artifacts for the plugin itself.
      * 
-     * @parameter expression="${plugin.artifacts}"
+     * @parameter default-value="${plugin.artifacts}"
      * @readonly
      */
     protected List pluginArtifacts;
@@ -277,33 +254,27 @@
     
     /**
      * A wrapper for the Server object
+     * @parameter
      */
-    protected JettyServer server = new JettyServer();
+    protected Server server;
     
     
     /**
      * A scanner to check for changes to the webapp
      */
-    protected Scanner scanner;
+    protected PathWatcher scanner;
     
     
-    /**
-     *  List of files and directories to scan
-     */
-    protected ArrayList<File> scanList;
-    
-    
-    /**
-     * List of Listeners for the scanner
-     */
-    protected ArrayList<Scanner.BulkListener> scannerListeners;
-    
     
     /**
      * A scanner to check ENTER hits on the console
      */
     protected Thread consoleScanner;
     
+    protected ServerSupport serverSupport;
+    
+    
+    
     
     /**
      * <p>
@@ -360,9 +331,6 @@
     
     
     
-    /**
-     * @throws MojoExecutionException
-     */
     public void configurePluginClasspath() throws MojoExecutionException
     {  
         //if we are configured to include the provided dependencies on the plugin's classpath
@@ -402,13 +370,6 @@
         }
     }
     
-    
-    
-    
-    /**
-     * @param artifact
-     * @return
-     */
     public boolean isPluginArtifact(Artifact artifact)
     {
         if (pluginArtifacts == null || pluginArtifacts.isEmpty())
@@ -426,12 +387,6 @@
         return isPluginArtifact;
     }
 
-    
-    
-    
-    /**
-     * @throws Exception
-     */
     public void finishConfigurationBeforeStart() throws Exception
     {
         HandlerCollection contexts = (HandlerCollection)server.getChildHandlerByClass(ContextHandlerCollection.class);
@@ -444,31 +399,24 @@
         }
     }
 
-   
-   
-
-    /**
-     * @throws Exception
-     */
     public void applyJettyXml() throws Exception
-    {
-        if (getJettyXmlFiles() == null)
-            return;
-
-        this.server.applyXmlConfigurations(getJettyXmlFiles());
+    {        
+        Server tmp = ServerSupport.applyXmlConfigurations(server, getJettyXmlFiles());
+        if (server == null)
+            server = tmp;
+        
+        if (server == null)
+            server = new Server();
     }
 
-
-
-    
-    /**
-     * @throws MojoExecutionException
-     */
     public void startJetty () throws MojoExecutionException
     {
         try
         {
             getLog().debug("Starting Jetty Server ...");
+            
+            //make sure Jetty does not use URLConnection caches with the plugin
+            Resource.setDefaultUseCaches(false);
          
             configureMonitor();
             
@@ -477,54 +425,32 @@
             //apply any config from a jetty.xml file first which is able to
             //be overwritten by config in the pom.xml
             applyJettyXml ();      
-
+            
             // if a <httpConnector> was specified in the pom, use it
             if (httpConnector != null)
             {
                 // check that its port was set
                 if (httpConnector.getPort() <= 0)
                 {
-                    //use any jetty.port settings provided
-                    String tmp = System.getProperty(PORT_SYSPROPERTY, MavenServerConnector.DEFAULT_PORT_STR); 
+                    //use any jetty.http.port settings provided
+                    String tmp = System.getProperty(MavenServerConnector.PORT_SYSPROPERTY, System.getProperty("jetty.port", MavenServerConnector.DEFAULT_PORT_STR));
                     httpConnector.setPort(Integer.parseInt(tmp.trim()));
                 }  
-                if (httpConnector.getServer() == null)
-                    httpConnector.setServer(this.server);
-                this.server.addConnector(httpConnector);
+                httpConnector.setServer(server);
             }
 
-            // if the user hasn't configured the connectors in a jetty.xml file so use a default one
-            Connector[] connectors = this.server.getConnectors();
-            if (connectors == null|| connectors.length == 0)
-            {
-                //if <httpConnector> not configured in the pom, create one
-                if (httpConnector == null)
-                {
-                    httpConnector = new MavenServerConnector();               
-                    //use any jetty.port settings provided
-                    String tmp = System.getProperty(PORT_SYSPROPERTY, MavenServerConnector.DEFAULT_PORT_STR);
-                    httpConnector.setPort(Integer.parseInt(tmp.trim()));
-                }
-                if (httpConnector.getServer() == null)
-                    httpConnector.setServer(this.server);
-                this.server.setConnectors(new Connector[] {httpConnector});
-            }
+            ServerSupport.configureConnectors(server, httpConnector);
 
-            //set up a RequestLog if one is provided
-            if (this.requestLog != null)
-                this.server.setRequestLog(this.requestLog);
-
-            //set up the webapp and any context provided
-            this.server.configureHandlers();
+            //set up a RequestLog if one is provided and the handle structure
+            ServerSupport.configureHandlers(server, this.requestLog);
+            
+            //Set up list of default Configurations to apply to a webapp
+            ServerSupport.configureDefaultConfigurationClasses(server);
             configureWebApplication();
-            this.server.addWebApplication(webApp);
+            ServerSupport.addWebApplication(server, webApp);
 
             // set up security realms
-            for (int i = 0; (this.loginServices != null) && i < this.loginServices.length; i++)
-            {
-                getLog().debug(this.loginServices[i].getClass().getName() + ": "+ this.loginServices[i].toString());
-                this.server.addBean(this.loginServices[i]);
-            }
+            ServerSupport.configureLoginServices(server, loginServices);
 
             //do any other configuration required by the
             //particular Jetty version
@@ -534,17 +460,20 @@
             this.server.start();
 
             getLog().info("Started Jetty Server");
-           
-            
+
             if ( dumpOnStart )
             {
                 getLog().info(this.server.dump());
             }
-            
+
             // start the scanner thread (if necessary) on the main webapp
-            configureScanner ();
-            startScanner();
-            
+            if (isScanningEnabled())
+            {
+                scanner = new PathWatcher();
+                configureScanner ();
+                startScanner();
+            }
+
             // start the new line scanner thread if necessary
             startConsoleScanner();
 
@@ -580,11 +509,15 @@
     }
 
     
+    
+    
+    
+    
     /**
      * Subclasses should invoke this to setup basic info
      * on the webapp
      * 
-     * @throws MojoExecutionException
+     * @throws Exception if unable to configure web application 
      */
     public void configureWebApplication () throws Exception
     {
@@ -634,39 +567,40 @@
      * Run a scanner thread on the given list of files and directories, calling
      * stop/start on the given list of LifeCycle objects if any of the watched
      * files change.
-     *
+     * @throws Exception if unable to start scanner 
      */
-    private void startScanner() throws Exception
+    public void startScanner() throws Exception
     {
-        // check if scanning is enabled
-        if (scanIntervalSeconds <= 0) return;
-
-        // check if reload is manual. It disables file scanning
-        if ( "manual".equalsIgnoreCase( reload ) )
-        {
-            // issue a warning if both scanIntervalSeconds and reload
-            // are enabled
-            getLog().warn("scanIntervalSeconds is set to " + scanIntervalSeconds + " but will be IGNORED due to manual reloading");
+        if (!isScanningEnabled())
             return;
-        }
 
-        scanner = new Scanner();
-        scanner.setReportExistingFilesOnStartup(false);
-        scanner.setScanInterval(scanIntervalSeconds);
-        scanner.setScanDirs(scanList);
-        scanner.setRecursive(true);
-        Iterator itor = (this.scannerListeners==null?null:this.scannerListeners.iterator());
-        while (itor!=null && itor.hasNext())
-            scanner.addListener((Scanner.Listener)itor.next());
-        getLog().info("Starting scanner at interval of " + scanIntervalSeconds + " seconds.");
+        scanner.setNotifyExistingOnStart(false);
+       
+       
         scanner.start();
     }
     
     
+    public boolean isScanningEnabled ()
+    {
+        if (scanIntervalSeconds <=0 || "manual".equalsIgnoreCase( reload ))
+            return false;
+        return true;
+    }
+    
+    public void stopScanner() throws Exception
+    {
+        if (!isScanningEnabled())
+            return;
+        
+        if (scanner != null)
+            scanner.stop();
+    }
     
     
     /**
      * Run a thread that monitors the console input to detect ENTER hits.
+     * @throws Exception if unable to start the console
      */
     protected void startConsoleScanner() throws Exception
     {
@@ -678,12 +612,6 @@
         }       
     }
 
-    
-    
-    
-    /**
-     * 
-     */
     protected void printSystemProperties ()
     {
         // print out which system properties were set up
@@ -701,13 +629,10 @@
         }
     }
 
-    
-    
-    
     /**
      * Try and find a jetty-web.xml file, using some
      * historical naming conventions if necessary.
-     * @param webInfDir
+     * @param webInfDir the web inf directory
      * @return the jetty web xml file
      */
     public File findJettyWebXmlFile (File webInfDir)
@@ -729,13 +654,6 @@
         return null;
     }
 
-
-   
-    
-    /**
-     * @param file
-     * @throws Exception
-     */
     public void setSystemPropertiesFile(File file) throws Exception
     {
         this.systemPropertiesFile = file;
@@ -761,12 +679,6 @@
         } 
     }
     
-    
-    
-    
-    /**
-     * @param systemProperties
-     */
     public void setSystemProperties(SystemProperties systemProperties)
     {
         if (this.systemProperties == null)
@@ -780,15 +692,6 @@
         }
     }
     
-
-    
-
-    
-    
-    
-    /**
-     * @return
-     */
     public List<File> getJettyXmlFiles()
     {
         if ( this.jettyXml == null )
@@ -804,7 +707,7 @@
         }
         else
         {
-            String[] files = this.jettyXml.split(",");
+            String[] files = StringUtil.csvSplit(this.jettyXml);
             
             for ( String file : files )
             {
@@ -815,12 +718,6 @@
         return jettyXmlFiles;
     }
 
-    
-    
-    /**
-     * @param goal
-     * @return
-     */
     public boolean isExcluded (String goal)
     {
         if (excludedGoals == null || goal == null)
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/ConsoleScanner.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/ConsoleScanner.java
index 65a9dc5..8aba977 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/ConsoleScanner.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/ConsoleScanner.java
@@ -20,9 +20,6 @@
 
 import java.io.IOException;
 
-
-
-
 /**
  * ConsoleScanner
  *
@@ -30,16 +27,8 @@
  */
 public class ConsoleScanner extends Thread 
 {
-    
     private final AbstractJettyMojo mojo;
     
-    
-    
-    
-    
-    /**
-     * @param mojo
-     */
     public ConsoleScanner(AbstractJettyMojo mojo) 
     {
         this.mojo = mojo;
@@ -47,12 +36,6 @@
         setDaemon(true);
     }
     
-    
-    
-    
-    /** 
-     * @see java.lang.Thread#run()
-     */
     public void run() 
     {  
         try 
@@ -69,12 +52,6 @@
         }
     }
     
-    
-    
-    
-    /**
-     * 
-     */
     private void getSomeSleep() 
     {
         try 
@@ -87,12 +64,6 @@
         }
     }
     
-    
-    
-    
-    /**
-     * @throws IOException
-     */
     private void checkSystemInput() throws IOException 
     {     
         while (System.in.available() > 0) {
@@ -107,9 +78,6 @@
         }
     }
     
-    
-    
-    
     /**
      * Skip buffered bytes of system console.
      */
@@ -136,12 +104,6 @@
         }      
     }
     
-    
-    
-    
-    /**
-     * 
-     */
     private void restartWebApp()
     {
         try
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyDeployWar.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyDeployWar.java
index 48d7762..67fb8ee 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyDeployWar.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyDeployWar.java
@@ -18,8 +18,6 @@
 
 package org.eclipse.jetty.maven.plugin;
 
-import java.io.File;
-
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 
@@ -74,8 +72,7 @@
     {
         super.finishConfigurationBeforeStart();
         //only stop the server at shutdown if we are blocking
-        server.setStopAtShutdown(!nonblocking);
-       
+        server.setStopAtShutdown(!nonblocking); 
     }
 
 }
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyEffectiveWebXml.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyEffectiveWebXml.java
index b837722..924458e 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyEffectiveWebXml.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyEffectiveWebXml.java
@@ -42,7 +42,7 @@
     /**
      * The target directory
      * 
-     * @parameter expression="${project.build.directory}"
+     * @parameter default-value="${project.build.directory}"
      * @required
      * @readonly
      */
@@ -73,16 +73,7 @@
     {
         //Only do enough setup to be able to produce a quickstart-web.xml file 
         
-        //if the user didn't nominate a file to generate into, pick the name and
-        //make sure that it is deleted on exit
-        if (effectiveWebXml == null)
-        {
-            deleteOnExit = true;
-            effectiveWebXml = new File(target, "effective-web.xml");
-            effectiveWebXml.deleteOnExit();
-        }
-        
-        Resource descriptor = Resource.newResource(effectiveWebXml);
+
         
         QueuedThreadPool tpool = null;
         
@@ -93,9 +84,8 @@
             //apply any config from a jetty.xml file first to our "fake" server instance
             //TODO probably not necessary
             applyJettyXml ();  
-
         
-            server.configureHandlers();
+            ServerSupport.configureHandlers(server, null);
                    
             //ensure config of the webapp based on settings in plugin
             configureWebApplication();
@@ -105,15 +95,29 @@
             webApp.setCopyWebDir(false);
             webApp.setCopyWebInf(false);
             webApp.setGenerateQuickStart(true);
-    
-            if (!effectiveWebXml.getParentFile().exists())
-                effectiveWebXml.getParentFile().mkdirs();
-            if (!effectiveWebXml.exists())
-                effectiveWebXml.createNewFile();
+
+            //if the user didn't nominate a file to generate into, pick the name and
+            //make sure that it is deleted on exit
+            if (webApp.getQuickStartWebDescriptor() == null)
+            {
+                if (effectiveWebXml == null)
+                {
+                    deleteOnExit = true;
+                    effectiveWebXml = new File(target, "effective-web.xml");
+                    effectiveWebXml.deleteOnExit();
+                }
+
+                Resource descriptor = Resource.newResource(effectiveWebXml);
+
+                if (!effectiveWebXml.getParentFile().exists())
+                    effectiveWebXml.getParentFile().mkdirs();
+                if (!effectiveWebXml.exists())
+                    effectiveWebXml.createNewFile();
+
+                webApp.setQuickStartWebDescriptor(descriptor);
+            }
             
-            webApp.setQuickStartWebDescriptor(descriptor);
-            
-            server.addWebApplication(webApp);
+            ServerSupport.addWebApplication(server, webApp);
                        
             //if our server has a thread pool associated we can do any annotation scanning multithreaded,
             //otherwise scanning will be single threaded
@@ -143,7 +147,7 @@
             try
             {
                 //just show the result in the log
-                getLog().info(IO.toString(descriptor.getInputStream()));
+                getLog().info(IO.toString(webApp.getQuickStartWebDescriptor().getInputStream()));
             }
             catch (IOException e)
             {
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunForkedMojo.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunForkedMojo.java
index b1d267e..22cf2f2 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunForkedMojo.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunForkedMojo.java
@@ -45,7 +45,7 @@
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugin.descriptor.PluginDescriptor;
 import org.eclipse.jetty.annotations.AnnotationConfiguration;
-import org.eclipse.jetty.quickstart.QuickStartDescriptorGenerator;
+import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.util.IO;
 import org.eclipse.jetty.util.resource.Resource;
 import org.eclipse.jetty.util.resource.ResourceCollection;
@@ -53,25 +53,20 @@
 
 
 /**
+ * This goal is used to deploy your unassembled webapp into a forked JVM.
  * <p>
- *  This goal is used to deploy your unassembled webapp into a forked JVM.
- *  </p>
- *  <p>
- *  You need to define a jetty.xml file to configure connectors etc. You can use the normal setters of o.e.j.webapp.WebAppContext on the <b>webApp</b>
- *  configuration element for this plugin. You may also need context xml file for any particularly complex webapp setup.
- *  about your webapp.
- *  </p>
- *  <p>
- *  Unlike the other jetty goals, this does NOT support the <b>scanIntervalSeconds</b> parameter: the webapp will be deployed only once.
- *  </p>
- *  <p>
- *  The <b>stopKey</b>, <b>stopPort</b> configuration elements can be used to control the stopping of the forked process. By default, this plugin will launch
- *  the forked jetty instance and wait for it to complete (in which case it acts much like the <b>jetty:run</b> goal, and you will need to Cntrl-C to stop).
- *  By setting the configuration element <b>waitForChild</b> to <b>false</b>, the plugin will terminate after having forked the jetty process. In this case
- *  you can use the <b>jetty:stop</b> goal to terminate the process.
- *  <p>
- *  See <a href="http://www.eclipse.org/jetty/documentation/">http://www.eclipse.org/jetty/documentation</a> for more information on this and other jetty plugins.
- *  </p>
+ * You need to define a jetty.xml file to configure connectors etc. You can use the normal setters of o.e.j.webapp.WebAppContext on the <b>webApp</b>
+ * configuration element for this plugin. You may also need context xml file for any particularly complex webapp setup.
+ * about your webapp.
+ * <p>
+ * Unlike the other jetty goals, this does NOT support the <b>scanIntervalSeconds</b> parameter: the webapp will be deployed only once.
+ * <p>
+ * The <b>stopKey</b>, <b>stopPort</b> configuration elements can be used to control the stopping of the forked process. By default, this plugin will launch
+ * the forked jetty instance and wait for it to complete (in which case it acts much like the <b>jetty:run</b> goal, and you will need to Cntrl-C to stop).
+ * By setting the configuration element <b>waitForChild</b> to <b>false</b>, the plugin will terminate after having forked the jetty process. In this case
+ * you can use the <b>jetty:stop</b> goal to terminate the process.
+ * <p>
+ * See <a href="http://www.eclipse.org/jetty/documentation/">http://www.eclipse.org/jetty/documentation</a> for more information on this and other jetty plugins.
  * 
  * @goal run-forked
  * @requiresDependencyResolution test
@@ -81,21 +76,10 @@
  */
 public class JettyRunForkedMojo extends JettyRunMojo
 {    
-    public static final String DEFAULT_WEBAPP_SRC = "src"+File.separator+"main"+File.separator+"webapp";
-    public static final String FAKE_WEBAPP = "webapp-tmp";
-    
-    
-    public String PORT_SYSPROPERTY = "jetty.port";
-
-    
- 
-    
-    
-    
     /**
      * The target directory
      * 
-     * @parameter expression="${project.build.directory}"
+     * @parameter default-value="${project.build.directory}"
      * @required
      * @readonly
      */
@@ -104,34 +88,34 @@
     /**
      * The file into which to generate the quickstart web xml for the forked process to use
      * 
-     * @parameter expression="${project.build.directory}/fork-web.xml"
+     * @parameter default-value="${project.build.directory}/fork-web.xml"
      */
     protected File forkWebXml;
     
     
     /**
      * Arbitrary jvm args to pass to the forked process
-     * @parameter expression="${jetty.jvmArgs}"
+     * @parameter property="jetty.jvmArgs"
      */
     private String jvmArgs;
     
     
     /**
-     * @parameter expression="${plugin.artifacts}"
+     * @parameter default-value="${plugin.artifacts}"
      * @readonly
      */
     private List pluginArtifacts;
     
     
     /**
-     * @parameter expression="${plugin}"
+     * @parameter default-value="${plugin}"
      * @readonly
      */
     private PluginDescriptor plugin;
     
     
     /**
-     * @parameter expression="true" default-value="true"
+     * @parameter default-value="true"
      */
     private boolean waitForChild;
 
@@ -249,42 +233,49 @@
     {
         //Only do enough setup to be able to produce a quickstart-web.xml file to
         //pass onto the forked process to run     
-        
-        if (forkWebXml == null)
-            forkWebXml = new File (target, "fork-web.xml");
-        
+
         try
         {
             printSystemProperties();
 
             //do NOT apply the jettyXml configuration - as the jvmArgs may be needed for it to work 
+            if (server == null)
+                server = new Server();
 
             //ensure handler structure enabled
-            server.configureHandlers();
+            ServerSupport.configureHandlers(server, null);
+            
+            ServerSupport.configureDefaultConfigurationClasses(server);
                    
             //ensure config of the webapp based on settings in plugin
             configureWebApplication();
             
             //copy the base resource as configured by the plugin
             originalBaseResource = webApp.getBaseResource();
-            
+
             //get the original persistance setting
             originalPersistTemp = webApp.isPersistTempDirectory();
-            
+
             //set the webapp up to do very little other than generate the quickstart-web.xml
             webApp.setCopyWebDir(false);
             webApp.setCopyWebInf(false);
             webApp.setGenerateQuickStart(true);
-         
-            if (!forkWebXml.getParentFile().exists())
-                forkWebXml.getParentFile().mkdirs();
-            if (!forkWebXml.exists())
-                forkWebXml.createNewFile();
-            
-            webApp.setQuickStartWebDescriptor(Resource.newResource(forkWebXml));
+
+            if (webApp.getQuickStartWebDescriptor() == null)
+            {
+                if (forkWebXml == null)
+                    forkWebXml = new File (target, "fork-web.xml");
+
+                if (!forkWebXml.getParentFile().exists())
+                    forkWebXml.getParentFile().mkdirs();
+                if (!forkWebXml.exists())
+                    forkWebXml.createNewFile();
+
+                webApp.setQuickStartWebDescriptor(Resource.newResource(forkWebXml));
+            }
             
             //add webapp to our fake server instance
-            server.addWebApplication(webApp);
+            ServerSupport.addWebApplication(server, webApp);
                        
             //if our server has a thread pool associated we can do annotation scanning multithreaded,
             //otherwise scanning will be single threaded
@@ -431,13 +422,6 @@
         }
     }
 
-
-
-
-    /**
-     * @return
-     * @throws MojoExecutionException
-     */
     public List<String> getProvidedJars() throws MojoExecutionException
     {  
         //if we are configured to include the provided dependencies on the plugin's classpath
@@ -464,13 +448,6 @@
             return null;
     }
     
-   
-    
-    
-    /**
-     * @return
-     * @throws MojoExecutionException
-     */
     public File prepareConfiguration() throws MojoExecutionException
     {
         try
@@ -610,15 +587,6 @@
         return warArtifacts;
     }
     
-    
-    
-    
-    
-    
-    /**
-     * @param artifact
-     * @return
-     */
     public boolean isPluginArtifact(Artifact artifact)
     {
         if (pluginArtifacts == null || pluginArtifacts.isEmpty())
@@ -636,13 +604,6 @@
         return isPluginArtifact;
     }
     
-    
-    
-    
-    /**
-     * @return
-     * @throws Exception
-     */
     private Set<Artifact> getExtraJars()
     throws Exception
     {
@@ -668,15 +629,6 @@
         return extraJars;
     }
 
-    
-
-   
-
-    
-    /**
-     * @return
-     * @throws Exception
-     */
     public String getContainerClassPath() throws Exception
     {
         StringBuilder classPath = new StringBuilder();
@@ -742,13 +694,6 @@
         return "java";
     }
     
-
-    
-    
-    /**
-     * @param path
-     * @return
-     */
     public static String fileSeparators(String path)
     {
         StringBuilder ret = new StringBuilder();
@@ -766,13 +711,6 @@
         return ret.toString();
     }
 
-
-    
-    
-    /**
-     * @param path
-     * @return
-     */
     public static String pathSeparators(String path)
     {
         StringBuilder ret = new StringBuilder();
@@ -790,24 +728,11 @@
         return ret.toString();
     }
 
-
-    
-    
-    /**
-     * @return
-     */
     private String createToken ()
     {
         return Long.toString(random.nextLong()^System.currentTimeMillis(), 36).toUpperCase(Locale.ENGLISH);
     }
     
-
-    
-    
-    /**
-     * @param mode
-     * @param inputStream
-     */
     private void startPump(String mode, InputStream inputStream)
     {
         ConsoleStreamer pump = new ConsoleStreamer(mode,inputStream);
@@ -816,13 +741,6 @@
         thread.start();
     }
 
-
-    
-    
-    /**
-     * @param strings
-     * @return
-     */
     private String toCSV (List<String> strings)
     {
         if (strings == null)
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunMojo.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunMojo.java
index 2383daf..190032d 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunMojo.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunMojo.java
@@ -31,33 +31,27 @@
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
-import org.codehaus.plexus.util.FileUtils;
-import org.eclipse.jetty.util.Scanner;
+import org.eclipse.jetty.util.PathWatcher;
+import org.eclipse.jetty.util.PathWatcher.PathWatchEvent;
 import org.eclipse.jetty.util.resource.Resource;
 import org.eclipse.jetty.webapp.WebAppContext;
 
-
 /**
- *  <p>
  *  This goal is used in-situ on a Maven project without first requiring that the project 
  *  is assembled into a war, saving time during the development cycle.
+ *  <p>
  *  The plugin forks a parallel lifecycle to ensure that the "compile" phase has been completed before invoking Jetty. This means
  *  that you do not need to explicity execute a "mvn compile" first. It also means that a "mvn clean jetty:run" will ensure that
  *  a full fresh compile is done before invoking Jetty.
- *  </p>
  *  <p>
  *  Once invoked, the plugin can be configured to run continuously, scanning for changes in the project and automatically performing a 
  *  hot redeploy when necessary. This allows the developer to concentrate on coding changes to the project using their IDE of choice and have those changes
  *  immediately and transparently reflected in the running web container, eliminating development time that is wasted on rebuilding, reassembling and redeploying.
- *  </p>
  *  <p>
  *  You may also specify the location of a jetty.xml file whose contents will be applied before any plugin configuration.
  *  This can be used, for example, to deploy a static webapp that is not part of your maven build. 
- *  </p>
  *  <p>
  *  There is a <a href="http://www.eclipse.org/jetty/documentation/current/maven-and-jetty.html">reference guide</a> to the configuration parameters for this plugin.
- *  </p>
- * 
  * 
  * @goal run
  * @requiresDependencyResolution test
@@ -85,7 +79,7 @@
      * The default location of the web.xml file. Will be used
      * if &lt;webApp&gt;&lt;descriptor&gt; is not set.
      * 
-     * @parameter expression="${maven.war.webxml}"
+     * @parameter default-value="${maven.war.webxml}"
      * @readonly
      */
     protected String webXml;
@@ -94,26 +88,41 @@
     /**
      * The directory containing generated classes.
      *
-     * @parameter expression="${project.build.outputDirectory}"
+     * @parameter default-value="${project.build.outputDirectory}"
      * @required
      * 
      */
     protected File classesDirectory;
     
+    /**
+     * An optional pattern for includes/excludes of classes in the classesDirectory
+     * @parameter
+     */
+    protected ScanPattern scanClassesPattern;
+    
+    
+    
     
     /**
      * The directory containing generated test classes.
      * 
-     * @parameter expression="${project.build.testOutputDirectory}"
+     * @parameter default-value="${project.build.testOutputDirectory}"
      * @required
      */
     protected File testClassesDirectory;
     
+    /**
+     * An optional pattern for includes/excludes of classes in the testClassesDirectory
+     * @parameter
+     */
+    protected ScanPattern scanTestClassesPattern;
+    
+   
     
     /**
      * Root directory for all html/jsp etc files
      *
-     * @parameter expression="${maven.war.src}"
+     * @parameter default-value="${maven.war.src}"
      * 
      */
     protected File webAppSourceDirectory;
@@ -136,12 +145,6 @@
 
     
     /**
-     * Extra scan targets as a list
-     */
-    protected List<File> extraScanTargets;
-    
-    
-    /**
      * maven-war-plugin reference
      */
     protected WarPluginInfo warPluginInfo;
@@ -232,59 +235,6 @@
         {
             throw new MojoExecutionException("Location of classesDirectory does not exist");
         }
-        
-        extraScanTargets = new ArrayList<File>();
-        if (scanTargets != null)
-        {            
-            for (int i=0; i< scanTargets.length; i++)
-            {
-                getLog().info("Added extra scan target:"+ scanTargets[i]);
-                extraScanTargets.add(scanTargets[i]);
-            }            
-        }
-        
-        if (scanTargetPatterns!=null)
-        {
-            for (int i=0;i<scanTargetPatterns.length; i++)
-            {
-                Iterator itor = scanTargetPatterns[i].getIncludes().iterator();
-                StringBuffer strbuff = new StringBuffer();
-                while (itor.hasNext())
-                {
-                    strbuff.append((String)itor.next());
-                    if (itor.hasNext())
-                        strbuff.append(",");
-                }
-                String includes = strbuff.toString();
-                
-                itor = scanTargetPatterns[i].getExcludes().iterator();
-                strbuff= new StringBuffer();
-                while (itor.hasNext())
-                {
-                    strbuff.append((String)itor.next());
-                    if (itor.hasNext())
-                        strbuff.append(",");
-                }
-                String excludes = strbuff.toString();
-
-                try
-                {
-                    List<File> files = FileUtils.getFiles(scanTargetPatterns[i].getDirectory(), includes, excludes);
-                    itor = files.iterator();
-                    while (itor.hasNext())
-                        getLog().info("Adding extra scan target from pattern: "+itor.next());
-                    List<File> currentTargets = extraScanTargets;
-                    if(currentTargets!=null && !currentTargets.isEmpty())
-                        currentTargets.addAll(files);
-                    else
-                        extraScanTargets = files;
-                }
-                catch (IOException e)
-                {
-                    throw new MojoExecutionException(e.getMessage());
-                }
-            }
-        }
     }
 
    
@@ -329,9 +279,7 @@
        //get copy of a list of war artifacts
        Set<Artifact> matchedWarArtifacts = new HashSet<Artifact>();
 
-       //make sure each of the war artifacts is added to the scanner
-       for (Artifact a:getWarArtifacts())
-           extraScanTargets.add(a.getFile());
+
 
        //process any overlays and the war type artifacts
        List<Overlay> overlays = new ArrayList<Overlay>();
@@ -420,77 +368,36 @@
     public void configureScanner ()
     throws MojoExecutionException
     {
-        // start the scanner thread (if necessary) on the main webapp
-        scanList = new ArrayList<File>();
-        if (webApp.getDescriptor() != null)
+        try
         {
-            try (Resource r = Resource.newResource(webApp.getDescriptor());)
-            {
-                scanList.add(r.getFile());
-            }
-            catch (IOException e)
-            {
-                throw new MojoExecutionException("Problem configuring scanner for web.xml", e);
-            }
+            gatherScannables();
+        }
+        catch (Exception e)
+        {
+            throw new MojoExecutionException("Error forming scan list", e);
         }
 
-        if (webApp.getJettyEnvXml() != null)
+        scanner.addListener(new PathWatcher.EventListListener()
         {
-            try (Resource r = Resource.newResource(webApp.getJettyEnvXml());)
-            {
-                scanList.add(r.getFile());
-            }
-            catch (IOException e)
-            {
-                throw new MojoExecutionException("Problem configuring scanner for jetty-env.xml", e);
-            }
-        }
 
-        if (webApp.getDefaultsDescriptor() != null)
-        {
-            try (Resource r = Resource.newResource(webApp.getDefaultsDescriptor());)
-            {
-                if (!WebAppContext.WEB_DEFAULTS_XML.equals(webApp.getDefaultsDescriptor()))
-                    scanList.add(r.getFile());
-            }
-            catch (IOException e)
-            {
-                throw new MojoExecutionException("Problem configuring scanner for webdefaults.xml", e);
-            }
-        }
-        
-        if (webApp.getOverrideDescriptor() != null)
-        {
-            try (Resource r = Resource.newResource(webApp.getOverrideDescriptor());)
-            {
-                scanList.add(r.getFile());
-            }
-            catch (IOException e)
-            {
-                throw new MojoExecutionException("Problem configuring scanner for webdefaults.xml", e);
-            }
-        }
-        
-        
-        File jettyWebXmlFile = findJettyWebXmlFile(new File(webAppSourceDirectory,"WEB-INF"));
-        if (jettyWebXmlFile != null)
-            scanList.add(jettyWebXmlFile);
-        scanList.addAll(extraScanTargets);
-        scanList.add(project.getFile());
-        if (webApp.getTestClasses() != null)
-            scanList.add(webApp.getTestClasses());
-        if (webApp.getClasses() != null)
-        scanList.add(webApp.getClasses());
-        scanList.addAll(webApp.getWebInfLib());
-     
-        scannerListeners = new ArrayList<Scanner.BulkListener>();
-        scannerListeners.add(new Scanner.BulkListener()
-        {
-            public void filesChanged (List changes)
+            @Override
+            public void onPathWatchEvents(List<PathWatchEvent> events)
             {
                 try
                 {
-                    boolean reconfigure = changes.contains(project.getFile().getCanonicalPath());
+                    boolean reconfigure = false;
+                    if (events != null)
+                    {
+                        for (PathWatchEvent e:events)
+                        {
+                            if (e.getPath().equals(project.getFile().toPath()))
+                            {
+                                reconfigure = true;
+                                break;
+                            }
+                        }
+                    }
+
                     restartWebApp(reconfigure);
                 }
                 catch (Exception e)
@@ -502,7 +409,115 @@
     }
 
     
-    
+    public void gatherScannables() throws Exception
+    {
+        if (webApp.getDescriptor() != null)
+        {
+            Resource r = Resource.newResource(webApp.getDescriptor());
+            scanner.watch(r.getFile().toPath());
+        }
+        
+        if (webApp.getJettyEnvXml() != null)
+            scanner.watch(new File(webApp.getJettyEnvXml()).toPath());
+
+        if (webApp.getDefaultsDescriptor() != null)
+        {
+            if (!WebAppContext.WEB_DEFAULTS_XML.equals(webApp.getDefaultsDescriptor()))
+                scanner.watch(new File(webApp.getDefaultsDescriptor()).toPath());
+        }
+
+        if (webApp.getOverrideDescriptor() != null)
+        {
+            scanner.watch(new File(webApp.getOverrideDescriptor()).toPath());
+        }
+        
+        File jettyWebXmlFile = findJettyWebXmlFile(new File(webAppSourceDirectory,"WEB-INF"));
+        if (jettyWebXmlFile != null)
+        {
+            scanner.watch(jettyWebXmlFile.toPath());
+        }
+        
+        //make sure each of the war artifacts is added to the scanner
+        for (Artifact a:getWarArtifacts())
+        {
+            scanner.watch(a.getFile().toPath());
+        }
+        
+        //handle the explicit extra scan targets
+        if (scanTargets != null)
+        {
+            for (File f:scanTargets)
+            {
+                if (f.isDirectory())
+                {
+                    PathWatcher.Config config = new PathWatcher.Config(f.toPath());
+                    config.setRecurseDepth(PathWatcher.Config.UNLIMITED_DEPTH);
+                    scanner.watch(config);
+                }
+                else
+                    scanner.watch(f.toPath());
+            }
+        }
+        
+        //handle the extra scan patterns
+        if (scanTargetPatterns != null)
+        {
+            for (ScanTargetPattern p:scanTargetPatterns)
+            {
+                PathWatcher.Config config = new PathWatcher.Config(p.getDirectory().toPath());
+                config.setRecurseDepth(PathWatcher.Config.UNLIMITED_DEPTH);
+                for (String pattern:p.getExcludes())
+                    config.addExcludeGlobRelative(pattern);
+                for (String pattern:p.getIncludes())
+                    config.addIncludeGlobRelative(pattern);
+                scanner.watch(config);
+            }
+        }
+      
+
+        scanner.watch(project.getFile().toPath());
+
+        if (webApp.getTestClasses() != null)
+        {
+            PathWatcher.Config config = new PathWatcher.Config(webApp.getTestClasses().toPath());
+            config.setRecurseDepth(PathWatcher.Config.UNLIMITED_DEPTH);           
+            if (scanTestClassesPattern != null)
+            {
+                for (String p:scanTestClassesPattern.getExcludes())
+                    config.addExcludeGlobRelative(p);
+                for (String p:scanTestClassesPattern.getIncludes())
+                    config.addIncludeGlobRelative(p);
+            }
+            scanner.watch(config);
+        }
+        
+        if (webApp.getClasses() != null)
+        {
+            PathWatcher.Config config = new PathWatcher.Config(webApp.getClasses().toPath());
+            config.setRecurseDepth(PathWatcher.Config.UNLIMITED_DEPTH);
+            if (scanClassesPattern != null)
+            {
+                for (String p:scanClassesPattern.getExcludes())
+                    config.addExcludeGlobRelative(p);
+
+                for (String p:scanClassesPattern.getIncludes())
+                    config.addIncludeGlobRelative(p);
+
+            }
+            scanner.watch(config);
+        }
+
+        if (webApp.getWebInfLib() != null)
+        {
+            for (File f:webApp.getWebInfLib())
+            {
+                PathWatcher.Config config = new PathWatcher.Config(f.toPath());
+                config.setRecurseDepth(PathWatcher.Config.UNLIMITED_DEPTH);
+                scanner.watch(config);
+            }
+        }
+    }
+
     
     /** 
      * @see org.eclipse.jetty.maven.plugin.AbstractJettyMojo#restartWebApp(boolean)
@@ -511,7 +526,9 @@
     {
         getLog().info("restarting "+webApp);
         getLog().debug("Stopping webapp ...");
+        stopScanner();
         webApp.stop();
+
         getLog().debug("Reconfiguring webapp ...");
  
         checkPomConfiguration();
@@ -522,23 +539,14 @@
         if (reconfigureScanner)
         {
             getLog().info("Reconfiguring scanner after change to pom.xml ...");
-            scanList.clear();
-            if (webApp.getDescriptor() != null)
-                scanList.add(new File(webApp.getDescriptor()));
-            if (webApp.getJettyEnvXml() != null)
-                scanList.add(new File(webApp.getJettyEnvXml()));
-            scanList.addAll(extraScanTargets);
-            scanList.add(project.getFile());
-            if (webApp.getTestClasses() != null)
-                scanList.add(webApp.getTestClasses());
-            if (webApp.getClasses() != null)
-            scanList.add(webApp.getClasses());
-            scanList.addAll(webApp.getWebInfLib());
-            scanner.setScanDirs(scanList);
+            scanner.reset();
+            warArtifacts = null;
+            configureScanner();
         }
 
         getLog().debug("Restarting webapp ...");
         webApp.start();
+        startScanner();
         getLog().info("Restart completed at "+new Date().toString());
     }
     
@@ -588,8 +596,8 @@
         warArtifacts = new ArrayList<Artifact>();
         for ( Iterator<Artifact> iter = projectArtifacts.iterator(); iter.hasNext(); )
         {
-            Artifact artifact = (Artifact) iter.next();            
-            if (artifact.getType().equals("war"))
+            Artifact artifact = (Artifact) iter.next(); 
+            if (artifact.getType().equals("war") || artifact.getType().equals("zip"))
             {
                 try
                 {                  
@@ -605,13 +613,6 @@
         return warArtifacts;
     }
 
-    
-    
-    /**
-     * @param o
-     * @param warArtifacts
-     * @return
-     */
     protected Artifact getArtifactForOverlay (OverlayConfig o, List<Artifact> warArtifacts)
     {
         if (o == null || warArtifacts == null || warArtifacts.isEmpty())
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunWarExplodedMojo.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunWarExplodedMojo.java
index c3beb38..16f35dd 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunWarExplodedMojo.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunWarExplodedMojo.java
@@ -19,12 +19,12 @@
 package org.eclipse.jetty.maven.plugin;
 
 import java.io.File;
-import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
-import org.eclipse.jetty.util.Scanner;
+import org.eclipse.jetty.util.PathWatcher;
+import org.eclipse.jetty.util.PathWatcher.PathWatchEvent;
 
 /**
  * 
@@ -52,7 +52,7 @@
     /**
      * The location of the war file.
      * 
-     * @parameter expression="${project.build.directory}/${project.build.finalName}"
+     * @parameter default-value="${project.build.directory}/${project.build.finalName}"
      * @required
      */
     private File war;
@@ -96,27 +96,41 @@
      */
     public void configureScanner() throws MojoExecutionException
     {
-        scanList = new ArrayList<File>();
-        scanList.add(project.getFile());
+        scanner.watch(project.getFile().toPath());
         File webInfDir = new File(war,"WEB-INF");
-        scanList.add(new File(webInfDir, "web.xml"));
+        scanner.watch(new File(webInfDir, "web.xml").toPath());
         File jettyWebXmlFile = findJettyWebXmlFile(webInfDir);
         if (jettyWebXmlFile != null)
-            scanList.add(jettyWebXmlFile);
+            scanner.watch(jettyWebXmlFile.toPath());
         File jettyEnvXmlFile = new File(webInfDir, "jetty-env.xml");
         if (jettyEnvXmlFile.exists())
-            scanList.add(jettyEnvXmlFile);
-        scanList.add(new File(webInfDir, "classes"));
-        scanList.add(new File(webInfDir, "lib"));
+            scanner.watch(jettyEnvXmlFile.toPath());
+        
+        PathWatcher.Config classesConfig = new PathWatcher.Config(new File(webInfDir, "classes").toPath());
+        classesConfig.setRecurseDepth(PathWatcher.Config.UNLIMITED_DEPTH);
+        scanner.watch(classesConfig);
+        
+        PathWatcher.Config libConfig = new PathWatcher.Config(new File(webInfDir, "lib").toPath());
+        libConfig.setRecurseDepth(PathWatcher.Config.UNLIMITED_DEPTH);
+        scanner.watch(libConfig);   
 
-        scannerListeners = new ArrayList<Scanner.BulkListener>();
-        scannerListeners.add(new Scanner.BulkListener()
+        scanner.addListener(new PathWatcher.EventListListener()
         {
-            public void filesChanged(List changes)
+
+            @Override
+            public void onPathWatchEvents(List<PathWatchEvent> events)
             {
                 try
                 {
-                    boolean reconfigure = changes.contains(project.getFile().getCanonicalPath());
+                    boolean reconfigure = false;
+                    for (PathWatchEvent e:events)
+                    {
+                        if (e.getPath().equals(project.getFile().toPath()))
+                        {
+                            reconfigure = true;
+                            break;
+                        }
+                    }
                     restartWebApp(reconfigure);
                 }
                 catch (Exception e)
@@ -137,6 +151,7 @@
     {
         getLog().info("Restarting webapp");
         getLog().debug("Stopping webapp ...");
+        stopScanner();
         webApp.stop();
         getLog().debug("Reconfiguring webapp ...");
 
@@ -147,23 +162,13 @@
         if (reconfigureScanner)
         {
             getLog().info("Reconfiguring scanner after change to pom.xml ...");
-            scanList.clear();
-            scanList.add(project.getFile());
-            File webInfDir = new File(war,"WEB-INF");
-            scanList.add(new File(webInfDir, "web.xml"));
-            File jettyWebXmlFile = findJettyWebXmlFile(webInfDir);
-            if (jettyWebXmlFile != null)
-                scanList.add(jettyWebXmlFile);
-            File jettyEnvXmlFile = new File(webInfDir, "jetty-env.xml");
-            if (jettyEnvXmlFile.exists())
-                scanList.add(jettyEnvXmlFile);
-            scanList.add(new File(webInfDir, "classes"));
-            scanList.add(new File(webInfDir, "lib"));
-            scanner.setScanDirs(scanList);
+            scanner.reset();
+            configureScanner();
         }
 
         getLog().debug("Restarting webapp ...");
         webApp.start();
+        startScanner();
         getLog().info("Restart completed.");
     }
 
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunWarMojo.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunWarMojo.java
index b2b699b..ce24359 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunWarMojo.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunWarMojo.java
@@ -19,12 +19,12 @@
 package org.eclipse.jetty.maven.plugin;
 
 import java.io.File;
-import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
-import org.eclipse.jetty.util.Scanner;
+import org.eclipse.jetty.util.PathWatcher;
+import org.eclipse.jetty.util.PathWatcher.PathWatchEvent;
 
 /**
  * <p>
@@ -50,7 +50,7 @@
 
     /**
      * The location of the war file.
-     * @parameter expression="${project.build.directory}/${project.build.finalName}.war"
+     * @parameter default-value="${project.build.directory}/${project.build.finalName}.war"
      * @required
      */
     private File war;
@@ -100,18 +100,26 @@
      */
     public void configureScanner() throws MojoExecutionException
     {
-        scanList = new ArrayList();
-        scanList.add(project.getFile());
-        scanList.add(war);
-        
-        scannerListeners = new ArrayList();
-        scannerListeners.add(new Scanner.BulkListener()
+        scanner.watch(project.getFile().toPath());
+        scanner.watch(war.toPath());
+
+        scanner.addListener(new PathWatcher.EventListListener()
         {
-            public void filesChanged(List changes)
+
+            @Override
+            public void onPathWatchEvents(List<PathWatchEvent> events)
             {
                 try
                 {
-                    boolean reconfigure = changes.contains(project.getFile().getCanonicalPath());
+                    boolean reconfigure = false;
+                    for (PathWatchEvent e:events)
+                    {
+                        if (e.getPath().equals(project.getFile().toPath()))
+                        {
+                            reconfigure = true;
+                            break;
+                        }
+                    }
                     restartWebApp(reconfigure);
                 }
                 catch (Exception e)
@@ -132,6 +140,7 @@
     {
         getLog().info("Restarting webapp ...");
         getLog().debug("Stopping webapp ...");
+        stopScanner();
         webApp.stop();
         getLog().debug("Reconfiguring webapp ...");
 
@@ -142,14 +151,13 @@
         if (reconfigureScanner)
         {
             getLog().info("Reconfiguring scanner after change to pom.xml ...");
-            scanList.clear();
-            scanList.add(project.getFile());
-            scanList.add(war);
-            scanner.setScanDirs(scanList);
+            scanner.reset();
+            configureScanner();
         }
 
         getLog().debug("Restarting webapp ...");
         webApp.start();
+        startScanner();
         getLog().info("Restart completed.");
     }
 
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyServer.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyServer.java
deleted file mode 100644
index cab7e3e..0000000
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyServer.java
+++ /dev/null
@@ -1,156 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.maven.plugin;
-
-
-import java.io.File;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.RequestLog;
-import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.server.handler.DefaultHandler;
-import org.eclipse.jetty.server.handler.HandlerCollection;
-import org.eclipse.jetty.server.handler.RequestLogHandler;
-import org.eclipse.jetty.util.resource.Resource;
-import org.eclipse.jetty.webapp.WebAppContext;
-import org.eclipse.jetty.xml.XmlConfiguration;
-
-
-/**
- * JettyServer
- * 
- * Maven jetty plugin version of a wrapper for the Server class.
- * 
- */
-public class JettyServer extends org.eclipse.jetty.server.Server
-{ 
-    private RequestLog requestLog;
-    private ContextHandlerCollection contexts;
-    
-    
-    
-    /**
-     * 
-     */
-    public JettyServer()
-    {
-        super();
-        //make sure Jetty does not use URLConnection caches with the plugin
-        Resource.setDefaultUseCaches(false);
-    }
-
-   
-    public void setRequestLog (RequestLog requestLog)
-    {
-        this.requestLog = requestLog;
-    }
-
-    /**
-     * @see org.eclipse.jetty.server.Server#doStart()
-     */
-    public void doStart() throws Exception
-    {
-        super.doStart();
-    }
-
- 
-    /**
-     * @see org.eclipse.jetty.server.handler.HandlerCollection#addHandler(org.eclipse.jetty.server.Handler)
-     */
-    public void addWebApplication(WebAppContext webapp) throws Exception
-    {  
-        contexts.addHandler (webapp);
-    }
-
-    
-    /**
-     * Set up the handler structure to receive a webapp.
-     * Also put in a DefaultHandler so we get a nice page
-     * than a 404 if we hit the root and the webapp's
-     * context isn't at root.
-     * @throws Exception
-     */
-    public void configureHandlers () throws Exception 
-    {
-        DefaultHandler defaultHandler = new DefaultHandler();
-        RequestLogHandler requestLogHandler = new RequestLogHandler();
-        if (this.requestLog != null)
-            requestLogHandler.setRequestLog(this.requestLog);
-        
-        contexts = (ContextHandlerCollection)super.getChildHandlerByClass(ContextHandlerCollection.class);
-        if (contexts==null)
-        {   
-            contexts = new ContextHandlerCollection();
-            HandlerCollection handlers = (HandlerCollection)super.getChildHandlerByClass(HandlerCollection.class);
-            if (handlers==null)
-            {
-                handlers = new HandlerCollection();               
-                super.setHandler(handlers);                            
-                handlers.setHandlers(new Handler[]{contexts, defaultHandler, requestLogHandler});
-            }
-            else
-            {
-                handlers.addHandler(contexts);
-            }
-        }  
-    }
-
-    /**
-     * Apply xml files to server startup, passing in ourselves as the 
-     * "Server" instance.
-     * 
-     * @param files
-     * @throws Exception
-     */
-    public  void applyXmlConfigurations (List<File> files) 
-    throws Exception
-    {
-        if (files == null || files.isEmpty())
-            return;
-
-       Map<String,Object> lastMap = Collections.singletonMap("Server", (Object)this);
-
-        for ( File xmlFile : files )
-        {
-            if (PluginLog.getLog() != null)
-                PluginLog.getLog().info( "Configuring Jetty from xml configuration file = " + xmlFile.getCanonicalPath() );   
-
-
-            XmlConfiguration xmlConfiguration = new XmlConfiguration(Resource.toURL(xmlFile));
-
-            //chain ids from one config file to another
-            if (lastMap != null)
-                xmlConfiguration.getIdMap().putAll(lastMap); 
-
-            //Set the system properties each time in case the config file set a new one
-            Enumeration<?> ensysprop = System.getProperties().propertyNames();
-            while (ensysprop.hasMoreElements())
-            {
-                String name = (String)ensysprop.nextElement();
-                xmlConfiguration.getProperties().put(name,System.getProperty(name));
-            }
-            xmlConfiguration.configure(); 
-            lastMap = xmlConfiguration.getIdMap();
-        }
-    }
-}
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyWebAppContext.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyWebAppContext.java
index 0d56f05..0a2dd8c 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyWebAppContext.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyWebAppContext.java
@@ -21,6 +21,7 @@
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.lang.reflect.Method;
 import java.net.MalformedURLException;
 import java.util.ArrayList;
 import java.util.EventListener;
@@ -39,6 +40,7 @@
 import org.eclipse.jetty.servlet.FilterMapping;
 import org.eclipse.jetty.servlet.ServletHolder;
 import org.eclipse.jetty.servlet.ServletMapping;
+import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.URIUtil;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
@@ -70,23 +72,25 @@
     private static final String DEFAULT_CONTAINER_INCLUDE_JAR_PATTERN = ".*/javax.servlet-[^/]*\\.jar$|.*/servlet-api-[^/]*\\.jar$|.*javax.servlet.jsp.jstl-[^/]*\\.jar|.*taglibs-standard-impl-.*\\.jar";
     private static final String WEB_INF_CLASSES_PREFIX = "/WEB-INF/classes";
     private static final String WEB_INF_LIB_PREFIX = "/WEB-INF/lib";
+    
+    
+    public  static final String[] DEFAULT_CONFIGURATION_CLASSES = {
+                                                           "org.eclipse.jetty.maven.plugin.MavenWebInfConfiguration",
+                                                           "org.eclipse.jetty.webapp.WebXmlConfiguration",
+                                                           "org.eclipse.jetty.webapp.MetaInfConfiguration",
+                                                           "org.eclipse.jetty.webapp.FragmentConfiguration",
+                                                           "org.eclipse.jetty.plus.webapp.EnvConfiguration",
+                                                           "org.eclipse.jetty.plus.webapp.PlusConfiguration",
+                                                           "org.eclipse.jetty.annotations.AnnotationConfiguration",
+                                                           "org.eclipse.jetty.webapp.JettyWebXmlConfiguration"
+                                                           };
 
-    private final Configuration[] _defaultConfigurations = {
-                                                             new MavenWebInfConfiguration(),
-                                                             new WebXmlConfiguration(),
-                                                             new MetaInfConfiguration(),
-                                                             new FragmentConfiguration(),
-                                                             new EnvConfiguration(),
-                                                             new PlusConfiguration(),
-                                                             new AnnotationConfiguration(),
-                                                             new JettyWebXmlConfiguration()
-                                                            };
 
-    private final Configuration[] _quickStartConfigurations = {
-                                                                new MavenQuickStartConfiguration(),
-                                                                new EnvConfiguration(),
-                                                                new PlusConfiguration(),
-                                                                new JettyWebXmlConfiguration()
+    private final String[] QUICKSTART_CONFIGURATION_CLASSES = {
+                                                                "org.eclipse.jetty.maven.plugin.MavenQuickStartConfiguration",
+                                                                "org.eclipse.jetty.plus.webapp.EnvConfiguration",
+                                                                "org.eclipse.jetty.plus.webapp.PlusConfiguration",
+                                                                "org.eclipse.jetty.webapp.JettyWebXmlConfiguration"
                                                                };
 
     private File _classes = null;
@@ -98,6 +102,7 @@
     private String _jettyEnvXml;
     private List<Overlay> _overlays;
     private Resource _quickStartWebXml;
+   
     
  
     
@@ -129,7 +134,7 @@
    
 
   
-
+    /* ------------------------------------------------------------ */
     public JettyWebAppContext ()
     throws Exception
     {
@@ -137,81 +142,92 @@
         // Turn off copyWebInf option as it is not applicable for plugin.
         super.setCopyWebInf(false);
     }
+    
+    /* ------------------------------------------------------------ */
     public void setContainerIncludeJarPattern(String pattern)
     {
         _containerIncludeJarPattern = pattern;
     }
     
+    /* ------------------------------------------------------------ */
     public String getContainerIncludeJarPattern()
     {
         return _containerIncludeJarPattern;
     }
     
-    
+    /* ------------------------------------------------------------ */
     public String getWebInfIncludeJarPattern()
     {
         return _webInfIncludeJarPattern;
     }
+    
+    /* ------------------------------------------------------------ */
     public void setWebInfIncludeJarPattern(String pattern)
     {
         _webInfIncludeJarPattern = pattern;
     }
    
-   
+    /* ------------------------------------------------------------ */
     public List<File> getClassPathFiles()
     {
         return this._classpathFiles;
     }
     
-    
+    /* ------------------------------------------------------------ */
     public void setJettyEnvXml (String jettyEnvXml)
     {
         this._jettyEnvXml = jettyEnvXml;
     }
     
+    /* ------------------------------------------------------------ */
     public String getJettyEnvXml()
     {
         return this._jettyEnvXml;
     }
 
-   
+    /* ------------------------------------------------------------ */
     public void setClasses(File dir)
     {
         _classes = dir;
     }
     
+    /* ------------------------------------------------------------ */
     public File getClasses()
     {
         return _classes;
     }
     
+    /* ------------------------------------------------------------ */
     public void setWebInfLib (List<File> jars)
     {
         _webInfJars.addAll(jars);
     }
     
-    
+    /* ------------------------------------------------------------ */
     public void setTestClasses (File dir)
     {
         _testClasses = dir;
     }
     
-    
+    /* ------------------------------------------------------------ */
     public File getTestClasses ()
     {
         return _testClasses;
     }
     
+    
+    /* ------------------------------------------------------------ */
     /**
      * Ordered list of wars to overlay on top of the current project. The list
      * may contain an overlay that represents the current project.
-     * @param overlays
+     * @param overlays the list of overlays
      */
     public void setOverlays (List<Overlay> overlays)
     {
         _overlays = overlays;
     }
     
+    /* ------------------------------------------------------------ */
     public List<Overlay> getOverlays()
     {
         return _overlays;
@@ -230,7 +246,13 @@
     }
     
     /* ------------------------------------------------------------ */
-    public void setQuickStartWebDescriptor (Resource quickStartWebXml)
+    public void setQuickStartWebDescriptor (String quickStartWebXml) throws Exception
+    {
+        setQuickStartWebDescriptor(Resource.newResource(quickStartWebXml));
+    }
+    
+    /* ------------------------------------------------------------ */
+    protected void setQuickStartWebDescriptor (Resource quickStartWebXml)
     {
         _quickStartWebXml = quickStartWebXml;
     }
@@ -252,24 +274,27 @@
         List<String> resources = new ArrayList<String>();
         for (String rl:resourceBases)
         {
-            String[] rs = rl.split(" *, *");
+            String[] rs = StringUtil.csvSplit(rl);
             for (String r:rs)
                 resources.add(r);
         }
         
         setBaseResource(new ResourceCollection(resources.toArray(new String[resources.size()])));
     }
-
+    
+    /* ------------------------------------------------------------ */
     public List<File> getWebInfLib()
     {
         return _webInfJars;
     }
     
+    /* ------------------------------------------------------------ */
     public void setGenerateQuickStart (boolean quickStart)
     {
         _isGenerateQuickStart = quickStart;
     }
     
+    /* ------------------------------------------------------------ */
     public boolean isGenerateQuickStart()
     {
         return _isGenerateQuickStart;
@@ -277,7 +302,7 @@
     
    
     
-    
+    /* ------------------------------------------------------------ */
     @Override
     protected void startWebapp() throws Exception
     {
@@ -293,35 +318,40 @@
             }
         }
         else
+        {
+            if (LOG.isDebugEnabled()) { LOG.debug("Calling full start on webapp");}
             super.startWebapp();
+        }
     }
     
+    /* ------------------------------------------------------------ */
+    @Override
+    protected void stopWebapp() throws Exception
+    {
+        if (isGenerateQuickStart())
+            return;
 
+        if (LOG.isDebugEnabled()) { LOG.debug("Calling stop of fully started webapp");}
+        super.stopWebapp();
+    }
+    
+    /* ------------------------------------------------------------ */
     @Override
     public void doStart () throws Exception
     {
         //choose if this will be a quickstart or normal start
         if (!isGenerateQuickStart() && getQuickStartWebDescriptor() != null)
-            setConfigurations(_quickStartConfigurations);
-        else
         {
-            setConfigurations(_defaultConfigurations);
+            setConfigurationClasses(QUICKSTART_CONFIGURATION_CLASSES);
+        }
+        else
+        { 
             if (isGenerateQuickStart())
             {
                 _preconfigProcessor = new PreconfigureDescriptorProcessor();
                 getMetaData().addDescriptorProcessor(_preconfigProcessor);
             }
         }
-        
-
-        //inject configurations with config from maven plugin    
-        for (Configuration c:getConfigurations())
-        {
-            if (c instanceof EnvConfiguration && getJettyEnvXml() != null)
-                ((EnvConfiguration)c).setJettyEnvXml(Resource.toURL(new File(getJettyEnvXml())));
-            else if (c instanceof MavenQuickStartConfiguration && getQuickStartWebDescriptor() != null)
-                ((MavenQuickStartConfiguration)c).setQuickStartWebXml(getQuickStartWebDescriptor());         
-        }
 
         //Set up the pattern that tells us where the jars are that need scanning
 
@@ -361,10 +391,31 @@
                 _webInfJarMap.put(fileName, file);
         }
         
+        //check for CDI
+        initCDI();
+        
         // CHECK setShutdown(false);
         super.doStart();
     }
-     
+    
+    
+    @Override
+    protected void loadConfigurations() throws Exception
+    {
+        super.loadConfigurations();
+        
+        //inject configurations with config from maven plugin    
+        for (Configuration c:getConfigurations())
+        {
+            if (c instanceof EnvConfiguration && getJettyEnvXml() != null)
+                ((EnvConfiguration)c).setJettyEnvXml(Resource.toURL(new File(getJettyEnvXml())));
+            else if (c instanceof MavenQuickStartConfiguration && getQuickStartWebDescriptor() != null)
+                ((MavenQuickStartConfiguration)c).setQuickStartWebXml(getQuickStartWebDescriptor());         
+        }
+    }
+
+
+    /* ------------------------------------------------------------ */
     public void doStop () throws Exception
     { 
         if (_classpathFiles != null)
@@ -385,8 +436,9 @@
         // CHECK setShutdown(true);
         //just wait a little while to ensure no requests are still being processed
         Thread.currentThread().sleep(500L);
+
         super.doStop();
-        
+
         //remove all listeners, servlets and filters. This is because we will re-apply
         //any context xml file, which means they would potentially be added multiple times.
         setEventListeners(new EventListener[0]);
@@ -395,7 +447,9 @@
         getServletHandler().setServlets(new ServletHolder[0]);
         getServletHandler().setServletMappings(new ServletMapping[0]);
     }
-
+    
+    
+    /* ------------------------------------------------------------ */
     @Override
     public Resource getResource(String uriInContext) throws MalformedURLException
     {
@@ -469,7 +523,9 @@
         }
         return resource;
     }
-
+    
+    
+    /* ------------------------------------------------------------ */
     @Override
     public Set<String> getResourcePaths(String path)
     {
@@ -506,7 +562,7 @@
         return paths;
     }
     
-    
+    /* ------------------------------------------------------------ */
     public String addPattern (String s, String pattern)
     {
         if (s == null)
@@ -523,4 +579,29 @@
         
         return s;
     }
+    
+    
+    /* ------------------------------------------------------------ */
+    public void initCDI()
+    {
+        Class cdiInitializer = null;
+        try
+        {
+            cdiInitializer = Thread.currentThread().getContextClassLoader().loadClass("org.eclipse.jetty.cdi.servlet.JettyWeldInitializer");
+            Method initWebAppMethod = cdiInitializer.getMethod("initWebApp", new Class[]{WebAppContext.class});
+            initWebAppMethod.invoke(null, new Object[]{this});
+        }
+        catch (ClassNotFoundException e)
+        {
+            LOG.debug("o.e.j.cdi.servlet.JettyWeldInitializer not found, no cdi integration available");
+        }
+        catch (NoSuchMethodException e)
+        {
+            LOG.warn("o.e.j.cdi.servlet.JettyWeldInitializer.initWebApp() not found, no cdi integration available");
+        }
+        catch (Exception e)
+        {
+           LOG.warn("Problem initializing cdi", e);
+        }
+    }
 }
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenServerConnector.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenServerConnector.java
index acfa1d8..5cd754e 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenServerConnector.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenServerConnector.java
@@ -47,6 +47,8 @@
  */
 public class MavenServerConnector extends AbstractLifeCycle implements Connector
 {
+    public static String PORT_SYSPROPERTY = "jetty.http.port";
+    
     public static final int DEFAULT_PORT = 8080;
     public static final String DEFAULT_PORT_STR = String.valueOf(DEFAULT_PORT);
     public static final int DEFAULT_MAX_IDLE_TIME = 30000;
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenWebInfConfiguration.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenWebInfConfiguration.java
index 909402b..578e15a 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenWebInfConfiguration.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenWebInfConfiguration.java
@@ -40,8 +40,7 @@
  * MavenWebInfConfiguration
  * 
  * WebInfConfiguration to take account of overlaid wars expressed as project dependencies and
- * potentiall configured via the maven-war-plugin.
- *
+ * potential configured via the maven-war-plugin.
  */
 public class MavenWebInfConfiguration extends WebInfConfiguration
 {
@@ -51,9 +50,6 @@
     protected static int COUNTER = 0; 
     protected Resource _originalResourceBase;
     protected List<Resource>  _unpackedOverlayResources;
-  
-    
-    
     
     /** 
      * @see org.eclipse.jetty.webapp.WebInfConfiguration#configure(org.eclipse.jetty.webapp.WebAppContext)
@@ -192,7 +188,7 @@
      * Get the jars to examine from the files from which we have
      * synthesized the classpath. Note that the classpath is not
      * set at this point, so we cannot get them from the classpath.
-     * @param context
+     * @param context the web app context
      * @return the list of jars found
      */
     @Override
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/OverlayConfig.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/OverlayConfig.java
index 287ba13..7436b72 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/OverlayConfig.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/OverlayConfig.java
@@ -25,11 +25,10 @@
 import java.util.List;
 
 import org.codehaus.plexus.util.xml.Xpp3Dom;
+import org.eclipse.jetty.util.StringUtil;
 
 /**
  * OverlayConfig
- *
- *
  */
 public class OverlayConfig
 {
@@ -48,7 +47,7 @@
     {
         if (fmt == null)
             return;
-        String[] atoms = fmt.split(",");
+        String[] atoms = StringUtil.csvSplit(fmt);
         for (int i=0;i<atoms.length;i++)
         {
             String s = atoms[i].trim();
@@ -270,7 +269,7 @@
      * @param gid Artifact groupId
      * @param aid Artifact artifactId
      * @param cls Artifact classifier
-     * @return
+     * @return true if matched
      */
     public boolean matchesArtifact (String gid, String aid, String cls)
     {
@@ -285,9 +284,9 @@
     /**
      * Check if this overlay configuration matches an Artifact's info
      * 
-     * @param gid
-     * @param aid
-     * @return
+     * @param gid the group id
+     * @param aid the artifact id
+     * @return true if matched
      */
     public boolean matchesArtifact (String gid, String aid)
     {
@@ -298,9 +297,6 @@
         return false;
     }
     
-    
-    
-    
     public String toString()
     {
         StringBuffer strbuff = new StringBuffer();
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/ScanPattern.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/ScanPattern.java
new file mode 100644
index 0000000..586cd1c
--- /dev/null
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/ScanPattern.java
@@ -0,0 +1,53 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.maven.plugin;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * ScanPattern
+ *
+ * A pattern of includes and excludes.
+ */
+public class ScanPattern
+{
+    private List<String> _includes = Collections.emptyList();
+    private List<String> _excludes = Collections.emptyList();
+    
+    public void setIncludes (List<String> includes)
+    {
+        _includes= includes;
+    }
+    
+    public void setExcludes(List<String> excludes)
+    {
+        _excludes = excludes;
+    }
+    
+    public List<String> getIncludes()
+    {
+        return _includes;
+    }
+    
+    public List<String> getExcludes()
+    {
+        return _excludes;
+    }
+}
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/ScanTargetPattern.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/ScanTargetPattern.java
index d6c4d51..d019fd3 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/ScanTargetPattern.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/ScanTargetPattern.java
@@ -46,8 +46,7 @@
 public class ScanTargetPattern
 {
     private File _directory;
-    private List _includes = Collections.EMPTY_LIST;
-    private List _excludes = Collections.EMPTY_LIST;
+    private ScanPattern _pattern;
 
     /**
      * @return the _directory
@@ -65,24 +64,28 @@
         this._directory = directory;
     }
     
-    public void setIncludes (List includes)
+    public void setIncludes (List<String> includes)
     {
-        _includes= includes;
+        if (_pattern == null)
+            _pattern = new ScanPattern();
+        _pattern.setIncludes(includes);
     }
     
-    public void setExcludes(List excludes)
+    public void setExcludes(List<String> excludes)
     {
-        _excludes = excludes;
+        if (_pattern == null)
+            _pattern = new ScanPattern();
+        _pattern.setExcludes(excludes);
     }
     
-    public List getIncludes()
+    public List<String> getIncludes()
     {
-        return _includes;
+        return (_pattern == null? Collections.emptyList() : _pattern.getIncludes());
     }
     
-    public List getExcludes()
+    public List<String> getExcludes()
     {
-        return _excludes;
+        return (_pattern == null? Collections.emptyList() : _pattern.getExcludes());
     }
 
 }
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/SelectiveJarResource.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/SelectiveJarResource.java
index 11df37a..a10e972 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/SelectiveJarResource.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/SelectiveJarResource.java
@@ -52,30 +52,20 @@
     public static final List<String> DEFAULT_INCLUDES = Arrays.asList(new String[]{"**"});// No includes supplied, so set it to 'matches all'
     public static final List<String> DEFAULT_EXCLUDES = Collections.emptyList(); //No includes, set to no exclusions
 
-
     List<String> _includes = null;
     List<String> _excludes = null;
     boolean _caseSensitive = false;
     
-
-    /**
-     * @param url
-     */
     public SelectiveJarResource(URL url)
     {
         super(url);
     }
   
-    /**
-     * @param url
-     * @param useCaches
-     */
     public SelectiveJarResource(URL url, boolean useCaches)
     {
         super(url, useCaches);
     }
     
-    
     public void setCaseSensitive (boolean caseSensitive)
     {
         _caseSensitive = caseSensitive;
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/ServerSupport.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/ServerSupport.java
new file mode 100644
index 0000000..407a17f
--- /dev/null
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/ServerSupport.java
@@ -0,0 +1,218 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.maven.plugin;
+
+import java.io.File;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jetty.security.LoginService;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.RequestLog;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.ContextHandlerCollection;
+import org.eclipse.jetty.server.handler.DefaultHandler;
+import org.eclipse.jetty.server.handler.HandlerCollection;
+import org.eclipse.jetty.server.handler.RequestLogHandler;
+import org.eclipse.jetty.util.resource.Resource;
+import org.eclipse.jetty.webapp.Configuration;
+import org.eclipse.jetty.webapp.WebAppContext;
+import org.eclipse.jetty.xml.XmlConfiguration;
+
+/**
+ * ServerSupport
+ *
+ * Helps configure the Server instance.
+ * 
+ */
+public class ServerSupport
+{
+    
+    public static void configureDefaultConfigurationClasses (Server server)
+    {
+        server.setAttribute(Configuration.ATTR, JettyWebAppContext.DEFAULT_CONFIGURATION_CLASSES);
+    }
+    
+    
+    /**
+     * Set up the handler structure to receive a webapp.
+     * Also put in a DefaultHandler so we get a nice page
+     * than a 404 if we hit the root and the webapp's
+     * context isn't at root.
+     * @param server the server
+     * @param requestLog the request log
+     * @throws Exception if unable to configure the handlers
+     */
+    public static void configureHandlers (Server server, RequestLog requestLog) throws Exception 
+    {
+        if (server == null)
+            throw new IllegalArgumentException ("Server is null");
+
+        DefaultHandler defaultHandler = new DefaultHandler();
+        RequestLogHandler requestLogHandler = new RequestLogHandler();
+        if (requestLog != null)
+            requestLogHandler.setRequestLog(requestLog);
+
+        ContextHandlerCollection contexts = findContextHandlerCollection(server);
+        if (contexts == null)
+        {   
+            contexts = new ContextHandlerCollection();
+            HandlerCollection handlers = (HandlerCollection)server.getChildHandlerByClass(HandlerCollection.class);
+            if (handlers == null)
+            {
+                handlers = new HandlerCollection();               
+                server.setHandler(handlers);                            
+                handlers.setHandlers(new Handler[]{contexts, defaultHandler, requestLogHandler});
+            }
+            else
+            {
+                handlers.addHandler(contexts);
+            }
+        }  
+    }
+    
+
+    /**
+     * Configure at least one connector for the server
+     * 
+     * @param server the server
+     * @param connector the connector
+     */
+    public static void configureConnectors (Server server, Connector connector)
+    {
+        if (server == null)
+            throw new IllegalArgumentException("Server is null");
+        
+        //if a connector is provided, use it
+        if (connector != null)
+        {
+            server.addConnector(connector);
+            return;
+        }
+        
+        
+
+        // if the user hasn't configured the connectors in a jetty.xml file so use a default one
+        Connector[] connectors = server.getConnectors();
+        if (connectors == null || connectors.length == 0)
+        {
+            //Make a new default connector
+            MavenServerConnector tmp = new MavenServerConnector();               
+            //use any jetty.http.port settings provided
+            String port = System.getProperty(MavenServerConnector.PORT_SYSPROPERTY, System.getProperty("jetty.port", MavenServerConnector.DEFAULT_PORT_STR));
+            tmp.setPort(Integer.parseInt(port.trim()));
+            tmp.setServer(server);
+            server.setConnectors(new Connector[] {tmp});
+        }
+    }
+    
+    
+    /**
+     * Set up any security LoginServices provided.
+     * 
+     * @param server the server
+     * @param loginServices the login services
+     */
+    public static void configureLoginServices (Server server, LoginService[] loginServices)
+    {
+        if (server == null)
+            throw new IllegalArgumentException ("Server is null");
+
+        if (loginServices != null)
+        {
+            for (LoginService loginService:loginServices)
+            {
+                PluginLog.getLog().debug(loginService.getClass().getName() + ": "+ loginService.toString());
+                server.addBean(loginService);
+            }
+        }
+    }
+    
+    public static void addWebApplication(Server server, WebAppContext webapp) throws Exception
+    {  
+        if (server == null)
+            throw new IllegalArgumentException ("Server is null");
+       ContextHandlerCollection contexts = findContextHandlerCollection(server);
+       if (contexts == null)
+           throw new IllegalStateException("ContextHandlerCollection is null");
+       contexts.addHandler (webapp);
+    }
+    
+
+    public static ContextHandlerCollection findContextHandlerCollection (Server server)
+    {
+        if (server == null)
+            return null;
+
+        return (ContextHandlerCollection)server.getChildHandlerByClass(ContextHandlerCollection.class);
+    }
+
+
+    /**
+     * Apply xml files to server startup, passing in ourselves as the 
+     * "Server" instance.
+     * 
+     * @param server the server to apply the xml to
+     * @param files the list of xml files
+     * @return the Server implementation, after the xml is applied
+     * @throws Exception if unable to apply the xml configuration
+     */
+    public static Server applyXmlConfigurations (Server server, List<File> files) 
+    throws Exception
+    {
+        if (files == null || files.isEmpty())
+            return server;
+
+        Map<String,Object> lastMap = new HashMap<String,Object>();
+        
+        if (server != null)
+            lastMap.put("Server", server);
+     
+
+        for ( File xmlFile : files )
+        {
+            if (PluginLog.getLog() != null)
+                PluginLog.getLog().info( "Configuring Jetty from xml configuration file = " + xmlFile.getCanonicalPath() );   
+
+
+            XmlConfiguration xmlConfiguration = new XmlConfiguration(Resource.toURL(xmlFile));
+
+            //chain ids from one config file to another
+            if (lastMap != null)
+                xmlConfiguration.getIdMap().putAll(lastMap); 
+
+            //Set the system properties each time in case the config file set a new one
+            Enumeration<?> ensysprop = System.getProperties().propertyNames();
+            while (ensysprop.hasMoreElements())
+            {
+                String name = (String)ensysprop.nextElement();
+                xmlConfiguration.getProperties().put(name,System.getProperty(name));
+            }
+            xmlConfiguration.configure(); 
+            lastMap = xmlConfiguration.getIdMap();
+        }
+        
+        return (Server)lastMap.get("Server");
+    }
+
+}
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/Starter.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/Starter.java
index 7240449..a5b9453 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/Starter.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/Starter.java
@@ -31,10 +31,11 @@
 import java.util.Set;
 import java.util.TreeMap;
 
-import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ShutdownMonitor;
 import org.eclipse.jetty.server.handler.HandlerCollection;
+import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.resource.Resource;
@@ -44,20 +45,16 @@
 
 
 /**
- * Starter
- * 
- * Class which is exec'ed to create a new jetty process. Used by the JettyRunForked mojo.
- *
+ * Starter Class which is exec'ed to create a new jetty process. Used by the JettyRunForked mojo.
  */
 public class Starter
 { 
-    public static final String PORT_SYSPROPERTY = "jetty.port";
     private static final Logger LOG = Log.getLogger(Starter.class);
 
     private List<File> jettyXmls; // list of jetty.xml config files to apply - Mandatory
     private File contextXml; //name of context xml file to configure the webapp - Mandatory
 
-    private JettyServer server = new JettyServer();
+    private Server server;
     private JettyWebAppContext webApp;
 
     
@@ -85,7 +82,7 @@
         {
             if (csv != null && !"".equals(csv))
             {
-                String[] atoms = csv.split(",");
+                String[] atoms = StringUtil.csvSplit(csv);
                 if (atoms.length >= 3)
                 {
                     gid = atoms[0].trim();
@@ -115,41 +112,23 @@
     
     
     
-    /**
-     * @throws Exception
-     */
     public void configureJetty () throws Exception
     {
         LOG.debug("Starting Jetty Server ...");
-
+        Resource.setDefaultUseCaches(false);
+        
         //apply any configs from jetty.xml files first 
         applyJettyXml ();
 
-        // if the user hasn't configured a connector in the jetty.xml
-        //then use a default
-        Connector[] connectors = this.server.getConnectors();
-        if (connectors == null|| connectors.length == 0)
-        {
-            //if a SystemProperty -Djetty.port=<portnum> has been supplied, use that as the default port
-            MavenServerConnector httpConnector = new MavenServerConnector();
-            httpConnector.setServer(this.server);
-            String tmp = System.getProperty(PORT_SYSPROPERTY, MavenServerConnector.DEFAULT_PORT_STR);
-            httpConnector.setPort(Integer.parseInt(tmp.trim()));
-            connectors = new Connector[] {httpConnector};
-            this.server.setConnectors(connectors);
-        }
-
-        //check that everything got configured, and if not, make the handlers
-        HandlerCollection handlers = (HandlerCollection) server.getChildHandlerByClass(HandlerCollection.class);
-        if (handlers == null)
-        {
-            handlers = new HandlerCollection();
-            server.setHandler(handlers);
-        }
+        //ensure there's a connector
+        ServerSupport.configureConnectors(server, null);
 
         //check if contexts already configured, create if not
-        this.server.configureHandlers();
-
+        ServerSupport.configureHandlers(server, null);
+        
+        //Set up list of default Configurations to apply to a webapp
+        ServerSupport.configureDefaultConfigurationClasses(server);
+        
         webApp = new JettyWebAppContext();
         
         //configure webapp from properties file describing unassembled webapp
@@ -176,7 +155,7 @@
             xmlConfiguration.configure(webApp);
         }
 
-        this.server.addWebApplication(webApp);
+        ServerSupport.addWebApplication(server, webApp);
 
         if(stopPort>0 && stopKey!=null)
         {
@@ -187,10 +166,6 @@
         }
     }
     
-    
-    /**
-     * @throws Exception
-     */
     public void configureWebApp ()
     throws Exception
     {
@@ -226,7 +201,7 @@
         str = (String)props.getProperty("base.dirs");
         if (str != null && !"".equals(str.trim()))
         {
-            ResourceCollection bases = new ResourceCollection(str.split(","));
+            ResourceCollection bases = new ResourceCollection(StringUtil.csvSplit(str));
             webApp.setWar(null);
             webApp.setBaseResource(bases);
         }
@@ -235,7 +210,7 @@
         str = (String)props.get("base.dirs.orig");
         if (str != null && !"".equals(str.trim()))
         {
-            ResourceCollection bases = new ResourceCollection(str.split(","));
+            ResourceCollection bases = new ResourceCollection(StringUtil.csvSplit(str));
             webApp.setAttribute ("org.eclipse.jetty.resources.originalBases", bases);
         }
         
@@ -331,7 +306,7 @@
         if (str != null && !"".equals(str.trim()))
         {
             List<File> jars = new ArrayList<File>();
-            String[] names = str.split(",");
+            String[] names = StringUtil.csvSplit(str);
             for (int j=0; names != null && j < names.length; j++)
                 jars.add(new File(names[j].trim()));
             webApp.setWebInfLib(jars);
@@ -339,10 +314,6 @@
         
     }
 
-    /**
-     * @param args
-     * @throws Exception
-     */
     public void getConfiguration (String[] args)
     throws Exception
     {
@@ -360,7 +331,7 @@
             if ("--jetty-xml".equals(args[i]))
             {
                 jettyXmls = new ArrayList<File>();
-                String[] names = args[++i].split(",");
+                String[] names = StringUtil.csvSplit(args[++i]);
                 for (int j=0; names!= null && j < names.length; j++)
                 {
                     jettyXmls.add(new File(names[j].trim()));
@@ -393,9 +364,6 @@
     }
 
 
-    /**
-     * @throws Exception
-     */
     public void run() throws Exception
     {
         LOG.info("Started Jetty Server");
@@ -403,18 +371,12 @@
     }
 
     
-    /**
-     * @throws Exception
-     */
     public void join () throws Exception
     {
         server.join();
     }
     
     
-    /**
-     * @param e
-     */
     public void communicateStartupResult (Exception e)
     {
         if (token != null)
@@ -429,22 +391,21 @@
     
     /**
      * Apply any jetty xml files given
-     * @throws Exception
+     * @throws Exception if unable to apply the xml
      */
     public void applyJettyXml() throws Exception
     {
-        if (jettyXmls == null)
-            return;
-        this.server.applyXmlConfigurations(jettyXmls);
+        Server tmp = ServerSupport.applyXmlConfigurations(server, jettyXmls);
+        if (server == null)
+            server = tmp;
+        
+        if (server == null)
+            server = new Server();
     }
 
 
 
 
-    /**
-     * @param handler
-     * @param handlers
-     */
     protected void prependHandler (Handler handler, HandlerCollection handlers)
     {
         if (handler == null || handlers == null)
@@ -459,11 +420,6 @@
     
     
     
-    /**
-     * @param c
-     * @param wars
-     * @return
-     */
     protected Artifact getArtifactForOverlayConfig (OverlayConfig c, List<Artifact> wars)
     {
         if (wars == null || wars.isEmpty() || c == null)
@@ -489,7 +445,7 @@
     {
         if (csv == null || "".equals(csv.trim()))
             return null;
-        String[] atoms = csv.split(",");
+        String[] atoms = StringUtil.csvSplit(csv);
         List<String> list = new ArrayList<String>();
         for (String a:atoms)
         {
@@ -498,11 +454,6 @@
         return list;
     }
     
-    
-    
-    /**
-     * @param args
-     */
     public static final void main(String[] args)
     {
         if (args == null)
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/WarPluginInfo.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/WarPluginInfo.java
index f939a22..0dbb2c6 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/WarPluginInfo.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/WarPluginInfo.java
@@ -28,12 +28,11 @@
 import org.apache.maven.model.Plugin;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.util.xml.Xpp3Dom;
-
-
+import org.eclipse.jetty.util.StringUtil;
 
 /**
  * WarPluginInfo
- *
+ * <p>
  * Information about the maven-war-plugin contained in the pom
  */
 public class WarPluginInfo
@@ -45,10 +44,6 @@
     private List<OverlayConfig> _overlayConfigs;
     
     
-    
-    /**
-     * @param project
-     */
     public WarPluginInfo (MavenProject project)
     {
         _project = project;
@@ -59,7 +54,7 @@
     
     /**
      * Find the maven-war-plugin, if one is configured
-     * @return
+     * @return the plugin
      */
     public Plugin getPlugin()
     {
@@ -86,7 +81,7 @@
 
     /**
      * Get value of dependentWarIncludes for maven-war-plugin
-     * @return
+     * @return the list of dependent war includes
      */
     public List<String> getDependentMavenWarIncludes()
     {
@@ -105,7 +100,7 @@
             if (node == null)
                 return null;
             String val = node.getValue();
-            _dependentMavenWarIncludes = Arrays.asList(val.split(",")); 
+            _dependentMavenWarIncludes = StringUtil.csvSplit(null,val,0,val.length());
         }
         return _dependentMavenWarIncludes;
     }
@@ -115,7 +110,7 @@
     
     /**
      * Get value of dependentWarExcludes for maven-war-plugin
-     * @return
+     * @return the list of dependent war excludes
      */
     public List<String> getDependentMavenWarExcludes()
     {
@@ -134,7 +129,7 @@
             if (node == null)
                 return null;
             String val = node.getValue();
-            _dependentMavenWarExcludes = Arrays.asList(val.split(","));
+            _dependentMavenWarExcludes = StringUtil.csvSplit(null,val,0,val.length());
         }
         return _dependentMavenWarExcludes;
     }
@@ -145,7 +140,7 @@
     /**
      * Get config for any overlays that have been declared for the maven-war-plugin.
      * 
-     * @return
+     * @return the list of overlay configs
      */
     public List<OverlayConfig> getMavenWarOverlayConfigs ()
     {
diff --git a/jetty-monitor/pom.xml b/jetty-monitor/pom.xml
index f92a49b..f02b3f7 100644
--- a/jetty-monitor/pom.xml
+++ b/jetty-monitor/pom.xml
@@ -19,7 +19,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-monitor</artifactId>
@@ -32,52 +32,6 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-                <Import-Package>javax.management.*,*</Import-Package>
-              </instructions>
-            </configuration>
-           </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <!--
-        Required for OSGI
-        -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
         <configuration>
diff --git a/jetty-monitor/src/main/config/etc/jetty-monitor.xml b/jetty-monitor/src/main/config/etc/jetty-monitor.xml
index 61270b5..a8f6633 100644
--- a/jetty-monitor/src/main/config/etc/jetty-monitor.xml
+++ b/jetty-monitor/src/main/config/etc/jetty-monitor.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
   <!-- Create Thread Monitor, and add to the Server as a lifecycle -->
@@ -13,15 +13,15 @@
         <!-- To enable logging CPU utilization for threads above specified threshold, -->
         <!-- uncomment the following lines, changing log interval (in milliseconds)  -->
         <!-- and log threshold (in percent) as desired.                              -->
-        <!-- 
+        <!--
         <Set name="logInterval">10000</Set>
         <Set name="logThreshold">1</Set>
         -->
-        
+
         <!-- To enable detail dump of the server whenever a thread is detected as spinning, -->
         <!-- uncomment the following lines. -->
         <!--
-        <Set name="dumpable"><Ref id="Server"/></Set>
+        <Set name="dumpable"><Ref refid="Server"/></Set>
         -->
       </New>
     </Arg>
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/JMXMonitor.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/JMXMonitor.java
index 11c996c..4858118 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/JMXMonitor.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/JMXMonitor.java
@@ -29,10 +29,9 @@
 import org.eclipse.jetty.monitor.jmx.ServiceConnection;
 import org.eclipse.jetty.xml.XmlConfiguration;
 
-/* ------------------------------------------------------------ */
 /**
  * JMXMonitor
- *
+ * <p>
  * Performs monitoring of the values of the attributes of MBeans
  * and executes specified actions as well as sends notifications
  * of the specified events that have occurred.
@@ -120,7 +119,7 @@
      * Retrieves a connection to JMX service
      *
      * @return server connection
-     * @throws IOException
+     * @throws IOException if unable to obtain server connection
      */
     public static MBeanServerConnection getServiceConnection()
         throws IOException
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/ThreadMonitor.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/ThreadMonitor.java
index 98042e9..cdbaac4 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/ThreadMonitor.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/ThreadMonitor.java
@@ -60,7 +60,7 @@
     /**
      * Instantiates a new thread monitor.
      *
-     * @throws Exception
+     * @throws Exception if unable to instantiate thread monitor
      */
     public ThreadMonitor() throws Exception
     {
@@ -72,7 +72,7 @@
      * Instantiates a new thread monitor.
      *
      * @param intervalMs scan interval
-     * @throws Exception
+     * @throws Exception if unable to instantiate thread monitor
      */
     public ThreadMonitor(int intervalMs) throws Exception
     {
@@ -85,7 +85,7 @@
      *
      * @param intervalMs scan interval
      * @param threshold busy threshold
-     * @throws Exception
+     * @throws Exception if unable to instantiate thread monitor
      */
     public ThreadMonitor(int intervalMs, int threshold) throws Exception
     {
@@ -99,7 +99,7 @@
      * @param intervalMs scan interval
      * @param threshold busy threshold
      * @param depth stack compare depth
-     * @throws Exception
+     * @throws Exception if unable to instantiate thread monitor
      */
     public ThreadMonitor(int intervalMs, int threshold, int depth) throws Exception
     {
@@ -114,7 +114,7 @@
      * @param threshold busy threshold
      * @param depth stack compare depth
      * @param trail length of stack trail
-     * @throws Exception
+     * @throws Exception if unable to instantiate thread monitor
      */
     public ThreadMonitor(int intervalMs, int threshold, int depth, int trail) throws Exception
     {
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/integration/JavaMonitorAction.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/integration/JavaMonitorAction.java
index 92b62b3..4447327 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/integration/JavaMonitorAction.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/integration/JavaMonitorAction.java
@@ -50,10 +50,6 @@
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.thread.QueuedThreadPool;
 
-
-/* ------------------------------------------------------------ */
-/**
- */
 public class JavaMonitorAction extends MonitorAction
 {
     private static final Logger LOG = Log.getLogger(JavaMonitorAction.class);
@@ -68,12 +64,6 @@
     private String _session;
     
     /* ------------------------------------------------------------ */
-    /**
-     * @param notifier
-     * @param pollInterval
-     * @throws Exception 
-     * @throws MalformedObjectNameException 
-     */
     public JavaMonitorAction(EventNotifier notifier, String url, String uuid, String appid, long pollInterval)
         throws Exception
     {
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/integration/JavaMonitorTools.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/integration/JavaMonitorTools.java
index d172bbb..aca94bc 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/integration/JavaMonitorTools.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/integration/JavaMonitorTools.java
@@ -30,12 +30,11 @@
 import org.eclipse.jetty.util.annotation.ManagedObject;
 import org.eclipse.jetty.util.annotation.ManagedOperation;
 
-/* ------------------------------------------------------------ */
 /**
  * Derived from the JMX bean classes created by Kees Jan Koster for the java-monitor
  * J2EE probe http://code.google.com/p/java-monitor-probes/source/browse/.
  * 
- * @author kjkoster <kjkoster@gmail.com>
+ * @author <a href="mailto:kjkoster@gmail.com">Kees Jan Koster</a>
  */
 @ManagedObject("Java Monitoring Tools")
 public class JavaMonitorTools
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/integration/JavaMonitorTrigger.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/integration/JavaMonitorTrigger.java
index 4f95190..1917501 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/integration/JavaMonitorTrigger.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/integration/JavaMonitorTrigger.java
@@ -23,8 +23,8 @@
 import org.eclipse.jetty.monitor.triggers.AttrEventTrigger;
 
 
-/* ------------------------------------------------------------ */
 /**
+ * @param <TYPE> the trigger type
  */
 public class JavaMonitorTrigger <TYPE extends Comparable<TYPE>>
     extends AttrEventTrigger<TYPE>
@@ -35,13 +35,6 @@
     private int _count;
     
     /* ------------------------------------------------------------ */
-    /**
-     * @param nameObject
-     * @param attributeName
-     * @param id
-     * @param dynamic
-     * @throws IllegalArgumentException
-     */
     public JavaMonitorTrigger(ObjectName nameObject, String attributeName, String id, String name, boolean dynamic)
         throws IllegalArgumentException
     {   
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/ConsoleNotifier.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/ConsoleNotifier.java
index bf3c51d..96db5ea 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/ConsoleNotifier.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/ConsoleNotifier.java
@@ -35,7 +35,7 @@
      * Constructs a new notifier with specified format string
      * 
      * @param format the {@link java.util.Formatter format string}
-     * @throws IllegalArgumentException
+     * @throws IllegalArgumentException if format is invalid
      */
     public ConsoleNotifier(String format)
         throws IllegalArgumentException
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/EventNotifier.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/EventNotifier.java
index be72a4e..d8647ac 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/EventNotifier.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/EventNotifier.java
@@ -31,7 +31,8 @@
     /* ------------------------------------------------------------ */
     /**
      * This method is called when a notification event is received by the containing object
-     *  
+     * 
+     * @param trigger the event trigger 
      * @param state an {@link org.eclipse.jetty.monitor.jmx.EventState event state} 
      * @param timestamp time stamp of the event
      */
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/EventState.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/EventState.java
index d25ec7e..deef3bd 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/EventState.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/EventState.java
@@ -30,6 +30,7 @@
  * 
  * Holds the state of one or more {@link org.eclipse.jetty.monitor.jmx.EventTrigger event trigger}
  * instances to be used when sending notifications as well as executing the actions
+ * @param <TYPE> the event trigger type
  */
 public class EventState<TYPE>
 {
@@ -39,6 +40,7 @@
      * State
      * 
      * Holds the state of a single {@link org.eclipse.jetty.monitor.jmx.EventTrigger event trigger}
+     * @param <TYPE> the event trigger type
      */
     public static class TriggerState<TYPE>
     {
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/EventTrigger.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/EventTrigger.java
index 6ea70f6..93d3c4f 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/EventTrigger.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/EventTrigger.java
@@ -58,7 +58,9 @@
      * Abstract method to verify if the event trigger conditions
      * are in the appropriate state for an event to be triggered
      * 
+     * @param timestamp the timestamp to match 
      * @return true to trigger an event
+     * @throws Exception if unable to match
      */
     public abstract boolean match(long timestamp) throws Exception;
 
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/LoggingNotifier.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/LoggingNotifier.java
index 94f51fb..164b806 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/LoggingNotifier.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/LoggingNotifier.java
@@ -40,7 +40,7 @@
      * Constructs a new notifier with specified format string
      * 
      * @param format the {@link java.util.Formatter format string}
-     * @throws IllegalArgumentException
+     * @throws IllegalArgumentException if format is invalid
      */
     public LoggingNotifier(String format)
         throws IllegalArgumentException
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/MonitorAction.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/MonitorAction.java
index 50cca6d..7ff0864 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/MonitorAction.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/MonitorAction.java
@@ -45,7 +45,7 @@
      * Creates a new monitor action 
      * 
      * @param trigger event trigger to be associated with this action
-     * @throws InvalidParameterException
+     * @throws InvalidParameterException if trigger is invalid
      */
     public MonitorAction(EventTrigger trigger)
         throws InvalidParameterException
@@ -60,7 +60,7 @@
      * 
      * @param trigger event trigger to be associated with this action
      * @param notifier event notifier to be associated with this action
-     * @throws InvalidParameterException
+     * @throws InvalidParameterException if trigger is invalid
      */
     public MonitorAction(EventTrigger trigger, EventNotifier notifier)
         throws InvalidParameterException
@@ -75,7 +75,7 @@
      * @param trigger event trigger to be associated with this action
      * @param notifier event notifier to be associated with this action
      * @param pollInterval interval for polling of the JMX server
-     * @throws InvalidParameterException
+     * @throws InvalidParameterException if trigger is invalid
      */
     public MonitorAction(EventTrigger trigger, EventNotifier notifier, long pollInterval)
         throws InvalidParameterException
@@ -91,7 +91,7 @@
      * @param notifier event notifier to be associated with this action
      * @param pollInterval interval for polling of the JMX server
      * @param pollDelay delay before starting to poll the JMX server
-     * @throws InvalidParameterException
+     * @throws InvalidParameterException if trigger is invalid
      */
     public MonitorAction(EventTrigger trigger, EventNotifier notifier, long pollInterval, long pollDelay)
         throws InvalidParameterException
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/ServiceConnection.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/ServiceConnection.java
index 44bf414..7414414 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/ServiceConnection.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/jmx/ServiceConnection.java
@@ -54,7 +54,7 @@
     /**
      * Construct a loopback connection to an internal server
      * 
-     * @throws IOException
+     * @throws IOException if unable to construct service connection
      */
     public ServiceConnection()
         throws IOException
@@ -67,7 +67,7 @@
      * Construct a connection to specified server
      * 
      * @param url URL of JMX server
-     * @throws IOException
+     * @throws IOException if unable to construct service connection
      */
     public ServiceConnection(String url)
         throws IOException
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/AggregateEventTrigger.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/AggregateEventTrigger.java
index e24ea95..a252354 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/AggregateEventTrigger.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/AggregateEventTrigger.java
@@ -72,27 +72,18 @@
     }
     
     /* ------------------------------------------------------------ */
-    /**
-     * @param trigger
-     */
     public void add(EventTrigger trigger)
     {
         _triggers.add(trigger);
     }
     
     /* ------------------------------------------------------------ */
-    /**
-     * @param triggers
-     */
     public void addAll(List<EventTrigger> triggers)
     {
         _triggers.addAll(triggers);
     }
         
     /* ------------------------------------------------------------ */
-    /**
-     * @param triggers
-     */
     public void addAll(EventTrigger... triggers)
     {
         _triggers.addAll(Arrays.asList(triggers));
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/AttrEventTrigger.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/AttrEventTrigger.java
index 61e35c2..8c86042 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/AttrEventTrigger.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/AttrEventTrigger.java
@@ -32,11 +32,9 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
-
-/* ------------------------------------------------------------ */
 /**
  * AttrEventTrigger
- * 
+ * <p>
  * Event trigger that polls a value of an MXBean attribute
  * and matches every invocation of this trigger. It can be
  * used to send notifications of the value of an attribute
@@ -44,6 +42,7 @@
  * a base class for the event triggers that match the 
  * value of an attribute of the MXBean being polled against
  * some specified criteria.
+ * @param <TYPE> the event trigger type
  */
 public class AttrEventTrigger<TYPE extends Comparable<TYPE>> 
     extends EventTrigger
@@ -64,8 +63,8 @@
      * @param objectName object name of an MBean to be polled
      * @param attributeName name of an MBean attribute to be polled
      * 
-     * @throws MalformedObjectNameException
-     * @throws IllegalArgumentException
+     * @throws MalformedObjectNameException if unable to find object due to malformed name reference
+     * @throws IllegalArgumentException if parameters are invalid
      */
     public AttrEventTrigger(String objectName, String attributeName)
         throws MalformedObjectNameException, IllegalArgumentException
@@ -91,7 +90,7 @@
      * @param nameObject object name of an MBean to be polled
      * @param attributeName name of an MBean attribute to be polled
      * 
-     * @throws IllegalArgumentException
+     * @throws IllegalArgumentException if parameters are invalid
      */
     public AttrEventTrigger(ObjectName nameObject, String attributeName)
         throws IllegalArgumentException
@@ -113,7 +112,7 @@
     /**
      * Verify if the event trigger conditions are in the 
      * appropriate state for an event to be triggered.
-     * This event trigger uses the match(Comparable<TYPE>)
+     * This event trigger uses the match(Comparable&lt;TYPE&gt;)
      * method to compare the value of the MXBean attribute
      * to the conditions specified by the subclasses.
      * 
@@ -162,6 +161,8 @@
      * appropriate state for an event to be triggered.
      * Allows subclasses to override the default behavior
      * that matches every invocation of this trigger
+     * @param value the value to match
+     * @return always true
      */
     public boolean match(Comparable<TYPE> value)
     {
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/EqualToAttrEventTrigger.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/EqualToAttrEventTrigger.java
index b988701..7446d4d 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/EqualToAttrEventTrigger.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/EqualToAttrEventTrigger.java
@@ -21,12 +21,12 @@
 import javax.management.MalformedObjectNameException;
 
 
-/* ------------------------------------------------------------ */
 /**
  * EqualToAttrEventTrigger
- * 
+ * <p> 
  * Event trigger that polls a value of an MXBean attribute and
  * checks if it is equal to specified value. 
+ * @param <TYPE> the event trigger type
  */
 public class EqualToAttrEventTrigger<TYPE extends Comparable<TYPE>> extends AttrEventTrigger<TYPE>
 {
@@ -42,8 +42,8 @@
      * @param attributeName name of an MBean attribute to be polled
      * @param value target value of the attribute
      * 
-     * @throws MalformedObjectNameException
-     * @throws IllegalArgumentException
+     * @throws MalformedObjectNameException if unable to find object due to name issue
+     * @throws IllegalArgumentException on invalid parameters
      */
     public EqualToAttrEventTrigger(String objectName, String attributeName, TYPE value)
         throws MalformedObjectNameException, IllegalArgumentException
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/GreaterThanAttrEventTrigger.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/GreaterThanAttrEventTrigger.java
index 7b9db46..bdfc385 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/GreaterThanAttrEventTrigger.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/GreaterThanAttrEventTrigger.java
@@ -20,13 +20,12 @@
 
 import javax.management.MalformedObjectNameException;
 
-
-/* ------------------------------------------------------------ */
 /**
  * GreaterThanAttrEventTrigger
- * 
+ * <p> 
  * Event trigger that polls a value of an MXBean attribute and
  * checks if it is greater than specified min value. 
+ * @param <TYPE> event trigger type
  */
 public class GreaterThanAttrEventTrigger<TYPE extends Comparable<TYPE>> extends AttrEventTrigger<TYPE>
 {
@@ -42,8 +41,8 @@
      * @param attributeName name of an MBean attribute to be polled
      * @param min minimum value of the attribute
      * 
-     * @throws MalformedObjectNameException
-     * @throws IllegalArgumentException
+     * @throws MalformedObjectNameException on bad object name
+     * @throws IllegalArgumentException on bad parameters
      */
     public GreaterThanAttrEventTrigger(String objectName, String attributeName, TYPE min)
         throws MalformedObjectNameException, IllegalArgumentException
@@ -72,7 +71,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Returns the string representation of this event trigger
-     * in the format "min<name". 
+     * in the format "min&lt;name". 
      * 
      * @return string representation of the event trigger
      * 
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/GreaterThanOrEqualToAttrEventTrigger.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/GreaterThanOrEqualToAttrEventTrigger.java
index 95b32c1..921098e 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/GreaterThanOrEqualToAttrEventTrigger.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/GreaterThanOrEqualToAttrEventTrigger.java
@@ -20,13 +20,12 @@
 
 import javax.management.MalformedObjectNameException;
 
-
-/* ------------------------------------------------------------ */
 /**
  * GreaterThanOrEqualToAttrEventTrigger
- * 
+ * <p>
  * Event trigger that polls a value of an MXBean attribute and
  * checks if it is greater than or equal to specified min value. 
+ * @param <TYPE> event trigger type
  */
 public class GreaterThanOrEqualToAttrEventTrigger<TYPE extends Comparable<TYPE>> extends AttrEventTrigger<TYPE>
 {
@@ -42,8 +41,8 @@
      * @param attributeName name of an MBean attribute to be polled
      * @param min minimum value of the attribute
      * 
-     * @throws MalformedObjectNameException
-     * @throws IllegalArgumentException
+     * @throws MalformedObjectNameException on bad object name
+     * @throws IllegalArgumentException on bad parameters
      */
     public GreaterThanOrEqualToAttrEventTrigger(String objectName, String attributeName, TYPE min)
         throws MalformedObjectNameException, IllegalArgumentException
@@ -72,7 +71,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Returns the string representation of this event trigger
-     * in the format "min<=name". 
+     * in the format "min&lt;=name". 
      * 
      * @return string representation of the event trigger
      * 
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/LessThanAttrEventTrigger.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/LessThanAttrEventTrigger.java
index d64fe9f..ccaf3e0 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/LessThanAttrEventTrigger.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/LessThanAttrEventTrigger.java
@@ -20,13 +20,12 @@
 
 import javax.management.MalformedObjectNameException;
 
-
-/* ------------------------------------------------------------ */
 /**
  * LessThanAttrEventTrigger
- * 
+ * <p>
  * Event trigger that polls a value of an MXBean attribute and
  * checks if it is greater than specified max value. 
+ * @param <TYPE> event trigger type
  */
 public class LessThanAttrEventTrigger<TYPE extends Comparable<TYPE>> extends AttrEventTrigger<TYPE>
 {
@@ -42,8 +41,8 @@
      * @param attributeName name of an MBean attribute to be polled
      * @param max maximum value of the attribute
      * 
-     * @throws MalformedObjectNameException
-     * @throws IllegalArgumentException
+     * @throws MalformedObjectNameException on bad object name
+     * @throws IllegalArgumentException on bad parameters
      */
     public LessThanAttrEventTrigger(String objectName, String attributeName, TYPE max)
         throws MalformedObjectNameException, IllegalArgumentException
@@ -72,7 +71,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Returns the string representation of this event trigger
-     * in the format "name<max". 
+     * in the format "name&lt;max". 
      * 
      * @return string representation of the event trigger
      * 
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/LessThanOrEqualToAttrEventTrigger.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/LessThanOrEqualToAttrEventTrigger.java
index ecf46f2..9b5cf18 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/LessThanOrEqualToAttrEventTrigger.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/LessThanOrEqualToAttrEventTrigger.java
@@ -21,12 +21,12 @@
 import javax.management.MalformedObjectNameException;
 
 
-/* ------------------------------------------------------------ */
 /**
  * LessThanOrEqualToAttrEventTrigger
- * 
+ * <p> 
  * Event trigger that polls a value of an MXBean attribute and
  * checks if it is less than or equal to specified max value. 
+ * @param <TYPE> event trigger type 
  */
 public class LessThanOrEqualToAttrEventTrigger<TYPE extends Comparable<TYPE>> extends AttrEventTrigger<TYPE>
 {
@@ -42,8 +42,8 @@
      * @param attributeName name of an MBean attribute to be polled
      * @param max maximum value of the attribute
      * 
-     * @throws MalformedObjectNameException
-     * @throws IllegalArgumentException
+     * @throws MalformedObjectNameException on bad object name
+     * @throws IllegalArgumentException on bad parameters
      */
     public LessThanOrEqualToAttrEventTrigger(String objectName, String attributeName, TYPE max)
         throws MalformedObjectNameException, IllegalArgumentException
@@ -72,7 +72,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Returns the string representation of this event trigger
-     * in the format "name<=max". 
+     * in the format "name&lt;=max". 
      * 
      * @return string representation of the event trigger
      * 
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/RangeAttrEventTrigger.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/RangeAttrEventTrigger.java
index a11b560..f3128b0 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/RangeAttrEventTrigger.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/RangeAttrEventTrigger.java
@@ -20,14 +20,13 @@
 
 import javax.management.MalformedObjectNameException;
 
-
-/* ------------------------------------------------------------ */
 /**
  * RangeAttrEventTrigger
- * 
+ * <p> 
  * Event trigger that polls a value of an MXBean attribute and
  * checks if it is in a range from specified min value to
  * specified max value. 
+ * @param <TYPE> event trigger type
  */
 public class RangeAttrEventTrigger<TYPE extends Comparable<TYPE>> extends AttrEventTrigger<TYPE>
 {
@@ -45,8 +44,8 @@
      * @param min minimum value of the attribute
      * @param max maximum value of the attribute
      * 
-     * @throws MalformedObjectNameException
-     * @throws IllegalArgumentException
+     * @throws MalformedObjectNameException on bad object name
+     * @throws IllegalArgumentException on bad parameters
      */
     public RangeAttrEventTrigger(String objectName, String attributeName,TYPE min, TYPE max)
         throws MalformedObjectNameException, IllegalArgumentException
@@ -79,7 +78,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Returns the string representation of this event trigger
-     * in the format "min<name<max". 
+     * in the format "min&lt;name&lt;max". 
      * 
      * @return string representation of the event trigger
      * 
diff --git a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/RangeInclAttrEventTrigger.java b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/RangeInclAttrEventTrigger.java
index e3e8095..7f52885 100644
--- a/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/RangeInclAttrEventTrigger.java
+++ b/jetty-monitor/src/main/java/org/eclipse/jetty/monitor/triggers/RangeInclAttrEventTrigger.java
@@ -20,14 +20,13 @@
 
 import javax.management.MalformedObjectNameException;
 
-
-/* ------------------------------------------------------------ */
 /**
  * RangeInclAttrEventTrigger
- * 
+ * <p>
  * Event trigger that polls a value of an MXBean attribute and
  * checks if it is in a range from specified min value to
  * specified max value including the range bounds. 
+ * @param <TYPE> event trigger type
  */
 public class RangeInclAttrEventTrigger<TYPE extends Comparable<TYPE>> extends AttrEventTrigger<TYPE>
 {
@@ -45,8 +44,8 @@
      * @param min minimum value of the attribute
      * @param max maximum value of the attribute
      * 
-     * @throws MalformedObjectNameException
-     * @throws IllegalArgumentException
+     * @throws MalformedObjectNameException on bad object name
+     * @throws IllegalArgumentException on bad parameters
      */
     public RangeInclAttrEventTrigger(String objectName, String attributeName,TYPE min, TYPE max)
         throws MalformedObjectNameException, IllegalArgumentException
@@ -79,7 +78,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Returns the string representation of this event trigger
-     * in the format "min<=name<=max". 
+     * in the format "min&lt;=name&lt;=max". 
      * 
      * @return string representation of the event trigger
      * 
diff --git a/jetty-nosql/pom.xml b/jetty-nosql/pom.xml
index ea5615f..d1685c1 100644
--- a/jetty-nosql/pom.xml
+++ b/jetty-nosql/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-nosql</artifactId>
@@ -14,57 +14,6 @@
   <build>
     <defaultGoal>install</defaultGoal>
     <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <configuration>
-          <instructions>
-            <Import-Package>javax.servlet.*;version="[2.6.0,3.2)",org.eclipse.jetty.server.session.jmx;version="9.1";resolution:=optional,,org.eclipse.jetty.*;version="9.1",*</Import-Package>
-          </instructions>
-        </configuration>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-           </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>artifact-jar</id>
-            <goals>
-              <goal>jar</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
     </plugins>
   </build>
   <dependencies>
diff --git a/jetty-nosql/src/main/config/etc/jetty-nosql.xml b/jetty-nosql/src/main/config/etc/jetty-nosql.xml
new file mode 100644
index 0000000..ee1ebd1
--- /dev/null
+++ b/jetty-nosql/src/main/config/etc/jetty-nosql.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+
+  <!-- ===================================================================== -->
+  <!-- Configure a MongoSessionIdManager                                     -->
+  <!-- ===================================================================== -->
+  <Set name="sessionIdManager">
+    <New id="sessionIdMgr" class="org.eclipse.jetty.nosql.mongodb.MongoSessionIdManager">
+      <Arg>
+        <Ref refid="Server"/>
+      </Arg>
+      <Set name="workerName"><Property name="jetty.nosqlSession.workerName" default="node1"/></Set>
+      <Set name="scavengePeriod"><Property name="jetty.nosqlSession.scavenge" default="1800"/></Set>
+    </New>
+  </Set>
+
+</Configure>
diff --git a/jetty-nosql/src/main/config/modules/nosql.mod b/jetty-nosql/src/main/config/modules/nosql.mod
index a4189c9..a5b5a9e 100644
--- a/jetty-nosql/src/main/config/modules/nosql.mod
+++ b/jetty-nosql/src/main/config/modules/nosql.mod
@@ -1,9 +1,31 @@
 #
-# Jetty Nosql module
+# Jetty NoSql module
 #
 
 [depend]
 webapp
 
+[files]
+maven://org.mongodb/mongo-java-driver/2.6.1|lib/nosql/mongo-java-driver-2.6.1.jar
+
 [lib]
-lib/jetty-nosql-${jetty.version}.jar
\ No newline at end of file
+lib/jetty-nosql-${jetty.version}.jar
+lib/nosql/*.jar
+
+[xml]
+etc/jetty-nosql.xml
+
+[license]
+The java driver for the MongoDB document-based database system is hosted on GitHub and released under the Apache 2.0 license.
+http://www.mongodb.org/
+http://www.apache.org/licenses/LICENSE-2.0.html
+
+[ini-template]
+## MongoDB SessionIdManager config
+
+## Unique identifier for this node in the cluster
+# jetty.nosqlSession.workerName=node1
+
+## Interval in seconds between scavenging expired sessions
+# jetty.nosqlSession.scavenge=1800
+
diff --git a/jetty-nosql/src/main/java/org/eclipse/jetty/nosql/NoSqlSessionManager.java b/jetty-nosql/src/main/java/org/eclipse/jetty/nosql/NoSqlSessionManager.java
index 74cd138..7d5e9dc 100644
--- a/jetty-nosql/src/main/java/org/eclipse/jetty/nosql/NoSqlSessionManager.java
+++ b/jetty-nosql/src/main/java/org/eclipse/jetty/nosql/NoSqlSessionManager.java
@@ -35,7 +35,6 @@
  * NoSqlSessionManager
  *
  * Base class for SessionManager implementations using nosql frameworks
- * 
  */
 public abstract class NoSqlSessionManager extends AbstractSessionManager implements SessionManager
 {
@@ -241,7 +240,7 @@
      * The State Period is the maximum time in seconds that an in memory session is allows to be stale:
      * <ul>  
      * <li>If this period is exceeded, the DB will be checked to see if a more recent version is available.</li>
-     * <li>If the state period is set to a value < 0, then no staleness check will be made.</li>
+     * <li>If the state period is set to a value &lt; 0, then no staleness check will be made.</li>
      * <li>If the state period is set to 0, then a staleness check is made whenever the active request count goes from 0 to 1.</li>
      * </ul>
      * @return the stalePeriod in seconds
@@ -256,7 +255,7 @@
      * The State Period is the maximum time in seconds that an in memory session is allows to be stale:
      * <ul>  
      * <li>If this period is exceeded, the DB will be checked to see if a more recent version is available.</li>
-     * <li>If the state period is set to a value < 0, then no staleness check will be made.</li>
+     * <li>If the state period is set to a value &lt; 0, then no staleness check will be made.</li>
      * <li>If the state period is set to 0, then a staleness check is made whenever the active request count goes from 0 to 1.</li>
      * </ul>
      * @param stalePeriod the stalePeriod in seconds
@@ -274,9 +273,9 @@
      * <li>a save period of -1 means the session is never saved to the DB other than on a shutdown</li>
      * <li>a save period of 0 means the session is written to the DB whenever the active request count goes from 1 to 0.</li>
      * <li>a save period of 1 means the session is written to the DB whenever the active request count goes from 1 to 0 and the session is dirty.</li>
-     * <li>a save period of > 1 means the session is written after that period in seconds of being dirty.</li>
+     * <li>a save period of &gt; 1 means the session is written after that period in seconds of being dirty.</li>
      * </ul>
-     * @return the savePeriod -2,-1,0,1 or the period in seconds >=2 
+     * @return the savePeriod -2,-1,0,1 or the period in seconds &gt;=2 
      */
     public int getSavePeriod()
     {
@@ -291,9 +290,9 @@
      * <li>a save period of -1 means the session is never saved to the DB other than on a shutdown</li>
      * <li>a save period of 0 means the session is written to the DB whenever the active request count goes from 1 to 0.</li>
      * <li>a save period of 1 means the session is written to the DB whenever the active request count goes from 1 to 0 and the session is dirty.</li>
-     * <li>a save period of > 1 means the session is written after that period in seconds of being dirty.</li>
+     * <li>a save period of &gt; 1 means the session is written after that period in seconds of being dirty.</li>
      * </ul>
-     * @param savePeriod the savePeriod -2,-1,0,1 or the period in seconds >=2 
+     * @param savePeriod the savePeriod -2,-1,0,1 or the period in seconds &gt;=2 
      */
     public void setSavePeriod(int savePeriod)
     {
@@ -304,7 +303,7 @@
     /**
      * The Idle Period is the time in seconds before an in memory session is passivated.
      * When this period is exceeded, the session will be passivated and removed from memory.  If the session was dirty, it will be written to the DB.
-     * If the idle period is set to a value < 0, then the session is never idled.
+     * If the idle period is set to a value &lt; 0, then the session is never idled.
      * If the save period is set to 0, then the session is idled whenever the active request count goes from 1 to 0.
      * @return the idlePeriod
      */
@@ -317,7 +316,7 @@
     /**
      * The Idle Period is the time in seconds before an in memory session is passivated.
      * When this period is exceeded, the session will be passivated and removed from memory.  If the session was dirty, it will be written to the DB.
-     * If the idle period is set to a value < 0, then the session is never idled.
+     * If the idle period is set to a value &lt; 0, then the session is never idled.
      * If the save period is set to 0, then the session is idled whenever the active request count goes from 1 to 0.
      * @param idlePeriod the idlePeriod in seconds
      */
@@ -359,7 +358,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Preserve sessions when the session manager is stopped otherwise remove them from the DB.
-     * @param removeOnStop the removeOnStop to set
+     * @param preserveOnStop the preserveOnStop to set
      */
     public void setPreserveOnStop(boolean preserveOnStop)
     {
diff --git a/jetty-nosql/src/main/java/org/eclipse/jetty/nosql/mongodb/MongoSessionIdManager.java b/jetty-nosql/src/main/java/org/eclipse/jetty/nosql/mongodb/MongoSessionIdManager.java
index 0038267..d822ea7 100644
--- a/jetty-nosql/src/main/java/org/eclipse/jetty/nosql/mongodb/MongoSessionIdManager.java
+++ b/jetty-nosql/src/main/java/org/eclipse/jetty/nosql/mongodb/MongoSessionIdManager.java
@@ -21,6 +21,7 @@
 
 import java.net.UnknownHostException;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Random;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
@@ -34,6 +35,7 @@
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.server.session.AbstractSessionIdManager;
 import org.eclipse.jetty.server.session.SessionHandler;
+import org.eclipse.jetty.util.ConcurrentHashSet;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.thread.ScheduledExecutorScheduler;
@@ -49,13 +51,13 @@
 
 /**
  * Based partially on the JDBCSessionIdManager.
- *
+ * <p>
  * Theory is that we really only need the session id manager for the local 
  * instance so we have something to scavenge on, namely the list of known ids
- * 
+ * <p>
  * This class has a timer that runs a periodic scavenger thread to query
  *  for all id's known to this node whose precalculated expiry time has passed.
- *  
+ * <p>
  * These found sessions are then run through the invalidateAll(id) method that 
  * is a bit hinky but is supposed to notify all handlers this id is now DOA and 
  * ought to be cleaned up.  this ought to result in a save operation on the session
@@ -109,10 +111,15 @@
     
     /**
      * the collection of session ids known to this manager
-     * 
-     * TODO consider if this ought to be concurrent or not
      */
-    protected final Set<String> _sessionsIds = new HashSet<String>();
+    protected final Set<String> _sessionsIds = new ConcurrentHashSet<>();
+
+    /**
+     * The maximum number of items to return from a purge query.
+     */
+    private int _purgeLimit = 0;
+
+    private int _scavengeBlockSize;
     
     
     /**
@@ -182,6 +189,12 @@
                 BasicDBObjectBuilder.start().add("id",1).add("version",1).get(),
                 BasicDBObjectBuilder.start().add("unique",true).add("sparse",false).get());
 
+        // index our accessed and valid fields so that purges are faster, note that the "valid" field is first
+        // so that we can take advantage of index prefixes
+        // http://docs.mongodb.org/manual/core/index-compound/#compound-index-prefix
+        _sessions.ensureIndex(
+                BasicDBObjectBuilder.start().add(MongoSessionManager.__VALID, 1).add(MongoSessionManager.__ACCESSED, 1).get(),
+                BasicDBObjectBuilder.start().add("sparse", false).add("background", true).get());
     }
  
     /* ------------------------------------------------------------ */
@@ -194,29 +207,60 @@
     {
         long now = System.currentTimeMillis();
         __log.debug("SessionIdManager:scavenge:at {}", now);        
-        synchronized (_sessionsIds)
-        {         
-            /*
-             * run a query returning results that:
-             *  - are in the known list of sessionIds
-             *  - the expiry time has passed
-             *  
-             *  we limit the query to return just the __ID so we are not sucking back full sessions
-             */
-            BasicDBObject query = new BasicDBObject();     
-            query.put(MongoSessionManager.__ID,new BasicDBObject("$in", _sessionsIds ));
-            query.put(MongoSessionManager.__EXPIRY, new BasicDBObject("$gt", 0));
-            query.put(MongoSessionManager.__EXPIRY, new BasicDBObject("$lt", now));
-        
+        /*
+         * run a query returning results that:
+         *  - are in the known list of sessionIds
+         *  - the expiry time has passed
+         *  
+         *  we limit the query to return just the __ID so we are not sucking back full sessions
+         *  
+         *  break scavenge query into blocks for faster mongo queries
+         */
+        Set<String> block = new HashSet<String>();
             
-            DBCursor checkSessions = _sessions.find(query, new BasicDBObject(MongoSessionManager.__ID, 1));
-                        
-            for ( DBObject session : checkSessions )
-            {             
-                __log.debug("SessionIdManager:scavenge: expiring session {}", (String)session.get(MongoSessionManager.__ID));
-                expireAll((String)session.get(MongoSessionManager.__ID));
+        Iterator<String> itor = _sessionsIds.iterator();
+        while (itor.hasNext())
+        {
+            block.add(itor.next());
+            if ((_scavengeBlockSize > 0) && (block.size() == _scavengeBlockSize))
+            {
+                //got a block
+                scavengeBlock (now, block);
+                //reset for next run
+                block.clear();
             }
-        }      
+        }
+        
+        //non evenly divisble block size, or doing it all at once
+        if (!block.isEmpty())
+            scavengeBlock(now, block);
+    }
+    
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * Check a block of session ids for expiry and thus scavenge.
+     * 
+     * @param atTime purge at time
+     * @param ids set of session ids
+     */
+    protected void scavengeBlock (long atTime, Set<String> ids)
+    {
+        if (ids == null)
+            return;
+        
+        BasicDBObject query = new BasicDBObject();     
+        query.put(MongoSessionManager.__ID,new BasicDBObject("$in", ids ));
+        query.put(MongoSessionManager.__EXPIRY, new BasicDBObject("$gt", 0));
+        query.put(MongoSessionManager.__EXPIRY, new BasicDBObject("$lt", atTime));   
+            
+        DBCursor checkSessions = _sessions.find(query, new BasicDBObject(MongoSessionManager.__ID, 1));
+                        
+        for ( DBObject session : checkSessions )
+        {             
+            __log.debug("SessionIdManager:scavenge: expiring session {}", (String)session.get(MongoSessionManager.__ID));
+            expireAll((String)session.get(MongoSessionManager.__ID));
+        }            
     }
     
     /* ------------------------------------------------------------ */
@@ -262,11 +306,16 @@
         __log.debug("PURGING");
         BasicDBObject invalidQuery = new BasicDBObject();
 
-        invalidQuery.put(MongoSessionManager.__ACCESSED, new BasicDBObject("$lt",System.currentTimeMillis() - _purgeInvalidAge));
         invalidQuery.put(MongoSessionManager.__VALID, false);
+        invalidQuery.put(MongoSessionManager.__ACCESSED, new BasicDBObject("$lt",System.currentTimeMillis() - _purgeInvalidAge));
         
         DBCursor oldSessions = _sessions.find(invalidQuery, new BasicDBObject(MongoSessionManager.__ID, 1));
 
+        if (_purgeLimit > 0)
+        {
+            oldSessions.limit(_purgeLimit);
+        }
+
         for (DBObject session : oldSessions)
         {
             String id = (String)session.get("id");
@@ -280,11 +329,16 @@
         {
             BasicDBObject validQuery = new BasicDBObject();
 
-            validQuery.put(MongoSessionManager.__ACCESSED,new BasicDBObject("$lt",System.currentTimeMillis() - _purgeValidAge));
             validQuery.put(MongoSessionManager.__VALID, true);
+            validQuery.put(MongoSessionManager.__ACCESSED,new BasicDBObject("$lt",System.currentTimeMillis() - _purgeValidAge));
 
             oldSessions = _sessions.find(validQuery,new BasicDBObject(MongoSessionManager.__ID,1));
 
+            if (_purgeLimit > 0)
+            {
+                oldSessions.limit(_purgeLimit);
+            }
+
             for (DBObject session : oldSessions)
             {
                 String id = (String)session.get(MongoSessionManager.__ID);
@@ -346,7 +400,7 @@
     /** 
      * The period in seconds between scavenge checks.
      * 
-     * @param scavengePeriod
+     * @param scavengePeriod the scavenge period in seconds
      */
     public void setScavengePeriod(long scavengePeriod)
     {
@@ -357,6 +411,42 @@
     }
 
     /* ------------------------------------------------------------ */
+    /** When scavenging, the max number of session ids in the query.
+     * 
+     * @param size the scavenge block size
+     */
+    public void setScavengeBlockSize (int size)
+    {
+        _scavengeBlockSize = size;
+    }
+
+    /* ------------------------------------------------------------ */
+    public int getScavengeBlockSize ()
+    {
+        return _scavengeBlockSize;
+    }
+    
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * The maximum number of items to return from a purge query. If &lt;= 0 there is no limit. Defaults to 0
+     * 
+     * @param purgeLimit the purge limit 
+     */
+    public void setPurgeLimit(int purgeLimit)
+    {
+        _purgeLimit = purgeLimit;
+    }
+
+    /* ------------------------------------------------------------ */
+    public int getPurgeLimit()
+    {
+        return _purgeLimit;
+    }
+
+
+
+    /* ------------------------------------------------------------ */
     public void setPurgeDelay(long purgeDelay)
     {
         if ( isRunning() )
@@ -377,6 +467,7 @@
     /**
      * sets how old a session is to be persisted past the point it is
      * no longer valid
+     * @param purgeValidAge the purge valid age
      */
     public void setPurgeInvalidAge(long purgeValidAge)
     {
@@ -395,6 +486,7 @@
      * considered no longer viable and should be removed
      * 
      * NOTE: set this value to 0 to disable purging of valid sessions
+     * @param purgeValidAge the purge valid age
      */
     public void setPurgeValidAge(long purgeValidAge)
     {
@@ -520,10 +612,7 @@
         
         __log.debug("MongoSessionIdManager:addSession {}", session.getId());
         
-        synchronized (_sessionsIds)
-        {
-            _sessionsIds.add(session.getId());
-        }
+        _sessionsIds.add(session.getId());
         
     }
 
@@ -536,10 +625,7 @@
             return;
         }
         
-        synchronized (_sessionsIds)
-        {
-            _sessionsIds.remove(session.getId());
-        }
+        _sessionsIds.remove(session.getId());
     }
 
     /* ------------------------------------------------------------ */
@@ -551,56 +637,51 @@
     @Override
     public void invalidateAll(String sessionId)
     {
-        synchronized (_sessionsIds)
+        _sessionsIds.remove(sessionId);
+            
+        //tell all contexts that may have a session object with this id to
+        //get rid of them
+        Handler[] contexts = _server.getChildHandlersByClass(ContextHandler.class);
+        for (int i=0; contexts!=null && i<contexts.length; i++)
         {
-            _sessionsIds.remove(sessionId);
-                
-            //tell all contexts that may have a session object with this id to
-            //get rid of them
-            Handler[] contexts = _server.getChildHandlersByClass(ContextHandler.class);
-            for (int i=0; contexts!=null && i<contexts.length; i++)
+            SessionHandler sessionHandler = ((ContextHandler)contexts[i]).getChildHandlerByClass(SessionHandler.class);
+            if (sessionHandler != null) 
             {
-                SessionHandler sessionHandler = ((ContextHandler)contexts[i]).getChildHandlerByClass(SessionHandler.class);
-                if (sessionHandler != null) 
-                {
-                    SessionManager manager = sessionHandler.getSessionManager();
+                SessionManager manager = sessionHandler.getSessionManager();
 
-                    if (manager != null && manager instanceof MongoSessionManager)
-                    {
-                        ((MongoSessionManager)manager).invalidateSession(sessionId);
-                    }
+                if (manager != null && manager instanceof MongoSessionManager)
+                {
+                    ((MongoSessionManager)manager).invalidateSession(sessionId);
                 }
             }
-        }      
-    } 
+        }
+    }      
+ 
 
     /* ------------------------------------------------------------ */
     /**
      * Expire this session for all contexts that are sharing the session 
      * id.
-     * @param sessionId
+     * @param sessionId the session id
      */
     public void expireAll (String sessionId)
     {
-        synchronized (_sessionsIds)
+        _sessionsIds.remove(sessionId);
+            
+            
+        //tell all contexts that may have a session object with this id to
+        //get rid of them
+        Handler[] contexts = _server.getChildHandlersByClass(ContextHandler.class);
+        for (int i=0; contexts!=null && i<contexts.length; i++)
         {
-            _sessionsIds.remove(sessionId);
-            
-            
-            //tell all contexts that may have a session object with this id to
-            //get rid of them
-            Handler[] contexts = _server.getChildHandlersByClass(ContextHandler.class);
-            for (int i=0; contexts!=null && i<contexts.length; i++)
+            SessionHandler sessionHandler = ((ContextHandler)contexts[i]).getChildHandlerByClass(SessionHandler.class);
+            if (sessionHandler != null) 
             {
-                SessionHandler sessionHandler = ((ContextHandler)contexts[i]).getChildHandlerByClass(SessionHandler.class);
-                if (sessionHandler != null) 
-                {
-                    SessionManager manager = sessionHandler.getSessionManager();
+                SessionManager manager = sessionHandler.getSessionManager();
 
-                    if (manager != null && manager instanceof MongoSessionManager)
-                    {
-                        ((MongoSessionManager)manager).expire(sessionId);
-                    }
+                if (manager != null && manager instanceof MongoSessionManager)
+                {
+                    ((MongoSessionManager)manager).expire(sessionId);
                 }
             }
         }      
@@ -613,24 +694,21 @@
         //generate a new id
         String newClusterId = newSessionId(request.hashCode());
 
-        synchronized (_sessionsIds)
+        _sessionsIds.remove(oldClusterId);//remove the old one from the list
+        _sessionsIds.add(newClusterId); //add in the new session id to the list
+
+        //tell all contexts to update the id 
+        Handler[] contexts = _server.getChildHandlersByClass(ContextHandler.class);
+        for (int i=0; contexts!=null && i<contexts.length; i++)
         {
-            _sessionsIds.remove(oldClusterId);//remove the old one from the list
-            _sessionsIds.add(newClusterId); //add in the new session id to the list
-
-            //tell all contexts to update the id 
-            Handler[] contexts = _server.getChildHandlersByClass(ContextHandler.class);
-            for (int i=0; contexts!=null && i<contexts.length; i++)
+            SessionHandler sessionHandler = ((ContextHandler)contexts[i]).getChildHandlerByClass(SessionHandler.class);
+            if (sessionHandler != null) 
             {
-                SessionHandler sessionHandler = ((ContextHandler)contexts[i]).getChildHandlerByClass(SessionHandler.class);
-                if (sessionHandler != null) 
-                {
-                    SessionManager manager = sessionHandler.getSessionManager();
+                SessionManager manager = sessionHandler.getSessionManager();
 
-                    if (manager != null && manager instanceof MongoSessionManager)
-                    {
-                        ((MongoSessionManager)manager).renewSessionId(oldClusterId, oldNodeId, newClusterId, getNodeId(newClusterId, request));
-                    }
+                if (manager != null && manager instanceof MongoSessionManager)
+                {
+                    ((MongoSessionManager)manager).renewSessionId(oldClusterId, oldNodeId, newClusterId, getNodeId(newClusterId, request));
                 }
             }
         }
diff --git a/jetty-nosql/src/main/java/org/eclipse/jetty/nosql/mongodb/MongoSessionManager.java b/jetty-nosql/src/main/java/org/eclipse/jetty/nosql/mongodb/MongoSessionManager.java
index 8feff53..df8f917 100644
--- a/jetty-nosql/src/main/java/org/eclipse/jetty/nosql/mongodb/MongoSessionManager.java
+++ b/jetty-nosql/src/main/java/org/eclipse/jetty/nosql/mongodb/MongoSessionManager.java
@@ -43,12 +43,11 @@
 import com.mongodb.DBObject;
 import com.mongodb.MongoException;
 import com.mongodb.WriteConcern;
-import com.mongodb.WriteResult;
 
 
 /**
  * MongoSessionManager
- *
+ * <p>
  * Clustered session manager using MongoDB as the shared DB instance.
  * The document model is an outer object that contains the elements:
  * <ul>
@@ -70,7 +69,7 @@
  * </p>
  * <p>
  * For example:
- * <code>
+ * <pre>
  * { "_id"       : ObjectId("52845534a40b66410f228f23"), 
  *    "accessed" :  NumberLong("1384818548903"), 
  *    "maxIdle"  : 1,
@@ -86,14 +85,12 @@
  *    "id"       : "w01ijx2vnalgv1sqrpjwuirprp7", 
  *    "valid"    : true 
  * }
- * </code>
- * </p>
+ * </pre>
  * <p>
  * In MongoDB, the nesting level is indicated by "." separators for the key name. Thus to
  * interact with a session attribute, the key is composed of:
- * "context".unique_context_name.attribute_name
- *  Eg  "context"."::/contextA"."A"
- *  </p>
+ * <code>"context".unique_context_name.attribute_name</code>
+ *  Eg  <code>"context"."::/contextA"."A"</code>
  */
 @ManagedObject("Mongo Session Manager")
 public class MongoSessionManager extends NoSqlSessionManager
@@ -706,6 +703,7 @@
      * 
      * the count() operation itself is optimized to perform on the server side
      * and avoid loading to client side.
+     * @return the session store count
      */
     @ManagedAttribute("total number of known sessions in the store")
     public long getSessionStoreCount()
diff --git a/jetty-osgi/jetty-osgi-alpn/pom.xml b/jetty-osgi/jetty-osgi-alpn/pom.xml
index bc112a9..500e5c7 100644
--- a/jetty-osgi/jetty-osgi-alpn/pom.xml
+++ b/jetty-osgi/jetty-osgi-alpn/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty.osgi</groupId>
     <artifactId>jetty-osgi-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-osgi-alpn</artifactId>
@@ -30,21 +30,26 @@
         </executions>
       </plugin>
       <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
         <configuration>
-          <archive>
-            <manifestEntries>
-              <Bundle-ManifestVersion>2</Bundle-ManifestVersion>
+            <instructions>
               <Bundle-SymbolicName>${bundle-symbolic-name};singleton:=true</Bundle-SymbolicName>
               <Bundle-Name>Jetty OSGi ALPN Fragment</Bundle-Name>
-              <Bundle-Version>${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}</Bundle-Version>
+              <Import-Package>!javax.*;!org.eclipse.jetty.*</Import-Package>
               <Export-Package>org.eclipse.jetty.alpn;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"</Export-Package>
               <Fragment-Host>system.bundle;extension:=framework</Fragment-Host>
-            </manifestEntries>
-          </archive>
+            </instructions>
         </configuration>
       </plugin>
     </plugins>
   </build>
+  <dependencies>
+    <dependency>
+      <groupId>org.eclipse.jetty.alpn</groupId>
+      <artifactId>alpn-api</artifactId>
+      <version>${alpn.api.version}</version>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
 </project>
diff --git a/jetty-osgi/jetty-osgi-boot-jsp/pom.xml b/jetty-osgi/jetty-osgi-boot-jsp/pom.xml
index 371f96c..3567049 100644
--- a/jetty-osgi/jetty-osgi-boot-jsp/pom.xml
+++ b/jetty-osgi/jetty-osgi-boot-jsp/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty.osgi</groupId>
     <artifactId>jetty-osgi-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-osgi-boot-jsp</artifactId>
@@ -42,28 +42,7 @@
       <artifactId>apache-jsp</artifactId>
       <version>${project.version}</version>
     </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty.orbit</groupId>
-      <artifactId>javax.servlet.jsp.jstl</artifactId>
-    </dependency>
-   <dependency>
-       <groupId>org.glassfish.web</groupId>
-       <artifactId>javax.servlet.jsp.jstl</artifactId>
-    </dependency>
-   <dependency>
-       <groupId>org.mortbay.jasper</groupId>
-       <artifactId>apache-el</artifactId>
-       <version>8.0.9.M3</version>
-    </dependency>
   </dependencies>
-<!--
-   <dependency>
-       <groupId>javax.el</groupId>
-       <artifactId>javax.el-api</artifactId>
-       <version>3.0.0</version>
-    </dependency>
-  </dependencies>
--->
 
   <build>
     <plugins>
@@ -94,15 +73,6 @@
           <groupId>org.apache.felix</groupId>
           <artifactId>maven-bundle-plugin</artifactId>
           <extensions>true</extensions>
-          <executions>
-              <execution>
-                  <id>bundle-manifest</id>
-                  <phase>process-classes</phase>
-                  <goals>
-                      <goal>manifest</goal>
-                  </goals>
-              </execution>
-          </executions>
           <configuration>
               <instructions>
                 <Bundle-Name>Jetty-OSGi-Jasper Integration</Bundle-Name>
@@ -110,6 +80,7 @@
                 <Fragment-Host>org.eclipse.jetty.osgi.boot</Fragment-Host>
                 <Export-Package>!org.eclipse.jetty.osgi.boot.*</Export-Package>
                 <Import-Package>org.eclipse.jdt.*;resolution:=optional,
+                                org.eclipse.jdt.core.compiler.*;resolution:=optional,
                 com.sun.el;resolution:=optional,
  com.sun.el.lang;resolution:=optional,
  com.sun.el.parser;resolution:=optional,
@@ -125,20 +96,20 @@
  javax.servlet.jsp.jstl.fmt;version="1.2";resolution:=optional,
  javax.servlet.jsp.jstl.sql;version="1.2";resolution:=optional,
  javax.servlet.jsp.jstl.tlv;version="1.2";resolution:=optional,
- org.apache.el;version="[8.0.9,9)";resolution:=optional,
- org.apache.el.lang;version="[8.0.9,9)";resolution:=optional,
- org.apache.el.stream;version="[8.0.9,9)";resolution:=optional,
- org.apache.el.util;version="[8.0.9,9)";resolution:=optional,
- org.apache.el.parser;version="[8.0.9,9)";resolution:=optional,
- org.apache.jasper;version="[8.0.9,9)";resolution:=optional,
- org.apache.jasper.compiler;version="[8.0.9,9)";resolution:=optional,
- org.apache.jasper.compiler.tagplugin;version="[8.0.9,9)";resolution:=optional,
- org.apache.jasper.runtime;version="[8.0.9,9)";resolution:=optional,
- org.apache.jasper.security;version="[8.0.9,9)";resolution:=optional,
- org.apache.jasper.servlet;version="[8.0.9,9)";resolution:=optional,
- org.apache.jasper.tagplugins.jstl;version="[8.0.9,9)";resolution:=optional,
- org.apache.jasper.util;version="[8.0.9,9)";resolution:=optional,
- org.apache.jasper.xmlparser;version="[8.0.9,9)";resolution:=optional,
+ org.apache.el;version="[8.0.23,9)";resolution:=optional,
+ org.apache.el.lang;version="[8.0.23,9)";resolution:=optional,
+ org.apache.el.stream;version="[8.0.23,9)";resolution:=optional,
+ org.apache.el.util;version="[8.0.23,9)";resolution:=optional,
+ org.apache.el.parser;version="[8.0.23,9)";resolution:=optional,
+ org.apache.jasper;version="[8.0.23,9)";resolution:=optional,
+ org.apache.jasper.compiler;version="[8.0.23,9)";resolution:=optional,
+ org.apache.jasper.compiler.tagplugin;version="[8.0.23,9)";resolution:=optional,
+ org.apache.jasper.runtime;version="[8.0.23,9)";resolution:=optional,
+ org.apache.jasper.security;version="[8.0.23,9)";resolution:=optional,
+ org.apache.jasper.servlet;version="[8.0.23,9)";resolution:=optional,
+ org.apache.jasper.tagplugins.jstl;version="[8.0.23,9)";resolution:=optional,
+ org.apache.jasper.util;version="[8.0.23,9)";resolution:=optional,
+ org.apache.jasper.xmlparser;version="[8.0.23,9)";resolution:=optional,
  org.apache.taglibs.standard;version="1.2";resolution:=optional,
  org.apache.taglibs.standard.extra.spath;version="1.2";resolution:=optional,
  org.apache.taglibs.standard.functions;version="1.2";resolution:=optional,
@@ -162,8 +133,8 @@
  org.apache.taglibs.standard.tag.rt.xml;version="1.2";resolution:=optional,
  org.apache.taglibs.standard.tei;version="1.2";resolution:=optional,
  org.apache.taglibs.standard.tlv;version="1.2";resolution:=optional,
- org.apache.tomcat;version="[8.0.9,9)";resolution:=optional,
- org.eclipse.jetty.jsp;version="[9.2,10)";resolution:=optional,
+ org.apache.tomcat;version="[8.0.23,9)";resolution:=optional,
+ org.eclipse.jetty.jsp;version="[$(version;===;${parsedVersion.osgiVersion}),$(version;==+;${parsedVersion.osgiVersion}))";resolution:=optional,
  org.osgi.*,
  org.xml.*;resolution:=optional,
  org.xml.sax.*;resolution:=optional,
@@ -172,8 +143,7 @@
  org.w3c.dom.ls;resolution:=optional,
  javax.xml.parser;resolution:=optional
  </Import-Package>
-               <_nouses>true</_nouses>
-               <DynamicImport-Package>org.eclipse.jetty.jsp.*;version="9.2.6",org.apache.jasper.*;version="8.0.9",org.apache.el.*;version="8.0.9"</DynamicImport-Package>
+               <DynamicImport-Package>org.eclipse.jetty.jsp.*;version="[$(version;===;${parsedVersion.osgiVersion}),$(version;==+;${parsedVersion.osgiVersion}))",org.apache.jasper.*;version="8.0.23",org.apache.el.*;version="8.0.23"</DynamicImport-Package>
               </instructions>
           </configuration>
       </plugin>
diff --git a/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/JSTLBundleDiscoverer.java b/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/JSTLBundleDiscoverer.java
index 9c9352f..103182b 100644
--- a/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/JSTLBundleDiscoverer.java
+++ b/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/JSTLBundleDiscoverer.java
@@ -19,19 +19,13 @@
 package org.eclipse.jetty.osgi.boot.jasper;
 
 import java.io.File;
-import java.io.InputStream;
-import java.lang.reflect.Field;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.Set;
 
-import javax.servlet.Servlet;
-import javax.servlet.jsp.JspContext;
 import javax.servlet.jsp.JspFactory;
 
-import org.apache.jasper.Constants;
-import org.apache.jasper.compiler.Localizer;
 import org.eclipse.jetty.deploy.DeploymentManager;
 import org.eclipse.jetty.osgi.boot.JettyBootstrapActivator;
 import org.eclipse.jetty.osgi.boot.utils.BundleFileLocatorHelper;
@@ -40,9 +34,6 @@
 import org.eclipse.jetty.util.log.Logger;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.FrameworkUtil;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
 
 /**
  * 
@@ -68,17 +59,7 @@
      */
     private static String DEFAULT_JSTL_BUNDLE_CLASS = "org.apache.taglibs.standard.tag.el.core.WhenTag";
 
-    // used to be "org.apache.jasper.runtime.JspFactoryImpl" but now
-    // the standard tag library implementation are stored in a separate bundle.
-
-    // DISABLED please use the tld bundle argument for the OSGiAppProvider
-    // /**
-    // * Default name of a class that belongs to the bundle where the Java
-    // server Faces tld files are defined.
-    // * This is the sun's reference implementation.
-    // */
-    // private static String DEFAUT_JSF_IMPL_CLASS =
-    // "com.sun.faces.config.ConfigureListener";
+ 
 
     /**
      * Default jsp factory implementation. Idally jasper is osgified and we can
@@ -91,8 +72,6 @@
 
     public JSTLBundleDiscoverer()
     {
-        //fixupDtdResolution();
-
         try
         {
             // sanity check:
@@ -168,8 +147,6 @@
             Bundle tldBundle = FrameworkUtil.getBundle(jstlClass);
             File tldBundleLocation = locatorHelper.getBundleInstallLocation(tldBundle);
             
-            System.err.println("jstl bundle: "+tldBundle);
-            System.err.println("jstl bundle location: "+tldBundleLocation);
             if (tldBundleLocation != null && tldBundleLocation.isDirectory())
             {
                 // try to find the jar files inside this folder
@@ -177,7 +154,6 @@
                 {
                     if (f.getName().endsWith(".jar") && f.isFile())
                     {
-                        System.err.println("Tld jar in dir: "+f.toURI());
                         urls.add(f.toURI().toURL());
                     }
                     else if (f.isDirectory() && f.getName().equals("lib"))
@@ -186,7 +162,6 @@
                         {
                             if (f2.getName().endsWith(".jar") && f2.isFile())
                             {
-                                System.err.println("Tld jar in lib dir: "+f2.toURI());
                                 urls.add(f2.toURI().toURL());
                             }
                         }
@@ -196,7 +171,6 @@
             }
             else if (tldBundleLocation != null)
             {
-                System.err.println("Tld bundle uri: "+tldBundleLocation.toURI());
                 urls.add(tldBundleLocation.toURI().toURL());
               
                 String pattern = (String)deployer.getContextAttribute("org.eclipse.jetty.server.webapp.containerIncludeBundlePattern");
@@ -206,90 +180,10 @@
                     pattern += "|"+tldBundle.getSymbolicName();
                     deployer.setContextAttribute("org.eclipse.jetty.server.webapp.containerIncludeBundlePattern", pattern);
                 }
-                System.err.println("PATTERN: "+pattern);
             }
         }
         
         return urls.toArray(new URL[urls.size()]);
     }
 
-    /**
-     * Jasper resolves the dtd when it parses a taglib descriptor. It uses this
-     * code to do that:
-     * ParserUtils.getClass().getResourceAsStream(resourcePath); where
-     * resourcePath is for example:
-     * /javax/servlet/jsp/resources/web-jsptaglibrary_1_2.dtd Unfortunately, the
-     * dtd file is not in the exact same classloader as ParserUtils class and
-     * the dtds are packaged in 2 separate bundles. OSGi does not look in the
-     * dependencies' classloader when a resource is searched.
-     * <p>
-     * The workaround consists of setting the entity resolver. That is a patch
-     * added to the version of glassfish-jasper-jetty. IT is also present in the
-     * latest version of glassfish jasper. Could not use introspection to set
-     * new value on a static friendly field :(
-     * </p>
-     */
-   void fixupDtdResolution()
-    {
-        try
-        {
-           // ParserUtils.setEntityResolver(new MyFixedupEntityResolver());
-         
-
-        }
-        catch (Exception e)
-        {
-            e.printStackTrace();
-        }
-
-    }
-
-    /**
-     * Instead of using the ParserUtil's classloader, we use a class that is
-     * indeed next to the resource for sure.
-     */
-    //static class MyFixedupEntityResolver implements EntityResolver
-    //{
-        /**
-         * Same values than in ParserUtils...
-         */
-      /*  static final String[] CACHED_DTD_PUBLIC_IDS = { Constants.TAGLIB_DTD_PUBLIC_ID_11, Constants.TAGLIB_DTD_PUBLIC_ID_12,
-                                                       Constants.WEBAPP_DTD_PUBLIC_ID_22, Constants.WEBAPP_DTD_PUBLIC_ID_23, };
-
-        static final String[] CACHED_DTD_RESOURCE_PATHS = { Constants.TAGLIB_DTD_RESOURCE_PATH_11, Constants.TAGLIB_DTD_RESOURCE_PATH_12,
-                                                           Constants.WEBAPP_DTD_RESOURCE_PATH_22, Constants.WEBAPP_DTD_RESOURCE_PATH_23, };
-
-        static final String[] CACHED_SCHEMA_RESOURCE_PATHS = { Constants.TAGLIB_SCHEMA_RESOURCE_PATH_20, Constants.TAGLIB_SCHEMA_RESOURCE_PATH_21,
-                                                              Constants.WEBAPP_SCHEMA_RESOURCE_PATH_24, Constants.WEBAPP_SCHEMA_RESOURCE_PATH_25, };*/
-
-      /*  public InputSource resolveEntity(String publicId, String systemId) throws SAXException
-        {
-            for (int i = 0; i < CACHED_DTD_PUBLIC_IDS.length; i++)
-            {
-                String cachedDtdPublicId = CACHED_DTD_PUBLIC_IDS[i];
-                if (cachedDtdPublicId.equals(publicId))
-                {
-                    String resourcePath = CACHED_DTD_RESOURCE_PATHS[i];
-                    InputStream input = null;
-                    input = Servlet.class.getResourceAsStream(resourcePath);
-                    if (input == null)
-                    {
-                        input = JspContext.class.getResourceAsStream(resourcePath);
-                        if (input == null)
-                        {*/
-                            // if that failed try again with the original code:
-                            // although it is likely not changed.
-                   /*         input = this.getClass().getResourceAsStream(resourcePath);
-                      }
-                    }
-                    if (input == null) { throw new SAXException(Localizer.getMessage("jsp.error.internal.filenotfound", resourcePath)); }
-                    InputSource isrc = new InputSource(input);
-                    return isrc;
-                }
-            }
-
-            return null;
-        }
-    }*/
-
 }
diff --git a/jetty-osgi/jetty-osgi-boot-warurl/pom.xml b/jetty-osgi/jetty-osgi-boot-warurl/pom.xml
index 57df7dd..2edbdb3 100644
--- a/jetty-osgi/jetty-osgi-boot-warurl/pom.xml
+++ b/jetty-osgi/jetty-osgi-boot-warurl/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty.osgi</groupId>
     <artifactId>jetty-osgi-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
@@ -53,15 +53,6 @@
           <groupId>org.apache.felix</groupId>
           <artifactId>maven-bundle-plugin</artifactId>
           <extensions>true</extensions>
-          <executions>
-              <execution>
-                  <id>bundle-manifest</id>
-                  <phase>process-classes</phase>
-                  <goals>
-                      <goal>manifest</goal> 
-                  </goals>
-              </execution>
-          </executions>
           <configuration>
               <instructions>
                   <Bundle-Name>RFC66 War URL</Bundle-Name>
diff --git a/jetty-osgi/jetty-osgi-boot-warurl/src/main/java/org/eclipse/jetty/osgi/boot/warurl/internal/WarBundleManifestGenerator.java b/jetty-osgi/jetty-osgi-boot-warurl/src/main/java/org/eclipse/jetty/osgi/boot/warurl/internal/WarBundleManifestGenerator.java
index 1d7dfc1..10bd59e 100644
--- a/jetty-osgi/jetty-osgi-boot-warurl/src/main/java/org/eclipse/jetty/osgi/boot/warurl/internal/WarBundleManifestGenerator.java
+++ b/jetty-osgi/jetty-osgi-boot-warurl/src/main/java/org/eclipse/jetty/osgi/boot/warurl/internal/WarBundleManifestGenerator.java
@@ -259,7 +259,7 @@
         {
             poundIndex = url.length();
         }
-        UrlEncoded.decodeUtf8To(url.getBytes(), questionMarkIndex+1,
+        UrlEncoded.decodeUtf8To(url, questionMarkIndex+1,
                     poundIndex - questionMarkIndex - 1, res);
         return res;
     }
diff --git a/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty-deployer.xml b/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty-deployer.xml
index b03a648..19b3a5d 100644
--- a/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty-deployer.xml
+++ b/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty-deployer.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
 
diff --git a/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty-http.xml b/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty-http.xml
new file mode 100644
index 0000000..319ae6c
--- /dev/null
+++ b/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty-http.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<!-- ============================================================= -->
+<!-- Configure the Jetty Server instance with an ID "Server"       -->
+<!-- by adding a HTTP connector.                                   -->
+<!-- This configuration must be used in conjunction with jetty.xml -->
+<!-- ============================================================= -->
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+
+  <!-- =========================================================== -->
+  <!-- Add a HTTP Connector.                                       -->
+  <!-- Configure an o.e.j.server.ServerConnector with a single     -->
+  <!-- HttpConnectionFactory instance using the common httpConfig  -->
+  <!-- instance defined in jetty.xml                               -->
+  <!--                                                             -->
+  <!-- Consult the javadoc of o.e.j.server.ServerConnector and     -->
+  <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
+  <!-- that may be set here.                                       -->
+  <!-- =========================================================== -->
+  <Call name="addConnector">
+    <Arg>
+      <New class="org.eclipse.jetty.server.ServerConnector">
+        <Arg name="server"><Ref refid="Server" /></Arg>
+        <Arg name="factories">
+          <Array type="org.eclipse.jetty.server.ConnectionFactory">
+            <Item>
+              <New class="org.eclipse.jetty.server.HttpConnectionFactory">
+                <Arg name="config"><Ref refid="httpConfig" /></Arg>
+              </New>
+            </Item>
+          </Array>
+        </Arg>
+        <Set name="host"><Property name="jetty.http.host" /></Set>
+        <Set name="port"><Property name="jetty.http.port" default="80" /></Set>
+        <Set name="idleTimeout"><Property name="jetty.http.idleTimeout" default="30000"/></Set>
+      </New>
+    </Arg>
+  </Call>
+
+</Configure>
diff --git a/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty-selector.xml b/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty-selector.xml
deleted file mode 100644
index 67cd87c..0000000
--- a/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty-selector.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-
-    <!-- =========================================================== -->
-    <!-- Add connector                                               -->
-    <!-- =========================================================== -->
-
-    <Call name="addConnector">
-      <Arg>
-          <New class="org.eclipse.jetty.server.ServerConnector">
-            <Arg><Ref refid="Server" /></Arg>
-             <Arg name="factories">
-               <Array type="org.eclipse.jetty.server.ConnectionFactory">
-                <Item>
-                  <New class="org.eclipse.jetty.server.HttpConnectionFactory">
-                   <Arg name="config"><Ref refid="httpConfig" /></Arg>
-                  </New>
-                </Item>
-              </Array>
-             </Arg>
-            <Set name="host"><Property name="jetty.host" /></Set>
-            <Set name="port"><Property name="jetty.port" default="8080"/></Set>
-            <Set name="idleTimeout">300000</Set>
-          </New>
-      </Arg>
-    </Call>
-
-</Configure>
diff --git a/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty.xml b/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty.xml
index 5c882b0..a3850c9 100644
--- a/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty.xml
+++ b/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 
 <!-- =============================================================== -->
@@ -43,7 +43,7 @@
 
     <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
       <Set name="secureScheme">https</Set>
-      <Set name="securePort"><Property name="jetty.secure.port" default="8443" /></Set>
+      <Set name="securePort"><Property name="jetty.httpConfig.securePort" default="8443" /></Set>
       <Set name="outputBufferSize">32768</Set>
       <Set name="requestHeaderSize">8192</Set>
       <Set name="responseHeaderSize">8192</Set>
@@ -63,21 +63,25 @@
 
 
     <!-- =========================================================== -->
-    <!-- jetty-jndi by default                                       -->
-    <!-- =========================================================== -->
-    <Call class="org.eclipse.jetty.webapp.Configuration$ClassList" name="setServerDefault">
-      <Arg><Ref refid="Server" /></Arg>
-      <Call name="addAfter">
-        <Arg name="afterClass">org.eclipse.jetty.webapp.FragmentConfiguration</Arg>
-        <Arg>
-          <Array type="String">
-            <Item>org.eclipse.jetty.plus.webapp.EnvConfiguration</Item>
-            <Item>org.eclipse.jetty.plus.webapp.PlusConfiguration</Item>
-            <Item>org.eclipse.jetty.annotations.AnnotationConfiguration</Item>
-          </Array>
-        </Arg>
-      </Call>
+    <!-- Set up the list of default configuration classes            -->
+    <!-- =========================================================== -->    
+    <Call name="setAttribute">
+       <Arg>org.eclipse.jetty.webapp.configuration</Arg>
+       <Arg>
+        <New class="org.eclipse.jetty.webapp.Configuration$ClassList">
+          <Arg>
+            <Array type="String">
+              <Item>org.eclipse.jetty.osgi.boot.OSGiWebInfConfiguration</Item>
+              <Item>org.eclipse.jetty.webapp.WebXmlConfiguration</Item>
+              <Item>org.eclipse.jetty.webapp.MetaInfConfiguration</Item>
+              <Item>org.eclipse.jetty.webapp.FragmentConfiguration</Item>
+              <Item>org.eclipse.jetty.webapp.JettyWebXmlConfiguration</Item>  
+            </Array>
+          </Arg>
+        </New>
+       </Arg>
     </Call>
+   
 
     <Call class="java.lang.System" name="setProperty">
       <Arg>java.naming.factory.initial</Arg>
diff --git a/jetty-osgi/jetty-osgi-boot/pom.xml b/jetty-osgi/jetty-osgi-boot/pom.xml
index 99b7002..e9efb9b 100644
--- a/jetty-osgi/jetty-osgi-boot/pom.xml
+++ b/jetty-osgi/jetty-osgi-boot/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty.osgi</groupId>
     <artifactId>jetty-osgi-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-osgi-boot</artifactId>
@@ -89,20 +89,11 @@
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <extensions>true</extensions>
-                <executions>
-                    <execution>
-                        <id>bundle-manifest</id>
-                        <phase>process-classes</phase>
-                        <goals>
-                            <goal>manifest</goal>
-                        </goals>
-                    </execution>
-                </executions>
                 <configuration>
                     <instructions>
                         <Bundle-SymbolicName>org.eclipse.jetty.osgi.boot;singleton:=true</Bundle-SymbolicName>
                         <Bundle-Activator>org.eclipse.jetty.osgi.boot.JettyBootstrapActivator</Bundle-Activator>
-                        <DynamicImport-Package>org.eclipse.jetty.*;version="[9.1,10.0)"</DynamicImport-Package>
+                        <DynamicImport-Package>org.eclipse.jetty.*;version="[$(version;===;${parsedVersion.osgiVersion}),$(version;==+;${parsedVersion.osgiVersion}))"</DynamicImport-Package>
                         <Import-Package>javax.mail;version="1.4.0";resolution:=optional,
  javax.mail.event;version="1.4.0";resolution:=optional,
  javax.mail.internet;version="1.4.0";resolution:=optional,
@@ -112,8 +103,6 @@
  javax.servlet.http;version="[3.1,3.2)",
  javax.transaction;version="1.1.0";resolution:=optional,
  javax.transaction.xa;version="1.1.0";resolution:=optional,
- org.eclipse.jetty.annotations;version="9.1";resolution:=optional,
- org.eclipse.jetty.plus.webapp;version="9.1";resolution:=optional,
  org.objectweb.asm;version=4;resolution:=optional,
  org.osgi.framework,
  org.osgi.service.cm;version="1.2.0",
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationConfiguration.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationConfiguration.java
index a1c618c..56ea30b 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationConfiguration.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationConfiguration.java
@@ -25,7 +25,6 @@
 import org.eclipse.jetty.annotations.ClassNameResolver;
 import org.eclipse.jetty.osgi.boot.OSGiWebInfConfiguration;
 import org.eclipse.jetty.osgi.boot.OSGiWebappConstants;
-import org.eclipse.jetty.osgi.boot.utils.internal.PackageAdminServiceTracker;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.resource.Resource;
@@ -150,7 +149,7 @@
      * @param parser The parser
      * @param webbundle The current webbundle
      * @param fragmentBundle The OSGi fragment bundle to scan
-     * @throws Exception
+     * @throws Exception if unable to parse fragment bundle
      */
     protected void parseFragmentBundle(WebAppContext context, AnnotationParser parser,
             Bundle webbundle, Bundle fragmentBundle) throws Exception
@@ -163,8 +162,7 @@
      * @param context The webapp context
      * @param parser The parser
      * @param webbundle The current webbundle
-     * @param fragmentBundle The OSGi required bundle to scan
-     * @throws Exception
+     * @throws Exception if unable to parse the web bundle
      */
     protected void parseWebBundle(WebAppContext context, AnnotationParser parser, Bundle webbundle)
     throws Exception
@@ -177,8 +175,8 @@
      * @param context The webapp context
      * @param parser The parser
      * @param webbundle The current webbundle
-     * @param fragmentBundle The OSGi required bundle to scan
-     * @throws Exception
+     * @param requiredBundle The OSGi required bundle to scan
+     * @throws Exception if unable to parse the required bundle
      */
     protected void parseRequiredBundle(WebAppContext context, AnnotationParser parser,
             Bundle webbundle, Bundle requiredBundle) throws Exception
@@ -209,8 +207,8 @@
     
     /**
      * Returns the same classname resolver than for the webInfjar scanner
-     * @param context
-     * @return
+     * @param context the web app context
+     * @return the class name resolver
      */
     protected ClassNameResolver createClassNameResolver(final WebAppContext context)
     {
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationParser.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationParser.java
index 06a518c..02f79e8 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationParser.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationParser.java
@@ -30,7 +30,6 @@
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.eclipse.jetty.annotations.ClassNameResolver;
-import org.eclipse.jetty.osgi.boot.utils.BundleFileLocatorHelper;
 import org.eclipse.jetty.osgi.boot.utils.BundleFileLocatorHelperFactory;
 import org.eclipse.jetty.util.ConcurrentHashSet;
 import org.eclipse.jetty.util.resource.Resource;
@@ -52,9 +51,10 @@
     
     /**
      * Keep track of a jetty URI Resource and its associated OSGi bundle.
-     * @param uri
-     * @param bundle
-     * @throws Exception 
+     * 
+     * @param bundle the bundle to index
+     * @return the resource for the bundle
+     * @throws Exception if unable to create the resource reference
      */
     protected Resource indexBundle(Bundle bundle) throws Exception
     {
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractContextProvider.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractContextProvider.java
index cae6d32..bfef3b9 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractContextProvider.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractContextProvider.java
@@ -19,7 +19,6 @@
 package org.eclipse.jetty.osgi.boot;
 
 import java.io.File;
-import java.net.URL;
 import java.util.Dictionary;
 import java.util.HashMap;
 
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractWebAppProvider.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractWebAppProvider.java
index ba69878..9bb74c5 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractWebAppProvider.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractWebAppProvider.java
@@ -20,12 +20,9 @@
 
 import java.io.File;
 import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Dictionary;
 import java.util.Enumeration;
 import java.util.HashMap;
-import java.util.List;
 
 import org.eclipse.jetty.deploy.App;
 import org.eclipse.jetty.deploy.AppProvider;
@@ -34,13 +31,13 @@
 import org.eclipse.jetty.osgi.boot.internal.webapp.OSGiWebappClassLoader;
 import org.eclipse.jetty.osgi.boot.utils.BundleFileLocatorHelperFactory;
 import org.eclipse.jetty.server.handler.ContextHandler;
-import org.eclipse.jetty.util.ArrayUtil;
-import org.eclipse.jetty.util.component.AbstractLifeCycle;
 import org.eclipse.jetty.util.Loader;
+import org.eclipse.jetty.util.component.AbstractLifeCycle;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.resource.JarResource;
 import org.eclipse.jetty.util.resource.Resource;
+import org.eclipse.jetty.webapp.Configuration;
 import org.eclipse.jetty.webapp.WebAppContext;
 import org.eclipse.jetty.xml.XmlConfiguration;
 import org.osgi.framework.Bundle;
@@ -48,54 +45,22 @@
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.packageadmin.PackageAdmin;
 
-
-
-
 /**
  * AbstractWebAppProvider
- *
+ * <p>
  * Base class for Jetty DeploymentManager Providers that are capable of deploying a webapp,
  * either from a bundle or an OSGi service.
- * 
  */
 public abstract class AbstractWebAppProvider extends AbstractLifeCycle implements AppProvider
 {
     private static final Logger LOG = Log.getLogger(AbstractWebAppProvider.class);
     
-    public static String __defaultConfigurations[] = {
-                                                            "org.eclipse.jetty.osgi.boot.OSGiWebInfConfiguration",
-                                                            "org.eclipse.jetty.webapp.WebXmlConfiguration",
-                                                            "org.eclipse.jetty.webapp.MetaInfConfiguration",
-                                                            "org.eclipse.jetty.webapp.FragmentConfiguration",
-                                                            "org.eclipse.jetty.webapp.JettyWebXmlConfiguration"                          
-                                                     };
-    
-    public static void setDefaultConfigurations (String[] defaultConfigs)
-    {
-        __defaultConfigurations = defaultConfigs;
-    }
-    
-    public static String[] getDefaultConfigurations ()
-    {
-        List<String> configs = ArrayUtil.asMutableList(__defaultConfigurations);
-        if (annotationsAvailable())
-        {
-            //add before JettyWebXmlConfiguration
-            int i = configs.indexOf("org.eclipse.jetty.webapp.JettyWebXmlConfiguration");
-            configs.add(i, "org.eclipse.jetty.osgi.annotations.AnnotationConfiguration");
-        }
-        
-        if (jndiAvailable())
-        {
-            //add in EnvConfiguration and PlusConfiguration just after FragmentConfiguration
-            int i = configs.indexOf("org.eclipse.jetty.webapp.FragmentConfiguration");
-            configs.add(++i, "org.eclipse.jetty.plus.webapp.EnvConfiguration");
-            configs.add(++i, "org.eclipse.jetty.plus.webapp.PlusConfiguration");
-        }
-
-        return configs.toArray(new String[configs.size()]);
-    }
-
+    /* ------------------------------------------------------------ */
+    /**
+     * Check if we should be enabling annotation processing
+     * 
+     * @return true if the jetty-annotations.jar is present, false otherwise
+     */
     private static boolean annotationsAvailable()
     {
         boolean result = false;
@@ -114,7 +79,12 @@
         return result;
     }
     
-    
+    /* ------------------------------------------------------------ */
+    /**
+     * Check if jndi is support is present.
+     * 
+     * @return true if the jetty-jndi.jar is present, false otherwise
+     */
     private static boolean jndiAvailable()
     {
         try
@@ -146,11 +116,13 @@
     
     private ServerInstanceWrapper _serverWrapper;
     
+    
+    
     /* ------------------------------------------------------------ */
     /**
      * OSGiApp
      *
-     *
+     * Represents a deployable webapp.
      */
     public class OSGiApp extends AbstractOSGiApp
     {
@@ -316,10 +288,8 @@
             // Set up what has been configured on the provider
             _webApp.setParentLoaderPriority(isParentLoaderPriority());
             _webApp.setExtractWAR(isExtract());
-            if (getConfigurationClasses() != null)
-                _webApp.setConfigurationClasses(getConfigurationClasses());
-            else
-                _webApp.setConfigurationClasses(getDefaultConfigurations());
+            _webApp.setConfigurationClasses(getConfigurationClasses());
+
 
             if (getDefaultsDescriptor() != null)
                 _webApp.setDefaultsDescriptor(getDefaultsDescriptor());
@@ -605,13 +575,27 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * 
-     */
     public String[] getConfigurationClasses()
     {
-        return _configurationClasses;
+        if (_configurationClasses != null)
+            return _configurationClasses;
+
+        Configuration.ClassList defaults = Configuration.ClassList.serverDefault(_serverWrapper.getServer());
+
+        //add before JettyWebXmlConfiguration
+        if (annotationsAvailable())
+            defaults.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", 
+                               "org.eclipse.jetty.osgi.annotations.AnnotationConfiguration");
+
+        //add in EnvConfiguration and PlusConfiguration just after FragmentConfiguration
+        if (jndiAvailable())
+            defaults.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration",
+                              "org.eclipse.jetty.plus.webapp.EnvConfiguration",
+                              "org.eclipse.jetty.plus.webapp.PlusConfiguration");
+       String[] asArray = new String[defaults.size()];
+       return defaults.toArray(asArray);
     }
+    
 
     /* ------------------------------------------------------------ */
     public void setServerInstanceWrapper(ServerInstanceWrapper wrapper)
@@ -625,9 +609,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @return
-     */
     public DeploymentManager getDeploymentManager()
     {
         return _deploymentManager;
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/BundleContextProvider.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/BundleContextProvider.java
index 1a648d2..df1ab1d 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/BundleContextProvider.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/BundleContextProvider.java
@@ -33,28 +33,20 @@
 import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.ServiceRegistration;
 
-
-
 /**
  * BundleContextProvider
- *
+ * <p>
  * Handles deploying OSGi bundles that define a context xml file for configuring them.
- * 
- *
  */
 public class BundleContextProvider extends AbstractContextProvider implements BundleProvider
 {    
     private static final Logger LOG = Log.getLogger(AbstractContextProvider.class);
-    
 
     private Map<String, App> _appMap = new HashMap<String, App>();
     
     private Map<Bundle, List<App>> _bundleMap = new HashMap<Bundle, List<App>>();
     
     private ServiceRegistration _serviceRegForBundles;
-    
-
-    
   
     /* ------------------------------------------------------------ */
     public BundleContextProvider(ServerInstanceWrapper wrapper)
@@ -96,11 +88,6 @@
 
 
     /* ------------------------------------------------------------ */
-    /**
-     * @param bundle
-     * @param contextFiles
-     * @return
-     */
     public boolean bundleAdded (Bundle bundle) throws Exception
     {
         if (bundle == null)
@@ -149,8 +136,8 @@
     /* ------------------------------------------------------------ */
     /** 
      * Bundle has been removed. If it was a context we deployed, undeploy it.
-     * @param bundle
      * 
+     * @param bundle the bundle
      * @return true if this was a context we had deployed, false otherwise
      */
     public boolean bundleRemoved (Bundle bundle) throws Exception
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/BundleWebAppProvider.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/BundleWebAppProvider.java
index 9117927..c662992 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/BundleWebAppProvider.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/BundleWebAppProvider.java
@@ -25,19 +25,17 @@
 
 import org.eclipse.jetty.deploy.App;
 import org.eclipse.jetty.osgi.boot.internal.serverfactory.ServerInstanceWrapper;
+import org.eclipse.jetty.osgi.boot.utils.Util;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.ServiceRegistration;
 
-
-
 /**
  * BundleWebAppProvider
- *
+ * <p>
  * A Jetty Provider that knows how to deploy a WebApp contained inside a Bundle.
- * 
  */
 public class BundleWebAppProvider extends AbstractWebAppProvider implements BundleProvider
 {     
@@ -52,17 +50,11 @@
     
 
     /* ------------------------------------------------------------ */
-    /**
-     * @param wrapper
-     */
     public BundleWebAppProvider (ServerInstanceWrapper wrapper)
     {
         super(wrapper);
     }
     
-    
-    
-    
     /* ------------------------------------------------------------ */
     /** 
      * @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStart()
@@ -107,7 +99,7 @@
     /* ------------------------------------------------------------ */
     /**
      * A bundle has been added that could be a webapp 
-     * @param bundle
+     * @param bundle the bundle
      */
     public boolean bundleAdded (Bundle bundle) throws Exception
     {
@@ -122,9 +114,10 @@
             Dictionary headers = bundle.getHeaders();
 
             //does the bundle have a OSGiWebappConstants.JETTY_WAR_FOLDER_PATH 
-            if (headers.get(OSGiWebappConstants.JETTY_WAR_FOLDER_PATH) != null)
+            String resourcePath = Util.getManifestHeaderValue(OSGiWebappConstants.JETTY_WAR_FOLDER_PATH, OSGiWebappConstants.JETTY_WAR_RESOURCE_PATH, headers);
+            if (resourcePath != null)
             {
-                String base = (String)headers.get(OSGiWebappConstants.JETTY_WAR_FOLDER_PATH);
+                String base = resourcePath;
                 contextPath = getContextPath(bundle);
                 String originId = getOriginId(bundle, base);
  
@@ -188,8 +181,8 @@
     /* ------------------------------------------------------------ */
     /** 
      * Bundle has been removed. If it was a webapp we deployed, undeploy it.
-     * @param bundle
      * 
+     * @param bundle the bundle
      * @return true if this was a webapp we had deployed, false otherwise
      */
     public boolean bundleRemoved (Bundle bundle) throws Exception
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/JettyBootstrapActivator.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/JettyBootstrapActivator.java
index 630f20e..0bae5fd 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/JettyBootstrapActivator.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/JettyBootstrapActivator.java
@@ -36,13 +36,12 @@
 
 /**
  * JettyBootstrapActivator
- * 
+ * <p>
  * Bootstrap jetty and publish a default Server instance as an OSGi service.
- * 
+ * <p>
  * Listen for other Server instances to be published as services and support them as deployment targets.
- * 
+ * <p>
  * Listen for Bundles to be activated, and deploy those that represent webapps/ContextHandlers to one of the known Server instances.
- * 
  */
 public class JettyBootstrapActivator implements BundleActivator
 {
@@ -74,7 +73,7 @@
      * webapps. Setup the BundleListener that supports the extender pattern for
      * the jetty ContextHandler.
      * 
-     * @param context
+     * @param context the bundle context
      */
     public void start(final BundleContext context) throws Exception
     {
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiServerConstants.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiServerConstants.java
index b52672a..6b846a7 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiServerConstants.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiServerConstants.java
@@ -30,6 +30,7 @@
      * configuration.
      */
     public static final String JETTY_HOME = "jetty.home";
+    public static final String JETTY_BASE = "jetty.base";
 
     /**
      * System property to point to a bundle that embeds a jetty configuration
@@ -42,21 +43,20 @@
      * Usual system property used as the hostname for a typical jetty
      * configuration.
      */
-    public static final String JETTY_HOST = "jetty.host";
+    public static final String JETTY_HOST = "jetty.http.host";
 
     /**
      * Usual system property used as the port for http for a typical jetty
      * configuration.
      */
-    public static final String JETTY_PORT = "jetty.port";
+    public static final String JETTY_PORT = "jetty.http.port";
 
     /**
      * Usual system property used as the port for https for a typical jetty
      * configuration.
      */
-    public static final String JETTY_PORT_SSL = "jetty.port.ssl";
-    
-    
+    public static final String JETTY_PORT_SSL = "jetty.ssl.port";
+
     //for managed jetty instances, name of the configuration parameters
     /**
      * PID of the jetty servers's ManagedFactory
@@ -85,5 +85,4 @@
      * List of URLs to the folders where the legacy J2EE shared libraries are stored aka lib/ext, lib/jsp etc.
      */
     public static final String MANAGED_JETTY_SHARED_LIB_FOLDER_URLS = "managedJettySharedLibFolderUrls";
-    
 }
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiWebInfConfiguration.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiWebInfConfiguration.java
index 2048780..9889242 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiWebInfConfiguration.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiWebInfConfiguration.java
@@ -22,13 +22,16 @@
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.TreeMap;
 import java.util.regex.Pattern;
 
 import org.eclipse.jetty.osgi.boot.utils.BundleFileLocatorHelperFactory;
+import org.eclipse.jetty.osgi.boot.utils.Util;
 import org.eclipse.jetty.osgi.boot.utils.internal.PackageAdminServiceTracker;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
@@ -202,7 +205,7 @@
     @Override
     public void configure(WebAppContext context) throws Exception
     {
-        TreeMap<String, Resource> patchResourcesPath = new TreeMap<String, Resource>();
+        TreeMap<String, Resource> prependedResourcesPath = new TreeMap<String, Resource>();
         TreeMap<String, Resource> appendedResourcesPath = new TreeMap<String, Resource>();
              
         Bundle bundle = (Bundle)context.getAttribute(OSGiWebappConstants.JETTY_OSGI_BUNDLE);
@@ -226,46 +229,33 @@
                 // looked up.
                 for (Bundle frag : fragments)
                 {
-                    String fragFolder = (String) frag.getHeaders().get(OSGiWebappConstants.JETTY_WAR_FRAGMENT_FOLDER_PATH);
-                    String patchFragFolder = (String) frag.getHeaders().get(OSGiWebappConstants.JETTY_WAR_PATCH_FRAGMENT_FOLDER_PATH);
-                    if (fragFolder != null)
-                    {
-                        URL fragUrl = frag.getEntry(fragFolder);
-                        if (fragUrl == null) { throw new IllegalArgumentException("Unable to locate " + fragFolder
-                                                                                  + " inside "
-                                                                                  + " the fragment '"
-                                                                                  + frag.getSymbolicName()
-                                                                                  + "'"); }
-                        fragUrl = BundleFileLocatorHelperFactory.getFactory().getHelper().getLocalURL(fragUrl);
-                        String key = fragFolder.startsWith("/") ? fragFolder.substring(1) : fragFolder;
-                        appendedResourcesPath.put(key + ";" + frag.getSymbolicName(), Resource.newResource(fragUrl));
-                    }
-                    if (patchFragFolder != null)
-                    {
-                        URL patchFragUrl = frag.getEntry(patchFragFolder);
-                        if (patchFragUrl == null)
-                        { 
-                            throw new IllegalArgumentException("Unable to locate " + patchFragUrl
-                                                               + " inside fragment '"+frag.getSymbolicName()+ "'"); 
-                        }
-                        patchFragUrl = BundleFileLocatorHelperFactory.getFactory().getHelper().getLocalURL(patchFragUrl);
-                        String key = patchFragFolder.startsWith("/") ? patchFragFolder.substring(1) : patchFragFolder;
-                        patchResourcesPath.put(key + ";" + frag.getSymbolicName(), Resource.newResource(patchFragUrl));
-                    }
+                    String path = Util.getManifestHeaderValue(OSGiWebappConstants.JETTY_WAR_FRAGMENT_FOLDER_PATH,OSGiWebappConstants.JETTY_WAR_FRAGMENT_RESOURCE_PATH,frag.getHeaders());
+                    convertFragmentPathToResource(path, frag, appendedResourcesPath);
+                    path = Util.getManifestHeaderValue(OSGiWebappConstants.JETTY_WAR_PATCH_FRAGMENT_FOLDER_PATH, OSGiWebappConstants.JETTY_WAR_PREPEND_FRAGMENT_RESOURCE_PATH, frag.getHeaders());
+                    convertFragmentPathToResource(path, frag, prependedResourcesPath);
                 }
                 if (!appendedResourcesPath.isEmpty())
-                    context.setAttribute(WebInfConfiguration.RESOURCE_DIRS, new HashSet<Resource>(appendedResourcesPath.values()));
+                {
+                    LinkedHashSet<Resource> resources = new LinkedHashSet<Resource>();
+                    //Add in any existing setting of extra resource dirs
+                    Set<Resource> resourceDirs = (Set<Resource>)context.getAttribute(WebInfConfiguration.RESOURCE_DIRS);
+                    if (resourceDirs != null && !resourceDirs.isEmpty())
+                        resources.addAll(resourceDirs);
+                    //Then append the values from JETTY_WAR_FRAGMENT_FOLDER_PATH
+                    resources.addAll(appendedResourcesPath.values());
+                    
+                    context.setAttribute(WebInfConfiguration.RESOURCE_DIRS, resources);
+                }
             }
         }
         
         super.configure(context);
 
-        // place the patch resources at the beginning of the contexts's resource base
-        if (!patchResourcesPath.isEmpty())
+        // place the prepended resources at the beginning of the contexts's resource base
+        if (!prependedResourcesPath.isEmpty())
         {
-            Resource[] resources = new Resource[1+patchResourcesPath.size()];
-            ResourceCollection mergedResources = new ResourceCollection (patchResourcesPath.values().toArray(new Resource[patchResourcesPath.size()]));
-            System.arraycopy(patchResourcesPath.values().toArray(new Resource[patchResourcesPath.size()]), 0, resources, 0, patchResourcesPath.size());
+            Resource[] resources = new Resource[1+prependedResourcesPath.size()];
+            System.arraycopy(prependedResourcesPath.values().toArray(new Resource[prependedResourcesPath.size()]), 0, resources, 0, prependedResourcesPath.size());
             resources[resources.length-1] = context.getBaseResource();
             context.setBaseResource(new ResourceCollection(resources));
         }
@@ -311,4 +301,32 @@
         
         return resources;
     }
+    
+
+    /**
+     * Convert a path inside a fragment into a Resource
+     * @param resourcePath
+     * @param fragment
+     * @param resourceMap
+     * @throws Exception
+     */
+    private void convertFragmentPathToResource (String resourcePath, Bundle fragment, Map<String, Resource> resourceMap )
+    throws Exception
+    {
+        if (resourcePath == null)
+            return;
+
+        URL url = fragment.getEntry(resourcePath);
+        if (url == null) 
+        { 
+            throw new IllegalArgumentException("Unable to locate " + resourcePath
+                                               + " inside "
+                                               + " the fragment '"
+                                               + fragment.getSymbolicName()
+                                               + "'"); 
+        }
+        url = BundleFileLocatorHelperFactory.getFactory().getHelper().getLocalURL(url);
+        String key = resourcePath.startsWith("/") ? resourcePath.substring(1) : resourcePath;
+        resourceMap.put(key + ";" + fragment.getSymbolicName(), Resource.newResource(url));
+    }
 }
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiWebappConstants.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiWebappConstants.java
index bb4e1fa..6c241de 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiWebappConstants.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiWebappConstants.java
@@ -67,16 +67,23 @@
     public static final String JETTY_CONTEXT_FILE_PATH = "Jetty-ContextFilePath";
 
     /** path within the bundle to the folder that contains the basic resources. */
+    @Deprecated
     public static final String JETTY_WAR_FOLDER_PATH = "Jetty-WarFolderPath";
+    public static final String JETTY_WAR_RESOURCE_PATH = "Jetty-WarResourcePath";
 
     /** path within a fragment hosted by a web-bundle to a folder that contains basic resources.
      * the path is appended to the lookup path where jetty locates static resources */
+    @Deprecated
     public static final String JETTY_WAR_FRAGMENT_FOLDER_PATH = "Jetty-WarFragmentFolderPath";
+    public static final String JETTY_WAR_FRAGMENT_RESOURCE_PATH = "Jetty-WarFragmentResourcePath";
+    
 
     /** path within a fragment hosted by a web-bundle to a folder that contains basic resources.
      * The path is prefixed to the lookup path where jetty locates static resources:
      * this will override static resources with the same name in the web-bundle. */
+    @Deprecated
     public static final String JETTY_WAR_PATCH_FRAGMENT_FOLDER_PATH = "Jetty-WarPatchFragmentFolderPath";
+    public static final String JETTY_WAR_PREPEND_FRAGMENT_RESOURCE_PATH = "Jetty-WarPrependFragmentResourcePath";
 
   
     /** installation path of webapp bundle
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/ServiceWebAppProvider.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/ServiceWebAppProvider.java
index 08de2b2..32ac961 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/ServiceWebAppProvider.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/ServiceWebAppProvider.java
@@ -36,19 +36,15 @@
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 
-
-
 /**
  * ServiceWebAppProvider
- *
+ * <p>
  * Jetty Provider that knows how to deploy a WebApp that has been registered as an OSGi service.
- * 
  */
 public class ServiceWebAppProvider extends AbstractWebAppProvider implements ServiceProvider
 {   
     private static final Logger LOG = Log.getLogger(AbstractWebAppProvider.class);
     
-    
     /**
      * Map of ServiceRef to App. Used when it is an osgi service that is a WebAppContext.
      */
@@ -56,7 +52,6 @@
     
     private ServiceRegistration _serviceRegForServices;
     
-    
     /**
      * ServiceApp
      *
@@ -91,9 +86,6 @@
     
     
     /* ------------------------------------------------------------ */
-    /**
-     * @param wrapper
-     */
     public ServiceWebAppProvider (ServerInstanceWrapper wrapper)
     {
         super(wrapper);
@@ -128,6 +120,8 @@
      
         String base = (String)serviceRef.getProperty(OSGiWebappConstants.JETTY_WAR_FOLDER_PATH);
         if (base == null)
+            base = (String)serviceRef.getProperty(OSGiWebappConstants.JETTY_WAR_RESOURCE_PATH);
+        if (base == null)
             base = (String)serviceRef.getProperty(OSGiWebappConstants.SERVICE_PROP_WAR);
         
        if (base == null)
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/serverfactory/DefaultJettyAtJettyHomeHelper.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/serverfactory/DefaultJettyAtJettyHomeHelper.java
index ff1a774..327e8be 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/serverfactory/DefaultJettyAtJettyHomeHelper.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/serverfactory/DefaultJettyAtJettyHomeHelper.java
@@ -20,7 +20,6 @@
 
 import java.io.File;
 import java.net.MalformedURLException;
-import java.net.URI;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Dictionary;
@@ -32,7 +31,6 @@
 import org.eclipse.jetty.osgi.boot.JettyBootstrapActivator;
 import org.eclipse.jetty.osgi.boot.OSGiServerConstants;
 import org.eclipse.jetty.osgi.boot.utils.BundleFileLocatorHelperFactory;
-import org.eclipse.jetty.osgi.boot.utils.OSGiClassLoader;
 import org.eclipse.jetty.osgi.boot.utils.Util;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.util.log.Log;
@@ -44,12 +42,11 @@
 
 /**
  * DefaultJettyAtJettyHomeHelper
- * 
- * 
+ * <p>
  * Creates a default instance of Jetty, based on the values of the
  * System properties "jetty.home" or "jetty.home.bundle", one of which
  * must be specified in order to create the default instance.
- * 
+ * <p> 
  * Called by the {@link JettyBootstrapActivator} during the starting of the
  * bundle. 
  */
@@ -65,7 +62,7 @@
     /**
      * Set of config files to apply to a jetty Server instance if none are supplied by SYS_PROP_JETTY_ETC_FILES
      */
-    public static final String DEFAULT_JETTY_ETC_FILES = "etc/jetty.xml,etc/jetty-selector.xml,etc/jetty-deployer.xml";
+    public static final String DEFAULT_JETTY_ETC_FILES = "etc/jetty.xml,etc/jetty-http.xml,etc/jetty-deployer.xml";
     
     /**
      * Default location within bundle of a jetty home dir.
@@ -90,10 +87,13 @@
      * files.
      * </p>
      * <p>
-     * In both cases the system properties jetty.host, jetty.port and
-     * jetty.port.ssl are passed to the configuration files that might use them
+     * In both cases the system properties jetty.http.host, jetty.http.port and
+     * jetty.ssl.port are passed to the configuration files that might use them
      * as part of their properties.
      * </p>
+     * @param bundleContext the bundle context
+     * @return the configured server
+     * @throws Exception if unable to create / configure / or start the server
      */
     public static Server startJettyAtJettyHome(BundleContext bundleContext) throws Exception
     {
@@ -157,7 +157,12 @@
         List<URL> configURLs = jettyHomeDir != null ? getJettyConfigurationURLs(jettyHomeDir) : getJettyConfigurationURLs(jettyHomeBundle, properties);
 
         LOG.info("Configuring the default jetty server with {}",configURLs);
-        LOG.info("JETTY.HOME="+properties.get(OSGiServerConstants.JETTY_HOME));
+        String home=properties.get(OSGiServerConstants.JETTY_HOME);
+        String base=properties.get(OSGiServerConstants.JETTY_BASE);
+        if (base==null)
+            base=home;
+        LOG.info("JETTY.HOME="+home);
+        LOG.info("JETTY.BASE="+base);
         ClassLoader contextCl = Thread.currentThread().getContextClassLoader();
         try
         {
@@ -166,13 +171,13 @@
             // these properties usually are the ones passed to this type of
             // configuration.
             properties.put(OSGiServerConstants.MANAGED_JETTY_SERVER_NAME, OSGiServerConstants.MANAGED_JETTY_SERVER_DEFAULT_NAME);
-            Util.setProperty(properties, OSGiServerConstants.JETTY_HOST, System.getProperty(OSGiServerConstants.JETTY_HOST));
-            Util.setProperty(properties, OSGiServerConstants.JETTY_PORT, System.getProperty(OSGiServerConstants.JETTY_PORT));
-            Util.setProperty(properties, OSGiServerConstants.JETTY_PORT_SSL, System.getProperty(OSGiServerConstants.JETTY_PORT_SSL));
-
+            Util.setProperty(properties, OSGiServerConstants.JETTY_HOST, System.getProperty(OSGiServerConstants.JETTY_HOST, System.getProperty("jetty.host")));
+            Util.setProperty(properties, OSGiServerConstants.JETTY_PORT, System.getProperty(OSGiServerConstants.JETTY_PORT, System.getProperty("jetty.port")));
+            Util.setProperty(properties, OSGiServerConstants.JETTY_PORT_SSL, System.getProperty(OSGiServerConstants.JETTY_PORT_SSL, System.getProperty("ssl.port")));
+            Util.setProperty(properties, OSGiServerConstants.JETTY_HOME, home);
+            Util.setProperty(properties, OSGiServerConstants.JETTY_BASE, base);
             Server server = ServerInstanceWrapper.configure(null, configURLs, properties);
-            //ensure jetty.home is set
-            server.setAttribute(OSGiServerConstants.JETTY_HOME, properties.get(OSGiServerConstants.JETTY_HOME));
+            
             
             //Register the default Server instance as an OSGi service.
             //The JettyServerServiceTracker will notice it and set it up to deploy bundles as wars etc
@@ -180,6 +185,11 @@
             LOG.info("Default jetty server configured");
             return server;
         }
+        catch (Exception e)
+        {
+            LOG.warn(e);
+            throw e;
+        }
         finally
         {
             Thread.currentThread().setContextClassLoader(contextCl);
@@ -280,9 +290,9 @@
     /**
      * Get a resource representing a directory inside a bundle. If the dir is null,
      * return a resource representing the installation location of the bundle.
-     * @param bundle
-     * @param dir
-     * @return
+     * @param bundle the bundle
+     * @param dir the directory
+     * @return the resource found
      */
     public static Resource findDir (Bundle bundle, String dir)
     {
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/serverfactory/ServerInstanceWrapper.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/serverfactory/ServerInstanceWrapper.java
index 0ffab2a..7452828 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/serverfactory/ServerInstanceWrapper.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/serverfactory/ServerInstanceWrapper.java
@@ -19,7 +19,6 @@
 package org.eclipse.jetty.osgi.boot.internal.serverfactory;
 
 import java.io.File;
-import java.io.InputStream;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -52,12 +51,10 @@
 import org.eclipse.jetty.osgi.boot.utils.Util;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.util.IO;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.resource.Resource;
 import org.eclipse.jetty.xml.XmlConfiguration;
-import org.xml.sax.SAXParseException;
 
 /**
  * ServerInstanceWrapper
@@ -147,47 +144,42 @@
 
         for (URL jettyConfiguration : jettyConfigurations)
         {
-            InputStream is = null;
-            try
-            {
-                // Execute a Jetty configuration file
-                Resource r = Resource.newResource(jettyConfiguration);
-                if (!r.exists())
-                {
-                    LOG.warn("File does not exist "+r);
-                    throw new IllegalStateException("No such jetty server config file: "+r);
-                }
-                is = r.getInputStream();
-                XmlConfiguration config = new XmlConfiguration(is);
-                config.getIdMap().putAll(id_map);
-                config.getProperties().putAll(properties);
-                
-                // #334062 compute the URL of the folder that contains the
-                // conf file and set it as a property so we can compute relative paths
-                // from it.
-                String urlPath = jettyConfiguration.toString();
-                int lastSlash = urlPath.lastIndexOf('/');
-                if (lastSlash > 4)
-                {
-                    urlPath = urlPath.substring(0, lastSlash);
-                    config.getProperties().put(PROPERTY_THIS_JETTY_XML_FOLDER_URL, urlPath);
-                }
-     
-                Object o = config.configure();
-                if (server == null)
-                    server = (Server)o;
-                
-                id_map = config.getIdMap();
-            }
-            catch (SAXParseException saxparse)
-            {
-                LOG.warn("Unable to configure the jetty/etc file " + jettyConfiguration, saxparse);
-                throw saxparse;
-            }
-            finally
-            {
-                IO.close(is);
-            }
+        	try(Resource r = Resource.newResource(jettyConfiguration))
+        	{
+        		// Execute a Jetty configuration file
+        		if (!r.exists())
+        		{
+        			LOG.warn("File does not exist "+r);
+        			throw new IllegalStateException("No such jetty server config file: "+r);
+        		}
+
+        		XmlConfiguration config = new XmlConfiguration(r.getURL());
+
+        		config.getIdMap().putAll(id_map);
+        		config.getProperties().putAll(properties);
+
+        		// #334062 compute the URL of the folder that contains the
+        		// conf file and set it as a property so we can compute relative paths
+        		// from it.
+        		String urlPath = jettyConfiguration.toString();
+        		int lastSlash = urlPath.lastIndexOf('/');
+        		if (lastSlash > 4)
+        		{
+        			urlPath = urlPath.substring(0, lastSlash);
+        			config.getProperties().put(PROPERTY_THIS_JETTY_XML_FOLDER_URL, urlPath);
+        		}
+
+        		Object o = config.configure();
+        		if (server == null)
+        			server = (Server)o;
+
+        		id_map = config.getIdMap();
+        	}
+        	catch (Exception e)
+        	{
+        		LOG.warn("Configuration error in " + jettyConfiguration);
+        		throw e;
+        	}
         }
 
         return server;
@@ -214,7 +206,7 @@
      * The classloader that should be the parent classloader for each webapp
      * deployed on this server.
      * 
-     * @return
+     * @return the classloader
      */
     public ClassLoader getParentClassLoaderForWebapps()
     {
@@ -250,7 +242,6 @@
         return _ctxtCollection;
     }
     
-    
     /* ------------------------------------------------------------ */
     public void start(Server server, Dictionary props) throws Exception
     {
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/BundleWatcher.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/BundleWatcher.java
index 9ae3183..4a7513b 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/BundleWatcher.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/BundleWatcher.java
@@ -42,12 +42,9 @@
 /**
  * BundleWatcher
  * 
- * 
  * Tracks the installation and removal of Bundles in the OSGi environment. Any bundles
  * that are added are passed to the set of Jetty DeploymentManager providers to see if
  * the bundle should be deployed as a webapp or ContextHandler into Jetty.
- * 
- * @author hmalphettes
  */
 public class BundleWatcher implements BundleTrackerCustomizer
 {
@@ -66,9 +63,6 @@
  
     
     /* ------------------------------------------------------------ */
-    /**
-     * @throws Exception
-     */
     public BundleWatcher() throws Exception
     {
         _bundle = FrameworkUtil.getBundle(this.getClass());
@@ -133,10 +127,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @param managedServerName
-     * @return
-     */
     public Map<ServiceReference, BundleProvider> getDeployers(String managedServerName)
     {
         if (managedServerName == null)
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/LibExtClassLoaderHelper.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/LibExtClassLoaderHelper.java
index d10b6f5..5f27d86 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/LibExtClassLoaderHelper.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/LibExtClassLoaderHelper.java
@@ -30,14 +30,11 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.eclipse.jetty.server.Server;
-
 /**
  * LibExtClassLoaderHelper
- * 
- * 
+ * <p>
  * Helper to create a URL class-loader with the jars inside
- * ${jetty.home}/lib/ext and ${jetty.home}/resources. In an ideal world, every
+ * <code>${jetty.home}/lib/ext</code> and <code>${jetty.home}/resources</code>. In an ideal world, every
  * library is an OSGi bundle that does loads nicely. To support standard jars or
  * bundles that cannot be loaded in the current OSGi environment, we support
  * inserting the jars in the usual jetty/lib/ext folders in the proper classpath
@@ -45,7 +42,6 @@
  * <p>
  * The drawback is that those jars will not be available in the OSGi
  * classloader.
- * </p>
  * <p>
  * Alternatives to placing jars in lib/ext:
  * <ol>
@@ -56,7 +52,6 @@
  * <li>Use equinox Buddy-Policy: register a buddy of the jetty bootstrapper
  * bundle. (Note: it will work only on equinox)</li>
  * </ol>
- * </p>
  */
 public class LibExtClassLoaderHelper
 {
@@ -78,11 +73,12 @@
     
     /* ------------------------------------------------------------ */
     /**
-     * @param server
+     * @param jettyHome the jetty home 
+     * @param parentClassLoader the parent classloader
      * @return a url classloader with the jars of resources, lib/ext and the
      *         jars passed in the other argument. The parent classloader usually
      *         is the JettyBootStrapper (an osgi classloader.
-     * @throws MalformedURLException
+     * @throws MalformedURLException if the jetty home reference is invalid
      */
     public static ClassLoader createLibEtcClassLoader(File jettyHome, ClassLoader parentClassLoader) throws MalformedURLException
     {
@@ -134,12 +130,14 @@
     
     /* ------------------------------------------------------------ */
     /**
-     * @param server
+     * @param jarsContainerOrJars the jars via file references
+     * @param otherJarsOrFolder more jars via url references
+     * @param parentClassLoader the parent classloader
      * @return a url classloader with the jars of resources, lib/ext and the
      *         jars passed in the other argument. The parent classloader usually
      *         is the JettyBootStrapper (an osgi classloader). If there was no
      *         extra jars to insert, then just return the parentClassLoader.
-     * @throws MalformedURLException
+     * @throws MalformedURLException if there is a bad jar file reference
      */
     public static ClassLoader createLibExtClassLoader(List<File> jarsContainerOrJars, List<URL> otherJarsOrFolder, ClassLoader parentClassLoader) 
     throws MalformedURLException
@@ -183,13 +181,14 @@
      * depending too much directly on a particular logging framework.
      * <p>
      * We can afford to do some implementation specific code for a logging
-     * framework only in a fragment. <br/>
+     * framework only in a fragment.
+     * <p>
      * Trying to configure log4j and logback in here.
-     * </p>
      * <p>
      * We recommend that slf4j jars are all placed in the osgi framework. And a
      * single implementation if possible packaged as an osgi bundle is there.
-     * </p>
+     * @param jettyHome the jetty home reference
+     * @param childrenFiles the map of child files
      */
     protected static void processFilesInResourcesFolder(File jettyHome, Map<String, File> childrenFiles)
     {
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/OSGiWebappClassLoader.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/OSGiWebappClassLoader.java
index 2f4b19b..bc889ce 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/OSGiWebappClassLoader.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/OSGiWebappClassLoader.java
@@ -85,7 +85,7 @@
      * @param parent The parent classloader.
      * @param context The WebAppContext
      * @param contributor The bundle that defines this web-application.
-     * @throws IOException
+     * @throws IOException if unable to cerate the OSGiWebappClassLoader
      */
     public OSGiWebappClassLoader(ClassLoader parent, WebAppContext context, Bundle contributor)
     throws IOException
@@ -272,6 +272,7 @@
      * WebappContext So we place a fake one there to start with. We replace it
      * with the actual webapp context with this method. We also apply the
      * extraclasspath there at the same time.
+     * @param webappContext the web app context
      */
     public void setWebappContext(WebAppContext webappContext)
     {
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/ServiceWatcher.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/ServiceWatcher.java
index 7838b4f..bbce9f2 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/ServiceWatcher.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/ServiceWatcher.java
@@ -54,16 +54,11 @@
     
     public static final String FILTER = "(objectclass=" + ServiceProvider.class.getName() + ")";
 
-    
     //track all instances of deployers of webapps as bundles       
     ServiceTracker _serviceTracker;
     
-    
      
     /* ------------------------------------------------------------ */
-    /**
-     * @param registry
-     */
     public ServiceWatcher() throws Exception
     {
         //track all instances of deployers of webapps
@@ -75,10 +70,6 @@
 
    
     /* ------------------------------------------------------------ */
-    /**
-     * @param managedServerName
-     * @return
-     */
     public Map<ServiceReference, ServiceProvider> getDeployers(String managedServerName)
     {
         if (managedServerName == null)
@@ -154,9 +145,10 @@
     
     /* ------------------------------------------------------------ */
     /** Deploy ContextHandler that is a Service.
-     * 
-     * @param reference
-     * @return
+     * @param context the bundle context 
+     * @param contextHandler  the context handler
+     * @param reference the service reference
+     * @return the object added
      */
     public Object addService (BundleContext context, ContextHandler contextHandler, ServiceReference reference)
     {
@@ -200,8 +192,9 @@
     /* ------------------------------------------------------------ */
     /**
      * Undeploy a ContextHandler that is a Service.
-     * 
-     * @param reference
+     * @param context the bundle context 
+     * @param contextHandler the context handler
+     * @param reference the service reference
      */
     public void removeService (BundleContext context, ContextHandler contextHandler, ServiceReference reference)
     {
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/BundleClassLoaderHelper.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/BundleClassLoaderHelper.java
index 421226d..b8fe595 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/BundleClassLoaderHelper.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/BundleClassLoaderHelper.java
@@ -22,10 +22,8 @@
 import org.osgi.framework.Bundle;
 
 /**
- * 
  * BundleClassLoaderHelper
- * 
- * 
+ * <p> 
  * Is there a clean OSGi way to go from the Bundle object to the classloader of
  * the Bundle ? You can certainly take a class inside the bundle and get the
  * bundle's classloader that way. Getting the classloader directly from the
@@ -34,11 +32,9 @@
  * We could use fragments that are specific to each OSGi implementation. Using
  * introspection here to keep packaging simple and avoid the multiplication of
  * the jars.
- * </p>
  * <p>
  * The default implementation relies on introspection and supports equinox-3.5
  * and felix-2.0.0
- * </p>
  */
 public interface BundleClassLoaderHelper
 {
@@ -50,6 +46,7 @@
     public static BundleClassLoaderHelper DEFAULT = new DefaultBundleClassLoaderHelper();
 
     /**
+     * @param bundle the bundle
      * @return The classloader of a given bundle. Assuming the bundle is
      *         started.
      */
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/BundleFileLocatorHelper.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/BundleFileLocatorHelper.java
index 68add7c..0dc1b3b 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/BundleFileLocatorHelper.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/BundleFileLocatorHelper.java
@@ -28,12 +28,9 @@
 
 /**
  * BundleFileLocatorHelper
- * 
- * 
+ * <p> 
  * From a bundle to its location on the filesystem. Assumes the bundle is not a
  * jar.
- * 
- * @author hmalphettes
  */
 public interface BundleFileLocatorHelper
 {
@@ -50,21 +47,20 @@
      * other situations.
      * <p>
      * Currently only works with bundles that are not jar.
-     * </p>
      * 
      * @param bundle The bundle
      * @return Its installation location as a file.
-     * @throws Exception
+     * @throws Exception if unable to get the install location
      */
     public File getBundleInstallLocation(Bundle bundle) throws Exception;
 
     /**
      * Locate a file inside a bundle.
      * 
-     * @param bundle
-     * @param path
-     * @return file object
-     * @throws Exception
+     * @param bundle the bundle
+     * @param path the path
+     * @return file the file object
+     * @throws Exception if unable to get the file
      */
     public File getFileInBundle(Bundle bundle, String path) throws Exception;
 
@@ -76,11 +72,11 @@
      * files inside jars alone. In fact we only support the second situation for
      * development purpose where the bundle was imported in pde and the classes
      * kept in a jar.
-     * </p>
      * 
-     * @param bundle
+     * @param bundle the bundle
      * @return The jar(s) file that is either the bundle itself, either the jars
      *         embedded inside it.
+     * @throws Exception if unable to locate the jars
      */
     public File[] locateJarsInsideBundle(Bundle bundle) throws Exception;
 
@@ -88,37 +84,37 @@
      * Helper method equivalent to Bundle#getEntry(String entryPath) except that
      * it searches for entries in the fragments by using the findEntries method.
      * 
-     * @param bundle
-     * @param entryPath
+     * @param bundle the bundle
+     * @param entryPath the entry path
      * @return null or all the entries found for that path.
      */
     public Enumeration<URL> findEntries(Bundle bundle, String entryPath);
     
     /**
-     * Only useful for equinox: on felix we get the file:// or jar:// url
+     * Only useful for equinox: on felix we get the <code>file://</code> or <code>jar://</code> url
      * already. Other OSGi implementations have not been tested
      * <p>
-     * Get a URL to the bundle entry that uses a common protocol (i.e. file:
-     * jar: or http: etc.).
-     * </p>
+     * Get a URL to the bundle entry that uses a common protocol (i.e. <code>file:</code>
+     * <code>jar:</code> or <code>http:</code> etc.).
      * 
+     * @param url the url 
      * @return a URL to the bundle entry that uses a common protocol
+     * @throws Exception if unable to get the local url
      */
     public URL getLocalURL(URL url) throws Exception;
     
     /**
-     * Only useful for equinox: on felix we get the file:// url already. Other
+     * Only useful for equinox: on felix we get the <code>file://</code> url already. Other
      * OSGi implementations have not been tested
      * <p>
-     * Get a URL to the content of the bundle entry that uses the file:
+     * Get a URL to the content of the bundle entry that uses the <code>file:</code>
      * protocol. The content of the bundle entry may be downloaded or extracted
      * to the local file system in order to create a file: URL.
      * 
+     * @param url the url 
      * @return a URL to the content of the bundle entry that uses the file:
      *         protocol
-     *         </p>
-     * @throws IOException 
-     * @throws Exception 
+     * @throws Exception if unable to get the file url
      */
     public URL getFileURL(URL url) throws Exception;
 
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/EventSender.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/EventSender.java
index 0d612d8..f84e486 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/EventSender.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/EventSender.java
@@ -28,10 +28,7 @@
 import org.osgi.service.event.EventAdmin;
 
 /**
- * EventSender
- *
  * Utility class for emiting OSGi EventAdmin events
- * 
  */
 public class EventSender
 {    
@@ -42,18 +39,10 @@
     public static final String UNDEPLOYED_EVENT = "org/osgi/service/web/UNDEPLOYED"; 
     public static final String FAILED_EVENT = "org/osgi/service/web/FAILED"; 
     
-    
     private static final EventSender __instance = new EventSender();
     private Bundle _myBundle;
     private EventAdmin _eventAdmin;
     
-    
-    
-    
-    /* ------------------------------------------------------------ */
-    /**
-     * 
-     */
     private EventSender ()
     {
         _myBundle = FrameworkUtil.getBundle(EventSender.class);
@@ -62,26 +51,11 @@
             _eventAdmin = (EventAdmin)_myBundle.getBundleContext().getService(ref);
     }
     
-    
-    
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @return
-     */
     public static EventSender getInstance()
     {
         return __instance;
     }
 
-    
-    
-    /* ------------------------------------------------------------ */
-    /**
-     * @param topic
-     * @param wab
-     * @param contextPath
-     */
     public  void send (String topic, Bundle wab, String contextPath)
     {
         if (topic==null || wab==null || contextPath==null)
@@ -90,15 +64,6 @@
         send(topic, wab, contextPath, null);
     }
     
-    
-    
-    /* ------------------------------------------------------------ */
-    /**
-     * @param topic
-     * @param wab
-     * @param contextPath
-     * @param ex
-     */
     public  void send (String topic, Bundle wab, String contextPath, Exception ex)
     {        
         if (_eventAdmin == null)
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/FakeURLClassLoader.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/FakeURLClassLoader.java
index e44deae..eeb293b 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/FakeURLClassLoader.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/FakeURLClassLoader.java
@@ -22,29 +22,21 @@
 import java.net.URLClassLoader;
 
 /**
- * 
  * FakeURLClassLoader
- * 
+ * <p>
  * A URLClassloader that overrides the getURLs() method to return the list
  * of urls passed in to the constructor, but otherwise acts as if it has no
  * urls, which would cause it to delegate to the parent classloader (in this
  * case an OSGi classloader).
- * 
+ * <p>
  * The main use of this class is with jars containing tlds. Jasper expects a
  * URL classloader to inspect for jars with tlds.
- * 
  */
 public class FakeURLClassLoader extends URLClassLoader
 {
-
     private URL[] _jars;
     
-    
     /* ------------------------------------------------------------ */
-    /**
-     * @param osgiClassLoader
-     * @param jars
-     */
     public FakeURLClassLoader(ClassLoader osgiClassLoader, URL[] jars)
     {
         super(new URL[] {},osgiClassLoader);
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/Util.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/Util.java
index 7fe815e..5a6aca0 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/Util.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/Util.java
@@ -27,23 +27,43 @@
 import java.util.StringTokenizer;
 
 /**
- * Util
- *
- * Various useful functions used widely.
+ * Various useful functions utility methods for OSGi wide use.
  */
 public class Util
 {
     public static final String DEFAULT_DELIMS = ",;";
 
+    
+    /**
+     * Get the value of a manifest header.
+     * 
+     * @param name the name of the header
+     * @param altName an alternative name for the header (useful for deprecated names)
+     * @param manifest the dictionary
+     * @return the value from the manifest
+     */
+    public static String getManifestHeaderValue (String name, String altName, Dictionary manifest)
+    {
+        if (manifest == null)
+            return null;
+        if (name == null && altName == null)
+            return null;
+        if (name != null)
+            return (String)manifest.get(name);
+        return (String)manifest.get(altName);
+    }
+    
+  
+    
     /* ------------------------------------------------------------ */
     /**
      * Treating the string as a separated list of filenames,
      * convert and return the list of urls.
      * 
-     * @param val the separated list
-     * @param delims the separators (default is ,;)
-     * @return
-     * @throws MalformedURLException 
+     * @param val the separated list of filenames
+     * @param delims the separators (default is <code>,;</code>)
+     * @return the list of URLs found in the input list
+     * @throws Exception if unable to convert entry to a URL
      */
     public static List<URL> fileNamesAsURLs(String val, String delims) 
     throws Exception
@@ -74,13 +94,13 @@
     
     /* ------------------------------------------------------------ */
     /**
-     * recursively substitute the ${sysprop} by their actual system property.
-     * ${sysprop,defaultvalue} will use 'defaultvalue' as the value if no
+     * recursively substitute the <code>${sysprop}</code> by their actual system property.
+     * <code>${sysprop,defaultvalue}</code> will use <code>'defaultvalue'</code> as the value if no
      * sysprop is defined. Not the most efficient code but we are shooting for
      * simplicity and speed of development here.
      * 
-     * @param value
-     * @return
+     * @param value the input string
+     * @return the string with replaced properties
      */
     public static String resolvePropertyValue(String value)
     {
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/DefaultBundleClassLoaderHelper.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/DefaultBundleClassLoaderHelper.java
index 8a532fd..e9e5ff7 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/DefaultBundleClassLoaderHelper.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/DefaultBundleClassLoaderHelper.java
@@ -29,15 +29,14 @@
 
 /**
  * DefaultBundleClassLoaderHelper
- * 
- * 
+ * <p>
  * Default implementation of the BundleClassLoaderHelper. Uses introspection to
  * support equinox-3.5 and felix-2.0.0
  */
 public class DefaultBundleClassLoaderHelper implements BundleClassLoaderHelper
 {
     private static final Logger LOG = Log.getLogger(BundleClassLoaderHelper.class);
-    private static enum OSGiContainerType {EquinoxOld, EquinoxLuna, FelixOld, Felix403};
+    private static enum OSGiContainerType {EquinoxOld, EquinoxLuna, FelixOld, Felix403, Concierge};
     private static OSGiContainerType osgiContainer;
     private static Class Equinox_BundleHost_Class;
     private static Class Equinox_EquinoxBundle_Class;
@@ -56,6 +55,12 @@
     private static Field Felix_ModuleImpl_m_ClassLoader_Field;
     private static Method Felix_BundleWiring_getClassLoader_Method;
     
+    // Concierge
+    private static Class Concierge_BundleImpl_Class;
+    private static Class Concierge_BundleWiring_Class;
+    private static Method Concierge_BundleImpl_Adapt_Method;
+    private static Method Concierge_BundleWiring_getClassLoader_Method;
+    
     
     private static void checkContainerType (Bundle bundle)
     {
@@ -102,10 +107,22 @@
         }
         catch (ClassNotFoundException e)
         {
-            LOG.warn("Unknown OSGi container type");
-            return;
+            LOG.ignore(e);
         }
         
+        try
+        {
+            Concierge_BundleImpl_Class = bundle.getClass().getClassLoader().loadClass("org.eclipse.concierge.BundleImpl");
+            osgiContainer = OSGiContainerType.Concierge;
+            return;
+        }
+        catch (ClassNotFoundException e)
+        {
+            LOG.ignore(e);
+        }
+
+        LOG.warn("Unknown OSGi container type");
+        return;
     }
 
   
@@ -115,7 +132,7 @@
     /**
      * Assuming the bundle is started.
      * 
-     * @param bundle
+     * @param bundle the bundle
      * @return classloader object
      */
     public ClassLoader getBundleClassLoader(Bundle bundle)
@@ -168,6 +185,12 @@
             {
                 return internalGetFelixBundleClassLoader(bundle); 
             }
+
+            case Concierge:
+            {
+                return internalGetConciergeBundleClassLoader(bundle); 
+            }
+
             default:
             {
                 LOG.warn("No classloader found for bundle "+bundle.getSymbolicName());
@@ -363,4 +386,55 @@
         LOG.warn("No classloader for felix platform for bundle "+bundle.getSymbolicName());
         return null;
     }
+    
+    /**
+     * @param bundle
+     * @return
+     */
+    private static ClassLoader internalGetConciergeBundleClassLoader(Bundle bundle)
+    {
+        if (osgiContainer == OSGiContainerType.Concierge)
+        {
+            try
+            {
+                /** 
+                 * In Concierge:
+                 * 
+                 * Option A:
+                 * <pre>
+                 * Concierge concierge = new Concierge(...);
+                 * BundleWiring bundleWiring = concierge.getWiring(); // method is public
+                 * </pre>
+                 * Problem: getWiring not yet implementd
+                 * 
+                 * Option B:
+                 * <pre>
+                 * Concierge concierge = new Concierge(...);
+                 * BundleWiring bundleWiring = concierge.adapt(org.osgi.framework.wiring.BundleWiring);
+                 * </pre>
+                 * Same approach as done in Felix.
+                 * 
+                 */
+                if (Concierge_BundleWiring_Class == null) {
+                    Concierge_BundleWiring_Class = bundle.getClass().getClassLoader().loadClass("org.osgi.framework.wiring.BundleWiring");
+                    Concierge_BundleImpl_Adapt_Method = Concierge_BundleImpl_Class.getMethod("adapt", new Class[] {Class.class});
+                    Concierge_BundleImpl_Adapt_Method.setAccessible(true);
+                    Concierge_BundleWiring_getClassLoader_Method = Concierge_BundleWiring_Class.getMethod("getClassLoader");
+                    Concierge_BundleWiring_getClassLoader_Method.setAccessible(true);
+                }
+
+                Object wiring = Concierge_BundleImpl_Adapt_Method.invoke(bundle, new Object[] {Concierge_BundleWiring_Class});
+                ClassLoader cl = (ClassLoader)Concierge_BundleWiring_getClassLoader_Method.invoke(wiring);
+                return cl;
+            }
+            catch (Exception e)
+            {
+                LOG.warn(e);
+                return null;
+            }
+        }
+
+        LOG.warn("No classloader for Concierge platform for bundle "+bundle.getSymbolicName());
+        return null;
+    }
 }
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/DefaultFileLocatorHelper.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/DefaultFileLocatorHelper.java
index 75a658c..ee3f0e7 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/DefaultFileLocatorHelper.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/DefaultFileLocatorHelper.java
@@ -32,18 +32,15 @@
 
 import org.eclipse.jetty.osgi.boot.utils.BundleFileLocatorHelper;
 import org.eclipse.jetty.util.URIUtil;
-import org.eclipse.jetty.util.resource.FileResource;
+import org.eclipse.jetty.util.resource.PathResource;
 import org.eclipse.jetty.util.resource.Resource;
 import org.osgi.framework.Bundle;
 
 /**
  * DefaultFileLocatorHelper
- * 
- * 
+ * <p> 
  * From a bundle to its location on the filesystem. Assumes the bundle is not a
  * jar.
- * 
- * @author hmalphettes
  */
 public class DefaultFileLocatorHelper implements BundleFileLocatorHelper
 {
@@ -89,7 +86,7 @@
      * 
      * @param bundle The bundle
      * @return Its installation location as a file.
-     * @throws Exception
+     * @throws Exception if unable to get the bundle install location
      */
     public File getBundleInstallLocation(Bundle bundle) throws Exception
     {
@@ -100,10 +97,10 @@
 
         if (url.getProtocol().equals("file"))
         {
-            // some osgi frameworks do use the file protocole directly in some
+            // some osgi frameworks do use the file protocol directly in some
             // situations. Do use the FileResource to transform the URL into a
             // File: URL#toURI is broken
-            return new FileResource(url).getFile().getParentFile().getParentFile();
+            return new PathResource(url).getFile().getParentFile().getParentFile();
         }
         else if (url.getProtocol().equals("bundleentry"))
         {
@@ -212,10 +209,10 @@
     /**
      * Locate a file inside a bundle.
      * 
-     * @param bundle
-     * @param path
+     * @param bundle the bundle
+     * @param path the path
      * @return file object
-     * @throws Exception
+     * @throws Exception if unable to get the file in the bundle
      */
     public File getFileInBundle(Bundle bundle, String path) throws Exception
     {
@@ -239,8 +236,8 @@
      * it searches for entries in the fragments by using the Bundle#findEntries
      * method.
      * 
-     * @param bundle
-     * @param entryPath
+     * @param bundle the bundle
+     * @param entryPath the entry path
      * @return null or all the entries found for that path.
      */
     public Enumeration<URL> findEntries(Bundle bundle, String entryPath)
@@ -266,7 +263,7 @@
      * kept in a jar.
      * </p>
      * 
-     * @param bundle
+     * @param bundle the bundle
      * @return The jar(s) file that is either the bundle itself, either the jars
      *         embedded inside it.
      */
@@ -349,7 +346,7 @@
      * @return a URL to the content of the bundle entry that uses the file:
      *         protocol
      *         </p>
-     * @throws IOException 
+     * @throws Exception if unable to get the file url 
      */
     public URL getFileURL(URL url) throws Exception
  
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/PackageAdminServiceTracker.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/PackageAdminServiceTracker.java
index d265e5b..f3dacc9 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/PackageAdminServiceTracker.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/PackageAdminServiceTracker.java
@@ -36,11 +36,10 @@
 
 /**
  * PackageAdminServiceTracker
- * 
- * 
+ * <p>
  * When the PackageAdmin service is activated we can look for the fragments
  * attached to this bundle and do a fake "activate" on them.
- * 
+ * <p> 
  * See particularly the jetty-osgi-boot-jsp fragment bundle that uses this
  * facility.
  */
@@ -124,8 +123,8 @@
      * bundle. when we drop the support for the older versions of OSGi, we will
      * stop using the PackageAdmin service.
      * 
-     * @param bundle
-     * @return
+     * @param bundle the bundle
+     * @return the bundle fragment list
      */
     public Bundle[] getFragments(Bundle bundle)
     {
@@ -143,9 +142,8 @@
      * collect the required-bundles and fragment when the directive
      * visibility:=reexport is added to a required-bundle.
      * 
-     * @param bundle
-     * @param webFragOrAnnotationOrResources
-     * @return
+     * @param bundle the bundle
+     * @return the bundle fragment and required list
      */
     public Bundle[] getFragmentsAndRequiredBundles(Bundle bundle)
     {
@@ -165,9 +163,13 @@
      * transitively when the directive 'visibility:=reexport' is added to a
      * required-bundle.
      * 
-     * @param bundle
-     * @param webFragOrAnnotationOrResources
-     * @return
+     * @param bundle the bundle
+     * @param admin the admin package
+     * @param deps The map of fragment and required bundles associated to the value of the
+     *         jetty-web attribute.
+     * @param onlyReexport true to collect resources and web-fragments
+     *            transitively if and only if the directive visibility is
+     *            reexport.
      */
     protected void collectFragmentsAndRequiredBundles(Bundle bundle, PackageAdmin admin, Map<String, Bundle> deps, boolean onlyReexport)
     {
@@ -193,12 +195,13 @@
      * A simplistic but good enough parser for the Require-Bundle header. Parses
      * the version range attribute and the visibility directive.
      * 
+     * @param bundle the bundle
+     * @param admin the admin package 
+     * @param deps The map of required bundles associated to the value of the
+     *         jetty-web attribute.
      * @param onlyReexport true to collect resources and web-fragments
      *            transitively if and only if the directive visibility is
      *            reexport.
-     * @param bundle
-     * @return The map of required bundles associated to the value of the
-     *         jetty-web attribute.
      */
     protected void collectRequiredBundles(Bundle bundle, PackageAdmin admin, Map<String, Bundle> deps, boolean onlyReexport)
     {
diff --git a/jetty-osgi/jetty-osgi-httpservice/contexts/httpservice.xml b/jetty-osgi/jetty-osgi-httpservice/contexts/httpservice.xml
index 6aae6e9..e1044c8 100644
--- a/jetty-osgi/jetty-osgi-httpservice/contexts/httpservice.xml
+++ b/jetty-osgi/jetty-osgi-httpservice/contexts/httpservice.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 <!--
  Copyright (c) 2009-2011 Intalio, Inc.
 
diff --git a/jetty-osgi/jetty-osgi-httpservice/pom.xml b/jetty-osgi/jetty-osgi-httpservice/pom.xml
index e0bd534..25ed717 100644
--- a/jetty-osgi/jetty-osgi-httpservice/pom.xml
+++ b/jetty-osgi/jetty-osgi-httpservice/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty.osgi</groupId>
     <artifactId>jetty-osgi-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-httpservice</artifactId>
@@ -83,15 +83,6 @@
           <groupId>org.apache.felix</groupId>
           <artifactId>maven-bundle-plugin</artifactId>
           <extensions>true</extensions>
-          <executions>
-              <execution>
-                  <id>bundle-manifest</id>
-                  <phase>process-classes</phase>
-                  <goals>
-                      <goal>manifest</goal>
-                  </goals>
-              </execution>
-          </executions>
           <configuration>
               <instructions>
                 <Bundle-SymbolicName>org.eclipse.jetty.osgi.httpservice</Bundle-SymbolicName>
diff --git a/jetty-osgi/jetty-osgi-npn/pom.xml b/jetty-osgi/jetty-osgi-npn/pom.xml
deleted file mode 100644
index 092278f..0000000
--- a/jetty-osgi/jetty-osgi-npn/pom.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<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>
-    <groupId>org.eclipse.jetty.osgi</groupId>
-    <artifactId>jetty-osgi-project</artifactId>
-    <version>9.2.11-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>jetty-osgi-npn</artifactId>
-  <name>Jetty :: OSGi NPN Fragment</name>
-  <packaging>jar</packaging>
-  <properties>
-    <bundle-symbolic-name>org.eclipse.jetty.osgi.npn.fragment</bundle-symbolic-name>
-  </properties>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>build-helper-maven-plugin</artifactId>
-        <version>1.7</version>
-        <executions>
-          <execution>
-            <id>parse-version</id>
-            <goals>
-              <goal>parse-version</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestEntries>
-              <Bundle-ManifestVersion>2</Bundle-ManifestVersion>
-              <Bundle-SymbolicName>${bundle-symbolic-name};singleton:=true</Bundle-SymbolicName>
-              <Bundle-Name>Jetty OSGi NPN Fragment</Bundle-Name>
-              <Bundle-Version>${parsedVersion.osgiVersion}</Bundle-Version>
-              <Export-Package>org.eclipse.jetty.npn</Export-Package>
-              <Fragment-Host>system.bundle;extension:=framework</Fragment-Host>
-            </manifestEntries>
-          </archive>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/jetty-osgi/pom.xml b/jetty-osgi/pom.xml
index 2a4b82d..ceedb29 100644
--- a/jetty-osgi/pom.xml
+++ b/jetty-osgi/pom.xml
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.jetty.osgi</groupId>
   <artifactId>jetty-osgi-project</artifactId>
@@ -25,22 +25,9 @@
     <module>jetty-osgi-httpservice</module>
     <module>test-jetty-osgi-webapp</module>
     <module>test-jetty-osgi-context</module>
-    <module>test-jetty-osgi</module>
     <module>jetty-osgi-alpn</module>
+    <module>test-jetty-osgi</module>
   </modules>
-  <profiles>
-    <profile>
-      <id>npn</id>
-      <activation>
-        <jdk>1.7</jdk>
-      </activation>
-      <modules>
-<!--
-        <module>jetty-osgi-npn</module>
--->
-      </modules>
-    </profile>
-  </profiles>
   <build>
     <resources>
       <resource>
diff --git a/jetty-osgi/test-jetty-osgi-context/pom.xml b/jetty-osgi/test-jetty-osgi-context/pom.xml
index 6dd58d0..5fdcb1d 100644
--- a/jetty-osgi/test-jetty-osgi-context/pom.xml
+++ b/jetty-osgi/test-jetty-osgi-context/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty.osgi</groupId>
     <artifactId>jetty-osgi-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>test-jetty-osgi-context</artifactId>
@@ -80,15 +80,6 @@
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <extensions>true</extensions>
-                <executions>
-                    <execution>
-                        <id>bundle-manifest</id>
-                        <phase>process-classes</phase>
-                        <goals>
-                            <goal>manifest</goal> 
-                        </goals>
-                    </execution>
-                </executions>
                 <configuration>
                     <instructions>
                         <Bundle-SymbolicName>org.eclipse.jetty.osgi.testcontext;singleton:=true</Bundle-SymbolicName>
diff --git a/jetty-osgi/test-jetty-osgi-context/src/main/context/acme.xml b/jetty-osgi/test-jetty-osgi-context/src/main/context/acme.xml
index 1ff97a4..f6c5cf5 100644
--- a/jetty-osgi/test-jetty-osgi-context/src/main/context/acme.xml
+++ b/jetty-osgi/test-jetty-osgi-context/src/main/context/acme.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure class="org.eclipse.jetty.server.handler.ContextHandler">
 
@@ -8,7 +8,7 @@
     <Arg><Property name="bundle.root"/></Arg>
   </Call>
 
-  <Ref id="res">
+  <Ref refid="res">
     <Call id="base" name="addPath">
       <Arg>/static/</Arg>
     </Call>
@@ -18,7 +18,7 @@
 
   <!-- Set up the base resource for static files relative to inside bundle -->
   <Set name="baseResource">
-     <Ref id="base"/>
+     <Ref refid="base"/>
   </Set>
 
   <Set name="handler">
diff --git a/jetty-osgi/test-jetty-osgi-context/src/main/java/com/acme/osgi/Activator.java b/jetty-osgi/test-jetty-osgi-context/src/main/java/com/acme/osgi/Activator.java
index ca47ddd..b40ea2e 100644
--- a/jetty-osgi/test-jetty-osgi-context/src/main/java/com/acme/osgi/Activator.java
+++ b/jetty-osgi/test-jetty-osgi-context/src/main/java/com/acme/osgi/Activator.java
@@ -24,15 +24,9 @@
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
 
-import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.handler.ContextHandler;
-import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.ServiceRegistration;
-import org.osgi.util.tracker.BundleTracker;
 
 /**
  * Bootstrap a ContextHandler
diff --git a/jetty-osgi/test-jetty-osgi-webapp/pom.xml b/jetty-osgi/test-jetty-osgi-webapp/pom.xml
index 21cfdc3..aba2c50 100644
--- a/jetty-osgi/test-jetty-osgi-webapp/pom.xml
+++ b/jetty-osgi/test-jetty-osgi-webapp/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty.osgi</groupId>
     <artifactId>jetty-osgi-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
@@ -73,15 +73,6 @@
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <extensions>true</extensions>
-                <executions>
-                    <execution>
-                        <id>bundle-manifest</id>
-                        <phase>process-classes</phase>
-                        <goals>
-                            <goal>manifest</goal> 
-                        </goals>
-                    </execution>
-                </executions>
                 <configuration>
                     <instructions>
                         <Bundle-SymbolicName>org.eclipse.jetty.osgi.testapp;singleton:=true</Bundle-SymbolicName>
@@ -91,7 +82,6 @@
                         <!-- disable the uses directive: jetty will accomodate pretty much any versions
                         of the packages it uses; no need to reflect some tight dependency determined at
                         compilation time. --> 
-                        <_nouses>true</_nouses>
                         <Import-Package>
  org.osgi.framework,
  org.osgi.service.cm;version="1.2.0",
@@ -106,7 +96,7 @@
  org.xml.sax.helpers,
  *
                         </Import-Package>
-                        <DynamicImport-Package>org.eclipse.jetty.*;version="[9.1,10.0)"</DynamicImport-Package>
+                        <DynamicImport-Package>org.eclipse.jetty.*;version="[$(version;===;${parsedVersion.osgiVersion}),$(version;==+;${parsedVersion.osgiVersion}))"</DynamicImport-Package>
                     </instructions>
                 </configuration>
             </plugin>
diff --git a/jetty-osgi/test-jetty-osgi-webapp/src/main/java/com/acme/osgi/Activator.java b/jetty-osgi/test-jetty-osgi-webapp/src/main/java/com/acme/osgi/Activator.java
index ee2488a..8ad84d8 100644
--- a/jetty-osgi/test-jetty-osgi-webapp/src/main/java/com/acme/osgi/Activator.java
+++ b/jetty-osgi/test-jetty-osgi-webapp/src/main/java/com/acme/osgi/Activator.java
@@ -21,16 +21,10 @@
 import java.util.Dictionary;
 import java.util.Hashtable;
 
-import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.webapp.WebAppContext;
-import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.ServiceRegistration;
-import org.osgi.util.tracker.BundleTracker;
 
 /**
  * Bootstrap a webapp
@@ -57,7 +51,7 @@
         Dictionary serverProps = new Hashtable();
         //define the unique name of the server instance
         serverProps.put("managedServerName", serverName);
-        serverProps.put("jetty.port", "9999");
+        serverProps.put("jetty.http.port", "9999");
         //let Jetty apply some configuration files to the Server instance
         serverProps.put("jetty.etc.config.urls", "file:/opt/jetty/etc/jetty.xml,file:/opt/jetty/etc/jetty-selector.xml,file:/opt/jetty/etc/jetty-deployer.xml");
         //register as an OSGi Service for Jetty to find 
diff --git a/jetty-osgi/test-jetty-osgi/pom.xml b/jetty-osgi/test-jetty-osgi/pom.xml
index 79e1aa8..caee45a 100644
--- a/jetty-osgi/test-jetty-osgi/pom.xml
+++ b/jetty-osgi/test-jetty-osgi/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty.osgi</groupId>
     <artifactId>jetty-osgi-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
@@ -11,7 +11,7 @@
   <description>Jetty OSGi Integration test</description>
   <url>http://www.eclipse.org/jetty</url>
   <properties>
-    <bundle-symbolic-name>${project.groupId}.boot.test.spdy</bundle-symbolic-name>
+    <bundle-symbolic-name>${project.groupId}.boot.test.osgi</bundle-symbolic-name>
     <jetty-orbit-url>http://download.eclipse.org/jetty/orbit/</jetty-orbit-url>
     <assembly-directory>target/distribution</assembly-directory>
     <exam.version>3.5.0</exam.version>
@@ -35,7 +35,7 @@
     </dependency>
     
 
-    <!-- use the forked container so we can pass it system properties eg for npn/alpn -->
+    <!-- use the forked container so we can pass it system properties eg for alpn -->
     <dependency>
         <groupId>org.ops4j.pax.exam</groupId>
         <artifactId>pax-exam-container-forked</artifactId>
@@ -164,12 +164,44 @@
     </dependency>
 
     <dependency>
-     <groupId>org.mortbay.jasper</groupId>
-      <artifactId>apache-el</artifactId>
-      <version>8.0.9.M3</version>
-     <scope>test</scope>
+       <groupId>org.glassfish.web</groupId>
+       <artifactId>javax.servlet.jsp.jstl</artifactId>
+       <version>1.2.2</version>
+      <exclusions>
+        <exclusion>
+          <groupId>javax.servlet.jsp.jstl</groupId>
+          <artifactId>jstl-api</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>javax.servlet</groupId>
+          <artifactId>servlet-api</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>javax.servlet.jsp</groupId>
+          <artifactId>jsp-api</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>javax.el</groupId>
+          <artifactId>el-api</artifactId>
+        </exclusion>
+      </exclusions>
     </dependency>
 
+    <dependency>
+        <groupId>org.eclipse.jetty.orbit</groupId>
+        <artifactId>javax.servlet.jsp.jstl</artifactId>
+        <version>1.2.0.v201105211821</version>
+        <exclusions>
+          <exclusion>
+            <groupId>org.eclipse.jetty.orbit</groupId>
+            <artifactId>javax.servlet</artifactId>
+          </exclusion>
+          <exclusion>
+            <groupId>org.eclipse.jetty.orbit</groupId>
+            <artifactId>javax.servlet.jsp</artifactId>
+          </exclusion>
+        </exclusions>
+    </dependency>
 
     <!-- Jetty Deps -->
     <dependency>
@@ -223,6 +255,7 @@
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-util</artifactId>
+      <version>${project.version}</version> 
       <scope>runtime</scope>
     </dependency>
     <dependency>
@@ -279,28 +312,9 @@
       <scope>runtime</scope>
     </dependency>
     <dependency>
-      <groupId>org.eclipse.jetty.spdy</groupId>
-      <artifactId>spdy-core</artifactId>
+      <groupId>org.eclipse.jetty.http2</groupId>
+      <artifactId>http2-server</artifactId>
       <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty.spdy</groupId>
-      <artifactId>spdy-server</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty.spdy</groupId>
-      <artifactId>spdy-http-server</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty.spdy</groupId>
-      <artifactId>spdy-client</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.mortbay.jetty.alpn</groupId>
diff --git a/jetty-osgi/test-jetty-osgi/src/main/resources/jetty-logging.properties b/jetty-osgi/test-jetty-osgi/src/main/resources/jetty-logging.properties
index 5250a08..147cf00 100644
--- a/jetty-osgi/test-jetty-osgi/src/main/resources/jetty-logging.properties
+++ b/jetty-osgi/test-jetty-osgi/src/main/resources/jetty-logging.properties
@@ -1,2 +1 @@
 org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
-org.eclipse.jetty.spdy.LEVEL=WARN
diff --git a/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-deployer.xml b/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-deployer.xml
index b03a648..19b3a5d 100644
--- a/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-deployer.xml
+++ b/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-deployer.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
 
diff --git a/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-http.xml b/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-http.xml
new file mode 100644
index 0000000..319ae6c
--- /dev/null
+++ b/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-http.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<!-- ============================================================= -->
+<!-- Configure the Jetty Server instance with an ID "Server"       -->
+<!-- by adding a HTTP connector.                                   -->
+<!-- This configuration must be used in conjunction with jetty.xml -->
+<!-- ============================================================= -->
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+
+  <!-- =========================================================== -->
+  <!-- Add a HTTP Connector.                                       -->
+  <!-- Configure an o.e.j.server.ServerConnector with a single     -->
+  <!-- HttpConnectionFactory instance using the common httpConfig  -->
+  <!-- instance defined in jetty.xml                               -->
+  <!--                                                             -->
+  <!-- Consult the javadoc of o.e.j.server.ServerConnector and     -->
+  <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
+  <!-- that may be set here.                                       -->
+  <!-- =========================================================== -->
+  <Call name="addConnector">
+    <Arg>
+      <New class="org.eclipse.jetty.server.ServerConnector">
+        <Arg name="server"><Ref refid="Server" /></Arg>
+        <Arg name="factories">
+          <Array type="org.eclipse.jetty.server.ConnectionFactory">
+            <Item>
+              <New class="org.eclipse.jetty.server.HttpConnectionFactory">
+                <Arg name="config"><Ref refid="httpConfig" /></Arg>
+              </New>
+            </Item>
+          </Array>
+        </Arg>
+        <Set name="host"><Property name="jetty.http.host" /></Set>
+        <Set name="port"><Property name="jetty.http.port" default="80" /></Set>
+        <Set name="idleTimeout"><Property name="jetty.http.idleTimeout" default="30000"/></Set>
+      </New>
+    </Arg>
+  </Call>
+
+</Configure>
diff --git a/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-http2.xml b/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-http2.xml
new file mode 100644
index 0000000..3362c1b
--- /dev/null
+++ b/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-http2.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<!-- ============================================================= -->
+<!-- Configure a HTTP2 on the ssl connector.                       -->
+<!-- ============================================================= -->
+<Configure id="sslConnector" class="org.eclipse.jetty.server.ServerConnector">
+  <Call name="addConnectionFactory">
+    <Arg>
+      <New class="org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory">
+        <Arg name="config"><Ref refid="sslHttpConfig"/></Arg>
+        <Set name="maxConcurrentStreams"><Property name="jetty.http2.maxConcurrentStreams" default="1024"/></Set>
+      </New>
+    </Arg>
+  </Call>
+</Configure>
+
diff --git a/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-https.xml b/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-https.xml
index a6bef16..c9d497e 100644
--- a/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-https.xml
+++ b/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-https.xml
@@ -1,47 +1,28 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- ============================================================= -->
 <!-- Configure a HTTPS connector.                                  -->
 <!-- This configuration must be used in conjunction with jetty.xml -->
 <!-- and jetty-ssl.xml.                                            -->
 <!-- ============================================================= -->
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
+<Configure id="sslConnector" class="org.eclipse.jetty.server.ServerConnector">
 
-  <!-- =========================================================== -->
-  <!-- Add a HTTPS Connector.                                      -->
-  <!-- Configure an o.e.j.server.ServerConnector with connection   -->
-  <!-- factories for TLS (aka SSL) and HTTP to provide HTTPS.      -->
-  <!-- All accepted TLS connections are wired to a HTTP connection.-->
-  <!--                                                             -->
-  <!-- Consult the javadoc of o.e.j.server.ServerConnector,        -->
-  <!-- o.e.j.server.SslConnectionFactory and                       -->
-  <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
-  <!-- that may be set here.                                       -->
-  <!-- =========================================================== -->
-  <Call id="httpsConnector" name="addConnector">
+  <Call name="addIfAbsentConnectionFactory">
     <Arg>
-      <New class="org.eclipse.jetty.server.ServerConnector">
-        <Arg name="server"><Ref refid="Server" /></Arg>
-          <Arg name="factories">
-            <Array type="org.eclipse.jetty.server.ConnectionFactory">
-              <Item>
-                <New class="org.eclipse.jetty.server.SslConnectionFactory">
-                  <Arg name="next">http/1.1</Arg>
-                  <Arg name="sslContextFactory"><Ref refid="sslContextFactory"/></Arg>
-                </New>
-              </Item>
-              <Item>
-                <New class="org.eclipse.jetty.server.HttpConnectionFactory">
-                  <Arg name="config"><Ref refid="sslHttpConfig"/></Arg>
-                </New>
-              </Item>
-            </Array>
-          </Arg>
-          <Set name="host"><Property name="jetty.host" /></Set>
-          <Set name="port"><Property name="jetty.https.port" default="8443" /></Set>
-          <Set name="idleTimeout">30000</Set>
-        </New>
+      <New class="org.eclipse.jetty.server.SslConnectionFactory">
+        <Arg name="next">http/1.1</Arg>
+        <Arg name="sslContextFactory"><Ref refid="sslContextFactory"/></Arg>
+      </New>
     </Arg>
   </Call>
+
+  <Call name="addConnectionFactory">
+    <Arg>
+      <New class="org.eclipse.jetty.server.HttpConnectionFactory">
+        <Arg name="config"><Ref refid="sslHttpConfig" /></Arg>
+      </New>
+    </Arg>
+  </Call>
+  
 </Configure>
diff --git a/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-selector.xml b/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-selector.xml
deleted file mode 100644
index 67cd87c..0000000
--- a/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-selector.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-
-    <!-- =========================================================== -->
-    <!-- Add connector                                               -->
-    <!-- =========================================================== -->
-
-    <Call name="addConnector">
-      <Arg>
-          <New class="org.eclipse.jetty.server.ServerConnector">
-            <Arg><Ref refid="Server" /></Arg>
-             <Arg name="factories">
-               <Array type="org.eclipse.jetty.server.ConnectionFactory">
-                <Item>
-                  <New class="org.eclipse.jetty.server.HttpConnectionFactory">
-                   <Arg name="config"><Ref refid="httpConfig" /></Arg>
-                  </New>
-                </Item>
-              </Array>
-             </Arg>
-            <Set name="host"><Property name="jetty.host" /></Set>
-            <Set name="port"><Property name="jetty.port" default="8080"/></Set>
-            <Set name="idleTimeout">300000</Set>
-          </New>
-      </Arg>
-    </Call>
-
-</Configure>
diff --git a/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-spdy.xml b/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-spdy.xml
deleted file mode 100644
index 2bc1fe3..0000000
--- a/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-spdy.xml
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-    <!-- =========================================================== -->
-    <!-- Add HTTP Customizer for Secure request                      -->
-    <!-- =========================================================== -->
-    <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
-        <Set name="secureScheme">https</Set>
-        <Set name="securePort">
-            <SystemProperty name="jetty.spdy.port" default="8443"/>
-        </Set>
-        <Set name="outputBufferSize">32768</Set>
-        <Set name="requestHeaderSize">8192</Set>
-        <Set name="responseHeaderSize">8192</Set>
-        <Call name="addCustomizer">
-            <Arg>
-                <New class="org.eclipse.jetty.server.SecureRequestCustomizer"/>
-            </Arg>
-        </Call>
-    </New>
-
-
-    <!-- =========================================================== -->
-    <!-- Setup a SSL Context factory                                 -->
-    <!-- =========================================================== -->
-    <New id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
-        <Set name="KeyStorePath"><Property name="jetty.home" default="."/>/etc/keystore
-        </Set>
-        <Set name="KeyStorePassword">OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4</Set>
-        <Set name="KeyManagerPassword">OBF:1u2u1wml1z7s1z7a1wnl1u2g</Set>
-        <Set name="TrustStorePath"><Property name="jetty.home" default="."/>/etc/keystore
-        </Set>
-        <Set name="TrustStorePassword">OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4</Set>
-    </New>
-
-    <!-- =========================================================== -->
-    <!-- Set connectors                                              -->
-    <!-- =========================================================== -->
-    <Call id="sslConnector" name="addConnector">
-        <Arg>
-            <New class="org.eclipse.jetty.server.ServerConnector">
-                <Arg name="server">
-                    <Ref refid="Server"/>
-                </Arg>
-                <Arg name="factories">
-                    <Array type="org.eclipse.jetty.server.ConnectionFactory">
-                        <Item>
-                            <New class="org.eclipse.jetty.server.SslConnectionFactory">
-                                <Arg name="next">alpn</Arg>
-                                <Arg name="sslContextFactory">
-                                    <Ref refid="sslContextFactory"/>
-                                </Arg>
-                            </New>
-                        </Item>
-
-                        <Item>
-                            <New class="org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory">
-                                <Arg name="protocols">
-                                    <Array type="String">
-                                        <Item>spdy/3</Item>
-                                        <Item>spdy/2</Item>
-                                        <Item>http/1.1</Item>
-                                    </Array>
-                                </Arg>
-                                <Set name="defaultProtocol">http/1.1</Set>
-                            </New>
-                        </Item>
-
-                        <Item>
-                            <New class="org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnectionFactory">
-                                <Arg name="version" type="int">3</Arg>
-                                <Arg name="config">
-                                    <Ref refid="httpConfig"/>
-                                </Arg>
-                                <!-- Set the initial window size for this SPDY connector. -->
-                                <!-- See: http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3#TOC-2.6.8-WINDOW_UPDATE -->
-                                <Set name="initialWindowSize">65536</Set>
-                            </New>
-                        </Item>
-
-                        <Item>
-                            <New class="org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnectionFactory">
-                                <Arg name="version" type="int">2</Arg>
-                                <Arg name="config">
-                                    <Ref refid="httpConfig"/>
-                                </Arg>
-                                <!-- Set the initial window size for this SPDY connector. -->
-                                <!-- See: http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3#TOC-2.6.8-WINDOW_UPDATE -->
-                                <Set name="initialWindowSize">65536</Set>
-                            </New>
-                        </Item>
-
-                        <Item>
-                            <New class="org.eclipse.jetty.server.HttpConnectionFactory">
-                                <Arg name="config">
-                                    <Ref refid="httpConfig"/>
-                                </Arg>
-                            </New>
-                        </Item>
-                    </Array>
-                </Arg>
-                <Set name="host">
-                    <Property name="jetty.host"/>
-                </Set>
-                <Set name="port">
-                    <SystemProperty name="jetty.spdy.port" default="8443"/>
-                </Set>
-                <Set name="idleTimeout">30000</Set>
-            </New>
-        </Arg>
-    </Call>
-
-</Configure>
diff --git a/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-ssl.xml b/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-ssl.xml
index b4c3551..f82386e 100644
--- a/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-ssl.xml
+++ b/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-ssl.xml
@@ -1,20 +1,46 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- ============================================================= -->
-<!-- Configure a TLS (SSL) Context Factory                         -->
-<!-- This configuration must be used in conjunction with jetty.xml -->
-<!-- and either jetty-https.xml or jetty-spdy.xml (but not both)   -->
+<!-- Base SSL configuration                                        -->
+<!-- This configuration needs to be used together with 1 or more   -->
+<!-- of jetty-https.xml and/or jetty-http2.xml                     -->
 <!-- ============================================================= -->
-<Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
-  <Set name="KeyStorePath"><Property name="jetty.home" default="." />/<Property name="jetty.keystore" default="etc/keystore"/></Set>
-  <Set name="KeyStorePassword"><Property name="jetty.keystore.password" default="OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"/></Set>
-  <Set name="KeyManagerPassword"><Property name="jetty.keymanager.password" default="OBF:1u2u1wml1z7s1z7a1wnl1u2g"/></Set>
-  <Set name="TrustStorePath"><Property name="jetty.home" default="." />/<Property name="jetty.truststore" default="etc/keystore"/></Set>
-  <Set name="TrustStorePassword"><Property name="jetty.truststore.password" default="OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"/></Set>
-  <Set name="EndpointIdentificationAlgorithm"></Set>
-  <Set name="ExcludeCipherSuites">
-    <Array type="String">
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+
+  <!-- =========================================================== -->
+  <!-- Add a SSL Connector with no protocol factories              -->
+  <!-- =========================================================== -->
+  <Call  name="addConnector">
+    <Arg>
+      <New id="sslConnector" class="org.eclipse.jetty.server.ServerConnector">
+        <Arg name="server"><Ref refid="Server" /></Arg>
+          <Arg name="factories">
+            <Array type="org.eclipse.jetty.server.ConnectionFactory">
+            </Array>
+          </Arg>
+          <Set name="host"><Property name="jetty.ssl.host" /></Set>
+          <Set name="port"><Property name="jetty.ssl.port" default="443" /></Set>
+          <Set name="idleTimeout"><Property name="jetty.ssl.idleTimeout" default="30000"/></Set>
+          <Set name="soLingerTime"><Property name="jetty.ssl.soLingerTime" default="-1"/></Set>
+        </New>
+    </Arg>
+  </Call>
+
+  <!-- ============================================================= -->
+  <!-- Create a TLS (SSL) Context Factory  for later reuse           -->
+  <!-- ============================================================= -->
+  <New id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
+    <Set name="KeyStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.sslContext.keyStorePath" default="etc/keystore"/></Set>
+    <Set name="KeyStorePassword"><Property name="jetty.sslContext.keyStorePassword" default="OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"/></Set>
+    <Set name="KeyManagerPassword"><Property name="jetty.sslContext.keyManagerPassword" default="OBF:1u2u1wml1z7s1z7a1wnl1u2g"/></Set>
+    <Set name="TrustStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.sslContext.trustStorePath" default="etc/keystore"/></Set>
+    <Set name="TrustStorePassword"><Property name="jetty.sslContext.trustStorePassword" default="OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"/></Set>
+    <Set name="EndpointIdentificationAlgorithm"></Set>
+    <Set name="NeedClientAuth"><Property name="jetty.sslContext.needClientAuth" default="false"/></Set>
+    <Set name="WantClientAuth"><Property name="jetty.sslContext.wantClientAuth" default="false"/></Set>
+    <Set name="ExcludeCipherSuites">
+     <Array type="String">
       <Item>SSL_RSA_WITH_DES_CBC_SHA</Item>
       <Item>SSL_DHE_RSA_WITH_DES_CBC_SHA</Item>
       <Item>SSL_DHE_DSS_WITH_DES_CBC_SHA</Item>
@@ -22,8 +48,9 @@
       <Item>SSL_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
       <Item>SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
       <Item>SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</Item>
-    </Array>
-  </Set>
+     </Array>
+    </Set>
+  </New>
 
   <!-- =========================================================== -->
   <!-- Create a TLS specific HttpConfiguration based on the        -->
diff --git a/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-testrealm.xml b/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-testrealm.xml
index d26b427..4c8cb53 100644
--- a/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-testrealm.xml
+++ b/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty-testrealm.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
     <!-- =========================================================== -->
     <!-- Configure Authentication Login Service                      -->
diff --git a/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty.xml b/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty.xml
index 170530b..a3850c9 100644
--- a/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty.xml
+++ b/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 
 <!-- =============================================================== -->
@@ -15,11 +15,11 @@
     <!-- Server Thread Pool                                          -->
     <!-- =========================================================== -->
     <Get name="ThreadPool">
-      <!-- Default queued blocking threadpool -->
       <Set name="minThreads">10</Set>
       <Set name="maxThreads">200</Set>
     </Get>
 
+
     <!-- =========================================================== -->
     <!-- Set handler Collection Structure                            -->
     <!-- =========================================================== -->
@@ -43,7 +43,7 @@
 
     <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
       <Set name="secureScheme">https</Set>
-      <Set name="securePort"><Property name="jetty.secure.port" default="8443" /></Set>
+      <Set name="securePort"><Property name="jetty.httpConfig.securePort" default="8443" /></Set>
       <Set name="outputBufferSize">32768</Set>
       <Set name="requestHeaderSize">8192</Set>
       <Set name="responseHeaderSize">8192</Set>
@@ -63,21 +63,25 @@
 
 
     <!-- =========================================================== -->
-    <!-- jetty-jndi by default                                       -->
-    <!-- =========================================================== -->
-    <Call class="org.eclipse.jetty.webapp.Configuration$ClassList" name="setServerDefault">
-      <Arg><Ref refid="Server" /></Arg>
-      <Call name="addAfter">
-        <Arg name="afterClass">org.eclipse.jetty.webapp.FragmentConfiguration</Arg>
-        <Arg>
-          <Array type="String">
-            <Item>org.eclipse.jetty.plus.webapp.EnvConfiguration</Item>
-            <Item>org.eclipse.jetty.plus.webapp.PlusConfiguration</Item>
-            <Item>org.eclipse.jetty.annotations.AnnotationConfiguration</Item>
-          </Array>
-        </Arg>
-      </Call>
+    <!-- Set up the list of default configuration classes            -->
+    <!-- =========================================================== -->    
+    <Call name="setAttribute">
+       <Arg>org.eclipse.jetty.webapp.configuration</Arg>
+       <Arg>
+        <New class="org.eclipse.jetty.webapp.Configuration$ClassList">
+          <Arg>
+            <Array type="String">
+              <Item>org.eclipse.jetty.osgi.boot.OSGiWebInfConfiguration</Item>
+              <Item>org.eclipse.jetty.webapp.WebXmlConfiguration</Item>
+              <Item>org.eclipse.jetty.webapp.MetaInfConfiguration</Item>
+              <Item>org.eclipse.jetty.webapp.FragmentConfiguration</Item>
+              <Item>org.eclipse.jetty.webapp.JettyWebXmlConfiguration</Item>  
+            </Array>
+          </Arg>
+        </New>
+       </Arg>
     </Call>
+   
 
     <Call class="java.lang.System" name="setProperty">
       <Arg>java.naming.factory.initial</Arg>
diff --git a/jetty-osgi/test-jetty-osgi/src/test/config/etc/webdefault.xml b/jetty-osgi/test-jetty-osgi/src/test/config/etc/webdefault.xml
index 1d61c93..d54d76f 100644
--- a/jetty-osgi/test-jetty-osgi/src/test/config/etc/webdefault.xml
+++ b/jetty-osgi/test-jetty-osgi/src/test/config/etc/webdefault.xml
@@ -1,113 +1,142 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
-<!-- ===================================================================== -->
-<!-- This file contains the default descriptor for web applications.       -->
-<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-<!-- The intent of this descriptor is to include jetty specific or common  -->
-<!-- configuration for all webapps.   If a context has a webdefault.xml    -->
-<!-- descriptor, it is applied before the contexts own web.xml file        -->
-<!--                                                                       -->
-<!-- A context may be assigned a default descriptor by:                    -->
-<!--  + Calling WebApplicationContext.setDefaultsDescriptor                -->
-<!--  + Passed an arg to addWebApplications                                -->
-<!--                                                                       -->
-<!-- This file is used both as the resource within the jetty.jar (which is -->
-<!-- used as the default if no explicit defaults descriptor is set) and it -->
-<!-- is copied to the etc directory of the Jetty distro and explicitly     -->
-<!-- by the jetty.xml file.                                                -->
-<!--                                                                       -->
-<!-- ===================================================================== -->
-<web-app
-   xmlns="http://java.sun.com/xml/ns/javaee"
+<web-app 
+   xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
-   metadata-complete="true"
-   version="2.5">
+   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+   metadata-complete="false"
+   version="3.1"> 
+
+  <!-- ===================================================================== -->
+  <!-- This file contains the default descriptor for web applications.       -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+  <!-- The intent of this descriptor is to include jetty specific or common  -->
+  <!-- configuration for all webapps.   If a context has a webdefault.xml    -->
+  <!-- descriptor, it is applied before the context's own web.xml file       -->
+  <!--                                                                       -->
+  <!-- A context may be assigned a default descriptor by calling             -->
+  <!-- WebAppContext.setDefaultsDescriptor(String).                          -->
+  <!--                                                                       -->
+  <!-- This file is present in the jetty-webapp.jar, and is used as the      -->
+  <!-- defaults descriptor if no other is explicitly set on a context.       -->
+  <!--                                                                       -->
+  <!-- A copy of this file is also placed into the $JETTY_HOME/etc dir of    -->
+  <!-- the  distribution, and is referenced by some of the other xml files,  -->
+  <!-- eg the jetty-deploy.xml file.                                         -->
+  <!-- ===================================================================== -->
 
   <description>
-    Default web.xml file.
+    Default web.xml file.  
     This file is applied to a Web application before it's own WEB_INF/web.xml file
   </description>
 
+  <!-- ==================================================================== -->
+  <!-- Removes static references to beans from javax.el.BeanELResolver to   -->
+  <!-- ensure webapp classloader can be released on undeploy                -->
+  <!-- ==================================================================== -->
+  <listener>
+   <listener-class>org.eclipse.jetty.servlet.listener.ELContextCleaner</listener-class>
+  </listener>
+  
+  <!-- ==================================================================== -->
+  <!-- Removes static cache of Methods from java.beans.Introspector to      -->
+  <!-- ensure webapp classloader can be released on undeploy                -->
+  <!-- ==================================================================== -->  
+  <listener>
+   <listener-class>org.eclipse.jetty.servlet.listener.IntrospectorCleaner</listener-class>
+  </listener>
+  
 
   <!-- ==================================================================== -->
   <!-- Context params to control Session Cookies                            -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <!-- UNCOMMENT TO ACTIVATE
-  <context-param>
-    <param-name>org.eclipse.jetty.servlet.SessionDomain</param-name>
-    <param-value>127.0.0.1</param-value>
-  </context-param>
-
-  <context-param>
-    <param-name>org.eclipse.jetty.servlet.SessionPath</param-name>
-    <param-value>/</param-value>
-  </context-param>
-
-  <context-param>
-    <param-name>org.eclipse.jetty.servlet.MaxAge</param-name>
-    <param-value>-1</param-value>
-  </context-param>
+  <!--
+    UNCOMMENT TO ACTIVATE 
+    <context-param> 
+      <param-name>org.eclipse.jetty.servlet.SessionDomain</param-name> 
+      <param-value>127.0.0.1</param-value> 
+    </context-param> 
+    <context-param>
+      <param-name>org.eclipse.jetty.servlet.SessionPath</param-name>
+      <param-value>/</param-value>
+    </context-param>
+    <context-param>
+      <param-name>org.eclipse.jetty.servlet.MaxAge</param-name>
+      <param-value>-1</param-value>
+    </context-param>
   -->
 
-
   <!-- ==================================================================== -->
   <!-- The default servlet.                                                 -->
   <!-- This servlet, normally mapped to /, provides the handling for static -->
   <!-- content, OPTIONS and TRACE methods for the context.                  -->
   <!-- The following initParameters are supported:                          -->
-  <!--                                                                      -->
-  <!--   acceptRanges     If true, range requests and responses are         -->
-  <!--                    supported                                         -->
-  <!--                                                                      -->
-  <!--   dirAllowed       If true, directory listings are returned if no    -->
-  <!--                    welcome file is found. Else 403 Forbidden.        -->
-  <!--                                                                      -->
-  <!--   welcomeServlets  If true, attempt to dispatch to welcome files     -->
-  <!--                    that are servlets, if no matching static          -->
-  <!--                    resources can be found.                           -->
-  <!--                                                                      -->
-  <!--   redirectWelcome  If true, redirect welcome file requests           -->
-  <!--                    else use request dispatcher forwards              -->
-  <!--                                                                      -->
-  <!--   gzip             If set to true, then static content will be served-->
-  <!--                    as gzip content encoded if a matching resource is -->
-  <!--                    found ending with ".gz"                           -->
-  <!--                                                                      -->
-  <!--   resoureBase      Can be set to replace the context resource base   -->
-  <!--                                                                      -->
-  <!--   relativeResourceBase                                               -->
-  <!--                    Set with a pathname relative to the base of the   -->
-  <!--                    servlet context root. Useful for only serving     -->
-  <!--                    static content from only specific subdirectories. -->
-  <!--                                                                      -->
-  <!--   useFileMappedBuffer                                                -->
-  <!--                    If set to true (the default), a  memory mapped    -->
-  <!--                    file buffer will be used to serve static content  -->
-  <!--                    when using an NIO connector. Setting this value   -->
-  <!--                    to false means that a direct buffer will be used  -->
-  <!--                    instead. If you are having trouble with Windows   -->
-  <!--                    file locking, set this to false.                  -->
-  <!--                                                                      -->
-  <!--  cacheControl      If set, all static content will have this value   -->
-  <!--                    set as the cache-control header.                  -->
-  <!--                                                                      -->
-  <!--  maxCacheSize      Maximum size of the static resource cache         -->
-  <!--                                                                      -->
-  <!--  maxCachedFileSize Maximum size of any single file in the cache      -->
-  <!--                                                                      -->
-  <!--  maxCachedFiles    Maximum number of files in the cache              -->
-  <!--                                                                      -->
-  <!--  cacheType         "nio", "bio" or "both" to determine the type(s)   -->
-  <!--                    of resource cache. A bio cached buffer may be used-->
-  <!--                    by nio but is not as efficient as a nio buffer.   -->
-  <!--                    An nio cached buffer may not be used by bio.      -->
-  <!--                                                                      -->
-  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+  <!--  
+ *  acceptRanges      If true, range requests and responses are
+ *                    supported
+ *
+ *  dirAllowed        If true, directory listings are returned if no
+ *                    welcome file is found. Else 403 Forbidden.
+ *
+ *  welcomeServlets   If true, attempt to dispatch to welcome files
+ *                    that are servlets, but only after no matching static
+ *                    resources could be found. If false, then a welcome
+ *                    file must exist on disk. If "exact", then exact
+ *                    servlet matches are supported without an existing file.
+ *                    Default is true.
+ *
+ *                    This must be false if you want directory listings,
+ *                    but have index.jsp in your welcome file list.
+ *
+ *  redirectWelcome   If true, welcome files are redirected rather than
+ *                    forwarded to.
+ *
+ *  gzip              If set to true, then static content will be served as
+ *                    gzip content encoded if a matching resource is
+ *                    found ending with ".gz"
+ *
+ *  resourceBase      Set to replace the context resource base
+ *
+ *  resourceCache     If set, this is a context attribute name, which the servlet
+ *                    will use to look for a shared ResourceCache instance.
+ *
+ *  relativeResourceBase
+ *                    Set with a pathname relative to the base of the
+ *                    servlet context root. Useful for only serving static content out
+ *                    of only specific subdirectories.
+ *
+ *  pathInfoOnly      If true, only the path info will be applied to the resourceBase
+ *
+ *  stylesheet        Set with the location of an optional stylesheet that will be used
+ *                    to decorate the directory listing html.
+ *
+ *  aliases           If True, aliases of resources are allowed (eg. symbolic
+ *                    links and caps variations). May bypass security constraints.
+ *                    
+ *  etags             If True, weak etags will be generated and handled.
+ *
+ *  maxCacheSize      The maximum total size of the cache or 0 for no cache.
+ *  maxCachedFileSize The maximum size of a file to cache
+ *  maxCachedFiles    The maximum number of files to cache
+ *
+ *  useFileMappedBuffer
+ *                    If set to true, it will use mapped file buffers to serve static content
+ *                    when using an NIO connector. Setting this value to false means that
+ *                    a direct buffer will be used instead of a mapped file buffer.
+ *                    This file sets the value to true.
+ *
+ *  cacheControl      If set, all static content will have this value set as the cache-control
+ *                    header.
+ *
+ -->
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <servlet>
     <servlet-name>default</servlet-name>
     <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
     <init-param>
+      <param-name>aliases</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
       <param-name>acceptRanges</param-name>
       <param-value>true</param-value>
     </init-param>
@@ -129,19 +158,19 @@
     </init-param>
     <init-param>
       <param-name>maxCachedFileSize</param-name>
-      <param-value>10000000</param-value>
+      <param-value>200000000</param-value>
     </init-param>
     <init-param>
       <param-name>maxCachedFiles</param-name>
-      <param-value>1000</param-value>
-    </init-param>
-    <init-param>
-      <param-name>cacheType</param-name>
-      <param-value>both</param-value>
+      <param-value>2048</param-value>
     </init-param>
     <init-param>
       <param-name>gzip</param-name>
-      <param-value>true</param-value>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
+      <param-name>etags</param-name>
+      <param-value>false</param-value>
     </init-param>
     <init-param>
       <param-name>useFileMappedBuffer</param-name>
@@ -149,6 +178,12 @@
     </init-param>
     <!--
     <init-param>
+      <param-name>resourceCache</param-name>
+      <param-value>resourceCache</param-value>
+    </init-param>
+    -->
+    <!--
+    <init-param>
       <param-name>cacheControl</param-name>
       <param-value>max-age=3600,public</param-value>
     </init-param>
@@ -156,18 +191,21 @@
     <load-on-startup>0</load-on-startup>
   </servlet>
 
-  <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
+  <servlet-mapping>
+    <servlet-name>default</servlet-name>
+    <url-pattern>/</url-pattern>
+  </servlet-mapping>
 
 
   <!-- ==================================================================== -->
   <!-- JSP Servlet                                                          -->
-  <!-- This is the jasper JSP servlet from the jakarta project              -->
+  <!-- This is the jasper JSP servlet.                                      -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <!-- The JSP page compiler and execution servlet, which is the mechanism  -->
-  <!-- used by Glassfish to support JSP pages.  Traditionally, this servlet -->
-  <!-- is mapped to URL patterh "*.jsp".  This servlet supports the         -->
-  <!-- following initialization parameters (default values are in square    -->
-  <!-- brackets):                                                           -->
+  <!-- used by the jsp container to support JSP pages.  Traditionally,      -->
+  <!-- this servlet is mapped to URL pattern "*.jsp".  This servlet         -->
+  <!-- supports the following initialization parameters (default values     -->
+  <!-- are in square brackets):                                             -->
   <!--                                                                      -->
   <!--   checkInterval       If development is false and reloading is true, -->
   <!--                       background compiles are enabled. checkInterval -->
@@ -175,7 +213,7 @@
   <!--                       if a JSP page needs to be recompiled. [300]    -->
   <!--                                                                      -->
   <!--   compiler            Which compiler Ant should use to compile JSP   -->
-  <!--                       pages.  See the Ant documenation for more      -->
+  <!--                       pages.  See the Ant documentation for more     -->
   <!--                       information. [javac]                           -->
   <!--                                                                      -->
   <!--   classdebuginfo      Should the class file be compiled with         -->
@@ -236,30 +274,31 @@
   <!--   xpoweredBy          Determines whether X-Powered-By response       -->
   <!--                       header is added by generated servlet  [false]  -->
   <!--                                                                      -->
-  <!-- If you wish to use Jikes to compile JSP pages:                       -->
-  <!--   Set the init parameter "compiler" to "jikes".  Define              -->
-  <!--   the property "-Dbuild.compiler.emacs=true" when starting Jetty     -->
-  <!--   to cause Jikes to emit error messages in a format compatible with  -->
-  <!--   Jasper.                                                            -->
-  <!--   If you get an error reporting that jikes can't use UTF-8 encoding, -->
-  <!--   try setting the init parameter "javaEncoding" to "ISO-8859-1".     -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <servlet id="jsp">
     <servlet-name>jsp</servlet-name>
-    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
+    <servlet-class>org.eclipse.jetty.jsp.JettyJspServlet</servlet-class>
     <init-param>
-        <param-name>logVerbosityLevel</param-name>
-        <param-value>DEBUG</param-value>
+      <param-name>logVerbosityLevel</param-name>
+      <param-value>DEBUG</param-value>
     </init-param>
     <init-param>
-        <param-name>fork</param-name>
-        <param-value>false</param-value>
+      <param-name>fork</param-name>
+      <param-value>false</param-value>
     </init-param>
     <init-param>
-        <param-name>xpoweredBy</param-name>
-        <param-value>false</param-value>
+      <param-name>xpoweredBy</param-name>
+      <param-value>false</param-value>
     </init-param>
-    <!--
+    <init-param>
+      <param-name>compilerTargetVM</param-name>
+      <param-value>1.7</param-value>
+    </init-param>
+    <init-param>
+      <param-name>compilerSourceVM</param-name>
+      <param-value>1.7</param-value>
+    </init-param>
+    <!--  
     <init-param>
         <param-name>classpath</param-name>
         <param-value>?</param-value>
@@ -280,50 +319,10 @@
     <url-pattern>*.XSP</url-pattern>
   </servlet-mapping>
 
+
   <!-- ==================================================================== -->
-  <!-- Dynamic Servlet Invoker.                                             -->
-  <!-- This servlet invokes anonymous servlets that have not been defined   -->
-  <!-- in the web.xml or by other means. The first element of the pathInfo  -->
-  <!-- of a request passed to the envoker is treated as a servlet name for  -->
-  <!-- an existing servlet, or as a class name of a new servlet.            -->
-  <!-- This servlet is normally mapped to /servlet/*                        -->
-  <!-- This servlet support the following initParams:                       -->
-  <!--                                                                      -->
-  <!--  nonContextServlets       If false, the invoker can only load        -->
-  <!--                           servlets from the contexts classloader.    -->
-  <!--                           This is false by default and setting this  -->
-  <!--                           to true may have security implications.    -->
-  <!--                                                                      -->
-  <!--  verbose                  If true, log dynamic loads                 -->
-  <!--                                                                      -->
-  <!--  *                        All other parameters are copied to the     -->
-  <!--                           each dynamic servlet as init parameters    -->
+  <!-- Default session configuration                                        -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <!-- Uncomment for dynamic invocation
-  <servlet>
-    <servlet-name>invoker</servlet-name>
-    <servlet-class>org.eclipse.jetty.servlet.Invoker</servlet-class>
-    <init-param>
-      <param-name>verbose</param-name>
-      <param-value>false</param-value>
-    </init-param>
-    <init-param>
-      <param-name>nonContextServlets</param-name>
-      <param-value>false</param-value>
-    </init-param>
-    <init-param>
-      <param-name>dynamicParam</param-name>
-      <param-value>anyValue</param-value>
-    </init-param>
-    <load-on-startup>0</load-on-startup>
-  </servlet>
-
-  <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping>
-  -->
-
-
-
-  <!-- ==================================================================== -->
   <session-config>
     <session-timeout>30</session-timeout>
   </session-config>
@@ -331,7 +330,7 @@
   <!-- ==================================================================== -->
   <!-- Default MIME mappings                                                -->
   <!-- The default MIME mappings are provided by the mime.properties        -->
-  <!-- resource in the org.eclipse.jetty.server.jar file.  Additional or modified  -->
+  <!-- resource in the jetty-http.jar file.  Additional or modified         -->
   <!-- mappings may be specified here                                       -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <!-- UNCOMMENT TO ACTIVATE
@@ -342,6 +341,8 @@
   -->
 
   <!-- ==================================================================== -->
+  <!-- Default welcome files                                                -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <welcome-file-list>
     <welcome-file>index.html</welcome-file>
     <welcome-file>index.htm</welcome-file>
@@ -349,48 +350,170 @@
   </welcome-file-list>
 
   <!-- ==================================================================== -->
+  <!-- Default locale encodings                                             -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <locale-encoding-mapping-list>
-    <locale-encoding-mapping><locale>ar</locale><encoding>ISO-8859-6</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>be</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>bg</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ca</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>cs</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>da</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>de</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>el</locale><encoding>ISO-8859-7</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>en</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>es</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>et</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>fi</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>fr</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>hr</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>hu</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>is</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>it</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>iw</locale><encoding>ISO-8859-8</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ja</locale><encoding>Shift_JIS</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ko</locale><encoding>EUC-KR</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>lt</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>lv</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>mk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>nl</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>no</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>pl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>pt</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ro</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ru</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sh</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sk</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sq</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sr</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sv</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>tr</locale><encoding>ISO-8859-9</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>uk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>zh</locale><encoding>GB2312</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>zh_TW</locale><encoding>Big5</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>ar</locale>
+      <encoding>ISO-8859-6</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>be</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>bg</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>ca</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>cs</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>da</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>de</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>el</locale>
+      <encoding>ISO-8859-7</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>en</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>es</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>et</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>fi</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>fr</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>hr</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>hu</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>is</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>it</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>iw</locale>
+      <encoding>ISO-8859-8</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>ja</locale>
+      <encoding>Shift_JIS</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>ko</locale>
+      <encoding>EUC-KR</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>lt</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>lv</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>mk</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>nl</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>no</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>pl</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>pt</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>ro</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>ru</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>sh</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>sk</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>sl</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>sq</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>sr</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>sv</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>tr</locale>
+      <encoding>ISO-8859-9</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>uk</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>zh</locale>
+      <encoding>GB2312</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>zh_TW</locale>
+      <encoding>Big5</encoding>
+    </locale-encoding-mapping>
   </locale-encoding-mapping-list>
 
+  <!-- ==================================================================== -->
+  <!-- Disable TRACE method with security constraint                        -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <security-constraint>
     <web-resource-collection>
       <web-resource-name>Disable TRACE</web-resource-name>
@@ -399,6 +522,13 @@
     </web-resource-collection>
     <auth-constraint/>
   </security-constraint>
+  <security-constraint>
+    <web-resource-collection>
+      <web-resource-name>Enable everything but TRACE</web-resource-name>
+      <url-pattern>/</url-pattern>
+      <http-method-omission>TRACE</http-method-omission>
+    </web-resource-collection>
+  </security-constraint>
 
 </web-app>
 
diff --git a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootContextAsService.java b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootContextAsService.java
index 1f80c7b..a538465 100644
--- a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootContextAsService.java
+++ b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootContextAsService.java
@@ -18,18 +18,10 @@
 
 package org.eclipse.jetty.osgi.test;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
-import static org.ops4j.pax.exam.CoreOptions.options;
-import static org.ops4j.pax.exam.CoreOptions.systemProperty;
-
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-
 import javax.inject.Inject;
 
 import org.eclipse.jetty.client.HttpClient;
@@ -40,14 +32,21 @@
 import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
 import org.ops4j.pax.exam.CoreOptions;
 import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.Configuration;
 import org.ops4j.pax.exam.junit.PaxExam;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.systemProperty;
+
 /**
  * TestJettyOSGiBootContextAsService
  * 
@@ -70,7 +69,7 @@
     {
         ArrayList<Option> options = new ArrayList<Option>();
         options.add(CoreOptions.junitBundles());
-        options.addAll(configureJettyHomeAndPort("jetty-selector.xml"));
+        options.addAll(configureJettyHomeAndPort("jetty-http.xml"));
         options.add(CoreOptions.bootDelegationPackages("org.xml.sax", "org.xml.*", "org.w3c.*", "javax.xml.*"));
         options.addAll(TestJettyOSGiBootCore.coreJettyDependencies());
 
@@ -99,7 +98,8 @@
                 + "/jetty-deployer.xml;"
                 + etc
                 + "/jetty-testrealm.xml"));
-        options.add(systemProperty("jetty.port").value(String.valueOf(TestJettyOSGiBootCore.DEFAULT_JETTY_HTTP_PORT)));
+        options.add(systemProperty("jetty.http.port").value(String.valueOf(TestJettyOSGiBootCore.DEFAULT_HTTP_PORT)));
+        options.add(systemProperty("jetty.ssl.port").value(String.valueOf(TestJettyOSGiBootCore.DEFAULT_SSL_PORT)));
         options.add(systemProperty("jetty.home").value(etcFolder.getParentFile().getAbsolutePath()));
         return options;
     }
@@ -122,7 +122,7 @@
         try
         {
             client.start();
-            ContentResponse response = client.GET("http://127.0.0.1:" + TestJettyOSGiBootCore.DEFAULT_JETTY_HTTP_PORT + "/acme/index.html");
+            ContentResponse response = client.GET("http://127.0.0.1:" + TestJettyOSGiBootCore.DEFAULT_HTTP_PORT + "/acme/index.html");
             assertEquals(HttpStatus.OK_200, response.getStatus());
 
             String content = new String(response.getContent());
diff --git a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootCore.java b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootCore.java
index 8f74dc3..324efd9 100644
--- a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootCore.java
+++ b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootCore.java
@@ -18,14 +18,9 @@
 
 package org.eclipse.jetty.osgi.test;
  
-import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
-import static org.ops4j.pax.exam.CoreOptions.options;
-import static org.ops4j.pax.exam.CoreOptions.systemProperty;
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-
 import javax.inject.Inject;
 
 import org.junit.Ignore;
@@ -39,6 +34,10 @@
 import org.ops4j.pax.exam.options.MavenUrlReference.VersionResolver;
 import org.osgi.framework.BundleContext;
 
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.systemProperty;
+
 
 /**
  * Default OSGi setup integration test
@@ -47,7 +46,10 @@
 public class TestJettyOSGiBootCore
 {
     private static final String LOG_LEVEL = "WARN";
-    public static int DEFAULT_JETTY_HTTP_PORT = 9876;
+    
+    // TODO these should be dynamic
+    public static final int DEFAULT_HTTP_PORT = 9876;
+    public static final int DEFAULT_SSL_PORT = 9877;
 
     @Inject
     private BundleContext bundleContext;
@@ -71,7 +73,8 @@
     { 
         List<Option> res = new ArrayList<Option>();
         // get the jetty home config from the osgi boot bundle.
-        res.add(CoreOptions.systemProperty("jetty.port").value(String.valueOf(DEFAULT_JETTY_HTTP_PORT)));
+        res.add(CoreOptions.systemProperty("jetty.http.port").value(String.valueOf(DEFAULT_HTTP_PORT)));
+        res.add(CoreOptions.systemProperty("jetty.ssl.port").value(String.valueOf(DEFAULT_SSL_PORT)));
         res.add(CoreOptions.systemProperty("jetty.home.bundle").value("org.eclipse.jetty.osgi.boot"));
         res.addAll(coreJettyDependencies());
         return res;
@@ -93,10 +96,10 @@
         res.add(mavenBundle().groupId( "org.apache.geronimo.specs" ).artifactId( "geronimo-jta_1.1_spec" ).version("1.1.1").noStart());
         res.add(mavenBundle().groupId( "org.eclipse.jetty.orbit" ).artifactId( "javax.mail.glassfish" ).version( "1.4.1.v201005082020" ).noStart());
 
+        res.add(mavenBundle().groupId( "org.eclipse.jetty" ).artifactId( "jetty-util" ).versionAsInProject().noStart());
         res.add(mavenBundle().groupId( "org.eclipse.jetty" ).artifactId( "jetty-deploy" ).versionAsInProject().noStart());
         res.add(mavenBundle().groupId( "org.eclipse.jetty" ).artifactId( "jetty-server" ).versionAsInProject().noStart());  
         res.add(mavenBundle().groupId( "org.eclipse.jetty" ).artifactId( "jetty-servlet" ).versionAsInProject().noStart());  
-        res.add(mavenBundle().groupId( "org.eclipse.jetty" ).artifactId( "jetty-util" ).versionAsInProject().noStart());
         res.add(mavenBundle().groupId( "org.eclipse.jetty" ).artifactId( "jetty-http" ).versionAsInProject().noStart());
         res.add(mavenBundle().groupId( "org.eclipse.jetty" ).artifactId( "jetty-xml" ).versionAsInProject().noStart());
         res.add(mavenBundle().groupId( "org.eclipse.jetty" ).artifactId( "jetty-webapp" ).versionAsInProject().noStart());
@@ -141,7 +144,7 @@
         res.add(mavenBundle().groupId("org.mortbay.jasper").artifactId("apache-jsp").versionAsInProject());
         res.add(mavenBundle().groupId("org.eclipse.jetty").artifactId("apache-jsp").versionAsInProject());
         res.add(mavenBundle().groupId("org.glassfish.web").artifactId("javax.servlet.jsp.jstl").versionAsInProject());
-        res.add(mavenBundle().groupId("org.eclipse.jetty.orbit").artifactId("org.eclipse.jdt.core").versionAsInProject());
+        res.add(mavenBundle().groupId("org.eclipse.jdt.core.compiler").artifactId("ecj").versionAsInProject());
         res.add(mavenBundle().groupId("org.eclipse.jetty.osgi").artifactId("jetty-osgi-boot-jsp").versionAsInProject().noStart());
         return res;
     }
@@ -170,6 +173,6 @@
     @Test
     public void testHttpService() throws Exception
     {
-        TestOSGiUtil.testHttpServiceGreetings(bundleContext, "http", DEFAULT_JETTY_HTTP_PORT);
+        TestOSGiUtil.testHttpServiceGreetings(bundleContext, "http", DEFAULT_HTTP_PORT);
     }
 }
diff --git a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootHTTP2.java b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootHTTP2.java
new file mode 100644
index 0000000..c90f6b5
--- /dev/null
+++ b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootHTTP2.java
@@ -0,0 +1,112 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.osgi.test;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import javax.inject.Inject;
+
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.CoreOptions;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.osgi.framework.BundleContext;
+
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.systemProperty;
+
+/**
+ * HTTP2 setup.
+ */
+@RunWith(PaxExam.class)
+public class TestJettyOSGiBootHTTP2
+{
+    private static final String LOG_LEVEL = "WARN";
+
+
+    @Inject
+    private BundleContext bundleContext;
+
+    @Configuration
+    public Option[] config()
+    {
+        ArrayList<Option> options = new ArrayList<Option>();
+        options.addAll(TestJettyOSGiBootWithJsp.configureJettyHomeAndPort(true,"jetty-http2.xml"));
+        options.addAll(TestJettyOSGiBootCore.coreJettyDependencies());
+        options.addAll(http2JettyDependencies());
+        options.add(CoreOptions.junitBundles());
+        options.addAll(TestJettyOSGiBootCore.httpServiceJetty());
+        options.addAll(Arrays.asList(options(systemProperty("pax.exam.logging").value("none"))));
+        options.addAll(Arrays.asList(options(systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value(LOG_LEVEL))));
+        options.addAll(Arrays.asList(options(systemProperty("org.eclipse.jetty.osgi.LEVEL").value(LOG_LEVEL))));
+        return options.toArray(new Option[options.size()]);
+    }
+
+    public static List<Option> http2JettyDependencies()
+    {
+        List<Option> res = new ArrayList<Option>();
+        res.add(CoreOptions.systemProperty("jetty.http.port").value(String.valueOf(TestJettyOSGiBootCore.DEFAULT_HTTP_PORT)));
+        res.add(CoreOptions.systemProperty("jetty.ssl.port").value(String.valueOf(TestJettyOSGiBootCore.DEFAULT_SSL_PORT)));
+
+        String alpnBoot = System.getProperty("mortbay-alpn-boot");
+        if (alpnBoot == null) { throw new IllegalStateException("Define path to alpn boot jar as system property -Dmortbay-alpn-boot"); }
+        File checkALPNBoot = new File(alpnBoot);
+        if (!checkALPNBoot.exists()) { throw new IllegalStateException("Unable to find the alpn boot jar here: " + alpnBoot); }
+
+        res.add(CoreOptions.vmOptions("-Xbootclasspath/p:" + alpnBoot));
+
+        res.add(mavenBundle().groupId("org.eclipse.jetty.osgi").artifactId("jetty-osgi-alpn").versionAsInProject().noStart());
+        res.add(mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-alpn-server").versionAsInProject().start());
+
+        res.add(mavenBundle().groupId("org.eclipse.jetty.http2").artifactId("http2-common").versionAsInProject().noStart());
+        res.add(mavenBundle().groupId("org.eclipse.jetty.http2").artifactId("http2-hpack").versionAsInProject().noStart());
+        res.add(mavenBundle().groupId("org.eclipse.jetty.http2").artifactId("http2-server").versionAsInProject().noStart());
+        return res;
+    }
+ 
+    @Test
+    public void checkALPNBootOnBootstrapClasspath() throws Exception
+    {
+        Class<?> alpn = Thread.currentThread().getContextClassLoader().loadClass("org.eclipse.jetty.alpn.ALPN");
+        Assert.assertNotNull(alpn);
+        Assert.assertNull(alpn.getClassLoader());
+    }
+    
+    @Ignore
+    @Test
+    public void assertAllBundlesActiveOrResolved() throws Exception
+    {
+        TestOSGiUtil.assertAllBundlesActiveOrResolved(bundleContext);
+    }
+
+    
+    @Test
+    public void testHTTP2OnHttpService() throws Exception
+    {
+        TestOSGiUtil.testHttpServiceGreetings(bundleContext, "https", TestJettyOSGiBootCore.DEFAULT_SSL_PORT);
+    }
+
+}
diff --git a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootSpdy.java b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootSpdy.java
deleted file mode 100644
index ff8760f..0000000
--- a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootSpdy.java
+++ /dev/null
@@ -1,120 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.osgi.test;
-
-import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
-import static org.ops4j.pax.exam.CoreOptions.systemProperty;
-import static org.ops4j.pax.exam.CoreOptions.options;
-
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.inject.Inject;
-
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.CoreOptions;
-import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.Configuration;
-import org.ops4j.pax.exam.junit.PaxExam;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-
-/**
- * SPDY setup.
- */
-@RunWith(PaxExam.class)
-public class TestJettyOSGiBootSpdy
-{
-    private static final String LOG_LEVEL = "WARN";
-    
-    private static final String JETTY_SPDY_PORT = "jetty.spdy.port";
-
-    private static final int DEFAULT_JETTY_SPDY_PORT = 9877;
-
-    @Inject
-    private BundleContext bundleContext;
-
-    @Configuration
-    public Option[] config()
-    {
-        ArrayList<Option> options = new ArrayList<Option>();
-        options.addAll(TestJettyOSGiBootWithJsp.configureJettyHomeAndPort("jetty-spdy.xml"));
-        options.addAll(TestJettyOSGiBootCore.coreJettyDependencies());
-        options.addAll(spdyJettyDependencies());
-        options.add(CoreOptions.junitBundles());
-        options.addAll(TestJettyOSGiBootCore.httpServiceJetty());
-        options.addAll(Arrays.asList(options(systemProperty("pax.exam.logging").value("none"))));
-        options.addAll(Arrays.asList(options(systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value(LOG_LEVEL))));
-        options.addAll(Arrays.asList(options(systemProperty("org.eclipse.jetty.LEVEL").value(LOG_LEVEL))));
-        return options.toArray(new Option[options.size()]);
-    }
-
-    public static List<Option> spdyJettyDependencies()
-    {
-        List<Option> res = new ArrayList<Option>();
-        res.add(CoreOptions.systemProperty(JETTY_SPDY_PORT).value(String.valueOf(DEFAULT_JETTY_SPDY_PORT)));
-
-        String alpnBoot = System.getProperty("mortbay-alpn-boot");
-        if (alpnBoot == null) { throw new IllegalStateException("Define path to alpn boot jar as system property -Dmortbay-alpn-boot"); }
-        File checkALPNBoot = new File(alpnBoot);
-        if (!checkALPNBoot.exists()) { throw new IllegalStateException("Unable to find the alpn boot jar here: " + alpnBoot); }
-
-
-        res.add(CoreOptions.vmOptions("-Xbootclasspath/p:" + alpnBoot));
-
-        res.add(mavenBundle().groupId("org.eclipse.jetty.osgi").artifactId("jetty-osgi-alpn").versionAsInProject().noStart());
-        res.add(mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-alpn-server").versionAsInProject().start());
-
-        res.add(mavenBundle().groupId("org.eclipse.jetty.spdy").artifactId("spdy-client").versionAsInProject().noStart());
-        res.add(mavenBundle().groupId("org.eclipse.jetty.spdy").artifactId("spdy-core").versionAsInProject().noStart());
-        res.add(mavenBundle().groupId("org.eclipse.jetty.spdy").artifactId("spdy-server").versionAsInProject().noStart());
-        res.add(mavenBundle().groupId("org.eclipse.jetty.spdy").artifactId("spdy-http-common").versionAsInProject().noStart());
-        res.add(mavenBundle().groupId("org.eclipse.jetty.spdy").artifactId("spdy-http-server").versionAsInProject().noStart());
-        return res;
-    }
-
-    @Test
-    public void checkALPNBootOnBootstrapClasspath() throws Exception
-    {
-        Class<?> alpn = Thread.currentThread().getContextClassLoader().loadClass("org.eclipse.jetty.alpn.ALPN");
-        Assert.assertNotNull(alpn);
-        Assert.assertNull(alpn.getClassLoader());
-    }
-
-    @Ignore
-    @Test
-    public void assertAllBundlesActiveOrResolved()
-    {
-        TestOSGiUtil.debugBundles(bundleContext);
-        TestOSGiUtil.assertAllBundlesActiveOrResolved(bundleContext);
-    }
-
-    @Test
-    public void testSpdyOnHttpService() throws Exception
-    {
-        TestOSGiUtil.testHttpServiceGreetings(bundleContext, "https", DEFAULT_JETTY_SPDY_PORT);
-    }
-
-}
diff --git a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWebAppAsService.java b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWebAppAsService.java
index da84573..b725b7d 100644
--- a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWebAppAsService.java
+++ b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWebAppAsService.java
@@ -18,18 +18,10 @@
 
 package org.eclipse.jetty.osgi.test;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
-import static org.ops4j.pax.exam.CoreOptions.options;
-import static org.ops4j.pax.exam.CoreOptions.systemProperty;
-
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-
 import javax.inject.Inject;
 
 import org.eclipse.jetty.client.HttpClient;
@@ -41,13 +33,20 @@
 import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
 import org.ops4j.pax.exam.CoreOptions;
 import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.Configuration;
 import org.ops4j.pax.exam.junit.PaxExam;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.systemProperty;
+
 /**
  * TestJettyOSGiBootWebAppAsService
  * 
@@ -72,7 +71,7 @@
     {
         ArrayList<Option> options = new ArrayList<Option>();
         options.add(CoreOptions.junitBundles());
-        options.addAll(configureJettyHomeAndPort("jetty-selector.xml"));
+        options.addAll(configureJettyHomeAndPort("jetty-http.xml"));
         options.add(CoreOptions.bootDelegationPackages("org.xml.sax", "org.xml.*", "org.w3c.*", "javax.xml.*"));
         options.add(CoreOptions.systemPackages("com.sun.org.apache.xalan.internal.res","com.sun.org.apache.xml.internal.utils",
                                                "com.sun.org.apache.xml.internal.utils", "com.sun.org.apache.xpath.internal",
@@ -102,7 +101,8 @@
                 + "/jetty-deployer.xml;"
                 + etc
                 + "/jetty-testrealm.xml"));
-        options.add(systemProperty("jetty.port").value(String.valueOf(TestJettyOSGiBootCore.DEFAULT_JETTY_HTTP_PORT)));
+        options.add(systemProperty("jetty.http.port").value(String.valueOf(TestJettyOSGiBootCore.DEFAULT_HTTP_PORT)));
+        options.add(systemProperty("jetty.ssl.port").value(String.valueOf(TestJettyOSGiBootCore.DEFAULT_SSL_PORT)));
         options.add(systemProperty("jetty.home").value(etcFolder.getParentFile().getAbsolutePath()));
         return options;
     }
@@ -137,7 +137,7 @@
         {
             client.start();
 
-            ContentResponse response = client.GET("http://127.0.0.1:" + TestJettyOSGiBootCore.DEFAULT_JETTY_HTTP_PORT + "/acme/index.html");
+            ContentResponse response = client.GET("http://127.0.0.1:" + TestJettyOSGiBootCore.DEFAULT_HTTP_PORT + "/acme/index.html");
             assertEquals(HttpStatus.OK_200, response.getStatus());
 
             String content = new String(response.getContent());
diff --git a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithAnnotations.java b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithAnnotations.java
index acdd7d8..a41c633 100644
--- a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithAnnotations.java
+++ b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithAnnotations.java
@@ -18,17 +18,10 @@
 
 package org.eclipse.jetty.osgi.test;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
-import static org.ops4j.pax.exam.CoreOptions.options;
-import static org.ops4j.pax.exam.CoreOptions.systemProperty;
-
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-
 import javax.inject.Inject;
 
 import org.eclipse.jetty.client.HttpClient;
@@ -45,6 +38,12 @@
 import org.ops4j.pax.exam.junit.PaxExam;
 import org.osgi.framework.BundleContext;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.systemProperty;
+
 /**
  * Pax-Exam to make sure the jetty-osgi-boot can be started along with the
  * httpservice web-bundle. Then make sure we can deploy an OSGi service on the
@@ -62,10 +61,9 @@
     @Configuration
     public static Option[] configure()
     {
-
         ArrayList<Option> options = new ArrayList<Option>();
         options.add(CoreOptions.junitBundles());
-        options.addAll(configureJettyHomeAndPort("jetty-selector.xml"));
+        options.addAll(configureJettyHomeAndPort("jetty-http.xml"));
         options.add(CoreOptions.bootDelegationPackages("org.xml.sax", "org.xml.*", "org.w3c.*", "javax.sql.*","javax.xml.*", "javax.activation.*"));
         options.add(CoreOptions.systemPackages("com.sun.org.apache.xalan.internal.res","com.sun.org.apache.xml.internal.utils",
                                                "com.sun.org.apache.xml.internal.utils", "com.sun.org.apache.xpath.internal",
@@ -75,7 +73,7 @@
         options.addAll(Arrays.asList(options(systemProperty("pax.exam.logging").value("none"))));
         options.addAll(Arrays.asList(options(systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value(LOG_LEVEL))));
         options.addAll(Arrays.asList(options(systemProperty("org.eclipse.jetty.annotations.LEVEL").value(LOG_LEVEL))));
-        //options.addAll(TestJettyOSGiBootCore.consoleDependencies());
+        // options.addAll(TestJettyOSGiBootCore.consoleDependencies());
         options.addAll(jspDependencies());
         options.addAll(annotationDependencies());
         return options.toArray(new Option[options.size()]);
@@ -101,7 +99,8 @@
                 + "/jetty-testrealm.xml";
 
         options.add(systemProperty(OSGiServerConstants.MANAGED_JETTY_XML_CONFIG_URLS).value(xmlConfigs));
-        options.add(systemProperty("jetty.port").value(String.valueOf(TestJettyOSGiBootCore.DEFAULT_JETTY_HTTP_PORT)));
+        options.add(systemProperty("jetty.http.port").value(String.valueOf(TestJettyOSGiBootCore.DEFAULT_HTTP_PORT)));
+        options.add(systemProperty("jetty.ssl.port").value(String.valueOf(TestJettyOSGiBootCore.DEFAULT_SSL_PORT)));
         options.add(systemProperty("jetty.home").value(etcFolder.getParentFile().getAbsolutePath()));
         return options;
     }
@@ -135,7 +134,7 @@
     @Test
     public void testHttpService() throws Exception
     {
-        TestOSGiUtil.testHttpServiceGreetings(bundleContext, "http", TestJettyOSGiBootCore.DEFAULT_JETTY_HTTP_PORT);
+        TestOSGiUtil.testHttpServiceGreetings(bundleContext, "http", TestJettyOSGiBootCore.DEFAULT_HTTP_PORT);
     }
 
  
@@ -143,17 +142,18 @@
     @Test
     public void testIndex() throws Exception
     {        
+        // TestOSGiUtil.debugBundles(bundleContext);
         HttpClient client = new HttpClient();
         try
         {
             client.start();
-            ContentResponse response = client.GET("http://127.0.0.1:" + TestJettyOSGiBootCore.DEFAULT_JETTY_HTTP_PORT + "/index.html");
+            ContentResponse response = client.GET("http://127.0.0.1:" + TestJettyOSGiBootCore.DEFAULT_HTTP_PORT + "/index.html");
             assertEquals(HttpStatus.OK_200, response.getStatus());
 
             String content = new String(response.getContent());
             assertTrue(content.contains("<h1>Servlet 3.1 Test WebApp</h1>"));
             
-            Request req = client.POST("http://127.0.0.1:" + TestJettyOSGiBootCore.DEFAULT_JETTY_HTTP_PORT + "/test");
+            Request req = client.POST("http://127.0.0.1:" + TestJettyOSGiBootCore.DEFAULT_HTTP_PORT + "/test");
             response = req.send();
             content = new String(response.getContent());
             assertTrue(content.contains("<p><b>Result: <span class=\"pass\">PASS</span></p>"));
diff --git a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithJsp.java b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithJsp.java
index 0145a1a..b59b839 100644
--- a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithJsp.java
+++ b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithJsp.java
@@ -18,17 +18,10 @@
 
 package org.eclipse.jetty.osgi.test;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
-import static org.ops4j.pax.exam.CoreOptions.options;
-import static org.ops4j.pax.exam.CoreOptions.systemProperty;
-
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-
 import javax.inject.Inject;
 
 import org.eclipse.jetty.client.HttpClient;
@@ -44,6 +37,12 @@
 import org.ops4j.pax.exam.junit.PaxExam;
 import org.osgi.framework.BundleContext;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.systemProperty;
+
 /**
  * Pax-Exam to make sure the jetty-osgi-boot can be started along with the
  * httpservice web-bundle. Then make sure we can deploy an OSGi service on the
@@ -52,7 +51,7 @@
 @RunWith(PaxExam.class)
 public class TestJettyOSGiBootWithJsp
 {
-    private static final String LOG_LEVEL = "INFO";
+    private static final String LOG_LEVEL = "WARN";
 
     @Inject
     BundleContext bundleContext = null;
@@ -60,10 +59,9 @@
     @Configuration
     public static Option[] configure()
     {
-
         ArrayList<Option> options = new ArrayList<Option>();
         options.add(CoreOptions.junitBundles());
-        options.addAll(configureJettyHomeAndPort("jetty-selector.xml"));
+        options.addAll(configureJettyHomeAndPort(false,"jetty-http.xml"));
         options.add(CoreOptions.bootDelegationPackages("org.xml.sax", "org.xml.*", "org.w3c.*", "javax.xml.*", "javax.activation.*"));
         options.add(CoreOptions.systemPackages("com.sun.org.apache.xalan.internal.res","com.sun.org.apache.xml.internal.utils",
                                                "com.sun.org.apache.xml.internal.utils", "com.sun.org.apache.xpath.internal",
@@ -73,33 +71,38 @@
         options.addAll(Arrays.asList(options(systemProperty("pax.exam.logging").value("none"))));
         options.addAll(Arrays.asList(options(systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value(LOG_LEVEL))));
         options.addAll(Arrays.asList(options(systemProperty("org.eclipse.jetty.LEVEL").value(LOG_LEVEL))));
-        options.addAll(Arrays.asList(options(systemProperty("org.eclipse.jetty.annotations.LEVEL").value("DEBUG"))));
+        options.addAll(Arrays.asList(options(systemProperty("org.eclipse.jetty.osgi.LEVEL").value(LOG_LEVEL))));
         options.addAll(jspDependencies());
         return options.toArray(new Option[options.size()]);
     }
 
-    public static List<Option> configureJettyHomeAndPort(String jettySelectorFileName)
+    public static List<Option> configureJettyHomeAndPort(boolean ssl,String jettySelectorFileName)
     {
         File etcFolder = new File("src/test/config/etc");
         String etc = "file://" + etcFolder.getAbsolutePath();
         List<Option> options = new ArrayList<Option>();
-        String xmlConfigs = etc     + "/jetty.xml;"
+        String xmlConfigs = etc     + "/jetty.xml";
+        if (ssl)
+            xmlConfigs += ";" 
+                    + etc
+                    + "/jetty-ssl.xml;"
+                    + etc
+                    + "/jetty-https.xml;";
+        xmlConfigs+= ";"
                 + etc
                 + "/"
                 + jettySelectorFileName
                 + ";"
                 + etc
-                + "/jetty-ssl.xml;"
-                + etc
-                + "/jetty-https.xml;"
-                + etc
                 + "/jetty-deployer.xml;"
                 + etc
                 + "/jetty-testrealm.xml";
 
         options.add(systemProperty(OSGiServerConstants.MANAGED_JETTY_XML_CONFIG_URLS).value(xmlConfigs));
-        options.add(systemProperty("jetty.port").value(String.valueOf(TestJettyOSGiBootCore.DEFAULT_JETTY_HTTP_PORT)));
+        options.add(systemProperty("jetty.http.port").value(String.valueOf(TestJettyOSGiBootCore.DEFAULT_HTTP_PORT)));
+        options.add(systemProperty("jetty.ssl.port").value(String.valueOf(TestJettyOSGiBootCore.DEFAULT_SSL_PORT)));
         options.add(systemProperty("jetty.home").value(etcFolder.getParentFile().getAbsolutePath()));
+        options.add(systemProperty("jetty.base").value(etcFolder.getParentFile().getAbsolutePath()));
         return options;
     }
 
@@ -114,8 +117,8 @@
     }
 
 
-    @Test
     @Ignore
+    @Test
     public void assertAllBundlesActiveOrResolved()
     {
         TestOSGiUtil.debugBundles(bundleContext);
@@ -128,19 +131,20 @@
     @Test
     public void testHttpService() throws Exception
     {
-        TestOSGiUtil.testHttpServiceGreetings(bundleContext, "http", TestJettyOSGiBootCore.DEFAULT_JETTY_HTTP_PORT);
+        TestOSGiUtil.testHttpServiceGreetings(bundleContext, "http", TestJettyOSGiBootCore.DEFAULT_HTTP_PORT);
     }
 
  
     @Test
     public void testJspDump() throws Exception
     {
-   
+        // TestOSGiUtil.debugBundles(bundleContext);
         HttpClient client = new HttpClient();
         try
         {
             client.start();
-            ContentResponse response = client.GET("http://127.0.0.1:" + TestJettyOSGiBootCore.DEFAULT_JETTY_HTTP_PORT + "/jsp/jstl.jsp");
+            ContentResponse response = client.GET("http://127.0.0.1:" + TestJettyOSGiBootCore.DEFAULT_HTTP_PORT + "/jsp/jstl.jsp");
+            
             assertEquals(HttpStatus.OK_200, response.getStatus());
             String content = new String(response.getContent());
             assertTrue(content.contains("JSTL Example"));           
diff --git a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestOSGiUtil.java b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestOSGiUtil.java
index 82f5d8f..6573780 100644
--- a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestOSGiUtil.java
+++ b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestOSGiUtil.java
@@ -20,7 +20,6 @@
 
 import java.io.IOException;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import javax.servlet.ServletException;
@@ -33,7 +32,6 @@
 import org.eclipse.jetty.http.HttpStatus;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
 import org.junit.Assert;
-import org.ops4j.pax.exam.Option;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
diff --git a/jetty-overlay-deployer/pom.xml b/jetty-overlay-deployer/pom.xml
index a531f46..9f0a73b 100644
--- a/jetty-overlay-deployer/pom.xml
+++ b/jetty-overlay-deployer/pom.xml
@@ -10,6 +10,7 @@
   <description>Overlayed deployer</description>
   <url>http://www.eclipse.org/jetty</url>
   <properties>
+    <bundle-symbolic-name>${project.groupId}.overlays</bundle-symbolic-name>
   </properties>
   <build>
     <plugins>
diff --git a/jetty-overlay-deployer/src/main/config/etc/jetty-overlay.xml b/jetty-overlay-deployer/src/main/config/etc/jetty-overlay.xml
index 62317a3..60f23d6 100644
--- a/jetty-overlay-deployer/src/main/config/etc/jetty-overlay.xml
+++ b/jetty-overlay-deployer/src/main/config/etc/jetty-overlay.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Add a ContextProvider to the deployment manager                 -->
diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/overlay.xml b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/overlay.xml
index 11c70ac..8d29a8a 100644
--- a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/overlay.xml
+++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/overlay.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure class="org.eclipse.jetty.webapp.WebAppContext">
 
diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/overlay.xml b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/overlay.xml
index f6cfcf6..7a15e73 100644
--- a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/overlay.xml
+++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/overlay.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure class="org.eclipse.jetty.webapp.WebAppContext">
 
diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/overlay.xml b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/overlay.xml
index 6a71455..90685db 100644
--- a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/overlay.xml
+++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/overlay.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure class="org.eclipse.jetty.webapp.WebAppContext">
 
diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/root=root/WEB-INF/overlay.xml b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/root=root/WEB-INF/overlay.xml
index 287e1e0..ca23e18 100644
--- a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/root=root/WEB-INF/overlay.xml
+++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/root=root/WEB-INF/overlay.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure class="org.eclipse.jetty.server.handler.ContextHandler">
   <!--
diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/jetty-web.xml b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/jetty-web.xml
index 16cba2a..4723bf7 100644
--- a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/jetty-web.xml
+++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/jetty-web.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure class="org.eclipse.jetty.webapp.WebAppContext">
   <Call class="org.eclipse.jetty.util.log.Log" name="info"><Arg>Executing jetty-web.xml for <Property name="overlay.instance"/></Arg></Call>
-</Configure>
\ No newline at end of file
+</Configure>
diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/template.xml b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/template.xml
index 3104fca..fddd63b 100644
--- a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/template.xml
+++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/template.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure class="org.eclipse.jetty.overlays.TemplateContext">
   <Set name="parentLoaderPriority" type="boolean">false</Set>
diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/web-default.xml b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/web-default.xml
index 22f82f4..d54d76f 100644
--- a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/web-default.xml
+++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/web-default.xml
@@ -1,43 +1,68 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<web-app 
+   xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+   metadata-complete="false"
+   version="3.1"> 
 
   <!-- ===================================================================== -->
   <!-- This file contains the default descriptor for web applications.       -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
   <!-- The intent of this descriptor is to include jetty specific or common  -->
   <!-- configuration for all webapps.   If a context has a webdefault.xml    -->
-  <!-- descriptor, it is applied before the contexts own web.xml file        -->
+  <!-- descriptor, it is applied before the context's own web.xml file       -->
   <!--                                                                       -->
-  <!-- A context may be assigned a default descriptor by:                    -->
-  <!--  + Calling WebApplicationContext.setDefaultsDescriptor                -->
-  <!--  + Passed an arg to addWebApplications                                -->
+  <!-- A context may be assigned a default descriptor by calling             -->
+  <!-- WebAppContext.setDefaultsDescriptor(String).                          -->
   <!--                                                                       -->
-  <!-- This file is used both as the resource within the jetty.jar (which is -->
-  <!-- used as the default if no explicit defaults descriptor is set) and it -->
-  <!-- is copied to the etc directory of the Jetty distro and explicitly     -->
-  <!-- by the jetty.xml file.                                                -->
+  <!-- This file is present in the jetty-webapp.jar, and is used as the      -->
+  <!-- defaults descriptor if no other is explicitly set on a context.       -->
   <!--                                                                       -->
+  <!-- A copy of this file is also placed into the $JETTY_HOME/etc dir of    -->
+  <!-- the  distribution, and is referenced by some of the other xml files,  -->
+  <!-- eg the jetty-deploy.xml file.                                         -->
   <!-- ===================================================================== -->
-<web-app
-  xmlns="http://java.sun.com/xml/ns/javaee"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
-  metadata-complete="true"
-  version="2.5"
->
 
   <description>
     Default web.xml file.  
     This file is applied to a Web application before it's own WEB_INF/web.xml file
   </description>
 
+  <!-- ==================================================================== -->
+  <!-- Removes static references to beans from javax.el.BeanELResolver to   -->
+  <!-- ensure webapp classloader can be released on undeploy                -->
+  <!-- ==================================================================== -->
+  <listener>
+   <listener-class>org.eclipse.jetty.servlet.listener.ELContextCleaner</listener-class>
+  </listener>
+  
+  <!-- ==================================================================== -->
+  <!-- Removes static cache of Methods from java.beans.Introspector to      -->
+  <!-- ensure webapp classloader can be released on undeploy                -->
+  <!-- ==================================================================== -->  
+  <listener>
+   <listener-class>org.eclipse.jetty.servlet.listener.IntrospectorCleaner</listener-class>
+  </listener>
+  
 
   <!-- ==================================================================== -->
   <!-- Context params to control Session Cookies                            -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <!--
-    UNCOMMENT TO ACTIVATE <context-param> <param-name>org.eclipse.jetty.servlet.SessionDomain</param-name> <param-value>127.0.0.1</param-value> </context-param> <context-param>
-    <param-name>org.eclipse.jetty.servlet.SessionPath</param-name> <param-value>/</param-value> </context-param> <context-param> <param-name>org.eclipse.jetty.servlet.MaxAge</param-name>
-    <param-value>-1</param-value> </context-param>
+    UNCOMMENT TO ACTIVATE 
+    <context-param> 
+      <param-name>org.eclipse.jetty.servlet.SessionDomain</param-name> 
+      <param-value>127.0.0.1</param-value> 
+    </context-param> 
+    <context-param>
+      <param-name>org.eclipse.jetty.servlet.SessionPath</param-name>
+      <param-value>/</param-value>
+    </context-param>
+    <context-param>
+      <param-name>org.eclipse.jetty.servlet.MaxAge</param-name>
+      <param-value>-1</param-value>
+    </context-param>
   -->
 
   <!-- ==================================================================== -->
@@ -71,33 +96,39 @@
  *
  *  resourceBase      Set to replace the context resource base
  *
- *  resourceCache     If set, this is a context attribute name, which the servlet 
- *                    will use to look for a shared ResourceCache instance. 
- *                        
+ *  resourceCache     If set, this is a context attribute name, which the servlet
+ *                    will use to look for a shared ResourceCache instance.
+ *
  *  relativeResourceBase
  *                    Set with a pathname relative to the base of the
  *                    servlet context root. Useful for only serving static content out
  *                    of only specific subdirectories.
  *
+ *  pathInfoOnly      If true, only the path info will be applied to the resourceBase
+ *
+ *  stylesheet        Set with the location of an optional stylesheet that will be used
+ *                    to decorate the directory listing html.
+ *
  *  aliases           If True, aliases of resources are allowed (eg. symbolic
  *                    links and caps variations). May bypass security constraints.
+ *                    
+ *  etags             If True, weak etags will be generated and handled.
  *
  *  maxCacheSize      The maximum total size of the cache or 0 for no cache.
  *  maxCachedFileSize The maximum size of a file to cache
  *  maxCachedFiles    The maximum number of files to cache
  *
  *  useFileMappedBuffer
- *                    If set to true, it will use mapped file buffer to serve static content
- *                    when using NIO connector. Setting this value to false means that
+ *                    If set to true, it will use mapped file buffers to serve static content
+ *                    when using an NIO connector. Setting this value to false means that
  *                    a direct buffer will be used instead of a mapped file buffer.
- *                    By default, this is set to true.
+ *                    This file sets the value to true.
  *
  *  cacheControl      If set, all static content will have this value set as the cache-control
  *                    header.
+ *
  -->
- 
- 
-  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <servlet>
     <servlet-name>default</servlet-name>
     <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
@@ -127,7 +158,7 @@
     </init-param>
     <init-param>
       <param-name>maxCachedFileSize</param-name>
-      <param-value>10000000</param-value>
+      <param-value>200000000</param-value>
     </init-param>
     <init-param>
       <param-name>maxCachedFiles</param-name>
@@ -135,16 +166,22 @@
     </init-param>
     <init-param>
       <param-name>gzip</param-name>
-      <param-value>true</param-value>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
+      <param-name>etags</param-name>
+      <param-value>false</param-value>
     </init-param>
     <init-param>
       <param-name>useFileMappedBuffer</param-name>
       <param-value>true</param-value>
     </init-param>
+    <!--
     <init-param>
       <param-name>resourceCache</param-name>
-      <param-value>org.eclipse.jetty.server.ResourceCache</param-value>
+      <param-value>resourceCache</param-value>
     </init-param>
+    -->
     <!--
     <init-param>
       <param-name>cacheControl</param-name>
@@ -162,13 +199,13 @@
 
   <!-- ==================================================================== -->
   <!-- JSP Servlet                                                          -->
-  <!-- This is the jasper JSP servlet from the jakarta project              -->
+  <!-- This is the jasper JSP servlet.                                      -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <!-- The JSP page compiler and execution servlet, which is the mechanism  -->
-  <!-- used by Glassfish to support JSP pages.  Traditionally, this servlet -->
-  <!-- is mapped to URL patterh "*.jsp".  This servlet supports the         -->
-  <!-- following initialization parameters (default values are in square    -->
-  <!-- brackets):                                                           -->
+  <!-- used by the jsp container to support JSP pages.  Traditionally,      -->
+  <!-- this servlet is mapped to URL pattern "*.jsp".  This servlet         -->
+  <!-- supports the following initialization parameters (default values     -->
+  <!-- are in square brackets):                                             -->
   <!--                                                                      -->
   <!--   checkInterval       If development is false and reloading is true, -->
   <!--                       background compiles are enabled. checkInterval -->
@@ -176,7 +213,7 @@
   <!--                       if a JSP page needs to be recompiled. [300]    -->
   <!--                                                                      -->
   <!--   compiler            Which compiler Ant should use to compile JSP   -->
-  <!--                       pages.  See the Ant documenation for more      -->
+  <!--                       pages.  See the Ant documentation for more     -->
   <!--                       information. [javac]                           -->
   <!--                                                                      -->
   <!--   classdebuginfo      Should the class file be compiled with         -->
@@ -237,19 +274,10 @@
   <!--   xpoweredBy          Determines whether X-Powered-By response       -->
   <!--                       header is added by generated servlet  [false]  -->
   <!--                                                                      -->
-  <!-- If you wish to use Jikes to compile JSP pages:                       -->
-  <!--   Set the init parameter "compiler" to "jikes".  Define              -->
-  <!--   the property "-Dbuild.compiler.emacs=true" when starting Jetty     -->
-  <!--   to cause Jikes to emit error messages in a format compatible with  -->
-  <!--   Jasper.                                                            -->
-  <!--   If you get an error reporting that jikes can't use UTF-8 encoding, -->
-  <!--   try setting the init parameter "javaEncoding" to "ISO-8859-1".     -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <servlet
-    id="jsp"
-  >
+  <servlet id="jsp">
     <servlet-name>jsp</servlet-name>
-    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
+    <servlet-class>org.eclipse.jetty.jsp.JettyJspServlet</servlet-class>
     <init-param>
       <param-name>logVerbosityLevel</param-name>
       <param-value>DEBUG</param-value>
@@ -262,6 +290,14 @@
       <param-name>xpoweredBy</param-name>
       <param-value>false</param-value>
     </init-param>
+    <init-param>
+      <param-name>compilerTargetVM</param-name>
+      <param-value>1.7</param-value>
+    </init-param>
+    <init-param>
+      <param-name>compilerSourceVM</param-name>
+      <param-value>1.7</param-value>
+    </init-param>
     <!--  
     <init-param>
         <param-name>classpath</param-name>
@@ -285,6 +321,8 @@
 
 
   <!-- ==================================================================== -->
+  <!-- Default session configuration                                        -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <session-config>
     <session-timeout>30</session-timeout>
   </session-config>
@@ -292,7 +330,7 @@
   <!-- ==================================================================== -->
   <!-- Default MIME mappings                                                -->
   <!-- The default MIME mappings are provided by the mime.properties        -->
-  <!-- resource in the org.eclipse.jetty.server.jar file.  Additional or modified  -->
+  <!-- resource in the jetty-http.jar file.  Additional or modified         -->
   <!-- mappings may be specified here                                       -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <!-- UNCOMMENT TO ACTIVATE
@@ -303,13 +341,17 @@
   -->
 
   <!-- ==================================================================== -->
+  <!-- Default welcome files                                                -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <welcome-file-list>
-    <welcome-file>index.jsp</welcome-file>
     <welcome-file>index.html</welcome-file>
     <welcome-file>index.htm</welcome-file>
+    <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
 
   <!-- ==================================================================== -->
+  <!-- Default locale encodings                                             -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <locale-encoding-mapping-list>
     <locale-encoding-mapping>
       <locale>ar</locale>
@@ -469,6 +511,9 @@
     </locale-encoding-mapping>
   </locale-encoding-mapping-list>
 
+  <!-- ==================================================================== -->
+  <!-- Disable TRACE method with security constraint                        -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <security-constraint>
     <web-resource-collection>
       <web-resource-name>Disable TRACE</web-resource-name>
@@ -477,6 +522,13 @@
     </web-resource-collection>
     <auth-constraint/>
   </security-constraint>
+  <security-constraint>
+    <web-resource-collection>
+      <web-resource-name>Enable everything but TRACE</web-resource-name>
+      <url-pattern>/</url-pattern>
+      <http-method-omission>TRACE</http-method-omission>
+    </web-resource-collection>
+  </security-constraint>
 
 </web-app>
 
diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/root/WEB-INF/overlay.xml b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/root/WEB-INF/overlay.xml
index 813ca58..f3037a1 100644
--- a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/root/WEB-INF/overlay.xml
+++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/root/WEB-INF/overlay.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.eclipse.org/configure.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.eclipse.org/configure_9_3.dtd">
 
 
 <Configure class="org.eclipse.jetty.server.handler.ContextHandler">
diff --git a/jetty-plus/pom.xml b/jetty-plus/pom.xml
index a796b34..4170532 100644
--- a/jetty-plus/pom.xml
+++ b/jetty-plus/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-plus</artifactId>
@@ -14,59 +14,6 @@
   </properties>
   <build>
     <plugins>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-               <_nouses>true</_nouses>
-               <!-- Export-Package>
-                 org.eclipse.jetty.plus.annotation;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}",
-                 org.eclipse.jetty.plus.webapp;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}",
-                 org.eclipse.jetty.plus.jndi;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}",
-                 org.eclipse.jetty.plus.security;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
-               </Export-Package -->
-               <Import-Package>javax.sql.*,javax.security.*,javax.naming.*,
-               javax.servlet.*;version="[2.6.0,3.2)",javax.transaction.*;version="[1.1,1.3)",
-               *
-               </Import-Package>
-              </instructions>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
       <!-- always include the sources to be able to prepare the eclipse-jetty-SDK feature
       with a snapshot. -->
       <plugin>
diff --git a/jetty-plus/src/main/config/etc/jetty-plus.xml b/jetty-plus/src/main/config/etc/jetty-plus.xml
index bfbcce5..ed30824 100644
--- a/jetty-plus/src/main/config/etc/jetty-plus.xml
+++ b/jetty-plus/src/main/config/etc/jetty-plus.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Configure extended support for webapps                          -->
diff --git a/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/ContainerInitializer.java b/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/ContainerInitializer.java
index 8150e92..129b300 100644
--- a/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/ContainerInitializer.java
+++ b/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/ContainerInitializer.java
@@ -91,7 +91,7 @@
     /**
      * A class has been found that has an annotation of interest
      * to this initializer.
-     * @param className
+     * @param className the class name to add
      */
     public void addAnnotatedTypeName (String className)
     {
diff --git a/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/Injection.java b/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/Injection.java
index b533a38..2d87f6d 100644
--- a/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/Injection.java
+++ b/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/Injection.java
@@ -32,11 +32,10 @@
 
 /**
  * Injection
- *
+ * <p>
  * Represents the injection of a resource into a target (method or field).
  * The injection is performed by doing an ENC lookup using the jndi
  * name provided, and setting the object obtained on the target.
- *
  */
 public class Injection
 {
@@ -168,7 +167,7 @@
 
     /**
      * Inject a value for a Resource from JNDI into an object
-     * @param injectable
+     * @param injectable the object to inject 
      */
     public void inject (Object injectable)
     {
@@ -187,7 +186,7 @@
     /**
      * The Resource must already exist in the ENC of this webapp.
      * @return the injected valud
-     * @throws NamingException
+     * @throws NamingException if unable to lookup value
      */
     public Object lookupInjectedValue ()
     throws NamingException
@@ -200,8 +199,8 @@
 
     /**
      * Inject value from jndi into a field of an instance
-     * @param field
-     * @param injectable
+     * @param field the field to inject into
+     * @param injectable the value to inject
      */
     protected void injectField (Field field, Object injectable)
     {
@@ -221,8 +220,8 @@
 
     /**
      * Inject value from jndi into a setter method of an instance
-     * @param method
-     * @param injectable
+     * @param method the method to inject into
+     * @param injectable the value to inject
      */
     protected void injectMethod (Method method, Object injectable)
     {
diff --git a/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/LifeCycleCallbackCollection.java b/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/LifeCycleCallbackCollection.java
index 99f2b5c..079c925 100644
--- a/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/LifeCycleCallbackCollection.java
+++ b/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/LifeCycleCallbackCollection.java
@@ -28,11 +28,8 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
-
 /**
  * LifeCycleCallbackCollection
- *
- *
  */
 public class LifeCycleCallbackCollection
 {
@@ -46,7 +43,7 @@
     /**
      * Add a Callback to the list of callbacks.
      * 
-     * @param callback
+     * @param callback the callback
      */
     public void add (LifeCycleCallback callback)
     {
@@ -95,10 +92,10 @@
     }
     
     /**
-     * Call the method, if one exists, that is annotated with PostConstruct
-     * or with &lt;post-construct&gt; in web.xml
+     * Call the method, if one exists, that is annotated with <code>&#064;PostConstruct</code>
+     * or with <code>&lt;post-construct&gt;</code> in web.xml
      * @param o the object on which to attempt the callback
-     * @throws Exception
+     * @throws Exception if unable to call {@link PostConstructCallback}
      */
     public void callPostConstructCallback (Object o)
     throws Exception
@@ -120,9 +117,10 @@
 
     
     /**
-     * Call the method, if one exists, that is annotated with PreDestroy
-     * or with &lt;pre-destroy&gt; in web.xml
+     * Call the method, if one exists, that is annotated with <code>&#064;PreDestroy</code>
+     * or with <code>&lt;pre-destroy&gt;</code> in web.xml
      * @param o the object on which to attempt the callback
+     * @throws Exception if unable to call {@link PreDestroyCallback}
      */
     public void callPreDestroyCallback (Object o)
     throws Exception
@@ -141,7 +139,7 @@
     
     /**
      * Generate a read-only view of the post-construct callbacks
-     * @return
+     * @return the map of {@link PostConstructCallback}s
      */
     public Map<String, List<LifeCycleCallback>> getPostConstructCallbackMap()
     {
@@ -150,7 +148,7 @@
     
     /**
      * Generate a read-only view of the pre-destroy callbacks
-     * @return
+     * @return the map of {@link PreDestroyCallback}s
      */
     public Map<String, List<LifeCycleCallback>> getPreDestroyCallbackMap()
     {
@@ -159,7 +157,7 @@
     
     /**
      * Amalgamate all post-construct callbacks and return a read only list
-     * @return
+     * @return the collection of {@link PostConstructCallback}s
      */
     public Collection<LifeCycleCallback> getPostConstructCallbacks()
     {
@@ -173,7 +171,7 @@
     
     /**
      * Amalgamate all pre-destroy callbacks and return a read only list
-     * @return
+     * @return the collection of {@link PreDestroyCallback}s
      */
     public Collection<LifeCycleCallback> getPreDestroyCallbacks()
     {
diff --git a/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/RunAs.java b/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/RunAs.java
index eb9876f..6a0726c 100644
--- a/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/RunAs.java
+++ b/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/RunAs.java
@@ -22,8 +22,8 @@
 
 /**
  * RunAs
- * <p/>
- * Represents a &lt;run-as&gt; element in web.xml, or a runAs annotation.
+ * <p>
+ * Represents a <code>&lt;run-as&gt;</code> element in web.xml, or a <code>&#064;RunAs</code> annotation.
  */
 public class RunAs
 {
@@ -54,10 +54,6 @@
         return _roleName;
     }
 
-
-    /**
-     * @param holder
-     */
     public void setRunAs (ServletHolder holder)
     {
         if (holder == null)
@@ -70,6 +66,5 @@
             if (holder.getRegistration().getRunAsRole() == null)
                 holder.getRegistration().setRunAsRole(_roleName);
         }
-            
     }
 }
diff --git a/jetty-plus/src/main/java/org/eclipse/jetty/plus/jndi/EnvEntry.java b/jetty-plus/src/main/java/org/eclipse/jetty/plus/jndi/EnvEntry.java
index 1fd7c8c..da14b0e 100644
--- a/jetty-plus/src/main/java/org/eclipse/jetty/plus/jndi/EnvEntry.java
+++ b/jetty-plus/src/main/java/org/eclipse/jetty/plus/jndi/EnvEntry.java
@@ -24,8 +24,6 @@
 
 /**
  * EnvEntry
- *
- *
  */
 public class EnvEntry extends NamingEntry
 {
diff --git a/jetty-plus/src/main/java/org/eclipse/jetty/plus/jndi/NamingEntry.java b/jetty-plus/src/main/java/org/eclipse/jetty/plus/jndi/NamingEntry.java
index 470520f..34fdfdf 100644
--- a/jetty-plus/src/main/java/org/eclipse/jetty/plus/jndi/NamingEntry.java
+++ b/jetty-plus/src/main/java/org/eclipse/jetty/plus/jndi/NamingEntry.java
@@ -28,15 +28,13 @@
 import org.eclipse.jetty.jndi.NamingUtil;
 import org.eclipse.jetty.util.log.Logger;
 
-
-
 /**
  * NamingEntry
- *
+ * <p>
  * Base class for all jndi related entities. Instances of
  * subclasses of this class are declared in jetty.xml or in a 
  * webapp's WEB-INF/jetty-env.xml file.
- *
+ * <p>
  * NOTE: that all NamingEntries will be bound in a single namespace.
  *  The "global" level is just in the top level context. The "local"
  *  level is a context specific to a webapp.
@@ -73,7 +71,7 @@
      * be linked to the webapp's env-entry, resource-ref etc entries.
      * 
      * @param jndiName the name of the object which will eventually be in java:comp/env
-     * @throws NamingException
+     * @throws NamingException if unable to create naming entry
      */
     protected NamingEntry (String jndiName)
     throws NamingException
@@ -85,14 +83,15 @@
  
     
     /**
-     * Add a java:comp/env binding for the object represented by this NamingEntry,
+     * Add a <code>java:comp/env</code> binding for the object represented by this NamingEntry,
      * but bind it as the name supplied
-     * @throws NamingException
+     * @param localName the local name to bind
+     * @throws NamingException if unable to bind
      */
     public void bindToENC(String localName)
     throws NamingException
     {
-        //TODO - check on the whole overriding/non-overriding thing
+        // TODO - check on the whole overriding/non-overriding thing
         InitialContext ic = new InitialContext();
         Context env = (Context)ic.lookup("java:comp/env");
         __log.debug("Binding java:comp/env/"+localName+" to "+_objectNameString);
@@ -160,22 +159,24 @@
     
     /**
      * Save the NamingEntry for later use.
-     * 
+     * <p>
      * Saving is done by binding the NamingEntry
      * itself, and the value it represents into
      * JNDI. In this way, we can link to the
      * value it represents later, but also
      * still retrieve the NamingEntry itself too.
-     * 
+     * <p>
      * The object is bound at the jndiName passed in.
      * This NamingEntry is bound at __/jndiName.
-     * 
+     * <p>
      * eg
-     * 
+     * <pre>
      * jdbc/foo    : DataSource
      * __/jdbc/foo : NamingEntry
+     * </pre>
      * 
-     * @throws NamingException
+     * @param object the object to save 
+     * @throws NamingException if unable to save
      */
     protected void save (Object object)
     throws NamingException
diff --git a/jetty-plus/src/main/java/org/eclipse/jetty/plus/jndi/NamingEntryUtil.java b/jetty-plus/src/main/java/org/eclipse/jetty/plus/jndi/NamingEntryUtil.java
index e3a3ae4..865ffd0 100644
--- a/jetty-plus/src/main/java/org/eclipse/jetty/plus/jndi/NamingEntryUtil.java
+++ b/jetty-plus/src/main/java/org/eclipse/jetty/plus/jndi/NamingEntryUtil.java
@@ -48,7 +48,8 @@
      * @param scope the scope of the lookup
      * @param asName the name to bind as
      * @param mappedName the name from the environment to link to asName
-     * @throws NamingException
+     * @return true if bind success, false if not bound
+     * @throws NamingException if unable to bind
      */
     public static boolean bindToENC (Object scope, String asName, String mappedName)
     throws NamingException
@@ -74,10 +75,10 @@
     /**
      * Find a NamingEntry in the given scope.
      *
-     * @param scope
-     * @param jndiName
+     * @param scope the object scope
+     * @param jndiName the jndi name
      * @return the naming entry for the given scope
-     * @throws NamingException
+     * @throws NamingException if unable to lookup naming entry
      */
     public static NamingEntry lookupNamingEntry (Object scope, String jndiName)
     throws NamingException
@@ -112,10 +113,10 @@
      * Get all NameEntries of a certain type in the given naming
      * environment scope (server-wide names or context-specific names)
      *
-     * @param scope
+     * @param scope the object scope
      * @param clazz the type of the entry
      * @return all NameEntries of a certain type in the given naming environment scope (server-wide names or context-specific names)
-     * @throws NamingException
+     * @throws NamingException if unable to lookup the naming entries
      */
     public static List<Object> lookupNamingEntries (Object scope, Class<?> clazz)
     throws NamingException
diff --git a/jetty-plus/src/main/java/org/eclipse/jetty/plus/jndi/Resource.java b/jetty-plus/src/main/java/org/eclipse/jetty/plus/jndi/Resource.java
index 890b883..b37d0c7 100644
--- a/jetty-plus/src/main/java/org/eclipse/jetty/plus/jndi/Resource.java
+++ b/jetty-plus/src/main/java/org/eclipse/jetty/plus/jndi/Resource.java
@@ -18,19 +18,13 @@
 
 package org.eclipse.jetty.plus.jndi;
 
-
 import javax.naming.NamingException;
 
-
-
 /**
  * Resource
- *
- *
  */
 public class Resource extends NamingEntry
 {
-    
     public  Resource (Object scope, String jndiName, Object objToBind)
     throws NamingException
     {
@@ -38,15 +32,10 @@
         save(objToBind);
     }
     
-    /**
-     * @param jndiName
-     * @param objToBind
-     */
     public Resource (String jndiName, Object objToBind)
     throws NamingException
     {
         super(jndiName);
         save(objToBind);
     }
-
 }
diff --git a/jetty-plus/src/main/java/org/eclipse/jetty/plus/security/DataSourceLoginService.java b/jetty-plus/src/main/java/org/eclipse/jetty/plus/security/DataSourceLoginService.java
index 5073b52..141597d 100644
--- a/jetty-plus/src/main/java/org/eclipse/jetty/plus/security/DataSourceLoginService.java
+++ b/jetty-plus/src/main/java/org/eclipse/jetty/plus/security/DataSourceLoginService.java
@@ -32,6 +32,7 @@
 import javax.naming.InitialContext;
 import javax.naming.NameNotFoundException;
 import javax.naming.NamingException;
+import javax.servlet.ServletRequest;
 import javax.sql.DataSource;
 
 import org.eclipse.jetty.plus.jndi.NamingEntryUtil;
@@ -45,9 +46,8 @@
 
 
 /**
- *
  * DataSourceUserRealm
- *
+ * <p>
  * Obtain user/password/role information from a database
  * via jndi DataSource.
  */
@@ -288,7 +288,7 @@
     /* ------------------------------------------------------------ */
     /** Load user's info from database.
      *
-     * @param userName
+     * @param userName the user name
      */
     @Override
     protected UserIdentity loadUser (String userName)
@@ -337,7 +337,7 @@
     
     /* ------------------------------------------------------------ */
     @Override
-    public UserIdentity login(String username, Object credentials)
+    public UserIdentity login(String username, Object credentials, ServletRequest request)
     {
         long now = System.currentTimeMillis();
         if (now - _lastPurge > _cacheMs || _cacheMs == 0)
@@ -346,7 +346,7 @@
             _lastPurge = now;
         }
  
-        return super.login(username,credentials);
+        return super.login(username,credentials, request);
     }
 
     /* ------------------------------------------------------------ */
@@ -355,7 +355,8 @@
      * necessary sql query strings based on the configured table
      * and column names.
      *
-     * @throws NamingException
+     * @throws NamingException if unable to init jndi
+     * @throws SQLException if unable to init database
      */
     public void initDb() throws NamingException, SQLException
     {
@@ -366,9 +367,9 @@
         InitialContext ic = new InitialContext();
         assert ic!=null;
 
-        //TODO Should we try webapp scope too?
+        // TODO Should we try webapp scope too?
 
-        //try finding the datasource in the Server scope
+        // try finding the datasource in the Server scope
         if (_server != null)
         {
             try
diff --git a/jetty-plus/src/main/java/org/eclipse/jetty/plus/webapp/EnvConfiguration.java b/jetty-plus/src/main/java/org/eclipse/jetty/plus/webapp/EnvConfiguration.java
index 8983111..2f26edf 100644
--- a/jetty-plus/src/main/java/org/eclipse/jetty/plus/webapp/EnvConfiguration.java
+++ b/jetty-plus/src/main/java/org/eclipse/jetty/plus/webapp/EnvConfiguration.java
@@ -40,14 +40,13 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.webapp.AbstractConfiguration;
+import org.eclipse.jetty.webapp.Configuration;
 import org.eclipse.jetty.webapp.WebAppContext;
 import org.eclipse.jetty.xml.XmlConfiguration;
 
 
 /**
  * EnvConfiguration
- *
- *
  */
 public class EnvConfiguration extends AbstractConfiguration
 {
@@ -61,10 +60,6 @@
         this.jettyEnvXmlUrl = url;
     }
 
-    /**
-     * @see Configuration#configure(WebAppContext)
-     * @throws Exception
-     */
     @Override
     public void preConfigure (WebAppContext context) throws Exception
     {
@@ -72,9 +67,6 @@
         createEnvContext(context);
     }
 
-    /**
-     * @throws Exception
-     */
     @Override
     public void configure (WebAppContext context) throws Exception
     {
@@ -138,8 +130,7 @@
 
     /**
      * Remove jndi setup from start
-     * @see Configuration#deconfigure(WebAppContext)
-     * @throws Exception
+     * @throws Exception if unable to deconfigure
      */
     @Override
     public void deconfigure (WebAppContext context) throws Exception
@@ -179,8 +170,7 @@
 
     /**
      * Remove all jndi setup
-     * @see Configuration#deconfigure(WebAppContext)
-     * @throws Exception
+     * @throws Exception if unable to destroy
      */
     @Override
     public void destroy (WebAppContext context) throws Exception
@@ -207,7 +197,8 @@
      * web.xml file can potentially override them.
      *
      * We first bind EnvEntries declared in Server scope, then WebAppContext scope.
-     * @throws NamingException
+     * @param context the context to use for the object scope
+     * @throws NamingException if unable to bind env entries
      */
     public void bindEnvEntries (WebAppContext context)
     throws NamingException
diff --git a/jetty-plus/src/main/java/org/eclipse/jetty/plus/webapp/PlusConfiguration.java b/jetty-plus/src/main/java/org/eclipse/jetty/plus/webapp/PlusConfiguration.java
index bac0d91..993f658 100644
--- a/jetty-plus/src/main/java/org/eclipse/jetty/plus/webapp/PlusConfiguration.java
+++ b/jetty-plus/src/main/java/org/eclipse/jetty/plus/webapp/PlusConfiguration.java
@@ -48,13 +48,13 @@
     public void preConfigure (WebAppContext context)
     throws Exception
     {
-        context.addDecorator(new PlusDecorator(context));
+        context.getObjectFactory().addDecorator(new PlusDecorator(context));
     }
 
     @Override
     public void cloneConfigure(WebAppContext template, WebAppContext context) throws Exception
     {
-        context.addDecorator(new PlusDecorator(context));
+        context.getObjectFactory().addDecorator(new PlusDecorator(context));
     }
 
     @Override
diff --git a/jetty-plus/src/main/java/org/eclipse/jetty/plus/webapp/PlusDecorator.java b/jetty-plus/src/main/java/org/eclipse/jetty/plus/webapp/PlusDecorator.java
index a29bea4..ee7a92a 100644
--- a/jetty-plus/src/main/java/org/eclipse/jetty/plus/webapp/PlusDecorator.java
+++ b/jetty-plus/src/main/java/org/eclipse/jetty/plus/webapp/PlusDecorator.java
@@ -21,7 +21,7 @@
 import org.eclipse.jetty.plus.annotation.InjectionCollection;
 import org.eclipse.jetty.plus.annotation.LifeCycleCallbackCollection;
 import org.eclipse.jetty.plus.annotation.RunAsCollection;
-import org.eclipse.jetty.servlet.ServletContextHandler.Decorator;
+import org.eclipse.jetty.util.Decorator;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.webapp.WebAppContext;
diff --git a/jetty-plus/src/main/java/org/eclipse/jetty/plus/webapp/PlusDescriptorProcessor.java b/jetty-plus/src/main/java/org/eclipse/jetty/plus/webapp/PlusDescriptorProcessor.java
index 7ca6b03..eaa3a8d 100644
--- a/jetty-plus/src/main/java/org/eclipse/jetty/plus/webapp/PlusDescriptorProcessor.java
+++ b/jetty-plus/src/main/java/org/eclipse/jetty/plus/webapp/PlusDescriptorProcessor.java
@@ -48,10 +48,7 @@
 
 /**
  * PlusDescriptorProcessor
- *
- *
  */
-
 public class PlusDescriptorProcessor extends IterativeDescriptorProcessor
 {
     private static final Logger LOG = Log.getLogger(PlusDescriptorProcessor.class);
@@ -109,14 +106,13 @@
     {
     }
 
-
-
-
     /**
      * JavaEE 5.4.1.3
-     *
-     * @param node
-     * @throws Exception
+     * 
+     * @param context the context 
+     * @param descriptor the descriptor 
+     * @param node the xml node
+     * @throws Exception if unable to process jndi bindings
      */
     public void visitEnvEntry (WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     throws Exception
@@ -188,18 +184,20 @@
 
     /**
      * Common Annotations Spec section 2.3:
+     * <p>
      *  resource-ref is for:
-     *    - javax.sql.DataSource
-     *    - javax.jms.ConnectionFactory
-     *    - javax.jms.QueueConnectionFactory
-     *    - javax.jms.TopicConnectionFactory
-     *    - javax.mail.Session
-     *    - java.net.URL
-     *    - javax.resource.cci.ConnectionFactory
-     *    - org.omg.CORBA_2_3.ORB
-     *    - any other connection factory defined by a resource adapter
+     * <ul>
+     * <li>javax.sql.DataSource</li>
+     * <li>javax.jms.ConnectionFactory</li>
+     * <li>javax.jms.QueueConnectionFactory</li>
+     * <li>javax.jms.TopicConnectionFactory</li>
+     * <li>javax.mail.Session</li>
+     * <li>java.net.URL</li>
+     * <li>javax.resource.cci.ConnectionFactory</li>
+     * <li>org.omg.CORBA_2_3.ORB</li>
+     * <li>any other connection factory defined by a resource adapter</li>
+     * </ul>
      *
-     * TODO
      * If web.xml contains a resource-ref with injection targets, all resource-ref entries
      * of the same name are ignored in web fragments. If web.xml does not contain any
      * injection-targets, then they are merged from all the fragments.
@@ -211,8 +209,10 @@
      * a real resource in the environment. At the moment, we insist that the
      * jetty.xml file name of the resource has to be exactly the same as the
      * name in web.xml deployment descriptor, but it shouldn't have to be
-     *
+     * 
+     * <p>
      * Maintenance update 3.0a to spec:
+     * <p>
      *   Update Section 8.2.3.h.ii with the following -  If a resource reference
      *   element is specified in two fragments, while absent from the main web.xml,
      *   and all the attributes and child elements of the resource reference element
@@ -220,13 +220,15 @@
      *   It is considered an error if a resource reference element has the same name
      *   specified in two fragments, while absent from the main web.xml and the attributes
      *   and child elements are not identical in the two fragments. For example, if two
-     *   web fragments declare a <resource-ref> with the same <resource-ref-name> element
+     *   web fragments declare a <code>&lt;resource-ref&gt;</code> with the same <code>&lt;resource-ref-name&gt;</code> element
      *   but the type in one is specified as javax.sql.DataSource while the type in the
      *   other is that of a java mail resource, then an error must be reported and the
      *   application MUST fail to deploy.
-     *
-     * @param node
-     * @throws Exception
+     *   
+     * @param context the context  
+     * @param descriptor the descriptor
+     * @param node the xml node
+     * @throws Exception if unable to bind nodes, or load classes
      */
     public void visitResourceRef (WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     throws Exception
@@ -338,13 +340,18 @@
 
     /**
      * Common Annotations Spec section 2.3:
-     *   resource-env-ref is for:
-     *     - javax.transaction.UserTransaction
-     *     - javax.resource.cci.InteractionSpec
-     *     - anything else that is not a connection factory
-     *
-     * @param node
-     * @throws Exception
+     * <p>
+     * resource-env-ref is for:
+     * <ul>
+     * <li>javax.transaction.UserTransaction</li>
+     * <li>javax.resource.cci.InteractionSpec</li>
+     * <li>anything else that is not a connection factory</li>
+     * </ul>
+     * 
+     * @param context the context 
+     * @param descriptor the descriptor 
+     * @param node the xml node
+     * @throws Exception if unable to load classes, or bind jndi entries
      */
     public void visitResourceEnvRef (WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     throws Exception
@@ -438,11 +445,17 @@
 
     /**
      * Common Annotations Spec section 2.3:
-     *   message-destination-ref is for:
-     *     - javax.jms.Queue
-     *     - javax.jms.Topic
-     * @param node
-     * @throws Exception
+     * <p>
+     * message-destination-ref is for:
+     * <ul>
+     * <li>javax.jms.Queue</li>
+     * <li>javax.jms.Topic</li>
+     * </ul>
+     *     
+     * @param context the context 
+     * @param descriptor the descriptor 
+     * @param node the xml node
+     * @throws Exception if unable to load classes or bind jndi entries
      */
     public void visitMessageDestinationRef (WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     throws Exception
@@ -536,7 +549,10 @@
      * are ignored. Otherwise, post-constructs from fragments are merged.
      * post-construct is the name of a class and method to call after all
      * resources have been setup but before the class is put into use
-     * @param node
+     * 
+     * @param context the context 
+     * @param descriptor the descriptor 
+     * @param node the xml node
      */
     public void visitPostConstruct(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
@@ -624,7 +640,10 @@
      *
      * pre-destroy is the name of a class and method to call just as
      * the instance is being destroyed
-     * @param node
+     * 
+     * @param context the context 
+     * @param descriptor the descriptor 
+     * @param node the xml node
      */
     public void visitPreDestroy(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
@@ -705,12 +724,13 @@
 
 
     /**
-     * Iterate over the &lt;injection-target&gt; entries for a node
-     *
-     * @param descriptor
-     * @param node
-     * @param jndiName
-     * @param valueClass
+     * Iterate over the <code>&lt;injection-target&gt;</code> entries for a node
+     * 
+     * @param context the context 
+     * @param descriptor the descriptor 
+     * @param node the xml node
+     * @param jndiName the jndi name
+     * @param valueClass the value class
      */
     public void addInjections (WebAppContext context, Descriptor descriptor, XmlParser.Node node, String jndiName, Class<?> valueClass)
     {
@@ -763,9 +783,9 @@
 
 
     /**
-     * @param name
-     * @param value
-     * @throws Exception
+     * @param name the jndi name
+     * @param value the value
+     * @throws Exception if unable to bind entry
      */
     public void bindEnvEntry(String name, Object value) throws Exception
     {
@@ -799,12 +819,14 @@
 
     /**
      * Bind a resource reference.
-     *
+     * <p>
      * If a resource reference with the same name is in a jetty-env.xml
      * file, it will already have been bound.
-     *
-     * @param name
-     * @throws Exception
+     * 
+     * @param context the context 
+     * @param name the jndi name
+     * @param typeClass the type class
+     * @throws Exception if unable to bind resource
      */
     public void bindResourceRef(WebAppContext context, String name, Class<?> typeClass)
     throws Exception
@@ -812,10 +834,6 @@
         bindEntry(context, name, typeClass);
     }
 
-    /**
-     * @param name
-     * @throws Exception
-     */
     public void bindResourceEnvRef(WebAppContext context, String name, Class<?> typeClass)
     throws Exception
     {
@@ -834,16 +852,17 @@
      * Bind a resource with the given name from web.xml of the given type
      * with a jndi resource from either the server or the webapp's naming
      * environment.
-     *
+     * <p>
      * As the servlet spec does not cover the mapping of names in web.xml with
      * names from the execution environment, jetty uses the concept of a Link, which is
      * a subclass of the NamingEntry class. A Link defines a mapping of a name
      * from web.xml with a name from the execution environment (ie either the server or the
      * webapp's naming environment).
-     *
+     * 
+     * @param context the context
      * @param name name of the resource from web.xml
-     * @param typeClass
-     * @throws Exception
+     * @param typeClass the type class
+     * @throws Exception the exception
      */
     protected void bindEntry (WebAppContext context, String name, Class<?> typeClass)
     throws Exception
diff --git a/jetty-plus/src/test/java/org/eclipse/jetty/plus/jndi/TestNamingEntries.java b/jetty-plus/src/test/java/org/eclipse/jetty/plus/jndi/TestNamingEntries.java
index cdacea1..e960661 100644
--- a/jetty-plus/src/test/java/org/eclipse/jetty/plus/jndi/TestNamingEntries.java
+++ b/jetty-plus/src/test/java/org/eclipse/jetty/plus/jndi/TestNamingEntries.java
@@ -44,9 +44,6 @@
 import org.junit.Before;
 import org.junit.Test;
 
-/**
- *
- */
 public class TestNamingEntries
 {
     public class ScopeA
@@ -145,7 +142,7 @@
      * after each test we should scrape out any lingering bindings to prevent cross test pollution
      * as observed when running java 7
      *
-     * @throws Exception
+     * @throws Exception on test failure
      */
     @After
     public void after() throws Exception
diff --git a/jetty-plus/src/test/java/org/eclipse/jetty/plus/webapp/PlusDescriptorProcessorTest.java b/jetty-plus/src/test/java/org/eclipse/jetty/plus/webapp/PlusDescriptorProcessorTest.java
index 90407ce..6d233c4 100644
--- a/jetty-plus/src/test/java/org/eclipse/jetty/plus/webapp/PlusDescriptorProcessorTest.java
+++ b/jetty-plus/src/test/java/org/eclipse/jetty/plus/webapp/PlusDescriptorProcessorTest.java
@@ -19,12 +19,12 @@
 package org.eclipse.jetty.plus.webapp;
 
 
-import java.lang.reflect.InvocationTargetException;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.lang.reflect.InvocationTargetException;
 import java.net.URL;
 
 import javax.naming.Context;
@@ -42,8 +42,6 @@
 
 /**
  * PlusDescriptorProcessorTest
- *
- *
  */
 public class PlusDescriptorProcessorTest
 {
@@ -53,9 +51,7 @@
     protected FragmentDescriptor fragDescriptor3;
     protected FragmentDescriptor fragDescriptor4;
     protected WebAppContext context;
-    /**
-     * @throws java.lang.Exception
-     */
+    
     @Before
     public void setUp() throws Exception
     {
diff --git a/jetty-proxy/pom.xml b/jetty-proxy/pom.xml
index 9f2b952..448a751 100644
--- a/jetty-proxy/pom.xml
+++ b/jetty-proxy/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-proxy</artifactId>
@@ -15,52 +15,6 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-                <Import-Package>javax.servlet.*;version="[2.6.0,3.2)",*</Import-Package>
-              </instructions>
-            </configuration>
-           </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <!--
-        Required for OSGI
-        -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
         <configuration>
diff --git a/jetty-proxy/src/main/config/etc/jetty-proxy.xml b/jetty-proxy/src/main/config/etc/jetty-proxy.xml
index 0e96724..20ef318 100644
--- a/jetty-proxy/src/main/config/etc/jetty-proxy.xml
+++ b/jetty-proxy/src/main/config/etc/jetty-proxy.xml
@@ -1,35 +1,35 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
 
-    <Set name="handler">
-        <New class="org.eclipse.jetty.proxy.ConnectHandler">
-            <Set name="handler">
-                <New class="org.eclipse.jetty.servlet.ServletHandler">
-                    <Call id="proxyHolder" name="addServletWithMapping">
-                        <Arg><Property name="jetty.proxy.servletClass" default="org.eclipse.jetty.proxy.ProxyServlet"/></Arg>
-                        <Arg><Property name="jetty.proxy.servletMapping" default="/*"/></Arg>
-                        <Call name="setInitParameter">
-                            <Arg>maxThreads</Arg>
-                            <Arg><Property name="jetty.proxy.maxThreads" default="128" /></Arg>
-                        </Call>
-                        <Call name="setInitParameter">
-                            <Arg>maxConnections</Arg>
-                            <Arg><Property name="jetty.proxy.maxConnections" default="256" /></Arg>
-                        </Call>
-                        <Call name="setInitParameter">
-                            <Arg>idleTimeout</Arg>
-                            <Arg><Property name="jetty.proxy.idleTimeout" default="30000" /></Arg>
-                        </Call>
-                        <Call name="setInitParameter">
-                            <Arg>timeout</Arg>
-                            <Arg><Property name="jetty.proxy.timeout" default="60000" /></Arg>
-                        </Call>
-                    </Call>
-                </New>
-            </Set>
+  <Set name="handler">
+    <New class="org.eclipse.jetty.proxy.ConnectHandler">
+      <Set name="handler">
+        <New class="org.eclipse.jetty.servlet.ServletHandler">
+          <Call id="proxyHolder" name="addServletWithMapping">
+            <Arg><Property name="jetty.proxy.servletClass" default="org.eclipse.jetty.proxy.ProxyServlet"/></Arg>
+            <Arg><Property name="jetty.proxy.servletMapping" default="/*"/></Arg>
+            <Call name="setInitParameter">
+              <Arg>maxThreads</Arg>
+              <Arg><Property name="jetty.proxy.maxThreads" default="128" /></Arg>
+            </Call>
+            <Call name="setInitParameter">
+              <Arg>maxConnections</Arg>
+              <Arg><Property name="jetty.proxy.maxConnections" default="256" /></Arg>
+            </Call>
+            <Call name="setInitParameter">
+              <Arg>idleTimeout</Arg>
+              <Arg><Property name="jetty.proxy.idleTimeout" default="30000" /></Arg>
+            </Call>
+            <Call name="setInitParameter">
+              <Arg>timeout</Arg>
+              <Arg><Property name="jetty.proxy.timeout" default="60000" /></Arg>
+            </Call>
+          </Call>
         </New>
-    </Set>
+      </Set>
+    </New>
+  </Set>
 
 </Configure>
diff --git a/jetty-proxy/src/main/config/modules/proxy.mod b/jetty-proxy/src/main/config/modules/proxy.mod
index a879ae1..6b91f68 100644
--- a/jetty-proxy/src/main/config/modules/proxy.mod
+++ b/jetty-proxy/src/main/config/modules/proxy.mod
@@ -14,9 +14,9 @@
 
 [ini-template]
 ## Proxy Configuration
-#jetty.proxy.servletClass=org.eclipse.jetty.proxy.ProxyServlet
-#jetty.proxy.servletMapping=/*
-#jetty.proxy.maxThreads=128
-#jetty.proxy.maxConnections=256
-#jetty.proxy.idleTimeout=30000
-#jetty.proxy.timeout=60000
+# jetty.proxy.servletClass=org.eclipse.jetty.proxy.ProxyServlet
+# jetty.proxy.servletMapping=/*
+# jetty.proxy.maxThreads=128
+# jetty.proxy.maxConnections=256
+# jetty.proxy.idleTimeout=30000
+# jetty.proxy.timeout=60000
diff --git a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AbstractProxyServlet.java b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AbstractProxyServlet.java
index 49f4d54..bd2f0cb 100644
--- a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AbstractProxyServlet.java
+++ b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AbstractProxyServlet.java
@@ -215,6 +215,7 @@
      * <p>Creates a {@link HttpClient} instance, configured with init parameters of this servlet.</p>
      * <p>The init parameters used to configure the {@link HttpClient} instance are:</p>
      * <table>
+     * <caption>Init Parameters</caption>
      * <thead>
      * <tr>
      * <th>init-param</th>
diff --git a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncMiddleManServlet.java b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncMiddleManServlet.java
index 143464a..796da80 100644
--- a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncMiddleManServlet.java
+++ b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncMiddleManServlet.java
@@ -207,7 +207,7 @@
     /**
      * <p>Convenience extension of {@link AsyncMiddleManServlet} that offers transparent proxy functionalities.</p>
      *
-     * @see TransparentDelegate
+     * @see org.eclipse.jetty.proxy.AbstractProxyServlet.TransparentDelegate
      */
     public static class Transparent extends ProxyServlet
     {
@@ -258,7 +258,7 @@
         {
             if (!provider.isClosed())
             {
-                process(BufferUtil.EMPTY_BUFFER, new Adapter()
+                process(BufferUtil.EMPTY_BUFFER, new Callback()
                 {
                     @Override
                     public void failed(Throwable x)
@@ -286,14 +286,18 @@
             while (input.isReady() && !input.isFinished())
             {
                 int read = readClientRequestContent(input, buffer);
+
                 if (_log.isDebugEnabled())
                     _log.debug("{} asynchronous read {} bytes on {}", getRequestId(clientRequest), read, input);
 
+                if (read < 0)
+                    return Action.SUCCEEDED;
+
                 if (contentLength > 0 && read > 0)
                     length += read;
 
                 ByteBuffer content = read > 0 ? ByteBuffer.wrap(buffer, 0, read) : BufferUtil.EMPTY_BUFFER;
-                boolean finished = read < 0 || length == contentLength;
+                boolean finished = length == contentLength;
                 process(content, this, finished);
 
                 if (read > 0)
@@ -681,19 +685,19 @@
          * <p>Typical implementations:</p>
          * <pre>
          * // Identity transformation (no transformation, the input is copied to the output)
-         * public void transform(ByteBuffer input, boolean finished, List<ByteBuffer> output)
+         * public void transform(ByteBuffer input, boolean finished, List&lt;ByteBuffer&gt; output)
          * {
          *     output.add(input);
          * }
          *
          * // Discard transformation (all input is discarded)
-         * public void transform(ByteBuffer input, boolean finished, List<ByteBuffer> output)
+         * public void transform(ByteBuffer input, boolean finished, List&lt;ByteBuffer&gt; output)
          * {
          *     // Empty
          * }
          *
          * // Buffering identity transformation (all input is buffered aside until it is finished)
-         * public void transform(ByteBuffer input, boolean finished, List<ByteBuffer> output)
+         * public void transform(ByteBuffer input, boolean finished, List&lt;ByteBuffer&gt; output)
          * {
          *     ByteBuffer copy = ByteBuffer.allocate(input.remaining());
          *     copy.put(input).flip();
diff --git a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncProxyServlet.java b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncProxyServlet.java
index 1ca252c..af79ae5 100644
--- a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncProxyServlet.java
+++ b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncProxyServlet.java
@@ -19,7 +19,6 @@
 package org.eclipse.jetty.proxy;
 
 import java.io.IOException;
-import java.net.URI;
 import java.nio.ByteBuffer;
 import java.nio.channels.WritePendingException;
 
@@ -52,17 +51,17 @@
     private static final String WRITE_LISTENER_ATTRIBUTE = AsyncProxyServlet.class.getName() + ".writeListener";
 
     @Override
-    protected ContentProvider proxyRequestContent(Request proxyRequest, HttpServletRequest request) throws IOException
+    protected ContentProvider proxyRequestContent(HttpServletRequest request, HttpServletResponse response, Request proxyRequest) throws IOException
     {
         ServletInputStream input = request.getInputStream();
         DeferredContentProvider provider = new DeferredContentProvider();
-        input.setReadListener(newReadListener(proxyRequest, request, provider));
+        input.setReadListener(newReadListener(request, response, proxyRequest, provider));
         return provider;
     }
 
-    protected ReadListener newReadListener(Request proxyRequest, HttpServletRequest request, DeferredContentProvider provider)
+    protected ReadListener newReadListener(HttpServletRequest request, HttpServletResponse response, Request proxyRequest, DeferredContentProvider provider)
     {
-        return new StreamReader(proxyRequest, request, provider);
+        return new StreamReader(request, response, proxyRequest, provider);
     }
 
     @Override
@@ -107,7 +106,7 @@
     /**
      * <p>Convenience extension of {@link AsyncProxyServlet} that offers transparent proxy functionalities.</p>
      *
-     * @see TransparentDelegate
+     * @see org.eclipse.jetty.proxy.AbstractProxyServlet.TransparentDelegate
      */
     public static class Transparent extends AsyncProxyServlet
     {
@@ -121,23 +120,25 @@
         }
 
         @Override
-        protected URI rewriteURI(HttpServletRequest request)
+        protected String rewriteTarget(HttpServletRequest clientRequest)
         {
-            return URI.create(delegate.rewriteTarget(request));
+            return delegate.rewriteTarget(clientRequest);
         }
     }
 
     protected class StreamReader extends IteratingCallback implements ReadListener
     {
         private final byte[] buffer = new byte[getHttpClient().getRequestBufferSize()];
-        private final Request proxyRequest;
         private final HttpServletRequest request;
+        private final HttpServletResponse response;
+        private final Request proxyRequest;
         private final DeferredContentProvider provider;
 
-        protected StreamReader(Request proxyRequest, HttpServletRequest request, DeferredContentProvider provider)
+        protected StreamReader(HttpServletRequest request, HttpServletResponse response, Request proxyRequest, DeferredContentProvider provider)
         {
-            this.proxyRequest = proxyRequest;
             this.request = request;
+            this.response = response;
+            this.proxyRequest = proxyRequest;
             this.provider = provider;
         }
 
@@ -158,7 +159,7 @@
         @Override
         public void onError(Throwable t)
         {
-            onClientRequestFailure(proxyRequest, request, t);
+            onClientRequestFailure(request, proxyRequest, response, t);
         }
 
         @Override
@@ -178,7 +179,7 @@
                 {
                     if (_log.isDebugEnabled())
                         _log.debug("{} proxying content to upstream: {} bytes", requestId, read);
-                    onRequestContent(proxyRequest, request, provider, buffer, 0, read, this);
+                    onRequestContent(request, proxyRequest, provider, buffer, 0, read, this);
                     return Action.SCHEDULED;
                 }
             }
@@ -197,7 +198,7 @@
             }
         }
 
-        protected void onRequestContent(Request proxyRequest, HttpServletRequest request, DeferredContentProvider provider, byte[] buffer, int offset, int length, Callback callback)
+        protected void onRequestContent(HttpServletRequest request, Request proxyRequest, DeferredContentProvider provider, byte[] buffer, int offset, int length, Callback callback)
         {
             provider.offer(ByteBuffer.wrap(buffer, offset, length), callback);
         }
diff --git a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/BalancerServlet.java b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/BalancerServlet.java
index eaac8f0..5332a49 100644
--- a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/BalancerServlet.java
+++ b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/BalancerServlet.java
@@ -31,6 +31,7 @@
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 
+import org.eclipse.jetty.client.api.Response;
 import org.eclipse.jetty.util.URIUtil;
 
 public class BalancerServlet extends ProxyServlet
@@ -129,7 +130,7 @@
     }
 
     @Override
-    protected URI rewriteURI(HttpServletRequest request)
+    protected String rewriteTarget(HttpServletRequest request)
     {
         BalancerMember balancerMember = selectBalancerMember(request);
         if (_log.isDebugEnabled())
@@ -138,7 +139,7 @@
         String query = request.getQueryString();
         if (query != null)
             path += "?" + query;
-        return URI.create(balancerMember.getProxyTo() + "/" + path).normalize();
+        return URI.create(balancerMember.getProxyTo() + "/" + path).normalize().toString();
     }
 
     private BalancerMember selectBalancerMember(HttpServletRequest request)
@@ -214,7 +215,7 @@
     }
 
     @Override
-    protected String filterResponseHeader(HttpServletRequest request, String headerName, String headerValue)
+    protected String filterServerResponseHeader(HttpServletRequest request, Response serverResponse, String headerName, String headerValue)
     {
         if (_proxyPassReverse && REVERSE_PROXY_HEADERS.contains(headerName))
         {
diff --git a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ConnectHandler.java b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ConnectHandler.java
index cc2a9f7..71a75bc 100644
--- a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ConnectHandler.java
+++ b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ConnectHandler.java
@@ -40,6 +40,7 @@
 import org.eclipse.jetty.io.ByteBufferPool;
 import org.eclipse.jetty.io.Connection;
 import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.ManagedSelector;
 import org.eclipse.jetty.io.MappedByteBufferPool;
 import org.eclipse.jetty.io.SelectChannelEndPoint;
 import org.eclipse.jetty.io.SelectorManager;
@@ -197,7 +198,7 @@
             catch (Exception x)
             {
                 // TODO
-                LOG.warn("ConnectHandler " + baseRequest.getUri() + " " + x);
+                LOG.warn("ConnectHandler " + baseRequest.getHttpURI() + " " + x);
                 LOG.debug(x);
             }
         }
diff --git a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyConnection.java b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyConnection.java
index 90c5649..da1c4df 100644
--- a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyConnection.java
+++ b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyConnection.java
@@ -121,6 +121,7 @@
             {
                 if (LOG.isDebugEnabled())
                     LOG.debug(ProxyConnection.this + " could not fill", x);
+                bufferPool.release(buffer);
                 disconnect();
                 return Action.SUCCEEDED;
             }
diff --git a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java
index d374c35..51c0951 100644
--- a/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java
+++ b/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java
@@ -20,7 +20,6 @@
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.net.URI;
 import java.nio.ByteBuffer;
 import java.util.concurrent.TimeUnit;
 
@@ -53,7 +52,7 @@
     {
         final int requestId = getRequestId(request);
 
-        URI rewrittenURI = rewriteURI(request);
+        String rewrittenTarget = rewriteTarget(request);
 
         if (_log.isDebugEnabled())
         {
@@ -61,20 +60,20 @@
             if (request.getQueryString() != null)
                 uri.append("?").append(request.getQueryString());
             if (_log.isDebugEnabled())
-                _log.debug("{} rewriting: {} -> {}", requestId, uri, rewrittenURI);
+                _log.debug("{} rewriting: {} -> {}", requestId, uri, rewrittenTarget);
         }
 
-        if (rewrittenURI == null)
+        if (rewrittenTarget == null)
         {
-            onRewriteFailed(request, response);
+            onProxyRewriteFailed(request, response);
             return;
         }
 
-        final Request proxyRequest = getHttpClient().newRequest(rewrittenURI)
+        final Request proxyRequest = getHttpClient().newRequest(rewrittenTarget)
                 .method(request.getMethod())
                 .version(HttpVersion.fromString(request.getProtocol()));
 
-        copyHeaders(request, proxyRequest);
+        copyRequestHeaders(request, proxyRequest);
 
         addProxyHeaders(request, proxyRequest);
 
@@ -84,25 +83,14 @@
         proxyRequest.timeout(getTimeout(), TimeUnit.MILLISECONDS);
 
         if (hasContent(request))
-            proxyRequest.content(proxyRequestContent(proxyRequest, request));
-
-        customizeProxyRequest(proxyRequest, request);
+            proxyRequest.content(proxyRequestContent(request, response, proxyRequest));
 
         sendProxyRequest(request, response, proxyRequest);
     }
 
-    /**
-     * @deprecated use {@link #copyRequestHeaders(HttpServletRequest, Request)} instead
-     */
-    @Deprecated
-    protected void copyHeaders(HttpServletRequest clientRequest, Request proxyRequest)
+    protected ContentProvider proxyRequestContent(HttpServletRequest request, HttpServletResponse response, Request proxyRequest) throws IOException
     {
-        copyRequestHeaders(clientRequest, proxyRequest);
-    }
-
-    protected ContentProvider proxyRequestContent(final Request proxyRequest, final HttpServletRequest request) throws IOException
-    {
-        return new ProxyInputStreamContentProvider(proxyRequest, request, request.getInputStream());
+        return new ProxyInputStreamContentProvider(request, response, proxyRequest, request.getInputStream());
     }
 
     protected Response.Listener newProxyResponseListener(HttpServletRequest request, HttpServletResponse response)
@@ -110,38 +98,6 @@
         return new ProxyResponseListener(request, response);
     }
 
-    protected void onClientRequestFailure(Request proxyRequest, HttpServletRequest request, Throwable failure)
-    {
-        if (_log.isDebugEnabled())
-            _log.debug(getRequestId(request) + " client request failure", failure);
-        proxyRequest.abort(failure);
-    }
-
-    /**
-     * @deprecated use {@link #onProxyRewriteFailed(HttpServletRequest, HttpServletResponse)}
-     */
-    @Deprecated
-    protected void onRewriteFailed(HttpServletRequest request, HttpServletResponse response) throws IOException
-    {
-        onProxyRewriteFailed(request, response);
-    }
-
-    /**
-     * @deprecated use {@link #onServerResponseHeaders(HttpServletRequest, HttpServletResponse, Response)}
-     */
-    @Deprecated
-    protected void onResponseHeaders(HttpServletRequest request, HttpServletResponse response, Response proxyResponse)
-    {
-        onServerResponseHeaders(request, response, proxyResponse);
-    }
-
-    // TODO: remove in Jetty 9.3, only here for backward compatibility.
-    @Override
-    protected String filterServerResponseHeader(HttpServletRequest clientRequest, Response serverResponse, String headerName, String headerValue)
-    {
-        return filterResponseHeader(clientRequest, headerName, headerValue);
-    }
-
     protected void onResponseContent(HttpServletRequest request, HttpServletResponse response, Response proxyResponse, byte[] buffer, int offset, int length, Callback callback)
     {
         try
@@ -158,62 +114,9 @@
     }
 
     /**
-     * @deprecated Use {@link #onProxyResponseSuccess(HttpServletRequest, HttpServletResponse, Response)}
-     */
-    @Deprecated
-    protected void onResponseSuccess(HttpServletRequest request, HttpServletResponse response, Response proxyResponse)
-    {
-        onProxyResponseSuccess(request, response, proxyResponse);
-    }
-
-    /**
-     * @deprecated Use {@link #onProxyResponseFailure(HttpServletRequest, HttpServletResponse, Response, Throwable)}
-     */
-    @Deprecated
-    protected void onResponseFailure(HttpServletRequest request, HttpServletResponse response, Response proxyResponse, Throwable failure)
-    {
-        onProxyResponseFailure(request, response, proxyResponse, failure);
-    }
-
-    /**
-     * @deprecated use {@link #rewriteTarget(HttpServletRequest)}
-     */
-    @Deprecated
-    protected URI rewriteURI(HttpServletRequest request)
-    {
-        String newTarget = rewriteTarget(request);
-        return newTarget == null ? null : URI.create(newTarget);
-    }
-
-    /**
-     * @deprecated use {@link #sendProxyRequest(HttpServletRequest, HttpServletResponse, Request)}
-     */
-    @Deprecated
-    protected void customizeProxyRequest(Request proxyRequest, HttpServletRequest request)
-    {
-    }
-
-    /**
-     * Extension point for remote server response header filtering.
-     * The default implementation returns the header value as is.
-     * If null is returned, this header won't be forwarded back to the client.
-     *
-     * @param headerName the header name
-     * @param headerValue the header value
-     * @param request the request to proxy
-     * @return filteredHeaderValue the new header value
-     * @deprecated use {@link #filterServerResponseHeader(HttpServletRequest, Response, String, String)} instead
-     */
-    @Deprecated
-    protected String filterResponseHeader(HttpServletRequest request, String headerName, String headerValue)
-    {
-        return headerValue;
-    }
-
-    /**
      * <p>Convenience extension of {@link ProxyServlet} that offers transparent proxy functionalities.</p>
      *
-     * @see TransparentDelegate
+     * @see org.eclipse.jetty.proxy.AbstractProxyServlet.TransparentDelegate
      */
     public static class Transparent extends ProxyServlet
     {
@@ -227,9 +130,9 @@
         }
 
         @Override
-        protected URI rewriteURI(HttpServletRequest request)
+        protected String rewriteTarget(HttpServletRequest request)
         {
-            return URI.create(delegate.rewriteTarget(request));
+            return delegate.rewriteTarget(request);
         }
     }
 
@@ -253,7 +156,7 @@
         @Override
         public void onHeaders(Response proxyResponse)
         {
-            onResponseHeaders(request, response, proxyResponse);
+            onServerResponseHeaders(request, response, proxyResponse);
         }
 
         @Override
@@ -295,9 +198,9 @@
         public void onComplete(Result result)
         {
             if (result.isSucceeded())
-                onResponseSuccess(request, response, result.getResponse());
+                onProxyResponseSuccess(request, response, result.getResponse());
             else
-                onResponseFailure(request, response, result.getResponse(), result.getFailure());
+                onProxyResponseFailure(request, response, result.getResponse(), result.getFailure());
             if (_log.isDebugEnabled())
                 _log.debug("{} proxying complete", getRequestId(request));
         }
@@ -305,14 +208,16 @@
 
     protected class ProxyInputStreamContentProvider extends InputStreamContentProvider
     {
+        private final HttpServletResponse response;
         private final Request proxyRequest;
         private final HttpServletRequest request;
 
-        protected ProxyInputStreamContentProvider(Request proxyRequest, HttpServletRequest request, InputStream input)
+        protected ProxyInputStreamContentProvider(HttpServletRequest request, HttpServletResponse response, Request proxyRequest, InputStream input)
         {
             super(input);
-            this.proxyRequest = proxyRequest;
             this.request = request;
+            this.response = response;
+            this.proxyRequest = proxyRequest;
         }
 
         @Override
@@ -326,10 +231,10 @@
         {
             if (_log.isDebugEnabled())
                 _log.debug("{} proxying content to upstream: {} bytes", getRequestId(request), length);
-            return onRequestContent(proxyRequest, request, buffer, offset, length);
+            return onRequestContent(request, proxyRequest, buffer, offset, length);
         }
 
-        protected ByteBuffer onRequestContent(Request proxyRequest, final HttpServletRequest request, byte[] buffer, int offset, int length)
+        protected ByteBuffer onRequestContent(HttpServletRequest request, Request proxyRequest, byte[] buffer, int offset, int length)
         {
             return super.onRead(buffer, offset, length);
         }
@@ -337,7 +242,7 @@
         @Override
         protected void onReadFailure(Throwable failure)
         {
-            onClientRequestFailure(proxyRequest, request, failure);
+            onClientRequestFailure(request, proxyRequest, response, failure);
         }
     }
 }
diff --git a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/AsyncMiddleManServletTest.java b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/AsyncMiddleManServletTest.java
index a100690..86ed003 100644
--- a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/AsyncMiddleManServletTest.java
+++ b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/AsyncMiddleManServletTest.java
@@ -631,6 +631,17 @@
     @Test
     public void testLargeChunkedBufferedDownstreamTransformation() throws Exception
     {
+        testLargeChunkedBufferedDownstreamTransformation(false);
+    }
+
+    @Test
+    public void testLargeChunkedGzippedBufferedDownstreamTransformation() throws Exception
+    {
+        testLargeChunkedBufferedDownstreamTransformation(true);
+    }
+
+    private void testLargeChunkedBufferedDownstreamTransformation(final boolean gzipped) throws Exception
+    {
         // Tests the race between a incomplete write performed from ProxyResponseListener.onSuccess()
         // and ProxyResponseListener.onComplete() being called before the write has completed.
 
@@ -639,10 +650,18 @@
             @Override
             protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
             {
-                ServletOutputStream output = response.getOutputStream();
+                OutputStream output = response.getOutputStream();
+                if (gzipped)
+                {
+                    output = new GZIPOutputStream(output);
+                    response.setHeader(HttpHeader.CONTENT_ENCODING.asString(), "gzip");
+                }
+
+                Random random = new Random();
                 byte[] chunk = new byte[1024 * 1024];
                 for (int i = 0; i < 16; ++i)
                 {
+                    random.nextBytes(chunk);
                     output.write(chunk);
                     output.flush();
                 }
@@ -653,7 +672,10 @@
             @Override
             protected ContentTransformer newServerResponseContentTransformer(HttpServletRequest clientRequest, HttpServletResponse proxyResponse, Response serverResponse)
             {
-                return new BufferingContentTransformer();
+                ContentTransformer transformer = new BufferingContentTransformer();
+                if (gzipped)
+                    transformer = new GZIPContentTransformer(transformer);
+                return transformer;
             }
         });
         startClient();
@@ -1097,7 +1119,6 @@
         // Send only part of the content; the proxy will idle timeout.
         final byte[] data = new byte[]{'c', 'a', 'f', 'e'};
         ContentResponse response = client.newRequest("localhost", serverConnector.getLocalPort())
-                .header(HttpHeader.CONNECTION, HttpHeaderValue.CLOSE.asString())
                 .content(new BytesContentProvider(data)
                 {
                     @Override
diff --git a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/AsyncProxyServletLoadTest.java b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/AsyncProxyServletLoadTest.java
index 418cb6c..5933264 100644
--- a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/AsyncProxyServletLoadTest.java
+++ b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/AsyncProxyServletLoadTest.java
@@ -24,6 +24,7 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
+
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
diff --git a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/EchoHttpServlet.java b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/EchoHttpServlet.java
index e7c19ff..92f6b20 100644
--- a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/EchoHttpServlet.java
+++ b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/EchoHttpServlet.java
@@ -19,6 +19,7 @@
 package org.eclipse.jetty.proxy;
 
 import java.io.IOException;
+
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
diff --git a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/EmptyHttpServlet.java b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/EmptyHttpServlet.java
index e3abbaa..8130adf 100644
--- a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/EmptyHttpServlet.java
+++ b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/EmptyHttpServlet.java
@@ -19,6 +19,7 @@
 package org.eclipse.jetty.proxy;
 
 import java.io.IOException;
+
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
diff --git a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyServletFailureTest.java b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyServletFailureTest.java
index 15c4e79..2af9667 100644
--- a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyServletFailureTest.java
+++ b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyServletFailureTest.java
@@ -262,7 +262,7 @@
             proxyServlet = new AsyncProxyServlet()
             {
                 @Override
-                protected ContentProvider proxyRequestContent(Request proxyRequest, HttpServletRequest request) throws IOException
+                protected ContentProvider proxyRequestContent(HttpServletRequest request, HttpServletResponse response, Request proxyRequest) throws IOException
                 {
                     return new DeferredContentProvider()
                     {
@@ -281,7 +281,7 @@
             proxyServlet = new ProxyServlet()
             {
                 @Override
-                protected ContentProvider proxyRequestContent(Request proxyRequest, HttpServletRequest request) throws IOException
+                protected ContentProvider proxyRequestContent(HttpServletRequest request, HttpServletResponse response, Request proxyRequest) throws IOException
                 {
                     return new BytesContentProvider(content)
                     {
@@ -411,9 +411,4 @@
             ((StdErrLog)Log.getLogger(ServletHandler.class)).setHideStacks(false);
         }
     }
-
-    private interface Function<T, R>
-    {
-        public R apply(T arg);
-    }
 }
diff --git a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyServletTest.java b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyServletTest.java
index f4f36d6..1f96b48 100644
--- a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyServletTest.java
+++ b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyServletTest.java
@@ -141,7 +141,7 @@
 
     private void startProxy() throws Exception
     {
-        startProxy(new HashMap<String, String>());
+        startProxy(new HashMap<>());
     }
 
     private void startProxy(Map<String, String> initParams) throws Exception
@@ -672,7 +672,7 @@
         testTransparentProxyWithQuery("", "/proxy", "");
     }
 
-    private void testTransparentProxyWithQuery(final String proxyToContext, String prefix, final String target) throws Exception
+    private void testTransparentProxyWithQuery(String proxyToContext, String prefix, String target) throws Exception
     {
         final String query = "a=1&b=2";
         startServer(new HttpServlet()
diff --git a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyTunnellingTest.java b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyTunnellingTest.java
index a747a0a..e563962 100644
--- a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyTunnellingTest.java
+++ b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyTunnellingTest.java
@@ -26,6 +26,7 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
+
 import javax.servlet.ServletException;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
@@ -278,6 +279,59 @@
     }
 
     @Test
+    public void testShortIdleTimeoutOverriddenByRequest() throws Exception
+    {
+        // Short idle timeout for HttpClient.
+        long idleTimeout = 500;
+
+        startSSLServer(new ServerHandler());
+        startProxy(new ConnectHandler()
+        {
+            @Override
+            protected void handleConnect(Request baseRequest, HttpServletRequest request, HttpServletResponse response, String serverAddress)
+            {
+                try
+                {
+                    // Make sure the proxy remains idle enough.
+                    Thread.sleep(2 * idleTimeout);
+                    super.handleConnect(baseRequest, request, response, serverAddress);
+                }
+                catch (InterruptedException x)
+                {
+                    onConnectFailure(request, response, null, x);
+                }
+            }
+        });
+
+        HttpClient httpClient = new HttpClient(sslContextFactory);
+        httpClient.getProxyConfiguration().getProxies().add(new HttpProxy("localhost", proxyPort()));
+        // Short idle timeout for HttpClient.
+        httpClient.setIdleTimeout(idleTimeout);
+        httpClient.start();
+
+        try
+        {
+            String host = "localhost";
+            String body = "BODY";
+            ContentResponse response = httpClient.newRequest(host, serverConnector.getLocalPort())
+                    .scheme(HttpScheme.HTTPS.asString())
+                    .method(HttpMethod.GET)
+                    .path("/echo?body=" + URLEncoder.encode(body, "UTF-8"))
+                    // Long idle timeout for the request.
+                    .idleTimeout(10 * idleTimeout, TimeUnit.MILLISECONDS)
+                    .send();
+
+            assertEquals(HttpStatus.OK_200, response.getStatus());
+            String content = response.getContentAsString();
+            assertEquals(body, content);
+        }
+        finally
+        {
+            httpClient.stop();
+        }
+    }
+
+    @Test
     public void testProxyDown() throws Exception
     {
         startSSLServer(new ServerHandler());
diff --git a/jetty-quickstart/pom.xml b/jetty-quickstart/pom.xml
index 28b8177..2a8f7c7 100644
--- a/jetty-quickstart/pom.xml
+++ b/jetty-quickstart/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.eclipse.jetty</groupId>
@@ -10,6 +10,9 @@
   <name>Jetty :: Quick Start</name>
   <description>Jetty Quick Start</description>
   <url>http://www.eclipse.org/jetty</url>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.quickstart</bundle-symbolic-name>
+  </properties>
   <dependencies>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
@@ -82,23 +85,6 @@
   </dependencies>
   <build>
     <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
     </plugins>
   </build>
 </project>
diff --git a/jetty-quickstart/src/main/config/etc/example-quickstart.xml b/jetty-quickstart/src/main/config/etc/example-quickstart.xml
index 3f02e60..ddeedf9 100644
--- a/jetty-quickstart/src/main/config/etc/example-quickstart.xml
+++ b/jetty-quickstart/src/main/config/etc/example-quickstart.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"  encoding="ISO-8859-1"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- An example context XML for a quickstart webapp
 A quick started webapp has all the jar scanning and fragment resolution done in a 
diff --git a/jetty-quickstart/src/main/config/modules/quickstart.mod b/jetty-quickstart/src/main/config/modules/quickstart.mod
index 89db9fd..4e59dd0 100644
--- a/jetty-quickstart/src/main/config/modules/quickstart.mod
+++ b/jetty-quickstart/src/main/config/modules/quickstart.mod
@@ -7,6 +7,5 @@
 plus
 annotations
 
-
 [lib]
 lib/jetty-quickstart-${jetty.version}.jar
diff --git a/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/PreconfigureQuickStartWar.java b/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/PreconfigureQuickStartWar.java
index 134f423..f47e029 100644
--- a/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/PreconfigureQuickStartWar.java
+++ b/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/PreconfigureQuickStartWar.java
@@ -30,7 +30,6 @@
     private static final Logger LOG = Log.getLogger(PreconfigureQuickStartWar.class);
     static final boolean ORIGIN=LOG.isDebugEnabled();
     
-
     public static void main(String... args) throws Exception
     {
         Resource war = null;
@@ -45,6 +44,7 @@
 
             case 1:
                 dir = Resource.newResource(args[0]);
+                break;
 
             case 2:
                 war = Resource.newResource(args[0]);
@@ -80,7 +80,7 @@
      * @param war The war (or directory) to preconfigure
      * @param dir The directory to expand the war into (or null if war is a directory)
      * @param xml A context XML to apply (or null if none)
-     * @throws Exception
+     * @throws Exception if unable to pre configure
      */
     public static void preconfigure(Resource war, Resource dir, Resource xml) throws Exception 
     {
diff --git a/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/QuickStartConfiguration.java b/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/QuickStartConfiguration.java
index 9643db5..c82ce14 100644
--- a/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/QuickStartConfiguration.java
+++ b/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/QuickStartConfiguration.java
@@ -31,10 +31,9 @@
 
 /**
  * QuickStartConfiguration
- * 
+ * <p> 
  * Re-inflate a deployable webapp from a saved effective-web.xml
  * which combines all pre-parsed web xml descriptors and annotations.
- * 
  */
 public class QuickStartConfiguration extends WebInfConfiguration
 {
@@ -57,7 +56,7 @@
         Resource webApp = context.newResource(war);
 
         // Accept aliases for WAR files
-        if (webApp.getAlias() != null)
+        if (webApp.isAlias())
         {
             LOG.debug(webApp + " anti-aliased to " + webApp.getAlias());
             webApp = context.newResource(webApp.getAlias());
@@ -83,9 +82,9 @@
     /**
      * Get the quickstart-web.xml file as a Resource.
      * 
-     * @param context
-     * @return
-     * @throws Exception
+     * @param context the web app context
+     * @return the Resource for the quickstart-web.xml
+     * @throws Exception if unable to find the quickstart xml
      */
     public Resource getQuickStartWebXml (WebAppContext context) throws Exception
     {
@@ -138,7 +137,7 @@
         context.getMetaData().addDescriptorProcessor(new QuickStartDescriptorProcessor());
         
         //add a decorator that will find introspectable annotations
-        context.addDecorator(new AnnotationDecorator(context)); //this must be the last Decorator because they are run in reverse order!
+        context.getObjectFactory().addDecorator(new AnnotationDecorator(context)); //this must be the last Decorator because they are run in reverse order!
         
         //add a context bean that will run ServletContainerInitializers as the context starts
         ServletContainerInitializersStarter starter = (ServletContainerInitializersStarter)context.getAttribute(AnnotationConfiguration.CONTAINER_INITIALIZER_STARTER);
diff --git a/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/QuickStartDescriptorGenerator.java b/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/QuickStartDescriptorGenerator.java
index ce2f97a..9df1c37 100644
--- a/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/QuickStartDescriptorGenerator.java
+++ b/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/QuickStartDescriptorGenerator.java
@@ -48,10 +48,10 @@
 import org.eclipse.jetty.servlet.ErrorPageErrorHandler;
 import org.eclipse.jetty.servlet.FilterHolder;
 import org.eclipse.jetty.servlet.FilterMapping;
+import org.eclipse.jetty.servlet.ServletContextHandler.JspConfig;
 import org.eclipse.jetty.servlet.ServletHandler;
 import org.eclipse.jetty.servlet.ServletHolder;
 import org.eclipse.jetty.servlet.ServletMapping;
-import org.eclipse.jetty.servlet.ServletContextHandler.JspConfig;
 import org.eclipse.jetty.util.QuotedStringTokenizer;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
@@ -62,11 +62,9 @@
 import org.eclipse.jetty.webapp.WebAppContext;
 import org.eclipse.jetty.xml.XmlAppendable;
 
-
-
 /**
  * QuickStartDescriptorGenerator
- *
+ * <p>
  * Generate an effective web.xml from a WebAppContext, including all components 
  * from web.xml, web-fragment.xmls annotations etc.
  */
@@ -94,9 +92,9 @@
     
     /**
      * Perform the generation of the xml file
-     * @throws IOException 
-     * @throws FileNotFoundException 
-     * @throws Exception
+     * @param stream the stream to generate the quickstart-web.xml to
+     * @throws IOException if unable to generate the quickstart-web.xml
+     * @throws FileNotFoundException if unable to find the file 
      */
     public void generateQuickStartWebXml (OutputStream stream) throws FileNotFoundException, IOException 
     {   
@@ -668,9 +666,9 @@
     /**
      * Find the origin (web.xml, fragment, annotation etc) of a web artifact from MetaData.
      * 
-     * @param md
-     * @param name
-     * @return
+     * @param md the metadata
+     * @param name the name
+     * @return the origin map
      */
     public Map<String, String> origin(MetaData md, String name)
     {
diff --git a/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/QuickStartDescriptorProcessor.java b/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/QuickStartDescriptorProcessor.java
index 43a0c2e..2c56af4 100644
--- a/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/QuickStartDescriptorProcessor.java
+++ b/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/QuickStartDescriptorProcessor.java
@@ -44,9 +44,6 @@
  */
 public class QuickStartDescriptorProcessor extends IterativeDescriptorProcessor
 {
-    /**
-     * 
-     */
     public QuickStartDescriptorProcessor()
     {
         try
@@ -74,13 +71,7 @@
     public void end(WebAppContext context, Descriptor descriptor)
     { 
     }
-    
 
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     */
     public void visitContextParam (WebAppContext context, Descriptor descriptor, XmlParser.Node node)
             throws Exception
     {
diff --git a/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/QuickStartWebApp.java b/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/QuickStartWebApp.java
index 5f60843..f69f73f 100644
--- a/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/QuickStartWebApp.java
+++ b/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/QuickStartWebApp.java
@@ -104,6 +104,17 @@
             super.startWebapp();
     }
     
+    
+    
+    @Override
+    protected void stopWebapp() throws Exception
+    {
+        if (!_startWebapp)
+            return;
+        
+        super.stopWebapp();
+    }
+
     @Override
     protected void doStart() throws Exception
     {
diff --git a/jetty-rewrite/pom.xml b/jetty-rewrite/pom.xml
index 5738a64..90d0815 100644
--- a/jetty-rewrite/pom.xml
+++ b/jetty-rewrite/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-rewrite</artifactId>
@@ -15,52 +15,6 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-                <Import-Package>javax.servlet.*;version="[2.6.0,3.2)",*</Import-Package>
-              </instructions>
-            </configuration>
-           </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <!--
-        Required for OSGI
-        -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
         <configuration>
diff --git a/jetty-rewrite/src/main/config/etc/jetty-rewrite.xml b/jetty-rewrite/src/main/config/etc/jetty-rewrite.xml
index 706a932..65a5dea 100644
--- a/jetty-rewrite/src/main/config/etc/jetty-rewrite.xml
+++ b/jetty-rewrite/src/main/config/etc/jetty-rewrite.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Mixin the RewriteHandler                                        -->
@@ -8,34 +8,40 @@
 
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
 
-    <!-- =========================================================== -->
-    <!-- configure rewrite handler                                   -->
-    <!-- =========================================================== -->
-    <Get id="oldhandler" name="handler"/>
+  <!-- =========================================================== -->
+  <!-- configure rewrite handler                                   -->
+  <!-- =========================================================== -->
+  <Get id="oldhandler" name="handler"/>
 
-    <Set name="handler">
-     <New id="Rewrite" class="org.eclipse.jetty.rewrite.handler.RewriteHandler">
+  <Set name="handler">
+    <New id="Rewrite" class="org.eclipse.jetty.rewrite.handler.RewriteHandler">
       <Set name="handler"><Ref refid="oldhandler"/></Set>
-      <Set name="rewriteRequestURI"><Property name="rewrite.rewriteRequestURI" default="true"/></Set>
-      <Set name="rewritePathInfo"><Property name="rewrite.rewritePathInfo" default="false"/></Set>
-      <Set name="originalPathAttribute"><Property name="rewrite.originalPathAttribute" default="requestedPath"/></Set>
-     </New>
-    </Set>
+      <Set name="rewriteRequestURI"><Property name="jetty.rewrite.rewriteRequestURI" deprecated="rewrite.rewriteRequestURI" default="true"/></Set>
+      <Set name="rewritePathInfo"><Property name="jetty.rewrite.rewritePathInfo" deprecated="rewrite.rewritePathInfo" default="false"/></Set>
+      <Set name="originalPathAttribute"><Property name="jetty.rewrite.originalPathAttribute" deprecated="rewrite.originalPathAttribute" default="requestedPath"/></Set>
+   
+      <!-- Set DispatcherTypes  -->
+      <Set name="dispatcherTypes">
+        <Array type="javax.servlet.DispatcherType">
+          <Item><Call class="javax.servlet.DispatcherType" name="valueOf"><Arg>REQUEST</Arg></Call></Item>
+          <Item><Call class="javax.servlet.DispatcherType" name="valueOf"><Arg>ASYNC</Arg></Call></Item>
+        </Array>
+      </Set>
 
-    <!-- example rule -->
-    <!--
-    <Call name="addRule">
-      <Arg>
-	<New class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
-	  <Set name="pattern">/favicon.ico</Set>
-	  <Set name="name">Cache-Control</Set>
-	  <Set name="value">Max-Age=3600,public</Set>
-	  <Set name="terminating">true</Set>
-	</New>
-      </Arg>
-    </Call>
-    -->
+      <!-- example rule -->
+      <!--
+      <Call name="addRule">
+	<Arg>
+	  <New class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
+	    <Set name="pattern">/favicon.ico</Set>
+	    <Set name="name">Cache-Control</Set>
+	    <Set name="value">Max-Age=3600,public</Set>
+	    <Set name="terminating">true</Set>
+	  </New>
+	</Arg>
+      </Call>
+      -->
 
-    <!-- for example rules see jetty-demo.xml -->
-
+    </New>
+  </Set>
 </Configure>
diff --git a/jetty-rewrite/src/main/config/modules/rewrite.mod b/jetty-rewrite/src/main/config/modules/rewrite.mod
index d2e00c8..c8a1750 100644
--- a/jetty-rewrite/src/main/config/modules/rewrite.mod
+++ b/jetty-rewrite/src/main/config/modules/rewrite.mod
@@ -10,3 +10,13 @@
 
 [xml]
 etc/jetty-rewrite.xml
+
+[ini-template]
+## Whether to rewrite the request URI
+# jetty.rewrite.rewriteRequestURI=true
+
+## Whether to rewrite the path info
+# jetty.rewrite.rewritePathInfo=false
+
+## Request attribute key under with the original path is stored
+# jetty.rewrite.originalPathAttribute=requestedPath
diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/CompactPathRule.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/CompactPathRule.java
index 7ac3069..57edfdf 100644
--- a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/CompactPathRule.java
+++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/CompactPathRule.java
@@ -43,7 +43,7 @@
         String uri = request.getRequestURI();
         if (uri.startsWith("/"))
             uri = URIUtil.compactPath(uri);
-        request.setRequestURI(uri);
+        request.setURIPathQuery(uri);
     }
 
     @Override
diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/HeaderPatternRule.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/HeaderPatternRule.java
index d16ec54..c50139b 100644
--- a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/HeaderPatternRule.java
+++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/HeaderPatternRule.java
@@ -116,6 +116,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Returns the add flag value.
+     * @return true if add flag set
      */
     public boolean isAdd()
     {
diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/HeaderRegexRule.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/HeaderRegexRule.java
index 8023070..53764dc 100644
--- a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/HeaderRegexRule.java
+++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/HeaderRegexRule.java
@@ -109,7 +109,7 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * Returns the add flag value.
+     * @return the add flag value.
      */
     public boolean isAdd()
     {
@@ -118,7 +118,7 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * Returns the header contents.
+     * @return the header contents.
      */
     @Override
     public String toString()
diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/LegacyRule.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/LegacyRule.java
deleted file mode 100644
index 48396d4..0000000
--- a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/LegacyRule.java
+++ /dev/null
@@ -1,100 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rewrite.handler;
-
-import java.io.IOException;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.http.PathMap;
-import org.eclipse.jetty.util.URIUtil;
-
-/**
- * Rule implementing the legacy API of RewriteHandler
- * 
- *
- */
-public class LegacyRule extends Rule
-{
-    private PathMap _rewrite = new PathMap(true);
-    
-    public LegacyRule()
-    {
-        _handling = false;
-        _terminating = false;
-    }
-
-    /* ------------------------------------------------------------ */
-    @Override
-    public String matchAndApply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException
-    {
-        Map.Entry<?,?> rewrite =_rewrite.getMatch(target);
-        
-        if (rewrite!=null && rewrite.getValue()!=null)
-        {
-            target=URIUtil.addPaths(rewrite.getValue().toString(),
-                    PathMap.pathInfo(rewrite.getKey().toString(),target));
-
-            return target;
-        }
-        
-        return null;
-    }
-    
-    /* ------------------------------------------------------------ */
-    /**
-     * Returns the map of rewriting rules.
-     * @return A {@link PathMap} of the rewriting rules.
-     */
-    public PathMap getRewrite()
-    {
-        return _rewrite;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Sets the map of rewriting rules.
-     * @param rewrite A {@link PathMap} of the rewriting rules. Only 
-     * prefix paths should be included.
-     */
-    public void setRewrite(PathMap rewrite)
-    {
-        _rewrite=rewrite;
-    }
-    
-    
-    /* ------------------------------------------------------------ */
-    /** Add a path rewriting rule
-     * @param pattern The path pattern to match. The pattern must start with / and may use
-     * a trailing /* as a wildcard.
-     * @param prefix The path prefix which will replace the matching part of the path.
-     */
-    public void addRewriteRule(String pattern, String prefix)
-    {
-        if (pattern==null || pattern.length()==0 || !pattern.startsWith("/"))
-            throw new IllegalArgumentException();
-        if (_rewrite==null)
-            _rewrite=new PathMap(true);
-        _rewrite.put(pattern,prefix);
-    }
-
-
-}
diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RedirectPatternRule.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RedirectPatternRule.java
index de434a0..81da7ed 100644
--- a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RedirectPatternRule.java
+++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RedirectPatternRule.java
@@ -23,21 +23,26 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.eclipse.jetty.http.HttpStatus;
+
 /**
- * Redirects the response whenever the rule finds a match.
+ * Issues a (3xx) Redirect response whenever the rule finds a match.
+ * <p>
+ * All redirects are part of the <a href="http://tools.ietf.org/html/rfc7231#section-6.4"><code>3xx Redirection</code> status code set</a>.
+ * <p>
+ * Defaults to <a href="http://tools.ietf.org/html/rfc7231#section-6.4.3"><code>302 Found</code></a>
  */
 public class RedirectPatternRule extends PatternRule
 {
     private String _location;
-
-    /* ------------------------------------------------------------ */
+    private int _statusCode = HttpStatus.FOUND_302;
+    
     public RedirectPatternRule()
     {
         _handling = true;
         _terminating = true;
     }
 
-    /* ------------------------------------------------------------ */
     /**
      * Sets the redirect location.
      * 
@@ -47,26 +52,46 @@
     {
         _location = value;
     }
-
-    /* ------------------------------------------------------------ */
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jetty.server.server.handler.rules.RuleBase#apply(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+    
+    /**
+     * Sets the redirect status code.
+     * 
+     * @param statusCode the 3xx redirect status code
      */
+    public void setStatusCode(int statusCode)
+    {
+        if ((300 <= statusCode) || (statusCode >= 399))
+        {
+            _statusCode = statusCode;
+        }
+        else
+        {
+            throw new IllegalArgumentException("Invalid redirect status code " + statusCode + " (must be a value between 300 and 399)");
+        }
+    }
+
     @Override
     public String apply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException
     {
-        response.sendRedirect(response.encodeRedirectURL(_location));
+        String location = response.encodeRedirectURL(_location);
+        response.setHeader("Location",RedirectUtil.toRedirectURL(request,location));
+        response.setStatus(_statusCode);
+        response.getOutputStream().flush(); // no output / content
+        response.getOutputStream().close();
         return target;
     }
 
-    /* ------------------------------------------------------------ */
     /**
-     * Returns the redirect location.
+     * Returns the redirect status code and location.
      */
     @Override
     public String toString()
     {
-        return super.toString()+"["+_location+"]";
+        StringBuilder str = new StringBuilder();
+        str.append(super.toString());
+        str.append('[').append(_statusCode);
+        str.append('>').append(_location);
+        str.append(']');
+        return str.toString();
     }
 }
diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RedirectRegexRule.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RedirectRegexRule.java
index b734e7d..436a1aa 100644
--- a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RedirectRegexRule.java
+++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RedirectRegexRule.java
@@ -24,13 +24,21 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.eclipse.jetty.http.HttpStatus;
+
 /**
- * Redirects the response by matching with a regular expression.
+ * Issues a (3xx) Redirect response whenever the rule finds a match via regular expression.
+ * <p>
  * The replacement string may use $n" to replace the nth capture group.
+ * <p>
+ * All redirects are part of the <a href="http://tools.ietf.org/html/rfc7231#section-6.4"><code>3xx Redirection</code> status code set</a>.
+ * <p>
+ * Defaults to <a href="http://tools.ietf.org/html/rfc7231#section-6.4.3"><code>302 Found</code></a>
  */
 public class RedirectRegexRule extends RegexRule
 {
-    private String _replacement;
+    protected String _replacement;
+    private int _statusCode = HttpStatus.FOUND_302;
     
     public RedirectRegexRule()
     {
@@ -48,6 +56,23 @@
         _replacement = replacement;
     }
     
+    /**
+     * Sets the redirect status code.
+     * 
+     * @param statusCode the 3xx redirect status code
+     */
+    public void setStatusCode(int statusCode)
+    {
+        if ((300 <= statusCode) || (statusCode >= 399))
+        {
+            _statusCode = statusCode;
+        }
+        else
+        {
+            throw new IllegalArgumentException("Invalid redirect status code " + statusCode + " (must be a value between 300 and 399)");
+        }
+    }
+    
     @Override
     protected String apply(String target, HttpServletRequest request, HttpServletResponse response, Matcher matcher)
             throws IOException
@@ -58,8 +83,27 @@
             String group = matcher.group(g);
             target=target.replaceAll("\\$"+g,group);
         }
-
-        response.sendRedirect(response.encodeRedirectURL(target));
+        
+        target = response.encodeRedirectURL(target);
+        response.setHeader("Location",RedirectUtil.toRedirectURL(request,target));
+        response.setStatus(_statusCode);
+        response.getOutputStream().flush(); // no output / content
+        response.getOutputStream().close();
         return target;
     }
+    
+    /**
+     * Returns the redirect status code and replacement.
+     */
+    @Override
+    public String toString()
+    {
+        StringBuilder str = new StringBuilder();
+        str.append(super.toString());
+        str.append('[').append(_statusCode);
+        str.append('>').append(_replacement);
+        str.append(']');
+        return str.toString();
+    }
+
 }
diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RedirectUtil.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RedirectUtil.java
new file mode 100644
index 0000000..caabb7e
--- /dev/null
+++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RedirectUtil.java
@@ -0,0 +1,71 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.rewrite.handler;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.eclipse.jetty.util.URIUtil;
+
+/**
+ * Utility for managing redirect based rules
+ */
+public final class RedirectUtil
+{
+    /**
+     * Common point to generate a proper "Location" header for redirects.
+     * 
+     * @param request
+     *            the request the redirect should be based on (needed when relative locations are provided, so that
+     *            server name, scheme, port can be built out properly)
+     * @param location
+     *            the location URL to redirect to (can be a relative path)
+     * @return the full redirect "Location" URL (including scheme, host, port, path, etc...)
+     */
+    public static String toRedirectURL(final HttpServletRequest request, String location)
+    {
+        if (!URIUtil.hasScheme(location))
+        {
+            StringBuilder url = new StringBuilder(128);
+            URIUtil.appendSchemeHostPort(url,request.getScheme(),request.getServerName(),request.getServerPort());
+
+            if (location.startsWith("/"))
+            {
+                // absolute in context
+                location = URIUtil.canonicalPath(location);
+            }
+            else
+            {
+                // relative to request
+                String path = request.getRequestURI();
+                String parent = (path.endsWith("/")) ? path : URIUtil.parentPath(path);
+                location = URIUtil.canonicalPath(URIUtil.addPaths(parent,location));
+                if (!location.startsWith("/"))
+                    url.append('/');
+            }
+
+            if (location == null)
+                throw new IllegalStateException("path cannot be above root");
+            url.append(location);
+
+            location = url.toString();
+        }
+
+        return location;
+    }
+}
diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/ResponsePatternRule.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/ResponsePatternRule.java
index 01d7c7b..825f6f7 100644
--- a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/ResponsePatternRule.java
+++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/ResponsePatternRule.java
@@ -53,7 +53,7 @@
      * Sets the reason for the response status code. Reasons will only reflect
      * if the code value is greater or equal to 400.
      * 
-     * @param reason
+     * @param reason the reason
      */
     public void setReason(String reason)
     {
diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewriteHandler.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewriteHandler.java
index 495aea7..20c1a87 100644
--- a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewriteHandler.java
+++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewriteHandler.java
@@ -54,7 +54,6 @@
  * <li> {@link RewritePatternRule} - rewrites the requested URI. </li>
  * <li> {@link RewriteRegexRule} - rewrites the requested URI using regular expression for pattern matching. </li>
  * <li> {@link MsieSslRule} - disables the keep alive on SSL for IE5 and IE6. </li>
- * <li> {@link LegacyRule} - the old version of rewrite. </li>
  * <li> {@link ForwardedSchemeHeaderRule} - set the scheme according to the headers present. </li>
  * <li> {@link VirtualHostRuleContainer} - checks whether the request matches one of a set of virtual host names.</li>
  * </ul>
@@ -174,7 +173,7 @@
 public class RewriteHandler extends HandlerWrapper
 {
     private RuleContainer _rules;
-    private EnumSet<DispatcherType> _dispatchTypes = EnumSet.of(DispatcherType.REQUEST);
+    private EnumSet<DispatcherType> _dispatchTypes = EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC);
 
     /* ------------------------------------------------------------ */
     public RewriteHandler()
@@ -184,19 +183,6 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * To enable configuration from jetty.xml on rewriteRequestURI, rewritePathInfo and
-     * originalPathAttribute
-     *
-     * @param legacyRule old style rewrite rule
-     */
-    @Deprecated
-    public void setLegacyRule(LegacyRule legacyRule)
-    {
-        _rules.setLegacyRule(legacyRule);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
      * Returns the list of rules.
      * @return an array of {@link Rule}.
      */
diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewritePatternRule.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewritePatternRule.java
index 80d6186..3c86530 100644
--- a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewritePatternRule.java
+++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewritePatternRule.java
@@ -23,7 +23,6 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.eclipse.jetty.http.HttpURI;
 import org.eclipse.jetty.http.PathMap;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.util.URIUtil;
@@ -57,12 +56,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.eclipse.jetty.server.handler.rules.RuleBase#apply(javax.servlet.http.HttpServletRequest,
-     * javax.servlet.http.HttpServletResponse)
-     */
     @Override
     public String apply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException
     {
@@ -74,21 +67,21 @@
     /**
      * This method will add _query to the requests's queryString and also combine it with existing queryStrings in
      * the request. However it won't take care for duplicate. E.g. if request.getQueryString contains a parameter
-     * "param1 = true" and _query will contain "param1=false" the result will be param1=true&param1=false.
+     * <code>param1 = true</code> and _query will contain <code>param1=false</code> the result will be <code>param1=true&amp;param1=false</code>.
      * To cover this use case some more complex pattern matching is necessary. We can implement this if there's use
      * cases.
      *
-     * @param request
-     * @param oldURI
-     * @param newURI
-     * @throws IOException
+     * @param request the request
+     * @param oldURI the old URI
+     * @param newURI the new URI
+     * @throws IOException if unable to apply the URI
      */
     @Override
     public void applyURI(Request request, String oldURI, String newURI) throws IOException
     {
         if (_query == null)
         {
-            request.setRequestURI(newURI);
+            request.setURIPathQuery(newURI);
         }
         else
         {
@@ -97,9 +90,7 @@
                 queryString = queryString + "&" + _query;
             else
                 queryString = _query;
-            HttpURI uri = new HttpURI(newURI + "?" + queryString);
-            request.setUri(uri);
-            request.setRequestURI(newURI);
+            request.setURIPathQuery(newURI);
             request.setQueryString(queryString);
         }
     }
diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewriteRegexRule.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewriteRegexRule.java
index 30296bd..b582dc9 100644
--- a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewriteRegexRule.java
+++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewriteRegexRule.java
@@ -24,7 +24,6 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.eclipse.jetty.http.HttpURI;
 import org.eclipse.jetty.server.Request;
 
 /**
@@ -100,7 +99,7 @@
     {
         if (_query==null)
         {
-            request.setRequestURI(newURI);
+            request.setURIPathQuery(newURI);
         }
         else
         {
@@ -108,9 +107,7 @@
             
             if (!_queryGroup && request.getQueryString()!=null)
                 query=request.getQueryString()+"&"+query;
-            HttpURI uri=new HttpURI(newURI+"?"+query);
-            request.setUri(uri);
-            request.setRequestURI(newURI);
+            request.setURIPathQuery(newURI);
             request.setQueryString(query);
         }
     }
diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/Rule.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/Rule.java
index d3e5ffc..7bd5c63 100644
--- a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/Rule.java
+++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/Rule.java
@@ -44,20 +44,18 @@
     /**
      * This method calls tests the rule against the request/response pair and if the Rule 
      * applies, then the rule's action is triggered.
-     * @param target The target of the request
-     * @param request
-     * @param response
      * 
+     * @param target The target of the request
+     * @param request the request
+     * @param response the response
      * @return The new target if the rule has matched, else null
-     * @throws IOException
+     * @throws IOException if unable to match the rule
      */
     public abstract String matchAndApply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException;   
     
     /**
      * Sets terminating to true or false.
-     * If true, this rule will terminate the loop if this rule has been applied.
-     * 
-     * @param terminating
+     * @param terminating If true, this rule will terminate the loop if this rule has been applied.
      */    
     public void setTerminating(boolean terminating)
     {
diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RuleContainer.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RuleContainer.java
index 677a440..e797496 100644
--- a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RuleContainer.java
+++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RuleContainer.java
@@ -23,7 +23,6 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.eclipse.jetty.server.HttpChannel;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.util.ArrayUtil;
 import org.eclipse.jetty.util.URIUtil;
@@ -33,10 +32,7 @@
 /**
  * Base container to group rules. Can be extended so that the contained rules
  * will only be applied under certain conditions
- * 
- * 
  */
-
 public class RuleContainer extends Rule
 {
     private static final Logger LOG = Log.getLogger(RuleContainer.class);
@@ -46,35 +42,7 @@
     protected String _originalPathAttribute;
     protected boolean _rewriteRequestURI=true;
     protected boolean _rewritePathInfo=true;
-    
-    protected LegacyRule _legacy;
-
-    /* ------------------------------------------------------------ */
-    @Deprecated
-    public LegacyRule getLegacyRule()
-    {
-        if (_legacy==null)
-        {
-            _legacy= new LegacyRule();
-            addRule(_legacy);
-        }
-        return _legacy;
-    }
-    
-
-    /* ------------------------------------------------------------ */
-    /**
-     * To enable configuration from jetty.xml on rewriteRequestURI, rewritePathInfo and
-     * originalPathAttribute
-     * 
-     * @param legacyRule old style rewrite rule
-     */
-    @Deprecated
-    public void setLegacyRule(LegacyRule legacyRule)
-    {
-        _legacy = legacyRule;
-    }
-
+     
     /* ------------------------------------------------------------ */
     /**
      * Returns the list of rules.
@@ -92,16 +60,7 @@
      */
     public void setRules(Rule[] rules)
     {
-        if (_legacy==null)
-            _rules = rules;
-        else
-        {
-            _rules=null;
-            addRule(_legacy);
-            if (rules!=null)
-                for (Rule rule:rules)
-                    addRule(rule);
-        }
+        _rules = rules;
     }
 
     /* ------------------------------------------------------------ */
@@ -192,6 +151,8 @@
      * @param target target field to pass on to the contained rules
      * @param request request object to pass on to the contained rules
      * @param response response object to pass on to the contained rules
+     * @return the target
+     * @throws IOException if unable to apply the rule
      */
     protected String apply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException
     {
@@ -216,7 +177,7 @@
                     if (rule instanceof Rule.ApplyURI)
                         ((Rule.ApplyURI)rule).applyURI((Request)request,((Request)request).getRequestURI(), encoded);
                     else
-                        ((Request)request).setRequestURI(encoded);
+                        ((Request)request).setURIPathQuery(encoded);
                 }
 
                 if (_rewritePathInfo)
@@ -227,7 +188,7 @@
                 if (rule.isHandling())
                 {
                     LOG.debug("handling {}",rule);
-                    (request instanceof Request?(Request)request:HttpChannel.getCurrentHttpChannel().getRequest()).setHandled(true);
+                    Request.getBaseRequest(request).setHandled(true);
                 }
 
                 if (rule.isTerminating())
diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/TerminatingPatternRule.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/TerminatingPatternRule.java
new file mode 100644
index 0000000..40dacca
--- /dev/null
+++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/TerminatingPatternRule.java
@@ -0,0 +1,51 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.rewrite.handler;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * If this rule matches, terminate the processing of other rules.
+ * Allowing the request to be processed by the handlers after the rewrite rules.
+ */
+public class TerminatingPatternRule extends PatternRule
+{
+    public TerminatingPatternRule()
+    {
+        super.setTerminating(true);
+    }
+
+    @Override
+    public void setTerminating(boolean terminating)
+    {
+        if (!terminating)
+        {
+            throw new RuntimeException("Not allowed to disable terminating on a " + TerminatingPatternRule.class.getName());
+        }
+    }
+
+    @Override
+    protected String apply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException
+    {
+        return target;
+    }
+}
\ No newline at end of file
diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/TerminatingRegexRule.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/TerminatingRegexRule.java
new file mode 100644
index 0000000..fc67c6a
--- /dev/null
+++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/TerminatingRegexRule.java
@@ -0,0 +1,52 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.rewrite.handler;
+
+import java.io.IOException;
+import java.util.regex.Matcher;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * If this rule matches, terminate the processing of other rules.
+ * Allowing the request to be processed by the handlers after the rewrite rules.
+ */
+public class TerminatingRegexRule extends RegexRule
+{
+    public TerminatingRegexRule()
+    {
+        super.setTerminating(true);
+    }
+
+    @Override
+    public void setTerminating(boolean terminating)
+    {
+        if (!terminating)
+        {
+            throw new RuntimeException("Not allowed to disable terminating on a " + TerminatingRegexRule.class.getName());
+        }
+    }
+
+    @Override
+    public String apply(String target, HttpServletRequest request, HttpServletResponse response, Matcher matcher) throws IOException
+    {
+        return target;
+    }
+}
\ No newline at end of file
diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/ValidUrlRule.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/ValidUrlRule.java
index ebe97b5..21e9812 100644
--- a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/ValidUrlRule.java
+++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/ValidUrlRule.java
@@ -29,12 +29,13 @@
 
 /**
  * This rule can be used to protect against invalid unicode characters in a url making it into applications.
- *
+ * <p>
  * The logic is as follows.
- * 
- * - if decoded uri character is an iso control character return code/reason
- * - if no UnicodeBlock is found for character return code/reason
- * - if character is in UnicodeBlock.SPECIALS return code/reason
+ * <ul>
+ * <li>if decoded uri character is an iso control character return code/reason</li>
+ * <li>if no UnicodeBlock is found for character return code/reason</li>
+ * <li>if character is in UnicodeBlock.SPECIALS return code/reason</li>
+ * </ul>
  */
 public class ValidUrlRule extends Rule
 {
@@ -65,7 +66,7 @@
     /**
      * Sets the reason for the response status code. Reasons will only reflect if the code value is greater or equal to 400.
      * 
-     * @param reason
+     * @param reason the reason
      */
     public void setReason(String reason)
     {
diff --git a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/ForwardedSchemeHeaderRuleTest.java b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/ForwardedSchemeHeaderRuleTest.java
index b892ff5..ec1d67b 100644
--- a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/ForwardedSchemeHeaderRuleTest.java
+++ b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/ForwardedSchemeHeaderRuleTest.java
@@ -73,11 +73,11 @@
         _rule.matchAndApply("/",_request,_response);
         assertEquals("https",_request.getScheme());
 
-        _request.setScheme(null);
+        _request.setScheme("other");
         // header value doesn't match rule's value
         setRequestHeader("Front-End-Https", "off");
         _rule.matchAndApply("/",_request,_response);
-        assertEquals(null,_request.getScheme());
+        assertEquals("other",_request.getScheme());
 
         _request.setScheme(null);
         // header value can be any value
diff --git a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/HeaderRegexRuleTest.java b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/HeaderRegexRuleTest.java
index aaf22d7..41fe34a 100644
--- a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/HeaderRegexRuleTest.java
+++ b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/HeaderRegexRuleTest.java
@@ -18,13 +18,14 @@
 
 package org.eclipse.jetty.rewrite.handler;
 
-import org.junit.Before;
-import org.junit.Test;
 import static org.junit.Assert.assertEquals;
 
 import java.io.IOException;
 import java.util.Iterator;
 
+import org.junit.Before;
+import org.junit.Test;
+
 public class HeaderRegexRuleTest extends AbstractRuleTestCase
 {
 
diff --git a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/LegacyRuleTest.java b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/LegacyRuleTest.java
deleted file mode 100644
index 9cff2d9..0000000
--- a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/LegacyRuleTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rewrite.handler;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class LegacyRuleTest extends AbstractRuleTestCase
-{
-    private String[][] _tests=
-    {
-            {"/foo/bar","/*","/replace/foo/bar"},
-            {"/foo/bar","/foo/*","/replace/bar"},
-            {"/foo/bar","/foo/bar","/replace"}
-    };
-    private LegacyRule _rule;
-
-    @Before
-    public void init() throws Exception
-    {
-        start(false);
-        _rule = new LegacyRule();
-    }
-
-    @After
-    public void destroy()
-    {
-        _rule = null;
-    }
-
-    @Test
-    public void testMatchAndApply() throws Exception
-    {
-        for (String[] _test : _tests)
-        {
-            _rule.addRewriteRule(_test[1], "/replace");
-            String result = _rule.matchAndApply(_test[0], _request, _response);
-            assertEquals(_test[1], _test[2], result);
-        }
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testAddRewrite()
-    {
-        _rule.addRewriteRule("*.txt", "/replace");
-    }
-}
diff --git a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/PatternRuleTest.java b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/PatternRuleTest.java
index 533f429..76baaa4 100644
--- a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/PatternRuleTest.java
+++ b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/PatternRuleTest.java
@@ -25,6 +25,10 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpURI;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
 import org.eclipse.jetty.server.Request;
 import org.junit.After;
 import org.junit.Before;
@@ -138,7 +142,7 @@
         new Request(null,null)
         {
             {
-                setRequestURI(uri);
+                setMetaData(new MetaData.Request("GET",new HttpURI(uri),HttpVersion.HTTP_1_0,new HttpFields()));
             }
         }, null
         );
diff --git a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RedirectPatternRuleTest.java b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RedirectPatternRuleTest.java
index b4a5e45..e5e9275 100644
--- a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RedirectPatternRuleTest.java
+++ b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RedirectPatternRuleTest.java
@@ -18,39 +18,54 @@
 
 package org.eclipse.jetty.rewrite.handler;
 
-import static org.junit.Assert.assertEquals;
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
 
 import java.io.IOException;
 
 import org.eclipse.jetty.http.HttpHeader;
-import org.junit.After;
+import org.eclipse.jetty.http.HttpStatus;
 import org.junit.Before;
 import org.junit.Test;
 
 public class RedirectPatternRuleTest extends AbstractRuleTestCase
 {
-    private RedirectPatternRule _rule;
-
     @Before
     public void init() throws Exception
     {
         start(false);
-        _rule = new RedirectPatternRule();
-        _rule.setPattern("*");
     }
 
-    @After
-    public void destroy()
+    private void assertRedirectResponse(int expectedStatusCode, String expectedLocation) throws IOException
     {
-        _rule = null;
+        assertThat("Response status code",_response.getStatus(),is(expectedStatusCode));
+        assertThat("Response location",_response.getHeader(HttpHeader.LOCATION.asString()),is(expectedLocation));
     }
 
     @Test
-    public void testLocation() throws IOException
+    public void testGlobPattern() throws IOException
     {
         String location = "http://eclipse.com";
-        _rule.setLocation(location);
-        _rule.apply(null, _request, _response);
-        assertEquals(location, _response.getHeader(HttpHeader.LOCATION.asString()));
+
+        RedirectPatternRule rule = new RedirectPatternRule();
+        rule.setPattern("*");
+        rule.setLocation(location);
+
+        rule.apply("/",_request,_response);
+        assertRedirectResponse(HttpStatus.FOUND_302,location);
+    }
+
+    @Test
+    public void testPrefixPattern() throws IOException
+    {
+        String location = "http://api.company.com/";
+
+        RedirectPatternRule rule = new RedirectPatternRule();
+        rule.setPattern("/api/*");
+        rule.setLocation(location);
+        rule.setStatusCode(HttpStatus.MOVED_PERMANENTLY_301);
+
+        rule.apply("/api/rest?foo=1",_request,_response);
+        assertRedirectResponse(HttpStatus.MOVED_PERMANENTLY_301,location);
     }
 }
diff --git a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RedirectRegexRuleTest.java b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RedirectRegexRuleTest.java
index f18839a..dea0ce2 100644
--- a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RedirectRegexRuleTest.java
+++ b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RedirectRegexRuleTest.java
@@ -18,62 +18,88 @@
 
 package org.eclipse.jetty.rewrite.handler;
 
-import static org.junit.Assert.assertEquals;
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
 
 import java.io.IOException;
 
 import org.eclipse.jetty.http.HttpHeader;
-import org.junit.After;
+import org.eclipse.jetty.http.HttpStatus;
 import org.junit.Before;
 import org.junit.Test;
 
 public class RedirectRegexRuleTest extends AbstractRuleTestCase
 {
-    private RedirectRegexRule _rule;
-
     @Before
     public void init() throws Exception
     {
         start(false);
-        _rule = new RedirectRegexRule();
     }
-
-    @After
-    public void destroy()
+    
+    private void assertRedirectResponse(int expectedStatusCode, String expectedLocation) throws IOException
     {
-        _rule = null;
+        assertThat("Response status code", _response.getStatus(), is(expectedStatusCode));
+        assertThat("Response location", _response.getHeader(HttpHeader.LOCATION.asString()), is(expectedLocation));
     }
 
     @Test
     public void testLocationWithReplacementGroupEmpty() throws IOException
     {
-        _rule.setRegex("/my/dir/file/(.*)$");
-        _rule.setReplacement("http://www.mortbay.org/$1");
+        RedirectRegexRule rule = new RedirectRegexRule();
+        rule.setRegex("/my/dir/file/(.*)$");
+        rule.setReplacement("http://www.mortbay.org/$1");
 
         // Resource is dir
-        _rule.matchAndApply("/my/dir/file/", _request, _response);
-        assertEquals("http://www.mortbay.org/", _response.getHeader(HttpHeader.LOCATION.asString()));
+        rule.matchAndApply("/my/dir/file/", _request, _response);
+        assertRedirectResponse(HttpStatus.FOUND_302,"http://www.mortbay.org/");
+    }
+    
+    @Test
+    public void testLocationWithPathReplacement() throws IOException
+    {
+        RedirectRegexRule rule = new RedirectRegexRule();
+        rule.setRegex("/documentation/(.*)$");
+        rule.setReplacement("/docs/$1");
+
+        // Resource is dir
+        rule.matchAndApply("/documentation/top.html", _request, _response);
+        assertRedirectResponse(HttpStatus.FOUND_302,"http://0.0.0.0/docs/top.html");
     }
 
     @Test
     public void testLocationWithReplacmentGroupSimple() throws IOException
     {
-        _rule.setRegex("/my/dir/file/(.*)$");
-        _rule.setReplacement("http://www.mortbay.org/$1");
+        RedirectRegexRule rule = new RedirectRegexRule();
+        rule.setRegex("/my/dir/file/(.*)$");
+        rule.setReplacement("http://www.mortbay.org/$1");
 
         // Resource is an image
-        _rule.matchAndApply("/my/dir/file/image.png", _request, _response);
-        assertEquals("http://www.mortbay.org/image.png", _response.getHeader(HttpHeader.LOCATION.asString()));
+        rule.matchAndApply("/my/dir/file/image.png", _request, _response);
+        assertRedirectResponse(HttpStatus.FOUND_302,"http://www.mortbay.org/image.png");
     }
 
     @Test
     public void testLocationWithReplacementGroupDeepWithParams() throws IOException
     {
-        _rule.setRegex("/my/dir/file/(.*)$");
-        _rule.setReplacement("http://www.mortbay.org/$1");
+        RedirectRegexRule rule = new RedirectRegexRule();
+        rule.setRegex("/my/dir/file/(.*)$");
+        rule.setReplacement("http://www.mortbay.org/$1");
 
         // Resource is api with parameters
-        _rule.matchAndApply("/my/dir/file/api/rest/foo?id=100&sort=date", _request, _response);
-        assertEquals("http://www.mortbay.org/api/rest/foo?id=100&sort=date", _response.getHeader(HttpHeader.LOCATION.asString()));
+        rule.matchAndApply("/my/dir/file/api/rest/foo?id=100&sort=date", _request, _response);
+        assertRedirectResponse(HttpStatus.FOUND_302,"http://www.mortbay.org/api/rest/foo?id=100&sort=date");
+    }
+    
+    @Test
+    public void testMovedPermanently() throws IOException
+    {
+        RedirectRegexRule rule = new RedirectRegexRule();
+        rule.setRegex("/api/(.*)$");
+        rule.setReplacement("http://api.company.com/$1");
+        rule.setStatusCode(HttpStatus.MOVED_PERMANENTLY_301);
+
+        // Resource is api with parameters
+        rule.matchAndApply("/api/rest/foo?id=100&sort=date", _request, _response);
+        assertRedirectResponse(HttpStatus.MOVED_PERMANENTLY_301,"http://api.company.com/rest/foo?id=100&sort=date");
     }
 }
diff --git a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RewriteHandlerTest.java b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RewriteHandlerTest.java
index 684e4d9..b6af67a 100644
--- a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RewriteHandlerTest.java
+++ b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RewriteHandlerTest.java
@@ -85,7 +85,7 @@
         _handler.setOriginalPathAttribute("/before");
         _handler.setRewriteRequestURI(true);
         _handler.setRewritePathInfo(true);
-        _request.setRequestURI("/xxx/bar");
+        _request.setURIPathQuery("/xxx/bar");
         _request.setPathInfo("/xxx/bar");
         _handler.handle("/xxx/bar",_request,_request, _response);
         assertEquals(201,_response.getStatus());
@@ -99,7 +99,7 @@
         _handler.setOriginalPathAttribute("/before");
         _handler.setRewriteRequestURI(false);
         _handler.setRewritePathInfo(false);
-        _request.setRequestURI("/foo/bar");
+        _request.setURIPathQuery("/foo/bar");
         _request.setPathInfo("/foo/bar");
         
         _handler.handle("/foo/bar",_request,_request, _response);
@@ -112,7 +112,7 @@
         _response.setStatus(200);
         _request.setHandled(false);
         _handler.setOriginalPathAttribute(null);
-        _request.setRequestURI("/aaa/bar");
+        _request.setURIPathQuery("/aaa/bar");
         _request.setPathInfo("/aaa/bar");
         _handler.handle("/aaa/bar",_request,_request, _response);
         assertEquals(201,_response.getStatus());
@@ -126,7 +126,7 @@
         _handler.setOriginalPathAttribute("before");
         _handler.setRewriteRequestURI(true);
         _handler.setRewritePathInfo(true);
-        _request.setRequestURI("/aaa/bar");
+        _request.setURIPathQuery("/aaa/bar");
         _request.setPathInfo("/aaa/bar");
         _handler.handle("/aaa/bar",_request,_request, _response);
         assertEquals(201,_response.getStatus());
@@ -138,7 +138,7 @@
         _response.setStatus(200);
         _request.setHandled(false);
         _rule2.setTerminating(true);
-        _request.setRequestURI("/aaa/bar");
+        _request.setURIPathQuery("/aaa/bar");
         _request.setPathInfo("/aaa/bar");
         _handler.handle("/aaa/bar",_request,_request, _response);
         assertEquals(201,_response.getStatus());
@@ -154,7 +154,7 @@
         _request.setAttribute("target",null);
         _request.setAttribute("URI",null);
         _request.setAttribute("info",null);
-        _request.setRequestURI("/aaa/bar");
+        _request.setURIPathQuery("/aaa/bar");
         _request.setPathInfo("/aaa/bar");
         _handler.handle("/aaa/bar",_request,_request, _response);
         assertEquals(200,_response.getStatus());
@@ -174,7 +174,7 @@
         _handler.setOriginalPathAttribute("/before");
         _handler.setRewriteRequestURI(true);
         _handler.setRewritePathInfo(false);
-        _request.setRequestURI("/ccc/x%20y");
+        _request.setURIPathQuery("/ccc/x%20y");
         _request.setPathInfo("/ccc/x y");
         _handler.handle("/ccc/x y",_request,_request, _response);
         assertEquals(201,_response.getStatus());
@@ -193,7 +193,7 @@
         _handler.setOriginalPathAttribute("/before");
         _handler.setRewriteRequestURI(true);
         _handler.setRewritePathInfo(false);
-        _request.setRequestURI("/xxx/x%20y");
+        _request.setURIPathQuery("/xxx/x%20y");
         _request.setPathInfo("/xxx/x y");
         _handler.handle("/xxx/x y",_request,_request, _response);
         assertEquals(201,_response.getStatus());
diff --git a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RewritePatternRuleTest.java b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RewritePatternRuleTest.java
index b246e6d..d5f7f70 100644
--- a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RewritePatternRuleTest.java
+++ b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RewritePatternRuleTest.java
@@ -23,7 +23,6 @@
 
 import java.io.IOException;
 
-import org.eclipse.jetty.http.HttpURI;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -88,7 +87,7 @@
     {
         String replacement = "/replace";
         String queryString = "request=parameter";
-        _request.setUri(new HttpURI("/old/context"));
+        _request.setURIPathQuery("/old/context");
         _request.setQueryString(queryString);
 
         RewritePatternRule rewritePatternRule = new RewritePatternRule();
@@ -111,7 +110,7 @@
         String[] split = replacement.split("\\?", 2);
         String path = split[0];
         String queryString = split[1];
-        _request.setUri(new HttpURI("/old/context"));
+        _request.setURIPathQuery("/old/context");
         _request.setQueryString(requestQueryString);
 
         RewritePatternRule rewritePatternRule = new RewritePatternRule();
diff --git a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RewriteRegexRuleTest.java b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RewriteRegexRuleTest.java
index 11cf1fe..105deb9 100644
--- a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RewriteRegexRuleTest.java
+++ b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/RewriteRegexRuleTest.java
@@ -23,7 +23,6 @@
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 
-import org.eclipse.jetty.http.HttpURI;
 import org.eclipse.jetty.util.MultiMap;
 import org.eclipse.jetty.util.URIUtil;
 import org.eclipse.jetty.util.UrlEncoded;
@@ -66,15 +65,13 @@
         for (String[] test : _tests)
         {
             reset();
-            _request.setRequestURI(null);
+            _request.setURIPathQuery(null);
             
             String t=test[0]+"?"+test[1]+">"+test[2]+"|"+test[3];
             _rule.setRegex(test[2]);
             _rule.setReplacement(test[3]);
 
-            _request.setUri(new HttpURI(test[0]+(test[1]==null?"":("?"+test[1]))));
-            _request.getRequestURI();
-
+            _request.setURIPathQuery(test[0]+(test[1]==null?"":("?"+test[1])));
             
             String result = _rule.matchAndApply(test[0], _request, _response);
             assertEquals(t, test[4], result);
@@ -89,7 +86,7 @@
             if (test[5]!=null)
             {
                 MultiMap<String> params=new MultiMap<String>();
-                UrlEncoded.decodeTo(test[5],params, StandardCharsets.UTF_8,-1);
+                UrlEncoded.decodeTo(test[5],params, StandardCharsets.UTF_8);
                                
                 for (String n:params.keySet())
                     assertEquals(params.getString(n),_request.getParameter(n));
@@ -110,7 +107,7 @@
             _rule.setRegex(test[2]);
             _rule.setReplacement(test[3]);
 
-            _request.setRequestURI(test[0]);
+            _request.setURIPathQuery(test[0]);
             _request.setQueryString(test[1]);
             _request.getAttributes().clearAttributes();
             
diff --git a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/TerminatingPatternRuleTest.java b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/TerminatingPatternRuleTest.java
new file mode 100644
index 0000000..e263132
--- /dev/null
+++ b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/TerminatingPatternRuleTest.java
@@ -0,0 +1,103 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.rewrite.handler;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TerminatingPatternRuleTest extends AbstractRuleTestCase
+{
+    private RewriteHandler rewriteHandler;
+
+    @Before
+    public void init() throws Exception
+    {
+        rewriteHandler = new RewriteHandler();
+        rewriteHandler.setServer(_server);
+        rewriteHandler.setHandler(new AbstractHandler()
+        {
+            @Override
+            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException,
+                    ServletException
+            {
+                response.setStatus(HttpStatus.CREATED_201);
+                request.setAttribute("target",target);
+                request.setAttribute("URI",request.getRequestURI());
+                request.setAttribute("info",request.getPathInfo());
+            }
+        });
+        rewriteHandler.start();
+
+        TerminatingPatternRule rule1 = new TerminatingPatternRule();
+        rule1.setPattern("/login.jsp");
+        rewriteHandler.addRule(rule1);
+        RedirectRegexRule rule2 = new RedirectRegexRule();
+        rule2.setRegex("^/login.*$");
+        rule2.setReplacement("http://login.company.com/");
+        rewriteHandler.addRule(rule2);
+
+        start(false);
+    }
+
+    private void assertIsRedirect(int expectedStatus, String expectedLocation)
+    {
+        assertThat("Response Status",_response.getStatus(),is(expectedStatus));
+        assertThat("Response Location Header",_response.getHeader(HttpHeader.LOCATION.asString()),is(expectedLocation));
+    }
+
+    private void assertIsRequest(String expectedRequestPath)
+    {
+        assertThat("Response Status",_response.getStatus(),is(HttpStatus.CREATED_201));
+        assertThat("Request Target",_request.getAttribute("target"),is(expectedRequestPath));
+    }
+
+    @Test
+    public void testTerminatingEarly() throws IOException, ServletException
+    {
+        rewriteHandler.handle("/login.jsp",_request,_request,_response);
+        assertIsRequest("/login.jsp");
+    }
+
+    @Test
+    public void testNoTerminationDo() throws IOException, ServletException
+    {
+        rewriteHandler.handle("/login.do",_request,_request,_response);
+        assertIsRedirect(HttpStatus.MOVED_TEMPORARILY_302,"http://login.company.com/");
+    }
+
+    @Test
+    public void testNoTerminationDir() throws IOException, ServletException
+    {
+        rewriteHandler.handle("/login/",_request,_request,_response);
+        assertIsRedirect(HttpStatus.MOVED_TEMPORARILY_302,"http://login.company.com/");
+    }
+}
diff --git a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/TerminatingRegexRuleTest.java b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/TerminatingRegexRuleTest.java
new file mode 100644
index 0000000..7420931
--- /dev/null
+++ b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/TerminatingRegexRuleTest.java
@@ -0,0 +1,103 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.rewrite.handler;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TerminatingRegexRuleTest extends AbstractRuleTestCase
+{
+    private RewriteHandler rewriteHandler;
+
+    @Before
+    public void init() throws Exception
+    {
+        rewriteHandler = new RewriteHandler();
+        rewriteHandler.setServer(_server);
+        rewriteHandler.setHandler(new AbstractHandler()
+        {
+            @Override
+            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException,
+                    ServletException
+            {
+                response.setStatus(HttpStatus.CREATED_201);
+                request.setAttribute("target",target);
+                request.setAttribute("URI",request.getRequestURI());
+                request.setAttribute("info",request.getPathInfo());
+            }
+        });
+        rewriteHandler.start();
+
+        TerminatingRegexRule rule1 = new TerminatingRegexRule();
+        rule1.setRegex("^/login.jsp$");
+        rewriteHandler.addRule(rule1);
+        RedirectRegexRule rule2 = new RedirectRegexRule();
+        rule2.setRegex("^/login.*$");
+        rule2.setReplacement("http://login.company.com/");
+        rewriteHandler.addRule(rule2);
+
+        start(false);
+    }
+
+    private void assertIsRedirect(int expectedStatus, String expectedLocation)
+    {
+        assertThat("Response Status",_response.getStatus(),is(expectedStatus));
+        assertThat("Response Location Header",_response.getHeader(HttpHeader.LOCATION.asString()),is(expectedLocation));
+    }
+
+    private void assertIsRequest(String expectedRequestPath)
+    {
+        assertThat("Response Status",_response.getStatus(),is(HttpStatus.CREATED_201));
+        assertThat("Request Target",_request.getAttribute("target"),is(expectedRequestPath));
+    }
+
+    @Test
+    public void testTerminatingEarly() throws IOException, ServletException
+    {
+        rewriteHandler.handle("/login.jsp",_request,_request,_response);
+        assertIsRequest("/login.jsp");
+    }
+
+    @Test
+    public void testNoTerminationDo() throws IOException, ServletException
+    {
+        rewriteHandler.handle("/login.do",_request,_request,_response);
+        assertIsRedirect(HttpStatus.MOVED_TEMPORARILY_302,"http://login.company.com/");
+    }
+
+    @Test
+    public void testNoTerminationDir() throws IOException, ServletException
+    {
+        rewriteHandler.handle("/login/",_request,_request,_response);
+        assertIsRedirect(HttpStatus.MOVED_TEMPORARILY_302,"http://login.company.com/");
+    }
+}
diff --git a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/ValidUrlRuleTest.java b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/ValidUrlRuleTest.java
index 0a612e3..023faab 100644
--- a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/ValidUrlRuleTest.java
+++ b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/ValidUrlRuleTest.java
@@ -41,7 +41,7 @@
     public void testValidUrl() throws Exception
     {
         _rule.setCode("404");
-        _request.setRequestURI("/valid/uri.html");
+        _request.setURIPathQuery("/valid/uri.html");
         
         _rule.matchAndApply(_request.getRequestURI(), _request, _response);
 
@@ -52,7 +52,7 @@
     public void testInvalidUrl() throws Exception
     {
         _rule.setCode("404");
-        _request.setRequestURI("/invalid%0c/uri.html");
+        _request.setURIPathQuery("/invalid%0c/uri.html");
         
         String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response);
 
@@ -64,7 +64,7 @@
     {
         _rule.setCode("405");
         _rule.setReason("foo");
-        _request.setRequestURI("/%00/");
+        _request.setURIPathQuery("/%00/");
         
         String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response);
 
@@ -77,7 +77,7 @@
     {
         _rule.setCode("405");
         _rule.setReason("foo");
-        _request.setRequestURI("/jsp/bean1.jsp%00");
+        _request.setURIPathQuery("/jsp/bean1.jsp%00");
         
         String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response);
 
@@ -91,7 +91,7 @@
     {
         _rule.setCode("405");
         _rule.setReason("foo");
-        _request.setRequestURI("/jsp/shamrock-%00%E2%98%98.jsp");
+        _request.setURIPathQuery("/jsp/shamrock-%00%E2%98%98.jsp");
         
         String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response);
 
@@ -105,7 +105,7 @@
     {
         _rule.setCode("405");
         _rule.setReason("foo");
-        _request.setRequestURI("/jsp/shamrock-%E2%98%98.jsp");
+        _request.setURIPathQuery("/jsp/shamrock-%E2%98%98.jsp");
         
         String result = _rule.matchAndApply(_request.getRequestURI(), _request, _response);
 
diff --git a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/VirtualHostRuleContainerTest.java b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/VirtualHostRuleContainerTest.java
index 8d692ae..deca36f 100644
--- a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/VirtualHostRuleContainerTest.java
+++ b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/VirtualHostRuleContainerTest.java
@@ -49,7 +49,7 @@
         _fooContainerRule.setRules(new Rule[] { _fooRule });
 
         start(false);
-        _request.setRequestURI("/cheese/bar");
+        _request.setURIPathQuery("/cheese/bar");
         
         _handler.setServer(_server);
         _handler.start();
@@ -58,7 +58,7 @@
     @Test
     public void testArbitraryHost() throws Exception
     {
-        _request.setServerName("cheese.com");
+        _request.setAuthority("cheese.com",0);
         _handler.setRules(new Rule[] { _rule, _fooContainerRule });
         handleRequest();
         assertEquals("{_rule, _fooContainerRule, Host: cheese.com}: applied _rule", "/rule/bar", _request.getRequestURI());
@@ -67,7 +67,7 @@
     @Test
     public void testVirtualHost() throws Exception
     {
-        _request.setServerName("foo.com");
+        _request.setAuthority("foo.com",0);
         _handler.setRules(new Rule[] { _fooContainerRule });
         handleRequest();
         assertEquals("{_fooContainerRule, Host: foo.com}: applied _fooRule", "/cheese/fooRule", _request.getRequestURI());
@@ -76,8 +76,8 @@
     @Test
     public void testCascadingRules() throws Exception
     {
-        _request.setServerName("foo.com");
-        _request.setRequestURI("/cheese/bar");
+        _request.setAuthority("foo.com",0);
+        _request.setURIPathQuery("/cheese/bar");
 
         _rule.setTerminating(false);
         _fooRule.setTerminating(false);
@@ -87,17 +87,17 @@
         handleRequest();
         assertEquals("{_rule, _fooContainerRule}: applied _rule, didn't match _fooRule", "/rule/bar", _request.getRequestURI());
 
-        _request.setRequestURI("/cheese/bar");
+        _request.setURIPathQuery("/cheese/bar");
         _handler.setRules(new Rule[] { _fooContainerRule, _rule });
         handleRequest();
         assertEquals("{_fooContainerRule, _rule}: applied _fooRule, _rule","/rule/fooRule", _request.getRequestURI());
 
-        _request.setRequestURI("/cheese/bar");
+        _request.setURIPathQuery("/cheese/bar");
         _fooRule.setTerminating(true);
         handleRequest();
         assertEquals("{_fooContainerRule, _rule}: (_fooRule is terminating); applied _fooRule, _rule", "/rule/fooRule", _request.getRequestURI());
 
-        _request.setRequestURI("/cheese/bar");
+        _request.setURIPathQuery("/cheese/bar");
         _fooRule.setTerminating(false);
         _fooContainerRule.setTerminating(true);
         handleRequest();
@@ -107,7 +107,7 @@
     @Test
     public void testCaseInsensitiveHostname() throws Exception
     {
-        _request.setServerName("Foo.com");
+        _request.setAuthority("Foo.com",0);
         _fooContainerRule.setVirtualHosts(new String[] {"foo.com"} );
 
         _handler.setRules(new Rule[]{ _fooContainerRule });
@@ -118,21 +118,21 @@
     @Test
     public void testEmptyVirtualHost() throws Exception
     {
-        _request.setServerName("cheese.com");
+        _request.setAuthority("cheese.com",0);
 
         _handler.setRules(new Rule[] { _fooContainerRule });
         _fooContainerRule.setVirtualHosts(null);
         handleRequest();
         assertEquals("{_fooContainerRule: virtual hosts array is null, Host: cheese.com}: apply _fooRule", "/cheese/fooRule", _request.getRequestURI());
 
-        _request.setRequestURI("/cheese/bar");
-        _request.setRequestURI("/cheese/bar");
+        _request.setURIPathQuery("/cheese/bar");
+        _request.setURIPathQuery("/cheese/bar");
         _fooContainerRule.setVirtualHosts(new String[] {});
         handleRequest();
         assertEquals("{_fooContainerRule: virtual hosts array is empty, Host: cheese.com}: apply _fooRule", "/cheese/fooRule", _request.getRequestURI());
 
-        _request.setRequestURI("/cheese/bar");
-        _request.setRequestURI("/cheese/bar");
+        _request.setURIPathQuery("/cheese/bar");
+        _request.setURIPathQuery("/cheese/bar");
         _fooContainerRule.setVirtualHosts(new String[] {null});
         handleRequest();
         assertEquals("{_fooContainerRule: virtual host is null, Host: cheese.com}: apply _fooRule", "/cheese/fooRule", _request.getRequestURI());
@@ -142,14 +142,14 @@
     @Test
     public void testMultipleVirtualHosts() throws Exception
     {
-        _request.setServerName("foo.com");
+        _request.setAuthority("foo.com",0);
         _handler.setRules(new Rule[] {_fooContainerRule });
 
         _fooContainerRule.setVirtualHosts(new String[]{ "cheese.com" });
         handleRequest();
         assertEquals("{_fooContainerRule: vhosts[cheese.com], Host: foo.com}: no effect", "/cheese/bar", _request.getRequestURI());
 
-        _request.setRequestURI("/cheese/bar");
+        _request.setURIPathQuery("/cheese/bar");
         _fooContainerRule.addVirtualHost( "foo.com" );
         handleRequest();
         assertEquals("{_fooContainerRule: vhosts[cheese.com, foo.com], Host: foo.com}: apply _fooRule", "/cheese/fooRule", _request.getRequestURI());
@@ -182,8 +182,8 @@
 
         for(String host: requestHosts)
         {
-            _request.setServerName(host);
-            _request.setRequestURI("/cheese/bar");
+            _request.setAuthority(host,0);
+            _request.setURIPathQuery("/cheese/bar");
             handleRequest();
             if(succeed)
                 assertEquals("{_fooContainerRule, Host: "+host+"}: should apply _fooRule", "/cheese/fooRule", _request.getRequestURI());
diff --git a/jetty-rewrite/src/test/resources/org.mortbay.jetty.rewrite.handler/jetty-rewrite.xml b/jetty-rewrite/src/test/resources/org.mortbay.jetty.rewrite.handler/jetty-rewrite.xml
index b54d24f..9ac5109 100644
--- a/jetty-rewrite/src/test/resources/org.mortbay.jetty.rewrite.handler/jetty-rewrite.xml
+++ b/jetty-rewrite/src/test/resources/org.mortbay.jetty.rewrite.handler/jetty-rewrite.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Configure the Jetty Server                                      -->
@@ -39,12 +39,9 @@
     <Call name="addConnector">
       <Arg>
           <New class="org.eclipse.jetty.server.ServerConnector">
-            <Set name="host"><SystemProperty name="jetty.host" /></Set>
-            <Set name="port"><SystemProperty name="jetty.port" default="8080"/></Set>
+            <Set name="host"><SystemProperty name="jetty.http.host" /></Set>
+            <Set name="port"><SystemProperty name="jetty.http.port" default="8080"/></Set>
             <Set name="idleTimeout">30000</Set>
-            <Set name="Acceptors">2</Set>
-            <Set name="statsOn">false</Set>
-            <Set name="confidentialPort">8443</Set>
           </New>
       </Arg>
     </Call>
@@ -259,7 +256,7 @@
     <Ref refid="RequestLog">
       <Set name="requestLog">
         <New id="RequestLogImpl" class="org.eclipse.jetty.server.NCSARequestLog">
-          <Set name="filename"><SystemProperty name="jetty.logs" default="./logs"/>/yyyy_mm_dd.request.log</Set>
+          <Set name="filename"><SystemProperty name="jetty.requestlog.dir" default="./logs"/>/yyyy_mm_dd.request.log</Set>
           <Set name="filenameDateFormat">yyyy_MM_dd</Set>
           <Set name="retainDays">90</Set>
           <Set name="append">true</Set>
diff --git a/jetty-rhttp/README.TXT b/jetty-rhttp/README.TXT
deleted file mode 100644
index 46ca4e7..0000000
--- a/jetty-rhttp/README.TXT
+++ /dev/null
@@ -1,33 +0,0 @@
-Reverse HTTP
-
-The HTTP server paradigm is a valuable abstraction for browsing and accessing data and applications in a RESTful fashion from thin clients or
-other applications.  However, when it comes to mobile devices, the server paradigm is often not available because those devices exist on
-restricted networks that do not allow inbound connections.    These devices (eg. phones, tablets, industrial controllers, etc.) often have
-signficant content (eg. photos, video, music, contacts, etc.) and services (eg. GPS, phone, modem, camera, sound) that are worthwile to access
-remotely and often the HTTP server model is very applicable.
-
-The Jetty reverse HTTP module provides a gateway that efficiently allows HTTP connectivety to servers running in outbound-only networks.  There are two key components:
-
-The reverse HTTP connector is a jetty connector (like the HTTP, SSL, AJP connectors) that accepts HTTP requests for the Jetty server instance.  However, the reverse HTTP connector does not accept inbound TCP/IP connections.  Instead it makes an outbound HTTP connection to the reverse HTTP gateway and uses a long polling mechanism to efficiently and asynchronously fetch requests and send responses.
-
-The reverse HTTP gateway is a jetty server that accepts inbound connections from one or more Reverse HTTP connectors and makes them available as normal HTTP targets.
-
-To demonstrate this from a source release, first run a gateway instance:
-
-    cd jetty-reverse-http/reverse-http-gateway
-    mvn exec:java
-
-In another window, you can run 3 test servers with reverse connectors with:
-
-    cd jetty-reverse-http/reverse-http-connector
-    mvn exec:java
-
-
-The three servers are using context path ID's at the gateway (virtual host and cookie based mappings can also be done), so you can access the
-three servers via the gateway at:
-
-    http://localhost:8080/gw/A
-    http://localhost:8080/gw/B
-    http://localhost:8080/gw/C
-
-
diff --git a/jetty-rhttp/jetty-rhttp-client/pom.xml b/jetty-rhttp/jetty-rhttp-client/pom.xml
deleted file mode 100644
index 14dc5b3..0000000
--- a/jetty-rhttp/jetty-rhttp-client/pom.xml
+++ /dev/null
@@ -1,95 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.eclipse.jetty.rhttp</groupId>
-        <artifactId>jetty-rhttp-project</artifactId>
-        <version>9.0.0-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>reverse-http-client</artifactId>
-    <packaging>jar</packaging>
-    <name>Jetty :: Reverse HTTP :: Client</name>
-
-    <properties>
-        <bundle-symbolic-name>${project.groupId}.rhttp.client</bundle-symbolic-name>
-    </properties>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>manifest</goal>
-                        </goals>
-                        <configuration>
-                            <instructions>
-                                 <Import-Package>*</Import-Package>
-                            </instructions>
-                          </configuration>
-                       </execution>
-                  </executions>
-            </plugin>
-            <plugin>
-              <!--
-              Required for OSGI
-              -->
-              <groupId>org.apache.maven.plugins</groupId>
-              <artifactId>maven-jar-plugin</artifactId>
-              <configuration>
-                  <archive>
-                      <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-                  </archive>
-              </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-util</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-io</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-client</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-http</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-            <version>4.0</version>
-        </dependency>
-        <dependency>
-            <groupId>net.jcip</groupId>
-            <artifactId>jcip-annotations</artifactId>
-            <version>1.0</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-          <groupId>org.eclipse.jetty.toolchain</groupId>
-          <artifactId>jetty-test-helper</artifactId>
-          <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-server</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/AbstractClient.java b/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/AbstractClient.java
deleted file mode 100644
index cecc330..0000000
--- a/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/AbstractClient.java
+++ /dev/null
@@ -1,270 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.client;
-
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import org.eclipse.jetty.util.component.AbstractLifeCycle;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/**
- * @version $Revision$ $Date$
- */
-public abstract class AbstractClient extends AbstractLifeCycle implements RHTTPClient
-{
-    private final Logger logger = Log.getLogger("org.mortbay.jetty.rhttp.client");
-    private final List<RHTTPListener> listeners = new CopyOnWriteArrayList<RHTTPListener>();
-    private final List<ClientListener> clientListeners = new CopyOnWriteArrayList<ClientListener>();
-    private final String targetId;
-    private volatile Status status = Status.DISCONNECTED;
-
-    public AbstractClient(String targetId)
-    {
-        this.targetId = targetId;
-    }
-
-    public String getGatewayURI()
-    {
-        return "http://"+getHost()+":"+getPort()+getPath();
-    }
-
-    public String getTargetId()
-    {
-        return targetId;
-    }
-
-    public Logger getLogger()
-    {
-        return logger;
-    }
-
-    public void addListener(RHTTPListener listener)
-    {
-        listeners.add(listener);
-    }
-
-    public void removeListener(RHTTPListener listener)
-    {
-        listeners.remove(listener);
-    }
-
-    public void addClientListener(ClientListener listener)
-    {
-        clientListeners.add(listener);
-    }
-
-    public void removeClientListener(ClientListener listener)
-    {
-        clientListeners.remove(listener);
-    }
-
-    protected void notifyRequests(List<RHTTPRequest> requests)
-    {
-        for (RHTTPRequest request : requests)
-        {
-            for (RHTTPListener listener : listeners)
-            {
-                try
-                {
-                    listener.onRequest(request);
-                }
-                catch (Throwable x)
-                {
-                    logger.warn("Listener " + listener + " threw", x);
-                    try
-                    {
-                        deliver(newExceptionResponse(request.getId(), x));
-                    }
-                    catch (IOException xx)
-                    {
-                        logger.debug("Could not deliver exception response", xx);
-                    }
-                }
-            }
-        }
-    }
-
-    protected RHTTPResponse newExceptionResponse(int requestId, Throwable x)
-    {
-        try
-        {
-            int statusCode = 500;
-            String statusMessage = "Internal Server Error";
-            Map<String, String> headers = new HashMap<String, String>();
-            byte[] body = x.toString().getBytes("UTF-8");
-            return new RHTTPResponse(requestId, statusCode, statusMessage, headers, body);
-        }
-        catch (UnsupportedEncodingException xx)
-        {
-            throw new AssertionError(xx);
-        }
-    }
-
-    protected void notifyConnectRequired()
-    {
-        for (ClientListener listener : clientListeners)
-        {
-            try
-            {
-                listener.connectRequired();
-            }
-            catch (Throwable x)
-            {
-                logger.warn("ClientListener " + listener + " threw", x);
-            }
-        }
-    }
-
-    protected void notifyConnectException()
-    {
-        for (ClientListener listener : clientListeners)
-        {
-            try
-            {
-                listener.connectException();
-            }
-            catch (Throwable x)
-            {
-                logger.warn("ClientListener " + listener + " threw", x);
-            }
-        }
-    }
-
-    protected void notifyConnectClosed()
-    {
-        for (ClientListener listener : clientListeners)
-        {
-            try
-            {
-                listener.connectClosed();
-            }
-            catch (Throwable xx)
-            {
-                logger.warn("ClientListener " + listener + " threw", xx);
-            }
-        }
-    }
-
-    protected void notifyDeliverException(RHTTPResponse response)
-    {
-        for (ClientListener listener : clientListeners)
-        {
-            try
-            {
-                listener.deliverException(response);
-            }
-            catch (Throwable x)
-            {
-                logger.warn("ClientListener " + listener + " threw", x);
-            }
-        }
-    }
-
-    protected String urlEncode(String value)
-    {
-        try
-        {
-            return URLEncoder.encode(value, "UTF-8");
-        }
-        catch (UnsupportedEncodingException x)
-        {
-            getLogger().debug("", x);
-            return null;
-        }
-    }
-
-    protected boolean isConnected()
-    {
-        return status == Status.CONNECTED;
-    }
-
-    protected boolean isDisconnecting()
-    {
-        return status == Status.DISCONNECTING;
-    }
-
-    protected boolean isDisconnected()
-    {
-        return status == Status.DISCONNECTED;
-    }
-
-    public void connect() throws IOException
-    {
-        if (isDisconnected())
-            status = Status.CONNECTING;
-
-        syncHandshake();
-        this.status = Status.CONNECTED;
-
-        asyncConnect();
-    }
-
-    public void disconnect() throws IOException
-    {
-        if (isConnected())
-        {
-            status = Status.DISCONNECTING;
-            try
-            {
-                syncDisconnect();
-            }
-            finally
-            {
-                status = Status.DISCONNECTED;
-            }
-        }
-    }
-
-    public void deliver(RHTTPResponse response) throws IOException
-    {
-        asyncDeliver(response);
-    }
-
-    protected abstract void syncHandshake() throws IOException;
-
-    protected abstract void asyncConnect();
-
-    protected abstract void syncDisconnect() throws IOException;
-
-    protected abstract void asyncDeliver(RHTTPResponse response);
-
-    protected void connectComplete(byte[] responseContent) throws IOException
-    {
-        List<RHTTPRequest> requests = RHTTPRequest.fromFrameBytes(responseContent);
-        getLogger().debug("Client {} connect returned from gateway, requests {}", getTargetId(), requests);
-
-        // Requests are arrived, reconnect while we process them
-        if (!isDisconnecting() && !isDisconnected())
-            asyncConnect();
-
-        notifyRequests(requests);
-    }
-
-    protected enum Status
-    {
-        CONNECTING, CONNECTED, DISCONNECTING, DISCONNECTED
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/ApacheClient.java b/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/ApacheClient.java
deleted file mode 100644
index b21d1cd..0000000
--- a/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/ApacheClient.java
+++ /dev/null
@@ -1,156 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.client;
-
-import java.io.IOException;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.NoHttpResponseException;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.ByteArrayEntity;
-import org.apache.http.util.EntityUtils;
-
-/**
- * Implementation of {@link RHTTPClient} that uses Apache's HttpClient.
- *
- * @version $Revision$ $Date$
- */
-public class ApacheClient extends AbstractClient
-{
-    private final HttpClient httpClient;
-    private final String gatewayPath;
-
-    public ApacheClient(HttpClient httpClient, String gatewayPath, String targetId)
-    {
-        super(targetId);
-        this.httpClient = httpClient;
-        this.gatewayPath = gatewayPath;
-    }
-
-    public String getHost()
-    {
-        return ((HttpHost)httpClient.getParams().getParameter("http.default-host")).getHostName();
-    }
-
-    public int getPort()
-    {
-        return ((HttpHost)httpClient.getParams().getParameter("http.default-host")).getPort();
-    }
-    
-    public String getPath()
-    {
-        return gatewayPath;
-    }
-
-    protected void syncHandshake() throws IOException
-    {
-        HttpPost handshake = new HttpPost(gatewayPath + "/" + urlEncode(getTargetId()) + "/handshake");
-        HttpResponse response = httpClient.execute(handshake);
-        int statusCode = response.getStatusLine().getStatusCode();
-        HttpEntity entity = response.getEntity();
-        if (entity != null)
-            entity.consumeContent();
-        if (statusCode != HttpStatus.SC_OK)
-            throw new IOException("Handshake failed");
-        getLogger().debug("Client {} handshake returned from gateway", getTargetId(), null);
-    }
-
-    protected void asyncConnect()
-    {
-        new Thread()
-        {
-            @Override
-            public void run()
-            {
-                try
-                {
-                    HttpPost connect = new HttpPost(gatewayPath + "/" + urlEncode(getTargetId()) + "/connect");
-                    getLogger().debug("Client {} connect sent to gateway", getTargetId(), null);
-                    HttpResponse response = httpClient.execute(connect);
-                    int statusCode = response.getStatusLine().getStatusCode();
-                    HttpEntity entity = response.getEntity();
-                    byte[] responseContent = EntityUtils.toByteArray(entity);
-                    if (statusCode == HttpStatus.SC_OK)
-                        connectComplete(responseContent);
-                    else if (statusCode == HttpStatus.SC_UNAUTHORIZED)
-                        notifyConnectRequired();
-                    else
-                        notifyConnectException();
-                }
-                catch (NoHttpResponseException x)
-                {
-                    notifyConnectClosed();
-                }
-                catch (IOException x)
-                {
-                    getLogger().debug("", x);
-                    notifyConnectException();
-                }
-            }
-        }.start();
-    }
-
-    protected void syncDisconnect() throws IOException
-    {
-        HttpPost disconnect = new HttpPost(gatewayPath + "/" + urlEncode(getTargetId()) + "/disconnect");
-        HttpResponse response = httpClient.execute(disconnect);
-        int statusCode = response.getStatusLine().getStatusCode();
-        HttpEntity entity = response.getEntity();
-        if (entity != null)
-            entity.consumeContent();
-        if (statusCode != HttpStatus.SC_OK)
-            throw new IOException("Disconnect failed");
-        getLogger().debug("Client {} disconnect returned from gateway", getTargetId(), null);
-    }
-
-    protected void asyncDeliver(final RHTTPResponse response)
-    {
-        new Thread()
-        {
-            @Override
-            public void run()
-            {
-                try
-                {
-                    HttpPost deliver = new HttpPost(gatewayPath + "/" + urlEncode(getTargetId()) + "/deliver");
-                    deliver.setEntity(new ByteArrayEntity(response.getFrameBytes()));
-                    getLogger().debug("Client {} deliver sent to gateway, response {}", getTargetId(), response);
-                    HttpResponse httpResponse = httpClient.execute(deliver);
-                    int statusCode = httpResponse.getStatusLine().getStatusCode();
-                    HttpEntity entity = httpResponse.getEntity();
-                    if (entity != null)
-                        entity.consumeContent();
-                    if (statusCode == HttpStatus.SC_UNAUTHORIZED)
-                        notifyConnectRequired();
-                    else if (statusCode != HttpStatus.SC_OK)
-                        notifyDeliverException(response);
-                }
-                catch (IOException x)
-                {
-                    getLogger().debug("", x);
-                    notifyDeliverException(response);
-                }
-            }
-        }.start();
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/ClientListener.java b/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/ClientListener.java
deleted file mode 100644
index dcb2940..0000000
--- a/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/ClientListener.java
+++ /dev/null
@@ -1,67 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.client;
-
-/**
- * A listener for network-related events happening on the gateway client.
- *
- * @version $Revision$ $Date$
- */
-public interface ClientListener
-{
-    /**
-     * Called when the client detects that the server requested a new connect.
-     */
-    public void connectRequired();
-
-    /**
-     * Called when the client detects that the connection has been closed by the server.
-     */
-    public void connectClosed();
-
-    /**
-     * Called when the client detects a generic exception while trying to connect to the server.
-     */
-    public void connectException();
-
-    /**
-     * Called when the client detects a generic exception while tryint to deliver to the server.
-     * @param response the Response object that should have been sent to the server
-     */
-    public void deliverException(RHTTPResponse response);
-
-    public static class Adapter implements ClientListener
-    {
-        public void connectRequired()
-        {
-        }
-
-        public void connectClosed()
-        {
-        }
-
-        public void connectException()
-        {
-        }
-
-        public void deliverException(RHTTPResponse response)
-        {
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/JettyClient.java b/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/JettyClient.java
deleted file mode 100644
index 637b8fb..0000000
--- a/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/JettyClient.java
+++ /dev/null
@@ -1,306 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.client;
-
-import java.io.ByteArrayOutputStream;
-import java.io.EOFException;
-import java.io.IOException;
-
-import org.eclipse.jetty.client.Address;
-import org.eclipse.jetty.client.ContentExchange;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.HttpExchange;
-import org.eclipse.jetty.http.HttpMethods;
-import org.eclipse.jetty.http.HttpURI;
-import org.eclipse.jetty.io.Buffer;
-import org.eclipse.jetty.io.ByteArrayBuffer;
-import org.eclipse.jetty.io.EofException;
-
-/**
- * Implementation of {@link RHTTPClient} that uses Jetty's HttpClient.
- *
- * @version $Revision$ $Date$
- */
-public class JettyClient extends AbstractClient
-{
-    private final HttpClient httpClient;
-    private final Address gatewayAddress;
-    private final String gatewayPath;
-
-    public JettyClient(HttpClient httpClient, Address gatewayAddress, String gatewayPath, String targetId)
-    {
-        super(targetId);
-        this.httpClient = httpClient;
-        this.gatewayAddress = gatewayAddress;
-        this.gatewayPath = gatewayPath;
-    }
-    
-    public JettyClient(HttpClient httpClient, String gatewayURI, String targetId)
-    {
-        super(targetId);
-        
-        HttpURI uri = new HttpURI(gatewayURI);
-        
-        this.httpClient = httpClient;
-        this.gatewayAddress = new Address(uri.getHost(),uri.getPort());
-        this.gatewayPath = uri.getPath();
-    }
-    
-    public String getHost()
-    {
-        return gatewayAddress.getHost();
-    }
-
-    public int getPort()
-    {
-        return gatewayAddress.getPort();
-    }
-
-    public String getPath()
-    {
-        return gatewayPath;
-    }
-    
-    @Override
-    protected void doStart() throws Exception
-    {
-        httpClient.start();
-        super.doStart();
-    }
-
-    @Override
-    protected void doStop() throws Exception
-    {
-        super.doStop();
-        httpClient.stop();
-    }
-
-    protected void syncHandshake() throws IOException
-    {
-        HandshakeExchange exchange = new HandshakeExchange();
-        exchange.setMethod(HttpMethods.POST);
-        exchange.setAddress(gatewayAddress);
-        exchange.setURI(gatewayPath + "/" + urlEncode(getTargetId()) + "/handshake");
-        httpClient.send(exchange);
-        getLogger().debug("Client {} handshake sent to gateway", getTargetId(), null);
-
-        try
-        {
-            int exchangeStatus = exchange.waitForDone();
-            if (exchangeStatus != HttpExchange.STATUS_COMPLETED)
-                throw new IOException("Handshake failed");
-            if (exchange.getResponseStatus() != 200)
-                throw new IOException("Handshake failed");
-            getLogger().debug("Client {} handshake returned from gateway", getTargetId(), null);
-        }
-        catch (InterruptedException x)
-        {
-            Thread.currentThread().interrupt();
-            throw newIOException(x);
-        }
-    }
-
-    private IOException newIOException(Throwable x)
-    {
-        return (IOException)new IOException().initCause(x);
-    }
-
-    protected void asyncConnect()
-    {
-        try
-        {
-            ConnectExchange exchange = new ConnectExchange();
-            exchange.setMethod(HttpMethods.POST);
-            exchange.setAddress(gatewayAddress);
-            exchange.setURI(gatewayPath + "/" + urlEncode(getTargetId()) + "/connect");
-            httpClient.send(exchange);
-            getLogger().debug("Client {} connect sent to gateway", getTargetId(), null);
-        }
-        catch (IOException x)
-        {
-            getLogger().debug("Could not send exchange", x);
-            throw new RuntimeException(x);
-        }
-    }
-
-    protected void syncDisconnect() throws IOException
-    {
-        DisconnectExchange exchange = new DisconnectExchange();
-        exchange.setMethod(HttpMethods.POST);
-        exchange.setAddress(gatewayAddress);
-        exchange.setURI(gatewayPath + "/" + urlEncode(getTargetId()) + "/disconnect");
-        httpClient.send(exchange);
-        getLogger().debug("Client {} disconnect sent to gateway", getTargetId(), null);
-        try
-        {
-            int status = exchange.waitForDone();
-            if (status != HttpExchange.STATUS_COMPLETED)
-                throw new IOException("Disconnect failed");
-            if (exchange.getResponseStatus() != 200)
-                throw new IOException("Disconnect failed");
-            getLogger().debug("Client {} disconnect returned from gateway", getTargetId(), null);
-        }
-        catch (InterruptedException x)
-        {
-            Thread.currentThread().interrupt();
-            throw newIOException(x);
-        }
-    }
-
-    protected void asyncDeliver(RHTTPResponse response)
-    {
-        try
-        {
-            DeliverExchange exchange = new DeliverExchange(response);
-            exchange.setMethod(HttpMethods.POST);
-            exchange.setAddress(gatewayAddress);
-            exchange.setURI(gatewayPath + "/" + urlEncode(getTargetId()) + "/deliver");
-            exchange.setRequestContent(new ByteArrayBuffer(response.getFrameBytes()));
-            httpClient.send(exchange);
-            getLogger().debug("Client {} deliver sent to gateway, response {}", getTargetId(), response);
-        }
-        catch (IOException x)
-        {
-            getLogger().debug("Could not send exchange", x);
-            throw new RuntimeException(x);
-        }
-    }
-
-    protected class HandshakeExchange extends ContentExchange
-    {
-        protected HandshakeExchange()
-        {
-            super(true);
-        }
-        
-        @Override
-        protected void onConnectionFailed(Throwable x)
-        {
-            getLogger().warn(x.toString());
-            getLogger().debug(x);
-        }
-    }
-
-    protected class ConnectExchange extends ContentExchange
-    {
-        private final ByteArrayOutputStream content = new ByteArrayOutputStream();
-
-        protected ConnectExchange()
-        {
-            super(true);
-        }
-
-        @Override
-        protected void onResponseContent(Buffer buffer) throws IOException
-        {
-            buffer.writeTo(content);
-        }
-
-        @Override
-        protected void onResponseComplete()
-        {
-            int responseStatus = getResponseStatus();
-            if (responseStatus == 200)
-            {
-                try
-                {
-                    connectComplete(content.toByteArray());
-                }
-                catch (IOException x)
-                {
-                    onException(x);
-                }
-            }
-            else if (responseStatus == 401)
-            {
-                notifyConnectRequired();
-            }
-            else
-            {
-                notifyConnectException();
-            }
-        }
-
-        @Override
-        protected void onException(Throwable x)
-        {
-            getLogger().debug(x);
-            if (x instanceof EofException || x instanceof EOFException)
-            {
-                notifyConnectClosed();
-            }
-            else
-            {
-                notifyConnectException();
-            }
-        }
-        
-        @Override
-        protected void onConnectionFailed(Throwable x)
-        {
-            getLogger().debug(x);
-        }
-    }
-
-    protected class DisconnectExchange extends ContentExchange
-    {
-        protected DisconnectExchange()
-        {
-            super(true);
-        }
-    }
-
-    protected class DeliverExchange extends ContentExchange
-    {
-        private final RHTTPResponse response;
-
-        protected DeliverExchange(RHTTPResponse response)
-        {
-            super(true);
-            this.response = response;
-        }
-
-        @Override
-        protected void onResponseComplete() throws IOException
-        {
-            int responseStatus = getResponseStatus();
-            if (responseStatus == 401)
-            {
-                notifyConnectRequired();
-            }
-            else if (responseStatus != 200)
-            {
-                notifyDeliverException(response);
-            }
-        }
-
-        @Override
-        protected void onException(Throwable x)
-        {
-            getLogger().debug(x);
-            notifyDeliverException(response);
-        }
-
-        @Override
-        protected void onConnectionFailed(Throwable x)
-        {
-            getLogger().debug(x);
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/RHTTPClient.java b/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/RHTTPClient.java
deleted file mode 100644
index 2888bee..0000000
--- a/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/RHTTPClient.java
+++ /dev/null
@@ -1,133 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.client;
-
-import java.io.IOException;
-
-/**
- * <p><tt>RHTTPClient</tt> represent a client of the gateway server.</p>
- * <p>A <tt>Client</tt> has a server side counterpart with which communicates
- * using a comet protocol.<br /> The <tt>Client</tt>, its server-side
- * counterpart and the comet protocol form the <em>Half-Object plus Protocol</em>
- * pattern.</p>
- * <p>A <tt>Client</tt> must first connect to the gateway server, to let the gateway
- * server know its targetId, an identifier that uniquely distinguish this
- * <tt>Client</tt> from other <tt>Client</tt>s.</p>
- * <p>Once connected, the gateway server will use a comet procotol to notify the
- * <tt>Client</tt> of server-side events, and the <tt>Client</tt> can send
- * information to the gateway server to notify it of client-side events.</p>
- * <p>Server-side event are notified to {@link RHTTPListener}s, while relevant
- * network events are communicated to {@link ClientListener}s.</p>
- *
- * @version $Revision$ $Date$
- */
-public interface RHTTPClient
-{
-    /**
-     * @return The gateway uri, typically "http://gatewayhost:gatewayport/gatewaypath".
-     */
-    public String getGatewayURI();
-    
-    /**
-     * @return The gateway host
-     */
-    public String getHost();
-    
-    /**
-     * @return The gateway port
-     */
-    public int getPort();
-    
-    /**
-     * @return The gateway path
-     */
-    public String getPath();
-    
-    /**
-     * @return the targetId that uniquely identifies this client.
-     */
-    public String getTargetId();
-
-    /**
-     * <p>Connects to the gateway server, establishing the long poll communication
-     * with the gateway server to be notified of server-side events.</p>
-     * <p>The connect is performed in two steps:
-     * <ul>
-     * <li>first, a connect message is sent to the gateway server; the gateway server
-     * will notice this is a first connect message and reply immediately with
-     * an empty response</li>
-     * <li>second, another connect message is sent to the gateway server which interprets
-     * it as a long poll request</li>
-     * </ul>
-     * The long poll request may return either because one or more server-side events
-     * happened, or because it expired. </p>
-     * <p>Any connect message after the first is treated as a long poll request.</p>
-     *
-     * @throws IOException if it is not possible to connect to the gateway server
-     * @see #disconnect()
-     */
-    public void connect() throws IOException;
-
-    /**
-     * <p>Disconnects from the gateway server.</p>
-     * <p>Just after the disconnect request is processed by to the gateway server, it will
-     * return the currently outstanding long poll request.</p>
-     * <p>If this client is not connected, it does nothing</p>
-     *
-     * @throws IOException if it is not possible to contact the gateway server to disconnect
-     * @see #connect()
-     */
-    public void disconnect() throws IOException;
-
-    /**
-     * <p>Sends a response to the gateway server.</p>
-     *
-     * @param response the response to send
-     * @throws IOException if it is not possible to contact the gateway server
-     */
-    public void deliver(RHTTPResponse response) throws IOException;
-
-    /**
-     * <p>Adds the given listener to this client.</p>
-     * @param listener the listener to add
-     * @see #removeListener(RHTTPListener)
-     */
-    public void addListener(RHTTPListener listener);
-
-    /**
-     * <p>Removes the given listener from this client.</p>
-     * @param listener the listener to remove
-     * @see #addListener(RHTTPListener)
-     */
-    public void removeListener(RHTTPListener listener);
-
-    /**
-     * <p>Adds the given client listener to this client.</p>
-     * @param listener the client listener to add
-     * @see #removeClientListener(ClientListener)
-     */
-    public void addClientListener(ClientListener listener);
-
-    /**
-     * <p>Removes the given client listener from this client.</p>
-     * @param listener the client listener to remove
-     * @see #addClientListener(ClientListener)
-     */
-    public void removeClientListener(ClientListener listener);
-}
diff --git a/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/RHTTPListener.java b/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/RHTTPListener.java
deleted file mode 100644
index 5c4aa84..0000000
--- a/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/RHTTPListener.java
+++ /dev/null
@@ -1,36 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.client;
-
-/**
- * <p>Implementations of this class listen for requests arriving from the gateway server
- * and notified by {@link RHTTPClient}.</p>
- *
- * @version $Revision$ $Date$
- */
-public interface RHTTPListener
-{
-    /**
-     * Callback method called by {@link RHTTPClient} to inform that the gateway server
-     * sent a request to the gateway client.
-     * @param request the request sent by the gateway server.
-     * @throws Exception allowed to be thrown by implementations
-     */
-    public void onRequest(RHTTPRequest request) throws Exception;
-}
diff --git a/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/RHTTPRequest.java b/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/RHTTPRequest.java
deleted file mode 100644
index c77f06a..0000000
--- a/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/RHTTPRequest.java
+++ /dev/null
@@ -1,266 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.client;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jetty.http.HttpParser;
-import org.eclipse.jetty.io.Buffer;
-import org.eclipse.jetty.io.ByteArrayBuffer;
-
-/**
- * <p>Represents the external request information that is carried over the comet protocol.</p>
- * <p>Instances of this class are converted into an opaque byte array of the form:</p>
- * <pre>
- * &lt;request-id&gt; SPACE &lt;request-length&gt; CRLF
- * &lt;external-request&gt;
- * </pre>
- * <p>The byte array form is carried as body of a normal HTTP response returned by the gateway server
- * to the gateway client.</p>
- * @see RHTTPResponse
- * @version $Revision$ $Date$
- */
-public class RHTTPRequest
-{
-    private static final String CRLF = "\r\n";
-    private static final byte[] CRLF_BYTES = CRLF.getBytes();
-
-    private final int id;
-    private final byte[] requestBytes;
-    private final byte[] frameBytes;
-    private volatile String method;
-    private volatile String uri;
-    private volatile Map<String, String> headers;
-    private volatile byte[] body;
-
-    public static List<RHTTPRequest> fromFrameBytes(byte[] bytes)
-    {
-        List<RHTTPRequest> result = new ArrayList<RHTTPRequest>();
-        int start = 0;
-        while (start < bytes.length)
-        {
-            // Scan until we find the space
-            int end = start;
-            while (bytes[end] != ' ') ++end;
-            int requestId = Integer.parseInt(new String(bytes, start, end - start));
-            start = end + 1;
-
-            // Scan until end of line
-            while (bytes[end] != '\n') ++end;
-            int length = Integer.parseInt(new String(bytes, start, end - start - 1));
-            start = end + 1;
-
-            byte[] requestBytes = new byte[length];
-            System.arraycopy(bytes, start, requestBytes, 0, length);
-            RHTTPRequest request = fromRequestBytes(requestId, requestBytes);
-            result.add(request);
-            start += length;
-        }
-        return result;
-    }
-
-    public static RHTTPRequest fromRequestBytes(int requestId, byte[] requestBytes)
-    {
-        return new RHTTPRequest(requestId, requestBytes);
-    }
-
-    public RHTTPRequest(int id, String method, String uri, Map<String, String> headers, byte[] body)
-    {
-        this.id = id;
-        this.method = method;
-        this.uri = uri;
-        this.headers = headers;
-        this.body = body;
-        this.requestBytes = toRequestBytes();
-        this.frameBytes = toFrameBytes(requestBytes);
-    }
-
-    private RHTTPRequest(int id, byte[] requestBytes)
-    {
-        this.id = id;
-        this.requestBytes = requestBytes;
-        this.frameBytes = toFrameBytes(requestBytes);
-        // Other fields are lazily initialized
-    }
-
-    private void initialize()
-    {
-        try
-        {
-            final ByteArrayOutputStream body = new ByteArrayOutputStream();
-            HttpParser parser = new HttpParser(new ByteArrayBuffer(requestBytes), new HttpParser.EventHandler()
-            {
-                @Override
-                public void startRequest(Buffer method, Buffer uri, Buffer httpVersion) throws IOException
-                {
-                    RHTTPRequest.this.method = method.toString("UTF-8");
-                    RHTTPRequest.this.uri = uri.toString("UTF-8");
-                    RHTTPRequest.this.headers = new LinkedHashMap<String, String>();
-                }
-
-                @Override
-                public void startResponse(Buffer httpVersion, int statusCode, Buffer statusMessage) throws IOException
-                {
-                }
-
-                @Override
-                public void parsedHeader(Buffer name, Buffer value) throws IOException
-                {
-                    RHTTPRequest.this.headers.put(name.toString("UTF-8"), value.toString("UTF-8"));
-                }
-
-                @Override
-                public void content(Buffer content) throws IOException
-                {
-                    content.writeTo(body);
-                }
-            });
-            parser.parse();
-            this.body = body.toByteArray();
-        }
-        catch (IOException x)
-        {
-            // Cannot happen: we're parsing from a byte[], not from an I/O stream
-            throw new AssertionError(x);
-        }
-    }
-
-    public int getId()
-    {
-        return id;
-    }
-
-    public byte[] getRequestBytes()
-    {
-        return requestBytes;
-    }
-
-    public byte[] getFrameBytes()
-    {
-        return frameBytes;
-    }
-
-    public String getMethod()
-    {
-        if (method == null)
-            initialize();
-        return method;
-    }
-
-    public String getURI()
-    {
-        if (uri == null)
-            initialize();
-        return uri;
-    }
-
-    public Map<String, String> getHeaders()
-    {
-        if (headers == null)
-            initialize();
-        return headers;
-    }
-
-    public byte[] getBody()
-    {
-        if (body == null)
-            initialize();
-        return body;
-    }
-
-    private byte[] toRequestBytes()
-    {
-        try
-        {
-            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
-            bytes.write(method.getBytes("UTF-8"));
-            bytes.write(' ');
-            bytes.write(uri.getBytes("UTF-8"));
-            bytes.write(' ');
-            bytes.write("HTTP/1.1".getBytes("UTF-8"));
-            bytes.write(CRLF_BYTES);
-            for (Map.Entry<String, String> entry : headers.entrySet())
-            {
-                bytes.write(entry.getKey().getBytes("UTF-8"));
-                bytes.write(':');
-                bytes.write(' ');
-                bytes.write(entry.getValue().getBytes("UTF-8"));
-                bytes.write(CRLF_BYTES);
-            }
-            bytes.write(CRLF_BYTES);
-            bytes.write(body);
-            bytes.close();
-            return bytes.toByteArray();
-        }
-        catch (IOException x)
-        {
-            throw new AssertionError(x);
-        }
-    }
-
-    private byte[] toFrameBytes(byte[] requestBytes)
-    {
-        try
-        {
-            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
-            bytes.write(String.valueOf(id).getBytes("UTF-8"));
-            bytes.write(' ');
-            bytes.write(String.valueOf(requestBytes.length).getBytes("UTF-8"));
-            bytes.write(CRLF_BYTES);
-            bytes.write(requestBytes);
-            bytes.close();
-            return bytes.toByteArray();
-        }
-        catch (IOException x)
-        {
-            throw new AssertionError(x);
-        }
-    }
-
-    @Override
-    public String toString()
-    {
-        // Use fields to avoid initialization
-        StringBuilder builder = new StringBuilder();
-        builder.append(id).append(" ");
-        builder.append(method).append(" ");
-        builder.append(uri).append(" ");
-        builder.append(requestBytes.length).append("/");
-        builder.append(frameBytes.length);
-        return builder.toString();
-    }
-
-    public String toLongString()
-    {
-        // Use getters to trigger initialization
-        StringBuilder builder = new StringBuilder();
-        builder.append(id).append(" ");
-        builder.append(getMethod()).append(" ");
-        builder.append(getURI()).append(CRLF);
-        for (Map.Entry<String, String> header : getHeaders().entrySet())
-            builder.append(header.getKey()).append(": ").append(header.getValue()).append(CRLF);
-        builder.append(getBody().length).append(" body bytes").append(CRLF);
-        return builder.toString();
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/RHTTPResponse.java b/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/RHTTPResponse.java
deleted file mode 100644
index f9dd30e..0000000
--- a/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/RHTTPResponse.java
+++ /dev/null
@@ -1,256 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.client;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.eclipse.jetty.http.HttpParser;
-import org.eclipse.jetty.io.Buffer;
-import org.eclipse.jetty.io.ByteArrayBuffer;
-
-/**
- * <p>Represents the resource provider response information that is carried over the comet protocol.</p>
- * <p>Instances of this class are converted into an opaque byte array of the form:</p>
- * <pre>
- * &lt;request-id&gt; SPACE &lt;response-length&gt; CRLF
- * &lt;resource-response&gt;
- * </pre>
- * <p>The byte array form is carried as body of a normal HTTP request made by the gateway client to
- * the gateway server.</p>
- * @see RHTTPRequest
- * @version $Revision$ $Date$
- */
-public class RHTTPResponse
-{
-    private static final String CRLF = "\r\n";
-    private static final byte[] CRLF_BYTES = CRLF.getBytes();
-
-    private final int id;
-    private final byte[] responseBytes;
-    private final byte[] frameBytes;
-    private volatile int code;
-    private volatile String message;
-    private volatile Map<String, String> headers;
-    private volatile byte[] body;
-
-    public static RHTTPResponse fromFrameBytes(byte[] bytes)
-    {
-        int start = 0;
-        // Scan until we find the space
-        int end = start;
-        while (bytes[end] != ' ') ++end;
-        int responseId = Integer.parseInt(new String(bytes, start, end - start));
-        start = end + 1;
-
-        // Scan until end of line
-        while (bytes[end] != '\n') ++end;
-        int length = Integer.parseInt(new String(bytes, start, end - start - 1));
-        start = end + 1;
-
-        byte[] responseBytes = new byte[length];
-        System.arraycopy(bytes, start, responseBytes, 0, length);
-        return fromResponseBytes(responseId, responseBytes);
-    }
-
-    public static RHTTPResponse fromResponseBytes(int id, byte[] responseBytes)
-    {
-        return new RHTTPResponse(id, responseBytes);
-    }
-
-    public RHTTPResponse(int id, int code, String message, Map<String, String> headers, byte[] body)
-    {
-        this.id = id;
-        this.code = code;
-        this.message = message;
-        this.headers = headers;
-        this.body = body;
-        this.responseBytes = toResponseBytes();
-        this.frameBytes = toFrameBytes(responseBytes);
-    }
-
-    private RHTTPResponse(int id, byte[] responseBytes)
-    {
-        this.id = id;
-        this.responseBytes = responseBytes;
-        this.frameBytes = toFrameBytes(responseBytes);
-        // Other fields are lazily initialized
-    }
-
-    private void initialize()
-    {
-        try
-        {
-            final ByteArrayOutputStream body = new ByteArrayOutputStream();
-            HttpParser parser = new HttpParser(new ByteArrayBuffer(responseBytes), new HttpParser.EventHandler()
-            {
-                @Override
-                public void startRequest(Buffer method, Buffer uri, Buffer httpVersion) throws IOException
-                {
-                }
-
-                @Override
-                public void startResponse(Buffer httpVersion, int statusCode, Buffer statusMessage) throws IOException
-                {
-                    RHTTPResponse.this.code = statusCode;
-                    RHTTPResponse.this.message = statusMessage.toString("UTF-8");
-                    RHTTPResponse.this.headers = new LinkedHashMap<String, String>();
-                }
-
-                @Override
-                public void parsedHeader(Buffer name, Buffer value) throws IOException
-                {
-                    RHTTPResponse.this.headers.put(name.toString("UTF-8"), value.toString("UTF-8"));
-                }
-
-                @Override
-                public void content(Buffer content) throws IOException
-                {
-                    content.writeTo(body);
-                }
-            });
-            parser.parse();
-            this.body = body.toByteArray();
-        }
-        catch (IOException x)
-        {
-            // Cannot happen: we're parsing from a byte[], not from an I/O stream
-            throw new AssertionError(x);
-        }
-    }
-
-    public int getId()
-    {
-        return id;
-    }
-
-    public byte[] getResponseBytes()
-    {
-        return responseBytes;
-    }
-
-    public byte[] getFrameBytes()
-    {
-        return frameBytes;
-    }
-
-    public int getStatusCode()
-    {
-        if (code == 0)
-            initialize();
-        return code;
-    }
-
-    public String getStatusMessage()
-    {
-        if (message == null)
-            initialize();
-        return message;
-    }
-
-    public Map<String, String> getHeaders()
-    {
-        if (headers == null)
-            initialize();
-        return headers;
-    }
-
-    public byte[] getBody()
-    {
-        if (body == null)
-            initialize();
-        return body;
-    }
-
-    private byte[] toResponseBytes()
-    {
-        try
-        {
-            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
-            bytes.write("HTTP/1.1".getBytes("UTF-8"));
-            bytes.write(' ');
-            bytes.write(String.valueOf(code).getBytes("UTF-8"));
-            bytes.write(' ');
-            bytes.write(message.getBytes("UTF-8"));
-            bytes.write(CRLF_BYTES);
-            for (Map.Entry<String, String> entry : headers.entrySet())
-            {
-                bytes.write(entry.getKey().getBytes("UTF-8"));
-                bytes.write(':');
-                bytes.write(' ');
-                bytes.write(entry.getValue().getBytes("UTF-8"));
-                bytes.write(CRLF_BYTES);
-            }
-            bytes.write(CRLF_BYTES);
-            bytes.write(body);
-            bytes.close();
-            return bytes.toByteArray();
-        }
-        catch (IOException x)
-        {
-            throw new AssertionError(x);
-        }
-    }
-
-    private byte[] toFrameBytes(byte[] responseBytes)
-    {
-        try
-        {
-            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
-            bytes.write(String.valueOf(id).getBytes("UTF-8"));
-            bytes.write(' ');
-            bytes.write(String.valueOf(responseBytes.length).getBytes("UTF-8"));
-            bytes.write(CRLF_BYTES);
-            bytes.write(responseBytes);
-            return bytes.toByteArray();
-        }
-        catch (IOException x)
-        {
-            throw new AssertionError(x);
-        }
-    }
-
-    @Override
-    public String toString()
-    {
-        // Use fields to avoid initialization
-        StringBuilder builder = new StringBuilder();
-        builder.append(id).append(" ");
-        builder.append(code).append(" ");
-        builder.append(message).append(" ");
-        builder.append(responseBytes.length).append("/");
-        builder.append(frameBytes.length);
-        return builder.toString();
-    }
-
-    public String toLongString()
-    {
-        // Use getters to trigger initialization
-        StringBuilder builder = new StringBuilder();
-        builder.append(id).append(" ");
-        builder.append(getStatusCode()).append(" ");
-        builder.append(getStatusMessage()).append(CRLF);
-        for (Map.Entry<String, String> header : getHeaders().entrySet())
-            builder.append(header.getKey()).append(": ").append(header.getValue()).append(CRLF);
-        builder.append(getBody().length).append(" body bytes").append(CRLF);
-        return builder.toString();
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/RetryingApacheClient.java b/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/RetryingApacheClient.java
deleted file mode 100644
index 45f8d8e..0000000
--- a/jetty-rhttp/jetty-rhttp-client/src/main/java/org/eclipse/jetty/rhttp/client/RetryingApacheClient.java
+++ /dev/null
@@ -1,112 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.client;
-
-import java.io.IOException;
-
-import org.apache.http.client.HttpClient;
-
-/**
- * @version $Revision$ $Date$
- */
-public class RetryingApacheClient extends ApacheClient
-{
-    public RetryingApacheClient(HttpClient httpClient, String gatewayURI, String targetId)
-    {
-        super(httpClient, gatewayURI, targetId);
-        addClientListener(new RetryClientListener());
-    }
-
-    @Override
-    protected void syncHandshake() throws IOException
-    {
-        while (true)
-        {
-            try
-            {
-                super.syncHandshake();
-                break;
-            }
-            catch (IOException x)
-            {
-                getLogger().debug("Handshake failed, backing off and retrying");
-                try
-                {
-                    Thread.sleep(1000);
-                }
-                catch (InterruptedException xx)
-                {
-                    throw (IOException)new IOException().initCause(xx);
-                }
-            }
-        }
-    }
-
-    private class RetryClientListener implements ClientListener
-    {
-        public void connectRequired()
-        {
-            getLogger().debug("Connect requested by server");
-            try
-            {
-                connect();
-            }
-            catch (IOException x)
-            {
-                // The connect() method is retried, so if it fails, it's a hard failure
-                getLogger().debug("Connect failed after server required connect, giving up");
-            }
-        }
-
-        public void connectClosed()
-        {
-            connectException();
-        }
-
-        public void connectException()
-        {
-            getLogger().debug("Connect failed, backing off and retrying");
-            try
-            {
-                Thread.sleep(1000);
-                asyncConnect();
-            }
-            catch (InterruptedException x)
-            {
-                // Ignore and stop retrying
-                Thread.currentThread().interrupt();
-            }
-        }
-
-        public void deliverException(RHTTPResponse response)
-        {
-            getLogger().debug("Deliver failed, backing off and retrying");
-            try
-            {
-                Thread.sleep(1000);
-                asyncDeliver(response);
-            }
-            catch (InterruptedException x)
-            {
-                // Ignore and stop retrying
-                Thread.currentThread().interrupt();
-            }
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-client/src/test/java/org/eclipse/jetty/rhttp/client/ApacheClientTest.java b/jetty-rhttp/jetty-rhttp-client/src/test/java/org/eclipse/jetty/rhttp/client/ApacheClientTest.java
deleted file mode 100644
index dc4a1c4..0000000
--- a/jetty-rhttp/jetty-rhttp-client/src/test/java/org/eclipse/jetty/rhttp/client/ApacheClientTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.client;
-
-import java.io.IOException;
-
-import org.apache.http.HttpHost;
-import org.apache.http.client.HttpRequestRetryHandler;
-import org.apache.http.conn.ClientConnectionManager;
-import org.apache.http.conn.scheme.PlainSocketFactory;
-import org.apache.http.conn.scheme.Scheme;
-import org.apache.http.conn.scheme.SchemeRegistry;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
-import org.apache.http.params.BasicHttpParams;
-import org.apache.http.params.HttpParams;
-import org.apache.http.protocol.HttpContext;
-import org.eclipse.jetty.rhttp.client.ApacheClient;
-import org.eclipse.jetty.rhttp.client.RHTTPClient;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.StdErrLog;
-
-
-/**
- * @version $Revision$ $Date$
- */
-public class ApacheClientTest extends ClientTest
-{
-    {
-        ((StdErrLog)Log.getLog()).setHideStacks(!Log.getLog().isDebugEnabled());
-    }
-    
-    private ClientConnectionManager connectionManager;
-
-    protected RHTTPClient createClient(int port, String targetId) throws Exception
-    {
-        SchemeRegistry schemeRegistry = new SchemeRegistry();
-        schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), port));
-        connectionManager = new ThreadSafeClientConnManager(new BasicHttpParams(), schemeRegistry);
-        HttpParams httpParams = new BasicHttpParams();
-        httpParams.setParameter("http.default-host", new HttpHost("localhost", port));
-        DefaultHttpClient httpClient = new DefaultHttpClient(connectionManager, httpParams);
-        httpClient.setHttpRequestRetryHandler(new NoRetryHandler());
-        return new ApacheClient(httpClient, "", targetId);
-    }
-
-    protected void destroyClient(RHTTPClient client) throws Exception
-    {
-        connectionManager.shutdown();
-    }
-
-    private class NoRetryHandler implements HttpRequestRetryHandler
-    {
-        public boolean retryRequest(IOException x, int failedAttempts, HttpContext httpContext)
-        {
-            return false;
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-client/src/test/java/org/eclipse/jetty/rhttp/client/ClientTest.java b/jetty-rhttp/jetty-rhttp-client/src/test/java/org/eclipse/jetty/rhttp/client/ClientTest.java
deleted file mode 100644
index 5412ac7..0000000
--- a/jetty-rhttp/jetty-rhttp-client/src/test/java/org/eclipse/jetty/rhttp/client/ClientTest.java
+++ /dev/null
@@ -1,299 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.client;
-
-import java.io.IOException;
-import java.util.LinkedHashMap;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jetty.rhttp.client.ClientListener;
-import org.eclipse.jetty.rhttp.client.RHTTPClient;
-import org.eclipse.jetty.rhttp.client.RHTTPResponse;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.bio.SocketConnector;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
-import org.eclipse.jetty.util.log.Log;
-
-
-/**
- * @version $Revision$ $Date$
- */
-public abstract class ClientTest extends TestCase
-{
-    protected abstract RHTTPClient createClient(int port, String targetId) throws Exception;
-
-    protected abstract void destroyClient(RHTTPClient client) throws Exception;
-
-    public void testConnectNoServer() throws Exception
-    {
-        RHTTPClient client = createClient(8080, "test1");
-        try
-        {
-            client.connect();
-            fail();
-        }
-        catch (IOException x)
-        {
-        }
-        finally
-        {
-            destroyClient(client);
-        }
-    }
-
-    public void testServerExceptionOnHandshake() throws Exception
-    {
-        final CountDownLatch serverLatch = new CountDownLatch(1);
-
-        Server server = new Server();
-        Connector connector = new SelectChannelConnector();
-        server.addConnector(connector);
-        server.setHandler(new AbstractHandler()
-        {
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException, ServletException
-            {
-                request.setHandled(true);
-                if (target.endsWith("/handshake"))
-                {
-                    serverLatch.countDown();
-                    throw new TestException();
-                }
-            }
-        });
-        server.start();
-        try
-        {
-            RHTTPClient client = createClient(connector.getLocalPort(), "test2");
-            try
-            {
-                try
-                {
-                    client.connect();
-                    fail();
-                }
-                catch (IOException x)
-                {
-                }
-
-                assertTrue(serverLatch.await(1000, TimeUnit.MILLISECONDS));
-            }
-            finally
-            {
-                destroyClient(client);
-            }
-        }
-        finally
-        {
-            server.stop();
-        }
-    }
-
-    public void testServerExceptionOnConnect() throws Exception
-    {
-        final CountDownLatch serverLatch = new CountDownLatch(1);
-
-        Server server = new Server();
-        Connector connector = new SelectChannelConnector();
-        server.addConnector(connector);
-        server.setHandler(new AbstractHandler()
-        {
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException, ServletException
-            {
-                request.setHandled(true);
-                if (target.endsWith("/connect"))
-                {
-                    serverLatch.countDown();
-                    throw new TestException();
-                }
-            }
-        });
-        server.start();
-        try
-        {
-            RHTTPClient client = createClient(connector.getLocalPort(), "test3");
-            try
-            {
-                final CountDownLatch connectLatch = new CountDownLatch(1);
-                client.addClientListener(new ClientListener.Adapter()
-                {
-                    @Override
-                    public void connectException()
-                    {
-                        connectLatch.countDown();
-                    }
-                });
-                client.connect();
-
-                assertTrue(serverLatch.await(1000, TimeUnit.MILLISECONDS));
-                assertTrue(connectLatch.await(1000, TimeUnit.MILLISECONDS));
-            }
-            finally
-            {
-                destroyClient(client);
-            }
-        }
-        finally
-        {
-            server.stop();
-        }
-    }
-
-    public void testServerExceptionOnDeliver() throws Exception
-    {
-        final CountDownLatch serverLatch = new CountDownLatch(1);
-
-        Server server = new Server();
-        Connector connector = new SelectChannelConnector();
-        server.addConnector(connector);
-        server.setHandler(new AbstractHandler()
-        {
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException, ServletException
-            {
-                request.setHandled(true);
-                if (target.endsWith("/connect"))
-                {
-                    serverLatch.countDown();
-                    try
-                    {
-                        // Simulate a long poll timeout
-                        Thread.sleep(10000);
-                    }
-                    catch (InterruptedException x)
-                    {
-                        Thread.currentThread().interrupt();
-                    }
-                }
-                else if (target.endsWith("/deliver"))
-                {
-                    // Throw an exception on deliver
-                    throw new TestException();
-                }
-            }
-        });
-        server.start();
-        try
-        {
-            RHTTPClient client = createClient(connector.getLocalPort(), "test4");
-            try
-            {
-                final CountDownLatch deliverLatch = new CountDownLatch(1);
-                client.addClientListener(new ClientListener.Adapter()
-                {
-                    @Override
-                    public void deliverException(RHTTPResponse response)
-                    {
-                        deliverLatch.countDown();
-                    }
-                });
-                client.connect();
-
-                assertTrue(serverLatch.await(1000, TimeUnit.MILLISECONDS));
-
-                client.deliver(new RHTTPResponse(1, 200, "OK", new LinkedHashMap<String, String>(), new byte[0]));
-
-                assertTrue(deliverLatch.await(1000, TimeUnit.MILLISECONDS));
-            }
-            finally
-            {
-                destroyClient(client);
-            }
-        }
-        finally
-        {
-            server.stop();
-        }
-    }
-
-    public void testServerShutdownAfterConnect() throws Exception
-    {
-        final CountDownLatch connectLatch = new CountDownLatch(1);
-        final CountDownLatch stopLatch = new CountDownLatch(1);
-
-        Server server = new Server();
-        Connector connector = new SocketConnector();
-        server.addConnector(connector);
-        server.setHandler(new AbstractHandler()
-        {
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException, ServletException
-            {
-                request.setHandled(true);
-                if (target.endsWith("/connect"))
-                {
-                    connectLatch.countDown();
-                    try
-                    {
-                        Thread.sleep(10000);
-                    }
-                    catch (InterruptedException e)
-                    {
-                        stopLatch.countDown();
-                    }
-                }
-            }
-        });
-        server.start();
-        try
-        {
-            RHTTPClient client = createClient(connector.getLocalPort(), "test5");
-            try
-            {
-                final CountDownLatch serverLatch = new CountDownLatch(1);
-                client.addClientListener(new ClientListener.Adapter()
-                {
-                    @Override
-                    public void connectClosed()
-                    {
-                        serverLatch.countDown();
-                    }
-                });
-                client.connect();
-
-                assertTrue(connectLatch.await(2000, TimeUnit.MILLISECONDS));
-
-                server.stop();
-                assertTrue(stopLatch.await(2000, TimeUnit.MILLISECONDS));
-
-                assertTrue(serverLatch.await(2000, TimeUnit.MILLISECONDS));
-            }
-            finally
-            {
-                destroyClient(client);
-            }
-        }
-        finally
-        {
-            server.stop();
-        }
-    }
-    
-    public static class TestException extends NullPointerException
-    {
-        
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-client/src/test/java/org/eclipse/jetty/rhttp/client/JettyClientTest.java b/jetty-rhttp/jetty-rhttp-client/src/test/java/org/eclipse/jetty/rhttp/client/JettyClientTest.java
deleted file mode 100644
index 761f000..0000000
--- a/jetty-rhttp/jetty-rhttp-client/src/test/java/org/eclipse/jetty/rhttp/client/JettyClientTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.client;
-
-import org.eclipse.jetty.client.Address;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.rhttp.client.JettyClient;
-import org.eclipse.jetty.rhttp.client.RHTTPClient;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.StdErrLog;
-
-
-/**
- * @version $Revision$ $Date$
- */
-public class JettyClientTest extends ClientTest
-{
-    {
-        ((StdErrLog)Log.getLog()).setHideStacks(!Log.getLog().isDebugEnabled());
-    }
-    
-    private HttpClient httpClient;
-
-    protected RHTTPClient createClient(int port, String targetId) throws Exception
-    {
-        ((StdErrLog)Log.getLog()).setSource(true);
-        httpClient = new HttpClient();
-        httpClient.start();
-        return new JettyClient(httpClient, new Address("localhost", port), "", targetId);
-    }
-
-    protected void destroyClient(RHTTPClient client) throws Exception
-    {
-        httpClient.stop();
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-client/src/test/java/org/eclipse/jetty/rhttp/client/RequestTest.java b/jetty-rhttp/jetty-rhttp-client/src/test/java/org/eclipse/jetty/rhttp/client/RequestTest.java
deleted file mode 100644
index 8fbf735..0000000
--- a/jetty-rhttp/jetty-rhttp-client/src/test/java/org/eclipse/jetty/rhttp/client/RequestTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.client;
-
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jetty.rhttp.client.RHTTPRequest;
-
-import junit.framework.TestCase;
-
-/**
- * @version $Revision$ $Date$
- */
-public class RequestTest extends TestCase
-{
-    public void testRequestConversions() throws Exception
-    {
-        int id = 1;
-        String method = "GET";
-        String uri = "/test";
-        Map<String, String> headers = new LinkedHashMap<String, String>();
-        headers.put("X", "X");
-        headers.put("Y", "Y");
-        headers.put("Z", "Z");
-        byte[] body = "BODY".getBytes("UTF-8");
-        headers.put("Content-Length", String.valueOf(body.length));
-        RHTTPRequest request1 = new RHTTPRequest(id, method, uri, headers, body);
-        byte[] requestBytes1 = request1.getRequestBytes();
-        RHTTPRequest request2 = RHTTPRequest.fromRequestBytes(id, requestBytes1);
-        assertEquals(id, request2.getId());
-        assertEquals(method, request2.getMethod());
-        assertEquals(uri, request2.getURI());
-        assertEquals(headers, request2.getHeaders());
-        assertTrue(Arrays.equals(request2.getBody(), body));
-
-        byte[] requestBytes2 = request2.getRequestBytes();
-        assertTrue(Arrays.equals(requestBytes1, requestBytes2));
-    }
-
-    public void testFrameConversions() throws Exception
-    {
-        int id = 1;
-        String method = "GET";
-        String uri = "/test";
-        Map<String, String> headers = new LinkedHashMap<String, String>();
-        headers.put("X", "X");
-        headers.put("Y", "Y");
-        headers.put("Z", "Z");
-        byte[] body = "BODY".getBytes("UTF-8");
-        headers.put("Content-Length", String.valueOf(body.length));
-        RHTTPRequest request1 = new RHTTPRequest(id, method, uri, headers, body);
-        byte[] frameBytes1 = request1.getFrameBytes();
-        List<RHTTPRequest> requests = RHTTPRequest.fromFrameBytes(frameBytes1);
-        assertNotNull(requests);
-        assertEquals(1, requests.size());
-        RHTTPRequest request2 = requests.get(0);
-        assertEquals(id, request2.getId());
-        assertEquals(method, request2.getMethod());
-        assertEquals(uri, request2.getURI());
-        assertEquals(headers, request2.getHeaders());
-        assertTrue(Arrays.equals(request2.getBody(), body));
-
-        byte[] frameBytes2 = request2.getFrameBytes();
-        assertTrue(Arrays.equals(frameBytes1, frameBytes2));
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-client/src/test/java/org/eclipse/jetty/rhttp/client/ResponseTest.java b/jetty-rhttp/jetty-rhttp-client/src/test/java/org/eclipse/jetty/rhttp/client/ResponseTest.java
deleted file mode 100644
index c2e90f9..0000000
--- a/jetty-rhttp/jetty-rhttp-client/src/test/java/org/eclipse/jetty/rhttp/client/ResponseTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.client;
-
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.eclipse.jetty.rhttp.client.RHTTPResponse;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.StdErrLog;
-
-import junit.framework.TestCase;
-
-/**
- * @version $Revision$ $Date$
- */
-public class ResponseTest extends TestCase
-{
-    {
-        ((StdErrLog)Log.getLog()).setHideStacks(!Log.getLog().isDebugEnabled());
-    }
-    
-    public void testResponseConversions() throws Exception
-    {
-        int id = 1;
-        int statusCode = 200;
-        String statusMessage = "OK";
-        Map<String, String> headers = new LinkedHashMap<String, String>();
-        headers.put("X", "X");
-        headers.put("Y", "Y");
-        headers.put("Z", "Z");
-        byte[] body = "BODY".getBytes("UTF-8");
-        RHTTPResponse response1 = new RHTTPResponse(id, statusCode, statusMessage, headers, body);
-        byte[] responseBytes1 = response1.getResponseBytes();
-        RHTTPResponse response2 = RHTTPResponse.fromResponseBytes(id, responseBytes1);
-        assertEquals(id, response2.getId());
-        assertEquals(statusCode, response2.getStatusCode());
-        assertEquals(statusMessage, response2.getStatusMessage());
-        assertEquals(headers, response2.getHeaders());
-        assertTrue(Arrays.equals(response2.getBody(), body));
-
-        byte[] responseBytes2 = response2.getResponseBytes();
-        assertTrue(Arrays.equals(responseBytes1, responseBytes2));
-    }
-
-    public void testFrameConversions() throws Exception
-    {
-        int id = 1;
-        int statusCode = 200;
-        String statusMessage = "OK";
-        Map<String, String> headers = new LinkedHashMap<String, String>();
-        headers.put("X", "X");
-        headers.put("Y", "Y");
-        headers.put("Z", "Z");
-        byte[] body = "BODY".getBytes("UTF-8");
-        RHTTPResponse response1 = new RHTTPResponse(id, statusCode, statusMessage, headers, body);
-        byte[] frameBytes1 = response1.getFrameBytes();
-        RHTTPResponse response2 = RHTTPResponse.fromFrameBytes(frameBytes1);
-        assertEquals(id, response2.getId());
-        assertEquals(statusCode, response2.getStatusCode());
-        assertEquals(response2.getStatusMessage(), statusMessage);
-        assertEquals(headers, response2.getHeaders());
-        assertTrue(Arrays.equals(response2.getBody(), body));
-
-        byte[] frameBytes2 = response2.getFrameBytes();
-        assertTrue(Arrays.equals(frameBytes1, frameBytes2));
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-connector/pom.xml b/jetty-rhttp/jetty-rhttp-connector/pom.xml
deleted file mode 100644
index b248c48..0000000
--- a/jetty-rhttp/jetty-rhttp-connector/pom.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/xsd/maven-4.0.0.xsd">
-  <parent>
-    <groupId>org.eclipse.jetty.rhttp</groupId>
-    <artifactId>jetty-rhttp-project</artifactId>
-    <version>9.0.0-SNAPSHOT</version>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>reverse-http-connector</artifactId>
-  <packaging>jar</packaging>
-  <name>Jetty :: Reverse HTTP :: Connector</name>
-
-  <properties>
-      <bundle-symbolic-name>${project.groupId}.rhttp.connector</bundle-symbolic-name>
-  </properties>
-
-  <build>
-      <plugins>
-          <plugin>
-              <groupId>org.codehaus.mojo</groupId>
-              <artifactId>exec-maven-plugin</artifactId>
-              <configuration>
-                <classpathScope>test</classpathScope>
-                <mainClass>org.eclipse.jetty.rhttp.connector.TestReverseServer</mainClass>
-              </configuration>
-          </plugin>
-          <plugin>
-              <groupId>org.apache.felix</groupId>
-              <artifactId>maven-bundle-plugin</artifactId>
-              <extensions>true</extensions>
-              <executions>
-                  <execution>
-                      <goals>
-                          <goal>manifest</goal>
-                      </goals>
-                      <configuration>
-                          <instructions>
-                               <Import-Package>*</Import-Package>
-                          </instructions>
-                        </configuration>
-                     </execution>
-                </executions>
-            </plugin>
-            <plugin>
-              <!--
-              Required for OSGI
-              -->
-              <groupId>org.apache.maven.plugins</groupId>
-              <artifactId>maven-jar-plugin</artifactId>
-              <configuration>
-                  <archive>
-                      <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-                  </archive>
-              </configuration>
-            </plugin>
-      </plugins>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>reverse-http-client</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-io</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>example-jetty-embedded</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty.toolchain</groupId>
-      <artifactId>jetty-test-helper</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>javax.servlet-api</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-</project>
diff --git a/jetty-rhttp/jetty-rhttp-connector/src/main/config/etc/jetty-rhttp.xml b/jetty-rhttp/jetty-rhttp-connector/src/main/config/etc/jetty-rhttp.xml
deleted file mode 100644
index 2141794..0000000
--- a/jetty-rhttp/jetty-rhttp-connector/src/main/config/etc/jetty-rhttp.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
-<!-- =============================================================== -->
-<!-- Configure the Jetty Reverse HTTP Connector                      -->
-<!-- =============================================================== -->
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-  <Call name="addConnector">
-    <Arg>
-      <New class="org.eclipse.jetty.rhttp.connector.ReverseHTTPConnector">
-        <New class="org.eclipse.jetty.rhttp.client.JettyClient">
-	  <Arg>
-	    <New class="HttpClient">
-	    </New>
-	  </Arg>
-	  <Arg>http://localhost:8888/</Arg>
-	  <Arg>nodeA</Arg>
-        </New>
-      </New>
-    </Arg>
-  </Call>
-</Configure>
diff --git a/jetty-rhttp/jetty-rhttp-connector/src/main/java/org/eclipse/jetty/rhttp/connector/ReverseHTTPConnector.java b/jetty-rhttp/jetty-rhttp-connector/src/main/java/org/eclipse/jetty/rhttp/connector/ReverseHTTPConnector.java
deleted file mode 100644
index 895ba43..0000000
--- a/jetty-rhttp/jetty-rhttp-connector/src/main/java/org/eclipse/jetty/rhttp/connector/ReverseHTTPConnector.java
+++ /dev/null
@@ -1,170 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.connector;
-
-import java.io.IOException;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-
-import org.eclipse.jetty.io.ByteArrayEndPoint;
-import org.eclipse.jetty.io.Connection;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.rhttp.client.RHTTPClient;
-import org.eclipse.jetty.rhttp.client.RHTTPListener;
-import org.eclipse.jetty.rhttp.client.RHTTPRequest;
-import org.eclipse.jetty.rhttp.client.RHTTPResponse;
-import org.eclipse.jetty.server.AbstractConnector;
-import org.eclipse.jetty.server.AbstractHttpConnection;
-import org.eclipse.jetty.server.BlockingHttpConnection;
-import org.eclipse.jetty.util.component.LifeCycle;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/**
- * An implementation of a Jetty connector that uses a {@link RHTTPClient} connected
- * to a gateway server to receive requests, feed them to the Jetty server, and
- * forward responses from the Jetty server to the gateway server.
- *
- * @version $Revision$ $Date$
- */
-public class ReverseHTTPConnector extends AbstractConnector implements RHTTPListener
-{
-    private static final Logger LOG = Log.getLogger(ReverseHTTPConnector.class);
-
-    private final BlockingQueue<RHTTPRequest> requests = new LinkedBlockingQueue<RHTTPRequest>();
-    private final RHTTPClient client;
-
-    public ReverseHTTPConnector(RHTTPClient client)
-    {
-        this.client = client;
-        super.setHost(client.getHost());
-        super.setPort(client.getPort());
-    }
-
-    @Override
-    public void setHost(String host)
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public void setPort(int port)
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    protected void doStart() throws Exception
-    {
-        if (client instanceof LifeCycle)
-            ((LifeCycle)client).start();
-        super.doStart();
-        client.connect();
-    }
-
-    @Override
-    protected void doStop() throws Exception
-    {
-        client.disconnect();
-        super.doStop();
-        if (client instanceof LifeCycle)
-            ((LifeCycle)client).stop();
-    }
-
-    public void open()
-    {
-        client.addListener(this);
-    }
-
-    public void close()
-    {
-        client.removeListener(this);
-    }
-
-    public int getLocalPort()
-    {
-        return -1;
-    }
-
-    public Object getConnection()
-    {
-        return this;
-    }
-
-    @Override
-    protected void accept(int acceptorId) throws IOException, InterruptedException
-    {
-        RHTTPRequest request = requests.take();
-        IncomingRequest incomingRequest = new IncomingRequest(request);
-        getThreadPool().dispatch(incomingRequest);
-    }
-
-    @Override
-    public void persist(EndPoint endpoint) throws IOException
-    {
-        // Signals that the connection should not be closed
-        // Do nothing in this case, as we run from memory
-    }
-
-    public void onRequest(RHTTPRequest request) throws Exception
-    {
-        requests.add(request);
-    }
-
-    private class IncomingRequest implements Runnable
-    {
-        private final RHTTPRequest request;
-
-        private IncomingRequest(RHTTPRequest request)
-        {
-            this.request = request;
-        }
-
-        public void run()
-        {
-            byte[] requestBytes = request.getRequestBytes();
-
-            ByteArrayEndPoint endPoint = new ByteArrayEndPoint(requestBytes, 1024);
-            endPoint.setGrowOutput(true);
-
-            AbstractHttpConnection connection = new BlockingHttpConnection(ReverseHTTPConnector.this, endPoint, getServer());
-            
-            connectionOpened(connection);
-            try
-            {
-                // Loop over the whole content, since handle() only
-                // reads up to the connection buffer's capacities
-                while (endPoint.getIn().length() > 0)
-                    connection.handle();
-
-                byte[] responseBytes = endPoint.getOut().asArray();
-                RHTTPResponse response = RHTTPResponse.fromResponseBytes(request.getId(), responseBytes);
-                client.deliver(response);
-            }
-            catch (Exception x)
-            {
-                LOG.debug(x);
-            }
-            finally
-            {
-                connectionClosed(connection);
-            }
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-connector/src/test/java/org/eclipse/jetty/rhttp/connector/ReverseHTTPConnectorTest.java b/jetty-rhttp/jetty-rhttp-connector/src/test/java/org/eclipse/jetty/rhttp/connector/ReverseHTTPConnectorTest.java
deleted file mode 100644
index 9944663..0000000
--- a/jetty-rhttp/jetty-rhttp-connector/src/test/java/org/eclipse/jetty/rhttp/connector/ReverseHTTPConnectorTest.java
+++ /dev/null
@@ -1,187 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.connector;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jetty.rhttp.client.ClientListener;
-import org.eclipse.jetty.rhttp.client.RHTTPClient;
-import org.eclipse.jetty.rhttp.client.RHTTPListener;
-import org.eclipse.jetty.rhttp.client.RHTTPRequest;
-import org.eclipse.jetty.rhttp.client.RHTTPResponse;
-import org.eclipse.jetty.rhttp.connector.ReverseHTTPConnector;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-
-/**
- * @version $Revision$ $Date$
- */
-public class ReverseHTTPConnectorTest extends TestCase
-{
-    public void testGatewayConnectorWithoutRequestBody() throws Exception
-    {
-        testGatewayConnector(false);
-    }
-
-    public void testGatewayConnectorWithRequestBody() throws Exception
-    {
-        testGatewayConnector(true);
-    }
-
-    private void testGatewayConnector(boolean withRequestBody) throws Exception
-    {
-        Server server = new Server();
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        CountDownLatch clientLatch = new CountDownLatch(1);
-        AtomicReference<RHTTPResponse> responseRef = new AtomicReference<RHTTPResponse>();
-        ReverseHTTPConnector connector = new ReverseHTTPConnector(new TestClient(clientLatch, responseRef));
-        server.addConnector(connector);
-        final String method = "POST";
-        final String uri = "/test";
-        final byte[] requestBody = withRequestBody ? "REQUEST-BODY".getBytes("UTF-8") : new byte[0];
-        final int statusCode = HttpServletResponse.SC_CREATED;
-        final String headerName = "foo";
-        final String headerValue = "bar";
-        final byte[] responseBody = "RESPONSE-BODY".getBytes("UTF-8");
-        server.setHandler(new AbstractHandler()
-        {
-            public void handle(String pathInfo, org.eclipse.jetty.server.Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException, ServletException
-            {
-                assertEquals(method, httpRequest.getMethod());
-                assertEquals(uri, httpRequest.getRequestURI());
-                assertEquals(headerValue, httpRequest.getHeader(headerName));
-                ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                InputStream input = httpRequest.getInputStream();
-                int read;
-                while ((read = input.read()) >= 0)
-                    baos.write(read);
-                baos.close();
-                assertTrue(Arrays.equals(requestBody, baos.toByteArray()));
-
-                httpResponse.setStatus(statusCode);
-                httpResponse.setHeader(headerName, headerValue);
-                OutputStream output = httpResponse.getOutputStream();
-                output.write(responseBody);
-                output.flush();
-                request.setHandled(true);
-                handlerLatch.countDown();
-            }
-        });
-        server.start();
-
-        HashMap<String, String> headers = new HashMap<String, String>();
-        headers.put("Host", "localhost");
-        headers.put(headerName, headerValue);
-        headers.put("Content-Length", String.valueOf(requestBody.length));
-        RHTTPRequest request = new RHTTPRequest(1, method, uri, headers, requestBody);
-        request = RHTTPRequest.fromRequestBytes(request.getId(), request.getRequestBytes());
-        connector.onRequest(request);
-
-        assertTrue(handlerLatch.await(1000, TimeUnit.MILLISECONDS));
-        assertTrue(clientLatch.await(1000, TimeUnit.MILLISECONDS));
-        RHTTPResponse response = responseRef.get();
-        assertEquals(request.getId(), response.getId());
-        assertEquals(statusCode, response.getStatusCode());
-        assertEquals(headerValue, response.getHeaders().get(headerName));
-        assertTrue(Arrays.equals(response.getBody(), responseBody));
-    }
-
-    private class TestClient implements RHTTPClient
-    {
-        private final CountDownLatch latch;
-        private final AtomicReference<RHTTPResponse> responseRef;
-
-        private TestClient(CountDownLatch latch, AtomicReference<RHTTPResponse> response)
-        {
-            this.latch = latch;
-            this.responseRef = response;
-        }
-
-        public String getTargetId()
-        {
-            return null;
-        }
-
-        public void connect() throws IOException
-        {
-        }
-
-        public void disconnect() throws IOException
-        {
-        }
-
-        public void deliver(RHTTPResponse response) throws IOException
-        {
-            responseRef.set(response);
-            latch.countDown();
-        }
-
-        public void addListener(RHTTPListener listener)
-        {
-        }
-
-        public void removeListener(RHTTPListener listener)
-        {
-        }
-
-        public void addClientListener(ClientListener listener)
-        {
-        }
-
-        public void removeClientListener(ClientListener listener)
-        {
-        }
-
-        public String getHost()
-        {
-            return null;
-        }
-
-        public int getPort()
-        {
-            return 0;
-        }
-
-        public String getGatewayURI()
-        {
-            // TODO Auto-generated method stub
-            return null;
-        }
-
-        public String getPath()
-        {
-            // TODO Auto-generated method stub
-            return null;
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-connector/src/test/java/org/eclipse/jetty/rhttp/connector/TestReverseServer.java b/jetty-rhttp/jetty-rhttp-connector/src/test/java/org/eclipse/jetty/rhttp/connector/TestReverseServer.java
deleted file mode 100644
index 8ff8107..0000000
--- a/jetty-rhttp/jetty-rhttp-connector/src/test/java/org/eclipse/jetty/rhttp/connector/TestReverseServer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.connector;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.embedded.HelloHandler;
-import org.eclipse.jetty.rhttp.client.JettyClient;
-import org.eclipse.jetty.rhttp.client.RHTTPClient;
-import org.eclipse.jetty.rhttp.connector.ReverseHTTPConnector;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.util.log.Log;
-
-/**
- * A Test content server that uses a {@link ReverseHTTPConnector}.
- * The main of this class starts 3 TestReversionServers with IDs A, B and C.
- */
-public class TestReverseServer extends Server
-{
-    TestReverseServer(String targetId)
-    {
-        setHandler(new HelloHandler("Hello "+targetId,"Hi from "+targetId));
-        
-        HttpClient httpClient = new HttpClient();
-        RHTTPClient client = new JettyClient(httpClient,"http://localhost:8080/__rhttp",targetId);
-        ReverseHTTPConnector connector = new ReverseHTTPConnector(client);
-        
-        addConnector(connector);
-    }
-    
-    public static void main(String... args) throws Exception
-    {
-        Log.getLogger("org.mortbay.jetty.rhttp.client").setDebugEnabled(true);
-        
-        TestReverseServer[] node = new TestReverseServer[] { new TestReverseServer("A"),new TestReverseServer("B"),new TestReverseServer("C") };
-        
-        for (TestReverseServer s : node)
-            s.start();
-
-        for (TestReverseServer s : node)
-            s.join();
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/pom.xml b/jetty-rhttp/jetty-rhttp-gateway/pom.xml
deleted file mode 100644
index 054bbd5..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/pom.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.eclipse.jetty.rhttp</groupId>
-        <artifactId>jetty-rhttp-project</artifactId>
-        <version>9.0.0-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>reverse-http-gateway</artifactId>
-    <packaging>jar</packaging>
-    <name>Jetty :: Reverse HTTP :: Gateway</name>
-
-    <properties>
-        <bundle-symbolic-name>${project.groupId}.rhttp.gateway</bundle-symbolic-name>
-    </properties>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>exec-maven-plugin</artifactId>
-                <configuration>
-                  <mainClass>org.mortbay.jetty.rhttp.gateway.Main</mainClass>
-                  <arguments>
-                  </arguments>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>manifest</goal>
-                        </goals>
-                        <configuration>
-                            <instructions>
-                                 <Import-Package>*</Import-Package>
-                            </instructions>
-                          </configuration>
-                       </execution>
-                  </executions>
-            </plugin>
-            <plugin>
-              <!--
-              Required for OSGI
-              -->
-              <groupId>org.apache.maven.plugins</groupId>
-              <artifactId>maven-jar-plugin</artifactId>
-              <configuration>
-                  <archive>
-                      <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-                  </archive>
-              </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>reverse-http-client</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-io</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-continuation</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-server</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-servlet</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-client</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.toolchain</groupId>
-            <artifactId>jetty-test-helper</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/ClientDelegate.java b/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/ClientDelegate.java
deleted file mode 100644
index 192bf1f..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/ClientDelegate.java
+++ /dev/null
@@ -1,92 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.io.IOException;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.eclipse.jetty.rhttp.client.RHTTPRequest;
-
-
-/**
- * <p>A <tt>ClientDelegate</tt> is the server-side counterpart of a gateway client.</p>
- * <p>The gateway client, the comet protocol and the <tt>ClientDelegate</tt> form the
- * <em>Half-Object plus Protocol</em> pattern that is used between the gateway server
- * and the gateway client.</p>
- * <p><tt>ClientDelegate</tt> offers a server-side API on top of the comet communication.<br />
- * The API allows to enqueue server-side events to the gateway client, allows to
- * flush them to the gateway client, and allows to close and dispose server-side
- * resources when the gateway client disconnects.</p>
- *
- * @version $Revision$ $Date$
- */
-public interface ClientDelegate
-{
-    /**
-     * @return the targetId that uniquely identifies this client delegate.
-     */
-    public String getTargetId();
-
-    /**
-     * <p>Enqueues the given request to the delivery queue so that it will be sent to the
-     * gateway client on the first flush occasion.</p>
-     * <p>Requests may fail to be queued, for example because the gateway client disconnected
-     * concurrently.</p>
-     *
-     * @param request the request to add to the delivery queue
-     * @return whether the request has been queued or not
-     * @see #process(HttpServletRequest)
-     */
-    public boolean enqueue(RHTTPRequest request);
-
-    /**
-     * <p>Flushes the requests that have been {@link #enqueue(RHTTPRequest) enqueued}.</p>
-     * <p>If no requests have been enqueued, then this method may suspend the current request for
-     * the long poll timeout. <br />
-     * The request is suspended only if all these conditions holds true:
-     * <ul>
-     * <li>it is not the first time that this method is called for this client delegate</li>
-     * <li>no requests have been enqueued</li>
-     * <li>this client delegate is not closed</li>
-     * <li>the previous call to this method did not suspend the request</li>
-     * </ul>
-     * In all other cases, a response if sent to the gateway client, possibly containing no requests.
-     *
-     * @param httpRequest the HTTP request for the long poll request from the gateway client
-     * @return the list of requests to send to the gateway client, or null if no response should be sent
-     * to the gateway client
-     * @throws IOException in case of I/O exception while flushing content to the gateway client
-     * @see #enqueue(RHTTPRequest)
-     */
-    public List<RHTTPRequest> process(HttpServletRequest httpRequest) throws IOException;
-
-    /**
-     * <p>Closes this client delegate, in response to a gateway client request to disconnect.</p>
-     * @see #isClosed()
-     */
-    public void close();
-
-    /**
-     * @return whether this delegate client is closed
-     * @see #close()
-     */
-    public boolean isClosed();
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/ConnectorServlet.java b/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/ConnectorServlet.java
deleted file mode 100644
index d477375..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/ConnectorServlet.java
+++ /dev/null
@@ -1,224 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.rhttp.client.RHTTPRequest;
-import org.eclipse.jetty.rhttp.client.RHTTPResponse;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/**
- * The servlet that handles the communication with the gateway clients.
- * @version $Revision$ $Date$
- */
-public class ConnectorServlet extends HttpServlet
-{
-    private final Logger logger = Log.getLogger(getClass().toString());
-    private final TargetIdRetriever targetIdRetriever = new StandardTargetIdRetriever();
-    private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
-    private final ConcurrentMap<String, Future<?>> expirations = new ConcurrentHashMap<String, Future<?>>();
-    private final Gateway gateway;
-    private long clientTimeout=15000;
-
-    public ConnectorServlet(Gateway gateway)
-    {
-        this.gateway = gateway;
-    }
-
-    @Override
-    public void init() throws ServletException 
-    {
-        String t = getInitParameter("clientTimeout");
-        if (t!=null && !"".equals(t))
-            clientTimeout=Long.parseLong(t);
-    }
-
-    @Override
-    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
-    {
-        String targetId = targetIdRetriever.retrieveTargetId(request);
-
-        String uri = request.getRequestURI();
-        String path = uri.substring(request.getServletPath().length());
-        String[] segments = path.split("/");
-        if (segments.length < 3)
-            throw new ServletException("Invalid request to " + getClass().getSimpleName() + ": " + uri);
-
-        String action = segments[2];
-        if ("handshake".equals(action))
-            serviceHandshake(targetId, request, response);
-        else if ("connect".equals(action))
-            serviceConnect(targetId, request, response);
-        else if ("deliver".equals(action))
-            serviceDeliver(targetId, request, response);
-        else if ("disconnect".equals(action))
-            serviceDisconnect(targetId, request, response);
-        else
-            throw new ServletException("Invalid request to " + getClass().getSimpleName() + ": " + uri);
-    }
-
-    private void serviceHandshake(String targetId, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException
-    {
-        ClientDelegate client = gateway.getClientDelegate(targetId);
-        if (client != null)
-            throw new IOException("Client with targetId " + targetId + " is already connected");
-
-        client = gateway.newClientDelegate(targetId);
-        ClientDelegate existing = gateway.addClientDelegate(targetId, client);
-        if (existing != null)
-            throw new IOException("Client with targetId " + targetId + " is already connected");
-
-        flush(client, httpRequest, httpResponse);
-    }
-
-    private void flush(ClientDelegate client, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException
-    {
-        List<RHTTPRequest> requests = client.process(httpRequest);
-        if (requests != null)
-        {
-            // Schedule before sending the requests, to avoid that the remote client
-            // reconnects before we have scheduled the expiration timeout.
-            if (!client.isClosed())
-                schedule(client);
-
-            ServletOutputStream output = httpResponse.getOutputStream();
-            for (RHTTPRequest request : requests)
-                output.write(request.getFrameBytes());
-            // I could count the framed bytes of all requests and set a Content-Length header,
-            // but the implementation of ServletOutputStream takes care of everything:
-            // if the request was HTTP/1.1, then flushing result in a chunked response, but the
-            // client know how to handle it; if the request was HTTP/1.0, then no chunking.
-            // To avoid chunking in HTTP/1.1 I must set the Content-Length header.
-            output.flush();
-            logger.debug("Delivered to device {} requests {} ", client.getTargetId(), requests);
-        }
-    }
-
-    private void schedule(ClientDelegate client)
-    {
-        Future<?> task = scheduler.schedule(new ClientExpirationTask(client), clientTimeout, TimeUnit.MILLISECONDS);
-        Future<?> existing = expirations.put(client.getTargetId(), task);
-        assert existing == null;
-    }
-
-    private void unschedule(String targetId)
-    {
-        Future<?> task = expirations.remove(targetId);
-        if (task != null)
-            task.cancel(false);
-    }
-
-    private void serviceConnect(String targetId, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException
-    {
-        unschedule(targetId);
-
-        ClientDelegate client = gateway.getClientDelegate(targetId);
-        if (client == null)
-        {
-            // Expired client tries to connect without handshake
-            httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
-            return;
-        }
-
-        flush(client, httpRequest, httpResponse);
-
-        if (client.isClosed())
-            gateway.removeClientDelegate(targetId);
-    }
-
-    private void expireConnect(ClientDelegate client, long time)
-    {
-        String targetId = client.getTargetId();
-        logger.info("Client with targetId {} missing, last seen {} ms ago, closing it", targetId, System.currentTimeMillis() - time);
-        client.close();
-        // If the client expired, means that it did not connect,
-        // so there no request to resume, and we cleanup here
-        // (while normally this cleanup is done in serviceConnect())
-        unschedule(targetId);
-        gateway.removeClientDelegate(targetId);
-    }
-
-    private void serviceDeliver(String targetId, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws ServletException, IOException
-    {
-        if (gateway.getClientDelegate(targetId) == null)
-        {
-            // Expired client tries to deliver without handshake
-            httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
-            return;
-        }
-
-        byte[] body = Utils.read(httpRequest.getInputStream());
-
-        RHTTPResponse response = RHTTPResponse.fromFrameBytes(body);
-
-        ExternalRequest externalRequest = gateway.removeExternalRequest(response.getId());
-        if (externalRequest != null)
-        {
-            externalRequest.respond(response);
-            logger.debug("Deliver request from device {}, gateway request {}, response {}", new Object[] {targetId, externalRequest, response});
-        }
-        else
-        {
-            // We can arrive here for a race with the continuation expiration, which expired just before
-            // the gateway client responded with a valid response; log this case ignore it.
-            logger.debug("Deliver request from device {}, missing gateway request, response {}", targetId, response);
-        }
-    }
-
-    private void serviceDisconnect(String targetId, HttpServletRequest request, HttpServletResponse response)
-    {
-        // Do not remove the ClientDelegate from the gateway here,
-        // since closing the ClientDelegate will resume the connect request
-        // and we remove the ClientDelegate from the gateway there
-        ClientDelegate client = gateway.getClientDelegate(targetId);
-        if (client != null)
-            client.close();
-    }
-
-    private class ClientExpirationTask implements Runnable
-    {
-        private final long time = System.currentTimeMillis();
-        private final ClientDelegate client;
-
-        public ClientExpirationTask(ClientDelegate client)
-        {
-            this.client = client;
-        }
-
-        public void run()
-        {
-            expireConnect(client, time);
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/ExternalRequest.java b/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/ExternalRequest.java
deleted file mode 100644
index 3142795..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/ExternalRequest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.io.IOException;
-
-import org.eclipse.jetty.rhttp.client.RHTTPRequest;
-import org.eclipse.jetty.rhttp.client.RHTTPResponse;
-
-
-/**
- * <p><tt>ExternalRequest</tt> represent an external request made to the gateway server.</p>
- * <p><tt>ExternalRequest</tt>s that arrive to the gateway server are suspended, waiting
- * for a response from the corresponding gateway client.</p>
- *
- * @version $Revision$ $Date$
- */
-public interface ExternalRequest
-{
-    /**
-     * <p>Suspends this <tt>ExternalRequest</tt> waiting for a response from the gateway client.</p>
-     * @return true if the <tt>ExternalRequest</tt> has been suspended, false if the
-     * <tt>ExternalRequest</tt> has already been responded.
-     */
-    public boolean suspend();
-
-    /**
-     * <p>Responds to the original external request with the response arrived from the gateway client.</p>
-     * @param response the response arrived from the gateway client
-     * @throws IOException if responding to the original external request fails
-     */
-    public void respond(RHTTPResponse response) throws IOException;
-
-    /**
-     * @return the request to be sent to the gateway client
-     */
-    public RHTTPRequest getRequest();
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/ExternalServlet.java b/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/ExternalServlet.java
deleted file mode 100644
index 6bda723..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/ExternalServlet.java
+++ /dev/null
@@ -1,88 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.rhttp.client.RHTTPRequest;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/**
- * The servlet that handles external requests.
- *
- * @version $Revision$ $Date$
- */
-public class ExternalServlet extends HttpServlet
-{
-    private final Logger logger = Log.getLogger(getClass().toString());
-    private final Gateway gateway;
-    private TargetIdRetriever targetIdRetriever;
-
-    public ExternalServlet(Gateway gateway, TargetIdRetriever targetIdRetriever)
-    {
-        this.gateway = gateway;
-        this.targetIdRetriever = targetIdRetriever;
-    }
-
-    public TargetIdRetriever getTargetIdRetriever()
-    {
-        return targetIdRetriever;
-    }
-
-    public void setTargetIdRetriever(TargetIdRetriever targetIdRetriever)
-    {
-        this.targetIdRetriever = targetIdRetriever;
-    }
-
-    @Override
-    protected void service(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws ServletException, IOException
-    {
-        logger.debug("External http request: {}", httpRequest.getRequestURL());
-
-        String targetId = targetIdRetriever.retrieveTargetId(httpRequest);
-        if (targetId == null)
-            throw new ServletException("Invalid request to " + getClass().getSimpleName() + ": " + httpRequest.getRequestURI());
-
-        ClientDelegate client = gateway.getClientDelegate(targetId);
-        if (client == null) throw new ServletException("Client with targetId " + targetId + " is not connected");
-
-        ExternalRequest externalRequest = gateway.newExternalRequest(httpRequest, httpResponse);
-        RHTTPRequest request = externalRequest.getRequest();
-        ExternalRequest existing = gateway.addExternalRequest(request.getId(), externalRequest);
-        assert existing == null;
-        logger.debug("External request {} for device {}", request, targetId);
-
-        boolean delivered = client.enqueue(request);
-        if (delivered)
-        {
-            externalRequest.suspend();
-        }
-        else
-        {
-            // TODO: improve this: we can temporarly queue this request elsewhere and wait for the client to reconnect ?
-            throw new ServletException("Could not enqueue request to client with targetId " + targetId);
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/Gateway.java b/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/Gateway.java
deleted file mode 100644
index 83bd22c..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/Gateway.java
+++ /dev/null
@@ -1,99 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.io.IOException;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * <p>Gateway instances are responsible of holding the state of the gateway server.</p>
- * <p>The state is composed by:
- * <ul>
- * <li>{@link ExternalRequest external requests} that are suspended waiting for the response</li>
- * <li>{@link ClientDelegate gateway clients} that are connected with the gateway server</li>
- * </ul></p>
- * <p>Instances of this class are created by the {@link GatewayServer}.</p>
- *
- * @version $Revision$ $Date$
- */
-public interface Gateway
-{
-    /**
-     * <p>Returns the {@link ClientDelegate} with the given targetId.<br />
-     * If there is no such ClientDelegate returns null.</p>
-     *
-     * @param targetId the targetId of the ClientDelegate to return
-     * @return the ClientDelegate associated with the given targetId
-     */
-    public ClientDelegate getClientDelegate(String targetId);
-
-    /**
-     * <p>Creates and configures a new {@link ClientDelegate} with the given targetId.</p>
-     * @param targetId the targetId of the ClientDelegate to create
-     * @return a newly created ClientDelegate
-     * @see #addClientDelegate(String, ClientDelegate)
-     */
-    public ClientDelegate newClientDelegate(String targetId);
-
-    /**
-     * <p>Maps the given ClientDelegate to the given targetId.</p>
-     * @param targetId the targetId of the given ClientDelegate
-     * @param client the ClientDelegate to map
-     * @return the previously existing ClientDelegate mapped to the same targetId
-     * @see #removeClientDelegate(String)
-     */
-    public ClientDelegate addClientDelegate(String targetId, ClientDelegate client);
-
-    /**
-     * <p>Removes the {@link ClientDelegate} associated with the given targetId.</p>
-     * @param targetId the targetId of the ClientDelegate to remove
-     * @return the removed ClientDelegate, or null if no ClientDelegate was removed
-     * @see #addClientDelegate(String, ClientDelegate)
-     */
-    public ClientDelegate removeClientDelegate(String targetId);
-
-    /**
-     * <p>Creates a new {@link ExternalRequest} from the given HTTP request and HTTP response.</p>
-     * @param httpRequest the HTTP request of the external request
-     * @param httpResponse the HTTP response of the external request
-     * @return a newly created ExternalRequest
-     * @throws IOException in case of failures creating the ExternalRequest
-     * @see #addExternalRequest(int, ExternalRequest)
-     */
-    public ExternalRequest newExternalRequest(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException;
-
-    /**
-     * Maps the given ExternalRequest with the given requestId into the gateway state.
-     * @param requestId the id of the ExternalRequest
-     * @param externalRequest the ExternalRequest to map
-     * @return the previously existing ExternalRequest mapped to the same requestId
-     * @see #removeExternalRequest(int)
-     */
-    public ExternalRequest addExternalRequest(int requestId, ExternalRequest externalRequest);
-
-    /**
-     * Removes the ExternalRequest mapped to the given requestId from the gateway state.
-     * @param requestId the id of the ExternalRequest
-     * @return the removed ExternalRequest
-     * @see #addExternalRequest(int, ExternalRequest)
-     */
-    public ExternalRequest removeExternalRequest(int requestId);
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/GatewayProxyServer.java b/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/GatewayProxyServer.java
deleted file mode 100644
index d446f69..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/GatewayProxyServer.java
+++ /dev/null
@@ -1,228 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.client.Address;
-import org.eclipse.jetty.client.ContentExchange;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.HttpExchange;
-import org.eclipse.jetty.io.Buffer;
-import org.eclipse.jetty.io.ByteArrayBuffer;
-import org.eclipse.jetty.rhttp.client.JettyClient;
-import org.eclipse.jetty.rhttp.client.RHTTPClient;
-import org.eclipse.jetty.rhttp.client.RHTTPListener;
-import org.eclipse.jetty.rhttp.client.RHTTPRequest;
-import org.eclipse.jetty.rhttp.client.RHTTPResponse;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/**
- * <p>This class combines a gateway server and a gateway client to obtain the functionality of a simple proxy server.</p>
- * <p>This gateway proxy server starts on port 8080 and can be set as http proxy in browsers such as Firefox, and used
- * to browse the internet.</p>
- * <p>Its functionality is limited (for example, it only supports http, and not https).</p>
- * @version $Revision$ $Date$
- */
-public class GatewayProxyServer
-{
-    private static final Logger logger = Log.getLogger(GatewayProxyServer.class.toString());
-
-    public static void main(String[] args) throws Exception
-    {
-        GatewayServer server = new GatewayServer();
-
-        Connector plainConnector = new SelectChannelConnector();
-        plainConnector.setPort(8080);
-        server.addConnector(plainConnector);
-
-        ((StandardGateway)server.getGateway()).setExternalTimeout(180000);
-        ((StandardGateway)server.getGateway()).setGatewayTimeout(20000);
-        server.setTargetIdRetriever(new ProxyTargetIdRetriever());
-        server.start();
-
-        HttpClient httpClient = new HttpClient();
-        httpClient.setConnectorType(HttpClient.CONNECTOR_SOCKET);
-        httpClient.start();
-
-        RHTTPClient client = new JettyClient(httpClient, new Address("localhost", plainConnector.getPort()), server.getContext().getContextPath() + "/gw", "proxy");
-        client.addListener(new ProxyListener(httpClient, client));
-        client.connect();
-
-        Runtime.getRuntime().addShutdownHook(new Shutdown(server, httpClient, client));
-        logger.info("{} started", GatewayProxyServer.class.getSimpleName());
-    }
-
-    private static class Shutdown extends Thread
-    {
-        private final GatewayServer server;
-        private final HttpClient httpClient;
-        private final RHTTPClient client;
-
-        public Shutdown(GatewayServer server, HttpClient httpClient, RHTTPClient client)
-        {
-            this.server = server;
-            this.httpClient = httpClient;
-            this.client = client;
-        }
-
-        @Override
-        public void run()
-        {
-            try
-            {
-                client.disconnect();
-                httpClient.stop();
-                server.stop();
-                logger.info("{} stopped", GatewayProxyServer.class.getSimpleName());
-            }
-            catch (Exception x)
-            {
-                logger.debug("Exception while stopping " + GatewayProxyServer.class.getSimpleName(), x);
-            }
-        }
-    }
-
-    private static class ProxyListener implements RHTTPListener
-    {
-        private final HttpClient httpClient;
-        private final RHTTPClient client;
-
-        private ProxyListener(HttpClient httpClient, RHTTPClient client)
-        {
-            this.httpClient = httpClient;
-            this.client = client;
-        }
-
-        public void onRequest(RHTTPRequest request) throws Exception
-        {
-            ProxyExchange exchange = new ProxyExchange();
-            Address address = Address.from(request.getHeaders().get("Host"));
-            if (address.getPort() == 0) address = new Address(address.getHost(), 80);
-            exchange.setAddress(address);
-            exchange.setMethod(request.getMethod());
-            exchange.setURI(request.getURI());
-            for (Map.Entry<String, String> header : request.getHeaders().entrySet())
-                exchange.setRequestHeader(header.getKey(), header.getValue());
-            exchange.setRequestContent(new ByteArrayBuffer(request.getBody()));
-            int status = syncSend(exchange);
-            if (status == HttpExchange.STATUS_COMPLETED)
-            {
-                int statusCode = exchange.getResponseStatus();
-                String statusMessage = exchange.getResponseMessage();
-                Map<String, String> responseHeaders = exchange.getResponseHeaders();
-                byte[] responseBody = exchange.getResponseBody();
-                RHTTPResponse response = new RHTTPResponse(request.getId(), statusCode, statusMessage, responseHeaders, responseBody);
-                client.deliver(response);
-            }
-            else
-            {
-                int statusCode = HttpServletResponse.SC_SERVICE_UNAVAILABLE;
-                String statusMessage = "Gateway error";
-                HashMap<String, String> responseHeaders = new HashMap<String, String>();
-                responseHeaders.put("Connection", "close");
-                byte[] responseBody = new byte[0];
-                RHTTPResponse response = new RHTTPResponse(request.getId(), statusCode, statusMessage, responseHeaders, responseBody);
-                client.deliver(response);
-            }
-        }
-
-        private int syncSend(ProxyExchange exchange) throws Exception
-        {
-            long start = System.nanoTime();
-            httpClient.send(exchange);
-            int status = exchange.waitForDone();
-            long end = System.nanoTime();
-            long millis = TimeUnit.NANOSECONDS.toMillis(end - start);
-            long micros = TimeUnit.NANOSECONDS.toMicros(end - start - TimeUnit.MILLISECONDS.toNanos(millis));
-            logger.debug("Proxied request took {}.{} ms", millis, micros);
-            return status;
-        }
-    }
-
-    private static class ProxyExchange extends ContentExchange
-    {
-        private String responseMessage;
-        private Map<String, String> responseHeaders = new HashMap<String, String>();
-        private ByteArrayOutputStream responseBody = new ByteArrayOutputStream();
-
-        private ProxyExchange()
-        {
-            super(true);
-        }
-
-        public String getResponseMessage()
-        {
-            return responseMessage;
-        }
-
-        public Map<String, String> getResponseHeaders()
-        {
-            return responseHeaders;
-        }
-
-        public byte[] getResponseBody()
-        {
-            return responseBody.toByteArray();
-        }
-
-        @Override
-        protected void onResponseStatus(Buffer version, int code, Buffer message) throws IOException
-        {
-            super.onResponseStatus(version, code, message);
-            this.responseMessage = message.toString("UTF-8");
-        }
-
-        @Override
-        protected void onResponseHeader(Buffer nameBuffer, Buffer valueBuffer) throws IOException
-        {
-            super.onResponseHeader(nameBuffer, valueBuffer);
-            String name = nameBuffer.toString("UTF-8");
-            String value = valueBuffer.toString("UTF-8");
-            // Skip chunked header, since we read the whole body and will not re-chunk it
-            if (!name.equalsIgnoreCase("Transfer-Encoding") || !value.equalsIgnoreCase("chunked"))
-                responseHeaders.put(name, value);
-        }
-
-        @Override
-        protected void onResponseContent(Buffer buffer) throws IOException
-        {
-            responseBody.write(buffer.asArray());
-            super.onResponseContent(buffer);
-        }
-    }
-
-    public static class ProxyTargetIdRetriever implements TargetIdRetriever
-    {
-        public String retrieveTargetId(HttpServletRequest httpRequest)
-        {
-            return "proxy";
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/GatewayServer.java b/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/GatewayServer.java
deleted file mode 100644
index 5c86cd4..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/GatewayServer.java
+++ /dev/null
@@ -1,171 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jetty.http.MimeTypes;
-import org.eclipse.jetty.rhttp.client.RHTTPClient;
-import org.eclipse.jetty.rhttp.client.RHTTPRequest;
-import org.eclipse.jetty.rhttp.client.RHTTPResponse;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.HandlerCollection;
-import org.eclipse.jetty.servlet.DefaultServlet;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/**
- * <p>The gateway server is a server component that acts as intermediary between
- * <em>external clients</em> which perform requests for resources, and the
- * <em>resource providers</em>.</p>
- * <p>The particularity of the gateway server is that the resource providers
- * connect to the gateway using a comet protocol. <br />
- * The comet procotol functionality is implemented by a gateway client. <br />
- * This is quite different from a normal proxy server where it is the proxy that
- * connects to the resource providers.</p>
- * <p>Schematically, this is how the gateway server works:</p>
- * <pre>
- * External Client       Gateway Server         Gateway Client         Resource Provider
- *                              |                      |
- *                              | &lt;-- comet req. 1 --- |
- *        | --- ext. req. 1 --&gt; |                      |
- *        |                     | --- comet res. 1 --&gt; |
- *        |                     | &lt;-- comet req. 2 --- |
- *        |                                            | --- ext. req. 1 --&gt; |
- *                                                                           |
- *        |                                            | &lt;-- ext. res. 1 --- |
- *        |                     | &lt;-- ext.  res. 1 --- |
- *        | &lt;-- ext. res. 1 --- |
- *
- *        | --- ext. req. 2 --&gt; |
- *        |                     | --- comet res. 2 --&gt; |
- *        .                     .                      .
- * </pre>
- * <p>The gateway server is made of two servlets:
- * <ul>
- * <li>the external servlet, that handles external requests</li>
- * <li>the gateway servlet, that handles the communication with the gateway client</li>
- * </ul>
- * </p>
- * <p>External requests are suspended using Jetty continuations until a response for
- * that request arrives from the resource provider, or a
- * {@link #getExternalTimeout() configurable timeout} expires. <br />
- * Comet requests made by the gateway client also expires after a (different)
- * {@link #getGatewayTimeout() configurable timeout}.</p>
- * <p>External requests are packed into {@link RHTTPRequest} objects, converted into an
- * opaque byte array and sent as the body of the comet reponse to the gateway
- * {@link RHTTPClient}.</p>
- * <p>The gateway client uses a notification mechanism to alert listeners interested
- * in external requests that have been forwarded through the gateway. It is up to the
- * listeners to connect to the resource provider however they like.</p>
- * <p>When the gateway client receives a response from the resource provider, it packs
- * the response into a {@link RHTTPResponse} object, converts it into an opaque byte array
- * and sends it as the body of a normal HTTP request to the gateway server.</p>
- * <p>It is possible to connect more than one gateway client to a gateway server; each
- * gateway client is identified by a unique <em>targetId</em>. <br />
- * External requests must specify a targetId that allows the gateway server to forward
- * the requests to the specific gateway client; how the targetId is retrieved from an
- * external request is handled by {@link TargetIdRetriever} implementations.</p>
- *
- * @version $Revision$ $Date$
- */
-public class GatewayServer extends Server
-{
-    public final static String DFT_EXT_PATH="/gw";
-    public final static String DFT_CONNECT_PATH="/__rhttp";
-    private final Logger logger = Log.getLogger(getClass().toString());
-    private final Gateway gateway;
-    private final ServletHolder externalServletHolder;
-    private final ServletHolder connectorServletHolder;
-    private final ServletContextHandler context;
-    
-    public GatewayServer()
-    {
-        this("",DFT_EXT_PATH,DFT_CONNECT_PATH,new StandardTargetIdRetriever());
-    }
-
-    public GatewayServer(String contextPath, String externalServletPath,String gatewayServletPath, TargetIdRetriever targetIdRetriever)
-    {
-        HandlerCollection handlers = new HandlerCollection();
-        setHandler(handlers);
-        context = new ServletContextHandler(handlers, contextPath, ServletContextHandler.SESSIONS);
-        
-        // Setup the gateway
-        gateway = createGateway();
-        
-        // Setup external servlet
-        ExternalServlet externalServlet = new ExternalServlet(gateway, targetIdRetriever);
-        externalServletHolder = new ServletHolder(externalServlet);
-        context.addServlet(externalServletHolder, externalServletPath + "/*");
-        logger.debug("External servlet mapped to {}/*", externalServletPath);
-
-        // Setup gateway servlet
-        ConnectorServlet gatewayServlet = new ConnectorServlet(gateway);
-        connectorServletHolder = new ServletHolder(gatewayServlet);
-        connectorServletHolder.setInitParameter("clientTimeout", "15000");
-        context.addServlet(connectorServletHolder, gatewayServletPath + "/*");
-        logger.debug("Gateway servlet mapped to {}/*", gatewayServletPath);
-    }
-
-    /**
-     * Creates and configures a {@link Gateway} object.
-     * @return the newly created and configured Gateway object.
-     */
-    protected Gateway createGateway()
-    {
-        StandardGateway gateway = new StandardGateway();
-        return gateway;
-    }
-    
-    public ServletContextHandler getContext()
-    {
-        return context;
-    }
-    
-    public Gateway getGateway()
-    {
-        return gateway;
-    }
-    
-    public ServletHolder getExternalServlet()
-    {
-        return externalServletHolder;
-    }
-    
-    public ServletHolder getConnectorServlet()
-    {
-        return connectorServletHolder;
-    }
-
-    public void setTargetIdRetriever(TargetIdRetriever retriever)
-    {
-        ((ExternalServlet)externalServletHolder.getServletInstance()).setTargetIdRetriever(retriever);
-    }
-
-    public TargetIdRetriever getTargetIdRetriever()
-    {
-        return ((ExternalServlet)externalServletHolder.getServletInstance()).getTargetIdRetriever();
-    }
-    
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/HostTargetIdRetriever.java b/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/HostTargetIdRetriever.java
deleted file mode 100644
index 7c80795..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/HostTargetIdRetriever.java
+++ /dev/null
@@ -1,54 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * @version $Revision$ $Date$
- */
-public class HostTargetIdRetriever implements TargetIdRetriever
-{
-    private final String suffix;
-
-    public HostTargetIdRetriever(String suffix)
-    {
-        this.suffix = suffix;
-    }
-
-    public String retrieveTargetId(HttpServletRequest httpRequest)
-    {
-        String host = httpRequest.getHeader("Host");
-        if (host != null)
-        {
-            // Strip the port
-            int colon = host.indexOf(':');
-            if (colon > 0)
-            {
-                host = host.substring(0, colon);
-            }
-
-            if (suffix != null && host.endsWith(suffix))
-            {
-                return host.substring(0, host.length() - suffix.length());
-            }
-        }
-        return host;
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/Main.java b/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/Main.java
deleted file mode 100644
index cddc8b6..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/Main.java
+++ /dev/null
@@ -1,128 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
-import org.eclipse.jetty.servlet.DefaultServlet;
-import org.eclipse.jetty.servlet.ServletHolder;
-
-/**
- * <p>Main class that starts the gateway server.</p>
- * <p>This class supports the following arguments:</p>
- * <ul>
- * <li>--port=&lt;port&gt; specifies the port on which the gateway server listens to, by default 8080</li>
- * <li>--retriever=&lt;retriever&gt; specifies the
- * {@link GatewayServer#setTargetIdRetriever(TargetIdRetriever) target id retriever}</li>
- * <li>--resources=&lt;resources file path&gt; specifies the resource file path for the gateway</li>
- * </ul>
- * <p>Examples</p>
- * <p> <tt>java --port=8080</tt> </p>
- * <p> <tt>java --port=8080 --resources=/tmp/gateway-resources</tt> </p>
- * <p> <tt>java --port=8080 --retriever=standard</tt> </p>
- * <p> <tt>java --port=8080 --retriever=host,.rhttp.example.com</tt> </p>
- * <p>The latter example specifies the {@link HostTargetIdRetriever} with a suffix of <tt>.rhttp.example.com</tt></p>
- *
- * @see GatewayServer
- * @version $Revision$ $Date$
- */
-public class Main
-{
-    private static final String PORT_ARG = "port";
-    private static final String RESOURCES_ARG = "resources";
-    private static final String RETRIEVER_ARG = "retriever";
-
-    public static void main(String[] args) throws Exception
-    {
-        Map<String, Object> arguments = parse(args);
-
-        int port = 8080;
-        if (arguments.containsKey(PORT_ARG))
-            port = (Integer)arguments.get(PORT_ARG);
-
-        String resources = null;
-        if (arguments.containsKey(RESOURCES_ARG))
-            resources = (String)arguments.get(RESOURCES_ARG);
-
-        TargetIdRetriever retriever = null;
-        if (arguments.containsKey(RETRIEVER_ARG))
-            retriever = (TargetIdRetriever)arguments.get(RETRIEVER_ARG);
-
-        GatewayServer server = new GatewayServer();
-
-        Connector connector = new SelectChannelConnector();
-        connector.setPort(port);
-        server.addConnector(connector);
-
-        if (resources != null)
-        {
-            server.getContext().setResourceBase(resources);
-            ServletHolder resourcesServletHolder = server.getContext().addServlet(DefaultServlet.class,"__r/*");
-            resourcesServletHolder.setInitParameter("dirAllowed", "true");
-        }
-
-        if (retriever != null)
-            server.setTargetIdRetriever(retriever);
-
-        server.start();
-    }
-
-    private static Map<String, Object> parse(String[] args)
-    {
-        Map<String, Object> result = new HashMap<String, Object>();
-
-        Pattern pattern = Pattern.compile("--([^=]+)=(.+)");
-        for (String arg : args)
-        {
-            Matcher matcher = pattern.matcher(arg);
-            if (matcher.matches())
-            {
-                String argName = matcher.group(1);
-                if (PORT_ARG.equals(argName))
-                {
-                    result.put(PORT_ARG, Integer.parseInt(matcher.group(2)));
-                }
-                else if (RESOURCES_ARG.equals(argName))
-                {
-                    String argValue = matcher.group(2);
-                    result.put(RESOURCES_ARG, argValue);
-                }
-                else if (RETRIEVER_ARG.equals(argName))
-                {
-                    String argValue = matcher.group(2);
-                    if (argValue.startsWith("host,"))
-                    {
-                        String[] typeAndSuffix = argValue.split(",");
-                        if (typeAndSuffix.length != 2)
-                            throw new IllegalArgumentException("Invalid option " + arg + ", must be of the form --" + RETRIEVER_ARG + "=host,suffix");
-
-                        result.put(RETRIEVER_ARG, new HostTargetIdRetriever(typeAndSuffix[1]));
-                    }
-                }
-            }
-        }
-
-        return result;
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/StandardClientDelegate.java b/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/StandardClientDelegate.java
deleted file mode 100644
index f8749fb..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/StandardClientDelegate.java
+++ /dev/null
@@ -1,172 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.eclipse.jetty.continuation.Continuation;
-import org.eclipse.jetty.continuation.ContinuationSupport;
-import org.eclipse.jetty.rhttp.client.RHTTPRequest;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/**
- * <p>Default implementation of {@link ClientDelegate}.</p>
- *
- * @version $Revision$ $Date$
- */
-public class StandardClientDelegate implements ClientDelegate
-{
-    private final Logger logger = Log.getLogger(getClass().toString());
-    private final Object lock = new Object();
-    private final List<RHTTPRequest> requests = new ArrayList<RHTTPRequest>();
-    private final String targetId;
-    private volatile boolean firstFlush = true;
-    private volatile long timeout;
-    private volatile boolean closed;
-    private Continuation continuation;
-
-    public StandardClientDelegate(String targetId)
-    {
-        this.targetId = targetId;
-    }
-
-    public String getTargetId()
-    {
-        return targetId;
-    }
-
-    public long getTimeout()
-    {
-        return timeout;
-    }
-
-    public void setTimeout(long timeout)
-    {
-        this.timeout = timeout;
-    }
-
-    public boolean enqueue(RHTTPRequest request)
-    {
-        if (isClosed())
-            return false;
-
-        synchronized (lock)
-        {
-            requests.add(request);
-            resume();
-        }
-
-        return true;
-    }
-
-    private void resume()
-    {
-        synchronized (lock)
-        {
-            // Continuation may be null in several cases:
-            // 1. there always is something to deliver so we never suspend
-            // 2. concurrent calls to add() and close()
-            // 3. concurrent close() with a long poll that expired
-            // 4. concurrent close() with a long poll that resumed
-            if (continuation != null)
-            {
-                continuation.resume();
-                // Null the continuation, as there is no point is resuming multiple times
-                continuation = null;
-            }
-        }
-    }
-
-    public List<RHTTPRequest> process(HttpServletRequest httpRequest) throws IOException
-    {
-        // We want to respond in the following cases:
-        // 1. It's the first time we process: the client will wait for a response before issuing another connect.
-        // 2. The client disconnected, so we want to return from this connect before it times out.
-        // 3. We've been woken up because there are responses to send.
-        // 4. The continuation was suspended but timed out.
-        //    The timeout case is different from a non-first connect, in that we want to return
-        //    a (most of the times empty) response and we do not want to wait again.
-        // The order of these if statements is important, as the continuation timed out only if
-        // the client is not closed and there are no responses to send
-        List<RHTTPRequest> result = Collections.emptyList();
-        if (firstFlush)
-        {
-            firstFlush = false;
-            logger.debug("Connect request (first) from device {}, delivering requests {}", targetId, result);
-        }
-        else
-        {
-            // Synchronization is crucial here, since we don't want to suspend if there is something to deliver
-            synchronized (lock)
-            {
-                int size = requests.size();
-                if (size > 0)
-                {
-                    assert continuation == null;
-                    result = new ArrayList<RHTTPRequest>(size);
-                    result.addAll(requests);
-                    requests.clear();
-                    logger.debug("Connect request (resumed) from device {}, delivering requests {}", targetId, result);
-                }
-                else
-                {
-                    if (continuation != null)
-                    {
-                        continuation = null;
-                        logger.debug("Connect request (expired) from device {}, delivering requests {}", targetId, result);
-                    }
-                    else
-                    {
-                        if (isClosed())
-                        {
-                            logger.debug("Connect request (closed) from device {}, delivering requests {}", targetId, result);
-                        }
-                        else
-                        {
-                            // Here we need to suspend
-                            continuation = ContinuationSupport.getContinuation(httpRequest);
-                            continuation.setTimeout(getTimeout());
-                            continuation.suspend();
-                            result = null;
-                            logger.debug("Connect request (suspended) from device {}", targetId);
-                        }
-                    }
-                }
-            }
-        }
-        return result;
-    }
-
-    public void close()
-    {
-        closed = true;
-        resume();
-    }
-
-    public boolean isClosed()
-    {
-        return closed;
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/StandardExternalRequest.java b/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/StandardExternalRequest.java
deleted file mode 100644
index df12111..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/StandardExternalRequest.java
+++ /dev/null
@@ -1,189 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.io.IOException;
-import java.util.Map;
-
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.continuation.Continuation;
-import org.eclipse.jetty.continuation.ContinuationListener;
-import org.eclipse.jetty.continuation.ContinuationSupport;
-import org.eclipse.jetty.rhttp.client.RHTTPRequest;
-import org.eclipse.jetty.rhttp.client.RHTTPResponse;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/**
- * Default implementation of {@link ExternalRequest}.
- *
- * @version $Revision$ $Date$
- */
-public class StandardExternalRequest implements ExternalRequest
-{
-    private final Logger logger = Log.getLogger(getClass().toString());
-    private final RHTTPRequest request;
-    private final HttpServletRequest httpRequest;
-    private final HttpServletResponse httpResponse;
-    private final Gateway gateway;
-    private final Object lock = new Object();
-    private volatile long timeout;
-    private Continuation continuation;
-    private boolean responded;
-
-    public StandardExternalRequest(RHTTPRequest request, HttpServletRequest httpRequest, HttpServletResponse httpResponse, Gateway gateway)
-    {
-        this.request = request;
-        this.httpRequest = httpRequest;
-        this.httpResponse = httpResponse;
-        this.gateway = gateway;
-    }
-
-    public long getTimeout()
-    {
-        return timeout;
-    }
-
-    public void setTimeout(long timeout)
-    {
-        this.timeout = timeout;
-    }
-
-    public boolean suspend()
-    {
-        synchronized (lock)
-        {
-            // We suspend only if we have no responded yet
-            if (!responded)
-            {
-                assert continuation == null;
-                continuation = ContinuationSupport.getContinuation(httpRequest);
-                continuation.setTimeout(getTimeout());
-                continuation.addContinuationListener(new TimeoutListener());
-                continuation.suspend(httpResponse);
-                logger.debug("Request {} suspended", getRequest());
-            }
-            else
-            {
-                logger.debug("Request {} already responded", getRequest());
-            }
-            return !responded;
-        }
-    }
-
-    public void respond(RHTTPResponse response) throws IOException
-    {
-        responseCompleted(response);
-    }
-
-    private void responseCompleted(RHTTPResponse response) throws IOException
-    {
-        synchronized (lock)
-        {
-            // Could be that we complete exactly when the response is being expired
-            if (!responded)
-            {
-                httpResponse.setStatus(response.getStatusCode());
-
-                for (Map.Entry<String, String> header : response.getHeaders().entrySet())
-                    httpResponse.setHeader(header.getKey(), header.getValue());
-
-                ServletOutputStream output = httpResponse.getOutputStream();
-                output.write(response.getBody());
-                output.flush();
-
-                // It may happen that the continuation is null,
-                // because the response arrived before we had the chance to suspend
-                if (continuation != null)
-                {
-                    continuation.complete();
-                    continuation = null;
-                }
-
-                // Mark as responded, so we know we don't have to suspend
-                // or respond with an expired response
-                responded = true;
-
-                if (logger.isDebugEnabled())
-                {
-                    String eol = System.getProperty("line.separator");
-                    logger.debug("Request {} responded {}{}{}{}{}", new Object[]{request, response, eol, request.toLongString(), eol, response.toLongString()});
-                }
-            }
-        }
-    }
-
-    private void responseExpired() throws IOException
-    {
-        synchronized (lock)
-        {
-            // Could be that we expired exactly when the response is being completed
-            if (!responded)
-            {
-                httpResponse.sendError(HttpServletResponse.SC_GATEWAY_TIMEOUT, "Gateway Time-out");
-
-                continuation.complete();
-                continuation = null;
-
-                // Mark as responded, so we know we don't have to respond with a completed response
-                responded = true;
-
-                logger.debug("Request {} expired", getRequest());
-            }
-        }
-    }
-
-    public RHTTPRequest getRequest()
-    {
-        return request;
-    }
-
-    @Override
-    public String toString()
-    {
-        return request.toString();
-    }
-
-    private class TimeoutListener implements ContinuationListener
-    {
-        public void onComplete(Continuation continuation)
-        {
-        }
-
-        public void onTimeout(Continuation continuation)
-        {
-            ExternalRequest externalRequest = gateway.removeExternalRequest(getRequest().getId());
-            // The gateway request can be null for a race with delivery
-            if (externalRequest != null)
-            {
-                try
-                {
-                    responseExpired();
-                }
-                catch (Exception x)
-                {
-                    logger.warn("Request " + getRequest() + " expired but failed", x);
-                }
-            }
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/StandardGateway.java b/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/StandardGateway.java
deleted file mode 100644
index 1e39889..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/StandardGateway.java
+++ /dev/null
@@ -1,131 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.io.IOException;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.rhttp.client.RHTTPRequest;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/**
- * Default implementation of {@link Gateway}.
- *
- * @version $Revision$ $Date$
- */
-public class StandardGateway implements Gateway
-{
-    private final Logger logger = Log.getLogger(getClass().toString());
-    private final ConcurrentMap<String, ClientDelegate> clients = new ConcurrentHashMap<String, ClientDelegate>();
-    private final ConcurrentMap<Integer, ExternalRequest> requests = new ConcurrentHashMap<Integer, ExternalRequest>();
-    private final AtomicInteger requestIds = new AtomicInteger();
-    private volatile long gatewayTimeout=20000;
-    private volatile long externalTimeout=60000;
-
-    public long getGatewayTimeout()
-    {
-        return gatewayTimeout;
-    }
-
-    public void setGatewayTimeout(long timeout)
-    {
-        this.gatewayTimeout = timeout;
-    }
-
-    public long getExternalTimeout()
-    {
-        return externalTimeout;
-    }
-
-    public void setExternalTimeout(long externalTimeout)
-    {
-        this.externalTimeout = externalTimeout;
-    }
-
-    public ClientDelegate getClientDelegate(String targetId)
-    {
-        return clients.get(targetId);
-    }
-
-    public ClientDelegate newClientDelegate(String targetId)
-    {
-        StandardClientDelegate client = new StandardClientDelegate(targetId);
-        client.setTimeout(getGatewayTimeout());
-        return client;
-    }
-
-    public ClientDelegate addClientDelegate(String targetId, ClientDelegate client)
-    {
-        return clients.putIfAbsent(targetId, client);
-    }
-
-    public ClientDelegate removeClientDelegate(String targetId)
-    {
-        return clients.remove(targetId);
-    }
-
-    public ExternalRequest newExternalRequest(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException
-    {
-        int requestId = requestIds.incrementAndGet();
-        RHTTPRequest request = convertHttpRequest(requestId, httpRequest);
-        StandardExternalRequest gatewayRequest = new StandardExternalRequest(request, httpRequest, httpResponse, this);
-        gatewayRequest.setTimeout(getExternalTimeout());
-        return gatewayRequest;
-    }
-
-    protected RHTTPRequest convertHttpRequest(int requestId, HttpServletRequest httpRequest) throws IOException
-    {
-        Map<String, String> headers = new HashMap<String, String>();
-        for (Enumeration headerNames = httpRequest.getHeaderNames(); headerNames.hasMoreElements();)
-        {
-            String name = (String)headerNames.nextElement();
-            // TODO: improve by supporting getHeaders(name)
-            String value = httpRequest.getHeader(name);
-            headers.put(name, value);
-        }
-
-        byte[] body = Utils.read(httpRequest.getInputStream());
-        return new RHTTPRequest(requestId, httpRequest.getMethod(), httpRequest.getRequestURI(), headers, body);
-    }
-
-    public ExternalRequest addExternalRequest(int requestId, ExternalRequest externalRequest)
-    {
-        ExternalRequest existing = requests.putIfAbsent(requestId, externalRequest);
-        if (existing == null)
-            logger.debug("Added external request {}/{} - {}", new Object[]{requestId, requests.size(), externalRequest});
-        return existing;
-    }
-
-    public ExternalRequest removeExternalRequest(int requestId)
-    {
-        ExternalRequest externalRequest = requests.remove(requestId);
-        if (externalRequest != null)
-            logger.debug("Removed external request {}/{} - {}", new Object[]{requestId, requests.size(), externalRequest});
-        return externalRequest;
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/StandardTargetIdRetriever.java b/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/StandardTargetIdRetriever.java
deleted file mode 100644
index c1d4a62..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/StandardTargetIdRetriever.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * <p>This implementation retrieves the targetId from the request URI following this pattern:</p>
- * <pre>
- * /contextPath/servletPath/&lt;targetId&gt;/other/paths
- * </pre>
- * @version $Revision$ $Date$
- */
-public class StandardTargetIdRetriever implements TargetIdRetriever
-{
-    public String retrieveTargetId(HttpServletRequest httpRequest)
-    {
-        String uri = httpRequest.getRequestURI();
-        String path = uri.substring(httpRequest.getServletPath().length());
-        String[] segments = path.split("/");
-        if (segments.length < 2) return null;
-        return segments[1];
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/TargetIdRetriever.java b/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/TargetIdRetriever.java
deleted file mode 100644
index 53a36bd..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/TargetIdRetriever.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * <p>Implementations should retrieve a <em>targetId</em> from an external request.</p>
- * <p>Implementations of this class may return a fixed value, or inspect the request
- * looking for URL patterns (e.g. "/&lt;targetId&gt;/resource.jsp"), or looking for request
- * parameters (e.g. "/resource.jsp?targetId=&lt;targetId&gt;), or looking for virtual host
- * naming patterns (e.g. "http://&lt;targetId&gt;.host.com/resource.jsp"), etc.</p>
- *
- * @version $Revision$ $Date$
- */
-public interface TargetIdRetriever
-{
-    /**
-     * Extracts and returns the targetId.
-     * @param httpRequest the external request from where the targetId could be extracted
-     * @return the extracted targetId
-     */
-    public String retrieveTargetId(HttpServletRequest httpRequest);
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/Utils.java b/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/Utils.java
deleted file mode 100644
index 325232a..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/main/java/org/eclipse/jetty/rhttp/gateway/Utils.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * @version $Revision$ $Date$
- */
-class Utils
-{
-    static byte[] read(InputStream input) throws IOException
-    {
-        ByteArrayOutputStream body = new ByteArrayOutputStream();
-        byte[] buffer = new byte[1024];
-        int read;
-        while ((read = input.read(buffer)) >= 0)
-            body.write(buffer, 0, read);
-        body.close();
-        return body.toByteArray();
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/ClientTimeoutTest.java b/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/ClientTimeoutTest.java
deleted file mode 100644
index ad87f82..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/ClientTimeoutTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jetty.client.Address;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.rhttp.client.ClientListener;
-import org.eclipse.jetty.rhttp.client.JettyClient;
-import org.eclipse.jetty.rhttp.client.RHTTPClient;
-import org.eclipse.jetty.rhttp.gateway.GatewayServer;
-import org.eclipse.jetty.rhttp.gateway.StandardGateway;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
-
-
-/**
- * @version $Revision$ $Date$
- */
-public class ClientTimeoutTest extends TestCase
-{
-    public void testClientTimeout() throws Exception
-    {
-        GatewayServer server = new GatewayServer();
-        Connector connector = new SelectChannelConnector();
-        server.addConnector(connector);
-        final long clientTimeout = 2000L;
-        server.getConnectorServlet().setInitParameter("clientTimeout",""+clientTimeout);
-        final long gatewayTimeout = 4000L;
-        ((StandardGateway)server.getGateway()).setGatewayTimeout(gatewayTimeout);
-        server.start();
-        try
-        {
-            Address address = new Address("localhost", connector.getLocalPort());
-
-            HttpClient httpClient = new HttpClient();
-            httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
-            httpClient.start();
-            try
-            {
-                String targetId = "1";
-                final RHTTPClient client = new JettyClient(httpClient, address, server.getContext().getContextPath()+GatewayServer.DFT_CONNECT_PATH, targetId)
-                {
-                    private final AtomicInteger connects = new AtomicInteger();
-
-                    @Override
-                    protected void asyncConnect()
-                    {
-                        if (connects.incrementAndGet() == 2)
-                        {
-                            try
-                            {
-                                // Wait here instead of connecting, so that the client expires on the server
-                                Thread.sleep(clientTimeout * 2);
-                            }
-                            catch (InterruptedException x)
-                            {
-                                throw new RuntimeException(x);
-                            }
-                        }
-                        super.asyncConnect();
-                    }
-                };
-
-                final CountDownLatch connectLatch = new CountDownLatch(1);
-                client.addClientListener(new ClientListener.Adapter()
-                {
-                    @Override
-                    public void connectRequired()
-                    {
-                        connectLatch.countDown();
-                    }
-                });
-                client.connect();
-                try
-                {
-                    assertTrue(connectLatch.await(gatewayTimeout + clientTimeout * 3, TimeUnit.MILLISECONDS));
-                }
-                finally
-                {
-                    client.disconnect();
-                }
-            }
-            finally
-            {
-                httpClient.stop();
-            }
-        }
-        finally
-        {
-            server.stop();
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/DisconnectClientTest.java b/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/DisconnectClientTest.java
deleted file mode 100644
index 89f4281..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/DisconnectClientTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.io.IOException;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jetty.client.Address;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.rhttp.client.JettyClient;
-import org.eclipse.jetty.rhttp.client.RHTTPClient;
-import org.eclipse.jetty.rhttp.gateway.GatewayServer;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
-
-
-/**
- * @version $Revision$ $Date$
- */
-public class DisconnectClientTest extends TestCase
-{
-    public void testDifferentClientDisconnects() throws Exception
-    {
-        GatewayServer server = new GatewayServer();
-        Connector connector = new SelectChannelConnector();
-        server.addConnector(connector);
-        server.start();
-        try
-        {
-            Address address = new Address("localhost", connector.getLocalPort());
-
-            HttpClient httpClient = new HttpClient();
-            httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
-            httpClient.start();
-            try
-            {
-                final CountDownLatch latch = new CountDownLatch(1);
-                String targetId = "1";
-                final RHTTPClient client1 = new JettyClient(httpClient, address, server.getContext().getContextPath()+GatewayServer.DFT_CONNECT_PATH, targetId)
-                {
-                    @Override
-                    protected void connectComplete(byte[] responseContent) throws IOException
-                    {
-                        // If the other client can disconnect this one, this method is called soon after it disconnected
-                        latch.countDown();
-                        super.connectComplete(responseContent);
-                    }
-                };
-                client1.connect();
-                try
-                {
-                    final RHTTPClient client2 = new JettyClient(httpClient, address, server.getContext().getContextPath()+GatewayServer.DFT_CONNECT_PATH, targetId);
-                    // Disconnect client 2, this should not disconnect client1
-                    client2.disconnect();
-
-                    // We want the await() to expire, it means it has not disconnected
-                    assertFalse(latch.await(1000, TimeUnit.MILLISECONDS));
-                }
-                finally
-                {
-                    client1.disconnect();
-                }
-            }
-            finally
-            {
-                httpClient.stop();
-            }
-        }
-        finally
-        {
-            server.stop();
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/DuplicateClientTest.java b/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/DuplicateClientTest.java
deleted file mode 100644
index f8821ae..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/DuplicateClientTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.io.IOException;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jetty.client.Address;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.rhttp.client.JettyClient;
-import org.eclipse.jetty.rhttp.client.RHTTPClient;
-import org.eclipse.jetty.rhttp.gateway.GatewayServer;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
-
-
-/**
- * @version $Revision$ $Date$
- */
-public class DuplicateClientTest extends TestCase
-{
-    public void testDuplicateClient() throws Exception
-    {
-        GatewayServer server = new GatewayServer();
-        Connector connector = new SelectChannelConnector();
-        server.addConnector(connector);
-        server.start();
-        try
-        {
-            Address address = new Address("localhost", connector.getLocalPort());
-
-            HttpClient httpClient = new HttpClient();
-            httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
-            httpClient.start();
-            try
-            {
-                String targetId = "1";
-                final RHTTPClient client1 = new JettyClient(httpClient, address, server.getContext().getContextPath()+GatewayServer.DFT_CONNECT_PATH, targetId);
-                client1.connect();
-                try
-                {
-                    final RHTTPClient client2 = new JettyClient(httpClient, address, server.getContext().getContextPath()+GatewayServer.DFT_CONNECT_PATH, targetId);
-                    try
-                    {
-                        client2.connect();
-                        fail();
-                    }
-                    catch (IOException x)
-                    {
-                    }
-                }
-                finally
-                {
-                    client1.disconnect();
-                }
-            }
-            finally
-            {
-                httpClient.stop();
-            }
-        }
-        finally
-        {
-            server.stop();
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/ExternalRequestNotSuspendedTest.java b/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/ExternalRequestNotSuspendedTest.java
deleted file mode 100644
index 631c357..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/ExternalRequestNotSuspendedTest.java
+++ /dev/null
@@ -1,186 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.io.IOException;
-import java.net.URLEncoder;
-import java.util.HashMap;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jetty.client.Address;
-import org.eclipse.jetty.client.ContentExchange;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.HttpExchange;
-import org.eclipse.jetty.http.HttpMethods;
-import org.eclipse.jetty.io.ByteArrayBuffer;
-import org.eclipse.jetty.rhttp.client.JettyClient;
-import org.eclipse.jetty.rhttp.client.RHTTPClient;
-import org.eclipse.jetty.rhttp.client.RHTTPListener;
-import org.eclipse.jetty.rhttp.client.RHTTPRequest;
-import org.eclipse.jetty.rhttp.client.RHTTPResponse;
-import org.eclipse.jetty.rhttp.gateway.ExternalRequest;
-import org.eclipse.jetty.rhttp.gateway.Gateway;
-import org.eclipse.jetty.rhttp.gateway.GatewayServer;
-import org.eclipse.jetty.rhttp.gateway.StandardGateway;
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
-
-
-/**
- * @version $Revision$ $Date$
- */
-public class ExternalRequestNotSuspendedTest extends TestCase
-{
-    public void testExternalRequestNotSuspended() throws Exception
-    {
-        final CountDownLatch respondLatch = new CountDownLatch(1);
-        final CountDownLatch suspendLatch = new CountDownLatch(1);
-        final AtomicBoolean suspended = new AtomicBoolean(true);
-        GatewayServer server = new GatewayServer()
-        {
-            @Override
-            protected Gateway createGateway()
-            {
-                StandardGateway gateway = new StandardGateway()
-                {
-                    @Override
-                    public ExternalRequest newExternalRequest(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException
-                    {
-                        return new SlowToSuspendExternalRequest(super.newExternalRequest(httpRequest, httpResponse), respondLatch, suspendLatch, suspended);
-                    }
-                };
-                return gateway;
-            }
-        };
-        SelectChannelConnector connector = new SelectChannelConnector();
-        server.addConnector(connector);
-        server.start();
-        try
-        {
-            Address address = new Address("localhost", connector.getLocalPort());
-
-            HttpClient httpClient = new HttpClient();
-            httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
-            httpClient.start();
-            try
-            {
-                String targetId = "1";
-                final RHTTPClient client = new JettyClient(httpClient, address, server.getContext().getContextPath()+GatewayServer.DFT_CONNECT_PATH, targetId);
-                final AtomicReference<Exception> exception = new AtomicReference<Exception>();
-                client.addListener(new RHTTPListener()
-                {
-                    public void onRequest(RHTTPRequest request)
-                    {
-                        try
-                        {
-                            RHTTPResponse response = new RHTTPResponse(request.getId(), 200, "OK", new HashMap<String, String>(), request.getBody());
-                            client.deliver(response);
-                        }
-                        catch (Exception x)
-                        {
-                            exception.set(x);
-                        }
-                    }
-                });
-
-                client.connect();
-                try
-                {
-                    // Make a request to the gateway and check response
-                    ContentExchange exchange = new ContentExchange(true);
-                    exchange.setMethod(HttpMethods.POST);
-                    exchange.setAddress(address);
-                    exchange.setURI(server.getContext().getContextPath()+GatewayServer.DFT_EXT_PATH + "/" + URLEncoder.encode(targetId, "UTF-8"));
-                    String requestContent = "body";
-                    exchange.setRequestContent(new ByteArrayBuffer(requestContent.getBytes("UTF-8")));
-                    httpClient.send(exchange);
-
-                    int status = exchange.waitForDone();
-                    assertEquals(HttpExchange.STATUS_COMPLETED, status);
-                    assertEquals(HttpServletResponse.SC_OK, exchange.getResponseStatus());
-                    assertNull(exception.get());
-
-                    suspendLatch.await();
-                    assertFalse(suspended.get());
-                }
-                finally
-                {
-                    client.disconnect();
-                }
-            }
-            finally
-            {
-                httpClient.stop();
-            }
-        }
-        finally
-        {
-            server.stop();
-        }
-    }
-
-    private class SlowToSuspendExternalRequest implements ExternalRequest
-    {
-        private final ExternalRequest delegate;
-        private final CountDownLatch respondLatch;
-        private final CountDownLatch suspendLatch;
-        private final AtomicBoolean suspended;
-
-        private SlowToSuspendExternalRequest(ExternalRequest delegate, CountDownLatch respondLatch, CountDownLatch suspendLatch, AtomicBoolean suspended)
-        {
-            this.delegate = delegate;
-            this.respondLatch = respondLatch;
-            this.suspendLatch = suspendLatch;
-            this.suspended = suspended;
-        }
-
-        public boolean suspend()
-        {
-            try
-            {
-                respondLatch.await();
-                boolean result = delegate.suspend();
-                suspended.set(result);
-                suspendLatch.countDown();
-                return result;
-            }
-            catch (InterruptedException x)
-            {
-                throw new AssertionError(x);
-            }
-        }
-
-        public void respond(RHTTPResponse response) throws IOException
-        {
-            delegate.respond(response);
-            respondLatch.countDown();
-        }
-
-        public RHTTPRequest getRequest()
-        {
-            return delegate.getRequest();
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/ExternalTimeoutTest.java b/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/ExternalTimeoutTest.java
deleted file mode 100644
index fba9334..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/ExternalTimeoutTest.java
+++ /dev/null
@@ -1,126 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.net.URLEncoder;
-import java.util.HashMap;
-import java.util.concurrent.atomic.AtomicReference;
-
-import javax.servlet.http.HttpServletResponse;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jetty.client.Address;
-import org.eclipse.jetty.client.ContentExchange;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.HttpExchange;
-import org.eclipse.jetty.http.HttpMethods;
-import org.eclipse.jetty.io.ByteArrayBuffer;
-import org.eclipse.jetty.rhttp.client.JettyClient;
-import org.eclipse.jetty.rhttp.client.RHTTPClient;
-import org.eclipse.jetty.rhttp.client.RHTTPListener;
-import org.eclipse.jetty.rhttp.client.RHTTPRequest;
-import org.eclipse.jetty.rhttp.client.RHTTPResponse;
-import org.eclipse.jetty.rhttp.gateway.GatewayServer;
-import org.eclipse.jetty.rhttp.gateway.StandardGateway;
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
-
-
-/**
- * @version $Revision$ $Date$
- */
-public class ExternalTimeoutTest extends TestCase
-{
-    public void testExternalTimeout() throws Exception
-    {
-        GatewayServer server = new GatewayServer();
-        SelectChannelConnector connector = new SelectChannelConnector();
-        server.addConnector(connector);
-        final long externalTimeout = 5000L;
-        ((StandardGateway)server.getGateway()).setExternalTimeout(externalTimeout);
-        server.start();
-        try
-        {
-            Address address = new Address("localhost", connector.getLocalPort());
-
-            HttpClient httpClient = new HttpClient();
-            httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
-            httpClient.start();
-            try
-            {
-                String targetId = "1";
-                final RHTTPClient client = new JettyClient(httpClient, address, server.getContext().getContextPath()+GatewayServer.DFT_CONNECT_PATH, targetId);
-                final AtomicReference<Integer> requestId = new AtomicReference<Integer>();
-                final AtomicReference<Exception> exceptionRef = new AtomicReference<Exception>();
-                client.addListener(new RHTTPListener()
-                {
-                    public void onRequest(RHTTPRequest request)
-                    {
-                        try
-                        {
-                            // Save the request id
-                            requestId.set(request.getId());
-
-                            // Wait until external timeout expires
-                            Thread.sleep(externalTimeout + 1000L);
-                            RHTTPResponse response = new RHTTPResponse(request.getId(), 200, "OK", new HashMap<String, String>(), request.getBody());
-                            client.deliver(response);
-                        }
-                        catch (Exception x)
-                        {
-                            exceptionRef.set(x);
-                        }
-                    }
-                });
-
-                client.connect();
-                try
-                {
-                    // Make a request to the gateway and check response
-                    ContentExchange exchange = new ContentExchange(true);
-                    exchange.setMethod(HttpMethods.POST);
-                    exchange.setAddress(address);
-                    exchange.setURI(server.getContext().getContextPath()+GatewayServer.DFT_EXT_PATH + "/" + URLEncoder.encode(targetId, "UTF-8"));
-                    String requestContent = "body";
-                    exchange.setRequestContent(new ByteArrayBuffer(requestContent.getBytes("UTF-8")));
-                    httpClient.send(exchange);
-
-                    int status = exchange.waitForDone();
-                    assertEquals(HttpExchange.STATUS_COMPLETED, status);
-                    assertEquals(HttpServletResponse.SC_GATEWAY_TIMEOUT, exchange.getResponseStatus());
-                    assertNull(exceptionRef.get());
-
-                    assertNull(server.getGateway().removeExternalRequest(requestId.get()));
-                }
-                finally
-                {
-                    client.disconnect();
-                }
-            }
-            finally
-            {
-                httpClient.stop();
-            }
-        }
-        finally
-        {
-            server.stop();
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/GatewayEchoServer.java b/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/GatewayEchoServer.java
deleted file mode 100644
index 769eb3f..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/GatewayEchoServer.java
+++ /dev/null
@@ -1,109 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.util.HashMap;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.eclipse.jetty.client.Address;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.rhttp.client.JettyClient;
-import org.eclipse.jetty.rhttp.client.RHTTPClient;
-import org.eclipse.jetty.rhttp.client.RHTTPListener;
-import org.eclipse.jetty.rhttp.client.RHTTPRequest;
-import org.eclipse.jetty.rhttp.client.RHTTPResponse;
-import org.eclipse.jetty.rhttp.gateway.GatewayServer;
-import org.eclipse.jetty.rhttp.gateway.TargetIdRetriever;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
-
-
-/**
- * @version $Revision$ $Date$
- */
-public class GatewayEchoServer
-{
-    private volatile GatewayServer server;
-    private volatile Address address;
-    private volatile String uri;
-    private volatile HttpClient httpClient;
-    private volatile RHTTPClient client;
-
-    public void start() throws Exception
-    {
-        server = new GatewayServer();
-        Connector connector = new SelectChannelConnector();
-        server.addConnector(connector);
-        server.setTargetIdRetriever(new EchoTargetIdRetriever());
-        server.start();
-        server.dumpStdErr();
-        address = new Address("localhost", connector.getLocalPort());
-        uri = server.getContext().getContextPath()+GatewayServer.DFT_EXT_PATH;
-
-        httpClient = new HttpClient();
-        httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
-        httpClient.start();
-
-        client = new JettyClient(httpClient, new Address("localhost", connector.getLocalPort()), server.getContext().getContextPath()+GatewayServer.DFT_CONNECT_PATH, "echo");
-        client.addListener(new EchoListener(client));
-        client.connect();
-    }
-
-    public void stop() throws Exception
-    {
-        client.disconnect();
-        httpClient.stop();
-        server.stop();
-    }
-
-    public Address getAddress()
-    {
-        return address;
-    }
-
-    public String getURI()
-    {
-        return uri;
-    }
-
-    public static class EchoTargetIdRetriever implements TargetIdRetriever
-    {
-        public String retrieveTargetId(HttpServletRequest httpRequest)
-        {
-            return "echo";
-        }
-    }
-
-    private static class EchoListener implements RHTTPListener
-    {
-        private final RHTTPClient client;
-
-        public EchoListener(RHTTPClient client)
-        {
-            this.client = client;
-        }
-
-        public void onRequest(RHTTPRequest request) throws Exception
-        {
-            RHTTPResponse response = new RHTTPResponse(request.getId(), 200, "OK", new HashMap<String, String>(), request.getBody());
-            client.deliver(response);
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/GatewayEchoTest.java b/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/GatewayEchoTest.java
deleted file mode 100644
index 103c1aa..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/GatewayEchoTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import javax.servlet.http.HttpServletResponse;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jetty.client.ContentExchange;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.HttpExchange;
-import org.eclipse.jetty.http.HttpMethods;
-import org.eclipse.jetty.io.ByteArrayBuffer;
-
-/**
- * @version $Revision$ $Date$
- */
-public class GatewayEchoTest extends TestCase
-{
-    /**
-     * Tests that the basic functionality of the gateway works,
-     * by issuing a request and by replying with the same body.
-     *
-     * @throws Exception in case of test exceptions
-     */
-    public void testEcho() throws Exception
-    {
-        GatewayEchoServer server = new GatewayEchoServer();
-        server.start();
-        try
-        {
-            HttpClient httpClient = new HttpClient();
-            httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
-            httpClient.start();
-            try
-            {
-                // Make a request to the gateway and check response
-                ContentExchange exchange = new ContentExchange(true);
-                exchange.setMethod(HttpMethods.POST);
-                exchange.setAddress(server.getAddress());
-                exchange.setURI(server.getURI() + "/");
-                String requestBody = "body";
-                exchange.setRequestContent(new ByteArrayBuffer(requestBody.getBytes("UTF-8")));
-                httpClient.send(exchange);
-                int status = exchange.waitForDone();
-                assertEquals(HttpExchange.STATUS_COMPLETED, status);
-                assertEquals(HttpServletResponse.SC_OK, exchange.getResponseStatus());
-                String responseContent = exchange.getResponseContent();
-                assertEquals(responseContent, requestBody);
-            }
-            finally
-            {
-                httpClient.stop();
-            }
-        }
-        finally
-        {
-            server.stop();
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/GatewayLoadTest.java b/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/GatewayLoadTest.java
deleted file mode 100644
index c552675..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/GatewayLoadTest.java
+++ /dev/null
@@ -1,202 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-
-import javax.servlet.http.HttpServletResponse;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jetty.client.ContentExchange;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.http.HttpMethods;
-import org.eclipse.jetty.io.ByteArrayBuffer;
-
-/**
- * @version $Revision$ $Date$
- */
-public class GatewayLoadTest extends TestCase
-{
-    private final ConcurrentMap<Long, AtomicLong> latencies = new ConcurrentHashMap<Long, AtomicLong>();
-    private final AtomicLong responses = new AtomicLong(0L);
-    private final AtomicLong failures = new AtomicLong(0L);
-    private final AtomicLong minLatency = new AtomicLong(Long.MAX_VALUE);
-    private final AtomicLong maxLatency = new AtomicLong(0L);
-    private final AtomicLong totLatency = new AtomicLong(0L);
-
-    public void testEcho() throws Exception
-    {
-        GatewayEchoServer server = new GatewayEchoServer();
-        server.start();
-
-        HttpClient httpClient = new HttpClient();
-        httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
-        httpClient.start();
-
-        String uri = server.getURI() + "/";
-
-        char[] chars = new char[1024];
-        Arrays.fill(chars, 'x');
-        String requestBody = new String(chars);
-
-        int count = 1000;
-        CountDownLatch latch = new CountDownLatch(count);
-        for (int i = 0; i < count; ++i)
-        {
-            GatewayLoadTestExchange exchange = new GatewayLoadTestExchange(latch);
-            exchange.setMethod(HttpMethods.POST);
-            exchange.setAddress(server.getAddress());
-            exchange.setURI(uri + i);
-            exchange.setRequestContent(new ByteArrayBuffer(requestBody.getBytes("UTF-8")));
-            exchange.setStartNanos(System.nanoTime());
-            httpClient.send(exchange);
-            Thread.sleep(5);
-        }
-        latch.await();
-        printLatencies(count);
-        assertEquals(count, responses.get() + failures.get());
-    }
-
-    private void updateLatencies(long start, long end)
-    {
-        long latency = end - start;
-
-        // Update the latencies using a non-blocking algorithm
-        long oldMinLatency = minLatency.get();
-        while (latency < oldMinLatency)
-        {
-            if (minLatency.compareAndSet(oldMinLatency, latency)) break;
-            oldMinLatency = minLatency.get();
-        }
-        long oldMaxLatency = maxLatency.get();
-        while (latency > oldMaxLatency)
-        {
-            if (maxLatency.compareAndSet(oldMaxLatency, latency)) break;
-            oldMaxLatency = maxLatency.get();
-        }
-        totLatency.addAndGet(latency);
-
-        latencies.putIfAbsent(latency, new AtomicLong(0L));
-        latencies.get(latency).incrementAndGet();
-    }
-
-    public void printLatencies(long expectedCount)
-    {
-        if (latencies.size() > 1)
-        {
-            long maxLatencyBucketFrequency = 0L;
-            long[] latencyBucketFrequencies = new long[20];
-            long latencyRange = maxLatency.get() - minLatency.get();
-            for (Iterator<Map.Entry<Long, AtomicLong>> entries = latencies.entrySet().iterator(); entries.hasNext();)
-            {
-                Map.Entry<Long, AtomicLong> entry = entries.next();
-                long latency = entry.getKey();
-                Long bucketIndex = (latency - minLatency.get()) * latencyBucketFrequencies.length / latencyRange;
-                int index = bucketIndex.intValue() == latencyBucketFrequencies.length ? latencyBucketFrequencies.length - 1 : bucketIndex.intValue();
-                long value = entry.getValue().get();
-                latencyBucketFrequencies[index] += value;
-                if (latencyBucketFrequencies[index] > maxLatencyBucketFrequency) maxLatencyBucketFrequency = latencyBucketFrequencies[index];
-                entries.remove();
-            }
-
-            System.out.println("Messages - Latency Distribution Curve (X axis: Frequency, Y axis: Latency):");
-            for (int i = 0; i < latencyBucketFrequencies.length; i++)
-            {
-                long latencyBucketFrequency = latencyBucketFrequencies[i];
-                int value = Math.round(latencyBucketFrequency * (float) latencyBucketFrequencies.length / maxLatencyBucketFrequency);
-                if (value == latencyBucketFrequencies.length) value = value - 1;
-                for (int j = 0; j < value; ++j) System.out.print(" ");
-                System.out.print("@");
-                for (int j = value + 1; j < latencyBucketFrequencies.length; ++j) System.out.print(" ");
-                System.out.print("  _  ");
-                System.out.print(TimeUnit.NANOSECONDS.toMillis((latencyRange * (i + 1) / latencyBucketFrequencies.length) + minLatency.get()));
-                System.out.print(" (" + latencyBucketFrequency + ")");
-                System.out.println(" ms");
-            }
-        }
-
-        long responseCount = responses.get();
-        System.out.print("Messages success/failed/expected = ");
-        System.out.print(responseCount);
-        System.out.print("/");
-        System.out.print(failures.get());
-        System.out.print("/");
-        System.out.print(expectedCount);
-        System.out.print(" - Latency min/ave/max = ");
-        System.out.print(TimeUnit.NANOSECONDS.toMillis(minLatency.get()) + "/");
-        System.out.print(responseCount == 0 ? "-/" : TimeUnit.NANOSECONDS.toMillis(totLatency.get() / responseCount) + "/");
-        System.out.println(TimeUnit.NANOSECONDS.toMillis(maxLatency.get()) + " ms");
-    }
-
-    private class GatewayLoadTestExchange extends ContentExchange
-    {
-        private final CountDownLatch latch;
-        private volatile long start;
-
-        private GatewayLoadTestExchange(CountDownLatch latch)
-        {
-            super(true);
-            this.latch = latch;
-        }
-
-        @Override
-        protected void onResponseComplete() throws IOException
-        {
-            if (getResponseStatus() == HttpServletResponse.SC_OK)
-            {
-                long end = System.nanoTime();
-                responses.incrementAndGet();
-                updateLatencies(start, end);
-            }
-            else
-            {
-                failures.incrementAndGet();
-            }
-            latch.countDown();
-        }
-
-        @Override
-        protected void onException(Throwable throwable)
-        {
-            failures.incrementAndGet();
-            latch.countDown();
-        }
-
-        @Override
-        protected void onExpire()
-        {
-            failures.incrementAndGet();
-            latch.countDown();
-        }
-
-        public void setStartNanos(long value)
-        {
-            start = value;
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/GatewayTimeoutTest.java b/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/GatewayTimeoutTest.java
deleted file mode 100644
index 504e4f4..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/GatewayTimeoutTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.net.URLEncoder;
-import java.util.HashMap;
-import java.util.concurrent.atomic.AtomicReference;
-
-import javax.servlet.http.HttpServletResponse;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jetty.client.Address;
-import org.eclipse.jetty.client.ContentExchange;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.HttpExchange;
-import org.eclipse.jetty.http.HttpMethods;
-import org.eclipse.jetty.io.ByteArrayBuffer;
-import org.eclipse.jetty.rhttp.client.JettyClient;
-import org.eclipse.jetty.rhttp.client.RHTTPClient;
-import org.eclipse.jetty.rhttp.client.RHTTPListener;
-import org.eclipse.jetty.rhttp.client.RHTTPRequest;
-import org.eclipse.jetty.rhttp.client.RHTTPResponse;
-import org.eclipse.jetty.rhttp.gateway.GatewayServer;
-import org.eclipse.jetty.rhttp.gateway.StandardGateway;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
-
-
-/**
- * @version $Revision$ $Date$
- */
-public class GatewayTimeoutTest extends TestCase
-{
-    /**
-     * Tests a forwarded request that lasts longer than the gateway timeout.
-     * The gateway client will perform 2 long polls before the forwarded request's response is returned.
-     *
-     * @throws Exception in case of test exceptions
-     */
-    public void testGatewayTimeout() throws Exception
-    {
-        GatewayServer server = new GatewayServer();
-        Connector connector = new SelectChannelConnector();
-        server.addConnector(connector);
-        final long gatewayTimeout = 5000L;
-        ((StandardGateway)server.getGateway()).setGatewayTimeout(gatewayTimeout);
-        final long externalTimeout = gatewayTimeout * 2;
-        ((StandardGateway)server.getGateway()).setExternalTimeout(externalTimeout);
-        server.start();
-        try
-        {
-            Address address = new Address("localhost", connector.getLocalPort());
-
-            HttpClient httpClient = new HttpClient();
-            httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
-            httpClient.start();
-            try
-            {
-                String targetId = "1";
-                final RHTTPClient client = new JettyClient(httpClient, address, server.getContext().getContextPath()+GatewayServer.DFT_CONNECT_PATH, targetId);
-                final AtomicReference<Exception> exceptionRef = new AtomicReference<Exception>();
-                client.addListener(new RHTTPListener()
-                {
-                    public void onRequest(RHTTPRequest request)
-                    {
-                        try
-                        {
-                            // Wait until gateway timeout expires
-                            Thread.sleep(gatewayTimeout + 1000L);
-                            RHTTPResponse response = new RHTTPResponse(request.getId(), 200, "OK", new HashMap<String, String>(), request.getBody());
-                            client.deliver(response);
-                        }
-                        catch (Exception x)
-                        {
-                            exceptionRef.set(x);
-                        }
-                    }
-                });
-                client.connect();
-                try
-                {
-                    // Make a request to the gateway and check response
-                    ContentExchange exchange = new ContentExchange(true);
-                    exchange.setMethod(HttpMethods.POST);
-                    exchange.setAddress(address);
-                    exchange.setURI(server.getContext().getContextPath()+GatewayServer.DFT_EXT_PATH + "/" + URLEncoder.encode(targetId, "UTF-8"));
-                    String requestContent = "body";
-                    exchange.setRequestContent(new ByteArrayBuffer(requestContent.getBytes("UTF-8")));
-                    httpClient.send(exchange);
-
-                    int status = exchange.waitForDone();
-                    assertEquals(HttpExchange.STATUS_COMPLETED, status);
-                    assertEquals(HttpServletResponse.SC_OK, exchange.getResponseStatus());
-                    assertNull(exceptionRef.get());
-                    String responseContent = exchange.getResponseContent();
-                    assertEquals(responseContent, requestContent);
-                }
-                finally
-                {
-                    client.disconnect();
-                }
-            }
-            finally
-            {
-                httpClient.stop();
-            }
-        }
-        finally
-        {
-            server.stop();
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/HandshakeClientTest.java b/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/HandshakeClientTest.java
deleted file mode 100644
index b2e4ca8..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/HandshakeClientTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jetty.client.Address;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.rhttp.client.JettyClient;
-import org.eclipse.jetty.rhttp.client.RHTTPClient;
-import org.eclipse.jetty.rhttp.gateway.GatewayServer;
-import org.eclipse.jetty.rhttp.gateway.StandardGateway;
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
-
-
-/**
- * @version $Revision$ $Date$
- */
-public class HandshakeClientTest extends TestCase
-{
-    public void testConnectReturnsImmediately() throws Exception
-    {
-        GatewayServer server = new GatewayServer();
-        SelectChannelConnector connector = new SelectChannelConnector();
-        server.addConnector(connector);
-        long gwt=5000L;
-        ((StandardGateway)server.getGateway()).setGatewayTimeout(gwt);
-        server.start();
-        try
-        {
-            HttpClient httpClient = new HttpClient();
-            httpClient.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
-            httpClient.start();
-            try
-            {
-                RHTTPClient client = new JettyClient(httpClient, new Address("localhost", connector.getLocalPort()), server.getContext().getContextPath()+GatewayServer.DFT_CONNECT_PATH, "test1");
-                long start = System.currentTimeMillis();
-                client.connect();
-                try
-                {
-                    long end = System.currentTimeMillis();
-                    assertTrue(end - start < gwt / 2);
-                }
-                finally
-                {
-                    client.disconnect();
-                }
-            }
-            finally
-            {
-                httpClient.stop();
-            }
-        }
-        finally
-        {
-            server.stop();
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/HostTargetIdRetrieverTest.java b/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/HostTargetIdRetrieverTest.java
deleted file mode 100644
index 8da0206..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/test/java/org/eclipse/jetty/rhttp/gateway/HostTargetIdRetrieverTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.gateway;
-
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.eclipse.jetty.rhttp.gateway.HostTargetIdRetriever;
-
-import junit.framework.TestCase;
-
-/**
- * @version $Revision$ $Date$
- */
-public class HostTargetIdRetrieverTest extends TestCase
-{
-    public void testHostTargetIdRetrieverNoSuffix()
-    {
-        String host = "test";
-        Class<HttpServletRequest> klass = HttpServletRequest.class;
-        HttpServletRequest request = (HttpServletRequest)Proxy.newProxyInstance(klass.getClassLoader(), new Class<?>[]{klass}, new Request(host));
-
-        HostTargetIdRetriever retriever = new HostTargetIdRetriever(null);
-        String result = retriever.retrieveTargetId(request);
-
-        assertEquals(host, result);
-    }
-
-    public void testHostTargetIdRetrieverWithSuffix()
-    {
-        String suffix = ".rhttp.example.com";
-        String host = "test";
-        Class<HttpServletRequest> klass = HttpServletRequest.class;
-        HttpServletRequest request = (HttpServletRequest)Proxy.newProxyInstance(klass.getClassLoader(), new Class<?>[]{klass}, new Request(host + suffix));
-
-        HostTargetIdRetriever retriever = new HostTargetIdRetriever(suffix);
-        String result = retriever.retrieveTargetId(request);
-
-        assertEquals(host, result);
-    }
-
-    public void testHostTargetIdRetrieverWithSuffixAndPort()
-    {
-        String suffix = ".rhttp.example.com";
-        String host = "test";
-        Class<HttpServletRequest> klass = HttpServletRequest.class;
-        HttpServletRequest request = (HttpServletRequest)Proxy.newProxyInstance(klass.getClassLoader(), new Class<?>[]{klass}, new Request(host + suffix + ":8080"));
-
-        HostTargetIdRetriever retriever = new HostTargetIdRetriever(suffix);
-        String result = retriever.retrieveTargetId(request);
-
-        assertEquals(host, result);
-    }
-
-    public void testHostTargetIdRetrieverNullHost()
-    {
-        Class<HttpServletRequest> klass = HttpServletRequest.class;
-        HttpServletRequest request = (HttpServletRequest)Proxy.newProxyInstance(klass.getClassLoader(), new Class<?>[]{klass}, new Request(null));
-
-        HostTargetIdRetriever retriever = new HostTargetIdRetriever(".rhttp.example.com");
-        String result = retriever.retrieveTargetId(request);
-
-        assertNull(result);
-    }
-
-    private static class Request implements InvocationHandler
-    {
-        private final String host;
-
-        private Request(String host)
-        {
-            this.host = host;
-        }
-
-        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
-        {
-            if ("getHeader".equals(method.getName()))
-            {
-                if (args.length == 1 && "Host".equals(args[0]))
-                {
-                    return host;
-                }
-            }
-            return null;
-        }
-    }
-
-}
diff --git a/jetty-rhttp/jetty-rhttp-gateway/src/test/resources/log4j.properties b/jetty-rhttp/jetty-rhttp-gateway/src/test/resources/log4j.properties
deleted file mode 100644
index 8e6eddb..0000000
--- a/jetty-rhttp/jetty-rhttp-gateway/src/test/resources/log4j.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-# LOG4J levels: OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL
-#
-log4j.rootLogger=ALL,CONSOLE
-
-log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
-#log4j.appender.CONSOLE.threshold=INFO
-log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
-#log4j.appender.CONSOLE.layout.ConversionPattern=%d %t [%5p][%c{1}] %m%n
-log4j.appender.CONSOLE.layout.ConversionPattern=%d [%5p][%c] %m%n
-
-# Level tuning
-log4j.logger.org.eclipse.jetty=INFO
-log4j.logger.org.mortbay.jetty.rhttp=INFO
diff --git a/jetty-rhttp/jetty-rhttp-loadtest/pom.xml b/jetty-rhttp/jetty-rhttp-loadtest/pom.xml
deleted file mode 100644
index bd36d4e..0000000
--- a/jetty-rhttp/jetty-rhttp-loadtest/pom.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.eclipse.jetty.rhttp</groupId>
-        <artifactId>jetty-rhttp-project</artifactId>
-        <version>9.0.0-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>reverse-http-loadtest</artifactId>
-    <packaging>jar</packaging>
-    <name>Jetty :: Reverse HTTP :: Load Test</name>
-
-    <profiles>
-        <profile>
-            <id>loader</id>
-            <activation>
-                <activeByDefault>true</activeByDefault>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>exec-maven-plugin</artifactId>
-                        <configuration>
-                            <mainClass>org.eclipse.jetty.rhttp.loadtest.Loader</mainClass>
-                            <classpathScope>runtime</classpathScope>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>server</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>exec-maven-plugin</artifactId>
-                        <configuration>
-                            <mainClass>org.eclipse.jetty.rhttp.loadtest.Server</mainClass>
-                            <classpathScope>runtime</classpathScope>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>reverse-http-gateway</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/jetty-rhttp/jetty-rhttp-loadtest/src/main/java/org/eclipse/jetty/rhttp/loadtest/Loader.java b/jetty-rhttp/jetty-rhttp-loadtest/src/main/java/org/eclipse/jetty/rhttp/loadtest/Loader.java
deleted file mode 100644
index 50dbd28..0000000
--- a/jetty-rhttp/jetty-rhttp-loadtest/src/main/java/org/eclipse/jetty/rhttp/loadtest/Loader.java
+++ /dev/null
@@ -1,429 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.loadtest;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.eclipse.jetty.client.Address;
-import org.eclipse.jetty.client.ContentExchange;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.io.ByteArrayBuffer;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.mortbay.jetty.rhttp.client.RHTTPClient;
-import org.mortbay.jetty.rhttp.client.JettyClient;
-import org.mortbay.jetty.rhttp.client.RHTTPListener;
-import org.mortbay.jetty.rhttp.client.RHTTPRequest;
-import org.mortbay.jetty.rhttp.client.RHTTPResponse;
-
-/**
- * @version $Revision$ $Date$
- */
-public class Loader
-{
-    private final List<RHTTPClient> clients = new ArrayList<RHTTPClient>();
-    private final AtomicLong start = new AtomicLong();
-    private final AtomicLong end = new AtomicLong();
-    private final AtomicLong responses = new AtomicLong();
-    private final AtomicLong failures = new AtomicLong();
-    private final AtomicLong minLatency = new AtomicLong();
-    private final AtomicLong maxLatency = new AtomicLong();
-    private final AtomicLong totLatency = new AtomicLong();
-    private final ConcurrentMap<Long, AtomicLong> latencies = new ConcurrentHashMap<Long, AtomicLong>();
-    private final String nodeName;
-
-    public static void main(String[] args) throws Exception
-    {
-        String nodeName = "";
-        if (args.length > 0)
-            nodeName = args[0];
-
-        Loader loader = new Loader(nodeName);
-        loader.run();
-    }
-
-    public Loader(String nodeName)
-    {
-        this.nodeName = nodeName;
-    }
-
-    private void run() throws Exception
-    {
-        HttpClient httpClient = new HttpClient();
-        httpClient.setMaxConnectionsPerAddress(40000);
-        QueuedThreadPool threadPool = new QueuedThreadPool();
-        threadPool.setMaxThreads(500);
-        threadPool.setDaemon(true);
-        httpClient.setThreadPool(threadPool);
-        httpClient.setIdleTimeout(5000);
-        httpClient.start();
-
-        Random random = new Random();
-
-        BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
-
-        System.err.print("server [localhost]: ");
-        String value = console.readLine().trim();
-        if (value.length() == 0)
-            value = "localhost";
-        String host = value;
-
-        System.err.print("port [8080]: ");
-        value = console.readLine().trim();
-        if (value.length() == 0)
-            value = "8080";
-        int port = Integer.parseInt(value);
-
-        System.err.print("context []: ");
-        value = console.readLine().trim();
-        if (value.length() == 0)
-            value = "";
-        String context = value;
-
-        System.err.print("external path [/]: ");
-        value = console.readLine().trim();
-        if (value.length() == 0)
-            value = "/";
-        String externalPath = value;
-
-        System.err.print("gateway path [/__gateway]: ");
-        value = console.readLine().trim();
-        if (value.length() == 0)
-            value = "/__gateway";
-        String gatewayPath = value;
-
-        int clients = 100;
-        int batchCount = 1000;
-        int batchSize = 5;
-        long batchPause = 5;
-        int requestSize = 50;
-
-        while (true)
-        {
-            System.err.println("-----");
-
-            System.err.print("clients [" + clients + "]: ");
-            value = console.readLine();
-            if (value == null)
-                break;
-            value = value.trim();
-            if (value.length() == 0)
-                value = "" + clients;
-            clients = Integer.parseInt(value);
-
-            System.err.println("Waiting for clients to be ready...");
-
-            Address gatewayAddress = new Address(host, port);
-            String gatewayURI = context + gatewayPath;
-
-            // Create or remove the necessary clients
-            int currentClients = this.clients.size();
-            if (currentClients < clients)
-            {
-                for (int i = 0; i < clients - currentClients; ++i)
-                {
-                    final RHTTPClient client = new JettyClient(httpClient, gatewayAddress, gatewayURI, nodeName + (currentClients + i));
-                    client.addListener(new EchoListener(client));
-                    client.connect();
-                    this.clients.add(client);
-
-                    // Give some time to the server to accept connections and
-                    // reply to handshakes and connects
-                    if (i % 10 == 0)
-                    {
-                        Thread.sleep(100);
-                    }
-                }
-            }
-            else if (currentClients > clients)
-            {
-                for (int i = 0; i < currentClients - clients; ++i)
-                {
-                    RHTTPClient client = this.clients.remove(currentClients - i - 1);
-                    client.disconnect();
-                }
-            }
-
-            System.err.println("Clients ready");
-
-            currentClients = this.clients.size();
-            if (currentClients > 0)
-            {
-                System.err.print("batch count [" + batchCount + "]: ");
-                value = console.readLine().trim();
-                if (value.length() == 0)
-                    value = "" + batchCount;
-                batchCount = Integer.parseInt(value);
-
-                System.err.print("batch size [" + batchSize + "]: ");
-                value = console.readLine().trim();
-                if (value.length() == 0)
-                    value = "" + batchSize;
-                batchSize = Integer.parseInt(value);
-
-                System.err.print("batch pause [" + batchPause + "]: ");
-                value = console.readLine().trim();
-                if (value.length() == 0)
-                    value = "" + batchPause;
-                batchPause = Long.parseLong(value);
-
-                System.err.print("request size [" + requestSize + "]: ");
-                value = console.readLine().trim();
-                if (value.length() == 0)
-                    value = "" + requestSize;
-                requestSize = Integer.parseInt(value);
-                String requestBody = "";
-                for (int i = 0; i < requestSize; i++)
-                    requestBody += "x";
-
-                String externalURL = "http://" + host + ":" + port + context + externalPath;
-                if (!externalURL.endsWith("/"))
-                    externalURL += "/";
-
-                reset();
-
-                long start = System.nanoTime();
-                long expected = 0;
-                for (int i = 0; i < batchCount; ++i)
-                {
-                    for (int j = 0; j < batchSize; ++j)
-                    {
-                        int clientIndex = random.nextInt(this.clients.size());
-                        RHTTPClient client = this.clients.get(clientIndex);
-                        String targetId = client.getTargetId();
-                        String url = externalURL + targetId;
-
-                        ExternalExchange exchange = new ExternalExchange();
-                        exchange.setMethod("GET");
-                        exchange.setURL(url);
-                        exchange.setRequestContent(new ByteArrayBuffer(requestBody, "UTF-8"));
-                        exchange.send(httpClient);
-                        ++expected;
-                    }
-
-                    if (batchPause > 0)
-                        Thread.sleep(batchPause);
-                }
-                long end = System.nanoTime();
-                long elapsedNanos = end - start;
-                if (elapsedNanos > 0)
-                {
-                    System.err.print("Messages - Elapsed | Rate = ");
-                    System.err.print(TimeUnit.NANOSECONDS.toMillis(elapsedNanos));
-                    System.err.print(" ms | ");
-                    System.err.print(expected * 1000 * 1000 * 1000 / elapsedNanos);
-                    System.err.println(" requests/s ");
-                }
-
-                waitForResponses(expected);
-                printReport(expected);
-            }
-        }
-    }
-
-    private void reset()
-    {
-        start.set(0L);
-        end.set(0L);
-        responses.set(0L);
-        failures.set(0L);
-        minLatency.set(Long.MAX_VALUE);
-        maxLatency.set(0L);
-        totLatency.set(0L);
-    }
-
-    private void updateLatencies(long start, long end)
-    {
-        long latency = end - start;
-
-        // Update the latencies using a non-blocking algorithm
-        long oldMinLatency = minLatency.get();
-        while (latency < oldMinLatency)
-        {
-            if (minLatency.compareAndSet(oldMinLatency, latency)) break;
-            oldMinLatency = minLatency.get();
-        }
-        long oldMaxLatency = maxLatency.get();
-        while (latency > oldMaxLatency)
-        {
-            if (maxLatency.compareAndSet(oldMaxLatency, latency)) break;
-            oldMaxLatency = maxLatency.get();
-        }
-        totLatency.addAndGet(latency);
-
-        latencies.putIfAbsent(latency, new AtomicLong(0L));
-        latencies.get(latency).incrementAndGet();
-    }
-
-    private boolean waitForResponses(long expected) throws InterruptedException
-    {
-        long arrived = responses.get() + failures.get();
-        long lastArrived = 0;
-        int maxRetries = 20;
-        int retries = maxRetries;
-        while (arrived < expected)
-        {
-            System.err.println("Waiting for responses to arrive " + arrived + "/" + expected);
-            Thread.sleep(500);
-            if (lastArrived == arrived)
-            {
-                --retries;
-                if (retries == 0) break;
-            }
-            else
-            {
-                lastArrived = arrived;
-                retries = maxRetries;
-            }
-            arrived = responses.get() + failures.get();
-        }
-        if (arrived < expected)
-        {
-            System.err.println("Interrupting wait for responses " + arrived + "/" + expected);
-            return false;
-        }
-        else
-        {
-            System.err.println("All responses arrived " + arrived + "/" + expected);
-            return true;
-        }
-    }
-
-    public void printReport(long expectedCount)
-    {
-        long responseCount = responses.get() + failures.get();
-        System.err.print("Messages - Success/Failures/Expected = ");
-        System.err.print(responses.get());
-        System.err.print("/");
-        System.err.print(failures.get());
-        System.err.print("/");
-        System.err.println(expectedCount);
-
-        long elapsedNanos = end.get() - start.get();
-        if (elapsedNanos > 0)
-        {
-            System.err.print("Messages - Elapsed | Rate = ");
-            System.err.print(TimeUnit.NANOSECONDS.toMillis(elapsedNanos));
-            System.err.print(" ms | ");
-            System.err.print(responseCount * 1000 * 1000 * 1000 / elapsedNanos);
-            System.err.println(" responses/s ");
-        }
-
-        if (latencies.size() > 1)
-        {
-            long maxLatencyBucketFrequency = 0L;
-            long[] latencyBucketFrequencies = new long[20];
-            long latencyRange = maxLatency.get() - minLatency.get();
-            for (Iterator<Map.Entry<Long, AtomicLong>> entries = latencies.entrySet().iterator(); entries.hasNext();)
-            {
-                Map.Entry<Long, AtomicLong> entry = entries.next();
-                long latency = entry.getKey();
-                Long bucketIndex = (latency - minLatency.get()) * latencyBucketFrequencies.length / latencyRange;
-                int index = bucketIndex.intValue() == latencyBucketFrequencies.length ? latencyBucketFrequencies.length - 1 : bucketIndex.intValue();
-                long value = entry.getValue().get();
-                latencyBucketFrequencies[index] += value;
-                if (latencyBucketFrequencies[index] > maxLatencyBucketFrequency) maxLatencyBucketFrequency = latencyBucketFrequencies[index];
-                entries.remove();
-            }
-
-            System.err.println("Messages - Latency Distribution Curve (X axis: Frequency, Y axis: Latency):");
-            for (int i = 0; i < latencyBucketFrequencies.length; i++)
-            {
-                long latencyBucketFrequency = latencyBucketFrequencies[i];
-                int value = Math.round(latencyBucketFrequency * (float) latencyBucketFrequencies.length / maxLatencyBucketFrequency);
-                if (value == latencyBucketFrequencies.length) value = value - 1;
-                for (int j = 0; j < value; ++j) System.err.print(" ");
-                System.err.print("@");
-                for (int j = value + 1; j < latencyBucketFrequencies.length; ++j) System.err.print(" ");
-                System.err.print("  _  ");
-                System.err.print(TimeUnit.NANOSECONDS.toMillis((latencyRange * (i + 1) / latencyBucketFrequencies.length) + minLatency.get()));
-                System.err.println(" ms (" + latencyBucketFrequency + ")");
-            }
-        }
-
-        System.err.print("Messages - Latency Min/Ave/Max = ");
-        System.err.print(TimeUnit.NANOSECONDS.toMillis(minLatency.get()) + "/");
-        System.err.print(responseCount == 0 ? "-/" : TimeUnit.NANOSECONDS.toMillis(totLatency.get() / responseCount) + "/");
-        System.err.println(TimeUnit.NANOSECONDS.toMillis(maxLatency.get()) + " ms");
-    }
-
-    private class ExternalExchange extends ContentExchange
-    {
-        private volatile long sendTime;
-
-        private ExternalExchange()
-        {
-            super(true);
-        }
-
-        private void send(HttpClient httpClient) throws IOException
-        {
-            this.sendTime = System.nanoTime();
-            httpClient.send(this);
-        }
-
-        @Override
-        protected void onResponseComplete() throws IOException
-        {
-            if (getResponseStatus() == 200)
-                responses.incrementAndGet();
-            else
-                failures.incrementAndGet();
-
-            long arrivalTime = System.nanoTime();
-            if (start.get() == 0L)
-                start.set(arrivalTime);
-            end.set(arrivalTime);
-            updateLatencies(sendTime, arrivalTime);
-        }
-
-        @Override
-        protected void onException(Throwable x)
-        {
-            failures.incrementAndGet();
-        }
-    }
-
-    private static class EchoListener implements RHTTPListener
-    {
-        private final RHTTPClient client;
-
-        public EchoListener(RHTTPClient client)
-        {
-            this.client = client;
-        }
-
-        public void onRequest(RHTTPRequest request) throws Exception
-        {
-            RHTTPResponse response = new RHTTPResponse(request.getId(), 200, "OK", new HashMap<String, String>(), request.getBody());
-            client.deliver(response);
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-loadtest/src/main/java/org/eclipse/jetty/rhttp/loadtest/Server.java b/jetty-rhttp/jetty-rhttp-loadtest/src/main/java/org/eclipse/jetty/rhttp/loadtest/Server.java
deleted file mode 100644
index 57016cf..0000000
--- a/jetty-rhttp/jetty-rhttp-loadtest/src/main/java/org/eclipse/jetty/rhttp/loadtest/Server.java
+++ /dev/null
@@ -1,69 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.rhttp.loadtest;
-
-import org.eclipse.jetty.rhttp.gateway.GatewayServer;
-import org.eclipse.jetty.rhttp.gateway.StandardTargetIdRetriever;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
-
-/**
- * @version $Revision$ $Date$
- */
-public class Server
-{
-    public static void main(String[] args) throws Exception
-    {
-        int port = 8080;
-        if (args.length > 0)
-            port = Integer.parseInt(args[0]);
-
-        GatewayServer server = new GatewayServer();
-        Connector connector = new SelectChannelConnector();
-        connector.setLowResourceMaxIdleTime(connector.getMaxIdleTime());
-        connector.setPort(port);
-        server.addConnector(connector);
-        server.setTargetIdRetriever(new StandardTargetIdRetriever());
-        server.start();
-        server.getServer().dumpStdErr();
-        Runtime.getRuntime().addShutdownHook(new Shutdown(server));
-    }
-
-    private static class Shutdown extends Thread
-    {
-        private final GatewayServer server;
-
-        public Shutdown(GatewayServer server)
-        {
-            this.server = server;
-        }
-
-        @Override
-        public void run()
-        {
-            try
-            {
-                server.stop();
-            }
-            catch (Exception ignored)
-            {
-            }
-        }
-    }
-}
diff --git a/jetty-rhttp/jetty-rhttp-loadtest/src/main/resources/log4j.properties b/jetty-rhttp/jetty-rhttp-loadtest/src/main/resources/log4j.properties
deleted file mode 100644
index 8e6eddb..0000000
--- a/jetty-rhttp/jetty-rhttp-loadtest/src/main/resources/log4j.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-# LOG4J levels: OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL
-#
-log4j.rootLogger=ALL,CONSOLE
-
-log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
-#log4j.appender.CONSOLE.threshold=INFO
-log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
-#log4j.appender.CONSOLE.layout.ConversionPattern=%d %t [%5p][%c{1}] %m%n
-log4j.appender.CONSOLE.layout.ConversionPattern=%d [%5p][%c] %m%n
-
-# Level tuning
-log4j.logger.org.eclipse.jetty=INFO
-log4j.logger.org.mortbay.jetty.rhttp=INFO
diff --git a/jetty-rhttp/pom.xml b/jetty-rhttp/pom.xml
deleted file mode 100644
index 0284a0f..0000000
--- a/jetty-rhttp/pom.xml
+++ /dev/null
@@ -1,107 +0,0 @@
-<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>
-        <groupId>org.eclipse.jetty</groupId>
-        <artifactId>jetty-project</artifactId>
-        <version>9.0.0-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.eclipse.jetty.rhttp</groupId>
-    <artifactId>jetty-rhttp-project</artifactId>
-    <packaging>pom</packaging>
-    <name>Jetty :: Reverse HTTP</name>
-
-    <properties>
-    </properties>
-
-    <modules>
-        <module>reverse-http-client</module>
-        <module>reverse-http-connector</module>
-        <module>reverse-http-gateway</module>
-        <module>reverse-http-loadtest</module>
-    </modules>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.sonatype.maven.plugin</groupId>
-                <artifactId>emma-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>process-classes</phase>
-                        <goals>
-                            <goal>instrument</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <classesDirectory>${project.build.directory}/generated-classes/emma/classes</classesDirectory>
-                    <systemProperties>
-                        <property>
-                            <name>emma.coverage.out.file</name>
-                            <value>${project.build.directory}/coverage.ec</value>
-                        </property>
-                    </systemProperties>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.sonatype.maven.plugin</groupId>
-                <artifactId>emma4it-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>report</id>
-                        <phase>post-integration-test</phase>
-                        <goals>
-                            <goal>report</goal>
-                        </goals>
-                        <configuration>
-                            <sourceSets>
-                                <sourceSet>
-                                    <directory>${project.build.sourceDirectory}</directory>
-                                </sourceSet>
-                            </sourceSets>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>javax.servlet</groupId>
-                <artifactId>servlet-api</artifactId>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-server</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-client</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-io</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-util</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty.toolchain</groupId>
-                <artifactId>jetty-test-helper</artifactId>
-                <scope>test</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-</project>
diff --git a/jetty-runner/pom.xml b/jetty-runner/pom.xml
index d3a7b95..cda973a 100644
--- a/jetty-runner/pom.xml
+++ b/jetty-runner/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-runner</artifactId>
@@ -10,17 +10,19 @@
 
  <properties>
     <assembly-directory>target/distribution</assembly-directory>
+    <bundle-symbolic-name>${project.groupId}.runner</bundle-symbolic-name>
   </properties>
   <url>http://www.eclipse.org/jetty</url>
   <build>
     <plugins>
+
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-dependency-plugin</artifactId>
         <executions>
           <execution>
             <id>unpack-dependencies</id>
-            <phase>package</phase>
+            <phase>prepare-package</phase>
             <goals>
               <goal>unpack-dependencies</goal>
             </goals>
@@ -35,33 +37,34 @@
         </executions>
       </plugin>
       <plugin>
-        <groupId>org.apache.maven.plugins
-        </groupId>
+          <groupId>org.apache.felix</groupId>
+          <artifactId>maven-bundle-plugin</artifactId>
+          <extensions>true</extensions>
+          <executions>
+              <execution>
+                  <id>bundle-manifest</id>
+                  <phase>process-classes</phase>
+                  <goals>
+                      <goal>manifest</goal>
+                  </goals>
+              </execution>
+          </executions>
+          <configuration>
+            <instructions>
+              <Main-Class>org.eclipse.jetty.runner.Runner</Main-Class>
+              <Import-Package>!*</Import-Package>
+              <Export-Package></Export-Package>
+            </instructions>
+          </configuration>
+        </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>package</id>
-            <phase>package</phase>
-            <goals>
-              <goal>jar</goal>
-            </goals>
-            <configuration>
-              <archive>
-                <manifest>
-                  <mainClass>org.eclipse.jetty.runner.Runner</mainClass>
-                </manifest>
-                <manifestEntries>
-                  <mode>development</mode>
-                  <url>http://eclipse.org/jetty</url>
-                  <Built-By>${user.name}</Built-By>
-                  <package>org.eclipse.jetty.runner</package>
-                  <Bundle-Name>Jetty Runner</Bundle-Name>
-                  <Bundle-Vendor>Mort Bay Consulting</Bundle-Vendor>
-                </manifestEntries>
-              </archive>
-            </configuration>
-          </execution>
-        </executions>
+        <configuration>
+         <archive>
+            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+         </archive>
+        </configuration>
       </plugin>
     </plugins>
   </build>
@@ -94,7 +97,12 @@
     </dependency>
       <dependency>
         <groupId>org.eclipse.jetty</groupId>
-        <artifactId>jetty-jsp</artifactId>
+        <artifactId>apache-jsp</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.eclipse.jetty</groupId>
+        <artifactId>apache-jstl</artifactId>
         <version>${project.version}</version>
       </dependency>
   </dependencies>
diff --git a/jetty-runner/src/main/java/org/eclipse/jetty/runner/Runner.java b/jetty-runner/src/main/java/org/eclipse/jetty/runner/Runner.java
index f596e61..53bc02f 100644
--- a/jetty-runner/src/main/java/org/eclipse/jetty/runner/Runner.java
+++ b/jetty-runner/src/main/java/org/eclipse/jetty/runner/Runner.java
@@ -18,12 +18,32 @@
 
 package org.eclipse.jetty.runner;
 
+import java.io.IOException;
+import java.io.PrintStream;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 import org.eclipse.jetty.security.ConstraintMapping;
 import org.eclipse.jetty.security.ConstraintSecurityHandler;
 import org.eclipse.jetty.security.HashLoginService;
 import org.eclipse.jetty.security.authentication.BasicAuthenticator;
-import org.eclipse.jetty.server.*;
-import org.eclipse.jetty.server.handler.*;
+import org.eclipse.jetty.server.AbstractConnector;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.ConnectorStatistics;
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.NCSARequestLog;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.ShutdownMonitor;
+import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.server.handler.ContextHandlerCollection;
+import org.eclipse.jetty.server.handler.DefaultHandler;
+import org.eclipse.jetty.server.handler.HandlerCollection;
+import org.eclipse.jetty.server.handler.RequestLogHandler;
+import org.eclipse.jetty.server.handler.StatisticsHandler;
 import org.eclipse.jetty.server.session.SessionHandler;
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.servlet.ServletHolder;
@@ -36,21 +56,10 @@
 import org.eclipse.jetty.webapp.WebAppContext;
 import org.eclipse.jetty.xml.XmlConfiguration;
 
-import java.io.IOException;
-import java.io.PrintStream;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-
-
 /**
  * Runner
- *
+ * <p>
  * Combine jetty classes into a single executable jar and run webapps based on the args to it.
- *
  */
 public class Runner
 {
@@ -84,8 +93,6 @@
 
     /**
      * Classpath
-     *
-     *
      */
     public class Classpath
     {
@@ -137,22 +144,15 @@
         }
     }
 
-
-
-
-    /**
-     *
-     */
     public Runner()
     {
-
     }
 
 
     /**
      * Generate helpful usage message and exit
      *
-     * @param error
+     * @param error the error header
      */
     public void usage(String error)
     {
@@ -192,8 +192,8 @@
     /**
      * Configure a jetty instance and deploy the webapps presented as args
      *
-     * @param args
-     * @throws Exception
+     * @param args the command line arguments
+     * @throws Exception if unable to configure
      */
     public void configure(String[] args) throws Exception
     {
@@ -482,10 +482,6 @@
     }
 
 
-    /**
-     * @param handler
-     * @param handlers
-     */
     protected void prependHandler (Handler handler, HandlerCollection handlers)
     {
         if (handler == null || handlers == null)
@@ -501,9 +497,6 @@
 
 
 
-    /**
-     * @throws Exception
-     */
     public void run() throws Exception
     {
         _server.start();
@@ -534,9 +527,6 @@
 
 
 
-    /**
-     * @param args
-     */
     public static void main(String[] args)
     {
         Runner runner = new Runner();
diff --git a/jetty-security/pom.xml b/jetty-security/pom.xml
index 45f0f6d..1971744 100644
--- a/jetty-security/pom.xml
+++ b/jetty-security/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-security</artifactId>
@@ -25,7 +25,7 @@
             </goals>
             <configuration>
               <instructions>
-                <Import-Package>javax.servlet.*;version="[2.6.0,3.2)",javax.security.cert,*</Import-Package>
+                <Import-Package>javax.servlet.*;version="[2.6.0,3.2)",javax.security.cert,org.eclipse.jetty*;version="[$(version;===;${parsedVersion.osgiVersion}),$(version;==+;${parsedVersion.osgiVersion}))",*</Import-Package>
               </instructions>
             </configuration>
 
@@ -33,35 +33,6 @@
         </executions>
       </plugin>
       <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <!--
-        Required for OSGI
-        -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
         <configuration>
diff --git a/jetty-security/src/main/config/etc/krb5.ini b/jetty-security/src/main/config/etc/krb5.ini
index 9cea63c..283880c 100644
--- a/jetty-security/src/main/config/etc/krb5.ini
+++ b/jetty-security/src/main/config/etc/krb5.ini
@@ -9,9 +9,9 @@
 
 [realms]
 MORTBAY.ORG = {
- 		kdc = 192.168.2.30
- 		admin_server = 192.168.2.30
- 		default_domain = MORTBAY.ORG
+    kdc = 192.168.2.30
+    admin_server = 192.168.2.30
+    default_domain = MORTBAY.ORG
 }
 
 [domain_realm]
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/ConstraintAware.java b/jetty-security/src/main/java/org/eclipse/jetty/security/ConstraintAware.java
index a93166c..15f64dc 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/ConstraintAware.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/ConstraintAware.java
@@ -21,9 +21,6 @@
 import java.util.List;
 import java.util.Set;
 
-/**
- * @version $Rev: 4466 $ $Date: 2009-02-10 23:42:54 +0100 (Tue, 10 Feb 2009) $
- */
 public interface ConstraintAware
 {
     List<ConstraintMapping> getConstraintMappings();
@@ -65,6 +62,7 @@
     /**
      * See Servlet Spec 31, sec 13.8.4, pg 145
      * Container must check if there are urls with uncovered http methods
+     * @return true if urls with uncovered http methods
      */
     boolean checkPathsWithUncoveredHttpMethods();
 }
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/ConstraintSecurityHandler.java b/jetty-security/src/main/java/org/eclipse/jetty/security/ConstraintSecurityHandler.java
index 28b2f59..1e022fd 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/ConstraintSecurityHandler.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/ConstraintSecurityHandler.java
@@ -40,7 +40,6 @@
 
 import org.eclipse.jetty.http.HttpStatus;
 import org.eclipse.jetty.http.PathMap;
-import org.eclipse.jetty.server.HttpChannel;
 import org.eclipse.jetty.server.HttpConfiguration;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.Response;
@@ -51,14 +50,12 @@
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.security.Constraint;
 
-/* ------------------------------------------------------------ */
 /**
  * ConstraintSecurityHandler
- * 
+ * <p> 
  * Handler to enforce SecurityConstraints. This implementation is servlet spec
  * 3.1 compliant and pre-computes the constraint combinations for runtime
  * efficiency.
- *
  */
 public class ConstraintSecurityHandler extends SecurityHandler implements ConstraintAware
 {
@@ -79,9 +76,6 @@
     }
     
     /* ------------------------------------------------------------ */
-    /**
-     * @param constraint
-     */
     public static Constraint createConstraint(Constraint constraint)
     {
         try
@@ -98,10 +92,11 @@
     /**
      * Create a security constraint
      * 
-     * @param name
-     * @param authenticate
-     * @param roles
-     * @param dataConstraint
+     * @param name the name of the constraint
+     * @param authenticate true to authenticate
+     * @param roles list of roles
+     * @param dataConstraint the data constraint
+     * @return the constraint
      */
     public static Constraint createConstraint (String name, boolean authenticate, String[] roles, int dataConstraint)
     {
@@ -117,8 +112,11 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * @param name
-     * @param element
+     * Create a Constraint
+     * 
+     * @param name the name
+     * @param element the http constraint element
+     * @return the created constraint
      */
     public static Constraint createConstraint (String name, HttpConstraintElement element)
     {
@@ -128,10 +126,13 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * @param name
-     * @param rolesAllowed
-     * @param permitOrDeny
-     * @param transport
+     * Create Constraint
+     * 
+     * @param name the name
+     * @param rolesAllowed the list of allowed roles
+     * @param permitOrDeny the permission semantic
+     * @param transport the transport guarantee
+     * @return the created constraint
      */
     public static Constraint createConstraint (String name, String[] rolesAllowed, EmptyRoleSemantic permitOrDeny, TransportGuarantee transport)
     {
@@ -168,10 +169,6 @@
     
 
     /* ------------------------------------------------------------ */
-    /**
-     * @param pathSpec
-     * @param constraintMappings
-     */
     public static List<ConstraintMapping> getConstraintMappingsForPath(String pathSpec, List<ConstraintMapping> constraintMappings)
     {
         if (pathSpec == null || "".equals(pathSpec.trim()) || constraintMappings == null || constraintMappings.size() == 0)
@@ -193,8 +190,9 @@
     /** Take out of the constraint mappings those that match the 
      * given path.
      * 
-     * @param pathSpec
+     * @param pathSpec the path spec
      * @param constraintMappings a new list minus the matching constraints
+     * @return the list of constraint mappings
      */
     public static List<ConstraintMapping> removeConstraintMappingsForPath(String pathSpec, List<ConstraintMapping> constraintMappings)
     {
@@ -216,12 +214,13 @@
     
     
     /* ------------------------------------------------------------ */
-    /** Generate Constraints and ContraintMappings for the given url pattern and ServletSecurityElement
+    /** 
+     * Generate Constraints and ContraintMappings for the given url pattern and ServletSecurityElement
      * 
-     * @param name
-     * @param pathSpec
-     * @param securityElement
-     * @return
+     * @param name the name
+     * @param pathSpec the path spec
+     * @param securityElement the servlet security element
+     * @return the list of constraint mappings
      */
     public static List<ConstraintMapping> createConstraintsWithMappingsForPath (String name, String pathSpec, ServletSecurityElement securityElement)
     {
@@ -464,7 +463,7 @@
      * Create and combine the constraint with the existing processed
      * constraints.
      * 
-     * @param mapping
+     * @param mapping the constraint mapping
      */
     protected void processConstraintMapping(ConstraintMapping mapping)
     {
@@ -522,8 +521,8 @@
      * the mappings: an entry that names the method of the Request specifically, an
      * entry that names constraints that apply to all methods, entries of the form
      * &lt;method&gt;.omission, where the method of the Request is not named in the omission.
-     * @param mapping
-     * @param mappings
+     * @param mapping the constraint mapping
+     * @param mappings the mappings of roles
      */
     protected void processConstraintMappingWithMethodOmissions (ConstraintMapping mapping, Map<String, RoleInfo> mappings)
     {
@@ -545,8 +544,8 @@
     /* ------------------------------------------------------------ */
     /**
      * Initialize or update the RoleInfo from the constraint
-     * @param ri
-     * @param mapping
+     * @param ri the role info
+     * @param mapping the constraint mapping
      */
     protected void configureRoleInfo (RoleInfo ri, ConstraintMapping mapping)
     { 
@@ -675,7 +674,7 @@
         if (dataConstraint == null || dataConstraint == UserDataConstraint.None)
             return true;
 
-        HttpConfiguration httpConfig = HttpChannel.getCurrentHttpChannel().getHttpConfiguration();
+        HttpConfiguration httpConfig = Request.getBaseRequest(request).getHttpChannel().getHttpConfiguration();
 
         if (dataConstraint == UserDataConstraint.Confidential || dataConstraint == UserDataConstraint.Integral)
         {
@@ -871,9 +870,9 @@
      * Check if any http method omissions exist in the list of method
      * to auth info mappings.
      * 
-     * @param path
-     * @param methodMappings
-     * @return
+     * @param path the path
+     * @param methodMappings the method mappings
+     * @return true if ommision exist
      */
     protected boolean omissionsExist (String path, Map<String, RoleInfo> methodMappings)
     {
@@ -891,11 +890,11 @@
     
     /* ------------------------------------------------------------ */
     /**
-     * Given a string of the form &lt;method&gt;.&lt;method&gt;.omission
+     * Given a string of the form <code>&lt;method&gt;.&lt;method&gt;.omission</code>
      * split out the individual method names.
      * 
-     * @param omission
-     * @return
+     * @param omission the method
+     * @return the list of strings
      */
     protected Set<String> getOmittedMethods (String omission)
     {
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/CrossContextPsuedoSession.java b/jetty-security/src/main/java/org/eclipse/jetty/security/CrossContextPsuedoSession.java
deleted file mode 100644
index 711a8e8..0000000
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/CrossContextPsuedoSession.java
+++ /dev/null
@@ -1,37 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.security;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @version $Rev: 4466 $ $Date: 2009-02-10 23:42:54 +0100 (Tue, 10 Feb 2009) $
- * @deprecated
- */
-public interface CrossContextPsuedoSession<T>
-{
-
-    T fetch(HttpServletRequest request);
-
-    void store(T data, HttpServletResponse response);
-
-    void clear(HttpServletRequest request);
-
-}
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/HashCrossContextPsuedoSession.java b/jetty-security/src/main/java/org/eclipse/jetty/security/HashCrossContextPsuedoSession.java
deleted file mode 100644
index 61d8e33..0000000
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/HashCrossContextPsuedoSession.java
+++ /dev/null
@@ -1,100 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.security;
-
-import java.security.SecureRandom;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Random;
-
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @version $Rev: 4660 $ $Date: 2009-02-25 17:29:53 +0100 (Wed, 25 Feb 2009) $
- * @deprecated
- */
-public class HashCrossContextPsuedoSession<T> implements CrossContextPsuedoSession<T>
-{
-    private final String _cookieName;
-
-    private final String _cookiePath;
-
-    private final Random _random = new SecureRandom();
-
-    private final Map<String, T> _data = new HashMap<String, T>();
-
-    public HashCrossContextPsuedoSession(String cookieName, String cookiePath)
-    {
-        this._cookieName = cookieName;
-        this._cookiePath = cookiePath == null ? "/" : cookiePath;
-    }
-
-    public T fetch(HttpServletRequest request)
-    {
-        Cookie[] cookies = request.getCookies();
-        if (cookies == null)
-            return null;
-        
-        for (Cookie cookie : cookies)
-        {
-            if (_cookieName.equals(cookie.getName()))
-            {
-                String key = cookie.getValue();
-                return _data.get(key);
-            }
-        }
-        return null;
-    }
-
-    public void store(T datum, HttpServletResponse response)
-    {
-        String key;
-
-        synchronized (_data)
-        {
-            // Create new ID
-            while (true)
-            {
-                key = Long.toString(Math.abs(_random.nextLong()), 30 + (int) (System.currentTimeMillis() % 7));
-                if (!_data.containsKey(key)) break;
-            }
-
-            _data.put(key, datum);
-        }
-
-        Cookie cookie = new Cookie(_cookieName, key);
-        cookie.setPath(_cookiePath);
-        response.addCookie(cookie);
-    }
-
-    public void clear(HttpServletRequest request)
-    {
-        for (Cookie cookie : request.getCookies())
-        {
-            if (_cookieName.equals(cookie.getName()))
-            {
-                String key = cookie.getValue();
-                _data.remove(key);
-                break;
-            }
-        }
-    }
-}
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/HashLoginService.java b/jetty-security/src/main/java/org/eclipse/jetty/security/HashLoginService.java
index ff6ed15..5d60652 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/HashLoginService.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/HashLoginService.java
@@ -31,18 +31,18 @@
 /* ------------------------------------------------------------ */
 /**
  * Properties User Realm.
- * 
+ * <p>
  * An implementation of UserRealm that stores users and roles in-memory in HashMaps.
- * <P>
+ * <p>
  * Typically these maps are populated by calling the load() method or passing a properties resource to the constructor. The format of the properties file is:
  * 
- * <PRE>
+ * <pre>
  *  username: password [,rolename ...]
- * </PRE>
+ * </pre>
  * 
  * Passwords may be clear text, obfuscated or checksummed. The class com.eclipse.Util.Password should be used to generate obfuscated passwords or password
  * checksums.
- * 
+ * <p>
  * If DIGEST Authentication is used, the password must be in a recoverable format, either plain text or OBF:.
  */
 public class HashLoginService extends MappedLoginService implements UserListener
@@ -53,7 +53,7 @@
     private String _config;
     private Resource _configResource;
     private Scanner _scanner;
-    private int _refreshInterval = 0;// default is not to reload
+    private boolean hotReload = false; // default is not to reload
 
     /* ------------------------------------------------------------ */
     public HashLoginService()
@@ -102,17 +102,51 @@
     {
         _config = config;
     }
-
-    /* ------------------------------------------------------------ */
-    public void setRefreshInterval(int msec)
+    
+    /**
+     * Is hot reload enabled on this user store
+     * 
+     * @return true if hot reload was enabled before startup
+     */
+    public boolean isHotReload()
     {
-        _refreshInterval = msec;
+        return hotReload;
+    }
+
+    /**
+     * Enable Hot Reload of the Property File
+     * 
+     * @param enable true to enable, false to disable
+     */
+    public void setHotReload(boolean enable)
+    {
+        if (isRunning())
+        {
+            throw new IllegalStateException("Cannot set hot reload while user store is running");
+        }
+        this.hotReload = enable;
     }
 
     /* ------------------------------------------------------------ */
+    /**
+     * sets the refresh interval (in seconds)
+     * @param sec the refresh interval
+     * @deprecated use {@link #setHotReload(boolean)} instead
+     */
+    @Deprecated
+    public void setRefreshInterval(int sec)
+    {
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @return refresh interval in seconds for how often the properties file should be checked for changes
+     * @deprecated use {@link #isHotReload()} instead
+     */
+    @Deprecated
     public int getRefreshInterval()
     {
-        return _refreshInterval;
+        return (hotReload)?1:0;
     }
 
     /* ------------------------------------------------------------ */
@@ -141,11 +175,11 @@
         if (_propertyUserStore == null)
         {
             if(LOG.isDebugEnabled())
-                LOG.debug("doStart: Starting new PropertyUserStore. PropertiesFile: " + _config + " refreshInterval: " + _refreshInterval);
+                LOG.debug("doStart: Starting new PropertyUserStore. PropertiesFile: " + _config + " hotReload: " + hotReload);
             
             _propertyUserStore = new PropertyUserStore();
-            _propertyUserStore.setRefreshInterval(_refreshInterval);
-            _propertyUserStore.setConfig(_config);
+            _propertyUserStore.setHotReload(hotReload);
+            _propertyUserStore.setConfigPath(_config);
             _propertyUserStore.registerUserListener(this);
             _propertyUserStore.start();
         }
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/IdentityService.java b/jetty-security/src/main/java/org/eclipse/jetty/security/IdentityService.java
index f93f095..b32da00 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/IdentityService.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/IdentityService.java
@@ -24,10 +24,8 @@
 
 import org.eclipse.jetty.server.UserIdentity;
 
-/* ------------------------------------------------------------ */
 /**
  * Associates UserIdentities from with threads and UserIdentity.Contexts.
- *
  */
 public interface IdentityService
 {
@@ -37,7 +35,7 @@
     /**
      * Associate a user identity with the current thread.
      * This is called with as a thread enters the
-     * {@link SecurityHandler#handle(String, Request, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)}
+     * {@link SecurityHandler#handle(String, org.eclipse.jetty.server.Request, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)}
      * method and then again with a null argument as that call exits.
      * @param user The current user or null for no user to associated.
      * @return an object representing the previous associated state
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/JDBCLoginService.java b/jetty-security/src/main/java/org/eclipse/jetty/security/JDBCLoginService.java
index d0cd990..089b894 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/JDBCLoginService.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/JDBCLoginService.java
@@ -29,6 +29,8 @@
 import java.util.List;
 import java.util.Properties;
 
+import javax.servlet.ServletRequest;
+
 import org.eclipse.jetty.server.UserIdentity;
 import org.eclipse.jetty.util.Loader;
 import org.eclipse.jetty.util.log.Log;
@@ -209,7 +211,7 @@
 
     /* ------------------------------------------------------------ */
     @Override
-    public UserIdentity login(String username, Object credentials)
+    public UserIdentity login(String username, Object credentials, ServletRequest request)
     {
         long now = System.currentTimeMillis();
         if (now - _lastHashPurge > _cacheTime || _cacheTime == 0)
@@ -219,7 +221,7 @@
             closeConnection();
         }
         
-        return super.login(username,credentials);
+        return super.login(username,credentials, request);
     }
 
     /* ------------------------------------------------------------ */
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/LoginService.java b/jetty-security/src/main/java/org/eclipse/jetty/security/LoginService.java
index 653f7c6..e481ca9 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/LoginService.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/LoginService.java
@@ -18,6 +18,8 @@
 
 package org.eclipse.jetty.security;
 
+import javax.servlet.ServletRequest;
+
 import org.eclipse.jetty.server.UserIdentity;
 
 
@@ -42,14 +44,15 @@
     /** Login a user.
      * @param username The user name
      * @param credentials The users credentials
+     * @param request TODO
      * @return A UserIdentity if the credentials matched, otherwise null
      */
-    UserIdentity login(String username,Object credentials);
+    UserIdentity login(String username,Object credentials, ServletRequest request);
     
     /* ------------------------------------------------------------ */
     /** Validate a user identity.
      * Validate that a UserIdentity previously created by a call 
-     * to {@link #login(String, Object)} is still valid.
+     * to {@link #login(String, Object, ServletRequest)} is still valid.
      * @param user The user to validate
      * @return true if authentication has not been revoked for the user.
      */
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/MappedLoginService.java b/jetty-security/src/main/java/org/eclipse/jetty/security/MappedLoginService.java
index 752fd26..70b4c95 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/MappedLoginService.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/MappedLoginService.java
@@ -27,6 +27,7 @@
 import java.util.concurrent.ConcurrentMap;
 
 import javax.security.auth.Subject;
+import javax.servlet.ServletRequest;
 
 import org.eclipse.jetty.server.UserIdentity;
 import org.eclipse.jetty.util.component.AbstractLifeCycle;
@@ -208,9 +209,9 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * @see org.eclipse.jetty.security.LoginService#login(java.lang.String, java.lang.Object)
+     * @see org.eclipse.jetty.security.LoginService#login(java.lang.String, java.lang.Object, ServletRequest)
      */
-    public UserIdentity login(String username, Object credentials)
+    public UserIdentity login(String username, Object credentials, ServletRequest request)
     {
         if (username == null)
             return null;
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/PropertyUserStore.java b/jetty-security/src/main/java/org/eclipse/jetty/security/PropertyUserStore.java
index b4937d3..0bab932 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/PropertyUserStore.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/PropertyUserStore.java
@@ -19,8 +19,8 @@
 package org.eclipse.jetty.security;
 
 import java.io.File;
-import java.io.FilenameFilter;
 import java.io.IOException;
+import java.nio.file.Path;
 import java.security.Principal;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -36,36 +36,39 @@
 import org.eclipse.jetty.security.MappedLoginService.KnownUser;
 import org.eclipse.jetty.security.MappedLoginService.RolePrincipal;
 import org.eclipse.jetty.server.UserIdentity;
-import org.eclipse.jetty.util.Scanner;
-import org.eclipse.jetty.util.Scanner.BulkListener;
+import org.eclipse.jetty.util.PathWatcher;
+import org.eclipse.jetty.util.PathWatcher.PathWatchEvent;
+import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.component.AbstractLifeCycle;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.resource.PathResource;
 import org.eclipse.jetty.util.resource.Resource;
 import org.eclipse.jetty.util.security.Credential;
 
 /**
  * PropertyUserStore
- *
+ * <p>
  * This class monitors a property file of the format mentioned below and notifies registered listeners of the changes to the the given file.
  *
- * <PRE>
+ * <pre>
  *  username: password [,rolename ...]
- * </PRE>
+ * </pre>
  *
  * Passwords may be clear text, obfuscated or checksummed. The class com.eclipse.Util.Password should be used to generate obfuscated passwords or password
  * checksums.
  *
  * If DIGEST Authentication is used, the password must be in a recoverable format, either plain text or OBF:.
  */
-public class PropertyUserStore extends AbstractLifeCycle
+public class PropertyUserStore extends AbstractLifeCycle implements PathWatcher.Listener
 {
     private static final Logger LOG = Log.getLogger(PropertyUserStore.class);
 
-    private String _config;
+    private Path _configPath;
     private Resource _configResource;
-    private Scanner _scanner;
-    private int _refreshInterval = 0;// default is not to reload
+    
+    private PathWatcher pathWatcher;
+    private boolean hotReload = false; // default is not to reload
 
     private IdentityService _identityService = new DefaultIdentityService();
     private boolean _firstLoad = true; // true if first load, false from that point on
@@ -73,67 +76,165 @@
     private final Map<String, UserIdentity> _knownUserIdentities = new HashMap<String, UserIdentity>();
     private List<UserListener> _listeners;
 
-    /* ------------------------------------------------------------ */
+    /**
+     * Get the config (as a string)
+     * @return the config path as a string
+     * @deprecated use {@link #getConfigPath()} instead
+     */
+    @Deprecated
     public String getConfig()
     {
-        return _config;
+        return _configPath.toString();
     }
 
-    /* ------------------------------------------------------------ */
-    public void setConfig(String config)
+    /**
+     * Set the Config Path from a String reference to a file
+     * @param configFile the config file
+     * @deprecated use {@link #setConfigPath(String)} instead
+     */
+    @Deprecated
+    public void setConfig(String configFile)
     {
-        _config = config;
+        setConfigPath(configFile);
+    }
+    
+    /**
+     * Get the Config {@link Path} reference.
+     * @return the config path
+     */
+    public Path getConfigPath()
+    {
+        return _configPath;
     }
 
-    /* ------------------------------------------------------------ */
-        public UserIdentity getUserIdentity(String userName)
+    /**
+     * Set the Config Path from a String reference to a file
+     * @param configFile the config file
+     */
+    public void setConfigPath(String configFile)
+    {
+        if (configFile == null)
         {
-            return _knownUserIdentities.get(userName);
+            _configPath = null;
         }
+        else
+        {
+            _configPath = new File(configFile).toPath();
+        }
+    }
+
+    /**
+     * Set the Config Path from a {@link File} reference
+     * @param configFile the config file
+     */
+    public void setConfigPath(File configFile)
+    {
+        _configPath = configFile.toPath();
+    }
+
+    /**
+     * Set the Config Path
+     * @param configPath the config path
+     */
+    public void setConfigPath(Path configPath)
+    {
+        _configPath = configPath;
+    }
+    
+    /* ------------------------------------------------------------ */
+    public UserIdentity getUserIdentity(String userName)
+    {
+        return _knownUserIdentities.get(userName);
+    }
 
     /* ------------------------------------------------------------ */
     /**
-     * returns the resource associated with the configured properties file, creating it if necessary
+     * @return the resource associated with the configured properties file, creating it if necessary
+     * @throws IOException if unable to get the resource
      */
     public Resource getConfigResource() throws IOException
     {
         if (_configResource == null)
         {
-            _configResource = Resource.newResource(_config);
+            _configResource = new PathResource(_configPath);
         }
 
         return _configResource;
     }
+    
+    /**
+     * Is hot reload enabled on this user store
+     * 
+     * @return true if hot reload was enabled before startup
+     */
+    public boolean isHotReload()
+    {
+        return hotReload;
+    }
+
+    /**
+     * Enable Hot Reload of the Property File
+     * 
+     * @param enable true to enable, false to disable
+     */
+    public void setHotReload(boolean enable)
+    {
+        if (isRunning())
+        {
+            throw new IllegalStateException("Cannot set hot reload while user store is running");
+        }
+        this.hotReload = enable;
+    }
 
     /* ------------------------------------------------------------ */
     /**
      * sets the refresh interval (in seconds)
+     * @param sec the refresh interval
+     * @deprecated use {@link #setHotReload(boolean)} instead
      */
-    public void setRefreshInterval(int msec)
+    @Deprecated
+    public void setRefreshInterval(int sec)
     {
-        _refreshInterval = msec;
     }
 
     /* ------------------------------------------------------------ */
     /**
-     * refresh interval in seconds for how often the properties file should be checked for changes
+     * @return refresh interval in seconds for how often the properties file should be checked for changes
+     * @deprecated use {@link #isHotReload()} instead
      */
+    @Deprecated
     public int getRefreshInterval()
     {
-        return _refreshInterval;
+        return (hotReload)?1:0;
+    }
+    
+    @Override
+    public String toString()
+    {
+        StringBuilder s = new StringBuilder();
+        s.append(this.getClass().getName());
+        s.append("[");
+        s.append("users.count=").append(this._knownUsers.size());
+        s.append("identityService=").append(this._identityService);
+        s.append("]");
+        return s.toString();
     }
 
     /* ------------------------------------------------------------ */
     private void loadUsers() throws IOException
     {
-        if (_config == null)
+        if (_configPath == null)
             return;
 
         if (LOG.isDebugEnabled())
-            LOG.debug("Load " + this + " from " + _config);
+        {
+            LOG.debug("Loading " + this + " from " + _configPath);
+        }
+        
         Properties properties = new Properties();
         if (getConfigResource().exists())
             properties.load(getConfigResource().getInputStream());
+        
         Set<String> known = new HashSet<String>();
 
         for (Map.Entry<Object, Object> entry : properties.entrySet())
@@ -153,7 +254,7 @@
                 String[] roleArray = IdentityService.NO_ROLES;
                 if (roles != null && roles.length() > 0)
                 {
-                    roleArray = roles.split(",");
+                    roleArray = StringUtil.csvSplit(roles);
                 }
                 known.add(username);
                 Credential credential = Credential.getCredential(credentials);
@@ -210,8 +311,13 @@
          * set initial load to false as there should be no more initial loads
          */
         _firstLoad = false;
+        
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("Loaded " + this + " from " + _configPath);
+        }
     }
-
+    
     /* ------------------------------------------------------------ */
     /**
      * Depending on the value of the refresh interval, this method will either start up a scanner thread that will monitor the properties file for changes after
@@ -224,66 +330,29 @@
     {
         super.doStart();
 
-        if (getRefreshInterval() > 0)
+        loadUsers();
+        if ( isHotReload() && (_configPath != null) )
         {
-            _scanner = new Scanner();
-            _scanner.setScanInterval(getRefreshInterval());
-            List<File> dirList = new ArrayList<File>(1);
-            dirList.add(getConfigResource().getFile().getParentFile());
-            _scanner.setScanDirs(dirList);
-            _scanner.setFilenameFilter(new FilenameFilter()
-            {
-                public boolean accept(File dir, String name)
-                {
-                    File f = new File(dir,name);
-                    try
-                    {
-                        if (f.compareTo(getConfigResource().getFile()) == 0)
-                        {
-                            return true;
-                        }
-                    }
-                    catch (IOException e)
-                    {
-                        return false;
-                    }
-
-                    return false;
-                }
-
-            });
-
-            _scanner.addListener(new BulkListener()
-            {
-                public void filesChanged(List<String> filenames) throws Exception
-                {
-                    if (filenames == null)
-                        return;
-                    if (filenames.isEmpty())
-                        return;
-                    if (filenames.size() == 1)
-                    {
-                        Resource r = Resource.newResource(filenames.get(0));
-                        if (r.getFile().equals(_configResource.getFile()))
-                            loadUsers();
-                    }
-                }
-
-                public String toString()
-                {
-                    return "PropertyUserStore$Scanner";
-                }
-
-            });
-
-            _scanner.setReportExistingFilesOnStartup(true);
-            _scanner.setRecursive(false);
-            _scanner.start();
+            this.pathWatcher = new PathWatcher();
+            this.pathWatcher.watch(_configPath);
+            this.pathWatcher.addListener(this);
+            this.pathWatcher.setNotifyExistingOnStart(false);
+            this.pathWatcher.start();
         }
-        else
+       
+    }
+    
+    @Override
+    public void onPathWatchEvent(PathWatchEvent event)
+    {
+        try
         {
             loadUsers();
         }
+        catch (IOException e)
+        {
+            LOG.warn(e);
+        }
     }
 
     /* ------------------------------------------------------------ */
@@ -293,9 +362,9 @@
     protected void doStop() throws Exception
     {
         super.doStop();
-        if (_scanner != null)
-            _scanner.stop();
-        _scanner = null;
+        if (this.pathWatcher != null)
+            this.pathWatcher.stop();
+        this.pathWatcher = null;
     }
 
     /**
@@ -334,6 +403,7 @@
 
     /**
      * registers a listener to be notified of the contents of the property file
+     * @param listener the user listener
      */
     public void registerUserListener(UserListener listener)
     {
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/SecurityHandler.java b/jetty-security/src/main/java/org/eclipse/jetty/security/SecurityHandler.java
index 8462f7e..532f4b8 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/SecurityHandler.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/SecurityHandler.java
@@ -29,25 +29,22 @@
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSessionEvent;
-import javax.servlet.http.HttpSessionListener;
 
 import org.eclipse.jetty.security.authentication.DeferredAuthentication;
 import org.eclipse.jetty.server.Authentication;
 import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.HttpChannel;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.Response;
 import org.eclipse.jetty.server.UserIdentity;
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.server.handler.ContextHandler.Context;
 import org.eclipse.jetty.server.handler.HandlerWrapper;
-import org.eclipse.jetty.server.session.AbstractSession;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
 /**
  * Abstract SecurityHandler.
+ * <p>
  * Select and apply an {@link Authenticator} to a request.
  * <p>
  * The Authenticator may either be directly set on the handler
@@ -58,7 +55,6 @@
  * Authentication.Configuration. At startup, any context init parameters
  * that start with "org.eclipse.jetty.security." that do not have
  * values in the SecurityHandler init parameters, are copied.
- *
  */
 public abstract class SecurityHandler extends HandlerWrapper implements Authenticator.AuthConfiguration
 {
@@ -133,8 +129,9 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** Set the authenticator.
-     * @param authenticator
+    /** 
+     * Set the authenticator.
+     * @param authenticator the authenticator
      * @throws IllegalStateException if the SecurityHandler is running
      */
     public void setAuthenticator(Authenticator authenticator)
@@ -251,8 +248,8 @@
 
     /* ------------------------------------------------------------ */
     /** Set an initialization parameter.
-     * @param key
-     * @param value
+     * @param key the init key
+     * @param value the init value
      * @return previous value
      * @throws IllegalStateException if the SecurityHandler is running
      */
@@ -309,33 +306,6 @@
                         getInitParameter(name)==null)
                     setInitParameter(name,context.getInitParameter(name));
             }
-            
-            //register a session listener to handle securing sessions when authentication is performed
-            context.getContextHandler().addEventListener(new HttpSessionListener()
-            {
-                @Override
-                public void sessionDestroyed(HttpSessionEvent se)
-                {
-                }
-
-                @Override
-                public void sessionCreated(HttpSessionEvent se)
-                {                    
-                    //if current request is authenticated, then as we have just created the session, mark it as secure, as it has not yet been returned to a user
-                    HttpChannel<?> channel = HttpChannel.getCurrentHttpChannel();              
-                    
-                    if (channel == null)
-                        return;
-                    Request request = channel.getRequest();
-                    if (request == null)
-                        return;
-                    
-                    if (request.isSecure())
-                    {
-                        se.getSession().setAttribute(AbstractSession.SESSION_KNOWN_ONLY_TO_AUTHENTICATED, Boolean.TRUE);
-                    }
-                }
-            });
         }
 
         // complicated resolution of login and identity service to handle
@@ -445,6 +415,7 @@
     /** Set renew the session on Authentication.
      * <p>
      * If set to true, then on authentication, the session associated with a reqeuest is invalidated and replaced with a new session.
+     * @param renew true to renew the authentication on session
      * @see org.eclipse.jetty.security.Authenticator.AuthConfiguration#isSessionRenewedOnAuthentication()
      */
     public void setSessionRenewedOnAuthentication(boolean renew)
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/SpnegoLoginService.java b/jetty-security/src/main/java/org/eclipse/jetty/security/SpnegoLoginService.java
index cc59b47..3614ab5 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/SpnegoLoginService.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/SpnegoLoginService.java
@@ -21,6 +21,7 @@
 import java.util.Properties;
 
 import javax.security.auth.Subject;
+import javax.servlet.ServletRequest;
 
 import org.eclipse.jetty.server.UserIdentity;
 import org.eclipse.jetty.util.B64Code;
@@ -112,7 +113,7 @@
      * username will be null since the credentials will contain all the relevant info
      */
     @Override
-    public UserIdentity login(String username, Object credentials)
+    public UserIdentity login(String username, Object credentials, ServletRequest request)
     {
         String encodedAuthToken = (String)credentials;
 
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/ClientCertAuthenticator.java b/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/ClientCertAuthenticator.java
index a7e74f3..814a284 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/ClientCertAuthenticator.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/ClientCertAuthenticator.java
@@ -36,14 +36,12 @@
 import org.eclipse.jetty.server.Authentication.User;
 import org.eclipse.jetty.server.UserIdentity;
 import org.eclipse.jetty.util.B64Code;
+import org.eclipse.jetty.util.resource.Resource;
 import org.eclipse.jetty.util.security.CertificateUtils;
 import org.eclipse.jetty.util.security.CertificateValidator;
 import org.eclipse.jetty.util.security.Constraint;
 import org.eclipse.jetty.util.security.Password;
 
-/**
- * @version $Rev: 4793 $ $Date: 2009-03-19 00:00:01 +0100 (Thu, 19 Mar 2009) $
- */
 public class ClientCertAuthenticator extends LoginAuthenticator
 {
     /** String name of keystore password property. */
@@ -82,12 +80,6 @@
         return Constraint.__CERT_AUTH;
     }
 
-    
-
-    /**
-     * @return Authentication for request
-     * @throws ServerAuthException
-     */
     @Override
     public Authentication validateRequest(ServletRequest req, ServletResponse res, boolean mandatory) throws ServerAuthException
     {
@@ -106,7 +98,7 @@
 
                 if (_validateCerts)
                 {
-                    KeyStore trustStore = getKeyStore(null,
+                    KeyStore trustStore = getKeyStore(
                             _trustStorePath, _trustStoreType, _trustStoreProvider,
                             _trustStorePassword == null ? null :_trustStorePassword.toString());
                     Collection<? extends CRL> crls = loadCRL(_crlPath);
@@ -147,6 +139,11 @@
         }
     }
 
+    @Deprecated
+    protected KeyStore getKeyStore(InputStream storeStream, String storePath, String storeType, String storeProvider, String storePassword) throws Exception
+    {
+        return getKeyStore(storePath, storeType, storeProvider, storePassword);
+    }
     /* ------------------------------------------------------------ */
     /**
      * Loads keystore using an input stream or a file path in the same
@@ -155,17 +152,16 @@
      * Required for integrations to be able to override the mechanism
      * used to load a keystore in order to provide their own implementation.
      *
-     * @param storeStream keystore input stream
      * @param storePath path of keystore file
      * @param storeType keystore type
      * @param storeProvider keystore provider
      * @param storePassword keystore password
      * @return created keystore
-     * @throws Exception
+     * @throws Exception if unable to get keystore
      */
-    protected KeyStore getKeyStore(InputStream storeStream, String storePath, String storeType, String storeProvider, String storePassword) throws Exception
+    protected KeyStore getKeyStore(String storePath, String storeType, String storeProvider, String storePassword) throws Exception
     {
-        return CertificateUtils.getKeyStore(storeStream, storePath, storeType, storeProvider, storePassword);
+        return CertificateUtils.getKeyStore(Resource.newResource(storePath), storeType, storeProvider, storePassword);
     }
 
     /* ------------------------------------------------------------ */
@@ -178,7 +174,7 @@
      * @param crlPath path of certificate revocation list file
      * @return a (possibly empty) collection view of java.security.cert.CRL objects initialized with the data from the
      *         input stream.
-     * @throws Exception
+     * @throws Exception if unable to load CRL
      */
     protected Collection<? extends CRL> loadCRL(String crlPath) throws Exception
     {
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/DeferredAuthentication.java b/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/DeferredAuthentication.java
index 53276ac..ff896c8 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/DeferredAuthentication.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/DeferredAuthentication.java
@@ -140,7 +140,7 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * @param response
+     * @param response the response
      * @return true if this response is from a deferred call to {@link #authenticate(ServletRequest)}
      */
     public static boolean isDeferred(HttpServletResponse response)
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/DigestAuthenticator.java b/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/DigestAuthenticator.java
index 6b7f13b..fec6a0f 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/DigestAuthenticator.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/DigestAuthenticator.java
@@ -34,6 +34,7 @@
 import javax.servlet.http.HttpServletResponse;
 
 import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.security.SecurityHandler;
 import org.eclipse.jetty.security.ServerAuthException;
 import org.eclipse.jetty.security.UserAuthentication;
 import org.eclipse.jetty.server.Authentication;
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/FormAuthenticator.java b/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/FormAuthenticator.java
index 302f651..4fc87fd 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/FormAuthenticator.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/FormAuthenticator.java
@@ -22,6 +22,7 @@
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.Locale;
+
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
@@ -41,7 +42,6 @@
 import org.eclipse.jetty.security.UserAuthentication;
 import org.eclipse.jetty.server.Authentication;
 import org.eclipse.jetty.server.Authentication.User;
-import org.eclipse.jetty.server.HttpChannel;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.Response;
 import org.eclipse.jetty.server.UserIdentity;
@@ -64,8 +64,6 @@
  * to the /j_security_check URI within the context.  FormAuthentication uses
  * {@link SessionAuthentication} to wrap Authentication results so that they
  * are  associated with the session.</p>
- *
- *
  */
 public class FormAuthenticator extends LoginAuthenticator
 {
@@ -109,7 +107,7 @@
      * be remembered. If false, only the first uri that leads to a login
      * page redirect is remembered.
      * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=379909
-     * @param alwaysSave
+     * @param alwaysSave true to always save the uri
      */
     public void setAlwaysSaveUri (boolean alwaysSave)
     {
@@ -235,9 +233,8 @@
         
         //restore the original request's method on this request
         if (LOG.isDebugEnabled()) LOG.debug("Restoring original method {} for {} with method {}", method, juri,httpRequest.getMethod());
-        Request base_request = HttpChannel.getCurrentHttpChannel().getRequest();
-        HttpMethod m = HttpMethod.fromString(method);
-        base_request.setMethod(m,m.asString());
+        Request base_request = Request.getBaseRequest(request);
+        base_request.setMethod(method);
     }
 
     /* ------------------------------------------------------------ */
@@ -246,6 +243,9 @@
     {
         HttpServletRequest request = (HttpServletRequest)req;
         HttpServletResponse response = (HttpServletResponse)res;
+        Request base_request = Request.getBaseRequest(request);
+        Response base_response = base_request.getResponse();
+        
         String uri = request.getRequestURI();
         if (uri==null)
             uri=URIUtil.SLASH;
@@ -290,8 +290,6 @@
                     LOG.debug("authenticated {}->{}",form_auth,nuri);
 
                     response.setContentLength(0);
-                    Response base_response = HttpChannel.getCurrentHttpChannel().getResponse();
-                    Request base_request = HttpChannel.getCurrentHttpChannel().getRequest();
                     int redirectCode = (base_request.getHttpVersion().getVersion() < HttpVersion.HTTP_1_1.getVersion() ? HttpServletResponse.SC_MOVED_TEMPORARILY : HttpServletResponse.SC_SEE_OTHER);
                     base_response.sendRedirect(redirectCode, response.encodeRedirectURL(nuri));
                     return form_auth;
@@ -317,8 +315,6 @@
                 else
                 {
                     LOG.debug("auth failed {}->{}",username,_formErrorPage);
-                    Response base_response = HttpChannel.getCurrentHttpChannel().getResponse();
-                    Request base_request = HttpChannel.getCurrentHttpChannel().getRequest();
                     int redirectCode = (base_request.getHttpVersion().getVersion() < HttpVersion.HTTP_1_1.getVersion() ? HttpServletResponse.SC_MOVED_TEMPORARILY : HttpServletResponse.SC_SEE_OTHER);
                     base_response.sendRedirect(redirectCode, response.encodeRedirectURL(URIUtil.addPaths(request.getContextPath(),_formErrorPage)));
                 }
@@ -358,7 +354,6 @@
                                 if (j_post!=null)
                                 {
                                     LOG.debug("auth rePOST {}->{}",authentication,j_uri);
-                                    Request base_request = HttpChannel.getCurrentHttpChannel().getRequest();
                                     base_request.setContentParameters(j_post);
                                 }
                                 session.removeAttribute(__J_URI);
@@ -393,7 +388,6 @@
 
                     if (MimeTypes.Type.FORM_ENCODED.is(req.getContentType()) && HttpMethod.POST.is(request.getMethod()))
                     {
-                        Request base_request = (req instanceof Request)?(Request)req:HttpChannel.getCurrentHttpChannel().getRequest();
                         MultiMap<String> formParameters = new MultiMap<>();
                         base_request.extractFormParameters(formParameters);
                         session.setAttribute(__J_POST, formParameters);
@@ -413,8 +407,6 @@
             else
             {
                 LOG.debug("challenge {}->{}",session.getId(),_formLoginPage);
-                Response base_response = HttpChannel.getCurrentHttpChannel().getResponse();
-                Request base_request = HttpChannel.getCurrentHttpChannel().getRequest();
                 int redirectCode = (base_request.getHttpVersion().getVersion() < HttpVersion.HTTP_1_1.getVersion() ? HttpServletResponse.SC_MOVED_TEMPORARILY : HttpServletResponse.SC_SEE_OTHER);
                 base_response.sendRedirect(redirectCode, response.encodeRedirectURL(URIUtil.addPaths(request.getContextPath(),_formLoginPage)));
             }
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/LoginAuthenticator.java b/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/LoginAuthenticator.java
index 0f2e097..e85b680 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/LoginAuthenticator.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/LoginAuthenticator.java
@@ -58,7 +58,7 @@
     /* ------------------------------------------------------------ */
     public UserIdentity login(String username, Object password, ServletRequest request)
     {
-        UserIdentity user = _loginService.login(username,password);
+        UserIdentity user = _loginService.login(username,password, request);
         if (user!=null)
         {
             renewSession((HttpServletRequest)request, (request instanceof Request? ((Request)request).getResponse() : null));
@@ -92,11 +92,11 @@
     /** Change the session id.
      * The session is changed to a new instance with a new ID if and only if:<ul>
      * <li>A session exists.
-     * <li>The {@link AuthConfiguration#isSessionRenewedOnAuthentication()} returns true.
+     * <li>The {@link org.eclipse.jetty.security.Authenticator.AuthConfiguration#isSessionRenewedOnAuthentication()} returns true.
      * <li>The session ID has been given to unauthenticated responses
      * </ul>
-     * @param request
-     * @param response
+     * @param request the request
+     * @param response the response
      * @return The new session.
      */
     protected HttpSession renewSession(HttpServletRequest request, HttpServletResponse response)
@@ -109,14 +109,14 @@
             {
                 //if we should renew sessions, and there is an existing session that may have been seen by non-authenticated users
                 //(indicated by SESSION_SECURED not being set on the session) then we should change id
-                if (httpSession.getAttribute(AbstractSession.SESSION_KNOWN_ONLY_TO_AUTHENTICATED)!=Boolean.TRUE)
+                if (httpSession.getAttribute(AbstractSession.SESSION_CREATED_SECURE)!=Boolean.TRUE)
                 {
                     if (httpSession instanceof AbstractSession)
                     {
                         AbstractSession abstractSession = (AbstractSession)httpSession;
                         String oldId = abstractSession.getId();
                         abstractSession.renewId(request);
-                        abstractSession.setAttribute(AbstractSession.SESSION_KNOWN_ONLY_TO_AUTHENTICATED, Boolean.TRUE);
+                        abstractSession.setAttribute(AbstractSession.SESSION_CREATED_SECURE, Boolean.TRUE);
                         if (abstractSession.isIdChanged() && response != null && (response instanceof Response))
                             ((Response)response).addCookie(abstractSession.getSessionManager().getSessionCookie(abstractSession, request.getContextPath(), request.isSecure()));
                         LOG.debug("renew {}->{}",oldId,abstractSession.getId());
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/SessionAuthentication.java b/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/SessionAuthentication.java
index ddc1732..3a7c006 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/SessionAuthentication.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/SessionAuthentication.java
@@ -71,7 +71,7 @@
         if (login_service==null)
             throw new IllegalStateException("!LoginService");
 
-        _userIdentity=login_service.login(_name,_credentials);
+        _userIdentity=login_service.login(_name,_credentials, null);
         LOG.debug("Deserialized and relogged in {}",this);
     }
 
@@ -89,7 +89,7 @@
         if (security!=null)
             security.logout(this);
         if (_session!=null)
-            _session.removeAttribute(AbstractSession.SESSION_KNOWN_ONLY_TO_AUTHENTICATED);
+            _session.removeAttribute(AbstractSession.SESSION_CREATED_SECURE);
     }
 
     @Override
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/SpnegoAuthenticator.java b/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/SpnegoAuthenticator.java
index 3f0fbe6..8692635 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/SpnegoAuthenticator.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/SpnegoAuthenticator.java
@@ -46,7 +46,7 @@
 
     /**
      * Allow for a custom authMethod value to be set for instances where SPENGO may not be appropriate
-     * @param authMethod
+     * @param authMethod the auth method
      */
     public SpnegoAuthenticator( String authMethod )
     {
diff --git a/jetty-security/src/test/java/org/eclipse/jetty/security/AliasedConstraintTest.java b/jetty-security/src/test/java/org/eclipse/jetty/security/AliasedConstraintTest.java
index fffc6cd..7da1a9b 100644
--- a/jetty-security/src/test/java/org/eclipse/jetty/security/AliasedConstraintTest.java
+++ b/jetty-security/src/test/java/org/eclipse/jetty/security/AliasedConstraintTest.java
@@ -18,8 +18,10 @@
 
 package org.eclipse.jetty.security;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.startsWith;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -29,9 +31,12 @@
 
 import org.eclipse.jetty.http.HttpStatus;
 import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.LocalConnector;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.server.handler.DefaultHandler;
+import org.eclipse.jetty.server.handler.HandlerList;
 import org.eclipse.jetty.server.handler.ResourceHandler;
 import org.eclipse.jetty.server.session.SessionHandler;
 import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
@@ -77,7 +82,10 @@
 
         context.setContextPath("/ctx");
         context.setResourceBase(MavenTestingUtils.getTestResourceDir("docroot").getAbsolutePath());
-        server.setHandler(context);
+        
+        HandlerList handlers = new HandlerList();
+        handlers.setHandlers(new Handler[]{context,new DefaultHandler()});
+        server.setHandler(handlers);
         context.setHandler(session);
         // context.addAliasCheck(new AllowSymLinkAliasChecker());
 
diff --git a/jetty-security/src/test/java/org/eclipse/jetty/security/ConstraintTest.java b/jetty-security/src/test/java/org/eclipse/jetty/security/ConstraintTest.java
index 5716445..4a37e6c 100644
--- a/jetty-security/src/test/java/org/eclipse/jetty/security/ConstraintTest.java
+++ b/jetty-security/src/test/java/org/eclipse/jetty/security/ConstraintTest.java
@@ -32,6 +32,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+
 import javax.servlet.HttpConstraintElement;
 import javax.servlet.HttpMethodConstraintElement;
 import javax.servlet.ServletException;
@@ -219,8 +220,8 @@
 
     /**
      * Equivalent of Servlet Spec 3.1 pg 132, sec 13.4.1.1, Example 13-1
-     * @ServletSecurity
-     * @throws Exception
+     * &#064;ServletSecurity
+     * @throws Exception if test fails
      */
     @Test
     public void testSecurityElementExample13_1() throws Exception
@@ -233,9 +234,9 @@
    
     /**
      * Equivalent of Servlet Spec 3.1 pg 132, sec 13.4.1.1, Example 13-2
-     * @ServletSecurity(@HttpConstraint(transportGuarantee = TransportGuarantee.CONFIDENTIAL))
+     * &#064;ServletSecurity(@HttpConstraint(transportGuarantee = TransportGuarantee.CONFIDENTIAL))
      * 
-     * @throws Exception
+     * @throws Exception if test fails
      */
     @Test
     public void testSecurityElementExample13_2() throws Exception
@@ -252,7 +253,7 @@
     /**
      * Equivalent of Servlet Spec 3.1 pg 132, sec 13.4.1.1, Example 13-3
      * @ServletSecurity(@HttpConstraint(EmptyRoleSemantic.DENY))
-     * @throws Exception
+     * @throws Exception if test fails
      */
     @Test
     public void testSecurityElementExample13_3() throws Exception
@@ -269,7 +270,7 @@
     /**
      * Equivalent of Servlet Spec 3.1 pg 132, sec 13.4.1.1, Example 13-4
      * @ServletSecurity(@HttpConstraint(rolesAllowed = "R1"))
-     * @throws Exception
+     * @throws Exception if test fails
      */
     @Test
     public void testSecurityElementExample13_4() throws Exception
@@ -293,7 +294,7 @@
      * @HttpMethodConstraint(value = "GET", rolesAllowed = "R1"),
      * @HttpMethodConstraint(value = "POST", rolesAllowed = "R1",
      *         transportGuarantee = TransportGuarantee.CONFIDENTIAL)})
-     * @throws Exception
+     * @throws Exception if test fails
      */ 
     @Test
     public void testSecurityElementExample13_5() throws Exception
@@ -318,7 +319,7 @@
     /**
      * Equivalent of Servlet Spec 3.1 pg 132, sec 13.4.1.1, Example 13-6
      * @ServletSecurity(value = @HttpConstraint(rolesAllowed = "R1"), httpMethodConstraints = @HttpMethodConstraint("GET"))
-     * @throws Exception
+     * @throws Exception if test fails
      */
     @Test
     public void testSecurityElementExample13_6 () throws Exception
@@ -344,7 +345,7 @@
      * @ServletSecurity(value = @HttpConstraint(rolesAllowed = "R1"), 
      *                  httpMethodConstraints = @HttpMethodConstraint(value="TRACE",
      *                  emptyRoleSemantic = EmptyRoleSemantic.DENY))
-     * @throws Exception
+     * @throws Exception if test fails
      */
     @Test
     public void testSecurityElementExample13_7() throws Exception
diff --git a/jetty-security/src/test/java/org/eclipse/jetty/security/DataConstraintsTest.java b/jetty-security/src/test/java/org/eclipse/jetty/security/DataConstraintsTest.java
index aec891a..77f4dd9 100644
--- a/jetty-security/src/test/java/org/eclipse/jetty/security/DataConstraintsTest.java
+++ b/jetty-security/src/test/java/org/eclipse/jetty/security/DataConstraintsTest.java
@@ -20,7 +20,9 @@
 
 import java.io.IOException;
 import java.util.Arrays;
+
 import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -375,10 +377,10 @@
         response = _connectorS.getResponses("GET /ctx/restricted/info HTTP/1.0\r\n\r\n");
         Assert.assertThat(response, Matchers.containsString("HTTP/1.1 403 Forbidden"));
 
-        response = _connector.getResponses("GET /ctx/restricted/info HTTP/1.0\r\n Authorization: Basic YWRtaW46cGFzc3dvcmQ=\r\n\r\n");
+        response = _connector.getResponses("GET /ctx/restricted/info HTTP/1.0\r\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\r\n\r\n");
         Assert.assertThat(response, Matchers.containsString("HTTP/1.1 403 Forbidden"));
 
-        response = _connectorS.getResponses("GET /ctx/restricted/info HTTP/1.0\r\n Authorization: Basic YWRtaW46cGFzc3dvcmQ=\r\n\r\n");
+        response = _connectorS.getResponses("GET /ctx/restricted/info HTTP/1.0\r\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\r\n\r\n");
         Assert.assertThat(response, Matchers.containsString("HTTP/1.1 403 Forbidden"));
 
     }
@@ -436,7 +438,7 @@
         }
 
         @Override
-        public UserIdentity login(String username, Object credentials)
+        public UserIdentity login(String username, Object credentials, ServletRequest request)
         {
             if("admin".equals(username) && "password".equals(credentials))
                     return new DefaultUserIdentity(null,null,new String[] { "admin" } );
diff --git a/jetty-security/src/test/java/org/eclipse/jetty/security/PropertyUserStoreTest.java b/jetty-security/src/test/java/org/eclipse/jetty/security/PropertyUserStoreTest.java
index e57c9ec..974d99a 100644
--- a/jetty-security/src/test/java/org/eclipse/jetty/security/PropertyUserStoreTest.java
+++ b/jetty-security/src/test/java/org/eclipse/jetty/security/PropertyUserStoreTest.java
@@ -18,178 +18,176 @@
 
 package org.eclipse.jetty.security;
 
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+import static org.junit.Assume.*;
+
 import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileWriter;
 import java.io.Writer;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.eclipse.jetty.toolchain.test.FS;
+import org.eclipse.jetty.toolchain.test.OS;
+import org.eclipse.jetty.toolchain.test.TestingDir;
 import org.eclipse.jetty.util.security.Credential;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
+import org.hamcrest.Matcher;
+import org.junit.Rule;
 import org.junit.Test;
 
 public class PropertyUserStoreTest
 {
-    String testFileDir = "target" + File.separator + "property-user-store-test";
-    String testFile = testFileDir + File.separator + "users.txt";
-
-    @Before
-    public void before() throws Exception
+    private final class UserCount implements PropertyUserStore.UserListener
     {
-        File file = new File(testFileDir);
-        file.mkdirs();
+        private final AtomicInteger userCount = new AtomicInteger();
+        private final List<String> users = new ArrayList<String>();
 
-        writeInitialUsers(testFile);
+        private UserCount()
+        {
+        }
+
+        public void update(String username, Credential credential, String[] roleArray)
+        {
+            if (!users.contains(username))
+            {
+                users.add(username);
+                userCount.getAndIncrement();
+            }
+        }
+
+        public void remove(String username)
+        {
+            users.remove(username);
+            userCount.getAndDecrement();
+        }
+
+        public void awaitCount(int expectedCount) throws InterruptedException
+        {
+            long timeout = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10);
+            
+            while (userCount.get() != expectedCount && (System.currentTimeMillis() < timeout))
+            {
+                TimeUnit.MILLISECONDS.sleep(100);
+            }
+            
+            assertThatCount(is(expectedCount));
+        }
+
+        public void assertThatCount(Matcher<Integer> matcher)
+        {
+            assertThat("User count",userCount.get(),matcher);
+        }
+
+        public void assertThatUsers(Matcher<Iterable<? super String>> matcher)
+        {
+            assertThat("Users list",users,matcher);
+        }
     }
 
-    @After
-    public void after() throws Exception
-    {
-        File file = new File(testFile);
+    @Rule
+    public TestingDir testdir = new TestingDir();
 
-        file.delete();
-    }
-
-    private void writeInitialUsers(String testFile) throws Exception
+    private File initUsersText() throws Exception
     {
-        try (Writer writer = new BufferedWriter(new FileWriter(testFile)))
+        Path dir = testdir.getDir().toPath().toRealPath();
+        FS.ensureDirExists(dir.toFile());
+        File users = dir.resolve("users.txt").toFile();
+        
+        try (Writer writer = new BufferedWriter(new FileWriter(users)))
         {
             writer.append("tom: tom, roleA\n");
             writer.append("dick: dick, roleB\n");
             writer.append("harry: harry, roleA, roleB\n");
         }
+        
+        return users;
     }
 
-    private void writeAdditionalUser(String testFile) throws Exception
+    private void addAdditionalUser(File usersFile, String userRef) throws Exception
     {
         Thread.sleep(1001);
-        try (Writer writer = new BufferedWriter(new FileWriter(testFile,true)))
+        try (Writer writer = new BufferedWriter(new FileWriter(usersFile,true)))
         {
-            writer.append("skip: skip, roleA\n");
+            writer.append(userRef);
         }
     }
 
     @Test
     public void testPropertyUserStoreLoad() throws Exception
     {
-        final AtomicInteger userCount = new AtomicInteger();
+        final UserCount userCount = new UserCount();
+        final File usersFile = initUsersText();
 
         PropertyUserStore store = new PropertyUserStore();
+        store.setConfigPath(usersFile);
 
-        store.setConfig(testFile);
-
-        store.registerUserListener(new PropertyUserStore.UserListener()
-        {
-
-            public void update(String username, Credential credential, String[] roleArray)
-            {
-                userCount.getAndIncrement();
-            }
-
-            public void remove(String username)
-            {
-
-            }
-        });
+        store.registerUserListener(userCount);
 
         store.start();
 
-        Assert.assertNotNull("Failed to retrieve UserIdentity directly from PropertyUserStore", store.getUserIdentity("tom"));
-        Assert.assertNotNull("Failed to retrieve UserIdentity directly from PropertyUserStore", store.getUserIdentity("dick"));
-        Assert.assertNotNull("Failed to retrieve UserIdentity directly from PropertyUserStore", store.getUserIdentity("harry"));
-        Assert.assertEquals(3,userCount.get());
+        assertThat("Failed to retrieve UserIdentity directly from PropertyUserStore", store.getUserIdentity("tom"), notNullValue());
+        assertThat("Failed to retrieve UserIdentity directly from PropertyUserStore", store.getUserIdentity("dick"), notNullValue());
+        assertThat("Failed to retrieve UserIdentity directly from PropertyUserStore", store.getUserIdentity("harry"), notNullValue());
+        userCount.assertThatCount(is(3));
+        userCount.awaitCount(3);
     }
 
     @Test
     public void testPropertyUserStoreLoadUpdateUser() throws Exception
     {
-
-        final AtomicInteger userCount = new AtomicInteger();
-
-        final List<String> users = new ArrayList<String>();
+        assumeThat("Skipping on OSX", OS.IS_OSX, is(false));
+        final UserCount userCount = new UserCount();
+        final File usersFile = initUsersText();
 
         PropertyUserStore store = new PropertyUserStore();
-        store.setRefreshInterval(1);
-        store.setConfig(testFile);
+        store.setHotReload(true);
+        store.setConfigPath(usersFile);
 
-        store.registerUserListener(new PropertyUserStore.UserListener()
-        {
-            public void update(String username, Credential credential, String[] roleArray)
-            {
-                if (!users.contains(username))
-                {
-                    users.add(username);
-                    userCount.getAndIncrement();
-                }
-            }
-
-            public void remove(String username)
-            {
-
-            }
-        });
+        store.registerUserListener(userCount);
 
         store.start();
-        Assert.assertEquals(3,userCount.get());
+        
+        userCount.assertThatCount(is(3));
 
-        writeAdditionalUser(testFile);
+        addAdditionalUser(usersFile,"skip: skip, roleA\n");
 
-        long start = System.currentTimeMillis();
-        while (userCount.get() < 4 && (System.currentTimeMillis() - start) < 10000)
-        {
-            Thread.sleep(10);
-        }
+        userCount.awaitCount(4);
 
-        Assert.assertNotNull("Failed to retrieve UserIdentity from PropertyUserStore directly", store.getUserIdentity("skip"));
-        Assert.assertEquals(4,userCount.get());
-
-        Assert.assertTrue(users.contains("skip"));
+        assertThat("Failed to retrieve UserIdentity from PropertyUserStore directly", store.getUserIdentity("skip"), notNullValue());
+        
+        userCount.assertThatCount(is(4));
+        userCount.assertThatUsers(hasItem("skip"));
     }
 
     @Test
     public void testPropertyUserStoreLoadRemoveUser() throws Exception
     {
-        writeAdditionalUser(testFile);
-
-        final AtomicInteger userCount = new AtomicInteger();
-
-        final List<String> users = new ArrayList<String>();
+        assumeThat("Skipping on OSX", OS.IS_OSX, is(false));
+        final UserCount userCount = new UserCount();
+        // initial user file (3) users
+        final File usersFile = initUsersText();
+        
+        // adding 4th user
+        addAdditionalUser(usersFile,"skip: skip, roleA\n");
 
         PropertyUserStore store = new PropertyUserStore();
-        store.setRefreshInterval(2);
-        store.setConfig(testFile);
+        store.setHotReload(true);
+        store.setConfigPath(usersFile);
 
-        store.registerUserListener(new PropertyUserStore.UserListener()
-        {
-
-            public void update(String username, Credential credential, String[] roleArray)
-            {
-                if (!users.contains(username))
-                {
-                    users.add(username);
-                    userCount.getAndIncrement();
-                }
-            }
-
-            public void remove(String username)
-            {
-                users.remove(username);
-                userCount.getAndDecrement();
-            }
-        });
+        store.registerUserListener(userCount);
 
         store.start();
 
-        Assert.assertEquals(4,userCount.get());
+        userCount.assertThatCount(is(4));
 
-        Thread.sleep(2000);
-        writeInitialUsers(testFile);
-        Thread.sleep(3000);
-        Assert.assertEquals(3,userCount.get());
+        // rewrite file with original 3 users
+        initUsersText();
+        
+        userCount.awaitCount(3);
     }
-
 }
diff --git a/jetty-security/src/test/resources/jetty-logging.properties b/jetty-security/src/test/resources/jetty-logging.properties
new file mode 100755
index 0000000..24d5e3a
--- /dev/null
+++ b/jetty-security/src/test/resources/jetty-logging.properties
@@ -0,0 +1,7 @@
+# Setup default logging implementation for during testing
+org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
+
+#org.eclipse.jetty.LEVEL=DEBUG
+
+#org.eclipse.jetty.util.PathWatcher.LEVEL=DEBUG
+#org.eclipse.jetty.util.PathWatcher.Noisy.LEVEL=OFF
diff --git a/jetty-server/pom.xml b/jetty-server/pom.xml
index cf63395..600e90d 100644
--- a/jetty-server/pom.xml
+++ b/jetty-server/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-server</artifactId>
@@ -15,63 +15,16 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <id>generate-manifest</id>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-                <Import-Package>javax.servlet.*;version="[2.6.0,3.2)",org.eclipse.jetty.jmx.*;version="9.1";resolution:=optional,*</Import-Package>
-                <_nouses>true</_nouses>
-              </instructions>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-jar-plugin</artifactId>
         <executions>
           <execution>
-            <id>artifact-jar</id>
-            <goals>
-              <goal>jar</goal>
-            </goals>
-          </execution>
-          <execution>
             <id>test-jar</id>
             <goals>
               <goal>test-jar</goal>
             </goals>
           </execution>
         </executions>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
       </plugin>
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
diff --git a/jetty-server/src/main/config/etc/home-base-warning.xml b/jetty-server/src/main/config/etc/home-base-warning.xml
index b83f36f..4d568f1 100644
--- a/jetty-server/src/main/config/etc/home-base-warning.xml
+++ b/jetty-server/src/main/config/etc/home-base-warning.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- ============================================================= -->
 <!-- Display a Warning Message if {jetty.home} == {jetty.base}     -->
 <!-- ============================================================= -->
 <Configure id="homeBaseWarning" class="org.eclipse.jetty.server.HomeBaseWarning">
-</Configure>
\ No newline at end of file
+</Configure>
diff --git a/jetty-server/src/main/config/etc/jetty-debug.xml b/jetty-server/src/main/config/etc/jetty-debug.xml
index 52b4bdb..2e47a5f 100644
--- a/jetty-server/src/main/config/etc/jetty-debug.xml
+++ b/jetty-server/src/main/config/etc/jetty-debug.xml
@@ -1,23 +1,36 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
-<!-- Mixin the DebugHandler                                          -->
+<!-- The DebugListener                                               -->
 <!-- =============================================================== -->
 
-
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
-    <Get id="oldhandler" name="handler"/>
-    <Set name="handler">
-      <New id="DebugHandler" class="org.eclipse.jetty.server.handler.DebugHandler">
-        <Set name="handler"><Ref refid="oldhandler"/></Set>
-	<Set name="outputStream">
-	  <New class="org.eclipse.jetty.util.RolloverFileOutputStream">
-	    <Arg type="String"><Property name="jetty.logs" default="./logs"/>/yyyy_mm_dd.debug.log</Arg>
-	    <Arg type="boolean">true</Arg> <!-- append -->
-	    <Arg type="int">90</Arg> <!-- retain days -->
-	  </New>
-	</Set>
+  <New id="DebugListener" class="org.eclipse.jetty.server.DebugListener">
+    <Arg name="outputStream">
+      <New class="org.eclipse.jetty.util.RolloverFileOutputStream">
+        <Arg type="String"><Property name="jetty.logs" default="./logs"/>/yyyy_mm_dd.debug.log</Arg>
+        <Arg type="boolean"><Property name="jetty.debug.append" default="true"/></Arg>
+        <Arg type="int"><Property name="jetty.debug.retainDays" default="14"/></Arg>
+        <Arg>
+          <Call class="java.util.TimeZone" name="getTimeZone"><Arg><Property name="jetty.debug.timezone" default="GMT"/></Arg></Call>
+        </Arg>
       </New>
-    </Set>
+    </Arg>
+    <Arg name="showHeaders" type="boolean"><Property name="jetty.debug.showHeaders" default="true"/></Arg>
+    <Arg name="renameThread" type="boolean"><Property name="jetty.debug.renameThread" default="false"/></Arg>
+    <Arg name="dumpContext" type="boolean"><Property name="jetty.debug.dumpContext" default="true"/></Arg>
+  </New>
+ 
+  <Call name="addBean"><Arg><Ref refid="DebugListener"/></Arg></Call>
+ 
+  <Ref refid="DeploymentManager">
+    <Call name="addLifeCycleBinding">
+      <Arg>
+        <New class="org.eclipse.jetty.deploy.bindings.DebugListenerBinding">
+          <Arg><Ref refid="DebugListener"/></Arg>
+        </New>
+      </Arg>
+    </Call>
+  </Ref>
 </Configure>
diff --git a/jetty-server/src/main/config/etc/jetty-debuglog.xml b/jetty-server/src/main/config/etc/jetty-debuglog.xml
new file mode 100644
index 0000000..adbb10a
--- /dev/null
+++ b/jetty-server/src/main/config/etc/jetty-debuglog.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<!-- =============================================================== -->
+<!-- The DebugHandler                                                -->
+<!-- =============================================================== -->
+
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+  <Get id="oldhandler" name="handler"/>
+  <Set name="handler">
+    <New id="DebugHandler" class="org.eclipse.jetty.server.handler.DebugHandler">
+      <Set name="handler"><Ref refid="oldhandler"/></Set>
+      <Set name="outputStream">
+        <New class="org.eclipse.jetty.util.RolloverFileOutputStream">
+          <Arg type="String"><Property name="jetty.debuglog.dir" deprecated="jetty.logs" default="./logs"/>/yyyy_mm_dd.debug.log</Arg>
+          <Arg type="boolean"><Property name="jetty.debuglog.append" default="true"/></Arg>
+          <Arg type="int"><Property name="jetty.debuglog.retainDays" default="90"/></Arg>
+          <Arg>
+            <Call class="java.util.TimeZone" name="getTimeZone"><Arg><Property name="jetty.debuglog.timezone" default="GMT"/></Arg></Call>
+          </Arg>
+        </New>
+      </Set>
+    </New>
+  </Set>
+</Configure>
diff --git a/jetty-server/src/main/config/etc/jetty-gzip.xml b/jetty-server/src/main/config/etc/jetty-gzip.xml
new file mode 100644
index 0000000..f26ef0b
--- /dev/null
+++ b/jetty-server/src/main/config/etc/jetty-gzip.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<!-- =============================================================== -->
+<!-- Mixin the GZIP Handler                                          -->
+<!-- This applies the GZIP Handler to the entire server              -->
+<!-- If a GZIP handler is required for an individual context, then   -->
+<!-- use a context XML (see test.xml example in distribution)        -->
+<!-- =============================================================== -->
+
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+  <Get id="next" name="handler" />
+  <Set name="handler">
+    <New id="GzipHandler" class="org.eclipse.jetty.server.handler.gzip.GzipHandler">
+      <Set name="handler"><Ref refid="next" /></Set>
+      <Set name="minGzipSize"><Property name="jetty.gzip.minGzipSize" deprecated="gzip.minGzipSize" default="2048"/></Set>
+      <Set name="checkGzExists"><Property name="jetty.gzip.checkGzExists" deprecated="gzip.checkGzExists" default="false"/></Set>
+      <Set name="compressionLevel"><Property name="jetty.gzip.compressionLevel" deprecated="gzip.compressionLevel" default="-1"/></Set>
+      <Set name="excludedAgentPatterns">
+        <Array type="String">
+          <Item><Property name="jetty.gzip.excludedUserAgent" deprecated="gzip.excludedUserAgent" default=".*MSIE.6\.0.*"/></Item>
+        </Array>
+      </Set>
+
+      <Set name="includedMethods">
+        <Array type="String">
+          <Item>GET</Item>
+        </Array>
+      </Set>
+
+      <!--
+      <Set name="includedPaths">
+        <Array type="String">
+          <Item>/*</Item>
+        </Array>
+      </Set>
+      -->
+
+      <!--
+      <Set name="excludedPaths">
+        <Array type="String">
+          <Item>*.gz</Item>
+        </Array>
+      </Set>
+      -->
+
+      <!--
+      <Call name="addIncludedMimeTypes">
+        <Arg><Array type="String">
+          <Item>some/type</Item>
+        </Array></Arg>
+      </Call>
+      -->
+
+      <!--
+      <Call name="addExcludedMimeTypes">
+        <Arg><Array type="String">
+          <Item>some/type</Item>
+        </Array></Arg>
+      </Call>
+      -->
+
+    </New>
+  </Set>
+</Configure>
+
+
diff --git a/jetty-server/src/main/config/etc/jetty-http.xml b/jetty-server/src/main/config/etc/jetty-http.xml
index 1459ba8..ebeed5d 100644
--- a/jetty-server/src/main/config/etc/jetty-http.xml
+++ b/jetty-server/src/main/config/etc/jetty-http.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- ============================================================= -->
 <!-- Configure the Jetty Server instance with an ID "Server"       -->
@@ -20,10 +20,10 @@
   <!-- =========================================================== -->
   <Call name="addConnector">
     <Arg>
-      <New class="org.eclipse.jetty.server.ServerConnector">
+      <New id="httpConnector" class="org.eclipse.jetty.server.ServerConnector">
         <Arg name="server"><Ref refid="Server" /></Arg>
-        <Arg name="acceptors" type="int"><Property name="http.acceptors" default="-1"/></Arg>
-        <Arg name="selectors" type="int"><Property name="http.selectors" default="-1"/></Arg>
+        <Arg name="acceptors" type="int"><Property name="jetty.http.acceptors" deprecated="http.acceptors" default="-1"/></Arg>
+        <Arg name="selectors" type="int"><Property name="jetty.http.selectors" deprecated="http.selectors" default="-1"/></Arg>
         <Arg name="factories">
           <Array type="org.eclipse.jetty.server.ConnectionFactory">
             <Item>
@@ -33,13 +33,12 @@
             </Item>
           </Array>
         </Arg>
-        <Set name="host"><Property name="jetty.host" /></Set>
-        <Set name="port"><Property name="jetty.port" default="80" /></Set>
-        <Set name="idleTimeout"><Property name="http.timeout" default="30000"/></Set>
-        <Set name="soLingerTime"><Property name="http.soLingerTime" default="-1"/></Set>
-        <Set name="acceptorPriorityDelta"><Property name="http.acceptorPriorityDelta" default="0"/></Set>
-        <Set name="selectorPriorityDelta"><Property name="http.selectorPriorityDelta" default="0"/></Set>
-        <Set name="acceptQueueSize"><Property name="http.acceptQueueSize" default="0"/></Set>
+        <Set name="host"><Property name="jetty.http.host" deprecated="jetty.host" /></Set>
+        <Set name="port"><Property name="jetty.http.port" deprecated="jetty.port" default="8080" /></Set>
+        <Set name="idleTimeout"><Property name="jetty.http.idleTimeout" deprecated="http.timeout" default="30000"/></Set>
+        <Set name="soLingerTime"><Property name="jetty.http.soLingerTime" deprecated="http.soLingerTime" default="-1"/></Set>
+        <Set name="acceptorPriorityDelta"><Property name="jetty.http.acceptorPriorityDelta" deprecated="http.acceptorPriorityDelta" default="0"/></Set>
+        <Set name="acceptQueueSize"><Property name="jetty.http.acceptQueueSize" deprecated="http.acceptQueueSize" default="0"/></Set>
       </New>
     </Arg>
   </Call>
diff --git a/jetty-server/src/main/config/etc/jetty-https.xml b/jetty-server/src/main/config/etc/jetty-https.xml
index 5eab5c5..c9d497e 100644
--- a/jetty-server/src/main/config/etc/jetty-https.xml
+++ b/jetty-server/src/main/config/etc/jetty-https.xml
@@ -1,53 +1,28 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- ============================================================= -->
 <!-- Configure a HTTPS connector.                                  -->
 <!-- This configuration must be used in conjunction with jetty.xml -->
 <!-- and jetty-ssl.xml.                                            -->
 <!-- ============================================================= -->
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
+<Configure id="sslConnector" class="org.eclipse.jetty.server.ServerConnector">
 
-  <!-- =========================================================== -->
-  <!-- Add a HTTPS Connector.                                      -->
-  <!-- Configure an o.e.j.server.ServerConnector with connection   -->
-  <!-- factories for TLS (aka SSL) and HTTP to provide HTTPS.      -->
-  <!-- All accepted TLS connections are wired to a HTTP connection.-->
-  <!--                                                             -->
-  <!-- Consult the javadoc of o.e.j.server.ServerConnector,        -->
-  <!-- o.e.j.server.SslConnectionFactory and                       -->
-  <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
-  <!-- that may be set here.                                       -->
-  <!-- =========================================================== -->
-  <Call id="httpsConnector" name="addConnector">
+  <Call name="addIfAbsentConnectionFactory">
     <Arg>
-      <New class="org.eclipse.jetty.server.ServerConnector">
-        <Arg name="server"><Ref refid="Server" /></Arg>
-        <Arg name="acceptors" type="int"><Property name="ssl.acceptors" default="-1"/></Arg>
-        <Arg name="selectors" type="int"><Property name="ssl.selectors" default="-1"/></Arg>
-        <Arg name="factories">
-          <Array type="org.eclipse.jetty.server.ConnectionFactory">
-            <Item>
-              <New class="org.eclipse.jetty.server.SslConnectionFactory">
-                <Arg name="next">http/1.1</Arg>
-                <Arg name="sslContextFactory"><Ref refid="sslContextFactory"/></Arg>
-              </New>
-            </Item>
-            <Item>
-              <New class="org.eclipse.jetty.server.HttpConnectionFactory">
-                <Arg name="config"><Ref refid="sslHttpConfig"/></Arg>
-              </New>
-            </Item>
-          </Array>
-        </Arg>
-        <Set name="host"><Property name="jetty.host" /></Set>
-        <Set name="port"><Property name="https.port" default="443" /></Set>
-        <Set name="idleTimeout"><Property name="https.timeout" default="30000"/></Set>
-        <Set name="soLingerTime"><Property name="https.soLingerTime" default="-1"/></Set>
-        <Set name="acceptorPriorityDelta"><Property name="ssl.acceptorPriorityDelta" default="0"/></Set>
-        <Set name="selectorPriorityDelta"><Property name="ssl.selectorPriorityDelta" default="0"/></Set>
-        <Set name="acceptQueueSize"><Property name="https.acceptQueueSize" default="0"/></Set>
+      <New class="org.eclipse.jetty.server.SslConnectionFactory">
+        <Arg name="next">http/1.1</Arg>
+        <Arg name="sslContextFactory"><Ref refid="sslContextFactory"/></Arg>
       </New>
     </Arg>
   </Call>
+
+  <Call name="addConnectionFactory">
+    <Arg>
+      <New class="org.eclipse.jetty.server.HttpConnectionFactory">
+        <Arg name="config"><Ref refid="sslHttpConfig" /></Arg>
+      </New>
+    </Arg>
+  </Call>
+  
 </Configure>
diff --git a/jetty-server/src/main/config/etc/jetty-ipaccess.xml b/jetty-server/src/main/config/etc/jetty-ipaccess.xml
index a44aa1d..d8236a9 100644
--- a/jetty-server/src/main/config/etc/jetty-ipaccess.xml
+++ b/jetty-server/src/main/config/etc/jetty-ipaccess.xml
@@ -1,31 +1,31 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
-<!-- Mixin the Statistics Handler                                    -->
+<!-- The IP Access Handler                                           -->
 <!-- =============================================================== -->
 
-
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
 
-    <Get id="oldhandler" name="handler"/>
+  <Get id="oldhandler" name="handler"/>
 
-    <Set name="handler">
-     <New id="IPAccessHandler" class="org.eclipse.jetty.server.handler.IPAccessHandler">
+  <Set name="handler">
+    <New id="IPAccessHandler" class="org.eclipse.jetty.server.handler.IPAccessHandler">
       <Set name="handler"><Ref refid="oldhandler"/></Set>
       <Set name="white">
         <Array type="String">
-	      <Item>127.0.0.1</Item>
-	      <Item>127.0.0.2/*.html</Item>
-	    </Array>
+          <Item>127.0.0.1</Item>
+          <Item>127.0.0.2/*.html</Item>
+        </Array>
       </Set>
       <Set name="black">
         <Array type="String">
-	      <Item>127.0.0.1/blacklisted</Item>
-	      <Item>127.0.0.2/black.html</Item>
-	    </Array>
+          <Item>127.0.0.1/blacklisted</Item>
+          <Item>127.0.0.2/black.html</Item>
+        </Array>
       </Set>
       <Set name="whiteListByPath">false</Set>
-     </New>
-    </Set>
+    </New>
+  </Set>
+
 </Configure>
diff --git a/jetty-server/src/main/config/etc/jetty-jdbc-sessions.xml b/jetty-server/src/main/config/etc/jetty-jdbc-sessions.xml
new file mode 100644
index 0000000..46beaf2
--- /dev/null
+++ b/jetty-server/src/main/config/etc/jetty-jdbc-sessions.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+
+
+  <!-- ===================================================================== -->
+  <!-- Configure a SessionIdManager                                          -->
+  <!-- ===================================================================== -->
+  <Set name="sessionIdManager">
+    <New id="idMgr" class="org.eclipse.jetty.server.session.JDBCSessionIdManager">
+      <Arg>
+        <Ref refid="Server"/>
+      </Arg>
+      <Set name="workerName"><Property name="jetty.jdbcSession.workerName" default="node1"/></Set>
+      <Set name="scavengeInterval"><Property name="jetty.jdbcSession.scavenge" default="1800"/></Set>
+
+      <!-- ===================================================================== -->
+      <!-- Uncomment either the datasource or driver setup and configure         -->
+      <!-- ===================================================================== -->
+
+      <!--
+          <Set name="DatasourceName"><Property name="jetty.jdbcSession.datasource" default="javax.sql.DataSource/default"/></Set>
+      -->
+      <!--
+        <Call name="setDriverInfo">
+          <Arg><Property name="jetty.jdbcSession.driverClass"/></Arg>
+          <Arg><Property name="jetty.jdbcSession.connectionURL"/></Arg>
+        </Call>
+      -->
+    </New>
+  </Set>
+
+</Configure>
diff --git a/jetty-server/src/main/config/etc/jetty-lowresources.xml b/jetty-server/src/main/config/etc/jetty-lowresources.xml
index 060919a..f6442c8 100644
--- a/jetty-server/src/main/config/etc/jetty-lowresources.xml
+++ b/jetty-server/src/main/config/etc/jetty-lowresources.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Mixin the Low Resources Monitor                                 -->
@@ -10,12 +10,12 @@
     <Arg>
       <New class="org.eclipse.jetty.server.LowResourceMonitor">
         <Arg name="server"><Ref refid='Server'/></Arg>
-        <Set name="period"><Property name="lowresources.period" default="1000"/></Set>
-        <Set name="lowResourcesIdleTimeout"><Property name="lowresources.lowResourcesIdleTimeout" default="200"/></Set>
-        <Set name="monitorThreads"><Property name="lowresources.monitorThreads" default="true"/></Set>
-        <Set name="maxConnections"><Property name="lowresources.maxConnections" default="0"/></Set>
-        <Set name="maxMemory"><Property name="lowresources.maxMemory" default="0"/></Set>
-        <Set name="maxLowResourcesTime"><Property name="lowresources.maxLowResourcesTime" default="5000"/></Set>
+        <Set name="period"><Property name="jetty.lowresources.period" deprecated="lowresources.period" default="1000"/></Set>
+        <Set name="lowResourcesIdleTimeout"><Property name="jetty.lowresources.idleTimeout" deprecated="lowresources.lowResourcesIdleTimeout" default="1000"/></Set>
+        <Set name="monitorThreads"><Property name="jetty.lowresources.monitorThreads" deprecated="lowresources.monitorThreads" default="true"/></Set>
+        <Set name="maxConnections"><Property name="jetty.lowresources.maxConnections" deprecated="lowresources.maxConnections" default="0"/></Set>
+        <Set name="maxMemory"><Property name="jetty.lowresources.maxMemory" deprecated="lowresources.maxMemory" default="0"/></Set>
+        <Set name="maxLowResourcesTime"><Property name="jetty.lowresources.maxLowResourcesTime" deprecated="lowresources.maxLowResourcesTime" default="5000"/></Set>
       </New>
     </Arg>
   </Call>
diff --git a/jetty-server/src/main/config/etc/jetty-proxy-protocol-ssl.xml b/jetty-server/src/main/config/etc/jetty-proxy-protocol-ssl.xml
new file mode 100644
index 0000000..91452f2
--- /dev/null
+++ b/jetty-server/src/main/config/etc/jetty-proxy-protocol-ssl.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<Configure id="sslConnector" class="org.eclipse.jetty.server.ServerConnector">
+  <Call name="addFirstConnectionFactory">
+    <Arg>
+      <New class="org.eclipse.jetty.server.ProxyConnectionFactory"/>
+    </Arg>
+  </Call>
+</Configure>
diff --git a/jetty-server/src/main/config/etc/jetty-proxy-protocol.xml b/jetty-server/src/main/config/etc/jetty-proxy-protocol.xml
new file mode 100644
index 0000000..5169c4f
--- /dev/null
+++ b/jetty-server/src/main/config/etc/jetty-proxy-protocol.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<Configure id="httpConnector" class="org.eclipse.jetty.server.ServerConnector">
+  <Call name="addFirstConnectionFactory">
+    <Arg>
+      <New class="org.eclipse.jetty.server.ProxyConnectionFactory"/>
+    </Arg>
+  </Call>
+</Configure>
diff --git a/jetty-server/src/main/config/etc/jetty-requestlog.xml b/jetty-server/src/main/config/etc/jetty-requestlog.xml
index 135885e..3ef2c32 100644
--- a/jetty-server/src/main/config/etc/jetty-requestlog.xml
+++ b/jetty-server/src/main/config/etc/jetty-requestlog.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Configure the Jetty Request Log                                 -->
@@ -7,26 +7,23 @@
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
 
   <!-- =========================================================== -->
-  <!-- Configure Request Log -->
+  <!-- Configure Request Log for Server                            -->
+  <!-- (Use RequestLogHandler for a context specific RequestLog    -->
   <!-- =========================================================== -->
-  <Ref refid="Handlers">
-    <Call name="addHandler">
-      <Arg>
-        <New id="RequestLog" class="org.eclipse.jetty.server.handler.RequestLogHandler">
-          <Set name="requestLog">
-            <New id="RequestLogImpl" class="org.eclipse.jetty.server.AsyncNCSARequestLog">
-              <Set name="filename"><Property name="jetty.base" default="." /><Property name="requestlog.filename" default="/logs/yyyy_mm_dd.request.log"/></Set>
-              <Set name="filenameDateFormat"><Property name="requestlog.filenameDateFormat" default="yyyy_MM_dd"/></Set>
-              <Set name="retainDays"><Property name="requestlog.retain" default="90"/></Set>
-              <Set name="append"><Property name="requestlog.append" default="false"/></Set>
-              <Set name="extended"><Property name="requestlog.extended" default="false"/></Set>
-              <Set name="logCookies"><Property name="requestlog.cookies" default="false"/></Set>
-              <Set name="LogTimeZone"><Property name="requestlog.timezone" default="GMT"/></Set>
-            </New>
-          </Set>
-        </New>
-      </Arg>
-    </Call>
-  </Ref>
-
+  <Set name="RequestLog">
+    <New id="RequestLog" class="org.eclipse.jetty.server.AsyncNCSARequestLog">
+      <Set name="filename"><Property name="jetty.base" default="." /><Property>
+          <Name>jetty.requestlog.filePath</Name>
+          <Deprecated>requestlog.filename</Deprecated>
+          <Default><Property name="jetty.requestlog.dir" default="/logs"/>/yyyy_mm_dd.request.log</Default>
+        </Property>
+      </Set>
+      <Set name="filenameDateFormat"><Property name="jetty.requestlog.filenameDateFormat" deprecated="requestlog.filenameDateFormat" default="yyyy_MM_dd"/></Set>
+      <Set name="retainDays"><Property name="jetty.requestlog.retainDays" deprecated="requestlog.retain" default="90"/></Set>
+      <Set name="append"><Property name="jetty.requestlog.append" deprecated="requestlog.append" default="false"/></Set>
+      <Set name="extended"><Property name="jetty.requestlog.extended" deprecated="requestlog.extended" default="false"/></Set>
+      <Set name="logCookies"><Property name="jetty.requestlog.cookies" deprecated="requestlog.cookies" default="false"/></Set>
+      <Set name="LogTimeZone"><Property name="jetty.requestlog.timezone" deprecated="requestlog.timezone" default="GMT"/></Set>
+    </New>
+  </Set>
 </Configure>
diff --git a/jetty-server/src/main/config/etc/jetty-ssl-context.xml b/jetty-server/src/main/config/etc/jetty-ssl-context.xml
new file mode 100644
index 0000000..68b802c
--- /dev/null
+++ b/jetty-server/src/main/config/etc/jetty-ssl-context.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<!-- ============================================================= -->
+<!-- SSL ContextFactory configuration                              -->
+<!-- ============================================================= -->
+<Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
+  <Set name="KeyStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.sslContext.keyStorePath" deprecated="jetty.keystore" default="etc/keystore"/></Set>
+  <Set name="KeyStorePassword"><Property name="jetty.sslContext.keyStorePassword" deprecated="jetty.keystore.password" default="OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"/></Set>
+  <Set name="KeyStoreType"><Property name="jetty.sslContext.keyStoreType" default="JKS"/></Set>
+  <Set name="KeyStoreProvider"><Property name="jetty.sslContext.keyStoreProvider"/></Set>
+  <Set name="KeyManagerPassword"><Property name="jetty.sslContext.keyManagerPassword" deprecated="jetty.keymanager.password" default="OBF:1u2u1wml1z7s1z7a1wnl1u2g"/></Set>
+  <Set name="TrustStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.sslContext.trustStorePath" deprecated="jetty.truststore" default="etc/keystore"/></Set>
+  <Set name="TrustStorePassword"><Property name="jetty.sslContext.trustStorePassword" deprecated="jetty.truststore.password"/></Set>
+  <Set name="TrustStoreType"><Property name="jetty.sslContext.trustStoreType"/></Set>
+  <Set name="TrustStoreProvider"><Property name="jetty.sslContext.trustStoreProvider"/></Set>
+  <Set name="EndpointIdentificationAlgorithm"></Set>
+  <Set name="NeedClientAuth"><Property name="jetty.sslContext.needClientAuth" deprecated="jetty.ssl.needClientAuth" default="false"/></Set>
+  <Set name="WantClientAuth"><Property name="jetty.sslContext.wantClientAuth" deprecated="jetty.ssl.wantClientAuth" default="false"/></Set>
+  <Set name="ExcludeCipherSuites">
+   <Array type="String">
+    <Item>SSL_RSA_WITH_DES_CBC_SHA</Item>
+    <Item>SSL_DHE_RSA_WITH_DES_CBC_SHA</Item>
+    <Item>SSL_DHE_DSS_WITH_DES_CBC_SHA</Item>
+    <Item>SSL_RSA_EXPORT_WITH_RC4_40_MD5</Item>
+    <Item>SSL_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
+    <Item>SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
+    <Item>SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</Item>
+   </Array>
+  </Set>
+  <Set name="useCipherSuitesOrder"><Property name="jetty.sslContext.useCipherSuitesOrder" default="true"/></Set>
+</Configure>
diff --git a/jetty-server/src/main/config/etc/jetty-ssl.xml b/jetty-server/src/main/config/etc/jetty-ssl.xml
index 4ac2d3e..6bb613e 100644
--- a/jetty-server/src/main/config/etc/jetty-ssl.xml
+++ b/jetty-server/src/main/config/etc/jetty-ssl.xml
@@ -1,31 +1,40 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- ============================================================= -->
-<!-- Configure a TLS (SSL) Context Factory                         -->
-<!-- This configuration must be used in conjunction with jetty.xml -->
-<!-- and either jetty-https.xml or jetty-spdy.xml (but not both)   -->
+<!-- Base SSL configuration                                        -->
+<!-- This configuration needs to be used together with 1 or more   -->
+<!-- of jetty-https.xml or jetty-http2.xml                         -->
 <!-- ============================================================= -->
-<Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
-  <Set name="KeyStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.keystore" default="etc/keystore"/></Set>
-  <Set name="KeyStorePassword"><Property name="jetty.keystore.password" default="OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"/></Set>
-  <Set name="KeyManagerPassword"><Property name="jetty.keymanager.password" default="OBF:1u2u1wml1z7s1z7a1wnl1u2g"/></Set>
-  <Set name="TrustStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.truststore" default="etc/keystore"/></Set>
-  <Set name="TrustStorePassword"><Property name="jetty.truststore.password" default="OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"/></Set>
-  <Set name="EndpointIdentificationAlgorithm"></Set>
-  <Set name="NeedClientAuth"><Property name="jetty.ssl.needClientAuth" default="false"/></Set>
-  <Set name="WantClientAuth"><Property name="jetty.ssl.wantClientAuth" default="false"/></Set>
-  <Set name="ExcludeCipherSuites">
-    <Array type="String">
-      <Item>SSL_RSA_WITH_DES_CBC_SHA</Item>
-      <Item>SSL_DHE_RSA_WITH_DES_CBC_SHA</Item>
-      <Item>SSL_DHE_DSS_WITH_DES_CBC_SHA</Item>
-      <Item>SSL_RSA_EXPORT_WITH_RC4_40_MD5</Item>
-      <Item>SSL_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
-      <Item>SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
-      <Item>SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</Item>
-    </Array>
-  </Set>
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+
+  <!-- =========================================================== -->
+  <!-- Add a SSL Connector with no protocol factories              -->
+  <!-- =========================================================== -->
+  <Call  name="addConnector">
+    <Arg>
+      <New id="sslConnector" class="org.eclipse.jetty.server.ServerConnector">
+        <Arg name="server"><Ref refid="Server" /></Arg>
+        <Arg name="acceptors" type="int"><Property name="jetty.ssl.acceptors" deprecated="ssl.acceptors" default="-1"/></Arg>
+        <Arg name="selectors" type="int"><Property name="jetty.ssl.selectors" deprecated="ssl.selectors" default="-1"/></Arg>
+        <Arg name="factories">
+          <Array type="org.eclipse.jetty.server.ConnectionFactory">
+            <!-- uncomment to support proxy protocol
+            <Item>
+              <New class="org.eclipse.jetty.server.ProxyConnectionFactory"/>
+            </Item>-->
+          </Array>
+        </Arg>
+
+        <Set name="host"><Property name="jetty.ssl.host" deprecated="jetty.host" /></Set>
+        <Set name="port"><Property name="jetty.ssl.port" deprecated="ssl.port" default="8443" /></Set>
+        <Set name="idleTimeout"><Property name="jetty.ssl.idleTimeout" deprecated="ssl.timeout" default="30000"/></Set>
+        <Set name="soLingerTime"><Property name="jetty.ssl.soLingerTime" deprecated="ssl.soLingerTime" default="-1"/></Set>
+        <Set name="acceptorPriorityDelta"><Property name="jetty.ssl.acceptorPriorityDelta" deprecated="ssl.acceptorPriorityDelta" default="0"/></Set>
+        <Set name="acceptQueueSize"><Property name="jetty.ssl.acceptQueueSize" deprecated="ssl.acceptQueueSize" default="0"/></Set>
+      </New>
+    </Arg>
+  </Call>
 
   <!-- =========================================================== -->
   <!-- Create a TLS specific HttpConfiguration based on the        -->
@@ -36,7 +45,11 @@
   <New id="sslHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
     <Arg><Ref refid="httpConfig"/></Arg>
     <Call name="addCustomizer">
-      <Arg><New class="org.eclipse.jetty.server.SecureRequestCustomizer"/></Arg>
+      <Arg>
+        <New class="org.eclipse.jetty.server.SecureRequestCustomizer">
+          <Arg type="boolean"><Property name="jetty.ssl.sniHostCheck" default="true"/></Arg>
+        </New>
+      </Arg>
     </Call>
   </New>
 
diff --git a/jetty-server/src/main/config/etc/jetty-stats.xml b/jetty-server/src/main/config/etc/jetty-stats.xml
index 2e7a57c..4e01490 100644
--- a/jetty-server/src/main/config/etc/jetty-stats.xml
+++ b/jetty-server/src/main/config/etc/jetty-stats.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Mixin the Statistics Handler                                    -->
diff --git a/jetty-server/src/main/config/etc/jetty-xinetd.xml b/jetty-server/src/main/config/etc/jetty-xinetd.xml
deleted file mode 100644
index a4750de..0000000
--- a/jetty-server/src/main/config/etc/jetty-xinetd.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
-<!-- =============================================================== -->
-<!-- Configuration for starting up Jetty using inetd/xinetd          -->
-<!-- This feature requires at least Java 5                           -->
-<!--                                                                 -->
-<!-- Making it a mixin for convenience, but note that if used        -->
-<!-- with jetty.xml, Jetty will use multiple connectors              -->
-<!-- =============================================================== -->
-
-<!-- Sample xinetd configuration (restart xinetd after adding the configuration file)
-
-service jetty
-{
-    disable     = no
-
-    id          = jetty
-    type        = UNLISTED
-    wait        = yes
-    socket_type = stream
-
-    # change this
-    user        = username
-    group       = groupname
-    port        = 2001
-
-    # sample script for running jetty as a service
-    # replace $JETTY_HOME with /path/to/jetty_home/
-    server      = $JETTY_HOME/bin/jetty-xinetd.sh
-}
-
--->
-
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-    <Call name="addConnector">
-      <Arg>
-          <!-- Inherited channel (from inetd/xinetd) -->
-          <New class="org.eclipse.jetty.server.nio.InheritedChannelConnector">
-
-
-            <!-- Optional. Fallback in case System.inheritedChannel() does not give a ServerSocketChannel
-            <Set name="port"><Property name="jetty.service.port" default="8082"/></Set>
-            -->
-
-            <!-- sane defaults -->
-            <Set name="idleTimeout"><Property name="jetty.xinetd.idleTimeout" default="300000"/></Set>
-            <Set name="Acceptors"><Property name="jetty.xinetd.acceptors" default="2"/></Set>
-            <Set name="statsOn"><Property name="jetty.xinetd.statsOn" default="false"/></Set>
-          </New>
-      </Arg>
-    </Call>
-</Configure>
-
diff --git a/jetty-server/src/main/config/etc/jetty.xml b/jetty-server/src/main/config/etc/jetty.xml
index d8708ef..5412979 100644
--- a/jetty-server/src/main/config/etc/jetty.xml
+++ b/jetty-server/src/main/config/etc/jetty.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Documentation of this file format can be found at:              -->
@@ -46,9 +46,9 @@
     <Arg name="threadpool"><New id="threadpool" class="org.eclipse.jetty.util.thread.QueuedThreadPool"/></Arg>
     -->
     <Get name="ThreadPool">
-      <Set name="minThreads" type="int"><Property name="threads.min" default="10"/></Set>
-      <Set name="maxThreads" type="int"><Property name="threads.max" default="200"/></Set>
-      <Set name="idleTimeout" type="int"><Property name="threads.timeout" default="60000"/></Set>
+      <Set name="minThreads" type="int"><Property name="jetty.threadPool.minThreads" deprecated="threads.min" default="10"/></Set>
+      <Set name="maxThreads" type="int"><Property name="jetty.threadPool.maxThreads" deprecated="threads.max" default="200"/></Set>
+      <Set name="idleTimeout" type="int"><Property name="jetty.threadPool.idleTimeout" deprecated="threads.timeout" default="60000"/></Set>
       <Set name="detailedDump">false</Set>
     </Get>
 
@@ -64,29 +64,31 @@
     <!-- =========================================================== -->
     <!-- Http Configuration.                                         -->
     <!-- This is a common configuration instance used by all         -->
-    <!-- connectors that can carry HTTP semantics (HTTP, HTTPS, SPDY)-->
+    <!-- connectors that can carry HTTP semantics (HTTP, HTTPS, etc.)-->
     <!-- It configures the non wire protocol aspects of the HTTP     -->
     <!-- semantic.                                                   -->
     <!--                                                             -->
     <!-- This configuration is only defined here and is used by      -->
-    <!-- reference from the jetty-http.xml, jetty-https.xml and      -->
-    <!-- jetty-spdy.xml configuration files which instantiate the    -->
-    <!-- connectors.                                                 -->
+    <!-- reference from other XML files such as jetty-http.xml,      -->
+    <!-- jetty-https.xml and other configuration files which         -->
+    <!-- instantiate the connectors.                                 -->
     <!--                                                             -->
     <!-- Consult the javadoc of o.e.j.server.HttpConfiguration       -->
     <!-- for all configuration that may be set here.                 -->
     <!-- =========================================================== -->
     <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
-      <Set name="secureScheme">https</Set>
-      <Set name="securePort"><Property name="jetty.secure.port" default="8443" /></Set>
-      <Set name="outputBufferSize"><Property name="jetty.output.buffer.size" default="32768" /></Set>
-      <Set name="outputAggregationSize"><Property name="jetty.output.aggregation.size" default="8192" /></Set>
-      <Set name="requestHeaderSize"><Property name="jetty.request.header.size" default="8192" /></Set>
-      <Set name="responseHeaderSize"><Property name="jetty.response.header.size" default="8192" /></Set>
-      <Set name="sendServerVersion"><Property name="jetty.send.server.version" default="true" /></Set>
-      <Set name="sendDateHeader"><Property name="jetty.send.date.header" default="false" /></Set>
-      <Set name="headerCacheSize">512</Set>
-      <Set name="delayDispatchUntilContent"><Property name="jetty.delayDispatchUntilContent" default="false"/></Set>
+      <Set name="secureScheme"><Property name="jetty.httpConfig.secureScheme" default="https" /></Set>
+      <Set name="securePort"><Property name="jetty.httpConfig.securePort" deprecated="jetty.secure.port" default="8443" /></Set>
+      <Set name="outputBufferSize"><Property name="jetty.httpConfig.outputBufferSize" deprecated="jetty.output.buffer.size" default="32768" /></Set>
+      <Set name="outputAggregationSize"><Property name="jetty.httpConfig.outputAggregationSize" deprecated="jetty.output.aggregation.size" default="8192" /></Set>
+      <Set name="requestHeaderSize"><Property name="jetty.httpConfig.requestHeaderSize" deprecated="jetty.request.header.size" default="8192" /></Set>
+      <Set name="responseHeaderSize"><Property name="jetty.httpConfig.responseHeaderSize" deprecated="jetty.response.header.size" default="8192" /></Set>
+      <Set name="sendServerVersion"><Property name="jetty.httpConfig.sendServerVersion" deprecated="jetty.send.server.version" default="true" /></Set>
+      <Set name="sendDateHeader"><Property name="jetty.httpConfig.sendDateHeader" deprecated="jetty.send.date.header" default="false" /></Set>
+      <Set name="headerCacheSize"><Property name="jetty.httpConfig.headerCacheSize" default="512" /></Set>
+      <Set name="delayDispatchUntilContent"><Property name="jetty.httpConfig.delayDispatchUntilContent" deprecated="jetty.delayDispatchUntilContent" default="true"/></Set>
+      <Set name="maxErrorDispatches"><Property name="jetty.httpConfig.maxErrorDispatches" default="10"/></Set>
+      <Set name="blockingTimeout"><Property name="jetty.httpConfig.blockingTimeout" default="-1"/></Set>
       <!-- Uncomment to enable handling of X-Forwarded- style headers
       <Call name="addCustomizer">
         <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg>
@@ -94,7 +96,6 @@
       -->
     </New>
 
-
     <!-- =========================================================== -->
     <!-- Set the default handler structure for the Server            -->
     <!-- A handler collection is used to pass received requests to   -->
@@ -124,9 +125,9 @@
     <!-- =========================================================== -->
     <!-- extra server options                                        -->
     <!-- =========================================================== -->
-    <Set name="stopAtShutdown">true</Set>
+    <Set name="stopAtShutdown"><Property name="jetty.server.stopAtShutdown" default="true"/></Set>
     <Set name="stopTimeout">5000</Set>
-    <Set name="dumpAfterStart"><Property name="jetty.dump.start" default="false"/></Set>
-    <Set name="dumpBeforeStop"><Property name="jetty.dump.stop" default="false"/></Set>
+    <Set name="dumpAfterStart"><Property name="jetty.server.dumpAfterStart" deprecated="jetty.dump.start" default="false"/></Set>
+    <Set name="dumpBeforeStop"><Property name="jetty.server.dumpBeforeStop" deprecated="jetty.dump.stop" default="false"/></Set>
 
 </Configure>
diff --git a/jetty-server/src/main/config/etc/keystore b/jetty-server/src/main/config/etc/keystore
index 08f6cda..d6592f9 100644
--- a/jetty-server/src/main/config/etc/keystore
+++ b/jetty-server/src/main/config/etc/keystore
Binary files differ
diff --git a/jetty-server/src/main/config/modules/debug.mod b/jetty-server/src/main/config/modules/debug.mod
index f740ea2..0141699 100644
--- a/jetty-server/src/main/config/modules/debug.mod
+++ b/jetty-server/src/main/config/modules/debug.mod
@@ -3,7 +3,27 @@
 #
 
 [depend]
-server
+deploy
+
+[files]
+logs/
 
 [xml]
 etc/jetty-debug.xml
+
+[ini-template]
+
+## How many days to retain old log files
+# jetty.debug.retainDays=14
+
+## Timezone of the log entries
+# jetty.debug.timezone=GMT
+
+## Show Request/Response headers
+# jetty.debug.showHeaders=true
+
+## Rename threads while in context scope
+# jetty.debug.renameThread=false
+
+## Dump context as deployed
+# jetty.debug.dumpContext=true
diff --git a/jetty-server/src/main/config/modules/debuglog.mod b/jetty-server/src/main/config/modules/debuglog.mod
new file mode 100644
index 0000000..ba8b60a
--- /dev/null
+++ b/jetty-server/src/main/config/modules/debuglog.mod
@@ -0,0 +1,25 @@
+#
+# Debug module
+#
+
+[depend]
+server
+
+[files]
+logs/
+
+[xml]
+etc/jetty-debuglog.xml
+
+[ini-template]
+## Logging directory (relative to $jetty.base)
+# jetty.debuglog.dir=logs
+
+## Whether to append to existing file
+# jetty.debuglog.append=false
+
+## How many days to retain old log files
+# jetty.debuglog.retainDays=90
+
+## Timezone of the log entries
+# jetty.debuglog.timezone=GMT
diff --git a/jetty-server/src/main/config/modules/gzip.mod b/jetty-server/src/main/config/modules/gzip.mod
new file mode 100644
index 0000000..1efc834
--- /dev/null
+++ b/jetty-server/src/main/config/modules/gzip.mod
@@ -0,0 +1,23 @@
+#
+# GZIP module
+# Applies GzipHandler to entire server
+#
+
+[depend]
+server
+
+[xml]
+etc/jetty-gzip.xml
+
+[ini-template]
+## Minimum content length after which gzip is enabled
+# jetty.gzip.minGzipSize=2048
+
+## Check whether a file with *.gz extension exists
+# jetty.gzip.checkGzExists=false
+
+## Gzip compression level (-1 for default)
+# jetty.gzip.compressionLevel=-1
+
+## User agents for which gzip is disabled
+# jetty.gzip.excludedUserAgent=.*MSIE.6\.0.*
diff --git a/jetty-server/src/main/config/modules/http.mod b/jetty-server/src/main/config/modules/http.mod
index dc34bc3..01e9862 100644
--- a/jetty-server/src/main/config/modules/http.mod
+++ b/jetty-server/src/main/config/modules/http.mod
@@ -11,17 +11,26 @@
 [ini-template]
 ### HTTP Connector Configuration
 
-## HTTP port to listen on
-jetty.port=8080
+## Connector host/address to bind to
+# jetty.http.host=0.0.0.0
 
-## HTTP idle timeout in milliseconds
-http.timeout=30000
+## Connector port to listen on
+# jetty.http.port=8080
 
-## HTTP Socket.soLingerTime in seconds. (-1 to disable)
-# http.soLingerTime=-1
+## Connector idle timeout in milliseconds
+# jetty.http.idleTimeout=30000
 
-## Parameters to control the number and priority of acceptors and selectors
-# http.selectors=1
-# http.acceptors=1
-# http.selectorPriorityDelta=0
-# http.acceptorPriorityDelta=0
+## Connector socket linger time in seconds (-1 to disable)
+# jetty.http.soLingerTime=-1
+
+## Number of acceptors (-1 picks default based on number of cores)
+# jetty.http.acceptors=-1
+
+## Number of selectors (-1 picks default based on number of cores)
+# jetty.http.selectors=-1
+
+## ServerSocketChannel backlog (0 picks platform default)
+# jetty.http.acceptorQueueSize=0
+
+## Thread priority delta to give to acceptor threads
+# jetty.http.acceptorPriorityDelta=0
diff --git a/jetty-server/src/main/config/modules/https.mod b/jetty-server/src/main/config/modules/https.mod
index bd1b718..092e0d7 100644
--- a/jetty-server/src/main/config/modules/https.mod
+++ b/jetty-server/src/main/config/modules/https.mod
@@ -5,15 +5,9 @@
 [depend]
 ssl
 
+[optional]
+http2
+
 [xml]
 etc/jetty-https.xml
 
-[ini-template]
-## HTTPS Configuration
-# HTTP port to listen on
-https.port=8443
-# HTTPS idle timeout in milliseconds
-https.timeout=30000
-# HTTPS Socket.soLingerTime in seconds. (-1 to disable)
-# https.soLingerTime=-1
-
diff --git a/jetty-server/src/main/config/modules/jdbc-sessions.mod b/jetty-server/src/main/config/modules/jdbc-sessions.mod
new file mode 100644
index 0000000..d77ff04
--- /dev/null
+++ b/jetty-server/src/main/config/modules/jdbc-sessions.mod
@@ -0,0 +1,27 @@
+#
+# Jetty JDBC Session module
+#
+
+[depend]
+annotations
+webapp
+
+[xml]
+etc/jetty-jdbc-sessions.xml
+
+
+[ini-template]
+## JDBC Session config
+
+## Unique identifier for this node in the cluster
+# jetty.jdbcSession.workerName=node1
+
+## The interval in seconds between sweeps of the scavenger
+# jetty.jdbcSession.scavenge=600
+
+## Uncomment either the datasource name or driverClass and connectionURL
+# jetty.jdbcSession.datasource=sessions
+# jetty.jdbcSession.driverClass=changeme
+# jetty.jdbcSession.connectionURL=changeme
+
+
diff --git a/jetty-server/src/main/config/modules/lowresources.mod b/jetty-server/src/main/config/modules/lowresources.mod
index 99112d5..2f765d9 100644
--- a/jetty-server/src/main/config/modules/lowresources.mod
+++ b/jetty-server/src/main/config/modules/lowresources.mod
@@ -9,10 +9,20 @@
 etc/jetty-lowresources.xml
 
 [ini-template]
-## Low Resources Configuration
-# lowresources.period=1050
-# lowresources.lowResourcesIdleTimeout=200
-# lowresources.monitorThreads=true
-# lowresources.maxConnections=0
-# lowresources.maxMemory=0
-# lowresources.maxLowResourcesTime=5000
+## Scan period to look for low resources (in milliseconds)
+# jetty.lowresources.period=1000
+
+## The idle timeout to apply to low resources (in milliseconds)
+# jetty.lowresources.idleTimeout=1000
+
+## Whether to monitor ThreadPool threads for low resources
+# jetty.lowresources.monitorThreads=true
+
+## Max number of connections allowed before being in low resources mode
+# jetty.lowresources.maxConnections=0
+
+## Max memory allowed before being in low resources mode (in bytes)
+# jetty.lowresources.maxMemory=0
+
+## Max time a resource may stay in low resource mode before actions are taken (in milliseconds)
+# jetty.lowresources.maxLowResourcesTime=5000
diff --git a/jetty-server/src/main/config/modules/proxy-protocol-ssl.mod b/jetty-server/src/main/config/modules/proxy-protocol-ssl.mod
new file mode 100644
index 0000000..764d24b
--- /dev/null
+++ b/jetty-server/src/main/config/modules/proxy-protocol-ssl.mod
@@ -0,0 +1,9 @@
+#
+# PROXY Protocol Module - SSL
+#
+
+[depend]
+ssl
+
+[xml]
+etc/jetty-proxy-protocol-ssl.xml
diff --git a/jetty-server/src/main/config/modules/proxy-protocol.mod b/jetty-server/src/main/config/modules/proxy-protocol.mod
new file mode 100644
index 0000000..9df2700
--- /dev/null
+++ b/jetty-server/src/main/config/modules/proxy-protocol.mod
@@ -0,0 +1,9 @@
+#
+# PROXY Protocol Module - HTTP
+#
+
+[depend]
+http
+
+[xml]
+etc/jetty-proxy-protocol.xml
diff --git a/jetty-server/src/main/config/modules/requestlog.mod b/jetty-server/src/main/config/modules/requestlog.mod
index f5e0614..e27b246 100644
--- a/jetty-server/src/main/config/modules/requestlog.mod
+++ b/jetty-server/src/main/config/modules/requestlog.mod
@@ -12,19 +12,26 @@
 logs/
 
 [ini-template]
-## Request Log Configuration
-# Filename for Request Log output (relative to jetty.base)
-# requestlog.filename=/logs/yyyy_mm_dd.request.log
-# Date format for rollovered files (uses SimpleDateFormat syntax)
-# requestlog.filenameDateFormat=yyyy_MM_dd
-# How many days to retain the logs
-# requestlog.retain=90
-# If an existing log with the same name is found, just append to it
-# requestlog.append=true
-# Use the extended log output
-# requestlog.extended=true
-# Log http cookie information as well
-# requestlog.cookies=true
-# Set the log output timezone
-# requestlog.timezone=GMT
+## Logging directory (relative to $jetty.base)
+# jetty.requestlog.dir=logs
 
+## File path
+# jetty.requestlog.filePath=${jetty.requestlog.dir}/yyyy_mm_dd.request.log
+
+## Date format for rollovered files (uses SimpleDateFormat syntax)
+# jetty.requestlog.filenameDateFormat=yyyy_MM_dd
+
+## How many days to retain old log files
+# jetty.requestlog.retainDays=90
+
+## Whether to append to existing file
+# jetty.requestlog.append=true
+
+## Whether to use the extended log output
+# jetty.requestlog.extended=true
+
+## Whether to log http cookie information
+# jetty.requestlog.cookies=true
+
+## Timezone of the log entries
+# jetty.requestlog.timezone=GMT
diff --git a/jetty-server/src/main/config/modules/server.mod b/jetty-server/src/main/config/modules/server.mod
index b3f87de..14d6b58 100644
--- a/jetty-server/src/main/config/modules/server.mod
+++ b/jetty-server/src/main/config/modules/server.mod
@@ -20,30 +20,60 @@
 etc/jetty.xml
 
 [ini-template]
-##
-## Server Threading Configuration
-##
-# minimum number of threads
-threads.min=10
-# maximum number of threads
-threads.max=200
-# thread idle timeout in milliseconds
-threads.timeout=60000
-# buffer size for output
-jetty.output.buffer.size=32768
-# request header buffer size
-jetty.request.header.size=8192
-# response header buffer size
-jetty.response.header.size=8192
-# should jetty send the server version header?
-jetty.send.server.version=true
-# should jetty send the date header?
-jetty.send.date.header=false
-# What host to listen on (leave commented to listen on all interfaces)
-#jetty.host=myhost.com
-# Dump the state of the Jetty server, components, and webapps after startup
-jetty.dump.start=false
-# Dump the state of the Jetty server, before stop
-jetty.dump.stop=false
-# Enable delayed dispatch optimisation
-jetty.delayDispatchUntilContent=false
+### ThreadPool configuration
+## Minimum number of threads
+# jetty.threadPool.minThreads=10
+
+## Maximum number of threads
+# jetty.threadPool.maxThreads=200
+
+## Thread idle timeout (in milliseconds)
+# jetty.threadPool.idleTimeout=60000
+
+### Common HTTP configuration
+## Scheme to use to build URIs for secure redirects
+# jetty.httpConfig.secureScheme=https
+
+## Port to use to build URIs for secure redirects
+# jetty.httpConfig.securePort=8443
+
+## Response content buffer size (in bytes)
+# jetty.httpConfig.outputBufferSize=32768
+
+## Max response content write length that is buffered (in bytes)
+# jetty.httpConfig.outputAggregationSize=8192
+
+## Max request headers size (in bytes)
+# jetty.httpConfig.requestHeaderSize=8192
+
+## Max response headers size (in bytes)
+# jetty.httpConfig.responseHeaderSize=8192
+
+## Whether to send the Server: header
+# jetty.httpConfig.sendServerVersion=true
+
+## Whether to send the Date: header
+# jetty.httpConfig.sendDateHeader=false
+
+## Max per-connection header cache size (in nodes)
+# jetty.httpConfig.headerCacheSize=512
+
+## Whether, for requests with content, delay dispatch until some content has arrived
+# jetty.httpConfig.delayDispatchUntilContent=true
+
+## Maximum number of error dispatches to prevent looping
+# jetty.httpConfig.maxErrorDispatches=10
+
+## Maximum time to block in total for a blocking IO operation (default -1 is to use idleTimeout on progress)
+# jetty.httpConfig.blockingTimeout=-1
+
+### Server configuration
+## Whether ctrl+c on the console gracefully stops the Jetty server
+# jetty.server.stopAtShutdown=true
+
+## Dump the state of the Jetty server, components, and webapps after startup
+# jetty.server.dumpAfterStart=false
+
+## Dump the state of the Jetty server, components, and webapps before shutdown
+# jetty.server.dumpBeforeStop=false
+
diff --git a/jetty-server/src/main/config/modules/ssl.mod b/jetty-server/src/main/config/modules/ssl.mod
index ef47192..292780a 100644
--- a/jetty-server/src/main/config/modules/ssl.mod
+++ b/jetty-server/src/main/config/modules/ssl.mod
@@ -2,39 +2,82 @@
 # SSL Keystore module
 #
 
+[name]
+ssl
+
 [depend]
 server
 
 [xml]
 etc/jetty-ssl.xml
+etc/jetty-ssl-context.xml
 
 [files]
-http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/plain/jetty-server/src/main/config/etc/keystore|etc/keystore
+http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/plain/jetty-server/src/test/config/etc/keystore?id=${jetty.tag.version}|etc/keystore
 
 [ini-template]
-### SSL Keystore Configuration
-# define the port to use for secure redirection
-jetty.secure.port=8443
+### TLS(SSL) Connector Configuration
 
-## Setup a demonstration keystore and truststore
-jetty.keystore=etc/keystore
-jetty.truststore=etc/keystore
+## Connector host/address to bind to
+# jetty.ssl.host=0.0.0.0
 
-## Set the demonstration passwords.
+## Connector port to listen on
+# jetty.ssl.port=8443
+
+## Connector idle timeout in milliseconds
+# jetty.ssl.idleTimeout=30000
+
+## Connector socket linger time in seconds (-1 to disable)
+# jetty.ssl.soLingerTime=-1
+
+## Number of acceptors (-1 picks default based on number of cores)
+# jetty.ssl.acceptors=-1
+
+## Number of selectors (-1 picks default based on number of cores)
+# jetty.ssl.selectors=-1
+
+## ServerSocketChannel backlog (0 picks platform default)
+# jetty.ssl.acceptorQueueSize=0
+
+## Thread priority delta to give to acceptor threads
+# jetty.ssl.acceptorPriorityDelta=0
+
+## Whether request host names are checked to match any SNI names
+# jetty.ssl.sniHostCheck=true
+
+### SslContextFactory Configuration
 ## Note that OBF passwords are not secure, just protected from casual observation
 ## See http://www.eclipse.org/jetty/documentation/current/configuring-security-secure-passwords.html
-jetty.keystore.password=OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
-jetty.keymanager.password=OBF:1u2u1wml1z7s1z7a1wnl1u2g
-jetty.truststore.password=OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
 
-### Set the client auth behavior
-## Set to true if client certificate authentication is required
-# jetty.ssl.needClientAuth=true
-## Set to true if client certificate authentication is desired
-# jetty.ssl.wantClientAuth=true
+## Keystore file path (relative to $jetty.base)
+# jetty.sslContext.keyStorePath=etc/keystore
 
-## Parameters to control the number and priority of acceptors and selectors
-# ssl.selectors=1
-# ssl.acceptors=1
-# ssl.selectorPriorityDelta=0
-# ssl.acceptorPriorityDelta=0
+## Truststore file path (relative to $jetty.base)
+# jetty.sslContext.trustStorePath=etc/keystore
+
+## Keystore password
+# jetty.sslContext.keyStorePassword=OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
+
+## Keystore type and provider
+# jetty.sslContext.keyStoreType=JKS
+# jetty.sslContext.keyStoreProvider=
+
+## KeyManager password
+# jetty.sslContext.keyManagerPassword=OBF:1u2u1wml1z7s1z7a1wnl1u2g
+
+## Truststore password
+# jetty.sslContext.trustStorePassword=OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
+
+## Truststore type and provider
+# jetty.sslContext.trustStoreType=JKS
+# jetty.sslContext.trustStoreProvider=
+
+## whether client certificate authentication is required
+# jetty.sslContext.needClientAuth=false
+
+## Whether client certificate authentication is desired
+# jetty.sslContext.wantClientAuth=false
+
+## Whether cipher order is significant (since java 8 only)
+# jetty.sslContext.useCipherSuitesOrder=true
+
diff --git a/jetty-server/src/main/config/modules/xinetd.mod b/jetty-server/src/main/config/modules/xinetd.mod
deleted file mode 100644
index e53618e..0000000
--- a/jetty-server/src/main/config/modules/xinetd.mod
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Xinetd module
-#
-
-[depend]
-server
-
-[xml]
-etc/jetty-xinetd.xml
-
-[ini-template]
-## Xinetd Configuration
-## See ${jetty.home}/etc/jetty-xinetd.xml for example service entry
-jetty.xinetd.idleTimeout=300000
-jetty.xinetd.acceptors=2
-jetty.xinetd.statsOn=false
-
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnectionFactory.java b/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnectionFactory.java
index 50a6926..04623fa 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnectionFactory.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnectionFactory.java
@@ -18,6 +18,10 @@
 
 package org.eclipse.jetty.server;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
 import org.eclipse.jetty.io.AbstractConnection;
 import org.eclipse.jetty.io.Connection;
 import org.eclipse.jetty.io.EndPoint;
@@ -25,14 +29,35 @@
 import org.eclipse.jetty.util.component.ContainerLifeCycle;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
 
+
+/* ------------------------------------------------------------ */
+/**
+ * Abstract ConnectionFactory
+ * <p>Provides the common handling for {@link ConnectionFactory} implementations including:<ul>
+ * <li>Protocol identification
+ * <li>Configuration of new Connections:<ul>
+ *     <li>Setting inputbuffer size
+ *     <li>Calling {@link Connection#addListener(Connection.Listener)} for all 
+ *     Connection.Listener instances found as beans on the {@link Connector} and this {@link ConnectionFactory}
+ * </ul>
+ * </ul>
+ */
 public abstract class AbstractConnectionFactory extends ContainerLifeCycle implements ConnectionFactory
 {
     private final String _protocol;
+    private final List<String> _protocols;
     private int _inputbufferSize = 8192;
 
     protected AbstractConnectionFactory(String protocol)
     {
         _protocol=protocol;
+        _protocols=Collections.unmodifiableList(Arrays.asList(new String[]{protocol}));
+    }
+    
+    protected AbstractConnectionFactory(String... protocols)
+    {
+        _protocol=protocols[0];
+        _protocols=Collections.unmodifiableList(Arrays.asList(protocols));
     }
 
     @Override
@@ -41,6 +66,12 @@
         return _protocol;
     }
 
+    @Override
+    public List<String> getProtocols()
+    {
+        return _protocols;
+    }
+
     public int getInputBufferSize()
     {
         return _inputbufferSize;
@@ -55,19 +86,24 @@
     {
         connection.setInputBufferSize(getInputBufferSize());
 
+        // Add Connection.Listeners from Connector
         if (connector instanceof ContainerLifeCycle)
         {
             ContainerLifeCycle aggregate = (ContainerLifeCycle)connector;
             for (Connection.Listener listener : aggregate.getBeans(Connection.Listener.class))
                 connection.addListener(listener);
         }
+        // Add Connection.Listeners from this factory
+        for (Connection.Listener listener : getBeans(Connection.Listener.class))
+            connection.addListener(listener);
+        
         return connection;
     }
 
     @Override
     public String toString()
     {
-        return String.format("%s@%x{%s}",this.getClass().getSimpleName(),hashCode(),getProtocol());
+        return String.format("%s@%x%s",this.getClass().getSimpleName(),hashCode(),getProtocols());
     }
 
     public static ConnectionFactory[] getFactories(SslContextFactory sslContextFactory, ConnectionFactory... factories)
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java
index 97d2df3..bfd8206 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java
@@ -19,12 +19,14 @@
 package org.eclipse.jetty.server;
 
 import java.io.IOException;
+import java.net.Socket;
+import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -36,19 +38,22 @@
 import org.eclipse.jetty.io.ArrayByteBufferPool;
 import org.eclipse.jetty.io.ByteBufferPool;
 import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.ssl.SslConnection;
 import org.eclipse.jetty.util.FutureCallback;
+import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.annotation.ManagedAttribute;
 import org.eclipse.jetty.util.annotation.ManagedObject;
 import org.eclipse.jetty.util.component.ContainerLifeCycle;
 import org.eclipse.jetty.util.component.Dumpable;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
 import org.eclipse.jetty.util.thread.ScheduledExecutorScheduler;
 import org.eclipse.jetty.util.thread.Scheduler;
 
 /**
  * <p>An abstract implementation of {@link Connector} that provides a {@link ConnectionFactory} mechanism
- * for creating {@link Connection} instances for various protocols (HTTP, SSL, SPDY, etc).</p>
+ * for creating {@link org.eclipse.jetty.io.Connection} instances for various protocols (HTTP, SSL, etc).</p>
  *
  * <h2>Connector Services</h2>
  * The abstract connector manages the dependent services needed by all specific connector instances:
@@ -69,12 +74,12 @@
  *
  * <h2>Connection Factories</h2>
  * The connector keeps a collection of {@link ConnectionFactory} instances, each of which are known by their
- * protocol name.  The protocol name may be a real protocol (eg http/1.1 or spdy/3) or it may be a private name
+ * protocol name.  The protocol name may be a real protocol (e.g. "http/1.1" or "h2") or it may be a private name
  * that represents a special connection factory. For example, the name "SSL-http/1.1" is used for
  * an {@link SslConnectionFactory} that has been instantiated with the {@link HttpConnectionFactory} as it's
  * next protocol.
  *
- * <h4>Configuring Connection Factories</h4>
+ * <h2>Configuring Connection Factories</h2>
  * The collection of available {@link ConnectionFactory} may be constructor injected or modified with the
  * methods {@link #addConnectionFactory(ConnectionFactory)}, {@link #removeConnectionFactory(String)} and
  * {@link #setConnectionFactories(Collection)}.  Only a single {@link ConnectionFactory} instance may be configured
@@ -86,48 +91,47 @@
  * <p>
  * Each Connection factory type is responsible for the configuration of the protocols that it accepts. Thus to
  * configure the HTTP protocol, you pass a {@link HttpConfiguration} instance to the {@link HttpConnectionFactory}
- * (or the SPDY factories that can also provide HTTP Semantics).  Similarly the {@link SslConnectionFactory} is
+ * (or other factories that can also provide HTTP Semantics).  Similarly the {@link SslConnectionFactory} is
  * configured by passing it a {@link SslContextFactory} and a next protocol name.
  *
- * <h4>Connection Factory Operation</h4>
- * {@link ConnectionFactory}s may simply create a {@link Connection} instance to support a specific
+ * <h2>Connection Factory Operation</h2>
+ * {@link ConnectionFactory}s may simply create a {@link org.eclipse.jetty.io.Connection} instance to support a specific
  * protocol.  For example, the {@link HttpConnectionFactory} will create a {@link HttpConnection} instance
  * that can handle http/1.1, http/1.0 and http/0.9.
  * <p>
- * {@link ConnectionFactory}s may also create a chain of {@link Connection} instances, using other {@link ConnectionFactory} instances.
+ * {@link ConnectionFactory}s may also create a chain of {@link org.eclipse.jetty.io.Connection} instances, using other {@link ConnectionFactory} instances.
  * For example, the {@link SslConnectionFactory} is configured with a next protocol name, so that once it has accepted
  * a connection and created an {@link SslConnection}, it then used the next {@link ConnectionFactory} from the
- * connector using the {@link #getConnectionFactory(String)} method, to create a {@link Connection} instance that
- * will handle the unecrypted bytes from the {@link SslConnection}.   If the next protocol is "http/1.1", then the
+ * connector using the {@link #getConnectionFactory(String)} method, to create a {@link org.eclipse.jetty.io.Connection} instance that
+ * will handle the unencrypted bytes from the {@link SslConnection}.   If the next protocol is "http/1.1", then the
  * {@link SslConnectionFactory} will have a protocol name of "SSL-http/1.1" and lookup "http/1.1" for the protocol
  * to run over the SSL connection.
  * <p>
- * {@link ConnectionFactory}s may also create temporary {@link Connection} instances that will exchange bytes
- * over the connection to determine what is the next protocol to use.  For example the NPN protocol is an extension
- * of SSL to allow a protocol to be specified during the SSL handshake. NPN is used by the SPDY protocol to
- * negotiate the version of SPDY or HTTP that the client and server will speak.  Thus to accept a SPDY connection, the
- * connector will be configured with {@link ConnectionFactory}s for "SSL-NPN", "NPN", "spdy/3", "spdy/2", "http/1.1"
- * with the default protocol being "SSL-NPN".  Thus a newly accepted connection uses "SSL-NPN", which specifies a
- * SSLConnectionFactory with "NPN" as the next protocol.  Thus an SslConnection instance is created chained to an NPNConnection
- * instance.  The NPN connection then negotiates with the client to determined the next protocol, which could be
- * "spdy/3", "spdy/2" or the default of "http/1.1".  Once the next protocol is determined, the NPN connection
- * calls {@link #getConnectionFactory(String)} to create a connection instance that will replace the NPN connection as
- * the connection chained to the SSLConnection.
- * <p>
+ * {@link ConnectionFactory}s may also create temporary {@link org.eclipse.jetty.io.Connection} instances that will exchange bytes
+ * over the connection to determine what is the next protocol to use.  For example the ALPN protocol is an extension
+ * of SSL to allow a protocol to be specified during the SSL handshake. ALPN is used by the HTTP/2 protocol to
+ * negotiate the protocol that the client and server will speak.  Thus to accept a HTTP/2 connection, the
+ * connector will be configured with {@link ConnectionFactory}s for "SSL-ALPN", "h2", "http/1.1"
+ * with the default protocol being "SSL-ALPN".  Thus a newly accepted connection uses "SSL-ALPN", which specifies a
+ * SSLConnectionFactory with "ALPN" as the next protocol.  Thus an SSL connection instance is created chained to an ALPN
+ * connection instance.  The ALPN connection then negotiates with the client to determined the next protocol, which
+ * could be "h2" or the default of "http/1.1".  Once the next protocol is determined, the ALPN connection
+ * calls {@link #getConnectionFactory(String)} to create a connection instance that will replace the ALPN connection as
+ * the connection chained to the SSL connection.
  * <h2>Acceptors</h2>
  * The connector will execute a number of acceptor tasks to the {@link Exception} service passed to the constructor.
  * The acceptor tasks run in a loop while the connector is running and repeatedly call the abstract {@link #accept(int)} method.
  * The implementation of the accept method must:
- * <nl>
- * <li>block waiting for new connections
- * <li>accept the connection (eg socket accept)
- * <li>perform any configuration of the connection (eg. socket linger times)
+ * <ol>
+ * <li>block waiting for new connections</li>
+ * <li>accept the connection (eg socket accept)</li>
+ * <li>perform any configuration of the connection (eg. socket linger times)</li>
  * <li>call the {@link #getDefaultConnectionFactory()} {@link ConnectionFactory#newConnection(Connector, org.eclipse.jetty.io.EndPoint)}
- * method to create a new Connection instance.
- * </nl>
+ * method to create a new Connection instance.</li>
+ * </ol>
  * The default number of acceptor tasks is the minimum of 1 and half the number of available CPUs. Having more acceptors may reduce
  * the latency for servers that see a high rate of new connections (eg HTTP/1.0 without keep-alive).  Typically the default is
- * sufficient for modern persistent protocols (HTTP/1.1, SPDY etc.)
+ * sufficient for modern persistent protocols (HTTP/1.1, HTTP/2 etc.)
  */
 @ManagedObject("Abstract implementation of the Connector Interface")
 public abstract class AbstractConnector extends ContainerLifeCycle implements Connector, Dumpable
@@ -140,7 +144,7 @@
     private final Scheduler _scheduler;
     private final ByteBufferPool _byteBufferPool;
     private final Thread[] _acceptors;
-    private final Set<EndPoint> _endpoints = Collections.newSetFromMap(new ConcurrentHashMap<EndPoint, Boolean>());
+    private final Set<EndPoint> _endpoints = Collections.newSetFromMap(new ConcurrentHashMap<>());
     private final Set<EndPoint> _immutableEndPoints = Collections.unmodifiableSet(_endpoints);
     private volatile CountDownLatch _stopping;
     private long _idleTimeout = 30000;
@@ -187,7 +191,7 @@
 
         int cores = Runtime.getRuntime().availableProcessors();
         if (acceptors < 0)
-            acceptors=Math.max(1, Math.min(4,cores/8));        
+            acceptors=Math.max(1, Math.min(4,cores/8));
         if (acceptors > cores)
             LOG.warn("Acceptors should be <= availableProcessors: " + this);
         _acceptors = new Thread[acceptors];
@@ -299,7 +303,7 @@
         _stopping=null;
 
         super.doStop();
-        
+
         for (Acceptor a : getBeans(Acceptor.class))
             removeBean(a);
 
@@ -338,7 +342,7 @@
     {
         synchronized (_factories)
         {
-            return _factories.get(protocol.toLowerCase(Locale.ENGLISH));
+            return _factories.get(StringUtil.asciiToLowerCase(protocol));
         }
     }
 
@@ -358,13 +362,73 @@
     {
         synchronized (_factories)
         {
-            ConnectionFactory old=_factories.remove(factory.getProtocol());
-            if (old!=null)
+            Set<ConnectionFactory> to_remove = new HashSet<>();
+            for (String key:factory.getProtocols())
+            {
+                key=StringUtil.asciiToLowerCase(key);
+                ConnectionFactory old=_factories.remove(key);
+                if (old!=null)
+                {
+                    if (old.getProtocol().equals(_defaultProtocol))
+                        _defaultProtocol=null;
+                    to_remove.add(old);
+                }
+                _factories.put(key, factory);
+            }
+
+            // keep factories still referenced
+            for (ConnectionFactory f : _factories.values())
+                to_remove.remove(f);
+
+            // remove old factories
+            for (ConnectionFactory old: to_remove)
+            {
                 removeBean(old);
-            _factories.put(factory.getProtocol().toLowerCase(Locale.ENGLISH), factory);
+                if (LOG.isDebugEnabled())
+                    LOG.debug("{} removed {}", this, old);
+            }
+
+            // add new Bean
             addBean(factory);
             if (_defaultProtocol==null)
                 _defaultProtocol=factory.getProtocol();
+            if (LOG.isDebugEnabled())
+                LOG.debug("{} added {}", this, factory);
+        }
+    }
+
+    public void addFirstConnectionFactory(ConnectionFactory factory)
+    {
+        synchronized (_factories)
+        {
+            List<ConnectionFactory> existings = new ArrayList<>(_factories.values());
+            _factories.clear();
+            addConnectionFactory(factory);
+            for (ConnectionFactory existing : existings)
+                addConnectionFactory(existing);
+            _defaultProtocol = factory.getProtocol();
+        }
+    }
+
+    public void addIfAbsentConnectionFactory(ConnectionFactory factory)
+    {
+        synchronized (_factories)
+        {
+            String key=StringUtil.asciiToLowerCase(factory.getProtocol());
+            if (_factories.containsKey(key))
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("{} addIfAbsent ignored {}", this, factory);
+            }
+            else
+            {
+                _factories.put(key, factory);
+                addBean(factory);
+                if (_defaultProtocol==null)
+                    _defaultProtocol=factory.getProtocol();
+                if (LOG.isDebugEnabled())
+                    LOG.debug("{} addIfAbsent added {}", this, factory);
+            }
         }
     }
 
@@ -372,7 +436,7 @@
     {
         synchronized (_factories)
         {
-            ConnectionFactory factory= _factories.remove(protocol.toLowerCase(Locale.ENGLISH));
+            ConnectionFactory factory= _factories.remove(StringUtil.asciiToLowerCase(protocol));
             removeBean(factory);
             return factory;
         }
@@ -409,10 +473,10 @@
     /* ------------------------------------------------------------ */
     /** Set the acceptor thread priority delta.
      * <p>This allows the acceptor thread to run at a different priority.
-     * Typically this would be used to lower the priority to give preference 
-     * to handling previously accepted connections rather than accepting 
+     * Typically this would be used to lower the priority to give preference
+     * to handling previously accepted connections rather than accepting
      * new connections</p>
-     * @param acceptorPriorityDelta
+     * @param acceptorPriorityDelta the acceptor priority delta
      */
     public void setAcceptorPriorityDelta(int acceptorPriorityDelta)
     {
@@ -451,7 +515,7 @@
 
     public void setDefaultProtocol(String defaultProtocol)
     {
-        _defaultProtocol = defaultProtocol.toLowerCase(Locale.ENGLISH);
+        _defaultProtocol = StringUtil.asciiToLowerCase(defaultProtocol);
         if (isRunning())
             _defaultConnectionFactory=getConnectionFactory(_defaultProtocol);
     }
@@ -466,12 +530,12 @@
 
     private class Acceptor implements Runnable
     {
-        private final int _acceptor;
+        private final int _id;
         private String _name;
 
         private Acceptor(int id)
         {
-            _acceptor = id;
+            _id = id;
         }
 
         @Override
@@ -479,16 +543,16 @@
         {
             final Thread thread = Thread.currentThread();
             String name=thread.getName();
-            _name=String.format("%s-acceptor-%d@%x-%s",name,_acceptor,hashCode(),AbstractConnector.this.toString());
+            _name=String.format("%s-acceptor-%d@%x-%s",name,_id,hashCode(),AbstractConnector.this.toString());
             thread.setName(_name);
-            
+
             int priority=thread.getPriority();
             if (_acceptorPriorityDelta!=0)
                 thread.setPriority(Math.max(Thread.MIN_PRIORITY,Math.min(Thread.MAX_PRIORITY,priority+_acceptorPriorityDelta)));
 
             synchronized (AbstractConnector.this)
             {
-                _acceptors[_acceptor] = thread;
+                _acceptors[_id] = thread;
             }
 
             try
@@ -497,7 +561,7 @@
                 {
                     try
                     {
-                        accept(_acceptor);
+                        accept(_id);
                     }
                     catch (Throwable e)
                     {
@@ -516,23 +580,23 @@
 
                 synchronized (AbstractConnector.this)
                 {
-                    _acceptors[_acceptor] = null;
+                    _acceptors[_id] = null;
                 }
                 CountDownLatch stopping=_stopping;
                 if (stopping!=null)
                     stopping.countDown();
             }
         }
-        
+
         @Override
         public String toString()
         {
             String name=_name;
             if (name==null)
-                return String.format("acceptor-%d@%x", _acceptor, hashCode());
+                return String.format("acceptor-%d@%x", _id, hashCode());
             return name;
         }
-        
+
     }
 
 
@@ -585,7 +649,7 @@
     {
         return _name;
     }
-    
+
     /* ------------------------------------------------------------ */
     /**
      * Set a connector name.   A context may be configured with
@@ -597,13 +661,13 @@
     {
         _name=name;
     }
-    
+
     @Override
     public String toString()
     {
-        return String.format("%s@%x{%s}",
+        return String.format("%s@%x{%s,%s}",
                 _name==null?getClass().getSimpleName():_name,
                 hashCode(),
-                getDefaultProtocol());
+                getDefaultProtocol(),getProtocols());
     }
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractNCSARequestLog.java b/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractNCSARequestLog.java
index a9ac0d6..ab46bd5 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractNCSARequestLog.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractNCSARequestLog.java
@@ -25,6 +25,7 @@
 
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.PathMap;
+import org.eclipse.jetty.server.handler.StatisticsHandler;
 import org.eclipse.jetty.util.DateCache;
 import org.eclipse.jetty.util.annotation.ManagedAttribute;
 import org.eclipse.jetty.util.component.AbstractLifeCycle;
@@ -67,6 +68,7 @@
 
     /**
      * Is logging enabled
+     * @return true if logging is enabled
      */
     protected abstract boolean isEnabled();
     
@@ -74,22 +76,34 @@
 
     /**
      * Write requestEntry out. (to disk or slf4j log)
+     * @param requestEntry the request entry
+     * @throws IOException if unable to write the entry
      */
     public abstract void write(String requestEntry) throws IOException;
 
     /* ------------------------------------------------------------ */
-
+    
+    private void append(StringBuilder buf,String s)
+    {
+        if (s==null || s.length()==0)
+            buf.append('-');
+        else
+            buf.append(s);
+    }
+    
     /**
      * Writes the request and response information to the output stream.
      *
-     * @see org.eclipse.jetty.server.RequestLog#log(org.eclipse.jetty.server.Request,
-     *      org.eclipse.jetty.server.Response)
+     * @see org.eclipse.jetty.server.RequestLog#log(Request, Response)
      */
     @Override
     public void log(Request request, Response response)
     {
         try
         {
+            int status = response.getCommittedMetaData().getStatus();
+            long written = response.getHttpChannel().getBytesWritten();
+            
             if (_ignorePathMap != null && _ignorePathMap.getMatch(request.getRequestURI()) != null)
                 return;
 
@@ -101,7 +115,7 @@
 
             if (_logServer)
             {
-                buf.append(request.getServerName());
+                append(buf,request.getServerName());
                 buf.append(' ');
             }
 
@@ -117,10 +131,7 @@
             buf.append(addr);
             buf.append(" - ");
             Authentication authentication = request.getAuthentication();
-            if (authentication instanceof Authentication.User)
-                buf.append(((Authentication.User)authentication).getUserIdentity().getUserPrincipal().getName());
-            else
-                buf.append("-");
+            append(buf,(authentication instanceof Authentication.User)?((Authentication.User)authentication).getUserIdentity().getUserPrincipal().getName():null);
 
             buf.append(" [");
             if (_logDateCache != null)
@@ -129,37 +140,38 @@
                 buf.append(request.getTimeStamp());
 
             buf.append("] \"");
-            buf.append(request.getMethod());
+            append(buf,request.getMethod());
             buf.append(' ');
-            buf.append(request.getUri().toString());
+            append(buf,request.getHttpURI().toString());
             buf.append(' ');
-            buf.append(request.getProtocol());
+            append(buf,request.getProtocol());
             buf.append("\" ");
 
-            int status = response.getStatus();
-            if (status <= 0)
-                status = 404;
-            buf.append((char)('0' + ((status / 100) % 10)));
-            buf.append((char)('0' + ((status / 10) % 10)));
-            buf.append((char)('0' + (status % 10)));
+            if (status >=0)
+            {
+                buf.append((char)('0' + ((status / 100) % 10)));
+                buf.append((char)('0' + ((status / 10) % 10)));
+                buf.append((char)('0' + (status % 10)));
+            }
+            else
+                buf.append(status);
 
-            long responseLength = response.getLongContentLength();
-            if (responseLength >= 0)
+            if (written >= 0)
             {
                 buf.append(' ');
-                if (responseLength > 99999)
-                    buf.append(responseLength);
+                if (written > 99999)
+                    buf.append(written);
                 else
                 {
-                    if (responseLength > 9999)
-                        buf.append((char)('0' + ((responseLength / 10000) % 10)));
-                    if (responseLength > 999)
-                        buf.append((char)('0' + ((responseLength / 1000) % 10)));
-                    if (responseLength > 99)
-                        buf.append((char)('0' + ((responseLength / 100) % 10)));
-                    if (responseLength > 9)
-                        buf.append((char)('0' + ((responseLength / 10) % 10)));
-                    buf.append((char)('0' + (responseLength) % 10));
+                    if (written > 9999)
+                        buf.append((char)('0' + ((written / 10000) % 10)));
+                    if (written > 999)
+                        buf.append((char)('0' + ((written / 1000) % 10)));
+                    if (written > 99)
+                        buf.append((char)('0' + ((written / 100) % 10)));
+                    if (written > 9)
+                        buf.append((char)('0' + ((written / 10) % 10)));
+                    buf.append((char)('0' + (written) % 10));
                 }
                 buf.append(' ');
             }
@@ -168,7 +180,7 @@
 
 
             if (_extended)
-                logExtended(request, response, buf);
+                logExtended(request, buf);
 
             if (_logCookies)
             {
@@ -216,12 +228,10 @@
      * Writes extended request and response information to the output stream.
      *
      * @param request  request object
-     * @param response response object
      * @param b        StringBuilder to write to
-     * @throws IOException
+     * @throws IOException if unable to log the extended information
      */
     protected void logExtended(Request request,
-                               Response response,
                                StringBuilder b) throws IOException
     {
         String referer = request.getHeader(HttpHeader.REFERER.toString());
@@ -329,15 +339,19 @@
     }
 
     /**
+     * @param value true to log dispatch
      * @deprecated use {@link StatisticsHandler}
      */
+    @Deprecated
     public void setLogDispatch(boolean value)
     {
     }
 
     /**
+     * @return true if logging dispatches
      * @deprecated use {@link StatisticsHandler}
      */
+    @Deprecated
     public boolean isLogDispatch()
     {
         return false;
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncContextEvent.java b/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncContextEvent.java
index d2ec0e0..ee30187 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncContextEvent.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncContextEvent.java
@@ -77,7 +77,7 @@
     {
         return _context;
     }
-    
+
     public Context getContext()
     {
         return _context;
@@ -100,12 +100,12 @@
     {
         return _dispatchPath;
     }
-    
+
     public void setTimeoutTask(Scheduler.Task task)
     {
         _timeoutTask = task;
     }
-    
+
     public void cancelTimeoutTask()
     {
         Scheduler.Task task=_timeoutTask;
@@ -119,28 +119,28 @@
     {
         return _asyncContext;
     }
-    
+
     @Override
     public Throwable getThrowable()
     {
         return _throwable;
     }
-    
-    public void setThrowable(Throwable throwable)
-    {
-        _throwable=throwable;
-    }
+
+//    public void setThrowable(Throwable throwable)
+//    {
+//        _throwable=throwable;
+//    }
 
     public void setDispatchContext(ServletContext context)
     {
         _dispatchContext=context;
     }
-    
+
     public void setDispatchPath(String path)
     {
         _dispatchPath=path;
     }
-    
+
     public void completed()
     {
         _timeoutTask=null;
@@ -158,7 +158,15 @@
         Scheduler.Task task=_timeoutTask;
         _timeoutTask=null;
         if (task!=null)
-            _state.expired();
+            _state.onTimeout();
+    }
+
+    public void addThrowable(Throwable e)
+    {
+        if (_throwable==null)
+            _throwable=e;
+        else
+            _throwable.addSuppressed(e);
     }
 
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncContextState.java b/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncContextState.java
index b8b4eeb..66e2825 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncContextState.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncContextState.java
@@ -33,11 +33,18 @@
 
 public class AsyncContextState implements AsyncContext
 {
+    private final HttpChannel _channel;
     volatile HttpChannelState _state;
 
     public AsyncContextState(HttpChannelState state)
     {
         _state=state;
+        _channel=_state.getHttpChannel();
+    }
+    
+    public HttpChannel getHttpChannel()
+    {
+        return _channel;
     }
     
     HttpChannelState state()
@@ -68,7 +75,7 @@
             @Override
             public void onError(AsyncEvent event) throws IOException
             {
-                listener.onComplete(new AsyncEvent(event.getAsyncContext(),request,response,event.getThrowable()));
+                listener.onError(new AsyncEvent(event.getAsyncContext(),request,response,event.getThrowable()));
             }
             
             @Override
@@ -147,7 +154,7 @@
     @Override
     public boolean hasOriginalRequestAndResponse()
     {
-        HttpChannel<?> channel=state().getHttpChannel();
+        HttpChannel channel=state().getHttpChannel();
         return channel.getRequest()==getRequest() && channel.getResponse()==getResponse();
     }
 
@@ -160,12 +167,13 @@
     @Override
     public void start(final Runnable task)
     {
-        state().getHttpChannel().execute(new Runnable()
+        final HttpChannel channel = state().getHttpChannel();
+        channel.execute(new Runnable()
         {
             @Override
             public void run()
             {
-                state().getAsyncContextEvent().getContext().getContextHandler().handle(task);
+                state().getAsyncContextEvent().getContext().getContextHandler().handle(channel.getRequest(),task);
             }
         });
     }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Authentication.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Authentication.java
index 66133eb..426a463 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/Authentication.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Authentication.java
@@ -24,14 +24,12 @@
 import javax.servlet.http.HttpServletResponse;
 
 
-/* ------------------------------------------------------------ */
 /** The Authentication state of a request.
  * <p>
  * The Authentication state can be one of several sub-types that
  * reflects where the request is in the many different authentication
  * cycles. Authentication might not yet be checked or it might be checked
  * and failed, checked and deferred or succeeded. 
- * 
  */
 public interface Authentication
 {
@@ -75,6 +73,7 @@
         /** Authenticate if possible without sending a challenge.
          * This is used to check credentials that have been sent for 
          * non-manditory authentication.
+         * @param request the request
          * @return The new Authentication state.
          */
         Authentication authenticate(ServletRequest request);
@@ -83,6 +82,8 @@
         /** Authenticate and possibly send a challenge.
          * This is used to initiate authentication for previously 
          * non-manditory authentication.
+         * @param request the request
+         * @param response the response
          * @return The new Authentication state.
          */
         Authentication authenticate(ServletRequest request,ServletResponse response);
@@ -90,8 +91,9 @@
         
         /* ------------------------------------------------------------ */
         /** Login with the LOGIN authenticator
-         * @param username
-         * @param password
+         * @param username the username
+         * @param password the password
+         * @param request the request
          * @return The new Authentication state
          */
         Authentication login(String username,Object password,ServletRequest request);
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ByteBufferQueuedHttpInput.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ByteBufferQueuedHttpInput.java
deleted file mode 100644
index c900124..0000000
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/ByteBufferQueuedHttpInput.java
+++ /dev/null
@@ -1,53 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.server;
-
-import java.nio.ByteBuffer;
-
-/**
- * <p>An implementation of HttpInput using {@link ByteBuffer} as items.</p>
- */
-public class ByteBufferQueuedHttpInput extends QueuedHttpInput<ByteBuffer>
-{
-    @Override
-    protected int remaining(ByteBuffer item)
-    {
-        return item.remaining();
-    }
-
-    @Override
-    protected int get(ByteBuffer item, byte[] buffer, int offset, int length)
-    {
-        int l = Math.min(item.remaining(), length);
-        item.get(buffer, offset, l);
-        return l;
-    }
-    
-    @Override
-    protected void consume(ByteBuffer item, int length)
-    {
-        item.position(item.position()+length);
-    }
-
-    @Override
-    protected void onContentConsumed(ByteBuffer item)
-    {
-    }
-
-}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ClassLoaderDump.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ClassLoaderDump.java
index 392d841..154e3fc 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/ClassLoaderDump.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ClassLoaderDump.java
@@ -53,13 +53,10 @@
             Object parent = _loader.getParent();
             if (parent != null)
             {
-                if (!(parent instanceof Dumpable))
-                    parent = new ClassLoaderDump((ClassLoader)parent);
-
                 if (_loader instanceof URLClassLoader)
-                    ContainerLifeCycle.dump(out,indent,TypeUtil.asList(((URLClassLoader)_loader).getURLs()),Collections.singleton(parent));
+                    ContainerLifeCycle.dump(out,indent,TypeUtil.asList(((URLClassLoader)_loader).getURLs()),Collections.singleton(parent.toString()));
                 else
-                    ContainerLifeCycle.dump(out,indent,Collections.singleton(parent));
+                    ContainerLifeCycle.dump(out,indent,Collections.singleton(parent.toString()));
             }
         }
     }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionFactory.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionFactory.java
index 0b88d9d..01a8e8a 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionFactory.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionFactory.java
@@ -19,22 +19,29 @@
 package org.eclipse.jetty.server;
 
 
+import java.util.List;
+
+import org.eclipse.jetty.http.BadMessageException;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.MetaData;
 import org.eclipse.jetty.io.Connection;
 import org.eclipse.jetty.io.EndPoint;
 
 /**
- * <p>A Factory to create {@link Connection} instances for {@link Connector}s.</p>
- * <p>A Connection factory is responsible for instantiating and configuring a {@link Connection} instance
- * to handle an {@link EndPoint} accepted by a {@link Connector}.</p>
+ * A Factory to create {@link Connection} instances for {@link Connector}s.
+ * <p>
+ * A Connection factory is responsible for instantiating and configuring a {@link Connection} instance
+ * to handle an {@link EndPoint} accepted by a {@link Connector}.
  * <p>
  * A ConnectionFactory has a protocol name that represents the protocol of the Connections
- * created.  Example of protocol names include:<dl>
+ * created.  Example of protocol names include:
+ * <dl>
  * <dt>http</dt><dd>Creates a HTTP connection that can handle multiple versions of HTTP from 0.9 to 1.1</dd>
- * <dt>spdy/2</dt><dd>Creates a HTTP connection that handles a specific version of the SPDY protocol</dd>
+ * <dt>h2</dt><dd>Creates a HTTP/2 connection that handles the HTTP/2 protocol</dd>
  * <dt>SSL-XYZ</dt><dd>Create an SSL connection chained to a connection obtained from a connection factory 
  * with a protocol "XYZ".</dd>
  * <dt>SSL-http</dt><dd>Create an SSL connection chained to a HTTP connection (aka https)</dd>
- * <dt>SSL-npn</dt><dd>Create an SSL connection chained to a NPN connection, that uses a negotiation with
+ * <dt>SSL-ALPN</dt><dd>Create an SSL connection chained to a ALPN connection, that uses a negotiation with
  * the client to determine the next protocol.</dd>
  * </dl>
  */
@@ -42,9 +49,15 @@
 {
     /* ------------------------------------------------------------ */
     /**
-     * @return A string representing the protocol name.
+     * @return A string representing the primary protocol name.
      */
     public String getProtocol();
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @return A list of alternative protocol names/versions including the primary protocol.
+     */
+    public List<String> getProtocols();
     
     /**
      * <p>Creates a new {@link Connection} with the given parameters</p>
@@ -54,4 +67,23 @@
      */
     public Connection newConnection(Connector connector, EndPoint endPoint);
     
+    
+    public interface Upgrading extends ConnectionFactory
+    {
+        /* ------------------------------------------------------------ */
+        /** Create a connection for an upgrade request.
+         * <p>This is a variation of {@link #newConnection(Connector, EndPoint)} that can create (and/or customise)
+         * a connection for an upgrade request.  Implementations may call {@link #newConnection(Connector, EndPoint)} or 
+         * may construct the connection instance themselves.</p>
+         *  
+         * @param connector  The connector to upgrade for.
+         * @param endPoint The endpoint of the connection.
+         * @param upgradeRequest The meta data of the upgrade request.
+         * @param responseFields  The fields to be sent with the 101 response
+         * @return Null to indicate that request processing should continue normally without upgrading. A new connection instance to
+         * indicate that the upgrade should proceed.
+         * @throws BadMessageException Thrown to indicate the upgrade attempt was illegal and that a bad message response should be sent.
+         */
+        public Connection upgradeConnection(Connector connector, EndPoint endPoint, MetaData.Request upgradeRequest,HttpFields responseFields) throws BadMessageException;
+    }
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Connector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Connector.java
index 4588558..1981c59 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/Connector.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Connector.java
@@ -24,6 +24,7 @@
 
 import org.eclipse.jetty.io.ByteBufferPool;
 import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.util.annotation.ManagedAttribute;
 import org.eclipse.jetty.util.annotation.ManagedObject;
 import org.eclipse.jetty.util.component.Graceful;
@@ -59,6 +60,7 @@
     public ByteBufferPool getByteBufferPool();
 
     /**
+     * @param nextProtocol the next protocol
      * @return the {@link ConnectionFactory} associated with the protocol name
      */
     public ConnectionFactory getConnectionFactory(String nextProtocol);
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/DebugListener.java b/jetty-server/src/main/java/org/eclipse/jetty/server/DebugListener.java
new file mode 100644
index 0000000..e1f6a3e
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/DebugListener.java
@@ -0,0 +1,334 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.Locale;
+
+import javax.servlet.AsyncEvent;
+import javax.servlet.AsyncListener;
+import javax.servlet.DispatcherType;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletRequestEvent;
+import javax.servlet.ServletRequestListener;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.server.handler.ContextHandler.Context;
+import org.eclipse.jetty.server.handler.ContextHandler.ContextScopeListener;
+import org.eclipse.jetty.util.DateCache;
+import org.eclipse.jetty.util.annotation.ManagedAttribute;
+import org.eclipse.jetty.util.annotation.ManagedObject;
+import org.eclipse.jetty.util.annotation.Name;
+import org.eclipse.jetty.util.component.AbstractLifeCycle;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+
+/** A Context Listener that produces additional debug.
+ * This listener if added to a ContextHandler, will produce additional debug information to
+ * either/or a specific log stream or the standard debug log.
+ * The events produced by {@link ServletContextListener}, {@link ServletRequestListener}, 
+ * {@link AsyncListener} and {@link ContextScopeListener} are logged.
+ */
+@ManagedObject("Debug Listener")
+public class DebugListener extends AbstractLifeCycle implements ServletContextListener
+{
+    private static final Logger LOG = Log.getLogger(DebugListener.class);
+    private static final DateCache __date=new DateCache("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
+    
+    private final String _attr = String.format("__R%s@%x",this.getClass().getSimpleName(),System.identityHashCode(this));
+
+    private final PrintStream _out;
+    private boolean _renameThread;
+    private boolean _showHeaders;
+    private boolean _dumpContext;
+
+    public DebugListener()
+    {
+        this(null,false,false,false);
+    }
+    
+    public DebugListener(@Name("renameThread") boolean renameThread, @Name("showHeaders") boolean showHeaders, @Name("dumpContext") boolean dumpContext)
+    {
+        this(null,renameThread,showHeaders,dumpContext);
+    }
+    
+    public DebugListener(@Name("outputStream") OutputStream out, @Name("renameThread") boolean renameThread, @Name("showHeaders") boolean showHeaders, @Name("dumpContext") boolean dumpContext)
+    {
+        _out=out==null?null:new PrintStream(out);
+        _renameThread=renameThread;
+        _showHeaders=showHeaders;
+        _dumpContext=dumpContext;
+    }
+    
+    @ManagedAttribute("Rename thread within context scope")
+    public boolean isRenameThread()
+    {
+        return _renameThread;
+    }
+
+    public void setRenameThread(boolean renameThread)
+    {
+        _renameThread = renameThread;
+    }
+
+    @ManagedAttribute("Show request headers")
+    public boolean isShowHeaders()
+    {
+        return _showHeaders;
+    }
+
+    public void setShowHeaders(boolean showHeaders)
+    {
+        _showHeaders = showHeaders;
+    }
+
+    @ManagedAttribute("Dump contexts at start")
+    public boolean isDumpContext()
+    {
+        return _dumpContext;
+    }
+
+    public void setDumpContext(boolean dumpContext)
+    {
+        _dumpContext = dumpContext;
+    }
+
+    @Override
+    public void contextInitialized(ServletContextEvent sce)
+    {
+        sce.getServletContext().addListener(_servletRequestListener);        
+        ContextHandler handler =  ContextHandler.getContextHandler(sce.getServletContext());
+        handler.addEventListener(_contextScopeListener);
+        String cname=findContextName(sce.getServletContext());
+        log("^  ctx=%s %s",cname,sce.getServletContext());
+        if (_dumpContext)
+        {
+            if (_out==null)
+                handler.dumpStdErr();
+            else
+            {
+                try
+                {
+                    handler.dump(_out);
+                }
+                catch(Exception e)
+                {
+                    LOG.warn(e);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void contextDestroyed(ServletContextEvent sce)
+    {
+        String cname=findContextName(sce.getServletContext());
+        log("v  ctx=%s %s",cname,sce.getServletContext());
+    }
+    
+    protected String findContextName(ServletContext context)
+    {
+        if (context==null)
+            return null;
+        String n = (String)context.getAttribute(_attr);
+        if (n==null)
+        {
+            n=String.format("%s@%x",context.getContextPath(),context.hashCode());
+            context.setAttribute(_attr,n);
+        }
+        return n;
+    }
+
+    protected String findRequestName(ServletRequest request)
+    {
+        if (request==null)
+            return null;
+        HttpServletRequest r = (HttpServletRequest)request;
+        String n = (String)request.getAttribute(_attr);
+        if (n==null)
+        {
+            n=String.format("%s@%x",r.getRequestURI(),request.hashCode());
+            request.setAttribute(_attr,n);
+        }
+        return n;
+    }
+    
+    protected void log(String format, Object... arg)
+    {
+        if (!isRunning())
+            return;
+        
+        String s=String.format(format,arg);
+        
+        long now = System.currentTimeMillis();
+        long ms = now%1000;
+        if (_out!=null)
+            _out.printf("%s.%03d:%s%n",__date.formatNow(now),ms,s);
+        if (LOG.isDebugEnabled())
+            LOG.info(s);
+    }
+    
+    final AsyncListener _asyncListener = new AsyncListener()
+    { 
+        @Override
+        public void onTimeout(AsyncEvent event) throws IOException
+        {
+            String cname=findContextName(((AsyncContextEvent)event).getServletContext());
+            String rname=findRequestName(event.getAsyncContext().getRequest());
+            log("!  ctx=%s r=%s onTimeout %s",cname,rname,((AsyncContextEvent)event).getHttpChannelState());
+        }
+        
+        @Override
+        public void onStartAsync(AsyncEvent event) throws IOException
+        {
+            String cname=findContextName(((AsyncContextEvent)event).getServletContext());
+            String rname=findRequestName(event.getAsyncContext().getRequest());
+            log("!  ctx=%s r=%s onStartAsync %s",cname,rname,((AsyncContextEvent)event).getHttpChannelState());
+        }
+        
+        @Override
+        public void onError(AsyncEvent event) throws IOException
+        {
+            String cname=findContextName(((AsyncContextEvent)event).getServletContext());
+            String rname=findRequestName(event.getAsyncContext().getRequest());
+            log("!! ctx=%s r=%s onError %s %s",cname,rname,event.getThrowable(),((AsyncContextEvent)event).getHttpChannelState());
+        }
+        
+        @Override
+        public void onComplete(AsyncEvent event) throws IOException
+        {
+            AsyncContextEvent ace=(AsyncContextEvent)event;
+            String cname=findContextName(ace.getServletContext());
+            String rname=findRequestName(ace.getAsyncContext().getRequest());
+            
+            Request br=Request.getBaseRequest(ace.getAsyncContext().getRequest());
+            Response response = br.getResponse();
+            String headers=_showHeaders?("\n"+response.getHttpFields().toString()):"";
+            
+            log("!  ctx=%s r=%s onComplete %s %d%s",cname,rname,ace.getHttpChannelState(),response.getStatus(),headers);
+        }
+    };
+    
+    final ServletRequestListener _servletRequestListener = new ServletRequestListener()
+    {
+        @Override
+        public void requestInitialized(ServletRequestEvent sre)
+        {
+            String cname=findContextName(sre.getServletContext());
+            HttpServletRequest r = (HttpServletRequest)sre.getServletRequest();
+           
+            String rname=findRequestName(r);
+            DispatcherType d = r.getDispatcherType();
+            if (d==DispatcherType.REQUEST)
+            {
+                Request br=Request.getBaseRequest(r);
+
+                String headers=_showHeaders?("\n"+br.getMetaData().getFields().toString()):"";
+                
+                
+                StringBuffer url=r.getRequestURL();
+                if (r.getQueryString()!=null)
+                    url.append('?').append(r.getQueryString());
+                log(">> %s ctx=%s r=%s %s %s %s %s %s%s",d,
+                        cname,
+                        rname,
+                        d,
+                        r.getMethod(),
+                        url.toString(),
+                        r.getProtocol(),
+                        br.getHttpChannel(),
+                        headers);
+            }
+            else
+                log(">> %s ctx=%s r=%s",d,cname,rname);
+        }
+        
+        @Override
+        public void requestDestroyed(ServletRequestEvent sre)
+        {
+            String cname=findContextName(sre.getServletContext());
+            HttpServletRequest r = (HttpServletRequest)sre.getServletRequest();
+            String rname=findRequestName(r);
+            DispatcherType d = r.getDispatcherType();
+            if (sre.getServletRequest().isAsyncStarted())
+            {
+                sre.getServletRequest().getAsyncContext().addListener(_asyncListener);
+                log("<< %s ctx=%s r=%s async=true",d,cname,rname);
+            }
+            else
+            {
+                Request br=Request.getBaseRequest(r);
+                String headers=_showHeaders?("\n"+br.getResponse().getHttpFields().toString()):"";
+                log("<< %s ctx=%s r=%s async=false %d%s",d,cname,rname,Request.getBaseRequest(r).getResponse().getStatus(),headers);
+            }
+        }
+    };
+    
+    final ContextHandler.ContextScopeListener _contextScopeListener = new ContextHandler.ContextScopeListener()
+    {
+        @Override
+        public void enterScope(Context context, Request request, Object reason)
+        {
+            String cname=findContextName(context);
+            if (request==null)
+                log(">  ctx=%s %s",cname,reason);
+            else
+            {
+                String rname=findRequestName(request);
+
+                if (_renameThread)
+                {
+                    Thread thread=Thread.currentThread();
+                    thread.setName(String.format("%s#%s",thread.getName(),rname));
+                }
+            
+                log(">  ctx=%s r=%s %s",cname,rname,reason);
+            }
+        }
+        
+
+        @Override
+        public void exitScope(Context context, Request request)
+        {
+            String cname=findContextName(context);
+            if (request==null)
+                log("<  ctx=%s",cname);
+            else
+            {
+                String rname=findRequestName(request);
+
+                log("<  ctx=%s r=%s",cname,rname);
+                if (_renameThread)
+                {
+                    Thread thread=Thread.currentThread();
+                    if (thread.getName().endsWith(rname))
+                        thread.setName(thread.getName().substring(0,thread.getName().length()-rname.length()-1));
+                }
+            }
+        }   
+    };
+}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Dispatcher.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Dispatcher.java
index 6b7e205..68798b8 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/Dispatcher.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Dispatcher.java
@@ -22,6 +22,7 @@
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashSet;
+
 import javax.servlet.DispatcherType;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletException;
@@ -30,6 +31,10 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpURI;
+import org.eclipse.jetty.http.MetaData;
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.util.Attributes;
 import org.eclipse.jetty.util.MultiMap;
@@ -43,27 +48,24 @@
     public final static String __FORWARD_PREFIX="javax.servlet.forward.";
 
     private final ContextHandler _contextHandler;
-    private final String _uri;
-    private final String _path;
-    private final String _query;
+    private final HttpURI _uri;
+    private final String _pathInContext;
     private final String _named;
 
-    public Dispatcher(ContextHandler contextHandler, String uri, String pathInContext, String query)
+    public Dispatcher(ContextHandler contextHandler, HttpURI uri, String pathInContext)
     {
         _contextHandler=contextHandler;
         _uri=uri;
-        _path=pathInContext;
-        _query=query;
+        _pathInContext=pathInContext;
         _named=null;
     }
 
     public Dispatcher(ContextHandler contextHandler, String name) throws IllegalStateException
     {
         _contextHandler=contextHandler;
-        _named=name;
         _uri=null;
-        _path=null;
-        _query=null;
+        _pathInContext=null;
+        _named=name;
     }
 
     @Override
@@ -80,7 +82,7 @@
     @Override
     public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException
     {
-        Request baseRequest=(request instanceof Request)?((Request)request):HttpChannel.getCurrentHttpChannel().getRequest();
+        Request baseRequest=Request.getBaseRequest(request);
 
         if (!(request instanceof HttpServletRequest))
             request = new ServletRequestHttpWrapper(request);
@@ -102,17 +104,17 @@
             {
                 IncludeAttributes attr = new IncludeAttributes(old_attr);
 
-                attr._requestURI=_uri;
+                attr._requestURI=_uri.getPath();
                 attr._contextPath=_contextHandler.getContextPath();
                 attr._servletPath=null; // set by ServletHandler
-                attr._pathInfo=_path;
-                attr._query=_query;
+                attr._pathInfo=_pathInContext;
+                attr._query=_uri.getQuery();
 
-                if (_query!=null)
-                    baseRequest.mergeQueryParameters(_query, false);
+                if (attr._query!=null)
+                    baseRequest.mergeQueryParameters(baseRequest.getQueryString(),attr._query, false);
                 baseRequest.setAttributes(attr);
 
-                _contextHandler.handle(_path, baseRequest, (HttpServletRequest)request, (HttpServletResponse)response);
+                _contextHandler.handle(_pathInContext, baseRequest, (HttpServletRequest)request, (HttpServletResponse)response);
             }
         }
         finally
@@ -127,7 +129,7 @@
 
     protected void forward(ServletRequest request, ServletResponse response, DispatcherType dispatch) throws ServletException, IOException
     {
-        Request baseRequest=(request instanceof Request)?((Request)request):HttpChannel.getCurrentHttpChannel().getRequest();
+        Request baseRequest=Request.getBaseRequest(request);
         Response base_response=baseRequest.getResponse();
         base_response.resetForForward();
 
@@ -137,11 +139,12 @@
             response = new ServletResponseHttpWrapper(response);
 
         final boolean old_handled=baseRequest.isHandled();
-        final String old_uri=baseRequest.getRequestURI();
+
+        final HttpURI old_uri=baseRequest.getHttpURI();
         final String old_context_path=baseRequest.getContextPath();
         final String old_servlet_path=baseRequest.getServletPath();
         final String old_path_info=baseRequest.getPathInfo();
-        final String old_query=baseRequest.getQueryString();
+
         final MultiMap<String> old_query_params=baseRequest.getQueryParameters();
         final Attributes old_attr=baseRequest.getAttributes();
         final DispatcherType old_type=baseRequest.getDispatcherType();
@@ -174,21 +177,26 @@
                 else
                 {
                     attr._pathInfo=old_path_info;
-                    attr._query=old_query;
-                    attr._requestURI=old_uri;
+                    attr._query=old_uri.getQuery();
+                    attr._requestURI=old_uri.getPath();
                     attr._contextPath=old_context_path;
                     attr._servletPath=old_servlet_path;
                 }
 
-                baseRequest.setRequestURI(_uri);
+                HttpURI uri = new HttpURI(old_uri.getScheme(),old_uri.getHost(),old_uri.getPort(),
+                        _uri.getPath(),_uri.getParam(),_uri.getQuery(),_uri.getFragment());
+
+                baseRequest.setHttpURI(uri);
+
                 baseRequest.setContextPath(_contextHandler.getContextPath());
                 baseRequest.setServletPath(null);
-                baseRequest.setPathInfo(_uri);
-                if (_query!=null)
-                    baseRequest.mergeQueryParameters(_query, true);
+                baseRequest.setPathInfo(_pathInContext);
+                if (_uri.getQuery()!=null || old_uri.getQuery()!=null)
+                    baseRequest.mergeQueryParameters(old_uri.getQuery(),_uri.getQuery(), true);
+
                 baseRequest.setAttributes(attr);
 
-                _contextHandler.handle(_path, baseRequest, (HttpServletRequest)request, (HttpServletResponse)response);
+                _contextHandler.handle(_pathInContext, baseRequest, (HttpServletRequest)request, (HttpServletResponse)response);
 
                 if (!baseRequest.getHttpChannelState().isAsync())
                     commitResponse(response,baseRequest);
@@ -197,11 +205,10 @@
         finally
         {
             baseRequest.setHandled(old_handled);
-            baseRequest.setRequestURI(old_uri);
+            baseRequest.setHttpURI(old_uri);
             baseRequest.setContextPath(old_context_path);
             baseRequest.setServletPath(old_servlet_path);
             baseRequest.setPathInfo(old_path_info);
-            baseRequest.setQueryString(old_query);
             baseRequest.setQueryParameters(old_query_params);
             baseRequest.resetParameters();
             baseRequest.setAttributes(old_attr);
@@ -209,6 +216,40 @@
         }
     }
 
+    /**
+     * <p>Pushes a secondary resource identified by this dispatcher.</p>
+     *
+     * @param request the primary request
+     * @deprecated Use {@link Request#getPushBuilder()} instead
+     */
+    @Deprecated
+    public void push(ServletRequest request)
+    {
+        Request baseRequest = Request.getBaseRequest(request);
+        HttpFields fields = new HttpFields(baseRequest.getHttpFields());
+
+        String query=baseRequest.getQueryString();
+        if (_uri.hasQuery())
+        {
+            if (query==null)
+                query=_uri.getQuery();
+            else
+                query=query+"&"+_uri.getQuery(); // TODO is this correct semantic?
+        }
+
+        HttpURI uri = HttpURI.createHttpURI(request.getScheme(),request.getServerName(),request.getServerPort(),_uri.getPath(),baseRequest.getHttpURI().getParam(),query,null);
+
+        MetaData.Request push = new MetaData.Request(HttpMethod.GET.asString(),uri,baseRequest.getHttpVersion(),fields);
+
+        baseRequest.getHttpChannel().getHttpTransport().push(push);
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("Dispatcher@0x%x{%s,%s}",hashCode(),_named,_uri);
+    }
+
     private void commitResponse(ServletResponse response, Request baseRequest) throws IOException
     {
         if (baseRequest.getResponse().isWriting())
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ForwardedRequestCustomizer.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ForwardedRequestCustomizer.java
index 46c46ac..813ffd0 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/ForwardedRequestCustomizer.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ForwardedRequestCustomizer.java
@@ -20,6 +20,9 @@
 
 import java.net.InetSocketAddress;
 
+import javax.servlet.ServletRequest;
+
+import org.eclipse.jetty.http.HostPortHttpField;
 import org.eclipse.jetty.http.HttpFields;
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpScheme;
@@ -46,7 +49,7 @@
  */
 public class ForwardedRequestCustomizer implements Customizer
 {
-    private String _hostHeader;
+    private HostPortHttpField _hostHeader;
     private String _forwardedHostHeader = HttpHeader.X_FORWARDED_HOST.toString();
     private String _forwardedServerHeader = HttpHeader.X_FORWARDED_SERVER.toString();
     private String _forwardedForHeader = HttpHeader.X_FORWARDED_FOR.toString();
@@ -58,7 +61,7 @@
     /* ------------------------------------------------------------ */
     public String getHostHeader()
     {
-        return _hostHeader;
+        return _hostHeader.getValue();
     }
 
     /* ------------------------------------------------------------ */
@@ -70,7 +73,7 @@
      */
     public void setHostHeader(String hostHeader)
     {
-        _hostHeader = hostHeader;
+        _hostHeader = new HostPortHttpField(hostHeader);
     }
 
     /* ------------------------------------------------------------ */
@@ -201,13 +204,13 @@
         // Do SSL first
         if (getForwardedCipherSuiteHeader()!=null)
         {
-            String cipher_suite=httpFields.getStringField(getForwardedCipherSuiteHeader());
+            String cipher_suite=httpFields.get(getForwardedCipherSuiteHeader());
             if (cipher_suite!=null)
                 request.setAttribute("javax.servlet.request.cipher_suite",cipher_suite);
         }
         if (getForwardedSslSessionIdHeader()!=null)
         {
-            String ssl_session_id=httpFields.getStringField(getForwardedSslSessionIdHeader());
+            String ssl_session_id=httpFields.get(getForwardedSslSessionIdHeader());
             if(ssl_session_id!=null)
             {
                 request.setAttribute("javax.servlet.request.ssl_session_id", ssl_session_id);
@@ -224,23 +227,20 @@
         if (_hostHeader != null)
         {
             // Update host header
-            httpFields.put(HttpHeader.HOST.toString(),_hostHeader);
-            request.setServerName(null);
-            request.setServerPort(-1);
-            request.getServerName();
+            httpFields.put(_hostHeader);
+            request.setAuthority(_hostHeader.getHost(),_hostHeader.getPort());
         }
         else if (forwardedHost != null)
         {
             // Update host header
-            httpFields.put(HttpHeader.HOST.toString(),forwardedHost);
-            request.setServerName(null);
-            request.setServerPort(-1);
-            request.getServerName();
+            HostPortHttpField auth = new HostPortHttpField(forwardedHost);
+            httpFields.put(auth);
+            request.setAuthority(auth.getHost(),auth.getPort());
         }
         else if (forwardedServer != null)
         {
             // Use provided server name
-            request.setServerName(forwardedServer);
+            request.setAuthority(forwardedServer,request.getServerPort());
         }
 
         if (forwardedFor != null)
@@ -262,7 +262,7 @@
         if (header == null)
             return null;
 
-        String headerValue = fields.getStringField(header);
+        String headerValue = fields.get(header);
 
         if (headerValue == null)
             return null;
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Handler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Handler.java
index 5db8e2b..ac2b043 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/Handler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Handler.java
@@ -24,17 +24,21 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.eclipse.jetty.server.handler.HandlerCollection;
+import org.eclipse.jetty.server.handler.HandlerWrapper;
 import org.eclipse.jetty.util.annotation.ManagedAttribute;
 import org.eclipse.jetty.util.annotation.ManagedObject;
 import org.eclipse.jetty.util.annotation.ManagedOperation;
 import org.eclipse.jetty.util.component.Destroyable;
 import org.eclipse.jetty.util.component.LifeCycle;
 
-/* ------------------------------------------------------------ */
 /** A Jetty Server Handler.
- *
+ * <p>
  * A Handler instance is required by a {@link Server} to handle incoming
- * HTTP requests.  A Handler may: <ul>
+ * HTTP requests.
+ * <p>  
+ * A Handler may: 
+ * <ul>
  * <li>Completely generate the HTTP Response</li>
  * <li>Examine/modify the request and call another Handler (see {@link HandlerWrapper}).
  * <li>Pass the request to one or more other Handlers (see {@link HandlerCollection}).
@@ -49,18 +53,25 @@
 @ManagedObject("Jetty Handler")
 public interface Handler extends LifeCycle, Destroyable
 {
-    /* ------------------------------------------------------------ */
-    /** Handle a request.
-     * @param target The target of the request - either a URI or a name.
-     * @param baseRequest The original unwrapped request object.
-     * @param request The request either as the {@link Request}
-     * object or a wrapper of that request. The {@link HttpChannel#getCurrentHttpChannel()}
-     * method can be used access the Request object if required.
-     * @param response The response as the {@link Response}
-     * object or a wrapper of that request. The {@link HttpChannel#getCurrentHttpChannel()}
-     * method can be used access the Response object if required.
+    /**
+     * Handle a request.
+     * 
+     * @param target
+     *            The target of the request - either a URI or a name.
+     * @param baseRequest
+     *            The original unwrapped request object.
+     * @param request
+     *            The request either as the {@link Request} object or a wrapper of that request. The
+     *            <code>{@link HttpConnection#getCurrentConnection()}.{@link HttpConnection#getHttpChannel() getHttpChannel()}.{@link HttpChannel#getRequest() getRequest()}</code>
+     *            method can be used access the Request object if required.
+     * @param response
+     *            The response as the {@link Response} object or a wrapper of that request. The
+     *            <code>{@link HttpConnection#getCurrentConnection()}.{@link HttpConnection#getHttpChannel() getHttpChannel()}.{@link HttpChannel#getResponse() getResponse()}</code>
+     *            method can be used access the Response object if required.
      * @throws IOException
+     *             if unable to handle the request or response processing
      * @throws ServletException
+     *             if unable to handle the request or response due to underlying servlet issue
      */
     public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
         throws IOException, ServletException;
@@ -72,6 +83,5 @@
 
     @ManagedOperation(value="destroy associated resources", impact="ACTION")
     public void destroy();
-
 }
 
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HandlerContainer.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HandlerContainer.java
index dfe4c71..301a87d 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/HandlerContainer.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HandlerContainer.java
@@ -48,15 +48,16 @@
     
     /* ------------------------------------------------------------ */
     /**
-     * @param byclass
+     * @param byclass the child handler class to get
      * @return array of all handlers contained by this handler and it's children of the passed type.
      */
     public Handler[] getChildHandlersByClass(Class<?> byclass);
     
     /* ------------------------------------------------------------ */
     /**
-     * @param byclass
+     * @param byclass the child handler class to get
      * @return first handler of all handlers contained by this handler and it's children of the passed type.
+     * @param <T> the type of handler
      */
     public <T extends Handler> T getChildHandlerByClass(Class<T> byclass);
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HostHeaderCustomizer.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HostHeaderCustomizer.java
index f4f5e7d..5658cb8 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/HostHeaderCustomizer.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HostHeaderCustomizer.java
@@ -20,15 +20,17 @@
 
 import java.util.Objects;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * Customizes requests that lack the {@code Host} header (for example, HTTP 1.0 requests).
- * <p />
+ * <p>
  * In case of HTTP 1.0 requests that lack the {@code Host} header, the application may issue
  * a redirect, and the {@code Location} header is usually constructed from the {@code Host}
  * header; if the {@code Host} header is missing, the server may query the connector for its
  * IP address in order to construct the {@code Location} header, and thus leak to clients
  * internal IP addresses.
- * <p />
+ * <p>
  * This {@link HttpConfiguration.Customizer} is configured with a {@code serverName} and
  * optionally a {@code serverPort}.
  * If the {@code Host} header is absent, the configured {@code serverName} will be set on
@@ -62,10 +64,6 @@
     public void customize(Connector connector, HttpConfiguration channelConfig, Request request)
     {
         if (request.getHeader("Host") == null)
-        {
-            request.setServerName(serverName);
-            if (serverPort > 0)
-                request.setServerPort(serverPort);
-        }
+            request.setAuthority(serverName,serverPort);  // TODO set the field as well?
     }
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java
index 1a4ab43..0d29c82 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java
@@ -22,27 +22,24 @@
 import java.net.InetSocketAddress;
 import java.nio.ByteBuffer;
 import java.nio.channels.ClosedChannelException;
-import java.nio.charset.StandardCharsets;
 import java.util.List;
+import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import javax.servlet.DispatcherType;
 import javax.servlet.RequestDispatcher;
+import javax.servlet.UnavailableException;
 import javax.servlet.http.HttpServletRequest;
 
-import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.BadMessageException;
 import org.eclipse.jetty.http.HttpFields;
 import org.eclipse.jetty.http.HttpGenerator;
-import org.eclipse.jetty.http.HttpGenerator.ResponseInfo;
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpHeaderValue;
-import org.eclipse.jetty.http.HttpMethod;
-import org.eclipse.jetty.http.HttpParser;
 import org.eclipse.jetty.http.HttpStatus;
-import org.eclipse.jetty.http.HttpURI;
 import org.eclipse.jetty.http.HttpVersion;
-import org.eclipse.jetty.http.MimeTypes;
+import org.eclipse.jetty.http.MetaData;
 import org.eclipse.jetty.io.ByteBufferPool;
 import org.eclipse.jetty.io.ChannelEndPoint;
 import org.eclipse.jetty.io.EndPoint;
@@ -50,17 +47,16 @@
 import org.eclipse.jetty.server.HttpChannelState.Action;
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.server.handler.ErrorHandler;
+import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.util.Callback;
 import org.eclipse.jetty.util.SharedBlockingCallback.Blocker;
-import org.eclipse.jetty.util.URIUtil;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.thread.Scheduler;
 
 
-/* ------------------------------------------------------------ */
-/** HttpChannel.
- * Represents a single endpoint for HTTP semantic processing.
+/**
+ * HttpChannel represents a single endpoint for HTTP semantic processing.
  * The HttpChannel is both a HttpParser.RequestHandler, where it passively receives events from
  * an incoming HTTP request, and a Runnable, where it actively takes control of the request/response
  * life cycle and calls the application (perhaps suspending and resuming with multiple calls to run).
@@ -69,69 +65,59 @@
  * HttpTransport.completed().
  *
  */
-public class HttpChannel<T> implements HttpParser.RequestHandler<T>, Runnable, HttpParser.ProxyHandler
+public class HttpChannel implements Runnable, HttpOutput.Interceptor
 {
     private static final Logger LOG = Log.getLogger(HttpChannel.class);
-    private static final ThreadLocal<HttpChannel<?>> __currentChannel = new ThreadLocal<>();
-
-    /* ------------------------------------------------------------ */
-    /** Get the current channel that this thread is dispatched to.
-     * @see Request#getAttribute(String) for a more general way to access the HttpChannel
-     * @return the current HttpChannel or null
-     */
-    public static HttpChannel<?> getCurrentHttpChannel()
-    {
-        return __currentChannel.get();
-    }
-
-    protected static HttpChannel<?> setCurrentHttpChannel(HttpChannel<?> channel)
-    {
-        HttpChannel<?> last=__currentChannel.get();
-        __currentChannel.set(channel);
-        return last;
-    }
-
     private final AtomicBoolean _committed = new AtomicBoolean();
     private final AtomicInteger _requests = new AtomicInteger();
     private final Connector _connector;
     private final HttpConfiguration _configuration;
     private final EndPoint _endPoint;
     private final HttpTransport _transport;
-    private final HttpURI _uri;
     private final HttpChannelState _state;
     private final Request _request;
     private final Response _response;
-    private HttpVersion _version = HttpVersion.HTTP_1_1;
-    private boolean _expect = false;
-    private boolean _expect100Continue = false;
-    private boolean _expect102Processing = false;
+    private MetaData.Response _committedMetaData;
+    private RequestLog _requestLog;
 
-    public HttpChannel(Connector connector, HttpConfiguration configuration, EndPoint endPoint, HttpTransport transport, HttpInput<T> input)
+    /** Bytes written after interception (eg after compression) */
+    private long _written;
+
+    public HttpChannel(Connector connector, HttpConfiguration configuration, EndPoint endPoint, HttpTransport transport)
     {
         _connector = connector;
         _configuration = configuration;
         _endPoint = endPoint;
         _transport = transport;
 
-        _uri = new HttpURI(URIUtil.__CHARSET);
         _state = new HttpChannelState(this);
-        input.init(_state);
-        _request = new Request(this, input);
-        _response = new Response(this, new HttpOutput(this));
-
+        _request = new Request(this, newHttpInput(_state));
+        _response = new Response(this, newHttpOutput());
+        _requestLog=_connector==null?null:_connector.getServer().getRequestLog();
         if (LOG.isDebugEnabled())
             LOG.debug("new {} -> {},{},{}",this,_endPoint,_endPoint.getConnection(),_state);
     }
 
+    protected HttpInput newHttpInput(HttpChannelState state)
+    {
+        return new HttpInput(state);
+    }
+
+    protected HttpOutput newHttpOutput()
+    {
+        return new HttpOutput(this);
+    }
+
     public HttpChannelState getState()
     {
         return _state;
     }
 
-    public HttpVersion getHttpVersion()
+    public long getBytesWritten()
     {
-        return _version;
+        return _written;
     }
+
     /**
      * @return the number of requests handled by this connection
      */
@@ -150,10 +136,36 @@
         return _transport;
     }
 
+    public RequestLog getRequestLog()
+    {
+        return _requestLog;
+    }
+
+    public void setRequestLog(RequestLog requestLog)
+    {
+        _requestLog = requestLog;
+    }
+
+    public void addRequestLog(RequestLog requestLog)
+    {
+        if (_requestLog==null)
+            _requestLog = requestLog;
+        else if (_requestLog instanceof RequestLogCollection)
+            ((RequestLogCollection) _requestLog).add(requestLog);
+        else
+            _requestLog = new RequestLogCollection(_requestLog, requestLog);
+    }
+
+    public MetaData.Response getCommittedMetaData()
+    {
+        return _committedMetaData;
+    }
+
     /**
      * Get the idle timeout.
      * <p>This is implemented as a call to {@link EndPoint#getIdleTimeout()}, but may be
      * overridden by channels that have timeouts different from their connections.
+     * @return the idle timeout (in milliseconds)
      */
     public long getIdleTimeout()
     {
@@ -164,6 +176,7 @@
      * Set the idle timeout.
      * <p>This is implemented as a call to {@link EndPoint#setIdleTimeout(long)}, but may be
      * overridden by channels that have timeouts different from their connections.
+     * @param timeoutMs the idle timeout in milliseconds
      */
     public void setIdleTimeout(long timeoutMs)
     {
@@ -180,6 +193,12 @@
         return _configuration;
     }
 
+    @Override
+    public boolean isOptimizedForDirectBuffers()
+    {
+        return getHttpTransport().isOptimizedForDirectBuffers();
+    }
+
     public Server getServer()
     {
         return _connector.getServer();
@@ -210,50 +229,31 @@
         return _endPoint.getRemoteAddress();
     }
 
-    @Override
-    public int getHeaderCacheSize()
-    {
-        return _configuration.getHeaderCacheSize();
-    }
-
     /**
      * If the associated response has the Expect header set to 100 Continue,
      * then accessing the input stream indicates that the handler/servlet
      * is ready for the request body and thus a 100 Continue response is sent.
      *
+     * @param available estimate of the number of bytes that are available
      * @throws IOException if the InputStream cannot be created
      */
     public void continue100(int available) throws IOException
     {
-        // If the client is expecting 100 CONTINUE, then send it now.
-        // TODO: consider using an AtomicBoolean ?
-        if (isExpecting100Continue())
-        {
-            _expect100Continue = false;
-
-            // is content missing?
-            if (available == 0)
-            {
-                if (_response.isCommitted())
-                    throw new IOException("Committed before 100 Continues");
-
-                // TODO: break this dependency with HttpGenerator
-                boolean committed = sendResponse(HttpGenerator.CONTINUE_100_INFO, null, false);
-                if (!committed)
-                    throw new IOException("Concurrent commit while trying to send 100-Continue");
-            }
-        }
+        throw new UnsupportedOperationException();
     }
 
-    public void reset()
+    public void recycle()
     {
         _committed.set(false);
-        _expect = false;
-        _expect100Continue = false;
-        _expect102Processing = false;
         _request.recycle();
         _response.recycle();
-        _uri.clear();
+        _committedMetaData=null;
+        _requestLog=_connector==null?null:_connector.getServer().getRequestLog();
+        _written=0;
+    }
+
+    public void asyncReadFillInterested()
+    {
     }
 
     @Override
@@ -262,192 +262,204 @@
         handle();
     }
 
-    /* ------------------------------------------------------------ */
     /**
      * @return True if the channel is ready to continue handling (ie it is not suspended)
      */
     public boolean handle()
     {
         if (LOG.isDebugEnabled())
-            LOG.debug("{} handle enter", this);
-
-        final HttpChannel<?>last = setCurrentHttpChannel(this);
-
-        String threadName = null;
-        if (LOG.isDebugEnabled())
-        {
-            threadName = Thread.currentThread().getName();
-            Thread.currentThread().setName(threadName + " - " + _uri);
-        }
+            LOG.debug("{} handle {} ", this,_request.getHttpURI());
 
         HttpChannelState.Action action = _state.handling();
-        try
+
+        // Loop here to handle async request redispatches.
+        // The loop is controlled by the call to async.unhandle in the
+        // finally block below.  Unhandle will return false only if an async dispatch has
+        // already happened when unhandle is called.
+        loop: while (!getServer().isStopped())
         {
-            // Loop here to handle async request redispatches.
-            // The loop is controlled by the call to async.unhandle in the
-            // finally block below.  Unhandle will return false only if an async dispatch has
-            // already happened when unhandle is called.
-            loop: while (action.ordinal()<HttpChannelState.Action.WAIT.ordinal() && getServer().isRunning())
+            try
             {
-                boolean error=false;
-                try
+                if (LOG.isDebugEnabled())
+                    LOG.debug("{} action {}",this,action);
+
+                switch(action)
                 {
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("{} action {}",this,action);
+                    case TERMINATED:
+                    case WAIT:
+                        break loop;
 
-                    switch(action)
+                    case DISPATCH:
                     {
-                        case REQUEST_DISPATCH:
-                            _request.setHandled(false);
-                            _response.getHttpOutput().reopen();
-                            _request.setDispatcherType(DispatcherType.REQUEST);
+                        if (!_request.hasMetaData())
+                            throw new IllegalStateException("state=" + _state);
+                        _request.setHandled(false);
+                        _response.getHttpOutput().reopen();
+                        _request.setDispatcherType(DispatcherType.REQUEST);
 
-                            List<HttpConfiguration.Customizer> customizers = _configuration.getCustomizers();
-                            if (!customizers.isEmpty())
-                            {
-                                for (HttpConfiguration.Customizer customizer : customizers)
-                                    customizer.customize(getConnector(), _configuration, _request);
-                            }
-                            getServer().handle(this);
-                            break;
-
-                        case ASYNC_DISPATCH:
-                            _request.setHandled(false);
-                            _response.getHttpOutput().reopen();
-                            _request.setDispatcherType(DispatcherType.ASYNC);
-                            getServer().handleAsync(this);
-                            break;
-
-                        case ASYNC_EXPIRED:
-                            _request.setHandled(false);
-                            _response.getHttpOutput().reopen();
-                            _request.setDispatcherType(DispatcherType.ERROR);
-
-                            Throwable ex=_state.getAsyncContextEvent().getThrowable();
-                            String reason="Async Timeout";
-                            if (ex!=null)
-                            {
-                                reason="Async Exception";
-                                _request.setAttribute(RequestDispatcher.ERROR_EXCEPTION,ex);
-                            }
-                            _request.setAttribute(RequestDispatcher.ERROR_STATUS_CODE,new Integer(500));
-                            _request.setAttribute(RequestDispatcher.ERROR_MESSAGE,reason);
-                            _request.setAttribute(RequestDispatcher.ERROR_REQUEST_URI,_request.getRequestURI());
-
-                            _response.setStatusWithReason(500,reason);
-
-
-                            ErrorHandler eh = ErrorHandler.getErrorHandler(getServer(),_state.getContextHandler());
-                            if (eh instanceof ErrorHandler.ErrorPageMapper)
-                            {
-                                String error_page=((ErrorHandler.ErrorPageMapper)eh).getErrorPage((HttpServletRequest)_state.getAsyncContextEvent().getSuppliedRequest());
-                                if (error_page!=null)
-                                    _state.getAsyncContextEvent().setDispatchPath(error_page);
-                            }
-
-                            getServer().handleAsync(this);
-                            break;
-
-                        case READ_CALLBACK:
+                        List<HttpConfiguration.Customizer> customizers = _configuration.getCustomizers();
+                        if (!customizers.isEmpty())
                         {
-                            ContextHandler handler=_state.getContextHandler();
-                            if (handler!=null)
-                                handler.handle(_request.getHttpInput());
-                            else
-                                _request.getHttpInput().run();
-                            break;
+                            for (HttpConfiguration.Customizer customizer : customizers)
+                                customizer.customize(getConnector(), _configuration, _request);
                         }
+                        getServer().handle(this);
+                        break;
+                    }
 
-                        case WRITE_CALLBACK:
+                    case ASYNC_DISPATCH:
+                    {
+                        _request.setHandled(false);
+                        _response.getHttpOutput().reopen();
+                        _request.setDispatcherType(DispatcherType.ASYNC);
+                        getServer().handleAsync(this);
+                        break;
+                    }
+
+                    case ERROR_DISPATCH:
+                    {
+                        Throwable ex = _state.getAsyncContextEvent().getThrowable();
+
+                        // Check for error dispatch loops
+                        Integer loop_detect = (Integer)_request.getAttribute("org.eclipse.jetty.server.ERROR_DISPATCH");
+                        if (loop_detect==null)
+                            loop_detect=1;
+                        else
+                            loop_detect=loop_detect+1;
+                        _request.setAttribute("org.eclipse.jetty.server.ERROR_DISPATCH",loop_detect);
+                        if (loop_detect > getHttpConfiguration().getMaxErrorDispatches())
                         {
-                            ContextHandler handler=_state.getContextHandler();
-
-                            if (handler!=null)
-                                handler.handle(_response.getHttpOutput());
-                            else
-                                _response.getHttpOutput().run();
-                            break;
-                        }
-
-                        default:
+                            LOG.warn("ERROR_DISPATCH loop detected on {} {}",_request,ex);
+                            try
+                            {
+                                _response.sendError(HttpStatus.INTERNAL_SERVER_ERROR_500);
+                            }
+                            finally
+                            {
+                                _state.errorComplete();
+                            }
                             break loop;
+                        }
 
+                        _request.setHandled(false);
+                        _response.resetBuffer();
+                        _response.getHttpOutput().reopen();
+                        _request.setDispatcherType(DispatcherType.ERROR);
+
+                        String reason;
+                        if (ex == null || ex instanceof TimeoutException)
+                        {
+                            reason = "Async Timeout";
+                        }
+                        else
+                        {
+                            reason = HttpStatus.Code.INTERNAL_SERVER_ERROR.getMessage();
+                            _request.setAttribute(RequestDispatcher.ERROR_EXCEPTION, ex);
+                        }
+
+                        _request.setAttribute(RequestDispatcher.ERROR_STATUS_CODE, 500);
+                        _request.setAttribute(RequestDispatcher.ERROR_MESSAGE, reason);
+                        _request.setAttribute(RequestDispatcher.ERROR_REQUEST_URI, _request.getRequestURI());
+
+                        _response.setStatusWithReason(HttpStatus.INTERNAL_SERVER_ERROR_500, reason);
+
+                        ErrorHandler eh = ErrorHandler.getErrorHandler(getServer(), _state.getContextHandler());
+                        if (eh instanceof ErrorHandler.ErrorPageMapper)
+                        {
+                            String error_page = ((ErrorHandler.ErrorPageMapper)eh).getErrorPage((HttpServletRequest)_state.getAsyncContextEvent().getSuppliedRequest());
+                            if (error_page != null)
+                                _state.getAsyncContextEvent().setDispatchPath(error_page);
+                        }
+
+                        getServer().handleAsync(this);
+                        break;
                     }
-                }
-                catch (Error e)
-                {
-                    if ("ContinuationThrowable".equals(e.getClass().getSimpleName()))
-                        LOG.ignore(e);
-                    else
+
+                    case READ_CALLBACK:
                     {
-                        error=true;
-                        LOG.warn(String.valueOf(_uri), e);
-                        _state.error(e);
+                        ContextHandler handler=_state.getContextHandler();
+                        if (handler!=null)
+                            handler.handle(_request,_request.getHttpInput());
+                        else
+                            _request.getHttpInput().run();
+                        break;
+                    }
+
+                    case WRITE_CALLBACK:
+                    {
+                        ContextHandler handler=_state.getContextHandler();
+                        if (handler!=null)
+                            handler.handle(_request,_response.getHttpOutput());
+                        else
+                            _response.getHttpOutput().run();
+                        break;
+                    }
+
+                    case ASYNC_ERROR:
+                    {
+                        _state.onError();
+                        break;
+                    }
+
+                    case COMPLETE:
+                    {
+                        // TODO do onComplete here for continuations to work
+//                        _state.onComplete();
+
+                        if (!_response.isCommitted() && !_request.isHandled())
+                            _response.sendError(404);
+                        else
+                            _response.closeOutput();
                         _request.setHandled(true);
-                        handleException(e);
+
+                        // TODO do onComplete here to detect errors in final flush
+                         _state.onComplete();
+
+                        onCompleted();
+
+                        break loop;
+                    }
+
+                    default:
+                    {
+                        throw new IllegalStateException("state="+_state);
                     }
                 }
-                catch (Exception e)
+            }
+            catch (EofException|QuietServletException|BadMessageException e)
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug(e);
+                handleException(e);
+            }
+            catch (Throwable e)
+            {
+                if ("ContinuationThrowable".equals(e.getClass().getSimpleName()))
                 {
-                    error=true;
-                    if (e instanceof EofException)
-                        LOG.debug(e);
+                    LOG.ignore(e);
+                }
+                else
+                {
+                    if (_connector.isStarted())
+                        LOG.warn(String.valueOf(_request.getHttpURI()), e);
                     else
-                        LOG.warn(String.valueOf(_uri), e);
-                    _state.error(e);
-                    _request.setHandled(true);
+                        LOG.debug(String.valueOf(_request.getHttpURI()), e);
                     handleException(e);
                 }
-                finally
-                {
-                    if (error && _state.isAsyncStarted())
-                        _state.errorComplete();
-                    action = _state.unhandle();
-                }
             }
-
-            if (action==Action.COMPLETE)
+            finally
             {
-                try
-                {
-                    _state.completed();
-
-                    if (!_response.isCommitted() && !_request.isHandled())
-                    {
-                        _response.sendError(404);
-                    }
-                    else
-                    {
-                        // Complete generating the response
-                        _response.closeOutput();
-                    }
-                }
-                catch(EofException|ClosedChannelException e)
-                {
-                    LOG.debug(e);
-                }
-                catch(Exception e)
-                {
-                    LOG.warn("complete failed",e);
-                }
-                finally
-                {
-                    _request.setHandled(true);
-                    _transport.completed();
-                }
+                _request.setDispatcherType(null);
             }
-        }
-        finally
-        {
-            setCurrentHttpChannel(last);
-            if (threadName != null && LOG.isDebugEnabled())
-                Thread.currentThread().setName(threadName);
+
+            action = _state.unhandle();
         }
 
         if (LOG.isDebugEnabled())
             LOG.debug("{} handle exit, result {}", this, action);
 
-        return action!=Action.WAIT;
+        boolean suspended=action==Action.WAIT;
+        return !suspended;
     }
 
     /**
@@ -461,47 +473,76 @@
      */
     protected void handleException(Throwable x)
     {
-        try
+        if (_state.isAsyncStarted())
         {
-            _request.setAttribute(RequestDispatcher.ERROR_EXCEPTION,x);
-            _request.setAttribute(RequestDispatcher.ERROR_EXCEPTION_TYPE,x.getClass());
-            if (_state.isSuspended())
+            // Handle exception via AsyncListener onError
+            Throwable root = _state.getAsyncContextEvent().getThrowable();
+            if (root==null)
             {
-                HttpFields fields = new HttpFields();
-                fields.add(HttpHeader.CONNECTION,HttpHeaderValue.CLOSE);
-                ResponseInfo info = new ResponseInfo(_request.getHttpVersion(), fields, 0, HttpStatus.INTERNAL_SERVER_ERROR_500, null, _request.isHead());
-                boolean committed = sendResponse(info, null, true);
-                if (!committed)
-                    LOG.warn("Could not send response error 500: "+x);
-                _request.getAsyncContext().complete();
-            }
-            else if (isCommitted())
-            {
-                abort();
-                if (!(x instanceof EofException))
-                    LOG.warn("Could not send response error 500: "+x);
+                _state.error(x);
             }
             else
             {
-                _response.setHeader(HttpHeader.CONNECTION.asString(),HttpHeaderValue.CLOSE.asString());
-                _response.sendError(500, x.getMessage());
+                // TODO Can this happen?  Should this just be ISE???
+                // We've already processed an error before!
+                root.addSuppressed(x);
+                LOG.warn("Error while handling async error: ", root);
+                abort(x);
+                _state.errorComplete();
             }
         }
-        catch (IOException e)
+        else
         {
-            // We tried our best, just log
-            LOG.debug("Could not commit response error 500", e);
+            try
+            {
+                // Handle error normally
+                _request.setHandled(true);
+                _request.setAttribute(RequestDispatcher.ERROR_EXCEPTION, x);
+                _request.setAttribute(RequestDispatcher.ERROR_EXCEPTION_TYPE, x.getClass());
+
+                if (isCommitted())
+                {
+                    abort(x);
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Could not send response error 500, already committed", x);
+                }
+                else
+                {
+                    _response.setHeader(HttpHeader.CONNECTION.asString(), HttpHeaderValue.CLOSE.asString());
+
+                    if (x instanceof BadMessageException)
+                    {
+                        BadMessageException bme = (BadMessageException)x;
+                        _response.sendError(bme.getCode(), bme.getReason());
+                    }
+                    else if (x instanceof UnavailableException)
+                    {
+                        if (((UnavailableException)x).isPermanent())
+                            _response.sendError(HttpStatus.NOT_FOUND_404);
+                        else
+                            _response.sendError(HttpStatus.SERVICE_UNAVAILABLE_503);
+                    }
+                    else
+                        _response.sendError(HttpStatus.INTERNAL_SERVER_ERROR_500);
+                }
+            }
+            catch (Throwable e)
+            {
+                abort(e);
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Could not commit response error 500", e);
+            }
         }
     }
 
     public boolean isExpecting100Continue()
     {
-        return _expect100Continue;
+        return false;
     }
 
     public boolean isExpecting102Processing()
     {
-        return _expect102Processing;
+        return false;
     }
 
     @Override
@@ -513,215 +554,56 @@
                 _requests,
                 _committed.get(),
                 _state.getState(),
-                _uri);
+                _request.getHttpURI());
     }
 
-    @Override
-    public void proxied(String protocol, String sAddr, String dAddr, int sPort, int dPort)
-    {
-        _request.setAttribute("PROXY", protocol);
-        _request.setServerName(sAddr);
-        _request.setServerPort(dPort);
-        _request.setRemoteAddr(InetSocketAddress.createUnresolved(sAddr,sPort));
-    }
-
-    @Override
-    public boolean startRequest(HttpMethod httpMethod, String method, ByteBuffer uri, HttpVersion version)
-    {
-        _expect = false;
-        _expect100Continue = false;
-        _expect102Processing = false;
-
-        _request.setTimeStamp(System.currentTimeMillis());
-        _request.setMethod(httpMethod, method);
-
-        if (httpMethod == HttpMethod.CONNECT)
-            _uri.parseConnect(uri.array(),uri.arrayOffset()+uri.position(),uri.remaining());
-        else
-            _uri.parse(uri.array(),uri.arrayOffset()+uri.position(),uri.remaining());
-        _request.setUri(_uri);
-
-        String path;
-        try
-        {
-            path = _uri.getDecodedPath();
-        }
-        catch (Exception e)
-        {
-            LOG.warn("Failed UTF-8 decode for request path, trying ISO-8859-1");
-            LOG.ignore(e);
-            path = _uri.getDecodedPath(StandardCharsets.ISO_8859_1);
-        }
-
-        String info = URIUtil.canonicalPath(path);
-
-        if (info == null)
-        {
-            if( path==null && _uri.getScheme()!=null &&_uri.getHost()!=null)
-            {
-                info = "/";
-                _request.setRequestURI("");
-            }
-            else
-            {
-                badMessage(400,null);
-                return true;
-            }
-        }
-        _request.setPathInfo(info);
-        _version = version == null ? HttpVersion.HTTP_0_9 : version;
-        _request.setHttpVersion(_version);
-
-        return false;
-    }
-
-    @Override
-    public boolean parsedHeader(HttpField field)
-    {
-        HttpHeader header=field.getHeader();
-        String value=field.getValue();
-        if (value == null)
-            value = "";
-        if (header != null)
-        {
-            switch (header)
-            {
-                case EXPECT:
-                    if (_version.getVersion()>=HttpVersion.HTTP_1_1.getVersion())
-                    {
-                        HttpHeaderValue expect = HttpHeaderValue.CACHE.get(value);
-                        switch (expect == null ? HttpHeaderValue.UNKNOWN : expect)
-                        {
-                            case CONTINUE:
-                                _expect100Continue = true;
-                                break;
-
-                            case PROCESSING:
-                                _expect102Processing = true;
-                                break;
-
-                            default:
-                                String[] values = value.split(",");
-                                for (int i = 0; i < values.length; i++)
-                                {
-                                    expect = HttpHeaderValue.CACHE.get(values[i].trim());
-                                    if (expect == null)
-                                        _expect = true;
-                                    else
-                                    {
-                                        switch (expect)
-                                        {
-                                            case CONTINUE:
-                                                _expect100Continue = true;
-                                                break;
-                                            case PROCESSING:
-                                                _expect102Processing = true;
-                                                break;
-                                            default:
-                                                _expect = true;
-                                        }
-                                    }
-                                }
-                        }
-                    }
-                    break;
-
-                case CONTENT_TYPE:
-                    MimeTypes.Type mime = MimeTypes.CACHE.get(value);
-                    String charset = (mime == null || mime.getCharset() == null) ? MimeTypes.getCharsetFromContentType(value) : mime.getCharset().toString();
-                    if (charset != null)
-                        _request.setCharacterEncodingUnchecked(charset);
-                    break;
-                default:
-            }
-        }
-
-        if (field.getName()!=null)
-            _request.getHttpFields().add(field);
-        return false;
-    }
-
-    @Override
-    public boolean parsedHostHeader(String host, int port)
-    {
-        if (_uri.getHost()==null)
-        {
-            _request.setServerName(host);
-            _request.setServerPort(port);
-        }
-        return false;
-    }
-
-    @Override
-    public boolean headerComplete()
+    public void onRequest(MetaData.Request request)
     {
         _requests.incrementAndGet();
+        _request.setTimeStamp(System.currentTimeMillis());
         HttpFields fields = _response.getHttpFields();
-        switch (_version)
-        {
-            case HTTP_0_9:
-                break;
+        if (_configuration.getSendDateHeader() && !fields.contains(HttpHeader.DATE))
+            fields.put(_connector.getServer().getDateField());
 
-            case HTTP_1_0:
-                if (_configuration.getSendDateHeader() && !fields.contains(HttpHeader.DATE))
-                    _response.getHttpFields().add(_connector.getServer().getDateField());
-                break;
-
-            case HTTP_1_1:
-                if (_configuration.getSendDateHeader() && !fields.contains(HttpHeader.DATE))
-                    _response.getHttpFields().add(_connector.getServer().getDateField());
-
-                if (_expect)
-                {
-                    badMessage(HttpStatus.EXPECTATION_FAILED_417,null);
-                    return true;
-                }
-
-                break;
-
-            default:
-                throw new IllegalStateException();
-        }
-
-        return true;
+        _request.setMetaData(request);
     }
 
-    @Override
-    public boolean content(T item)
+    public boolean onContent(HttpInput.Content content)
     {
         if (LOG.isDebugEnabled())
-            LOG.debug("{} content {}", this, item);
-        @SuppressWarnings("unchecked")
-        HttpInput<T> input = (HttpInput<T>)_request.getHttpInput();
-        input.content(item);
+            LOG.debug("{} content {}", this, content);
 
-        return false;
+        return _request.getHttpInput().addContent(content);
     }
 
-    @Override
-    public boolean messageComplete()
+    public boolean onRequestComplete()
     {
         if (LOG.isDebugEnabled())
-            LOG.debug("{} messageComplete", this);
-        _request.getHttpInput().messageComplete();
-        return true;
+            LOG.debug("{} onRequestComplete", this);
+        return _request.getHttpInput().eof();
     }
 
-    @Override
-    public void earlyEOF()
+    public void onCompleted()
     {
-        _request.getHttpInput().earlyEOF();
+        if (_requestLog!=null )
+            _requestLog.log(_request, _response);
+
+        _transport.onCompleted();
     }
 
-    @Override
-    public void badMessage(int status, String reason)
+    public boolean onEarlyEOF()
+    {
+        return _request.getHttpInput().earlyEOF();
+    }
+
+    public void onBadMessage(int status, String reason)
     {
         if (status < 400 || status > 599)
             status = HttpStatus.BAD_REQUEST_400;
 
         try
         {
-            if (_state.handling()==Action.REQUEST_DISPATCH)
+            if (_state.handling()==Action.DISPATCH)
             {
                 ByteBuffer content=null;
                 HttpFields fields=new HttpFields();
@@ -730,7 +612,7 @@
                 if (handler!=null)
                     content=handler.badMessageError(status,reason,fields);
 
-                sendResponse(new ResponseInfo(HttpVersion.HTTP_1_1,fields,0,status,reason,false),content ,true);
+                sendResponse(new MetaData.Response(HttpVersion.HTTP_1_1,status,reason,fields,0),content ,true);
             }
         }
         catch (IOException e)
@@ -739,33 +621,36 @@
         }
         finally
         {
+            // TODO: review whether it's the right state to check.
             if (_state.unhandle()==Action.COMPLETE)
-                _state.completed();
+                _state.onComplete();
             else
-                throw new IllegalStateException();
+                throw new IllegalStateException(); // TODO: don't throw from finally blocks !
+            onCompleted();
         }
     }
 
-    protected boolean sendResponse(ResponseInfo info, ByteBuffer content, boolean complete, final Callback callback)
+    protected boolean sendResponse(MetaData.Response info, ByteBuffer content, boolean complete, final Callback callback)
     {
         boolean committing = _committed.compareAndSet(false, true);
         if (committing)
         {
             // We need an info to commit
             if (info==null)
-                info = _response.newResponseInfo();
+                info = _response.newResponseMetaData();
+            commit(info);
 
             // wrap callback to process 100 responses
             final int status=info.getStatus();
             final Callback committed = (status<200&&status>=100)?new Commit100Callback(callback):new CommitCallback(callback);
 
             // committing write
-            _transport.send(info, content, complete, committed);
+            _transport.send(info, _request.isHead(), content, complete, committed);
         }
         else if (info==null)
         {
             // This is a normal write
-            _transport.send(content, complete, callback);
+            _transport.send(null,_request.isHead(), content, complete, callback);
         }
         else
         {
@@ -774,7 +659,7 @@
         return committing;
     }
 
-    protected boolean sendResponse(ResponseInfo info, ByteBuffer content, boolean complete) throws IOException
+    protected boolean sendResponse(MetaData.Response info, ByteBuffer content, boolean complete) throws IOException
     {
         try(Blocker blocker = _response.getHttpOutput().acquireWriteBlockingCallback())
         {
@@ -782,6 +667,20 @@
             blocker.block();
             return committing;
         }
+        catch (Throwable failure)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug(failure);
+            abort(failure);
+            throw failure;
+        }
+    }
+
+    protected void commit (MetaData.Response info)
+    {
+        _committedMetaData=info;
+        if (LOG.isDebugEnabled())
+            LOG.debug("Commit {} to {}",info,this);
     }
 
     public boolean isCommitted()
@@ -791,16 +690,23 @@
 
     /**
      * <p>Non-Blocking write, committing the response if needed.</p>
-     *
+     * Called as last link in HttpOutput.Filter chain
      * @param content  the content buffer to write
      * @param complete whether the content is complete for the response
      * @param callback Callback when complete or failed
      */
-    protected void write(ByteBuffer content, boolean complete, Callback callback)
+    @Override
+    public void write(ByteBuffer content, boolean complete, Callback callback)
     {
+        _written+=BufferUtil.length(content);
         sendResponse(null,content,complete,callback);
     }
 
+    public HttpOutput.Interceptor getNextInterceptor()
+    {
+        return null;
+    }
+
     protected void execute(Runnable task)
     {
         _connector.getExecutor().execute(task);
@@ -811,7 +717,6 @@
         return _connector.getScheduler();
     }
 
-    /* ------------------------------------------------------------ */
     /**
      * @return true if the HttpChannel can efficiently use direct buffer (typically this means it is not over SSL or a multiplexed protocol)
      */
@@ -821,12 +726,16 @@
     }
 
     /**
-     * If a write or similar to this channel fails this method should be called. The standard implementation
-     * is to call {@link HttpTransport#abort()}
+     * If a write or similar operation to this channel fails,
+     * then this method should be called.
+     * <p>
+     * The standard implementation calls {@link HttpTransport#abort(Throwable)}.
+     *
+     * @param failure the failure that caused the abort.
      */
-    public void abort()
+    public void abort(Throwable failure)
     {
-        _transport.abort();
+        _transport.abort(failure);
     }
 
     private class CommitCallback implements Callback
@@ -839,6 +748,12 @@
         }
 
         @Override
+        public boolean isNonBlocking()
+        {
+            return _callback.isNonBlocking();
+        }
+
+        @Override
         public void succeeded()
         {
             _callback.succeeded();
@@ -847,16 +762,17 @@
         @Override
         public void failed(final Throwable x)
         {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Commit failed", x);
+
             if (x instanceof EofException || x instanceof ClosedChannelException)
             {
-                LOG.debug(x);
                 _callback.failed(x);
                 _response.getHttpOutput().closed();
             }
             else
             {
-                LOG.warn("Commit failed",x);
-                _transport.send(HttpGenerator.RESPONSE_500_INFO,null,true,new Callback()
+                _transport.send(HttpGenerator.RESPONSE_500_INFO, false, null, true, new Callback()
                 {
                     @Override
                     public void succeeded()
@@ -868,7 +784,6 @@
                     @Override
                     public void failed(Throwable th)
                     {
-                        LOG.ignore(th);
                         _callback.failed(x);
                         _response.getHttpOutput().closed();
                     }
@@ -895,4 +810,5 @@
 
     }
 
+
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelOverHttp.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelOverHttp.java
new file mode 100644
index 0000000..8204b8b
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelOverHttp.java
@@ -0,0 +1,451 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.http.BadMessageException;
+import org.eclipse.jetty.http.HostPortHttpField;
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpGenerator;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpHeaderValue;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpParser;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.http.HttpURI;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.io.Connection;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+/**
+ * A HttpChannel customized to be transported over the HTTP/1 protocol
+ */
+class HttpChannelOverHttp extends HttpChannel implements HttpParser.RequestHandler
+{
+    private static final Logger LOG = Log.getLogger(HttpChannelOverHttp.class);
+    private final static HttpField PREAMBLE_UPGRADE_H2C = new HttpField(HttpHeader.UPGRADE,"h2c");
+
+    private final HttpFields _fields = new HttpFields();
+    private final MetaData.Request _metadata = new MetaData.Request(_fields);
+    private final HttpConnection _httpConnection;
+    private HttpField _connection;
+    private HttpField _upgrade = null;
+    private boolean _delayedForContent;
+    private boolean _unknownExpectation = false;
+    private boolean _expect100Continue = false;
+    private boolean _expect102Processing = false;
+
+
+    public HttpChannelOverHttp(HttpConnection httpConnection, Connector connector, HttpConfiguration config, EndPoint endPoint, HttpTransport transport)
+    {
+        super(connector,config,endPoint,transport);
+        _httpConnection = httpConnection;
+        _metadata.setURI(new HttpURI());
+    }
+
+    @Override
+    protected HttpInput newHttpInput(HttpChannelState state)
+    {
+        return new HttpInputOverHTTP(state);
+    }
+
+    @Override
+    public void recycle()
+    {
+        super.recycle();
+        _unknownExpectation = false;
+        _expect100Continue = false;
+        _expect102Processing = false;
+        _metadata.recycle();
+        _connection=null;
+        _fields.clear();
+        _upgrade=null;
+    }
+
+    @Override
+    public boolean isExpecting100Continue()
+    {
+        return _expect100Continue;
+    }
+
+    @Override
+    public boolean isExpecting102Processing()
+    {
+        return _expect102Processing;
+    }
+
+    @Override
+    public boolean startRequest(String method, String uri, HttpVersion version)
+    {
+        _metadata.setMethod(method);
+        if (HttpMethod.CONNECT.is(method))
+            _metadata.getURI().parseConnect(uri);
+        else
+            _metadata.getURI().parse(uri);
+        _metadata.setHttpVersion(version);
+        _unknownExpectation = false;
+        _expect100Continue = false;
+        _expect102Processing = false;
+        return false;
+    }
+
+    @Override
+    public void parsedHeader(HttpField field)
+    {
+        HttpHeader header=field.getHeader();
+        String value=field.getValue();
+        if (header!=null)
+        {
+            switch(header)
+            {
+                case CONNECTION:
+                    _connection=field;
+                    break;
+
+                case HOST:
+                    if (!_metadata.getURI().isAbsolute() && field instanceof HostPortHttpField)
+                    {
+                        HostPortHttpField hp = (HostPortHttpField)field;
+                        _metadata.getURI().setAuthority(hp.getHost(),hp.getPort());
+                    }
+                    break;
+
+                case EXPECT:
+                {
+                    if (_metadata.getVersion()==HttpVersion.HTTP_1_1)
+                    {
+                        HttpHeaderValue expect = HttpHeaderValue.CACHE.get(value);
+                        switch (expect == null ? HttpHeaderValue.UNKNOWN : expect)
+                        {
+                            case CONTINUE:
+                                _expect100Continue = true;
+                                break;
+
+                            case PROCESSING:
+                                _expect102Processing = true;
+                                break;
+
+                            default:
+                                String[] values = field.getValues();
+                                for (int i = 0; values != null && i < values.length; i++)
+                                {
+                                    expect = HttpHeaderValue.CACHE.get(values[i].trim());
+                                    if (expect == null)
+                                        _unknownExpectation = true;
+                                    else
+                                    {
+                                        switch (expect)
+                                        {
+                                            case CONTINUE:
+                                                _expect100Continue = true;
+                                                break;
+                                            case PROCESSING:
+                                                _expect102Processing = true;
+                                                break;
+                                            default:
+                                                _unknownExpectation = true;
+                                        }
+                                    }
+                                }
+                        }
+                    }
+                    break;
+                }
+
+                case UPGRADE:
+                    _upgrade=field;
+                    break;
+
+                default:
+                    break;
+            }
+        }
+        _fields.add(field);
+    }
+
+    /**
+     * If the associated response has the Expect header set to 100 Continue,
+     * then accessing the input stream indicates that the handler/servlet
+     * is ready for the request body and thus a 100 Continue response is sent.
+     *
+     * @throws IOException if the InputStream cannot be created
+     */
+    @Override
+    public void continue100(int available) throws IOException
+    {
+        // If the client is expecting 100 CONTINUE, then send it now.
+        // TODO: consider using an AtomicBoolean ?
+        if (isExpecting100Continue())
+        {
+            _expect100Continue = false;
+
+            // is content missing?
+            if (available == 0)
+            {
+                if (getResponse().isCommitted())
+                    throw new IOException("Committed before 100 Continues");
+
+                boolean committed = sendResponse(HttpGenerator.CONTINUE_100_INFO, null, false);
+                if (!committed)
+                    throw new IOException("Concurrent commit while trying to send 100-Continue");
+            }
+        }
+    }
+
+    @Override
+    public void earlyEOF()
+    {
+        // If we have no request yet, just close
+        if (_metadata.getMethod()==null)
+            _httpConnection.close();
+        else
+            onEarlyEOF();
+    }
+
+    @Override
+    public boolean content(ByteBuffer content)
+    {
+        HttpInput.Content c = _httpConnection.newContent(content);
+        boolean handle = onContent(c) || _delayedForContent;
+        _delayedForContent=false;
+        return handle;
+    }
+
+    public void asyncReadFillInterested()
+    {
+        _httpConnection.asyncReadFillInterested();
+    }
+
+    @Override
+    public void badMessage(int status, String reason)
+    {
+        _httpConnection.getGenerator().setPersistent(false);
+        try
+        {
+            // Need to call onRequest, so RequestLog can reports as much as possible
+            onRequest(_metadata);
+        }
+        catch (Exception e)
+        {
+            LOG.ignore(e);
+        }
+
+        onBadMessage(status,reason);
+    }
+
+    @Override
+    public boolean headerComplete()
+    {
+        boolean persistent;
+
+        switch (_metadata.getVersion())
+        {
+            case HTTP_1_0:
+            {
+                if (getHttpConfiguration().isPersistentConnectionsEnabled())
+                {
+                    if (_connection!=null)
+                    {
+                        if (_connection.contains(HttpHeaderValue.KEEP_ALIVE.asString()))
+                            persistent=true;
+                        else
+                            persistent=_fields.contains(HttpHeader.CONNECTION, HttpHeaderValue.KEEP_ALIVE.asString());
+                    }
+                    else
+                        persistent=false;
+                }
+                else
+                    persistent=false;
+
+                if (!persistent)
+                    persistent = HttpMethod.CONNECT.is(_metadata.getMethod());
+                if (persistent)
+                    getResponse().getHttpFields().add(HttpHeader.CONNECTION, HttpHeaderValue.KEEP_ALIVE);
+
+                break;
+            }
+
+            case HTTP_1_1:
+            {
+                if (_unknownExpectation)
+                {
+                    badMessage(HttpStatus.EXPECTATION_FAILED_417,null);
+                    return false;
+                }
+
+                if (getHttpConfiguration().isPersistentConnectionsEnabled())
+                {
+                    if (_connection!=null)
+                    {
+                        if (_connection.contains(HttpHeaderValue.CLOSE.asString()))
+                            persistent=false;
+                        else
+                            persistent=!_fields.contains(HttpHeader.CONNECTION, HttpHeaderValue.CLOSE.asString()); // handle multiple connection fields
+                    }
+                    else
+                        persistent=true;
+                }
+                else
+                    persistent=false;
+
+                if (!persistent)
+                    persistent = HttpMethod.CONNECT.is(_metadata.getMethod());
+                if (!persistent)
+                    getResponse().getHttpFields().add(HttpHeader.CONNECTION, HttpHeaderValue.CLOSE);
+
+                if (_upgrade!=null && upgrade())
+                    return true;
+
+                break;
+            }
+
+            case HTTP_2:
+            {
+                // Allow direct "upgrade" to HTTP_2_0 only if the connector supports h2, but not protocol negotiation
+                _upgrade=PREAMBLE_UPGRADE_H2C;
+
+                if (HttpMethod.PRI.is(_metadata.getMethod()) &&
+                    "*".equals(_metadata.getURI().toString()) &&
+                    _fields.size()==0 &&
+                    upgrade())
+                    return false;
+
+                badMessage(HttpStatus.UPGRADE_REQUIRED_426,null);
+                return false;
+            }
+
+            default:
+            {
+                throw new IllegalStateException();
+            }
+        }
+
+        if (!persistent)
+            _httpConnection.getGenerator().setPersistent(false);
+
+        onRequest(_metadata);
+
+        // Should we delay dispatch until we have some content?
+        // We should not delay if there is no content expect or client is expecting 100 or the response is already committed or the request buffer already has something in it to parse
+        _delayedForContent =  (getHttpConfiguration().isDelayDispatchUntilContent() && _httpConnection.getParser().getContentLength()>0 && !isExpecting100Continue() && !isCommitted() && _httpConnection.isRequestBufferEmpty());
+
+        return !_delayedForContent;
+    }
+
+
+    /**
+     * <p>Attempts to perform a HTTP/1.1 upgrade.</p>
+     * <p>The upgrade looks up a {@link ConnectionFactory.Upgrading} from the connector
+     * matching the protocol specified in the {@code Upgrade} header.</p>
+     * <p>The upgrade may succeed, be ignored (which can allow a later handler to implement)
+     * or fail with a {@link BadMessageException}.</p>
+     * @return true if the upgrade was performed, false if it was ignored
+     * @throws BadMessageException if the upgrade failed
+     */
+    private boolean upgrade() throws BadMessageException
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("upgrade {} {}",this,_upgrade);
+
+        if (_upgrade!=PREAMBLE_UPGRADE_H2C && (_connection==null || !_connection.getValue().contains("Upgrade")))
+            throw new BadMessageException(HttpStatus.BAD_REQUEST_400);
+
+        // Find the upgrade factory
+        ConnectionFactory.Upgrading factory=null;
+        for (ConnectionFactory f : getConnector().getConnectionFactories())
+        {
+            if (f instanceof ConnectionFactory.Upgrading)
+            {
+                if (f.getProtocols().contains(_upgrade.getValue()))
+                {
+                    factory=(ConnectionFactory.Upgrading)f;
+                    break;
+                }
+            }
+        }
+
+        if (factory==null)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("No factory for {} in {}",_upgrade,getConnector());
+            return false;
+        }
+
+        // Create new connection
+        HttpFields response101 = new HttpFields();
+        Connection upgrade_connection = factory.upgradeConnection(getConnector(),getEndPoint(),_metadata,response101);
+        if (upgrade_connection==null)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Upgrade ignored for {} by {}",_upgrade,factory);
+            return false;
+        }
+
+        // Send 101 if needed
+        try
+        {
+            if (_upgrade!=PREAMBLE_UPGRADE_H2C)
+                sendResponse(new MetaData.Response(HttpVersion.HTTP_1_1,HttpStatus.SWITCHING_PROTOCOLS_101,response101,0),null,true);
+        }
+        catch(IOException e)
+        {
+            throw new BadMessageException(HttpStatus.INTERNAL_SERVER_ERROR_500,null,e);
+        }
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("Upgrade from {} to {}", getEndPoint().getConnection(),upgrade_connection);
+        getRequest().setAttribute(HttpConnection.UPGRADE_CONNECTION_ATTRIBUTE,upgrade_connection);
+        getResponse().setStatus(101);
+        getHttpTransport().onCompleted();
+        return true;
+    }
+
+    @Override
+    protected void handleException(Throwable x)
+    {
+        _httpConnection.getGenerator().setPersistent(false);
+        super.handleException(x);
+    }
+
+    @Override
+    public void abort(Throwable failure)
+    {
+        super.abort(failure);
+        _httpConnection.getGenerator().setPersistent(false);
+    }
+
+    @Override
+    public boolean messageComplete()
+    {
+        return onRequestComplete();
+    }
+
+    @Override
+    public int getHeaderCacheSize()
+    {
+        return getHttpConfiguration().getHeaderCacheSize();
+    }
+}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelState.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelState.java
index 078a710..8a2b1cb 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelState.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelState.java
@@ -21,6 +21,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
 import javax.servlet.AsyncListener;
 import javax.servlet.RequestDispatcher;
@@ -31,6 +32,7 @@
 import org.eclipse.jetty.server.handler.ContextHandler.Context;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.Locker;
 import org.eclipse.jetty.util.thread.Scheduler;
 
 /**
@@ -42,17 +44,18 @@
 
     private final static long DEFAULT_TIMEOUT=Long.getLong("org.eclipse.jetty.server.HttpChannelState.DEFAULT_TIMEOUT",30000L);
 
-    /** The dispatched state of the HttpChannel, used to control the overall livecycle
+    /**
+     * The dispatched state of the HttpChannel, used to control the overall lifecycle
      */
     public enum State
     {
         IDLE,             // Idle request
         DISPATCHED,       // Request dispatched to filter/servlet
-        ASYNC_WAIT,       // Suspended and parked
-        ASYNC_WOKEN,      // A thread has been dispatch to handle from ASYNCWAIT
-        ASYNC_IO,         // Has been dispatched for async IO
-        COMPLETING,       // Request is completable
-        COMPLETED,        // Request is complete
+        ASYNC_WAIT,       // Suspended and waiting
+        ASYNC_WOKEN,      // Dispatch to handle from ASYNC_WAIT
+        ASYNC_IO,         // Dispatched for async IO
+        COMPLETING,       // Response is completable
+        COMPLETED,        // Response is completed
         UPGRADED          // Request upgraded the connection
     }
 
@@ -61,42 +64,48 @@
      */
     public enum Action
     {
-        REQUEST_DISPATCH, // handle a normal request dispatch  
+        DISPATCH,         // handle a normal request dispatch
         ASYNC_DISPATCH,   // handle an async request dispatch
-        ASYNC_EXPIRED,    // handle an async timeout
+        ERROR_DISPATCH,   // handle a normal error
+        ASYNC_ERROR,      // handle an async error
         WRITE_CALLBACK,   // handle an IO write callback
         READ_CALLBACK,    // handle an IO read callback
-        WAIT,             // Wait for further events 
-        COMPLETE          // Complete the channel
+        COMPLETE,         // Complete the response
+        TERMINATED,       // No further actions
+        WAIT,             // Wait for further events
     }
-    
+
     /**
-     * The state of the servlet async API.  This can lead or follow the 
+     * The state of the servlet async API.  This can lead or follow the
      * channel dispatch state and also includes reasons such as expired,
      * dispatched or completed.
      */
     public enum Async
     {
-        STARTED,
-        DISPATCH,
-        COMPLETE,
-        EXPIRING,
-        EXPIRED
+        STARTED,          // AsyncContext.startAsync() has been called
+        DISPATCH,         //
+        COMPLETE,         // AsyncContext.complete() has been called
+        EXPIRING,         // AsyncContext timeout just happened
+        EXPIRED,          // AsyncContext timeout has been processed
+        ERRORING,         // An error just happened
+        ERRORED           // The error has been processed
     }
 
     private final boolean DEBUG=LOG.isDebugEnabled();
-    private final HttpChannel<?> _channel;
+    private final Locker _locker=new Locker();
+    private final HttpChannel _channel;
 
     private List<AsyncListener> _asyncListeners;
     private State _state;
     private Async _async;
     private boolean _initial;
-    private boolean _asyncRead;
-    private boolean _asyncWrite;
+    private boolean _asyncReadPossible;
+    private boolean _asyncReadUnready;
+    private boolean _asyncWrite; // TODO refactor same as read
     private long _timeoutMs=DEFAULT_TIMEOUT;
     private AsyncContextEvent _event;
 
-    protected HttpChannelState(HttpChannel<?> channel)
+    protected HttpChannelState(HttpChannel channel)
     {
         _channel=channel;
         _state=State.IDLE;
@@ -106,7 +115,7 @@
 
     public State getState()
     {
-        synchronized(this)
+        try(Locker.Lock lock= _locker.lock())
         {
             return _state;
         }
@@ -114,7 +123,7 @@
 
     public void addListener(AsyncListener listener)
     {
-        synchronized(this)
+        try(Locker.Lock lock= _locker.lock())
         {
             if (_asyncListeners==null)
                 _asyncListeners=new ArrayList<>();
@@ -124,7 +133,7 @@
 
     public void setTimeout(long ms)
     {
-        synchronized(this)
+        try(Locker.Lock lock= _locker.lock())
         {
             _timeoutMs=ms;
         }
@@ -132,7 +141,7 @@
 
     public long getTimeout()
     {
-        synchronized(this)
+        try(Locker.Lock lock= _locker.lock())
         {
             return _timeoutMs;
         }
@@ -140,7 +149,7 @@
 
     public AsyncContextEvent getAsyncContextEvent()
     {
-        synchronized(this)
+        try(Locker.Lock lock= _locker.lock())
         {
             return _event;
         }
@@ -149,17 +158,24 @@
     @Override
     public String toString()
     {
-        synchronized (this)
+        try(Locker.Lock lock= _locker.lock())
         {
-            return String.format("%s@%x{s=%s i=%b a=%s}",getClass().getSimpleName(),hashCode(),_state,_initial,_async);
+            return String.format("%s@%x{s=%s a=%s i=%b r=%s w=%b}",getClass().getSimpleName(),hashCode(),_state,_async,_initial,
+                    _asyncReadPossible?(_asyncReadUnready?"PU":"P!U"):(_asyncReadUnready?"!PU":"!P!U"),
+                    _asyncWrite);
         }
     }
 
+    private String getStatusStringLocked()
+    {
+        return String.format("s=%s i=%b a=%s",_state,_initial,_async);
+    }
+
     public String getStatusString()
     {
-        synchronized (this)
+        try(Locker.Lock lock= _locker.lock())
         {
-            return String.format("s=%s i=%b a=%s",_state,_initial,_async);
+            return getStatusStringLocked();
         }
     }
 
@@ -168,37 +184,38 @@
      */
     protected Action handling()
     {
-        synchronized (this)
+        if(DEBUG)
+            LOG.debug("{} handling {}",this,_state);
+        try(Locker.Lock lock= _locker.lock())
         {
-            if(DEBUG)
-                LOG.debug("{} handling {}",this,_state);
             switch(_state)
             {
                 case IDLE:
                     _initial=true;
                     _state=State.DISPATCHED;
-                    return Action.REQUEST_DISPATCH;
+                    return Action.DISPATCH;
 
                 case COMPLETING:
                     return Action.COMPLETE;
 
                 case COMPLETED:
-                    return Action.WAIT;
+                    return Action.TERMINATED;
 
                 case ASYNC_WOKEN:
-                    if (_asyncRead)
+                    if (_asyncReadPossible)
                     {
                         _state=State.ASYNC_IO;
-                        _asyncRead=false;
+                        _asyncReadUnready=false;
                         return Action.READ_CALLBACK;
                     }
+
                     if (_asyncWrite)
                     {
                         _state=State.ASYNC_IO;
                         _asyncWrite=false;
                         return Action.WRITE_CALLBACK;
                     }
-                    
+
                     if (_async!=null)
                     {
                         Async async=_async;
@@ -216,20 +233,27 @@
                             case EXPIRED:
                                 _state=State.DISPATCHED;
                                 _async=null;
-                                return Action.ASYNC_EXPIRED;
+                                return Action.ERROR_DISPATCH;
                             case STARTED:
-                                // TODO
-                                if (DEBUG)
-                                    LOG.debug("TODO Fix this double dispatch",new IllegalStateException(this
-                                            .getStatusString()));
                                 return Action.WAIT;
+                            case ERRORING:
+                                _state=State.DISPATCHED;
+                                return Action.ASYNC_ERROR;
+
+                            default:
+                                throw new IllegalStateException(getStatusStringLocked());
                         }
                     }
-                    
+
                     return Action.WAIT;
 
+                case ASYNC_IO:
+                case ASYNC_WAIT:
+                case DISPATCHED:
+                case UPGRADED:
                 default:
-                    throw new IllegalStateException(this.getStatusString());
+                    throw new IllegalStateException(getStatusStringLocked());
+
             }
         }
     }
@@ -237,40 +261,56 @@
     public void startAsync(AsyncContextEvent event)
     {
         final List<AsyncListener> lastAsyncListeners;
-        
-        synchronized (this)
+
+        try(Locker.Lock lock= _locker.lock())
         {
             if (_state!=State.DISPATCHED || _async!=null)
-                throw new IllegalStateException(this.getStatusString());
-            
+                throw new IllegalStateException(this.getStatusStringLocked());
+
             _async=Async.STARTED;
             _event=event;
             lastAsyncListeners=_asyncListeners;
-            _asyncListeners=null;
+            _asyncListeners=null;            
         }
 
         if (lastAsyncListeners!=null)
         {
-            for (AsyncListener listener : lastAsyncListeners)
+            Runnable callback=new Runnable()
             {
-                try
+                @Override
+                public void run()
                 {
-                    listener.onStartAsync(event);
+                    for (AsyncListener listener : lastAsyncListeners)
+                    {
+                        try
+                        {
+                            listener.onStartAsync(event);
+                        }
+                        catch(Exception e)
+                        {
+                            // TODO Async Dispatch Error
+                            LOG.warn(e);
+                        }
+                    }
                 }
-                catch(Exception e)
+                @Override
+                public String toString()
                 {
-                    LOG.warn(e);
+                    return "startAsync";
                 }
-            }
+            };
+                  
+            runInContext(event,callback);
         }
     }
 
     protected void error(Throwable th)
     {
-        synchronized (this)
+        try(Locker.Lock lock= _locker.lock())
         {
             if (_event!=null)
-                _event.setThrowable(th);
+                _event.addThrowable(th);
+            _async=Async.ERRORING;
         }
     }
 
@@ -283,32 +323,27 @@
      */
     protected Action unhandle()
     {
-        synchronized (this)
+        Action action;
+        AsyncContextEvent schedule_event=null;
+        boolean read_interested=false;
+
+        if(DEBUG)
+            LOG.debug("{} unhandle {}",this,_state);
+
+        try(Locker.Lock lock= _locker.lock())
         {
-            if(DEBUG)
-                LOG.debug("{} unhandle {}",this,_state);
-            
             switch(_state)
             {
+                case COMPLETING:
+                case COMPLETED:
+                    return Action.TERMINATED;
+
                 case DISPATCHED:
                 case ASYNC_IO:
                     break;
-                default:
-                    throw new IllegalStateException(this.getStatusString());
-            }
 
-            if (_asyncRead)
-            {
-                _state=State.ASYNC_IO;
-                _asyncRead=false;
-                return Action.READ_CALLBACK;
-            }
-            
-            if (_asyncWrite)
-            {
-                _asyncWrite=false;
-                _state=State.ASYNC_IO;
-                return Action.WRITE_CALLBACK;
+                default:
+                    throw new IllegalStateException(this.getStatusStringLocked());
             }
 
             if (_async!=null)
@@ -319,146 +354,257 @@
                     case COMPLETE:
                         _state=State.COMPLETING;
                         _async=null;
-                        return Action.COMPLETE;
+                        action=Action.COMPLETE;
+                        break;
+
                     case DISPATCH:
                         _state=State.DISPATCHED;
                         _async=null;
-                        return Action.ASYNC_DISPATCH;
+                        action=Action.ASYNC_DISPATCH;
+                        break;
+
                     case EXPIRED:
                         _state=State.DISPATCHED;
                         _async=null;
-                        return Action.ASYNC_EXPIRED;
-                    case EXPIRING:
+                        action = Action.ERROR_DISPATCH;
+                        break;
+
                     case STARTED:
-                        scheduleTimeout();
+                        if (_asyncReadUnready && _asyncReadPossible)
+                        {
+                            _state=State.ASYNC_IO;
+                            _asyncReadUnready=false;
+                            action = Action.READ_CALLBACK;
+                        }
+                        else if (_asyncWrite) // TODO refactor same as read
+                        {
+                            _asyncWrite=false;
+                            _state=State.ASYNC_IO;
+                            action=Action.WRITE_CALLBACK;
+                        }
+                        else
+                        {
+                            schedule_event=_event;
+                            read_interested=_asyncReadUnready;
+                            _state=State.ASYNC_WAIT;
+                            action=Action.WAIT;
+                        }
+                        break;
+
+                    case EXPIRING:
+                        schedule_event=_event;
                         _state=State.ASYNC_WAIT;
-                        return Action.WAIT;
+                        action=Action.WAIT;
+                        break;
+
+                    case ERRORING:
+                        _state=State.DISPATCHED;
+                        action=Action.ASYNC_ERROR;
+                        break;
+
+                    case ERRORED:
+                        _state=State.DISPATCHED;
+                        action=Action.ERROR_DISPATCH;
+                        _async=null;
+                        break;
+
+                    default:
+                        _state=State.COMPLETING;
+                        action=Action.COMPLETE;
+                        break;
                 }
             }
-            
-            _state=State.COMPLETING;
-            return Action.COMPLETE;
+            else
+            {
+                _state=State.COMPLETING;
+                action=Action.COMPLETE;
+            }
         }
+
+        if (schedule_event!=null)
+            scheduleTimeout(schedule_event);
+        if (read_interested)
+            _channel.asyncReadFillInterested();
+        return action;
     }
 
     public void dispatch(ServletContext context, String path)
     {
-        boolean dispatch;
-        synchronized (this)
+        boolean dispatch=false;
+        AsyncContextEvent event=null;
+        try(Locker.Lock lock= _locker.lock())
         {
-            if (_async!=Async.STARTED && _async!=Async.EXPIRING)
-                throw new IllegalStateException("AsyncContext#dispath "+this.getStatusString());
+            boolean started=false;
+            event=_event;
+            switch(_async)
+            {
+                case STARTED:
+                    started=true;
+                    break;
+                case EXPIRING:
+                case ERRORED:
+                    break;
+                default:
+                    throw new IllegalStateException(this.getStatusStringLocked());
+            }
             _async=Async.DISPATCH;
-            
+
             if (context!=null)
                 _event.setDispatchContext(context);
             if (path!=null)
                 _event.setDispatchPath(path);
-           
-            switch(_state)
+
+            if (started)
             {
-                case DISPATCHED:
-                case ASYNC_IO:
-                    dispatch=false;
-                    break;
-                case ASYNC_WAIT:
-                    _state=State.ASYNC_WOKEN;
-                    dispatch=true;
-                    break;
-                case ASYNC_WOKEN:
-                    dispatch=false;
-                    break;
-                default:
-                    LOG.warn("async dispatched when complete {}",this);
-                    dispatch=false;
-                    break;
+                switch(_state)
+                {
+                    case DISPATCHED:
+                    case ASYNC_IO:
+                    case ASYNC_WOKEN:
+                        break;
+                    case ASYNC_WAIT:
+                        _state=State.ASYNC_WOKEN;
+                        dispatch=true;
+                        break;
+                    default:
+                        LOG.warn("async dispatched when complete {}",this);
+                        break;
+                }
             }
         }
 
-        cancelTimeout();
+        cancelTimeout(event);
         if (dispatch)
             scheduleDispatch();
     }
 
-    protected void expired()
+    protected void onTimeout()
     {
-        final List<AsyncListener> aListeners;
+        final List<AsyncListener> listeners;
         AsyncContextEvent event;
-        synchronized (this)
+        try(Locker.Lock lock= _locker.lock())
         {
             if (_async!=Async.STARTED)
                 return;
             _async=Async.EXPIRING;
             event=_event;
-            aListeners=_asyncListeners;
+            listeners=_asyncListeners;
+
         }
 
-        if (aListeners!=null)
+        if (LOG.isDebugEnabled())
+            LOG.debug("Async timeout {}",this);
+
+        if (listeners!=null)
         {
-            for (AsyncListener listener : aListeners)
+            Runnable callback=new Runnable()
             {
-                try
+                @Override
+                public void run()
                 {
-                    listener.onTimeout(event);
+                    for (AsyncListener listener : listeners)
+                    {
+                        try
+                        {
+                            listener.onTimeout(event);
+                        }
+                        catch(Exception e)
+                        {
+                            LOG.debug(e);
+                            event.addThrowable(e);
+                            _channel.getRequest().setAttribute(RequestDispatcher.ERROR_EXCEPTION,event.getThrowable());
+                            break;
+                        }
+                    }
                 }
-                catch(Exception e)
+                @Override
+                public String toString()
                 {
-                    LOG.debug(e);
-                    event.setThrowable(e);
-                    _channel.getRequest().setAttribute(RequestDispatcher.ERROR_EXCEPTION,e);
-                    break;
+                    return "onTimeout";
                 }
-            }
+            };
+            
+            runInContext(event,callback);
         }
-        
+
         boolean dispatch=false;
-        synchronized (this)
+        try(Locker.Lock lock= _locker.lock())
         {
-            if (_async==Async.EXPIRING)
+            switch(_async)
             {
-                _async=Async.EXPIRED;
-                if (_state==State.ASYNC_WAIT)
-                {
-                    _state=State.ASYNC_WOKEN;
-                    dispatch=true;
-                }
+                case EXPIRING:
+                    if (event.getThrowable()==null)
+                    {
+                        _async=Async.EXPIRED;
+                        _event.addThrowable(new TimeoutException("Async API violation"));
+                    }
+                    else
+                    {
+                        _async=Async.ERRORING;
+                    }
+                    break;
+                    
+                case COMPLETE:
+                case DISPATCH:
+                    break;
+                    
+                default:
+                    throw new IllegalStateException();
+            }
+
+            if (_state==State.ASYNC_WAIT)
+            {
+                _state=State.ASYNC_WOKEN;
+                dispatch=true;
             }
         }
 
         if (dispatch)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Dispatch after async timeout {}",this);
             scheduleDispatch();
+        }
     }
 
     public void complete()
     {
         // just like resume, except don't set _dispatched=true;
         boolean handle=false;
-        synchronized (this)
+        AsyncContextEvent event=null;
+        try(Locker.Lock lock= _locker.lock())
         {
-            if (_async!=Async.STARTED && _async!=Async.EXPIRING)
-                throw new IllegalStateException(this.getStatusString());
+            boolean started=false;
+            event=_event;
+            
+            switch(_async)
+            {
+                case STARTED:
+                    started=true;
+                    break;
+                case EXPIRING:
+                case ERRORED:
+                    break;
+                default:
+                    throw new IllegalStateException(this.getStatusStringLocked());
+            }
             _async=Async.COMPLETE;
-            if (_state==State.ASYNC_WAIT)
+            
+            if (started && _state==State.ASYNC_WAIT)
             {
                 handle=true;
                 _state=State.ASYNC_WOKEN;
             }
         }
 
-        cancelTimeout();
+        cancelTimeout(event);
         if (handle)
-        {
-            ContextHandler handler=getContextHandler();
-            if (handler!=null)
-                handler.handle(_channel);
-            else
-                _channel.handle();
-        }
+            runInContext(event,_channel);
     }
 
     public void errorComplete()
     {
-        synchronized (this)
+        try(Locker.Lock lock= _locker.lock())
         {
             _async=Async.COMPLETE;
             _event.setDispatchContext(null);
@@ -468,22 +614,58 @@
         cancelTimeout();
     }
 
-    protected void completed()
+    protected void onError()
     {
         final List<AsyncListener> aListeners;
         final AsyncContextEvent event;
-        synchronized (this)
+
+        try(Locker.Lock lock= _locker.lock())
+        {
+            if (_state!=State.DISPATCHED/* || _async!=Async.ERRORING*/)
+                throw new IllegalStateException(this.getStatusStringLocked());
+
+            aListeners=_asyncListeners;
+            event=_event;
+            _async=Async.ERRORED;
+        }
+
+        if (event!=null && aListeners!=null)
+        {
+            event.getSuppliedRequest().setAttribute(RequestDispatcher.ERROR_EXCEPTION,event.getThrowable());
+            event.getSuppliedRequest().setAttribute(RequestDispatcher.ERROR_MESSAGE,event.getThrowable().getMessage());
+            for (AsyncListener listener : aListeners)
+            {
+                try
+                {
+                    listener.onError(event);
+                }
+                catch(Exception x)
+                {
+                    LOG.info("Exception while invoking listener " + listener, x);
+                }
+            }
+        }
+    }
+
+
+    protected void onComplete()
+    {
+        final List<AsyncListener> aListeners;
+        final AsyncContextEvent event;
+
+        try(Locker.Lock lock= _locker.lock())
         {
             switch(_state)
             {
                 case COMPLETING:
-                    _state=State.COMPLETED;
                     aListeners=_asyncListeners;
                     event=_event;
+                    _state=State.COMPLETED;
+                    _async=null;
                     break;
 
                 default:
-                    throw new IllegalStateException(this.getStatusString());
+                    throw new IllegalStateException(this.getStatusStringLocked());
             }
         }
 
@@ -491,41 +673,46 @@
         {
             if (aListeners!=null)
             {
-                if (event.getThrowable()!=null)
+                Runnable callback = new Runnable()
                 {
-                    event.getSuppliedRequest().setAttribute(RequestDispatcher.ERROR_EXCEPTION,event.getThrowable());
-                    event.getSuppliedRequest().setAttribute(RequestDispatcher.ERROR_MESSAGE,event.getThrowable().getMessage());
-                }
-
-                for (AsyncListener listener : aListeners)
-                {
-                    try
+                    @Override
+                    public void run()
                     {
-                        if (event.getThrowable()!=null)
-                            listener.onError(event);
-                        else
-                            listener.onComplete(event);
-                    }
-                    catch(Exception e)
+                        for (AsyncListener listener : aListeners)
+                        {
+                            try
+                            {
+                                listener.onComplete(event);
+                            }
+                            catch(Exception e)
+                            {
+                                LOG.warn(e);
+                            }
+                        }
+                    }    
+                    @Override
+                    public String toString()
                     {
-                        LOG.warn(e);
+                        return "onComplete";
                     }
-                }
+                };
+                
+                runInContext(event,callback);                
             }
-
             event.completed();
         }
     }
 
     protected void recycle()
     {
-        synchronized (this)
+        cancelTimeout();
+        try(Locker.Lock lock= _locker.lock())
         {
             switch(_state)
             {
                 case DISPATCHED:
                 case ASYNC_IO:
-                    throw new IllegalStateException(getStatusString());
+                    throw new IllegalStateException(getStatusStringLocked());
                 case UPGRADED:
                     return;
                 default:
@@ -535,17 +722,17 @@
             _state=State.IDLE;
             _async=null;
             _initial=true;
-            _asyncRead=false;
+            _asyncReadPossible=_asyncReadUnready=false;
             _asyncWrite=false;
             _timeoutMs=DEFAULT_TIMEOUT;
-            cancelTimeout();
             _event=null;
         }
     }
-    
+
     public void upgrade()
     {
-        synchronized (this)
+        cancelTimeout();
+        try(Locker.Lock lock= _locker.lock())
         {
             switch(_state)
             {
@@ -553,47 +740,58 @@
                 case COMPLETED:
                     break;
                 default:
-                    throw new IllegalStateException(getStatusString());
+                    throw new IllegalStateException(getStatusStringLocked());
             }
             _asyncListeners=null;
             _state=State.UPGRADED;
             _async=null;
             _initial=true;
-            _asyncRead=false;
+            _asyncReadPossible=_asyncReadUnready=false;
             _asyncWrite=false;
             _timeoutMs=DEFAULT_TIMEOUT;
-            cancelTimeout();
             _event=null;
         }
     }
 
-
     protected void scheduleDispatch()
     {
         _channel.execute(_channel);
     }
 
-    protected void scheduleTimeout()
+    protected void scheduleTimeout(AsyncContextEvent event)
     {
         Scheduler scheduler = _channel.getScheduler();
         if (scheduler!=null && _timeoutMs>0)
-            _event.setTimeoutTask(scheduler.schedule(_event,_timeoutMs,TimeUnit.MILLISECONDS));
+            event.setTimeoutTask(scheduler.schedule(event,_timeoutMs,TimeUnit.MILLISECONDS));
     }
 
     protected void cancelTimeout()
     {
         final AsyncContextEvent event;
-        synchronized (this)
-        { 
+        try(Locker.Lock lock= _locker.lock())
+        {
             event=_event;
         }
+        cancelTimeout(event);
+    }
+
+    protected void cancelTimeout(AsyncContextEvent event)
+    {
         if (event!=null)
             event.cancelTimeoutTask();
     }
+    
+    public boolean isIdle()
+    {
+        try(Locker.Lock lock= _locker.lock())
+        {
+            return _state==State.IDLE;
+        }
+    }
 
     public boolean isExpired()
     {
-        synchronized (this)
+        try(Locker.Lock lock= _locker.lock())
         {
             return _async==Async.EXPIRED;
         }
@@ -601,7 +799,7 @@
 
     public boolean isInitial()
     {
-        synchronized(this)
+        try(Locker.Lock lock= _locker.lock())
         {
             return _initial;
         }
@@ -609,7 +807,7 @@
 
     public boolean isSuspended()
     {
-        synchronized(this)
+        try(Locker.Lock lock= _locker.lock())
         {
             return _state==State.ASYNC_WAIT || _state==State.DISPATCHED && _async==Async.STARTED;
         }
@@ -617,7 +815,7 @@
 
     boolean isCompleting()
     {
-        synchronized (this)
+        try(Locker.Lock lock= _locker.lock())
         {
             return _state==State.COMPLETING;
         }
@@ -625,7 +823,7 @@
 
     boolean isCompleted()
     {
-        synchronized (this)
+        try(Locker.Lock lock= _locker.lock())
         {
             return _state == State.COMPLETED;
         }
@@ -633,8 +831,8 @@
 
     public boolean isAsyncStarted()
     {
-        synchronized (this)
-        {    
+        try(Locker.Lock lock= _locker.lock())
+        {
             if (_state==State.DISPATCHED)
                 return _async!=null;
             return _async==Async.STARTED || _async==Async.EXPIRING;
@@ -643,7 +841,7 @@
 
     public boolean isAsync()
     {
-        synchronized (this)
+        try(Locker.Lock lock= _locker.lock())
         {
             return !_initial || _async!=null;
         }
@@ -654,7 +852,7 @@
         return _channel.getRequest();
     }
 
-    public HttpChannel<?> getHttpChannel()
+    public HttpChannel getHttpChannel()
     {
         return _channel;
     }
@@ -662,11 +860,15 @@
     public ContextHandler getContextHandler()
     {
         final AsyncContextEvent event;
-        synchronized (this)
-        { 
+        try(Locker.Lock lock= _locker.lock())
+        {
             event=_event;
         }
-       
+        return getContextHandler(event);
+    }
+
+    ContextHandler getContextHandler(AsyncContextEvent event)
+    {
         if (event!=null)
         {
             Context context=((Context)event.getServletContext());
@@ -679,15 +881,29 @@
     public ServletResponse getServletResponse()
     {
         final AsyncContextEvent event;
-        synchronized (this)
-        { 
+        try(Locker.Lock lock= _locker.lock())
+        {
             event=_event;
         }
+        return getServletResponse(event);
+    }
+    
+    public ServletResponse getServletResponse(AsyncContextEvent event)
+    {
         if (event!=null && event.getSuppliedResponse()!=null)
             return event.getSuppliedResponse();
         return _channel.getResponse();
     }
-
+    
+    void runInContext(AsyncContextEvent event,Runnable runnable)
+    {
+        ContextHandler contextHandler = getContextHandler(event);
+        if (contextHandler==null)
+            runnable.run();
+        else
+            contextHandler.handle(_channel.getRequest(),runnable);
+    }
+    
     public Object getAttribute(String name)
     {
         return _channel.getRequest().getAttribute(name);
@@ -703,29 +919,91 @@
         _channel.getRequest().setAttribute(name,attribute);
     }
 
-    public void onReadPossible()
-    {
-        boolean handle=false;
 
-        synchronized (this)
+    /* ------------------------------------------------------------ */
+    /** Called to signal async read isReady() has returned false.
+     * This indicates that there is no content available to be consumed
+     * and that once the channel enteres the ASYNC_WAIT state it will
+     * register for read interest by calling {@link HttpChannel#asyncReadFillInterested()}
+     * either from this method or from a subsequent call to {@link #unhandle()}.
+     */
+    public void onReadUnready()
+    {
+        boolean interested=false;
+        try(Locker.Lock lock= _locker.lock())
         {
-            _asyncRead=true;
-            if (_state==State.ASYNC_WAIT)
+            // We were already unready, this is not a state change, so do nothing
+            if (!_asyncReadUnready)
             {
-                _state=State.ASYNC_WOKEN;
-                handle=true;
+                _asyncReadUnready=true;
+                _asyncReadPossible=false; // Assumes this has been checked in isReady() with lock held
+                if (_state==State.ASYNC_WAIT)
+                    interested=true;
             }
         }
 
-        if (handle)
-            _channel.execute(_channel);
+        if (interested)
+            _channel.asyncReadFillInterested();
     }
-    
-    public void onWritePossible()
+
+    /* ------------------------------------------------------------ */
+    /** Called to signal that content is now available to read.
+     * If the channel is in ASYNC_WAIT state and unready (ie isReady() has
+     * returned false), then the state is changed to ASYNC_WOKEN and true
+     * is returned.
+     * @return True IFF the channel was unready and in ASYNC_WAIT state
+     */
+    public boolean onReadPossible()
+    {
+        boolean woken=false;
+        try(Locker.Lock lock= _locker.lock())
+        {
+            _asyncReadPossible=true;
+            if (_state==State.ASYNC_WAIT && _asyncReadUnready)
+            {
+                woken=true;
+                _state=State.ASYNC_WOKEN;
+            }
+        }
+        return woken;
+    }
+
+    /* ------------------------------------------------------------ */
+    /** Called to signal that the channel is ready for a callback.
+     * This is similar to calling {@link #onReadUnready()} followed by
+     * {@link #onReadPossible()}, except that as content is already
+     * available, read interest is never set.
+     * @return true if woken
+     */
+    public boolean onReadReady()
+    {
+        boolean woken=false;
+        try(Locker.Lock lock= _locker.lock())
+        {
+            _asyncReadUnready=true;
+            _asyncReadPossible=true;
+            if (_state==State.ASYNC_WAIT)
+            {
+                woken=true;
+                _state=State.ASYNC_WOKEN;
+            }
+        }
+        return woken;
+    }
+
+    public boolean isReadPossible()
+    {
+        try(Locker.Lock lock= _locker.lock())
+        {
+            return _asyncReadPossible;
+        }
+    }
+
+    public boolean onWritePossible()
     {
         boolean handle=false;
 
-        synchronized (this)
+        try(Locker.Lock lock= _locker.lock())
         {
             _asyncWrite=true;
             if (_state==State.ASYNC_WAIT)
@@ -735,8 +1013,7 @@
             }
         }
 
-        if (handle)
-            _channel.execute(_channel);
+        return handle;
     }
-    
+
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConfiguration.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConfiguration.java
index d9c833f..1048e40 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConfiguration.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConfiguration.java
@@ -18,11 +18,16 @@
 
 package org.eclipse.jetty.server;
 
+import java.io.IOException;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.CopyOnWriteArrayList;
 
+import org.eclipse.jetty.http.HttpMethod;
 import org.eclipse.jetty.http.HttpScheme;
 import org.eclipse.jetty.util.Jetty;
+import org.eclipse.jetty.util.TreeTrie;
+import org.eclipse.jetty.util.Trie;
 import org.eclipse.jetty.util.annotation.ManagedAttribute;
 import org.eclipse.jetty.util.annotation.ManagedObject;
 
@@ -32,7 +37,7 @@
  * <p>This class is a holder of HTTP configuration for use by the 
  * {@link HttpChannel} class.  Typically a HTTPConfiguration instance
  * is instantiated and passed to a {@link ConnectionFactory} that can 
- * create HTTP channels (eg HTTP, AJP or SPDY).</p>
+ * create HTTP channels (e.g. HTTP, AJP or FCGI).</p>
  * <p>The configuration held by this class is not for the wire protocol,
  * but for the interpretation and handling of HTTP requests that could
  * be transported by a variety of protocols.
@@ -43,18 +48,22 @@
 {
     public static final String SERVER_VERSION = "Jetty(" + Jetty.VERSION + ")";
 
-    private List<Customizer> _customizers=new CopyOnWriteArrayList<>();
+    private final List<Customizer> _customizers=new CopyOnWriteArrayList<>();
+    private final Trie<Boolean> _formEncodedMethods = new TreeTrie<>();
     private int _outputBufferSize=32*1024;
     private int _outputAggregationSize=_outputBufferSize/4;
     private int _requestHeaderSize=8*1024;
     private int _responseHeaderSize=8*1024;
     private int _headerCacheSize=512;
     private int _securePort;
+    private long _blockingTimeout=-1;
     private String _secureScheme = HttpScheme.HTTPS.asString();
     private boolean _sendServerVersion = true;
     private boolean _sendXPoweredBy = false;
     private boolean _sendDateHeader = true;
-    private boolean _delayDispatchUntilContent = false;
+    private boolean _delayDispatchUntilContent = true;
+    private boolean _persistentConnectionsEnabled = true;
+    private int _maxErrorDispatches = 10;
 
     /* ------------------------------------------------------------ */
     /** 
@@ -84,6 +93,8 @@
     
     public HttpConfiguration()
     {
+        _formEncodedMethods.put(HttpMethod.POST.asString(),Boolean.TRUE);
+        _formEncodedMethods.put(HttpMethod.PUT.asString(),Boolean.TRUE);
     }
     
     /* ------------------------------------------------------------ */
@@ -93,15 +104,22 @@
     public HttpConfiguration(HttpConfiguration config)
     {
         _customizers.addAll(config._customizers);
+        for (String s:config._formEncodedMethods.keySet())
+            _formEncodedMethods.put(s,Boolean.TRUE);
         _outputBufferSize=config._outputBufferSize;
         _outputAggregationSize=config._outputAggregationSize;
         _requestHeaderSize=config._requestHeaderSize;
         _responseHeaderSize=config._responseHeaderSize;
-        _securePort=config._securePort;
+        _headerCacheSize=config._headerCacheSize;
         _secureScheme=config._secureScheme;
+        _securePort=config._securePort;
+        _blockingTimeout=config._blockingTimeout;
         _sendDateHeader=config._sendDateHeader;
         _sendServerVersion=config._sendServerVersion;
-        _headerCacheSize=config._headerCacheSize;
+        _sendXPoweredBy=config._sendXPoweredBy;
+        _delayDispatchUntilContent=config._delayDispatchUntilContent;
+        _persistentConnectionsEnabled=config._persistentConnectionsEnabled;
+        _maxErrorDispatches=config._maxErrorDispatches;
     }
     
     /* ------------------------------------------------------------ */
@@ -182,6 +200,46 @@
     }
 
     /* ------------------------------------------------------------ */
+    @ManagedAttribute("True if HTTP/1 persistent connection are enabled")
+    public boolean isPersistentConnectionsEnabled()
+    {
+        return _persistentConnectionsEnabled;
+    }
+
+    /* ------------------------------------------------------------ */
+    /** Get the timeout applied to blocking operations.
+     * <p>This timeout is in addition to the {@link Connector#getIdleTimeout()}, and applies
+     * to the total operation (as opposed to the idle timeout that applies to the time no 
+     * data is being sent).
+     * @return -1, for no blocking timeout (default), 0 for a blocking timeout equal to the 
+     * idle timeout; &gt;0 for a timeout in ms applied to the total blocking operation.
+     */
+    @ManagedAttribute("Timeout in MS for blocking operations.")
+    public long getBlockingTimeout()
+    {
+        return _blockingTimeout;
+    }
+
+    /**
+     * Set the timeout applied to blocking operations.
+     * <p>This timeout is in addition to the {@link Connector#getIdleTimeout()}, and applies
+     * to the total operation (as opposed to the idle timeout that applies to the time no 
+     * data is being sent).
+     * @param blockingTimeout -1, for no blocking timeout (default), 0 for a blocking timeout equal to the 
+     * idle timeout; &gt;0 for a timeout in ms applied to the total blocking operation.
+     */
+    public void setBlockingTimeout(long blockingTimeout)
+    {
+        _blockingTimeout = blockingTimeout;
+    }
+
+    /* ------------------------------------------------------------ */
+    public void setPersistentConnectionsEnabled(boolean persistentConnectionsEnabled)
+    {
+        _persistentConnectionsEnabled = persistentConnectionsEnabled;
+    }
+
+    /* ------------------------------------------------------------ */
     public void setSendServerVersion (boolean sendServerVersion)
     {
         _sendServerVersion = sendServerVersion;
@@ -195,6 +253,19 @@
     }
 
     /* ------------------------------------------------------------ */
+    public void writePoweredBy(Appendable out,String preamble,String postamble) throws IOException
+    {
+        if (getSendServerVersion())
+        {
+            if (preamble!=null)
+                out.append(preamble);
+            out.append(Jetty.POWERED_BY);
+            if (postamble!=null)
+                out.append(postamble);
+        }
+    }
+    
+    /* ------------------------------------------------------------ */
     public void setSendXPoweredBy (boolean sendXPoweredBy)
     {
         _sendXPoweredBy=sendXPoweredBy;
@@ -222,7 +293,7 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * @param delay if true, delay the application dispatch until content is available
+     * @param delay if true, delay the application dispatch until content is available (default false)
      */
     public void setDelayDispatchUntilContent(boolean delay)
     {
@@ -328,6 +399,7 @@
         _secureScheme = secureScheme;
     }
 
+    /* ------------------------------------------------------------ */
     @Override
     public String toString()
     {
@@ -339,4 +411,72 @@
                 _secureScheme,_securePort,
                 _customizers);
     }
+
+    /* ------------------------------------------------------------ */
+    /** Set the form encoded methods.
+     * @param methods HTTP Methods of requests that can be decoded as 
+     * x-www-form-urlencoded content to be made available via the 
+     * {@link Request#getParameter(String)} and associated APIs 
+     */
+    public void setFormEncodedMethods(String... methods)
+    {
+        _formEncodedMethods.clear();
+        for (String method:methods)
+            addFormEncodedMethod(method);
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @return Set of HTTP Methods of requests that can be decoded as 
+     * x-www-form-urlencoded content to be made available via the 
+     * {@link Request#getParameter(String)} and associated APIs
+     */
+    public Set<String> getFormEncodedMethods()
+    {
+        return _formEncodedMethods.keySet();
+    }
+
+    /* ------------------------------------------------------------ */
+    /** Add a form encoded HTTP Method 
+     * @param method HTTP Method of requests that can be decoded as 
+     * x-www-form-urlencoded content to be made available via the 
+     * {@link Request#getParameter(String)} and associated APIs
+     */
+    public void addFormEncodedMethod(String method)
+    {
+        _formEncodedMethods.put(method,Boolean.TRUE);
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * Test if the method type supports <code>x-www-form-urlencoded</code> content
+     * 
+     * @param method the method type
+     * @return True of the requests of this method type can be
+     * decoded as <code>x-www-form-urlencoded</code> content to be made available via the 
+     * {@link Request#getParameter(String)} and associated APIs
+     */
+    public boolean isFormEncodedMethod(String method)
+    {
+        return Boolean.TRUE.equals(_formEncodedMethods.get(method));
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @return The maximum error dispatches for a request to prevent looping on an error
+     */
+    @ManagedAttribute("The maximum ERROR dispatches for a request for loop prevention (default 10)")
+    public int getMaxErrorDispatches()
+    {
+        return _maxErrorDispatches;
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @param max The maximum error dispatches for a request to prevent looping on an error
+     */
+    public void setMaxErrorDispatches(int max)
+    {
+        _maxErrorDispatches=max;
+    }
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java
index 1a876c7..4f6d08c 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java
@@ -22,15 +22,17 @@
 import java.nio.ByteBuffer;
 import java.nio.channels.WritePendingException;
 import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.atomic.AtomicInteger;
 
+import org.eclipse.jetty.http.HttpField;
 import org.eclipse.jetty.http.HttpGenerator;
-import org.eclipse.jetty.http.HttpGenerator.ResponseInfo;
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpHeaderValue;
-import org.eclipse.jetty.http.HttpMethod;
 import org.eclipse.jetty.http.HttpParser;
+import org.eclipse.jetty.http.HttpParser.RequestHandler;
 import org.eclipse.jetty.http.HttpStatus;
-import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http.PreEncodedHttpField;
 import org.eclipse.jetty.io.AbstractConnection;
 import org.eclipse.jetty.io.ByteBufferPool;
 import org.eclipse.jetty.io.Connection;
@@ -47,30 +49,34 @@
  */
 public class HttpConnection extends AbstractConnection implements Runnable, HttpTransport, Connection.UpgradeFrom
 {
+    private static final Logger LOG = Log.getLogger(HttpConnection.class);
+    public static final HttpField CONNECTION_CLOSE = new PreEncodedHttpField(HttpHeader.CONNECTION,HttpHeaderValue.CLOSE.asString());
     public static final String UPGRADE_CONNECTION_ATTRIBUTE = "org.eclipse.jetty.server.HttpConnection.UPGRADE";
     private static final boolean REQUEST_BUFFER_DIRECT=false;
     private static final boolean HEADER_BUFFER_DIRECT=false;
     private static final boolean CHUNK_BUFFER_DIRECT=false;
-    private static final Logger LOG = Log.getLogger(HttpConnection.class);
     private static final ThreadLocal<HttpConnection> __currentConnection = new ThreadLocal<>();
 
     private final HttpConfiguration _config;
     private final Connector _connector;
     private final ByteBufferPool _bufferPool;
+    private final HttpInput _input;
     private final HttpGenerator _generator;
     private final HttpChannelOverHttp _channel;
     private final HttpParser _parser;
+    private final AtomicInteger _contentBufferReferences=new AtomicInteger();
     private volatile ByteBuffer _requestBuffer = null;
     private volatile ByteBuffer _chunk = null;
+    private final BlockingReadCallback _blockingReadCallback = new BlockingReadCallback();
+    private final AsyncReadCallback _asyncReadCallback = new AsyncReadCallback();
     private final SendCallback _sendCallback = new SendCallback();
 
-
-    /* ------------------------------------------------------------ */
-    /** Get the current connection that this thread is dispatched to.
+    /**
+     * Get the current connection that this thread is dispatched to.
      * Note that a thread may be processing a request asynchronously and
      * thus not be dispatched to the connection.
-     * @see Request#getAttribute(String) for a more general way to access the HttpConnection
      * @return the current HttpConnection or null
+     * @see Request#getAttribute(String) for a more general way to access the HttpConnection
      */
     public static HttpConnection getCurrentConnection()
     {
@@ -84,41 +90,33 @@
         return last;
     }
 
-    public HttpConfiguration getHttpConfiguration()
-    {
-        return _config;
-    }
-
     public HttpConnection(HttpConfiguration config, Connector connector, EndPoint endPoint)
     {
-        // Tell AbstractConnector executeOnFillable==true because we want the same thread that
-        // does the HTTP parsing to handle the request so its cache is hot
-        super(endPoint, connector.getExecutor(),true);
-
+        super(endPoint, connector.getExecutor());
         _config = config;
         _connector = connector;
         _bufferPool = _connector.getByteBufferPool();
         _generator = newHttpGenerator();
-        HttpInput<ByteBuffer> input = newHttpInput();
-        _channel = newHttpChannel(input);
+        _channel = newHttpChannel();
+        _input = _channel.getRequest().getHttpInput();
         _parser = newHttpParser();
         if (LOG.isDebugEnabled())
             LOG.debug("New HTTP Connection {}", this);
     }
 
+    public HttpConfiguration getHttpConfiguration()
+    {
+        return _config;
+    }
+
     protected HttpGenerator newHttpGenerator()
     {
         return new HttpGenerator(_config.getSendServerVersion(),_config.getSendXPoweredBy());
     }
 
-    protected HttpInput<ByteBuffer> newHttpInput()
+    protected HttpChannelOverHttp newHttpChannel()
     {
-        return new HttpInputOverHTTP(this);
-    }
-
-    protected HttpChannelOverHttp newHttpChannel(HttpInput<ByteBuffer> httpInput)
-    {
-        return new HttpChannelOverHttp(_connector, _config, getEndPoint(), this, httpInput);
+        return new HttpChannelOverHttp(this, _connector, _config, getEndPoint(), this);
     }
 
     protected HttpParser newHttpParser()
@@ -126,7 +124,7 @@
         return new HttpParser(newRequestHandler(), getHttpConfiguration().getRequestHeaderSize());
     }
 
-    protected HttpParser.RequestHandler<ByteBuffer> newRequestHandler()
+    protected HttpParser.RequestHandler newRequestHandler()
     {
         return _channel;
     }
@@ -141,7 +139,7 @@
         return _connector;
     }
 
-    public HttpChannel<?> getHttpChannel()
+    public HttpChannel getHttpChannel()
     {
         return _channel;
     }
@@ -151,6 +149,17 @@
         return _parser;
     }
 
+    public HttpGenerator getGenerator()
+    {
+        return _generator;
+    }
+
+    @Override
+    public boolean isOptimizedForDirectBuffers()
+    {
+        return getEndPoint().isOptimizedForDirectBuffers();
+    }
+
     @Override
     public int getMessagesIn()
     {
@@ -179,6 +188,8 @@
     {
         if (_requestBuffer != null && !_requestBuffer.hasRemaining())
         {
+            if (LOG.isDebugEnabled())
+                LOG.debug("releaseRequestBuffer {}",this);
             ByteBuffer buffer=_requestBuffer;
             _requestBuffer=null;
             _bufferPool.release(buffer);
@@ -192,148 +203,156 @@
         return _requestBuffer;
     }
 
-    /**
-     * <p>Parses and handles HTTP messages.</p>
-     * <p>This method is called when this {@link Connection} is ready to read bytes from the {@link EndPoint}.
-     * However, it can also be called if there is unconsumed data in the _requestBuffer, as a result of
-     * resuming a suspended request when there is a pipelined request already read into the buffer.</p>
-     * <p>This method fills bytes and parses them until either: EOF is filled; 0 bytes are filled;
-     * the HttpChannel finishes handling; or the connection has changed.</p>
-     */
+    public boolean isRequestBufferEmpty()
+    {
+        return BufferUtil.isEmpty(_requestBuffer);
+    }
+
     @Override
     public void onFillable()
     {
         if (LOG.isDebugEnabled())
-            LOG.debug("{} onFillable {}", this, _channel.getState());
+            LOG.debug("{} onFillable enter {} {}", this, _channel.getState(),BufferUtil.toDetailString(_requestBuffer));
 
-        final HttpConnection last=setCurrentConnection(this);
-        int filled=Integer.MAX_VALUE;
-        boolean suspended=false;
+        HttpConnection last=setCurrentConnection(this);
         try
         {
-            // while not suspended and not upgraded
-            while (!suspended && getEndPoint().getConnection()==this)
+            while (true)
             {
-                // Do we need some data to parse
-                if (BufferUtil.isEmpty(_requestBuffer))
+                // Fill the request buffer (if needed)
+                int filled = fillRequestBuffer();
+
+                // Parse the request buffer
+                boolean handle = parseRequestBuffer();
+                // If there was a connection upgrade, the other
+                // connection took over, nothing more to do here.
+                if (getEndPoint().getConnection()!=this)
+                    break;
+
+                // Handle close parser
+                if (_parser.isClose() || _parser.isClosed())
                 {
-                    // If the previous iteration filled 0 bytes or saw a close, then break here
-                    if (filled<=0)
+                    close();
+                    break;
+                }
+
+                // Handle channel event
+                if (handle)
+                {
+                    boolean suspended = !_channel.handle();
+
+                    // We should break iteration if we have suspended or changed connection or this is not the handling thread.
+                    if (suspended || getEndPoint().getConnection() != this)
                         break;
-
-                    // Can we fill?
-                    if(getEndPoint().isInputShutdown())
-                    {
-                        // No pretend we read -1
-                        filled=-1;
-                        _parser.atEOF();
-                    }
-                    else
-                    {
-                        // Get a buffer
-                        // We are not in a race here for the request buffer as we have not yet received a request,
-                        // so there are not an possible legal threads calling #parseContent or #completed.
-                        _requestBuffer = getRequestBuffer();
-
-                        // fill
-                        filled = getEndPoint().fill(_requestBuffer);
-                        if (filled==0) // Do a retry on fill 0 (optimization for SSL connections)
-                            filled = getEndPoint().fill(_requestBuffer);
-
-                        // tell parser
-                        if (filled < 0)
-                            _parser.atEOF();
-                    }
                 }
 
-                // Parse the buffer
-                if (_parser.parseNext(_requestBuffer==null?BufferUtil.EMPTY_BUFFER:_requestBuffer))
+                // Continue or break?
+                else if (filled<=0)
                 {
-                    // The parser returned true, which indicates the channel is ready to handle a request.
-                    // Call the channel and this will either handle the request/response to completion OR,
-                    // if the request suspends, the request/response will be incomplete so the outer loop will exit.
-                    // Not that onFillable no longer manipulates the request buffer from this point and that is
-                    // left to threads calling #completed or #parseContent (which may be this thread inside handle())
-                    suspended = !_channel.handle();
-                }
-                else
-                {
-                    // We parsed what we could, recycle the request buffer
-                    // We are not in a race here for the request buffer as we have not yet received a request,
-                    // so there are not an possible legal threads calling #parseContent or #completed.
-                    releaseRequestBuffer();
+                    if (filled==0)
+                        fillInterested();
+                    break;
                 }
             }
         }
-        catch (EofException e)
-        {
-            LOG.debug(e);
-        }
-        catch (Exception e)
-        {
-            if (_parser.isIdle())
-                LOG.debug(e);
-            else
-                LOG.warn(this.toString(), e);
-            close();
-        }
         finally
         {
             setCurrentConnection(last);
-            if (!suspended && getEndPoint().isOpen() && getEndPoint().getConnection()==this)
-            {
-                fillInterested();
-            }
+            if (LOG.isDebugEnabled())
+                LOG.debug("{} onFillable exit {} {}", this, _channel.getState(),BufferUtil.toDetailString(_requestBuffer));
         }
     }
 
     /* ------------------------------------------------------------ */
     /** Fill and parse data looking for content
-     * @throws IOException
+     * @return true if an {@link RequestHandler} method was called and it returned true;
      */
-    protected void parseContent() throws IOException
+    protected boolean fillAndParseForContent()
     {
-        // Not in a race here for the request buffer with #onFillable because an async consumer of
-        // content would only be started after onFillable has given up control.
-        // In a little bit of a race with #completed, but then not sure if it is legal to be doing
-        // async calls to IO and have a completed call at the same time.
-        ByteBuffer requestBuffer = getRequestBuffer();
-
+        boolean handled=false;
         while (_parser.inContentState())
         {
-            // Can the parser progress (even with an empty buffer)
-            boolean parsed = _parser.parseNext(requestBuffer==null?BufferUtil.EMPTY_BUFFER:requestBuffer);
-
-            // No, we can we try reading some content?
-            if (BufferUtil.isEmpty(requestBuffer) && getEndPoint().isInputShutdown())
-            {
-                _parser.atEOF();
-                if (parsed)
-                    break;
-                continue;
-            }
-
-            if (parsed)
+            int filled = fillRequestBuffer();
+            boolean handle = parseRequestBuffer();
+            handled|=handle;
+            if (handle || filled<=0 || _channel.getRequest().getHttpInput().hasContent())
                 break;
-
-            // OK lets read some data
-            int filled=getEndPoint().fill(requestBuffer);
-            if (LOG.isDebugEnabled()) // Avoid boxing of variable 'filled'
-                LOG.debug("{} filled {}",this,filled);
-            if (filled<=0)
-            {
-                if (filled<0)
-                {
-                    _parser.atEOF();
-                    continue;
-                }
-                break;
-            }
         }
+        return handled;
     }
 
+    /* ------------------------------------------------------------ */
+    private int fillRequestBuffer()
+    {
+        if (_contentBufferReferences.get()>0)
+        {
+            LOG.warn("{} fill with unconsumed content!",this);
+            return 0;
+        }
+
+        if (BufferUtil.isEmpty(_requestBuffer))
+        {
+            // Can we fill?
+            if(getEndPoint().isInputShutdown())
+            {
+                // No pretend we read -1
+                _parser.atEOF();
+                if (LOG.isDebugEnabled())
+                    LOG.debug("{} filled -1 {}",this,BufferUtil.toDetailString(_requestBuffer));
+                return -1;
+            }
+
+            // Get a buffer
+            // We are not in a race here for the request buffer as we have not yet received a request,
+            // so there are not an possible legal threads calling #parseContent or #completed.
+            _requestBuffer = getRequestBuffer();
+
+            // fill
+            try
+            {
+                int filled = getEndPoint().fill(_requestBuffer);
+                if (filled==0) // Do a retry on fill 0 (optimization for SSL connections)
+                    filled = getEndPoint().fill(_requestBuffer);
+
+                // tell parser
+                if (filled < 0)
+                    _parser.atEOF();
+
+                if (LOG.isDebugEnabled())
+                    LOG.debug("{} filled {} {}",this,filled,BufferUtil.toDetailString(_requestBuffer));
+
+                return filled;
+            }
+            catch (IOException e)
+            {
+                LOG.debug(e);
+                return -1;
+            }
+        }
+        return 0;
+    }
+
+    /* ------------------------------------------------------------ */
+    private boolean parseRequestBuffer()
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("{} parse {} {}",this,BufferUtil.toDetailString(_requestBuffer));
+
+        boolean handle = _parser.parseNext(_requestBuffer==null?BufferUtil.EMPTY_BUFFER:_requestBuffer);
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("{} parsed {} {}",this,handle,_parser);
+
+        // recycle buffer ?
+        if (_contentBufferReferences.get()==0)
+            releaseRequestBuffer();
+
+        return handle;
+    }
+
+    /* ------------------------------------------------------------ */
     @Override
-    public void completed()
+    public void onCompleted()
     {
         // Handle connection upgrades
         if (_channel.getResponse().getStatus() == HttpStatus.SWITCHING_PROTOCOLS_101)
@@ -341,12 +360,21 @@
             Connection connection = (Connection)_channel.getRequest().getAttribute(UPGRADE_CONNECTION_ATTRIBUTE);
             if (connection != null)
             {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Upgrade from {} to {}", this, connection);
                 _channel.getState().upgrade();
                 getEndPoint().upgrade(connection);
-                _channel.reset();
+                _channel.recycle();
                 _parser.reset();
                 _generator.reset();
-                releaseRequestBuffer();
+                if (_contentBufferReferences.get()==0)
+                    releaseRequestBuffer();
+                else
+                {
+                    LOG.warn("{} lingering content references?!?!",this);
+                    _requestBuffer=null; // Not returned to pool!
+                    _contentBufferReferences.set(0);
+                }
                 return;
             }
         }
@@ -365,7 +393,7 @@
             {
                 if (LOG.isDebugEnabled())
                     LOG.debug("unconsumed async input {}", this);
-                _channel.abort();
+                _channel.abort(new IOException("unconsumed input"));
             }
             else
             {
@@ -373,12 +401,12 @@
                     LOG.debug("unconsumed input {}", this);
                 // Complete reading the request
                 if (!_channel.getRequest().getHttpInput().consumeAll())
-                    _channel.abort();
+                    _channel.abort(new IOException("unconsumed input"));
             }
         }
 
         // Reset the channel, parsers and generator
-        _channel.reset();
+        _channel.recycle();
         if (_generator.isPersistent() && !_parser.isClosed())
             _parser.reset();
         else
@@ -386,7 +414,6 @@
 
         // Not in a race here with onFillable, because it has given up control before calling handle.
         // in a slight race with #completed, but not sure what to do with that anyway.
-        releaseRequestBuffer();
         if (_chunk!=null)
             _bufferPool.release(_chunk);
         _chunk=null;
@@ -460,28 +487,36 @@
     }
 
     @Override
-    public void send(ResponseInfo info, ByteBuffer content, boolean lastContent, Callback callback)
+    public void send(MetaData.Response info, boolean head, ByteBuffer content, boolean lastContent, Callback callback)
     {
-        // If we are still expecting a 100 continues when we commit
-        if (info!=null && _channel.isExpecting100Continue())
-            // then we can't be persistent
-            _generator.setPersistent(false);
+        if (info == null)
+        {
+            if (!lastContent && BufferUtil.isEmpty(content))
+            {
+                callback.succeeded();
+                return;
+            }
+        }
+        else
+        {
+            // If we are still expecting a 100 continues when we commit
+            if (_channel.isExpecting100Continue())
+                // then we can't be persistent
+                _generator.setPersistent(false);
+        }
 
-        if(_sendCallback.reset(info,content,lastContent,callback))
+        if(_sendCallback.reset(info,head,content,lastContent,callback))
             _sendCallback.iterate();
     }
 
-    @Override
-    public void send(ByteBuffer content, boolean lastContent, Callback callback)
+
+    HttpInput.Content newContent(ByteBuffer c)
     {
-        if (!lastContent && BufferUtil.isEmpty(content))
-            callback.succeeded();
-        else if (_sendCallback.reset(null,content,lastContent,callback))
-            _sendCallback.iterate();
+        return new Content(c);
     }
 
     @Override
-    public void abort()
+    public void abort(Throwable failure)
     {
         // Do a direct close of the output, as this may indicate to a client that the
         // response is bad either with RST or by abnormal completion of chunked response.
@@ -489,6 +524,33 @@
     }
 
     @Override
+    public boolean isPushSupported()
+    {
+        return false;
+    }
+
+    @Override
+    public void push(org.eclipse.jetty.http.MetaData.Request request)
+    {
+        LOG.debug("ignore push in {}",this);
+    }
+
+    public void asyncReadFillInterested()
+    {
+        getEndPoint().fillInterested(_asyncReadCallback);
+    }
+
+    public void blockingReadFillInterested()
+    {
+        getEndPoint().fillInterested(_blockingReadCallback);
+    }
+
+    public void blockingReadException(Throwable e)
+    {
+        _blockingReadCallback.failed(e);
+    }
+
+    @Override
     public String toString()
     {
         return String.format("%s[p=%s,g=%s,c=%s]",
@@ -498,120 +560,74 @@
                 _channel);
     }
 
-    protected class HttpChannelOverHttp extends HttpChannel<ByteBuffer>
+    private class Content extends HttpInput.Content
     {
-        public HttpChannelOverHttp(Connector connector, HttpConfiguration config, EndPoint endPoint, HttpTransport transport, HttpInput<ByteBuffer> input)
+        public Content(ByteBuffer content)
         {
-            super(connector,config,endPoint,transport,input);
+            super(content);
+            _contentBufferReferences.incrementAndGet();
         }
 
         @Override
-        public void earlyEOF()
+        public void succeeded()
         {
-            // If we have no request yet, just close
-            if (getRequest().getMethod()==null)
-                close();
-            else
-                super.earlyEOF();
+            if (_contentBufferReferences.decrementAndGet()==0)
+                releaseRequestBuffer();
         }
 
         @Override
-        public boolean content(ByteBuffer item)
+        public void failed(Throwable x)
         {
-            super.content(item);
+            succeeded();
+        }
+    }
+
+    private class BlockingReadCallback implements Callback
+    {
+        @Override
+        public void succeeded()
+        {
+            _input.unblock();
+        }
+
+        @Override
+        public void failed(Throwable x)
+        {
+            _input.failed(x);
+        }
+
+        @Override
+        public boolean isNonBlocking()
+        {
+            // This callback does not block, rather it wakes up the
+            // thread that is blocked waiting on the read.
             return true;
         }
+    }
 
+    private class AsyncReadCallback implements Callback
+    {
         @Override
-        public void badMessage(int status, String reason)
+        public void succeeded()
         {
-            _generator.setPersistent(false);
-            super.badMessage(status,reason);
+            if (fillAndParseForContent())
+                _channel.handle();
+            else if (!_input.isFinished())
+                asyncReadFillInterested();
         }
 
         @Override
-        public boolean headerComplete()
+        public void failed(Throwable x)
         {
-            boolean persistent;
-            HttpVersion version = getHttpVersion();
-
-            switch (version)
-            {
-                case HTTP_0_9:
-                {
-                    persistent = false;
-                    break;
-                }
-                case HTTP_1_0:
-                {
-                    persistent = getRequest().getHttpFields().contains(HttpHeader.CONNECTION, HttpHeaderValue.KEEP_ALIVE.asString());
-                    if (!persistent)
-                        persistent = HttpMethod.CONNECT.is(getRequest().getMethod());
-                    if (persistent)
-                        getResponse().getHttpFields().add(HttpHeader.CONNECTION, HttpHeaderValue.KEEP_ALIVE);
-                    break;
-                }
-                case HTTP_1_1:
-                {
-                    persistent = !getRequest().getHttpFields().contains(HttpHeader.CONNECTION, HttpHeaderValue.CLOSE.asString());
-                    if (!persistent)
-                        persistent = HttpMethod.CONNECT.is(getRequest().getMethod());
-                    if (!persistent)
-                        getResponse().getHttpFields().add(HttpHeader.CONNECTION, HttpHeaderValue.CLOSE);
-                    break;
-                }
-                case HTTP_2:
-                {
-                    persistent=false;
-                    badMessage(400,null);
-                    return true;
-                }
-                default:
-                {
-                    throw new IllegalStateException();
-                }
-            }
-
-            if (!persistent)
-                _generator.setPersistent(false);
-
-            if (!super.headerComplete())
-                return false;
-
-            // Should we delay dispatch until we have some content?
-            // We should not delay if there is no content expect or client is expecting 100 or the response is already committed or the request buffer already has something in it to parse
-            if (getHttpConfiguration().isDelayDispatchUntilContent() && _parser.getContentLength() > 0 &&
-                    !isExpecting100Continue() && !isCommitted() && BufferUtil.isEmpty(_requestBuffer))
-                return false;
-
-            return true;
-        }
-
-        @Override
-        protected void handleException(Throwable x)
-        {
-            _generator.setPersistent(false);
-            super.handleException(x);
-        }
-
-        @Override
-        public void abort()
-        {
-            super.abort();
-            _generator.setPersistent(false);
-        }
-
-        @Override
-        public boolean messageComplete()
-        {
-            super.messageComplete();
-            return false;
+            if (_input.failed(x))
+                _channel.handle();
         }
     }
 
     private class SendCallback extends IteratingCallback
     {
-        private ResponseInfo _info;
+        private MetaData.Response _info;
+        private boolean _head;
         private ByteBuffer _content;
         private boolean _lastContent;
         private Callback _callback;
@@ -623,11 +639,18 @@
             super(true);
         }
 
-        private boolean reset(ResponseInfo info, ByteBuffer content, boolean last, Callback callback)
+        @Override
+        public boolean isNonBlocking()
+        {
+            return _callback.isNonBlocking();
+        }
+
+        private boolean reset(MetaData.Response info, boolean head, ByteBuffer content, boolean last, Callback callback)
         {
             if (reset())
             {
                 _info = info;
+                _head = head;
                 _content = content;
                 _lastContent = last;
                 _callback = callback;
@@ -652,7 +675,7 @@
             ByteBuffer chunk = _chunk;
             while (true)
             {
-                HttpGenerator.Result result = _generator.generateResponse(_info, _header, chunk, _content, _lastContent);
+                HttpGenerator.Result result = _generator.generateResponse(_info, _head, _header, chunk, _content, _lastContent);
                 if (LOG.isDebugEnabled())
                     LOG.debug("{} generate: {} ({},{},{})@{}",
                         this,
@@ -666,7 +689,25 @@
                 {
                     case NEED_HEADER:
                     {
-                        _header = _bufferPool.acquire(_config.getResponseHeaderSize(), HEADER_BUFFER_DIRECT);
+                        // Look for optimisation to avoid allocating a _header buffer
+                        /*
+                         Cannot use this optimisation unless we work out how not to overwrite data in user passed arrays.
+                        if (_lastContent && _content!=null && !_content.isReadOnly() && _content.hasArray() && BufferUtil.space(_content)>_config.getResponseHeaderSize() )
+                        {
+                            // use spare space in content buffer for header buffer
+                            int p=_content.position();
+                            int l=_content.limit();
+                            _content.position(l);
+                            _content.limit(l+_config.getResponseHeaderSize());
+                            _header=_content.slice();
+                            _header.limit(0);
+                            _content.position(p);
+                            _content.limit(l);
+                        }
+                        else
+                        */
+                            _header = _bufferPool.acquire(_config.getResponseHeaderSize(), HEADER_BUFFER_DIRECT);
+
                         continue;
                     }
                     case NEED_CHUNK:
@@ -677,7 +718,7 @@
                     case FLUSH:
                     {
                         // Don't write the chunk or the content if this is a HEAD response, or any other type of response that should have no content
-                        if (_channel.getRequest().isHead() || _generator.isNoContent())
+                        if (_head || _generator.isNoContent())
                         {
                             BufferUtil.clear(chunk);
                             BufferUtil.clear(_content);
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnectionFactory.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnectionFactory.java
index 48872a2..9926325 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnectionFactory.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnectionFactory.java
@@ -16,19 +16,15 @@
 //  ========================================================================
 //
 
-
 package org.eclipse.jetty.server;
 
-
 import org.eclipse.jetty.http.HttpVersion;
 import org.eclipse.jetty.io.Connection;
 import org.eclipse.jetty.io.EndPoint;
 import org.eclipse.jetty.util.annotation.Name;
 
-
-/* ------------------------------------------------------------ */
 /** A Connection Factory for HTTP Connections.
- * <p>Accepts connections either directly or via SSL and/or NPN chained connection factories.  The accepted 
+ * <p>Accepts connections either directly or via SSL and/or ALPN chained connection factories.  The accepted
  * {@link HttpConnection}s are configured by a {@link HttpConfiguration} instance that is either created by
  * default or passed in to the constructor.
  */
@@ -39,13 +35,14 @@
     public HttpConnectionFactory()
     {
         this(new HttpConfiguration());
-        setInputBufferSize(16384);
     }
 
     public HttpConnectionFactory(@Name("config") HttpConfiguration config)
     {
-        super(HttpVersion.HTTP_1_1.toString());
+        super(HttpVersion.HTTP_1_1.asString());
         _config=config;
+        if (config==null)
+            throw new IllegalArgumentException("Null HttpConfiguration");
         addBean(_config);
     }
 
@@ -60,5 +57,4 @@
     {
         return configure(new HttpConnection(_config, connector, endPoint), connector, endPoint);
     }
-
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpInput.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpInput.java
index e459fdc..f8b1473 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpInput.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpInput.java
@@ -19,284 +19,442 @@
 package org.eclipse.jetty.server;
 
 import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayDeque;
 import java.util.Objects;
+import java.util.Queue;
+import java.util.concurrent.TimeoutException;
 
 import javax.servlet.ReadListener;
 import javax.servlet.ServletInputStream;
 
 import org.eclipse.jetty.io.EofException;
 import org.eclipse.jetty.io.RuntimeIOException;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.Callback;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
 /**
  * {@link HttpInput} provides an implementation of {@link ServletInputStream} for {@link HttpChannel}.
- * <p/>
+ * <p>
  * Content may arrive in patterns such as [content(), content(), messageComplete()] so that this class
  * maintains two states: the content state that tells whether there is content to consume and the EOF
  * state that tells whether an EOF has arrived.
  * Only once the content has been consumed the content state is moved to the EOF state.
  */
-public abstract class HttpInput<T> extends ServletInputStream implements Runnable
+public class HttpInput extends ServletInputStream implements Runnable
 {
     private final static Logger LOG = Log.getLogger(HttpInput.class);
+    private final static Content EOF_CONTENT = new EofContent("EOF");
+    private final static Content EARLY_EOF_CONTENT = new EofContent("EARLY_EOF");
 
     private final byte[] _oneByteBuffer = new byte[1];
-    private final Object _lock;
-    private HttpChannelState _channelState;
+    private final Queue<Content> _inputQ = new ArrayDeque<>();
+    private final HttpChannelState _channelState;
     private ReadListener _listener;
-    private Throwable _onError;
-    private boolean _notReady;
-    private State _contentState = STREAM;
-    private State _eofState;
-    private long _contentRead;
+    private State _state = STREAM;
+    private long _contentConsumed;
+    private long _blockingTimeoutAt = -1;
 
-    protected HttpInput()
+    public HttpInput(HttpChannelState state)
     {
-        this(null);
+        _channelState=state;
+        if (_channelState.getHttpChannel().getHttpConfiguration().getBlockingTimeout()>0)
+            _blockingTimeoutAt=0;
     }
 
-    protected HttpInput(Object lock)
+    protected HttpChannelState getHttpChannelState()
     {
-        _lock = lock == null ? this : lock;
-    }
-
-    public void init(HttpChannelState state)
-    {
-        synchronized (lock())
-        {
-            _channelState = state;
-        }
-    }
-
-    public final Object lock()
-    {
-        return _lock;
+        return _channelState;
     }
 
     public void recycle()
     {
-        synchronized (lock())
+        synchronized (_inputQ)
         {
+            Content item = _inputQ.poll();
+            while (item != null)
+            {
+                item.failed(null);
+                item = _inputQ.poll();
+            }
             _listener = null;
-            _onError = null;
-            _notReady = false;
-            _contentState = STREAM;
-            _eofState = null;
-            _contentRead = 0;
+            _state = STREAM;
+            _contentConsumed = 0;
         }
     }
 
     @Override
     public int available()
     {
-        try
+        int available=0;
+        boolean woken=false;
+        synchronized (_inputQ)
         {
-            synchronized (lock())
+            Content content = _inputQ.peek();
+            if (content==null)
             {
-                T item = getNextContent();
-                return item == null ? 0 : remaining(item);
+                try
+                {
+                    produceContent();
+                }
+                catch(IOException e)
+                {
+                    woken=failed(e);
+                }
+                content = _inputQ.peek();
             }
+
+            if (content!=null)
+                available= remaining(content);
         }
-        catch (IOException e)
-        {
-            throw new RuntimeIOException(e);
-        }
+
+        if (woken)
+            wake();
+        return available;
     }
 
+    private void wake()
+    {
+        _channelState.getHttpChannel().getConnector().getExecutor().execute(_channelState.getHttpChannel());
+    }
+
+
     @Override
     public int read() throws IOException
     {
         int read = read(_oneByteBuffer, 0, 1);
+        if (read==0)
+            throw new IllegalStateException("unready read=0");
         return read < 0 ? -1 : _oneByteBuffer[0] & 0xFF;
     }
 
     @Override
     public int read(byte[] b, int off, int len) throws IOException
     {
-        synchronized (lock())
+        synchronized (_inputQ)
         {
-            T item = getNextContent();
-            if (item == null)
-            {
-                _contentState.waitForContent(this);
-                item = getNextContent();
-                if (item == null)
-                    return _contentState.noContent();
-            }
-            int l = get(item, b, off, len);
-            _contentRead += l;
-            return l;
-        }
-    }
+            if (_blockingTimeoutAt>=0 && !isAsync())
+                _blockingTimeoutAt=System.currentTimeMillis()+getHttpChannelState().getHttpChannel().getHttpConfiguration().getBlockingTimeout();
 
-    /**
-     * A convenience method to call nextContent and to check the return value, which if null then the
-     * a check is made for EOF and the state changed accordingly.
-     *
-     * @return Content or null if none available.
-     * @throws IOException
-     * @see #nextContent()
-     */
-    protected T getNextContent() throws IOException
-    {
-        T content = nextContent();
-        if (content == null)
-        {
-            synchronized (lock())
+            while(true)
             {
-                if (_eofState != null)
+                Content item = nextContent();
+                if (item!=null)
                 {
                     if (LOG.isDebugEnabled())
-                        LOG.debug("{} eof {}", this, _eofState);
-                    _contentState = _eofState;
+                        LOG.debug("{} read {} from {}",this,len,item);
+                    int l = get(item, b, off, len);
+
+                    consumeNonContent();
+
+                    return l;
                 }
+
+                if (!_state.blockForContent(this))
+                    return _state.noContent();
             }
         }
-        return content;
     }
 
     /**
-     * Access the next content to be consumed from.   Returning the next item does not consume it
-     * and it may be returned multiple times until it is consumed.
-     * <p/>
-     * Calls to {@link #get(Object, byte[], int, int)}
-     * or {@link #consume(Object, int)} are required to consume data from the content.
+     * Called when derived implementations should attempt to
+     * produce more Content and add it via {@link #addContent(Content)}.
+     * For protocols that are constantly producing (eg HTTP2) this can
+     * be left as a noop;
+     * @throws IOException if unable to produce content
+     */
+    protected void produceContent() throws IOException
+    {
+    }
+
+    /**
+     * Get the next content from the inputQ, calling {@link #produceContent()}
+     * if need be.  EOF is processed and state changed.
      *
      * @return the content or null if none available.
      * @throws IOException if retrieving the content fails
      */
-    protected abstract T nextContent() throws IOException;
+    protected Content nextContent() throws IOException
+    {
+        Content content = pollContent();
+        if (content==null && !isFinished())
+        {
+            produceContent();
+            content = pollContent();
+        }
+        return content;
+    }
+
+    /** Poll the inputQ for Content.
+     * Consumed buffers and {@link PoisonPillContent}s are removed and
+     * EOF state updated if need be.
+     * @return Content or null
+     */
+    protected Content pollContent()
+    {
+        // Items are removed only when they are fully consumed.
+        Content content = _inputQ.peek();
+        // Skip consumed items at the head of the queue.
+        while (content != null && remaining(content) == 0)
+        {
+            _inputQ.poll();
+            content.succeeded();
+            if (LOG.isDebugEnabled())
+                LOG.debug("{} consumed {}", this, content);
+
+            if (content==EOF_CONTENT)
+            {
+                if (_listener==null)
+                    _state=EOF;
+                else
+                {
+                    _state=AEOF;
+                    boolean woken = _channelState.onReadReady(); // force callback?
+                    if (woken)
+                        wake();
+                }
+            }
+            else if (content==EARLY_EOF_CONTENT)
+                _state=EARLY_EOF;
+
+            content = _inputQ.peek();
+        }
+
+        return content;
+    }
+
+    /**
+     */
+    protected void consumeNonContent()
+    {
+        // Items are removed only when they are fully consumed.
+        Content content = _inputQ.peek();
+        // Skip consumed items at the head of the queue.
+        while (content != null && remaining(content) == 0)
+        {
+            // Defer EOF until read
+            if (content instanceof EofContent)
+                break;
+
+            // Consume all other empty content
+            _inputQ.poll();
+            content.succeeded();
+            if (LOG.isDebugEnabled())
+                LOG.debug("{} consumed {}", this, content);
+            content = _inputQ.peek();
+        }
+    }
+
+    /**
+     * Get the next readable from the inputQ, calling {@link #produceContent()}
+     * if need be. EOF is NOT processed and state is not changed.
+     *
+     * @return the content or EOF or null if none available.
+     * @throws IOException if retrieving the content fails
+     */
+    protected Content nextReadable() throws IOException
+    {
+        Content content = pollReadable();
+        if (content==null && !isFinished())
+        {
+            produceContent();
+            content = pollReadable();
+        }
+        return content;
+    }
+
+    /** Poll the inputQ for Content or EOF.
+     * Consumed buffers and non EOF {@link PoisonPillContent}s are removed.
+     * EOF state is not updated.
+     * @return Content, EOF or null
+     */
+    protected Content pollReadable()
+    {
+        // Items are removed only when they are fully consumed.
+        Content content = _inputQ.peek();
+
+        // Skip consumed items at the head of the queue except EOF
+        while (content != null)
+        {
+            if (content==EOF_CONTENT || content==EARLY_EOF_CONTENT || remaining(content)>0)
+                return content;
+
+            _inputQ.poll();
+            content.succeeded();
+            if (LOG.isDebugEnabled())
+                LOG.debug("{} consumed {}", this, content);
+            content = _inputQ.peek();
+        }
+
+        return null;
+    }
 
     /**
      * @param item the content
      * @return how many bytes remain in the given content
      */
-    protected abstract int remaining(T item);
+    protected int remaining(Content item)
+    {
+        return item.remaining();
+    }
 
     /**
      * Copies the given content into the given byte buffer.
      *
-     * @param item   the content to copy from
+     * @param content   the content to copy from
      * @param buffer the buffer to copy into
      * @param offset the buffer offset to start copying from
      * @param length the space available in the buffer
      * @return the number of bytes actually copied
      */
-    protected abstract int get(T item, byte[] buffer, int offset, int length);
+    protected int get(Content content, byte[] buffer, int offset, int length)
+    {
+        int l = Math.min(content.remaining(), length);
+        content.getContent().get(buffer, offset, l);
+        _contentConsumed+=l;
+        return l;
+    }
 
     /**
      * Consumes the given content.
+     * Calls the content succeeded if all content consumed.
      *
-     * @param item   the content to consume
+     * @param content   the content to consume
      * @param length the number of bytes to consume
      */
-    protected abstract void consume(T item, int length);
+    protected void skip(Content content, int length)
+    {
+        int l = Math.min(content.remaining(), length);
+        ByteBuffer buffer = content.getContent();
+        buffer.position(buffer.position()+l);
+        _contentConsumed+=l;
+        if (l>0 && !content.hasContent())
+            pollContent(); // hungry succeed
+
+    }
 
     /**
      * Blocks until some content or some end-of-file event arrives.
      *
      * @throws IOException if the wait is interrupted
      */
-    protected abstract void blockForContent() throws IOException;
+    protected void blockForContent() throws IOException
+    {
+        try
+        {
+            long timeout=0;
+            if (_blockingTimeoutAt>=0)
+            {
+                timeout=_blockingTimeoutAt-System.currentTimeMillis();
+                if (timeout<=0)
+                    throw new TimeoutException();
+            }
+
+            if (LOG.isDebugEnabled())
+                LOG.debug("{} blocking for content timeout={} ...", this,timeout);
+            if (timeout>0)
+                _inputQ.wait(timeout);
+            else
+                _inputQ.wait();
+
+            if (_blockingTimeoutAt>0 && System.currentTimeMillis()>=_blockingTimeoutAt)
+                throw new TimeoutException();
+        }
+        catch (Throwable e)
+        {
+            throw (IOException)new InterruptedIOException().initCause(e);
+        }
+    }
 
     /**
      * Adds some content to this input stream.
      *
      * @param item the content to add
+     * @return true if content channel woken for read
      */
-    public abstract void content(T item);
-
-    protected boolean onAsyncRead()
+    public boolean addContent(Content item)
     {
-        synchronized (lock())
+        boolean woken=false;
+        synchronized (_inputQ)
         {
-            if (_listener == null)
-                return false;
+            _inputQ.offer(item);
+            if (LOG.isDebugEnabled())
+                LOG.debug("{} addContent {}", this, item);
+
+            if (_listener==null)
+                _inputQ.notify();
+            else
+                woken=_channelState.onReadPossible();
         }
-        _channelState.onReadPossible();
-        return true;
+
+        return woken;
     }
 
-    public long getContentRead()
+    public boolean hasContent()
     {
-        synchronized (lock())
+        synchronized (_inputQ)
         {
-            return _contentRead;
+            return _inputQ.size()>0;
+        }
+    }
+
+    public void unblock()
+    {
+        synchronized (_inputQ)
+        {
+            _inputQ.notify();
+        }
+    }
+
+    public long getContentConsumed()
+    {
+        synchronized (_inputQ)
+        {
+            return _contentConsumed;
         }
     }
 
     /**
      * This method should be called to signal that an EOF has been
      * detected before all the expected content arrived.
-     * <p/>
+     * <p>
      * Typically this will result in an EOFException being thrown
      * from a subsequent read rather than a -1 return.
+     * @return true if content channel woken for read
      */
-    public void earlyEOF()
+    public boolean earlyEOF()
     {
-        synchronized (lock())
-        {
-            if (!isEOF())
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("{} early EOF", this);
-                _eofState = EARLY_EOF;
-                if (_listener == null)
-                    return;
-            }
-        }
-        _channelState.onReadPossible();
-    }
-
-
-    public boolean isEarlyEOF()
-    {
-        synchronized (lock())
-        {
-            return _contentState==EARLY_EOF;
-        }
+        return addContent(EARLY_EOF_CONTENT);
     }
 
     /**
      * This method should be called to signal that all the expected
      * content arrived.
+     * @return true if content channel woken for read
      */
-    public void messageComplete()
+    public boolean eof()
     {
-        synchronized (lock())
-        {
-            if (!isEOF())
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("{} EOF", this);
-                _eofState = EOF;
-                if (_listener == null)
-                    return;
-            }
-        }
-        _channelState.onReadPossible();
+       return addContent(EOF_CONTENT);
     }
 
     public boolean consumeAll()
     {
-        synchronized (lock())
+        synchronized (_inputQ)
         {
-            // Don't bother reading if we already know there was an error.
-            if (_onError != null)
-                return false;
-
             try
             {
                 while (!isFinished())
                 {
-                    T item = getNextContent();
+                    Content item = nextContent();
                     if (item == null)
-                        _contentState.waitForContent(this);
-                    else
-                        consume(item, remaining(item));
+                        break; // Let's not bother blocking
+
+                    skip(item, remaining(item));
                 }
-                return true;
+                return isFinished() && !isError();
             }
             catch (IOException e)
             {
@@ -306,31 +464,28 @@
         }
     }
 
-    public boolean isAsync()
+    public boolean isError()
     {
-        synchronized (lock())
+        synchronized (_inputQ)
         {
-            return _contentState==ASYNC;
+            return _state instanceof ErrorState;
         }
     }
 
-    /**
-     * @return whether an EOF has been detected, even though there may be content to consume.
-     */
-    public boolean isEOF()
+    public boolean isAsync()
     {
-        synchronized (lock())
+        synchronized (_inputQ)
         {
-            return _eofState != null && _eofState.isEOF();
+            return _state==ASYNC;
         }
     }
 
     @Override
     public boolean isFinished()
     {
-        synchronized (lock())
+        synchronized (_inputQ)
         {
-            return _contentState.isEOF();
+            return _state instanceof EOFState;
         }
     }
 
@@ -338,155 +493,272 @@
     @Override
     public boolean isReady()
     {
-        boolean finished;
-        synchronized (lock())
+        try
         {
-            if (_contentState.isEOF())
-                return true;
-            if (_listener == null )
-                return true;
-            if (available() > 0)
-                return true;
-            if (_notReady)
-                return false;
-            _notReady = true;
-            finished = isFinished();
-        }
-        if (finished)
-            _channelState.onReadPossible();
-        else
-            unready();
-        return false;
-    }
+            synchronized (_inputQ)
+            {
+                if (_listener == null )
+                    return true;
+                if (_state instanceof EOFState)
+                    return true;
+                if (nextReadable()!=null)
+                    return true;
 
-    protected void unready()
-    {
+                _channelState.onReadUnready();
+            }
+            return false;
+        }
+        catch(IOException e)
+        {
+            LOG.ignore(e);
+            return true;
+        }
     }
 
     @Override
     public void setReadListener(ReadListener readListener)
     {
+        readListener = Objects.requireNonNull(readListener);
+        boolean woken=false;
         try
         {
-            readListener = Objects.requireNonNull(readListener);
-            boolean content;
-            synchronized (lock())
+            synchronized (_inputQ)
             {
-                if (_contentState != STREAM)
-                    throw new IllegalStateException("state=" + _contentState);
-                _contentState = ASYNC;
+                if (_listener != null)
+                    throw new IllegalStateException("ReadListener already set");
+                if (_state != STREAM)
+                    throw new IllegalStateException("State "+STREAM+" != " + _state);
+
+                _state = ASYNC;
                 _listener = readListener;
-                _notReady = true;
+                boolean content=nextContent()!=null;
 
-                content = getNextContent()!=null || isEOF();
-
+                if (content)
+                    woken = _channelState.onReadReady();
+                else
+                    _channelState.onReadUnready();
             }
-            if (content)
-                _channelState.onReadPossible();
-            else
-                unready();
         }
         catch(IOException e)
         {
             throw new RuntimeIOException(e);
         }
+
+        if (woken)
+            wake();
     }
 
-    public void failed(Throwable x)
+    public boolean failed(Throwable x)
     {
-        synchronized (lock())
+        boolean woken=false;
+        synchronized (_inputQ)
         {
-            if (_onError != null)
+            if (_state instanceof ErrorState)
                 LOG.warn(x);
             else
-                _onError = x;
+                _state = new ErrorState(x);
+
+            if (_listener==null)
+                _inputQ.notify();
+            else
+                woken=_channelState.onReadPossible();
         }
+
+        return woken;
     }
 
+    /* ------------------------------------------------------------ */
+    /*
+     * <p>
+     * While this class is-a Runnable, it should never be dispatched in it's own thread. It is a
+     * runnable only so that the calling thread can use {@link ContextHandler#handle(Runnable)}
+     * to setup classloaders etc.
+     * </p>
+     */
     @Override
     public void run()
     {
         final Throwable error;
         final ReadListener listener;
-        boolean available = false;
-        final boolean eof;
+        boolean aeof=false;
 
-        synchronized (lock())
+        synchronized (_inputQ)
         {
-            if (!_notReady || _listener == null)
+            if (_state==EOF)
                 return;
 
-            error = _onError;
+            if (_state==AEOF)
+            {
+                _state=EOF;
+                aeof=true;
+            }
+
             listener = _listener;
-
-            try
-            {
-                T item = getNextContent();
-                available = item != null && remaining(item) > 0;
-            }
-            catch (Exception e)
-            {
-                failed(e);
-            }
-
-            eof = !available && isFinished();
-            _notReady = !available && !eof;
+            error = _state instanceof ErrorState?((ErrorState)_state).getError():null;
         }
 
         try
         {
-            if (error != null)
+            if (error!=null)
+            {
+                _channelState.getHttpChannel().getResponse().getHttpFields().add(HttpConnection.CONNECTION_CLOSE);
                 listener.onError(error);
-            else if (available)
-                listener.onDataAvailable();
-            else if (eof)
+            }
+            else if (aeof)
+            {
                 listener.onAllDataRead();
+            }
             else
-                unready();
+            {
+                listener.onDataAvailable();
+            }
         }
         catch (Throwable e)
         {
             LOG.warn(e.toString());
             LOG.debug(e);
-            listener.onError(e);
+            try
+            {
+                if (aeof || error==null)
+                {
+                    _channelState.getHttpChannel().getResponse().getHttpFields().add(HttpConnection.CONNECTION_CLOSE);
+                    listener.onError(e);
+                }
+            }
+            catch (Throwable e2)
+            {
+                LOG.warn(e2.toString());
+                LOG.debug(e2);
+                throw new RuntimeIOException(e2);
+            }
         }
     }
 
     @Override
     public String toString()
     {
-        return String.format("%s@%x[r=%d,s=%s,e=%s,f=%s]",
+        return String.format("%s@%x[c=%d,s=%s]",
                 getClass().getSimpleName(),
                 hashCode(),
-                _contentRead,
-                _contentState,
-                _eofState,
-                _onError);
+                _contentConsumed,
+                _state);
     }
 
+    public static class PoisonPillContent extends Content
+    {
+        private final String _name;
+        public PoisonPillContent(String name)
+        {
+            super(BufferUtil.EMPTY_BUFFER);
+            _name=name;
+        }
+
+        @Override
+        public String toString()
+        {
+            return _name;
+        }
+    }
+
+    public static class EofContent extends PoisonPillContent
+    {
+        EofContent(String name)
+        {
+            super(name);
+        }
+    }
+
+    public static class Content implements Callback
+    {
+        private final ByteBuffer _content;
+
+        public Content(ByteBuffer content)
+        {
+            _content=content;
+        }
+
+        @Override
+        public boolean isNonBlocking()
+        {
+            return true;
+        }
+
+
+        public ByteBuffer getContent()
+        {
+            return _content;
+        }
+
+        public boolean hasContent()
+        {
+            return _content.hasRemaining();
+        }
+
+        public int remaining()
+        {
+            return _content.remaining();
+        }
+
+        @Override
+        public String toString()
+        {
+            return String.format("Content@%x{%s}",hashCode(),BufferUtil.toDetailString(_content));
+        }
+    }
+
+
     protected static abstract class State
     {
-        public void waitForContent(HttpInput<?> in) throws IOException
+        public boolean blockForContent(HttpInput in) throws IOException
         {
+            return false;
         }
 
         public int noContent() throws IOException
         {
             return -1;
         }
+    }
 
-        public boolean isEOF()
+    protected static class EOFState extends State
+    {
+    }
+
+    protected class ErrorState extends EOFState
+    {
+        final Throwable _error;
+        ErrorState(Throwable error)
         {
-            return false;
+            _error=error;
+        }
+
+        public Throwable getError()
+        {
+            return _error;
+        }
+
+        @Override
+        public int noContent() throws IOException
+        {
+            if (_error instanceof IOException)
+                throw (IOException)_error;
+            throw new IOException(_error);
+        }
+
+        @Override
+        public String toString()
+        {
+            return "ERROR:"+_error;
         }
     }
 
     protected static final State STREAM = new State()
     {
         @Override
-        public void waitForContent(HttpInput<?> input) throws IOException
+        public boolean blockForContent(HttpInput input) throws IOException
         {
             input.blockForContent();
+            return true;
         }
 
         @Override
@@ -511,7 +783,7 @@
         }
     };
 
-    protected static final State EARLY_EOF = new State()
+    protected static final State EARLY_EOF = new EOFState()
     {
         @Override
         public int noContent() throws IOException
@@ -520,30 +792,28 @@
         }
 
         @Override
-        public boolean isEOF()
-        {
-            return true;
-        }
-
-        @Override
         public String toString()
         {
             return "EARLY_EOF";
         }
     };
 
-    protected static final State EOF = new State()
+    protected static final State EOF = new EOFState()
     {
         @Override
-        public boolean isEOF()
-        {
-            return true;
-        }
-
-        @Override
         public String toString()
         {
             return "EOF";
         }
     };
+
+    protected static final State AEOF = new EOFState()
+    {
+        @Override
+        public String toString()
+        {
+            return "AEOF";
+        }
+    };
+
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpInputOverHTTP.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpInputOverHTTP.java
index 115b9af..f8f718f 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpInputOverHTTP.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpInputOverHTTP.java
@@ -19,128 +19,31 @@
 package org.eclipse.jetty.server;
 
 import java.io.IOException;
-import java.nio.ByteBuffer;
 
-import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.SharedBlockingCallback;
-import org.eclipse.jetty.util.SharedBlockingCallback.Blocker;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-public class HttpInputOverHTTP extends HttpInput<ByteBuffer> implements Callback
+public class HttpInputOverHTTP extends HttpInput
 {
-    private static final Logger LOG = Log.getLogger(HttpInputOverHTTP.class);
-    private final SharedBlockingCallback _readBlocker = new SharedBlockingCallback();
-    private final HttpConnection _httpConnection;
-    private ByteBuffer _content;
-
-    /**
-     * @param httpConnection
-     */
-    public HttpInputOverHTTP(HttpConnection httpConnection)
+    public HttpInputOverHTTP(HttpChannelState state)
     {
-        _httpConnection = httpConnection;
+        super(state);
     }
 
     @Override
-    public void recycle()
+    protected void produceContent() throws IOException
     {
-        synchronized (lock())
-        {
-            super.recycle();
-            _content=null;
-        }
+        ((HttpConnection)getHttpChannelState().getHttpChannel().getEndPoint().getConnection()).fillAndParseForContent();
     }
 
     @Override
     protected void blockForContent() throws IOException
     {
-        while(true)
+        ((HttpConnection)getHttpChannelState().getHttpChannel().getEndPoint().getConnection()).blockingReadFillInterested();
+        try
         {
-            try (Blocker blocker=_readBlocker.acquire())
-            {            
-                _httpConnection.fillInterested(blocker);
-                if (LOG.isDebugEnabled())
-                    LOG.debug("{} block readable on {}",this,blocker);
-                blocker.block();
-            }
-
-            Object content=getNextContent();
-            if (content!=null || isFinished())
-                break;
+            super.blockForContent();
         }
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("%s@%x",getClass().getSimpleName(),hashCode());
-    }
-
-    @Override
-    protected ByteBuffer nextContent() throws IOException
-    {
-        // If we have some content available, return it
-        if (BufferUtil.hasContent(_content))
-            return _content;
-
-        // No - then we are going to need to parse some more content
-        _content=null;
-        _httpConnection.parseContent();
-        
-        // If we have some content available, return it
-        if (BufferUtil.hasContent(_content))
-            return _content;
-
-        return null;
-
-    }
-
-    @Override
-    protected int remaining(ByteBuffer item)
-    {
-        return item.remaining();
-    }
-
-    @Override
-    protected int get(ByteBuffer item, byte[] buffer, int offset, int length)
-    {
-        int l = Math.min(item.remaining(), length);
-        item.get(buffer, offset, l);
-        return l;
-    }
-
-    @Override
-    protected void consume(ByteBuffer item, int length)
-    {
-        item.position(item.position()+length);
-    }
-
-    @Override
-    public void content(ByteBuffer item)
-    {
-        if (BufferUtil.hasContent(_content))
-            throw new IllegalStateException();
-        _content=item;
-    }
-
-    @Override
-    protected void unready()
-    {
-        _httpConnection.fillInterested(this);
-    }
-
-    @Override
-    public void succeeded()
-    {
-        _httpConnection.getHttpChannel().getState().onReadPossible();
-    }
-
-    @Override
-    public void failed(Throwable x)
-    {
-        super.failed(x);
-        _httpConnection.getHttpChannel().getState().onReadPossible();
+        catch(Throwable e)
+        {
+            ((HttpConnection)getHttpChannelState().getHttpChannel().getEndPoint().getConnection()).blockingReadException(e);
+        }
     }
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java
index ddae39c..ca35951 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java
@@ -18,12 +18,14 @@
 
 package org.eclipse.jetty.server;
 
+import java.io.Closeable;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
 import java.nio.channels.ReadableByteChannel;
 import java.nio.channels.WritePendingException;
 import java.util.concurrent.atomic.AtomicReference;
+
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.ServletRequest;
@@ -53,40 +55,57 @@
  */
 public class HttpOutput extends ServletOutputStream implements Runnable
 {
-    private static Logger LOG = Log.getLogger(HttpOutput.class);
-    private final HttpChannel<?> _channel;
-    private final SharedBlockingCallback _writeblock=new SharedBlockingCallback()
+    public interface Interceptor
     {
-        @Override
-        protected long getIdleTimeout()
-        {
-            return _channel.getIdleTimeout();
-        }
-    };
+        void write(ByteBuffer content, boolean complete, Callback callback);
+        Interceptor getNextInterceptor();
+        boolean isOptimizedForDirectBuffers();
+    }
+    
+    private static Logger LOG = Log.getLogger(HttpOutput.class);
+
+    private final HttpChannel _channel;
+    private final SharedBlockingCallback _writeBlock;
+    private Interceptor _interceptor;
+    
+    /** Bytes written via the write API (excludes bytes written via sendContent). Used to autocommit once content length is written. */
     private long _written;
+    
     private ByteBuffer _aggregate;
     private int _bufferSize;
     private int _commitSize;
     private WriteListener _writeListener;
     private volatile Throwable _onError;
-
     /*
     ACTION             OPEN       ASYNC      READY      PENDING       UNREADY       CLOSED
-    -----------------------------------------------------------------------------------------------------
+    -------------------------------------------------------------------------------------------
     setWriteListener() READY->owp ise        ise        ise           ise           ise
     write()            OPEN       ise        PENDING    wpe           wpe           eof
     flush()            OPEN       ise        PENDING    wpe           wpe           eof
     close()            CLOSED     CLOSED     CLOSED     CLOSED        wpe           CLOSED
     isReady()          OPEN:true  READY:true READY:true UNREADY:false UNREADY:false CLOSED:true
     write completed    -          -          -          ASYNC         READY->owp    -
-    
     */
-    enum OutputState { OPEN, ASYNC, READY, PENDING, UNREADY, ERROR, CLOSED }
+    private enum OutputState { OPEN, ASYNC, READY, PENDING, UNREADY, ERROR, CLOSED }
     private final AtomicReference<OutputState> _state=new AtomicReference<>(OutputState.OPEN);
 
-    public HttpOutput(HttpChannel<?> channel)
+    public HttpOutput(HttpChannel channel)
     {
         _channel = channel;
+        _interceptor = channel;
+        _writeBlock = new SharedBlockingCallback()
+        {
+            @Override
+            protected long getIdleTimeout()
+            {
+                long bto = getHttpChannel().getHttpConfiguration().getBlockingTimeout();
+                if (bto>0)
+                    return bto;
+                if (bto<0)
+                    return -1;
+                return _channel.getIdleTimeout();
+            }
+        };
         HttpConfiguration config = channel.getHttpConfiguration();
         _bufferSize = config.getOutputBufferSize();
         _commitSize = config.getOutputAggregationSize();
@@ -97,10 +116,20 @@
         }
     }
     
-    public HttpChannel<?> getHttpChannel()
+    public HttpChannel getHttpChannel()
     {
         return _channel;
     }
+
+    public Interceptor getInterceptor()
+    {
+        return _interceptor;
+    }
+
+    public void setInterceptor(Interceptor filter)
+    {
+        _interceptor=filter;
+    }
     
     public boolean isWritten()
     {
@@ -112,12 +141,6 @@
         return _written;
     }
 
-    public void reset()
-    {
-        _written = 0;
-        reopen();
-    }
-
     public void reopen()
     {
         _state.set(OutputState.OPEN);
@@ -130,89 +153,121 @@
 
     protected Blocker acquireWriteBlockingCallback() throws IOException
     {
-        return _writeblock.acquire();
+        return _writeBlock.acquire();
     }
     
-    protected void write(ByteBuffer content, boolean complete) throws IOException
+    private void write(ByteBuffer content, boolean complete) throws IOException
     {
-        try (Blocker blocker=_writeblock.acquire())
+        try (Blocker blocker = _writeBlock.acquire())
         {        
-            write(content,complete,blocker);
+            write(content, complete, blocker);
             blocker.block();
         }
+        catch (Throwable failure)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug(failure);
+            abort(failure);
+            throw failure;
+        }
     }
-    
+
     protected void write(ByteBuffer content, boolean complete, Callback callback)
     {
-        _channel.write(content,complete,callback);
+        _interceptor.write(content, complete, callback);
     }
-    
+
+    private void abort(Throwable failure)
+    {
+        closed();
+        _channel.abort(failure);
+    }
+
     @Override
     public void close()
     {
-        loop: while(true)
+        while(true)
         {
             OutputState state=_state.get();
             switch (state)
             {
                 case CLOSED:
-                    break loop;
-                    
+                {
+                    return;
+                }
                 case UNREADY:
+                {
                     if (_state.compareAndSet(state,OutputState.ERROR))
                         _writeListener.onError(_onError==null?new EofException("Async close"):_onError);
-                    continue;
-                    
+                    break;
+                }
                 default:
-                    if (_state.compareAndSet(state,OutputState.CLOSED))
+                {
+                    if (!_state.compareAndSet(state,OutputState.CLOSED))
+                        break;
+
+                    try
                     {
-                        try
-                        {
-                            write(BufferUtil.hasContent(_aggregate)?_aggregate:BufferUtil.EMPTY_BUFFER,!_channel.getResponse().isIncluding());
-                        }
-                        catch(IOException e)
-                        {
-                            LOG.debug(e);
-                            _channel.abort();
-                        }
-                        releaseBuffer();
-                        return;
+                        write(BufferUtil.hasContent(_aggregate)?_aggregate:BufferUtil.EMPTY_BUFFER, !_channel.getResponse().isIncluding());
                     }
+                    catch (IOException x)
+                    {
+                        // Ignore it, it's been already logged in write().
+                    }
+                    finally
+                    {
+                        releaseBuffer();
+                    }
+                    // Return even if an exception is thrown by write().
+                    return;
+                }
             }
         }
     }
 
-    /* Called to indicated that the output is already closed (write with last==true performed) and the state needs to be updated to match */
+    /**
+     * Called to indicate that the last write has been performed.
+     * It updates the state and performs cleanup operations.
+     */
     void closed()
     {
-        loop: while(true)
+        while(true)
         {
             OutputState state=_state.get();
             switch (state)
             {
                 case CLOSED:
-                    break loop;
-                    
+                {
+                    return;
+                }
                 case UNREADY:
+                {
                     if (_state.compareAndSet(state,OutputState.ERROR))
                         _writeListener.onError(_onError==null?new EofException("Async closed"):_onError);
-                    continue;
-                    
+                    break;
+                }
                 default:
-                    if (_state.compareAndSet(state,OutputState.CLOSED))
+                {
+                    if (!_state.compareAndSet(state, OutputState.CLOSED))
+                        break;
+
+                    try
                     {
-                        try
-                        {
-                            _channel.getResponse().closeOutput();
-                        }
-                        catch(IOException e)
-                        {
-                            LOG.debug(e);
-                            _channel.abort();
-                        }
-                        releaseBuffer();
-                        return;
+                        _channel.getResponse().closeOutput();
                     }
+                    catch (Throwable x)
+                    {
+                        if (LOG.isDebugEnabled())
+                            LOG.debug(x);
+                        abort(x);
+                    }
+                    finally
+                    {
+                        releaseBuffer();
+                    }
+                    // Return even if an exception is thrown by closeOutput().
+                    return;
+                }
             }
         }
     }
@@ -260,12 +315,13 @@
                     
                 case CLOSED:
                     return;
+
+                default:
+                    throw new IllegalStateException();
             }
-            break;
         }
     }
 
-
     @Override
     public void write(byte[] b, int off, int len) throws IOException
     {
@@ -292,7 +348,7 @@
                     if (!complete && len<=_commitSize)
                     {
                         if (_aggregate == null)
-                            _aggregate = _channel.getByteBufferPool().acquire(getBufferSize(), false);
+                            _aggregate = _channel.getByteBufferPool().acquire(getBufferSize(), _interceptor.isOptimizedForDirectBuffers());
 
                         // YES - fill the aggregate with content from the buffer
                         int filled = BufferUtil.fill(_aggregate, b, off, len);
@@ -323,11 +379,13 @@
                     
                 case CLOSED:
                     throw new EofException("Closed");
+
+                default:
+                    throw new IllegalStateException();
             }
             break;
         }
 
-
         // handle blocking write
 
         // Should we aggregate?
@@ -335,7 +393,7 @@
         if (!complete && len<=_commitSize)
         {
             if (_aggregate == null)
-                _aggregate = _channel.getByteBufferPool().acquire(capacity, false);
+                _aggregate = _channel.getByteBufferPool().acquire(capacity, _interceptor.isOptimizedForDirectBuffers());
 
             // YES - fill the aggregate with content from the buffer
             int filled = BufferUtil.fill(_aggregate, b, off, len);
@@ -383,11 +441,12 @@
             write(view,complete);
         }
         else if (complete)
-            write(BufferUtil.EMPTY_BUFFER,complete);
+        {
+            write(BufferUtil.EMPTY_BUFFER,true);
+        }
 
         if (complete)
             closed();
-
     }
 
     public void write(ByteBuffer buffer) throws IOException
@@ -424,6 +483,9 @@
                     
                 case CLOSED:
                     throw new EofException("Closed");
+
+                default:
+                    throw new IllegalStateException();
             }
             break;
         }
@@ -440,7 +502,7 @@
         if (len>0)
             write(buffer, complete);
         else if (complete)
-            write(BufferUtil.EMPTY_BUFFER,complete);
+            write(BufferUtil.EMPTY_BUFFER, true);
 
         if (complete)
             closed();
@@ -459,17 +521,13 @@
             {
                 case OPEN:
                     if (_aggregate == null)
-                        _aggregate = _channel.getByteBufferPool().acquire(getBufferSize(), false);
+                        _aggregate = _channel.getByteBufferPool().acquire(getBufferSize(), _interceptor.isOptimizedForDirectBuffers());
                     BufferUtil.append(_aggregate, (byte)b);
 
                     // Check if all written or full
                     if (complete || BufferUtil.isFull(_aggregate))
                     {
-                        try(Blocker blocker=_writeblock.acquire())
-                        {
-                            write(_aggregate, complete, blocker);
-                            blocker.block();
-                        }
+                        write(_aggregate, complete);
                         if (complete)
                             closed();
                     }
@@ -483,7 +541,7 @@
                         continue;
 
                     if (_aggregate == null)
-                        _aggregate = _channel.getByteBufferPool().acquire(getBufferSize(), false);
+                        _aggregate = _channel.getByteBufferPool().acquire(getBufferSize(), _interceptor.isOptimizedForDirectBuffers());
                     BufferUtil.append(_aggregate, (byte)b);
 
                     // Check if all written or full
@@ -507,6 +565,9 @@
                     
                 case CLOSED:
                     throw new EofException("Closed");
+
+                default:
+                    throw new IllegalStateException();
             }
             break;
         }
@@ -521,71 +582,98 @@
         write(s.getBytes(_channel.getResponse().getCharacterEncoding()));
     }
 
-    /* ------------------------------------------------------------ */
-    /** Blocking send of content.
-     * @param content The content to send.
-     * @throws IOException
+    /**
+     * Blocking send of whole content.
+     *
+     * @param content The whole content to send
+     * @throws IOException if the send fails
      */
     public void sendContent(ByteBuffer content) throws IOException
     {
-        try(Blocker blocker=_writeblock.acquire())
-        {
-            write(content,true,blocker);
-            blocker.block();
-        }
+        if (LOG.isDebugEnabled())
+            LOG.debug("sendContent({})",BufferUtil.toDetailString(content));
+        
+        write(content, true);
+        closed();
     }
 
-    /* ------------------------------------------------------------ */
-    /** Blocking send of content.
-     * @param in The content to send
-     * @throws IOException
+    /**
+     * Blocking send of stream content.
+     *
+     * @param in The stream content to send
+     * @throws IOException if the send fails
      */
     public void sendContent(InputStream in) throws IOException
     {
-        try(Blocker blocker=_writeblock.acquire())
+        try(Blocker blocker = _writeBlock.acquire())
         {
-            new InputStreamWritingCB(in,blocker).iterate();
+            new InputStreamWritingCB(in, blocker).iterate();
             blocker.block();
         }
+        catch (Throwable failure)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug(failure);
+            abort(failure);
+            throw failure;
+        }
     }
 
-    /* ------------------------------------------------------------ */
-    /** Blocking send of content.
-     * @param in The content to send
-     * @throws IOException
+    /**
+     * Blocking send of channel content.
+     *
+     * @param in The channel content to send
+     * @throws IOException if the send fails
      */
     public void sendContent(ReadableByteChannel in) throws IOException
     {
-        try(Blocker blocker=_writeblock.acquire())
+        try(Blocker blocker = _writeBlock.acquire())
         {
-            new ReadableByteChannelWritingCB(in,blocker).iterate();
+            new ReadableByteChannelWritingCB(in, blocker).iterate();
             blocker.block();
         }
+        catch (Throwable failure)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug(failure);
+            abort(failure);
+            throw failure;
+        }
     }
 
-
-    /* ------------------------------------------------------------ */
-    /** Blocking send of content.
-     * @param content The content to send
-     * @throws IOException
+    /**
+     * Blocking send of HTTP content.
+     *
+     * @param content The HTTP content to send
+     * @throws IOException if the send fails
      */
     public void sendContent(HttpContent content) throws IOException
     {
-        try(Blocker blocker=_writeblock.acquire())
+        try(Blocker blocker = _writeBlock.acquire())
         {
-            sendContent(content,blocker);
+            sendContent(content, blocker);
             blocker.block();
         }
+        catch (Throwable failure)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug(failure);
+            abort(failure);
+            throw failure;
+        }
     }
 
-    /* ------------------------------------------------------------ */
-    /** Asynchronous send of content.
-     * @param content The content to send
+    /**
+     * Asynchronous send of whole content.
+     * @param content The whole content to send
      * @param callback The callback to use to notify success or failure
      */
     public void sendContent(ByteBuffer content, final Callback callback)
     {
-        write(content,true,new Callback()
+        if (LOG.isDebugEnabled())
+            LOG.debug("sendContent(buffer={},{})",BufferUtil.toDetailString(content),callback);
+        
+        write(content, true, new Callback()
         {
             @Override
             public void succeeded()
@@ -597,40 +685,53 @@
             @Override
             public void failed(Throwable x)
             {
+                abort(x);
                 callback.failed(x);
             }
         });
     }
 
-    /* ------------------------------------------------------------ */
-    /** Asynchronous send of content.
-     * @param in The content to send as a stream.  The stream will be closed
-     * after reading all content.
+    /**
+     * Asynchronous send of stream content.
+     * The stream will be closed after reading all content.
+     *
+     * @param in The stream content to send
      * @param callback The callback to use to notify success or failure
      */
     public void sendContent(InputStream in, Callback callback)
     {
-        new InputStreamWritingCB(in,callback).iterate();
+        if (LOG.isDebugEnabled())
+            LOG.debug("sendContent(stream={},{})",in,callback);
+        
+        new InputStreamWritingCB(in, callback).iterate();
     }
 
-    /* ------------------------------------------------------------ */
-    /** Asynchronous send of content.
-     * @param in The content to send as a channel.  The channel will be closed
-     * after reading all content.
+    /**
+     * Asynchronous send of channel content.
+     * The channel will be closed after reading all content.
+     *
+     * @param in The channel content to send
      * @param callback The callback to use to notify success or failure
      */
     public void sendContent(ReadableByteChannel in, Callback callback)
     {
-        new ReadableByteChannelWritingCB(in,callback).iterate();
+        if (LOG.isDebugEnabled())
+            LOG.debug("sendContent(channel={},{})",in,callback);
+        
+        new ReadableByteChannelWritingCB(in, callback).iterate();
     }
 
-    /* ------------------------------------------------------------ */
-    /** Asynchronous send of content.
-     * @param httpContent The content to send
+    /**
+     * Asynchronous send of HTTP content.
+     *
+     * @param httpContent The HTTP content to send
      * @param callback The callback to use to notify success or failure
      */
     public void sendContent(HttpContent httpContent, Callback callback)
     {
+        if (LOG.isDebugEnabled())
+            LOG.debug("sendContent(http={},{})",httpContent,callback);
+        
         if (BufferUtil.hasContent(_aggregate))
         {
             callback.failed(new IOException("cannot sendContent() after write()"));
@@ -650,6 +751,7 @@
                     if (!_state.compareAndSet(OutputState.OPEN, OutputState.PENDING))
                         continue;
                     break;
+
                 case ERROR:
                     callback.failed(new EofException(_onError));
                     return;
@@ -657,20 +759,19 @@
                 case CLOSED:
                     callback.failed(new EofException("Closed"));
                     return;
+
                 default:
                     throw new IllegalStateException();
             }
             break;
         }
-        ByteBuffer buffer= _channel.useDirectBuffers()?httpContent.getDirectBuffer():null;
+
+        ByteBuffer buffer = _channel.useDirectBuffers() ? httpContent.getDirectBuffer() : null;
         if (buffer == null)
             buffer = httpContent.getIndirectBuffer();
 
         if (buffer!=null)
         {
-            if (LOG.isDebugEnabled())
-                LOG.debug("sendContent({}=={},{},direct={})",httpContent,BufferUtil.toDetailString(buffer),callback,_channel.useDirectBuffers());
-            
             sendContent(buffer,callback);
             return;
         }
@@ -680,29 +781,25 @@
             ReadableByteChannel rbc=httpContent.getReadableByteChannel();
             if (rbc!=null)
             {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("sendContent({}=={},{},direct={})",httpContent,rbc,callback,_channel.useDirectBuffers());
                 // Close of the rbc is done by the async sendContent
                 sendContent(rbc,callback);
                 return;
             }
 
             InputStream in = httpContent.getInputStream();
-            if ( in!=null )
+            if (in!=null)
             {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("sendContent({}=={},{},direct={})",httpContent,in,callback,_channel.useDirectBuffers());
                 sendContent(in,callback);
                 return;
             }
+
+            throw new IllegalArgumentException("unknown content for "+httpContent);
         }
         catch(Throwable th)
         {
+            abort(th);
             callback.failed(th);
-            return;
         }
-
-        callback.failed(new IllegalArgumentException("unknown content for "+httpContent));
     }
 
     public int getBufferSize()
@@ -716,10 +813,18 @@
         _commitSize = size;
     }
 
+    public void recycle()
+    {
+        resetBuffer();
+        _interceptor=_channel;
+    }
+    
     public void resetBuffer()
     {
+        _written = 0;
         if (BufferUtil.hasContent(_aggregate))
             BufferUtil.clear(_aggregate);
+        reopen();
     }
 
     @Override
@@ -731,7 +836,8 @@
         if (_state.compareAndSet(OutputState.OPEN, OutputState.READY))
         {
             _writeListener = writeListener;
-            _channel.getState().onWritePossible();
+            if (_channel.getState().onWritePossible())
+                _channel.execute(_channel);
         }
         else
             throw new IllegalStateException();
@@ -749,16 +855,20 @@
             {
                 case OPEN:
                     return true;
+
                 case ASYNC:
                     if (!_state.compareAndSet(OutputState.ASYNC, OutputState.READY))
                         continue;
                     return true;
+
                 case READY:
                     return true;
+
                 case PENDING:
                     if (!_state.compareAndSet(OutputState.PENDING, OutputState.UNREADY))
                         continue;
                     return false;
+
                 case UNREADY:
                     return false;
 
@@ -767,6 +877,9 @@
                     
                 case CLOSED:
                     return true;
+
+                default:
+                    throw new IllegalStateException();
             }
         }
     }
@@ -784,10 +897,12 @@
                 {
                     case CLOSED:
                     case ERROR:
+                    {
                         _onError=null;
                         break loop;
-
+                    }
                     default:
+                    {
                         if (_state.compareAndSet(state, OutputState.ERROR))
                         {
                             Throwable th=_onError;
@@ -796,10 +911,9 @@
                                 LOG.debug("onError",th);
                             _writeListener.onError(th);
                             close();
-
                             break loop;
                         }
-
+                    }
                 }
                 continue;
             }
@@ -807,10 +921,10 @@
             switch(_state.get())
             {
                 case CLOSED:
-                    // even though a write is not possible, because a close has 
+                    // Even though a write is not possible, because a close has
                     // occurred, we need to call onWritePossible to tell async
                     // producer that the last write completed.
-                    // so fall through
+                    // So fall through
                 case READY:
                     try
                     {
@@ -819,7 +933,7 @@
                     }
                     catch (Throwable e)
                     {
-                        _onError=e;
+                        _onError = e;
                     }
                     break;
                     
@@ -828,13 +942,25 @@
             }
         }
     }
-    
+
+    private void close(Closeable resource)
+    {
+        try
+        {
+            resource.close();
+        }
+        catch (Throwable x)
+        {
+            LOG.ignore(x);
+        }
+    }
+
     @Override
     public String toString()
     {
         return String.format("%s@%x{%s}",this.getClass().getSimpleName(),hashCode(),_state.get());
     }
-    
+
     private abstract class AsyncICB extends IteratingCallback
     {
         @Override
@@ -853,7 +979,8 @@
                     case UNREADY:
                         if (!_state.compareAndSet(OutputState.UNREADY, OutputState.READY))
                             continue;
-                        _channel.getState().onWritePossible();
+                        if (_channel.getState().onWritePossible())
+                            _channel.execute(_channel);
                         break;
 
                     case CLOSED:
@@ -870,11 +997,11 @@
         public void onCompleteFailure(Throwable e)
         {
             _onError=e==null?new IOException():e;
-            _channel.getState().onWritePossible();
+            if (_channel.getState().onWritePossible())
+                _channel.execute(_channel);
         }
     }
-    
-    
+
     private class AsyncFlush extends AsyncICB
     {
         protected volatile boolean _flushed;
@@ -904,8 +1031,6 @@
         }
     }
 
-
-
     private class AsyncWrite extends AsyncICB
     {
         private final ByteBuffer _buffer;
@@ -928,7 +1053,13 @@
             _buffer=buffer;
             _len=buffer.remaining();
             // Use a slice buffer for large indirect to avoid JVM pooling large direct buffers
-            _slice=_buffer.isDirect()||_len<getBufferSize()?null:_buffer.duplicate();
+            if (_buffer.isDirect()||_len<getBufferSize())
+                _slice=null;
+            else
+            {
+                _slice=_buffer.duplicate();
+                _buffer.position(_buffer.limit());
+            }                
             _complete=complete;
         }
 
@@ -980,10 +1111,12 @@
             if (_complete && !_completed)
             {
                 _completed=true;
-                write(BufferUtil.EMPTY_BUFFER, _complete, this);
+                write(BufferUtil.EMPTY_BUFFER, true, this);
                 return Action.SCHEDULED;
             }
 
+            if (LOG.isDebugEnabled() && _completed)
+                LOG.debug("EOF of {}",this);
             return Action.SUCCEEDED;
         }
 
@@ -994,13 +1127,10 @@
             if (_complete)
                 closed();
         }
-        
-        
     }
 
-
-    /* ------------------------------------------------------------ */
-    /** An iterating callback that will take content from an
+    /**
+     * An iterating callback that will take content from an
      * InputStream and write it to the associated {@link HttpChannel}.
      * A non direct buffer of size {@link HttpOutput#getBufferSize()} is used.
      * This callback is passed to the {@link HttpChannel#write(ByteBuffer, boolean, Callback)} to
@@ -1027,6 +1157,8 @@
             // a write done with EOF=true
             if (_eof)
             {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("EOF of {}",this);
                 // Handle EOF
                 _in.close();
                 closed();
@@ -1055,18 +1187,11 @@
         @Override
         public void onCompleteFailure(Throwable x)
         {
-            super.onCompleteFailure(x);
+            abort(x);
             _channel.getByteBufferPool().release(_buffer);
-            try
-            {
-                _in.close();
-            }
-            catch (IOException e)
-            {
-                LOG.ignore(e);
-            }
+            HttpOutput.this.close(_in);
+            super.onCompleteFailure(x);
         }
-
     }
 
     /* ------------------------------------------------------------ */
@@ -1090,7 +1215,7 @@
             _in=in;
             _buffer = _channel.getByteBufferPool().acquire(getBufferSize(), _channel.useDirectBuffers());
         }
-
+        
         @Override
         protected Action process() throws Exception
         {
@@ -1098,6 +1223,8 @@
             // a write done with EOF=true
             if (_eof)
             {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("EOF of {}",this);
                 _in.close();
                 closed();
                 _channel.getByteBufferPool().release(_buffer);
@@ -1112,23 +1239,17 @@
             // write what we have
             _buffer.flip();
             write(_buffer,_eof,this);
-
+            
             return Action.SCHEDULED;
         }
 
         @Override
         public void onCompleteFailure(Throwable x)
         {
-            super.onCompleteFailure(x);
+            abort(x);
             _channel.getByteBufferPool().release(_buffer);
-            try
-            {
-                _in.close();
-            }
-            catch (IOException e)
-            {
-                LOG.ignore(e);
-            }
+            HttpOutput.this.close(_in);
+            super.onCompleteFailure(x);
         }
     }
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpTransport.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpTransport.java
index ed2b808..2974306 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpTransport.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpTransport.java
@@ -20,21 +20,41 @@
 
 import java.nio.ByteBuffer;
 
-import org.eclipse.jetty.http.HttpGenerator;
+import org.eclipse.jetty.http.MetaData;
 import org.eclipse.jetty.util.Callback;
 
+
+/* ------------------------------------------------------------ */
+/** Abstraction of the outbound HTTP transport.
+ */
 public interface HttpTransport
 {    
-    void send(HttpGenerator.ResponseInfo info, ByteBuffer content, boolean lastContent, Callback callback);
+    void send(MetaData.Response info, boolean head, ByteBuffer content, boolean lastContent, Callback callback);
 
-    void send(ByteBuffer content, boolean lastContent, Callback callback);
+    boolean isPushSupported();
     
-    void completed();
+    void push(MetaData.Request request);
     
-    /* ------------------------------------------------------------ */
-    /** Abort transport.
-     * This is called when an error response needs to be sent, but the response is already committed.
-     * Abort to should terminate the transport in a way that can indicate abnormal response to the client. 
+    void onCompleted();
+    
+    /**
+     * Aborts this transport.
+     * <p>
+     * This method should terminate the transport in a way that
+     * can indicate an abnormal response to the client, for example
+     * by abruptly close the connection.
+     * <p>
+     * This method is called when an error response needs to be sent,
+     * but the response is already committed, or when a write failure
+     * is detected.
+     *
+     * @param failure the failure that caused the abort.
      */
-    void abort();
+    void abort(Throwable failure);
+
+    /* ------------------------------------------------------------ */
+    /** Is the underlying transport optimized for DirectBuffer usage
+     * @return True if direct buffers can be used optimally.
+     */
+    boolean isOptimizedForDirectBuffers();
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java
index ff2e14a..7865c6b 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java
@@ -161,7 +161,7 @@
         if (!isStarted())
             throw new IllegalStateException("!STARTED");
         LocalEndPoint endp = new LocalEndPoint();
-        endp.setInput(rawRequest);
+        endp.addInput(rawRequest);
         _connects.add(endp);
         return endp;
     }
@@ -187,16 +187,13 @@
 
         public LocalEndPoint()
         {
-            super(getScheduler(), LocalConnector.this.getIdleTimeout());
+            super(LocalConnector.this.getScheduler(), LocalConnector.this.getIdleTimeout());
             setGrowOutput(true);
         }
-
-        public void addInput(String s)
+        
+        protected void execute(Runnable task)
         {
-            // TODO this is a busy wait
-            while(getIn()==null || BufferUtil.hasContent(getIn()))
-                Thread.yield();
-            setInput(BufferUtil.toBuffer(s, StandardCharsets.UTF_8));
+            getExecutor().execute(task);
         }
 
         @Override
@@ -206,7 +203,6 @@
             super.close();
             if (wasOpen)
             {
-//                connectionClosed(getConnection());
                 getConnection().onClose();
                 onClose();
             }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/LowResourceMonitor.java b/jetty-server/src/main/java/org/eclipse/jetty/server/LowResourceMonitor.java
index 028e0a0..f54af0c 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/LowResourceMonitor.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/LowResourceMonitor.java
@@ -37,11 +37,14 @@
 import org.eclipse.jetty.util.thread.ThreadPool;
 
 
-/* ------------------------------------------------------------ */
-/** A monitor for low resources
- * <p>An instance of this class will monitor all the connectors of a server (or a set of connectors
+/** 
+ * A monitor for low resources
+ * <p>
+ * An instance of this class will monitor all the connectors of a server (or a set of connectors
  * configured with {@link #setMonitoredConnectors(Collection)}) for a low resources state.
- * Low resources can be detected by:<ul>
+ * <p>
+ * Low resources can be detected by:
+ * <ul>
  * <li>{@link ThreadPool#isLowOnThreads()} if {@link Connector#getExecutor()} is
  * an instance of {@link ThreadPool} and {@link #setMonitorThreads(boolean)} is true.<li>
  * <li>If {@link #setMaxMemory(long)} is non zero then low resources is detected if the JVMs
@@ -50,14 +53,13 @@
  * <li>If {@link #setMaxConnections(int)} is non zero then low resources is dected if the total number
  * of connections exceeds {@link #getMaxConnections()}</li>
  * </ul>
- * </p>
- * <p>Once low resources state is detected, the cause is logged and all existing connections returned
+ * <p>
+ * Once low resources state is detected, the cause is logged and all existing connections returned
  * by {@link Connector#getConnectedEndPoints()} have {@link EndPoint#setIdleTimeout(long)} set
  * to {@link #getLowResourcesIdleTimeout()}.  New connections are not affected, however if the low
  * resources state persists for more than {@link #getMaxLowResourcesTime()}, then the
  * {@link #getLowResourcesIdleTimeout()} to all connections again.  Once the low resources state is
  * cleared, the idle timeout is reset to the connector default given by {@link Connector#getIdleTimeout()}.
- * </p>
  */
 @ManagedObject ("Monitor for low resource conditions and activate a low resource mode if detected")
 public class LowResourceMonitor extends AbstractLifeCycle
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/MultiPartCleanerListener.java b/jetty-server/src/main/java/org/eclipse/jetty/server/MultiPartCleanerListener.java
new file mode 100644
index 0000000..e78ed57
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/MultiPartCleanerListener.java
@@ -0,0 +1,67 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server;
+
+import javax.servlet.ServletRequestEvent;
+import javax.servlet.ServletRequestListener;
+
+import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.util.MultiException;
+import org.eclipse.jetty.util.MultiPartInputStreamParser;
+
+public class MultiPartCleanerListener implements ServletRequestListener
+{
+    public final static MultiPartCleanerListener INSTANCE = new MultiPartCleanerListener();
+    
+    protected MultiPartCleanerListener()
+    {
+    }
+    
+    @Override
+    public void requestDestroyed(ServletRequestEvent sre)
+    {
+        //Clean up any tmp files created by MultiPartInputStream
+        MultiPartInputStreamParser mpis = (MultiPartInputStreamParser)sre.getServletRequest().getAttribute(Request.__MULTIPART_INPUT_STREAM);
+        if (mpis != null)
+        {
+            ContextHandler.Context context = (ContextHandler.Context)sre.getServletRequest().getAttribute(Request.__MULTIPART_CONTEXT);
+
+            //Only do the cleanup if we are exiting from the context in which a servlet parsed the multipart files
+            if (context == sre.getServletContext())
+            {
+                try
+                {
+                    mpis.deleteParts();
+                }
+                catch (MultiException e)
+                {
+                    sre.getServletContext().log("Errors deleting multipart tmp files", e);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void requestInitialized(ServletRequestEvent sre)
+    {
+        //nothing to do, multipart config set up by ServletHolder.handle()
+    }
+    
+}
\ No newline at end of file
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/NCSARequestLog.java b/jetty-server/src/main/java/org/eclipse/jetty/server/NCSARequestLog.java
index c8ba015..80af4da 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/NCSARequestLog.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/NCSARequestLog.java
@@ -38,7 +38,7 @@
  * formats.
  */
 @ManagedObject("NCSA standard format request log")
-public class NCSARequestLog extends AbstractNCSARequestLog implements RequestLog
+public class NCSARequestLog extends AbstractNCSARequestLog
 {
     private String _filename;
     private boolean _append;
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/NegotiatingServerConnection.java b/jetty-server/src/main/java/org/eclipse/jetty/server/NegotiatingServerConnection.java
index 9757ac8..93e74be 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/NegotiatingServerConnection.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/NegotiatingServerConnection.java
@@ -19,7 +19,6 @@
 package org.eclipse.jetty.server;
 
 import java.io.IOException;
-import java.nio.ByteBuffer;
 import java.util.List;
 
 import javax.net.ssl.SSLEngine;
@@ -36,6 +35,11 @@
 {
     private static final Logger LOG = Log.getLogger(NegotiatingServerConnection.class);
 
+    public interface CipherDiscriminator
+    {
+        boolean isAcceptable(String protocol, String tlsProtocol, String tlsCipher);
+    }
+    
     private final Connector connector;
     private final SSLEngine engine;
     private final List<String> protocols;
@@ -61,6 +65,11 @@
         return defaultProtocol;
     }
 
+    protected Connector getConnector()
+    {
+        return connector;
+    }
+    
     protected SSLEngine getSSLEngine()
     {
         return engine;
@@ -111,9 +120,8 @@
                 ConnectionFactory connectionFactory = connector.getConnectionFactory(protocol);
                 if (connectionFactory == null)
                 {
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("{} application selected protocol '{}', but no correspondent {} has been configured",
-                            this, protocol, ConnectionFactory.class.getName());
+                    LOG.info("{} application selected protocol '{}', but no correspondent {} has been configured",
+                             this, protocol, ConnectionFactory.class.getName());
                     close();
                 }
                 else
@@ -128,7 +136,7 @@
         {
             // Something went bad, we need to close.
             if (LOG.isDebugEnabled())
-                LOG.debug("{} closing on client close", this);
+                LOG.debug("{} detected close on client side", this);
             close();
         }
         else
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/NegotiatingServerConnectionFactory.java b/jetty-server/src/main/java/org/eclipse/jetty/server/NegotiatingServerConnectionFactory.java
index 6812fea9..6ef48d0 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/NegotiatingServerConnectionFactory.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/NegotiatingServerConnectionFactory.java
@@ -18,27 +18,57 @@
 
 package org.eclipse.jetty.server;
 
-import java.util.Arrays;
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+
 import javax.net.ssl.SSLEngine;
 
 import org.eclipse.jetty.io.AbstractConnection;
 import org.eclipse.jetty.io.Connection;
 import org.eclipse.jetty.io.EndPoint;
 import org.eclipse.jetty.io.ssl.SslConnection;
-import org.eclipse.jetty.server.AbstractConnectionFactory;
-import org.eclipse.jetty.server.Connector;
 
 public abstract class NegotiatingServerConnectionFactory extends AbstractConnectionFactory
 {
-    private final List<String> protocols;
+    public static void checkProtocolNegotiationAvailable()
+    {
+        if (!isAvailableInBootClassPath("org.eclipse.jetty.alpn.ALPN"))
+            throw new IllegalStateException("No ALPN classes available");
+    }
+
+    private static boolean isAvailableInBootClassPath(String className)
+    {
+        try
+        {
+            Class<?> klass = ClassLoader.getSystemClassLoader().loadClass(className);
+            if (klass.getClassLoader() != null)
+                throw new IllegalStateException(className + " must be on JVM boot classpath");
+            return true;
+        }
+        catch (ClassNotFoundException x)
+        {
+            return false;
+        }
+    }
+
+    private final List<String> negotiatedProtocols;
     private String defaultProtocol;
 
-    public NegotiatingServerConnectionFactory(String protocol, String... protocols)
+    public NegotiatingServerConnectionFactory(String protocol, String... negotiatedProtocols)
     {
         super(protocol);
-        this.protocols = Arrays.asList(protocols);
+        this.negotiatedProtocols = new ArrayList<>();
+        if (negotiatedProtocols != null)
+        {
+            // Trim the values, as they may come from XML configuration.
+            for (String p : negotiatedProtocols)
+            {
+                p = p.trim();
+                if (!p.isEmpty())
+                    this.negotiatedProtocols.add(p.trim());
+            }
+        }
     }
 
     public String getDefaultProtocol()
@@ -48,36 +78,42 @@
 
     public void setDefaultProtocol(String defaultProtocol)
     {
-        this.defaultProtocol = defaultProtocol;
+        // Trim the value, as it may come from XML configuration.
+        String dft = defaultProtocol == null ? "" : defaultProtocol.trim();
+        this.defaultProtocol = dft.isEmpty() ? null : dft;
     }
 
-    public List<String> getProtocols()
+    public List<String> getNegotiatedProtocols()
     {
-        return protocols;
+        return negotiatedProtocols;
     }
-
+    
     @Override
     public Connection newConnection(Connector connector, EndPoint endPoint)
     {
-        List<String> protocols = this.protocols;
-        if (protocols.isEmpty())
+        List<String> negotiated = this.negotiatedProtocols;
+        if (negotiated.isEmpty())
         {
-            protocols = connector.getProtocols();
-            Iterator<String> i = protocols.iterator();
-            while (i.hasNext())
+            // Generate list of protocols that we can negotiate
+            negotiated = new ArrayList<>(connector.getProtocols());
+            for (Iterator<String> i = negotiated.iterator();i.hasNext();)
             {
                 String protocol = i.next();
-                String prefix = "ssl-";
-                if (protocol.regionMatches(true, 0, prefix, 0, prefix.length()) || protocol.equalsIgnoreCase("alpn"))
+                // exclude SSL and negotiating protocols
+                ConnectionFactory f = connector.getConnectionFactory(protocol);
+               
+                if ((f instanceof SslConnectionFactory) ||
+                    (f instanceof NegotiatingServerConnectionFactory))
                 {
                     i.remove();
                 }
             }
         }
 
+        // if default protocol is not set, then it is the first protocol given
         String dft = defaultProtocol;
-        if (dft == null && !protocols.isEmpty())
-            dft = protocols.get(0);
+        if (dft == null && !negotiated.isEmpty())
+            dft = negotiated.get(0);
 
         SSLEngine engine = null;
         EndPoint ep = endPoint;
@@ -90,7 +126,7 @@
                 ep = null;
         }
 
-        return configure(newServerConnection(connector, endPoint, engine, protocols, dft), connector, endPoint);
+        return configure(newServerConnection(connector, endPoint, engine, negotiated, dft), connector, endPoint);
     }
 
     protected abstract AbstractConnection newServerConnection(Connector connector, EndPoint endPoint, SSLEngine engine, List<String> protocols, String defaultProtocol);
@@ -98,6 +134,6 @@
     @Override
     public String toString()
     {
-        return String.format("%s@%x{%s,%s,%s}", getClass().getSimpleName(), hashCode(), getProtocol(), getDefaultProtocol(), getProtocols());
+        return String.format("%s@%x{%s,%s,%s}", getClass().getSimpleName(), hashCode(), getProtocols(), getDefaultProtocol(), getNegotiatedProtocols());
     }
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/NetworkTrafficServerConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/NetworkTrafficServerConnector.java
index d6f3632..cfd96c1 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/NetworkTrafficServerConnector.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/NetworkTrafficServerConnector.java
@@ -26,10 +26,10 @@
 import java.util.concurrent.Executor;
 
 import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.ManagedSelector;
 import org.eclipse.jetty.io.NetworkTrafficListener;
 import org.eclipse.jetty.io.NetworkTrafficSelectChannelEndPoint;
 import org.eclipse.jetty.io.SelectChannelEndPoint;
-import org.eclipse.jetty.io.SelectorManager;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
 import org.eclipse.jetty.util.thread.Scheduler;
 
@@ -84,7 +84,7 @@
     }
 
     @Override
-    protected SelectChannelEndPoint newEndPoint(SocketChannel channel, SelectorManager.ManagedSelector selectSet, SelectionKey key) throws IOException
+    protected SelectChannelEndPoint newEndPoint(SocketChannel channel, ManagedSelector selectSet, SelectionKey key) throws IOException
     {
         NetworkTrafficSelectChannelEndPoint endPoint = new NetworkTrafficSelectChannelEndPoint(channel, selectSet, key, getScheduler(), getIdleTimeout(), listeners);
         return endPoint;
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ProxyConnectionFactory.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ProxyConnectionFactory.java
new file mode 100644
index 0000000..b72cf57
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ProxyConnectionFactory.java
@@ -0,0 +1,343 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.ReadPendingException;
+import java.nio.channels.WritePendingException;
+import java.util.Iterator;
+
+import org.eclipse.jetty.io.AbstractConnection;
+import org.eclipse.jetty.io.Connection;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+
+/* ------------------------------------------------------------ */
+/**
+ * ConnectionFactory for the PROXY Protocol.
+ * <p>This factory can be placed in front of any other connection factory
+ * to process the proxy line before the normal protocol handling</p>
+ *
+ * @see <a href="http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt">http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt</a>
+ */
+public class ProxyConnectionFactory extends AbstractConnectionFactory
+{
+    private static final Logger LOG = Log.getLogger(ProxyConnectionFactory.class);
+    private final String _next;
+
+    /* ------------------------------------------------------------ */
+    /** Proxy Connection Factory that uses the next ConnectionFactory
+     * on the connector as the next protocol
+     */
+    public ProxyConnectionFactory()
+    {
+        super("proxy");
+        _next=null;
+    }
+
+    public ProxyConnectionFactory(String nextProtocol)
+    {
+        super("proxy");
+        _next=nextProtocol;
+    }
+
+    @Override
+    public Connection newConnection(Connector connector, EndPoint endp)
+    {
+        String next=_next;
+        if (next==null)
+        {
+            for (Iterator<String> i = connector.getProtocols().iterator();i.hasNext();)
+            {
+                String p=i.next();
+                if (getProtocol().equalsIgnoreCase(p))
+                {
+                    next=i.next();
+                    break;
+                }
+            }
+        }
+
+        return new ProxyConnection(endp,connector,next);
+    }
+
+    public static class ProxyConnection extends AbstractConnection
+    {
+        // 0     1 2       3       4 5 6
+        // 98765432109876543210987654321
+        // PROXY P R.R.R.R L.L.L.L R Lrn
+
+        private final int[] __size = {29,23,21,13,5,3,1};
+        private final Connector _connector;
+        private final String _next;
+        private final StringBuilder _builder=new StringBuilder();
+        private final String[] _field=new String[6];
+        private int _fields;
+        private int _length;
+
+        protected ProxyConnection(EndPoint endp, Connector connector, String next)
+        {
+            super(endp,connector.getExecutor());
+            _connector=connector;
+            _next=next;
+        }
+
+        @Override
+        public void onOpen()
+        {
+            super.onOpen();
+            fillInterested();
+        }
+
+        @Override
+        public void onFillable()
+        {
+            try
+            {
+                ByteBuffer buffer=null;
+                loop: while(true)
+                {
+                    // Create a buffer that will not read too much data
+                    int size=Math.max(1,__size[_fields]-_builder.length());
+                    if (buffer==null || buffer.capacity()!=size)
+                        buffer=BufferUtil.allocate(size);
+                    else
+                        BufferUtil.clear(buffer);
+
+                    // Read data
+                    int fill=getEndPoint().fill(buffer);
+                    if (fill<0)
+                    {
+                        getEndPoint().shutdownOutput();
+                        return;
+                    }
+                    if (fill==0)
+                    {
+                        fillInterested();
+                        return;
+                    }
+
+                    _length+=fill;
+                    if (_length>=108)
+                    {
+                        LOG.warn("PROXY line too long {} for {}",_length,getEndPoint());
+                        close();
+                        return;
+                    }
+
+                    // parse fields
+                    while (buffer.hasRemaining())
+                    {
+                        byte b = buffer.get();
+                        if (_fields<6)
+                        {
+                            if (b==' ' || b=='\r' && _fields==5)
+                            {
+                                _field[_fields++]=_builder.toString();
+                                _builder.setLength(0);
+                            }
+                            else if (b<' ')
+                            {
+                                LOG.warn("Bad character {} for {}",b&0xFF,getEndPoint());
+                                close();
+                                return;
+                            }
+                            else
+                            {
+                                _builder.append((char)b);
+                            }
+                        }
+                        else
+                        {
+                            if (b=='\n')
+                                break loop;
+
+                            LOG.warn("Bad CRLF for {}",getEndPoint());
+                            close();
+                            return;
+                        }
+                    }
+                }
+
+                // Check proxy
+                if (!"PROXY".equals(_field[0]))
+                {
+                    LOG.warn("Not PROXY protocol for {}",getEndPoint());
+                    close();
+                    return;
+                }
+
+                // Extract Addresses
+                InetSocketAddress remote=new InetSocketAddress(_field[2],Integer.parseInt(_field[4]));
+                InetSocketAddress local =new InetSocketAddress(_field[3],Integer.parseInt(_field[5]));
+
+                // Create the next protocol
+                ConnectionFactory connectionFactory = _connector.getConnectionFactory(_next);
+                if (connectionFactory == null)
+                {
+                    LOG.info("Next protocol '{}' for {}",_next,getEndPoint());
+                    close();
+                    return;
+                }
+
+                EndPoint endPoint = new ProxyEndPoint(getEndPoint(),remote,local);
+                Connection newConnection = connectionFactory.newConnection(_connector, endPoint);
+                endPoint.upgrade(newConnection);
+            }
+            catch (Throwable x)
+            {
+                LOG.warn("PROXY error for "+getEndPoint(),x);
+                close();
+            }
+        }
+    }
+
+    public static class ProxyEndPoint implements EndPoint
+    {
+        private final EndPoint _endp;
+        private final InetSocketAddress _remote;
+        private final InetSocketAddress _local;
+
+        public ProxyEndPoint(EndPoint endp, InetSocketAddress remote, InetSocketAddress local)
+        {
+            _endp=endp;
+            _remote=remote;
+            _local=local;
+        }
+
+        @Override
+        public boolean isOptimizedForDirectBuffers()
+        {
+            return _endp.isOptimizedForDirectBuffers();
+        }
+
+        public InetSocketAddress getLocalAddress()
+        {
+            return _local;
+        }
+
+        public InetSocketAddress getRemoteAddress()
+        {
+            return _remote;
+        }
+
+        public boolean isOpen()
+        {
+            return _endp.isOpen();
+        }
+
+        public long getCreatedTimeStamp()
+        {
+            return _endp.getCreatedTimeStamp();
+        }
+
+        public void shutdownOutput()
+        {
+            _endp.shutdownOutput();
+        }
+
+        public boolean isOutputShutdown()
+        {
+            return _endp.isOutputShutdown();
+        }
+
+        public boolean isInputShutdown()
+        {
+            return _endp.isInputShutdown();
+        }
+
+        public void close()
+        {
+            _endp.close();
+        }
+
+        public int fill(ByteBuffer buffer) throws IOException
+        {
+            return _endp.fill(buffer);
+        }
+
+        public boolean flush(ByteBuffer... buffer) throws IOException
+        {
+            return _endp.flush(buffer);
+        }
+
+        public Object getTransport()
+        {
+            return _endp.getTransport();
+        }
+
+        public long getIdleTimeout()
+        {
+            return _endp.getIdleTimeout();
+        }
+
+        public void setIdleTimeout(long idleTimeout)
+        {
+            _endp.setIdleTimeout(idleTimeout);
+        }
+
+        public void fillInterested(Callback callback) throws ReadPendingException
+        {
+            _endp.fillInterested(callback);
+        }
+
+        @Override
+        public boolean isFillInterested()
+        {
+            return _endp.isFillInterested();
+        }
+
+        public void write(Callback callback, ByteBuffer... buffers) throws WritePendingException
+        {
+            _endp.write(callback,buffers);
+        }
+
+        public Connection getConnection()
+        {
+            return _endp.getConnection();
+        }
+
+        public void setConnection(Connection connection)
+        {
+            _endp.setConnection(connection);
+        }
+
+        public void onOpen()
+        {
+            _endp.onOpen();
+        }
+
+        public void onClose()
+        {
+            _endp.onClose();
+        }
+
+        @Override
+        public void upgrade(Connection newConnection)
+        {
+            _endp.upgrade(newConnection);
+        }
+    }
+}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/PushBuilder.java b/jetty-server/src/main/java/org/eclipse/jetty/server/PushBuilder.java
new file mode 100644
index 0000000..5e807b4
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/PushBuilder.java
@@ -0,0 +1,185 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server;
+
+import java.util.Set;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+/** Build a request to be pushed.
+ * <p>
+ * A PushBuilder is obtained by calling {@link Request#getPushBuilder()}
+ * which creates an initializes the builder as follows:
+ * <ul>
+ * <li> Each call to getPushBuilder() will return a new instance of a 
+ * PushBuilder based off the Request.  Any mutations to the
+ * returned PushBuilder are not reflected on future returns.</li>
+ * <li>The method is initialized to "GET"</li>
+ * <li>The requests headers are added to the Builder, except for:<ul>
+ *   <li>Conditional headers (eg. If-Modified-Since)
+ *   <li>Range headers
+ *   <li>Expect headers
+ *   <li>Authorization headers
+ *   <li>Referrer headers
+ * </ul></li>
+ * <li>If the request was Authenticated, an Authorization header will 
+ * be set with a container generated token that will result in equivalent
+ * Authorization for the pushed request</li>
+ * <li>The query string from {@link HttpServletRequest#getQueryString()}
+ * <li>The {@link HttpServletRequest#getRequestedSessionId()} value, unless at the time
+ * of the call {@link HttpServletRequest#getSession(boolean)}
+ * has previously been called to create a new {@link HttpSession}, in 
+ * which case the new session ID will be used as the PushBuilders 
+ * requested session ID. The source of the requested session id will be the 
+ * same as for the request</li>
+ * <li>The Referer header will be set to {@link HttpServletRequest#getRequestURL()} 
+ * plus any {@link HttpServletRequest#getQueryString()} </li>
+ * <li>If {@link HttpServletResponse#addCookie(Cookie)} has been called
+ * on the associated response, then a corresponding Cookie header will be added
+ * to the PushBuilder, unless the {@link Cookie#getMaxAge()} is &lt;=0, in which
+ * case the Cookie will be removed from the builder.</li>
+ * <li>If this request has has the conditional headers If-Modified-Since or
+ * If-None-Match then the {@link #isConditional()} header is set to true.</li> 
+ * </ul>
+ * <p>A PushBuilder can be customized by chained calls to mutator methods before the 
+ * {@link #push()} method is called to initiate a push request with the current state
+ * of the builder.  After the call to {@link #push()}, the builder may be reused for
+ * another push, however the {@link #path(String)}, {@link #etag(String)} and
+ * {@link #lastModified(String)} values will have been nulled.  All other 
+ * values are retained over calls to {@link #push()}. 
+ */
+public interface PushBuilder
+{
+    /** Set the method to be used for the push.  
+     * Defaults to GET.
+     * @param method the method to be used for the push.  
+     * @return this builder.
+     */
+    public abstract PushBuilder method(String method);
+    
+    /** Set the query string to be used for the push.  
+     * Defaults to the requests query string.
+     * Will be appended to any query String included in a call to {@link #path(String)}.  This 
+     * method should be used instead of a query in {@link #path(String)} when multiple
+     * {@link #push()} calls are to be made with the same query string, or to remove a 
+     * query string obtained from the associated request.
+     * @param  queryString the query string to be used for the push. 
+     * @return this builder.
+     */
+    public abstract PushBuilder queryString(String queryString);
+    
+    /** Set the SessionID to be used for the push.
+     * The session ID will be set in the same way it was on the associated request (ie
+     * as a cookie if the associated request used a cookie, or as a url parameter if
+     * the associated request used a url parameter).
+     * Defaults to the requested session ID or any newly assigned session id from
+     * a newly created session.
+     * @param sessionId the SessionID to be used for the push.
+     * @return this builder.
+     */
+    public abstract PushBuilder sessionId(String sessionId);
+    
+    /** Set if the request is to be conditional.
+     * If the request is conditional, any available values from {@link #etag(String)} or 
+     * {@link #lastModified(String)} will be set in the appropriate headers. If the request
+     * is not conditional, then etag and lastModified values are ignored.  
+     * Defaults to true if the associated request was conditional.
+     * @param  conditional true if the push request is conditional
+     * @return this builder.
+     */
+    public abstract PushBuilder conditional(boolean conditional);
+    
+    /** Set a header to be used for the push.  
+     * @param name The header name to set
+     * @param value The header value to set
+     * @return this builder.
+     */
+    public abstract PushBuilder setHeader(String name, String value);
+    
+    /** Add a header to be used for the push.  
+     * @param name The header name to add
+     * @param value The header value to add
+     * @return this builder.
+     */
+    public abstract PushBuilder addHeader(String name, String value);
+    
+    /** Set the URI path to be used for the push.  
+     * The path may start with "/" in which case it is treated as an
+     * absolute path, otherwise it is relative to the context path of
+     * the associated request.
+     * There is no path default and {@link #path(String)} must be called
+     * before every call to {@link #push()}
+     * @param path the URI path to be used for the push, which may include a
+     * query string.
+     * @return this builder.
+     */
+    public abstract PushBuilder path(String path);
+    
+    /** Set the etag to be used for conditional pushes.  
+     * The etag will be used only if {@link #isConditional()} is true.
+     * Defaults to no etag.  The value is nulled after every call to 
+     * {@link #push()}
+     * @param etag the etag to be used for the push.
+     * @return this builder.
+     */
+    public abstract PushBuilder etag(String etag);
+
+    /** Set the last modified date to be used for conditional pushes.  
+     * The last modified date will be used only if {@link #isConditional()} is true.
+     * Defaults to no date.  The value is nulled after every call to 
+     * {@link #push()}
+     * @param lastModified the last modified date to be used for the push.
+     * @return this builder.
+     * */
+    public abstract PushBuilder lastModified(String lastModified);
+
+
+    /** Push a resource.
+     * Push a resource based on the current state of the PushBuilder.  If {@link #isConditional()}
+     * is true and an etag or lastModified value is provided, then an appropriate conditional header
+     * will be generated. If both an etag and lastModified value are provided only an If-None-Match header
+     * will be generated. If the builder has a session ID, then the pushed request
+     * will include the session ID either as a Cookie or as a URI parameter as appropriate. The builders
+     * query string is merged with any passed query string.
+     * After initiating the push, the builder has its path, etag and lastModified fields nulled. All 
+     * other fields are left as is for possible reuse in another push.
+     * @throws IllegalArgumentException if the method set expects a request body (eg POST)
+     */
+    public abstract void push();
+    
+    
+    
+    
+    
+    public abstract String getMethod();
+    public abstract String getQueryString();
+    public abstract String getSessionId();
+    public abstract boolean isConditional();
+    public abstract Set<String> getHeaderNames();
+    public abstract String getHeader(String name);
+    public abstract String getPath();
+    public abstract String getEtag();
+    public abstract String getLastModified();
+
+
+
+}
\ No newline at end of file
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/PushBuilderImpl.java b/jetty-server/src/main/java/org/eclipse/jetty/server/PushBuilderImpl.java
new file mode 100644
index 0000000..f39cffa
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/PushBuilderImpl.java
@@ -0,0 +1,311 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server;
+
+import java.util.Set;
+
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpURI;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.util.URIUtil;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+
+/* ------------------------------------------------------------ */
+/** 
+ */
+public class PushBuilderImpl implements PushBuilder
+{    
+    private static final Logger LOG = Log.getLogger(PushBuilderImpl.class);
+
+    private final static HttpField JettyPush = new HttpField("x-http2-push","PushBuilder");
+    
+    private final Request _request;
+    private final HttpFields _fields;
+    private String _method;
+    private String _queryString;
+    private String _sessionId;
+    private boolean _conditional;
+    private String _path;
+    private String _etag;
+    private String _lastModified;
+    
+    public PushBuilderImpl(Request request, HttpFields fields, String method, String queryString, String sessionId, boolean conditional)
+    {
+        super();
+        _request = request;
+        _fields = fields;
+        _method = method;
+        _queryString = queryString;
+        _sessionId = sessionId;
+        _conditional = conditional;
+        _fields.add(JettyPush);
+        if (LOG.isDebugEnabled())
+            LOG.debug("PushBuilder({} {}?{} s={} c={})",_method,_request.getRequestURI(),_queryString,_sessionId,_conditional);
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#getMethod()
+     */
+    @Override
+    public String getMethod()
+    {
+        return _method;
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#method(java.lang.String)
+     */
+    @Override
+    public PushBuilder method(String method)
+    {
+        _method = method;
+        return this;
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#getQueryString()
+     */
+    @Override
+    public String getQueryString()
+    {
+        return _queryString;
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#queryString(java.lang.String)
+     */
+    @Override
+    public PushBuilder queryString(String queryString)
+    {
+        _queryString = queryString;
+        return this;
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#getSessionId()
+     */
+    @Override
+    public String getSessionId()
+    {
+        return _sessionId;
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#sessionId(java.lang.String)
+     */
+    @Override
+    public PushBuilder sessionId(String sessionId)
+    {
+        _sessionId = sessionId;
+        return this;
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#isConditional()
+     */
+    @Override
+    public boolean isConditional()
+    {
+        return _conditional;
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#conditional(boolean)
+     */
+    @Override
+    public PushBuilder conditional(boolean conditional)
+    {
+        _conditional = conditional;
+        return this;
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#getHeaderNames()
+     */
+    @Override
+    public Set<String> getHeaderNames()
+    {
+        return _fields.getFieldNamesCollection();
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#getHeader(java.lang.String)
+     */
+    @Override
+    public String getHeader(String name)
+    {
+        return _fields.get(name);
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#setHeader(java.lang.String, java.lang.String)
+     */
+    @Override
+    public PushBuilder setHeader(String name,String value)
+    {
+        _fields.put(name,value);
+        return this;
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#addHeader(java.lang.String, java.lang.String)
+     */
+    @Override
+    public PushBuilder addHeader(String name,String value)
+    {
+        _fields.add(name,value);
+        return this;
+    }
+
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#getPath()
+     */
+    @Override
+    public String getPath()
+    {
+        return _path;
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#path(java.lang.String)
+     */
+    @Override
+    public PushBuilder path(String path)
+    {
+        _path = path;
+        return this;
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#getEtag()
+     */
+    @Override
+    public String getEtag()
+    {
+        return _etag;
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#etag(java.lang.String)
+     */
+    @Override
+    public PushBuilder etag(String etag)
+    {
+        _etag = etag;
+        return this;
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#getLastModified()
+     */
+    @Override
+    public String getLastModified()
+    {
+        return _lastModified;
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#lastModified(java.lang.String)
+     */
+    @Override
+    public PushBuilder lastModified(String lastModified)
+    {
+        _lastModified = lastModified;
+        return this;
+    }
+
+    /* ------------------------------------------------------------ */
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.PushBuilder#push()
+     */
+    @Override
+    public void push()
+    {
+        if (HttpMethod.POST.is(_method) || HttpMethod.PUT.is(_method))
+            throw new IllegalStateException("Bad Method "+_method);
+        
+        if (_path==null || _path.length()==0)
+            throw new IllegalStateException("Bad Path "+_path);
+        
+        String path=_path;
+        String query=_queryString;
+        int q=path.indexOf('?');
+        if (q>=0)
+        {
+            query=(query!=null && query.length()>0)?(_path.substring(q+1)+'&'+query):_path.substring(q+1);
+            path=_path.substring(0,q);
+        }
+        
+        if (!path.startsWith("/"))
+            path=URIUtil.addPaths(_request.getContextPath(),path);
+        
+        String param=null;
+        if (_sessionId!=null)
+        {
+            if (_request.isRequestedSessionIdFromURL())
+                param="jsessionid="+_sessionId;
+            // TODO else 
+            //      _fields.add("Cookie","JSESSIONID="+_sessionId);
+        }
+        
+        if (_conditional)
+        {
+            if (_etag!=null)
+                _fields.add(HttpHeader.IF_NONE_MATCH,_etag);
+            else if (_lastModified!=null)
+                _fields.add(HttpHeader.IF_MODIFIED_SINCE,_lastModified);
+        }
+        
+        HttpURI uri = HttpURI.createHttpURI(_request.getScheme(),_request.getServerName(),_request.getServerPort(),_path,param,query,null);
+        MetaData.Request push = new MetaData.Request(_method,uri,_request.getHttpVersion(),_fields);
+        
+        if (LOG.isDebugEnabled())
+            LOG.debug("Push {} {} inm={} ims={}",_method,uri,_fields.get(HttpHeader.IF_NONE_MATCH),_fields.get(HttpHeader.IF_MODIFIED_SINCE));
+        
+        _request.getHttpChannel().getHttpTransport().push(push);
+        _path=null;
+        _etag=null;
+        _lastModified=null;
+    }
+}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/QueuedHttpInput.java b/jetty-server/src/main/java/org/eclipse/jetty/server/QueuedHttpInput.java
deleted file mode 100644
index e3bf2a1..0000000
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/QueuedHttpInput.java
+++ /dev/null
@@ -1,146 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.server;
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-
-import org.eclipse.jetty.util.ArrayQueue;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/**
- * {@link QueuedHttpInput} holds a queue of items passed to it by calls to {@link #content(Object)}.
- * <p/>
- * {@link QueuedHttpInput} stores the items directly; if the items contain byte buffers, it does not copy them
- * but simply holds references to the item, thus the caller must organize for those buffers to valid while
- * held by this class.
- * <p/>
- * To assist the caller, subclasses may override methods {@link #onAsyncRead()}, {@link #onContentConsumed(Object)}
- * that can be implemented so that the caller will know when buffers are queued and consumed.
- */
-public abstract class QueuedHttpInput<T> extends HttpInput<T>
-{
-    private final static Logger LOG = Log.getLogger(QueuedHttpInput.class);
-
-    private final ArrayQueue<T> _inputQ = new ArrayQueue<>(lock());
-
-    public QueuedHttpInput()
-    {
-    }
-
-    public void content(T item)
-    {
-        // The buffer is not copied here.  This relies on the caller not recycling the buffer
-        // until the it is consumed.  The onContentConsumed and onAllContentConsumed() callbacks are
-        // the signals to the caller that the buffers can be recycled.
-
-        synchronized (lock())
-        {
-            boolean wasEmpty = _inputQ.isEmpty();
-            _inputQ.add(item);
-            if (LOG.isDebugEnabled())
-                LOG.debug("{} queued {}", this, item);
-            if (wasEmpty)
-            {
-                if (!onAsyncRead())
-                    lock().notify();
-            }
-        }
-    }
-
-    public void recycle()
-    {
-        synchronized (lock())
-        {
-            T item = _inputQ.pollUnsafe();
-            while (item != null)
-            {
-                onContentConsumed(item);
-                item = _inputQ.pollUnsafe();
-            }
-            super.recycle();
-        }
-    }
-
-    @Override
-    protected T nextContent()
-    {
-        synchronized (lock())
-        {
-            // Items are removed only when they are fully consumed.
-            T item = _inputQ.peekUnsafe();
-            // Skip consumed items at the head of the queue.
-            while (item != null && remaining(item) == 0)
-            {
-                _inputQ.pollUnsafe();
-                onContentConsumed(item);
-                if (LOG.isDebugEnabled())
-                    LOG.debug("{} consumed {}", this, item);
-                item = _inputQ.peekUnsafe();
-            }
-            return item;
-        }
-    }
-
-    protected void blockForContent() throws IOException
-    {
-        synchronized (lock())
-        {
-            while (_inputQ.isEmpty() && !isFinished() && !isEOF())
-            {
-                try
-                {
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("{} waiting for content", this);
-                    lock().wait();
-                }
-                catch (InterruptedException e)
-                {
-                    throw (IOException)new InterruptedIOException().initCause(e);
-                }
-            }
-        }
-    }
-
-    /**
-     * Callback that signals that the given content has been consumed.
-     *
-     * @param item the consumed content
-     */
-    protected abstract void onContentConsumed(T item);
-
-    public void earlyEOF()
-    {
-        synchronized (lock())
-        {
-            super.earlyEOF();
-            lock().notify();
-        }
-    }
-
-    public void messageComplete()
-    {
-        synchronized (lock())
-        {
-            super.messageComplete();
-            lock().notify();
-        }
-    }
-}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java
index 6dd85f7..fbc42e0 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java
@@ -52,8 +52,7 @@
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletRequestAttributeEvent;
 import javax.servlet.ServletRequestAttributeListener;
-import javax.servlet.ServletRequestEvent;
-import javax.servlet.ServletRequestListener;
+import javax.servlet.ServletRequestWrapper;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
@@ -62,13 +61,18 @@
 import javax.servlet.http.HttpUpgradeHandler;
 import javax.servlet.http.Part;
 
+import org.eclipse.jetty.http.BadMessageException;
+import org.eclipse.jetty.http.HostPortHttpField;
 import org.eclipse.jetty.http.HttpCookie;
+import org.eclipse.jetty.http.HttpField;
 import org.eclipse.jetty.http.HttpFields;
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpScheme;
 import org.eclipse.jetty.http.HttpStatus;
 import org.eclipse.jetty.http.HttpURI;
 import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
 import org.eclipse.jetty.http.MimeTypes;
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.server.handler.ContextHandler.Context;
@@ -76,7 +80,6 @@
 import org.eclipse.jetty.util.Attributes;
 import org.eclipse.jetty.util.AttributesMap;
 import org.eclipse.jetty.util.IO;
-import org.eclipse.jetty.util.MultiException;
 import org.eclipse.jetty.util.MultiMap;
 import org.eclipse.jetty.util.MultiPartInputStreamParser;
 import org.eclipse.jetty.util.StringUtil;
@@ -85,7 +88,6 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
-/* ------------------------------------------------------------ */
 /**
  * Jetty Request.
  * <p>
@@ -114,8 +116,6 @@
  * {@link ContextHandler#getMaxFormContentSize()} or if there is no context then the "org.eclipse.jetty.server.Request.maxFormContentSize" {@link Server}
  * attribute. The number of parameters keys is limited by {@link ContextHandler#getMaxFormKeys()} or if there is no context then the
  * "org.eclipse.jetty.server.Request.maxFormKeys" {@link Server} attribute.
- *
- *
  */
 public class Request implements HttpServletRequest
 {
@@ -127,46 +127,44 @@
     private static final Collection<Locale> __defaultLocale = Collections.singleton(Locale.getDefault());
     private static final int __NONE = 0, _STREAM = 1, __READER = 2;
 
-    private final HttpChannel<?> _channel;
-    private final HttpFields _fields=new HttpFields();
-    private final List<ServletRequestAttributeListener>  _requestAttributeListeners=new ArrayList<>();
-    private final HttpInput<?> _input;
+    private static final MultiMap<String> NO_PARAMS = new MultiMap<>();
 
-    public static class MultiPartCleanerListener implements ServletRequestListener
+
+    /* ------------------------------------------------------------ */
+    /**
+     * Obtain the base {@link Request} instance of a {@link ServletRequest}, by
+     * coercion, unwrapping or special attribute.
+     * @param request The request
+     * @return the base {@link Request} instance of a {@link ServletRequest}.
+     */
+    public static Request getBaseRequest(ServletRequest request)
     {
-        @Override
-        public void requestDestroyed(ServletRequestEvent sre)
-        {
-            //Clean up any tmp files created by MultiPartInputStream
-            MultiPartInputStreamParser mpis = (MultiPartInputStreamParser)sre.getServletRequest().getAttribute(__MULTIPART_INPUT_STREAM);
-            if (mpis != null)
-            {
-                ContextHandler.Context context = (ContextHandler.Context)sre.getServletRequest().getAttribute(__MULTIPART_CONTEXT);
+        if (request instanceof Request)
+            return (Request)request;
 
-                //Only do the cleanup if we are exiting from the context in which a servlet parsed the multipart files
-                if (context == sre.getServletContext())
-                {
-                    try
-                    {
-                        mpis.deleteParts();
-                    }
-                    catch (MultiException e)
-                    {
-                        sre.getServletContext().log("Errors deleting multipart tmp files", e);
-                    }
-                }
-            }
-        }
+        Object channel = request.getAttribute(HttpChannel.class.getName());
+        if (channel instanceof HttpChannel)
+            return ((HttpChannel)channel).getRequest();
 
-        @Override
-        public void requestInitialized(ServletRequestEvent sre)
-        {
-            //nothing to do, multipart config set up by ServletHolder.handle()
-        }
+        while (request instanceof ServletRequestWrapper)
+            request=((ServletRequestWrapper)request).getRequest();
 
+        if (request instanceof Request)
+            return (Request)request;
+
+        return null;
     }
 
 
+    private final HttpChannel _channel;
+    private final List<ServletRequestAttributeListener>  _requestAttributeListeners=new ArrayList<>();
+    private final HttpInput _input;
+
+    private MetaData.Request _metadata;
+
+    private String _contextPath;
+    private String _servletPath;
+    private String _pathInfo;
 
     private boolean _secure;
     private boolean _asyncSupported = true;
@@ -175,43 +173,31 @@
     private boolean _handled = false;
     private boolean _paramsExtracted;
     private boolean _requestedSessionIdFromCookie = false;
-    private volatile Attributes _attributes;
+    private Attributes _attributes;
     private Authentication _authentication;
     private String _characterEncoding;
     private ContextHandler.Context _context;
-    private String _contextPath;
     private CookieCutter _cookies;
     private DispatcherType _dispatcherType;
     private int _inputState = __NONE;
-    private HttpMethod _httpMethod;
-    private String _httpMethodString;
     private MultiMap<String> _queryParameters;
     private MultiMap<String> _contentParameters;
     private MultiMap<String> _parameters;
-    private String _pathInfo;
-    private int _port;
-    private HttpVersion _httpVersion = HttpVersion.HTTP_1_1;
     private String _queryEncoding;
-    private String _queryString;
     private BufferedReader _reader;
     private String _readerEncoding;
     private InetSocketAddress _remote;
     private String _requestedSessionId;
-    private String _requestURI;
     private Map<Object, HttpSession> _savedNewSessions;
-    private String _scheme = URIUtil.HTTP;
     private UserIdentity.Scope _scope;
-    private String _serverName;
-    private String _servletPath;
     private HttpSession _session;
     private SessionManager _sessionManager;
     private long _timeStamp;
-    private HttpURI _uri;
     private MultiPartInputStreamParser _multiPartInputStream; //if the request is a multi-part mime
     private AsyncContextState _async;
 
     /* ------------------------------------------------------------ */
-    public Request(HttpChannel<?> channel, HttpInput<?> input)
+    public Request(HttpChannel channel, HttpInput input)
     {
         _channel = channel;
         _input = input;
@@ -220,16 +206,135 @@
     /* ------------------------------------------------------------ */
     public HttpFields getHttpFields()
     {
-        return _fields;
+        return _metadata.getFields();
     }
 
     /* ------------------------------------------------------------ */
-    public HttpInput<?> getHttpInput()
+    public HttpInput getHttpInput()
     {
         return _input;
     }
 
     /* ------------------------------------------------------------ */
+    public boolean isPush()
+    {
+        return Boolean.TRUE.equals(getAttribute("org.eclipse.jetty.pushed"));
+    }
+
+    /* ------------------------------------------------------------ */
+    public boolean isPushSupported()
+    {
+        return getHttpChannel().getHttpTransport().isPushSupported();
+    }
+
+    /* ------------------------------------------------------------ */
+    /** Get a PushBuilder associated with this request initialized as follows:<ul>
+     * <li>The method is initialized to "GET"</li>
+     * <li>The headers from this request are copied to the Builder, except for:<ul>
+     *   <li>Conditional headers (eg. If-Modified-Since)
+     *   <li>Range headers
+     *   <li>Expect headers
+     *   <li>Authorization headers
+     *   <li>Referrer headers
+     * </ul></li>
+     * <li>If the request was Authenticated, an Authorization header will
+     * be set with a container generated token that will result in equivalent
+     * Authorization</li>
+     * <li>The query string from {@link #getQueryString()}
+     * <li>The {@link #getRequestedSessionId()} value, unless at the time
+     * of the call {@link #getSession(boolean)}
+     * has previously been called to create a new {@link HttpSession}, in
+     * which case the new session ID will be used as the PushBuilders
+     * requested session ID.</li>
+     * <li>The source of the requested session id will be the same as for
+     * this request</li>
+     * <li>The builders Referer header will be set to {@link #getRequestURL()}
+     * plus any {@link #getQueryString()} </li>
+     * <li>If {@link HttpServletResponse#addCookie(Cookie)} has been called
+     * on the associated response, then a corresponding Cookie header will be added
+     * to the PushBuilder, unless the {@link Cookie#getMaxAge()} is &lt;=0, in which
+     * case the Cookie will be removed from the builder.</li>
+     * <li>If this request has has the conditional headers If-Modified-Since or
+     * If-None-Match then the {@link PushBuilderImpl#isConditional()} header is set
+     * to true.
+     * </ul>
+     *
+     * <p>Each call to getPushBuilder() will return a new instance
+     * of a PushBuilder based off this Request.  Any mutations to the
+     * returned PushBuilder are not reflected on future returns.
+     * @return A new PushBuilder or null if push is not supported
+     */
+    public PushBuilder getPushBuilder()
+    {
+        if (!isPushSupported())
+            throw new IllegalStateException();
+
+        HttpFields fields = new HttpFields(getHttpFields().size()+5);
+        boolean conditional=false;
+        UserIdentity user_identity=null;
+        Authentication authentication=null;
+
+        for (HttpField field : getHttpFields())
+        {
+            HttpHeader header = field.getHeader();
+            if (header==null)
+                fields.add(field);
+            else
+            {
+                switch(header)
+                {
+                    case IF_MATCH:
+                    case IF_RANGE:
+                    case IF_UNMODIFIED_SINCE:
+                    case RANGE:
+                    case EXPECT:
+                    case REFERER:
+                    case COOKIE:
+                        continue;
+
+                    case AUTHORIZATION:
+                        user_identity=getUserIdentity();
+                        authentication=_authentication;
+                        continue;
+
+                    case IF_NONE_MATCH:
+                    case IF_MODIFIED_SINCE:
+                        conditional=true;
+                        continue;
+
+                    default:
+                        fields.add(field);
+                }
+            }
+        }
+
+        String id=null;
+        try
+        {
+            HttpSession session = getSession();
+            if (session!=null)
+            {
+                session.getLastAccessedTime(); // checks if session is valid
+                id=session.getId();
+            }
+            else
+                id=getRequestedSessionId();
+        }
+        catch(IllegalStateException e)
+        {
+            id=getRequestedSessionId();
+        }
+
+        PushBuilder builder = new PushBuilderImpl(this,fields,getMethod(),getQueryString(),id,conditional);
+        builder.addHeader("referer",getRequestURL().toString());
+
+        // TODO process any set cookies
+        // TODO process any user_identity
+
+        return builder;
+    }
+
+    /* ------------------------------------------------------------ */
     public void addEventListener(final EventListener listener)
     {
         if (listener instanceof ServletRequestAttributeListener)
@@ -238,6 +343,7 @@
             throw new IllegalArgumentException(listener.getClass().toString());
     }
 
+    /* ------------------------------------------------------------ */
     public void extractParameters()
     {
         if (_paramsExtracted)
@@ -248,31 +354,32 @@
         // Extract query string parameters; these may be replaced by a forward()
         // and may have already been extracted by mergeQueryParameters().
         if (_queryParameters == null)
-            _queryParameters = extractQueryParameters();
+            extractQueryParameters();
 
         // Extract content parameters; these cannot be replaced by a forward()
         // once extracted and may have already been extracted by getParts() or
         // by a processing happening after a form-based authentication.
         if (_contentParameters == null)
-            _contentParameters = extractContentParameters();
+            extractContentParameters();
 
-        _parameters = restoreParameters();
+        restoreParameters();
     }
 
-    private MultiMap<String> extractQueryParameters()
+    /* ------------------------------------------------------------ */
+    private void extractQueryParameters()
     {
-        MultiMap<String> result = new MultiMap<>();
-        if (_uri != null && _uri.hasQuery())
+        if (_metadata.getURI() == null || !_metadata.getURI().hasQuery())
+            _queryParameters=NO_PARAMS;
+        else
         {
+            _queryParameters = new MultiMap<>();
             if (_queryEncoding == null)
-            {
-                _uri.decodeQueryTo(result);
-            }
+                _metadata.getURI().decodeQueryTo(_queryParameters);
             else
             {
                 try
                 {
-                    _uri.decodeQueryTo(result, _queryEncoding);
+                    _metadata.getURI().decodeQueryTo(_queryParameters, _queryEncoding);
                 }
                 catch (UnsupportedEncodingException e)
                 {
@@ -283,37 +390,38 @@
                 }
             }
         }
-        return result;
     }
 
-    private MultiMap<String> extractContentParameters()
+    /* ------------------------------------------------------------ */
+    private void extractContentParameters()
     {
-        MultiMap<String> result = new MultiMap<>();
-
         String contentType = getContentType();
-        if (contentType != null && !contentType.isEmpty())
+        if (contentType == null || contentType.isEmpty())
+            _contentParameters=NO_PARAMS;
+        else
         {
+            _contentParameters=new MultiMap<>();
             contentType = HttpFields.valueParameters(contentType, null);
             int contentLength = getContentLength();
             if (contentLength != 0)
             {
                 if (MimeTypes.Type.FORM_ENCODED.is(contentType) && _inputState == __NONE &&
-                        (HttpMethod.POST.is(getMethod()) || HttpMethod.PUT.is(getMethod())))
+                    _channel.getHttpConfiguration().isFormEncodedMethod(getMethod()))
                 {
-                    extractFormParameters(result);
+                    extractFormParameters(_contentParameters);
                 }
                 else if (contentType.startsWith("multipart/form-data") &&
                         getAttribute(__MULTIPART_CONFIG_ELEMENT) != null &&
                         _multiPartInputStream == null)
                 {
-                    extractMultipartParameters(result);
+                    extractMultipartParameters(_contentParameters);
                 }
             }
         }
 
-        return result;
     }
 
+    /* ------------------------------------------------------------ */
     public void extractFormParameters(MultiMap<String> params)
     {
         try
@@ -379,6 +487,7 @@
         }
     }
 
+    /* ------------------------------------------------------------ */
     private void extractMultipartParameters(MultiMap<String> result)
     {
         try
@@ -412,7 +521,8 @@
     /* ------------------------------------------------------------ */
     /**
      * Get Request Attribute.
-     * <p>Also supports jetty specific attributes to gain access to Jetty APIs:
+     * <p>
+     * Also supports jetty specific attributes to gain access to Jetty APIs:
      * <dl>
      * <dt>org.eclipse.jetty.server.Server</dt><dd>The Jetty Server instance</dd>
      * <dt>org.eclipse.jetty.server.HttpChannel</dt><dd>The HttpChannel for this request</dd>
@@ -420,7 +530,6 @@
      * </dl>
      * While these attributes may look like security problems, they are exposing nothing that is not already
      * available via reflection from a Request instance.
-     * </p>
      * @see javax.servlet.ServletRequest#getAttribute(java.lang.String)
      */
     @Override
@@ -428,11 +537,11 @@
     {
         if (name.startsWith("org.eclipse.jetty"))
         {
-            if ("org.eclipse.jetty.server.Server".equals(name))
+            if (Server.class.getName().equals(name))
                 return _channel.getServer();
-            if ("org.eclipse.jetty.server.HttpChannel".equals(name))
+            if (HttpChannel.class.getName().equals(name))
                 return _channel;
-            if ("org.eclipse.jetty.server.HttpConnection".equals(name) &&
+            if (HttpConnection.class.getName().equals(name) &&
                 _channel.getHttpTransport() instanceof HttpConnection)
                 return _channel.getHttpTransport();
         }
@@ -495,6 +604,8 @@
     @Override
     public String getCharacterEncoding()
     {
+        if (_characterEncoding==null)
+            getContentType();
         return _characterEncoding;
     }
 
@@ -502,7 +613,7 @@
     /**
      * @return Returns the connection.
      */
-    public HttpChannel<?> getHttpChannel()
+    public HttpChannel getHttpChannel()
     {
         return _channel;
     }
@@ -514,7 +625,9 @@
     @Override
     public int getContentLength()
     {
-        return (int)_fields.getLongField(HttpHeader.CONTENT_LENGTH.toString());
+        if (_metadata.getContentLength()!=Long.MIN_VALUE)
+            return (int)_metadata.getContentLength();
+        return (int)_metadata.getFields().getLongField(HttpHeader.CONTENT_LENGTH.toString());
     }
 
     /* ------------------------------------------------------------ */
@@ -524,13 +637,15 @@
     @Override
     public long getContentLengthLong()
     {
-        return _fields.getLongField(HttpHeader.CONTENT_LENGTH.toString());
+        if (_metadata.getContentLength()!=Long.MIN_VALUE)
+            return _metadata.getContentLength();
+        return _metadata.getFields().getLongField(HttpHeader.CONTENT_LENGTH.toString());
     }
 
     /* ------------------------------------------------------------ */
     public long getContentRead()
     {
-        return _input.getContentRead();
+        return _input.getContentConsumed();
     }
 
     /* ------------------------------------------------------------ */
@@ -540,7 +655,15 @@
     @Override
     public String getContentType()
     {
-        return _fields.getStringField(HttpHeader.CONTENT_TYPE);
+        String content_type = _metadata.getFields().get(HttpHeader.CONTENT_TYPE);
+        if (_characterEncoding==null && content_type!=null)
+        {
+            MimeTypes.Type mime = MimeTypes.CACHE.get(content_type);
+            String charset = (mime == null || mime.getCharset() == null) ? MimeTypes.getCharsetFromContentType(content_type) : mime.getCharset().toString();
+            if (charset != null)
+                _characterEncoding=charset;
+        }
+        return content_type;
     }
 
     /* ------------------------------------------------------------ */
@@ -569,7 +692,7 @@
     @Override
     public Cookie[] getCookies()
     {
-        if (_cookiesExtracted)
+        if (_metadata==null || _cookiesExtracted)
         {
             if (_cookies == null || _cookies.getCookies().length == 0)
                 return null;
@@ -579,7 +702,7 @@
 
         _cookiesExtracted = true;
 
-        Enumeration<?> enm = _fields.getValues(HttpHeader.COOKIE.toString());
+        Enumeration<?> enm = _metadata.getFields().getValues(HttpHeader.COOKIE.toString());
 
         // Handle no cookies
         if (enm != null)
@@ -608,7 +731,7 @@
     @Override
     public long getDateHeader(String name)
     {
-        return _fields.getDateField(name);
+        return _metadata==null?-1:_metadata.getFields().getDateField(name);
     }
 
     /* ------------------------------------------------------------ */
@@ -625,7 +748,7 @@
     @Override
     public String getHeader(String name)
     {
-        return _fields.getStringField(name);
+        return _metadata==null?null:_metadata.getFields().get(name);
     }
 
     /* ------------------------------------------------------------ */
@@ -635,7 +758,9 @@
     @Override
     public Enumeration<String> getHeaderNames()
     {
-        return _fields.getFieldNames();
+        if (_metadata==null)
+            return Collections.emptyEnumeration();
+        return _metadata.getFields().getFieldNames();
     }
 
     /* ------------------------------------------------------------ */
@@ -645,7 +770,9 @@
     @Override
     public Enumeration<String> getHeaders(String name)
     {
-        Enumeration<String> e = _fields.getValues(name);
+        if (_metadata==null)
+            return Collections.emptyEnumeration();
+        Enumeration<String> e = _metadata.getFields().getValues(name);
         if (e == null)
             return Collections.enumeration(Collections.<String>emptyList());
         return e;
@@ -684,7 +811,7 @@
     @Override
     public int getIntHeader(String name)
     {
-        return (int)_fields.getLongField(name);
+        return _metadata==null?-1:(int)_metadata.getFields().getLongField(name);
     }
 
 
@@ -695,7 +822,10 @@
     @Override
     public Locale getLocale()
     {
-        Enumeration<String> enm = _fields.getValues(HttpHeader.ACCEPT_LANGUAGE.toString(),HttpFields.__separators);
+        if (_metadata==null)
+            return Locale.getDefault();
+
+        Enumeration<String> enm = _metadata.getFields().getValues(HttpHeader.ACCEPT_LANGUAGE.toString(),HttpFields.__separators);
 
         // handle no locale
         if (enm == null || !enm.hasMoreElements())
@@ -732,8 +862,10 @@
     @Override
     public Enumeration<Locale> getLocales()
     {
+        if (_metadata==null)
+            return Collections.enumeration(__defaultLocale);
 
-        Enumeration<String> enm = _fields.getValues(HttpHeader.ACCEPT_LANGUAGE.toString(),HttpFields.__separators);
+        Enumeration<String> enm = _metadata.getFields().getValues(HttpHeader.ACCEPT_LANGUAGE.toString(),HttpFields.__separators);
 
         // handle no locale
         if (enm == null || !enm.hasMoreElements())
@@ -774,6 +906,21 @@
     @Override
     public String getLocalAddr()
     {
+        if (_channel==null)
+        {
+            try
+            {
+                String name =InetAddress.getLocalHost().getHostAddress();
+                if (StringUtil.ALL_INTERFACES.equals(name))
+                    return null;
+                return name;
+            }
+            catch (java.net.UnknownHostException e)
+            {
+                LOG.ignore(e);
+            }
+        }
+
         InetSocketAddress local=_channel.getLocalAddress();
         if (local==null)
             return "";
@@ -790,6 +937,20 @@
     @Override
     public String getLocalName()
     {
+        if (_channel==null)
+        {
+            try
+            {
+                String name =InetAddress.getLocalHost().getHostName();
+                if (StringUtil.ALL_INTERFACES.equals(name))
+                    return null;
+                return name;
+            }
+            catch (java.net.UnknownHostException e)
+            {
+                LOG.ignore(e);
+            }
+        }
         InetSocketAddress local=_channel.getLocalAddress();
         return local.getHostString();
     }
@@ -801,6 +962,8 @@
     @Override
     public int getLocalPort()
     {
+        if (_channel==null)
+            return 0;
         InetSocketAddress local=_channel.getLocalAddress();
         return local.getPort();
     }
@@ -812,7 +975,7 @@
     @Override
     public String getMethod()
     {
-        return _httpMethodString;
+        return _metadata==null?null:_metadata.getMethod();
     }
 
     /* ------------------------------------------------------------ */
@@ -825,7 +988,7 @@
         if (!_paramsExtracted)
             extractParameters();
         if (_parameters == null)
-            _parameters = restoreParameters();
+            restoreParameters();
         return _parameters.getValue(name,0);
     }
 
@@ -839,7 +1002,7 @@
         if (!_paramsExtracted)
             extractParameters();
         if (_parameters == null)
-            _parameters = restoreParameters();
+            restoreParameters();
         return Collections.unmodifiableMap(_parameters.toStringArrayMap());
     }
 
@@ -853,7 +1016,7 @@
         if (!_paramsExtracted)
             extractParameters();
         if (_parameters == null)
-            _parameters = restoreParameters();
+            restoreParameters();
         return Collections.enumeration(_parameters.keySet());
     }
 
@@ -867,38 +1030,50 @@
         if (!_paramsExtracted)
             extractParameters();
         if (_parameters == null)
-            _parameters = restoreParameters();
+            restoreParameters();
         List<String> vals = _parameters.getValues(name);
         if (vals == null)
             return null;
         return vals.toArray(new String[vals.size()]);
     }
 
-    private MultiMap<String> restoreParameters()
+    /* ------------------------------------------------------------ */
+    private void restoreParameters()
     {
-        MultiMap<String> result = new MultiMap<>();
         if (_queryParameters == null)
-            _queryParameters = extractQueryParameters();
-        result.addAllValues(_queryParameters);
-        result.addAllValues(_contentParameters);
-        return result;
+            extractQueryParameters();
+
+        if (_queryParameters==NO_PARAMS || _queryParameters.size()==0)
+            _parameters=_contentParameters;
+        else if (_contentParameters==NO_PARAMS || _contentParameters.size()==0)
+            _parameters=_queryParameters;
+        else
+        {
+            _parameters = new MultiMap<>();
+            _parameters.addAllValues(_queryParameters);
+            _parameters.addAllValues(_contentParameters);
+        }
     }
 
+    /* ------------------------------------------------------------ */
     public MultiMap<String> getQueryParameters()
     {
         return _queryParameters;
     }
 
+    /* ------------------------------------------------------------ */
     public void setQueryParameters(MultiMap<String> queryParameters)
     {
         _queryParameters = queryParameters;
     }
 
+    /* ------------------------------------------------------------ */
     public void setContentParameters(MultiMap<String> contentParameters)
     {
         _contentParameters = contentParameters;
     }
 
+    /* ------------------------------------------------------------ */
     public void resetParameters()
     {
         _parameters = null;
@@ -933,7 +1108,12 @@
     @Override
     public String getProtocol()
     {
-        return _httpVersion.toString();
+        if (_metadata==null)
+            return null;
+        HttpVersion version = _metadata.getVersion();
+        if (version==null)
+            return null;
+        return version.toString();
     }
 
     /* ------------------------------------------------------------ */
@@ -942,7 +1122,7 @@
      */
     public HttpVersion getHttpVersion()
     {
-        return _httpVersion;
+        return _metadata==null?null:_metadata.getVersion();
     }
 
     /* ------------------------------------------------------------ */
@@ -958,14 +1138,7 @@
     @Override
     public String getQueryString()
     {
-        if (_queryString == null && _uri != null)
-        {
-            if (_queryEncoding == null)
-                _queryString = _uri.getQuery();
-            else
-                _queryString = _uri.getQuery(_queryEncoding);
-        }
-        return _queryString;
+        return _metadata.getURI().getQuery();
     }
 
     /* ------------------------------------------------------------ */
@@ -1132,9 +1305,8 @@
     @Override
     public String getRequestURI()
     {
-        if (_requestURI == null && _uri != null)
-            _requestURI = _uri.getPathAndParam();
-        return _requestURI;
+        MetaData metadata = _metadata;
+        return (metadata==null)?null:_metadata.getURI().getPath();
     }
 
     /* ------------------------------------------------------------ */
@@ -1181,7 +1353,8 @@
     @Override
     public String getScheme()
     {
-        return _scheme;
+        String scheme=_metadata==null?null:_metadata.getURI().getScheme();
+        return scheme==null?HttpScheme.HTTP.asString():scheme;
     }
 
     /* ------------------------------------------------------------ */
@@ -1191,90 +1364,45 @@
     @Override
     public String getServerName()
     {
+        String name = _metadata.getURI().getHost();
+
         // Return already determined host
-        if (_serverName != null)
-            return _serverName;
+        if (name != null)
+            return name;
 
-        if (_uri == null)
-            throw new IllegalStateException("No uri");
+        return findServerName();
+    }
 
-        // Return host from absolute URI
-        _serverName = _uri.getHost();
-        if (_serverName != null)
-        {
-            _port = _uri.getPort();
-            return _serverName;
-        }
-
+    /* ------------------------------------------------------------ */
+    private String findServerName()
+    {
         // Return host from header field
-        String hostPort = _fields.getStringField(HttpHeader.HOST);
-
-        _port=0;
-        if (hostPort != null)
+        HttpField host = _metadata.getFields().getField(HttpHeader.HOST);
+        if (host!=null)
         {
-            int len=hostPort.length();
-            loop: for (int i = len; i-- > 0;)
-            {
-                char c2 = (char)(0xff & hostPort.charAt(i));
-                switch (c2)
-                {
-                    case ']':
-                        break loop;
-
-                    case ':':
-                        try
-                        {
-                            len=i;
-                            _port = StringUtil.toInt(hostPort.substring(i+1));
-                        }
-                        catch (NumberFormatException e)
-                        {
-                            LOG.warn(e);
-                            _serverName=hostPort;
-                            _port=0;
-                            return _serverName;
-                        }
-                        break loop;
-                }
-            }
-            if (hostPort.charAt(0)=='[')
-            {
-                if (hostPort.charAt(len-1)!=']')
-                {
-                    LOG.warn("Bad IPv6 "+hostPort);
-                    _serverName=hostPort;
-                    _port=0;
-                    return _serverName;
-                }
-                _serverName = hostPort.substring(0,len);
-            }
-            else if (len==hostPort.length())
-                _serverName=hostPort;
-            else
-                _serverName = hostPort.substring(0,len);
-
-            return _serverName;
+            // TODO is this needed now?
+            HostPortHttpField authority = (host instanceof HostPortHttpField)
+                ?((HostPortHttpField)host)
+                :new HostPortHttpField(host.getValue());
+            _metadata.getURI().setAuthority(authority.getHost(),authority.getPort());
+            return authority.getHost();
         }
 
         // Return host from connection
-        if (_channel != null)
-        {
-            _serverName = getLocalName();
-            _port = getLocalPort();
-            if (_serverName != null && !StringUtil.ALL_INTERFACES.equals(_serverName))
-                return _serverName;
-        }
+        String name=getLocalName();
+        if (name != null)
+            return name;
 
         // Return the local host
         try
         {
-            _serverName = InetAddress.getLocalHost().getHostAddress();
+            return InetAddress.getLocalHost().getHostAddress();
         }
         catch (java.net.UnknownHostException e)
         {
             LOG.ignore(e);
         }
-        return _serverName;
+        return null;
     }
 
     /* ------------------------------------------------------------ */
@@ -1284,30 +1412,41 @@
     @Override
     public int getServerPort()
     {
-        if (_port <= 0)
-        {
-            if (_serverName == null)
-                getServerName();
+        HttpURI uri = _metadata.getURI();
+        int port = (uri.getHost()==null)?findServerPort():uri.getPort();
 
-            if (_port <= 0)
-            {
-                if (_serverName != null && _uri != null)
-                    _port = _uri.getPort();
-                else
-                {
-                    InetSocketAddress local = _channel.getLocalAddress();
-                    _port = local == null?0:local.getPort();
-                }
-            }
-        }
-
-        if (_port <= 0)
+        // If no port specified, return the default port for the scheme
+        if (port <= 0)
         {
             if (getScheme().equalsIgnoreCase(URIUtil.HTTPS))
                 return 443;
             return 80;
         }
-        return _port;
+
+        // return a specific port
+        return port;
+    }
+
+    /* ------------------------------------------------------------ */
+    private int findServerPort()
+    {
+        // Return host from header field
+        HttpField host = _metadata.getFields().getField(HttpHeader.HOST);
+        if (host!=null)
+        {
+            // TODO is this needed now?
+            HostPortHttpField authority = (host instanceof HostPortHttpField)
+                ?((HostPortHttpField)host)
+                :new HostPortHttpField(host.getValue());
+            _metadata.getURI().setAuthority(authority.getHost(),authority.getPort());
+            return authority.getPort();
+        }
+
+        // Return host from connection
+        if (_channel != null)
+            return getLocalPort();
+
+        return -1;
     }
 
     /* ------------------------------------------------------------ */
@@ -1360,7 +1499,7 @@
             AbstractSession abstractSession =  ((AbstractSession)session);
             abstractSession.renewId(this);
             if (getRemoteUser() != null)
-                abstractSession.setAttribute(AbstractSession.SESSION_KNOWN_ONLY_TO_AUTHENTICATED, Boolean.TRUE);
+                abstractSession.setAttribute(AbstractSession.SESSION_CREATED_SECURE, Boolean.TRUE);
             if (abstractSession.isIdChanged())
                 _channel.getResponse().addCookie(_sessionManager.getSessionCookie(abstractSession, getContextPath(), isSecure()));
         }
@@ -1434,9 +1573,18 @@
     /**
      * @return Returns the uri.
      */
-    public HttpURI getUri()
+    public HttpURI getHttpURI()
     {
-        return _uri;
+        return _metadata==null?null:_metadata.getURI();
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @param uri the URI to set
+     */
+    public void setHttpURI(HttpURI uri)
+    {
+        _metadata.setURI(uri);
     }
 
     /* ------------------------------------------------------------ */
@@ -1591,9 +1739,71 @@
         return _savedNewSessions.get(key);
     }
 
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @param request the Request metadata
+     */
+    public void setMetaData(org.eclipse.jetty.http.MetaData.Request request)
+    {
+        _metadata=request;
+        setMethod(request.getMethod());
+        HttpURI uri = request.getURI();
+
+        String path = uri.getDecodedPath();
+        String info;
+        if (path==null || path.length()==0)
+        {
+            if (uri.isAbsolute())
+            {
+                path="/";
+                uri.setPath(path);
+            }
+            else
+            {
+                setPathInfo("");
+                throw new BadMessageException(400,"Bad URI");
+            }
+            info=path;
+        }
+        else if (!path.startsWith("/"))
+        {
+            if (!"*".equals(path) && !HttpMethod.CONNECT.is(getMethod()))
+            {
+                setPathInfo(path);
+                throw new BadMessageException(400,"Bad URI");
+            }
+            info=path;
+        }
+        else
+            info = URIUtil.canonicalPath(path);// TODO should this be done prior to decoding???
+
+        if (info == null)
+        {
+            setPathInfo(path);
+            throw new BadMessageException(400,"Bad URI");
+        }
+
+        setPathInfo(info);
+    }
+
+    /* ------------------------------------------------------------ */
+    public org.eclipse.jetty.http.MetaData.Request getMetaData()
+    {
+        return _metadata;
+    }
+
+    /* ------------------------------------------------------------ */
+    public boolean hasMetaData()
+    {
+        return _metadata!=null;
+    }
+
     /* ------------------------------------------------------------ */
     protected void recycle()
     {
+        _metadata=null;
+
         if (_context != null)
             throw new IllegalStateException("Request in context!");
 
@@ -1629,25 +1839,16 @@
         _cookiesExtracted = false;
         _context = null;
         _newContext=false;
-        _serverName = null;
-        _httpMethod=null;
-        _httpMethodString = null;
         _pathInfo = null;
-        _port = 0;
-        _httpVersion = HttpVersion.HTTP_1_1;
         _queryEncoding = null;
-        _queryString = null;
         _requestedSessionId = null;
         _requestedSessionIdFromCookie = false;
         _secure=false;
         _session = null;
         _sessionManager = null;
-        _requestURI = null;
         _scope = null;
-        _scheme = URIUtil.HTTP;
         _servletPath = null;
         _timeStamp = 0;
-        _uri = null;
         _queryParameters = null;
         _contentParameters = null;
         _parameters = null;
@@ -1659,7 +1860,6 @@
         _savedNewSessions=null;
         _multiPartInputStream = null;
         _remote=null;
-        _fields.clear();
         _input.recycle();
     }
 
@@ -1802,8 +2002,7 @@
      */
     public void setContentType(String contentType)
     {
-        _fields.put(HttpHeader.CONTENT_TYPE,contentType);
-
+        _metadata.getFields().put(HttpHeader.CONTENT_TYPE,contentType);
     }
 
     /* ------------------------------------------------------------ */
@@ -1834,7 +2033,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Sets the "context path" for this request
-     *
+     * @param contextPath the context path for this request
      * @see HttpServletRequest#getContextPath()
      */
     public void setContextPath(String contextPath)
@@ -1871,16 +2070,15 @@
      * @param method
      *            The method to set.
      */
-    public void setMethod(HttpMethod httpMethod, String method)
+    public void setMethod(String method)
     {
-        _httpMethod=httpMethod;
-        _httpMethodString = method;
+        _metadata.setMethod(method);
     }
 
     /* ------------------------------------------------------------ */
     public boolean isHead()
     {
-        return HttpMethod.HEAD==_httpMethod;
+        return _metadata!=null && HttpMethod.HEAD.is(_metadata.getMethod());
     }
 
     /* ------------------------------------------------------------ */
@@ -1895,27 +2093,16 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * @param version
-     *            The protocol to set.
-     */
-    public void setHttpVersion(HttpVersion version)
-    {
-        _httpVersion = version;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
      * Set the character encoding used for the query string. This call will effect the return of getQueryString and getParamaters. It must be called before any
      * getParameter methods.
      *
      * The request attribute "org.eclipse.jetty.server.server.Request.queryEncoding" may be set as an alternate method of calling setQueryEncoding.
      *
-     * @param queryEncoding
+     * @param queryEncoding the URI query character encoding
      */
     public void setQueryEncoding(String queryEncoding)
     {
         _queryEncoding = queryEncoding;
-        _queryString = null;
     }
 
     /* ------------------------------------------------------------ */
@@ -1925,7 +2112,7 @@
      */
     public void setQueryString(String queryString)
     {
-        _queryString = queryString;
+        _metadata.getURI().setQuery(queryString);
         _queryEncoding = null; //assume utf-8
     }
 
@@ -1960,13 +2147,9 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @param requestURI
-     *            The requestURI to set.
-     */
-    public void setRequestURI(String requestURI)
+    public void setURIPathQuery(String requestURI)
     {
-        _requestURI = requestURI;
+        _metadata.getURI().setPathQuery(requestURI);
     }
 
     /* ------------------------------------------------------------ */
@@ -1976,27 +2159,19 @@
      */
     public void setScheme(String scheme)
     {
-        _scheme = scheme;
+        _metadata.getURI().setScheme(scheme);
     }
 
     /* ------------------------------------------------------------ */
     /**
      * @param host
      *            The host to set.
-     */
-    public void setServerName(String host)
-    {
-        _serverName = host;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
      * @param port
-     *            The port to set.
+     *            the port to set
      */
-    public void setServerPort(int port)
+    public void setAuthority(String host,int port)
     {
-        _port = port;
+        _metadata.getURI().setAuthority(host,port);
     }
 
     /* ------------------------------------------------------------ */
@@ -2036,16 +2211,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @param uri
-     *            The uri to set.
-     */
-    public void setUri(HttpURI uri)
-    {
-        _uri = uri;
-    }
-
-    /* ------------------------------------------------------------ */
     public void setUserIdentityScope(UserIdentity.Scope scope)
     {
         _scope = scope;
@@ -2089,7 +2254,7 @@
                 getClass().getSimpleName(),
                 _handled ? "[" : "(",
                 getMethod(),
-                _uri,
+                getHttpURI(),
                 _handled ? "]" : ")",
                 hashCode());
     }
@@ -2162,7 +2327,7 @@
                         IO.copy(is, os);
                         String content=new String(os.toByteArray(),charset==null?StandardCharsets.UTF_8:Charset.forName(charset));
                         if (_contentParameters == null)
-                            _contentParameters = params == null ? new MultiMap<String>() : params;
+                            _contentParameters = params == null ? new MultiMap<>() : params;
                         _contentParameters.add(mp.getName(), content);
                     }
                     os.reset();
@@ -2198,24 +2363,35 @@
         _authentication=Authentication.UNAUTHENTICATED;
     }
 
-    public void mergeQueryParameters(String newQuery, boolean updateQueryString)
+    /* ------------------------------------------------------------ */
+    public void mergeQueryParameters(String oldQuery,String newQuery, boolean updateQueryString)
     {
-        MultiMap<String> newQueryParams = new MultiMap<>();
-        // Have to assume ENCODING because we can't know otherwise.
-        UrlEncoded.decodeTo(newQuery, newQueryParams, UrlEncoded.ENCODING, -1);
+        // TODO  This is seriously ugly
 
-        MultiMap<String> oldQueryParams = _queryParameters;
-        if (oldQueryParams == null && _queryString != null)
+        MultiMap<String> newQueryParams = null;
+        // Have to assume ENCODING because we can't know otherwise.
+        if (newQuery!=null)
         {
-            oldQueryParams = new MultiMap<>();
-            UrlEncoded.decodeTo(_queryString, oldQueryParams, getQueryEncoding(), -1);
+            newQueryParams = new MultiMap<>();
+            UrlEncoded.decodeTo(newQuery, newQueryParams, UrlEncoded.ENCODING);
         }
 
-        MultiMap<String> mergedQueryParams = newQueryParams;
-        if (oldQueryParams != null)
+        MultiMap<String> oldQueryParams = _queryParameters;
+        if (oldQueryParams == null && oldQuery != null)
+        {
+            oldQueryParams = new MultiMap<>();
+            UrlEncoded.decodeTo(oldQuery, oldQueryParams, getQueryEncoding());
+        }
+
+        MultiMap<String> mergedQueryParams;
+        if (newQueryParams==null || newQueryParams.size()==0)
+            mergedQueryParams=oldQueryParams==null?NO_PARAMS:oldQueryParams;
+        else if (oldQueryParams==null || oldQueryParams.size()==0)
+            mergedQueryParams=newQueryParams==null?NO_PARAMS:newQueryParams;
+        else
         {
             // Parameters values are accumulated.
-            mergedQueryParams = new MultiMap<>(newQueryParams);
+            mergedQueryParams=new MultiMap<>(newQueryParams);
             mergedQueryParams.addAllValues(oldQueryParams);
         }
 
@@ -2224,18 +2400,32 @@
 
         if (updateQueryString)
         {
-            // Build the new merged query string, parameters in the
-            // new query string hide parameters in the old query string.
-            StringBuilder mergedQuery = new StringBuilder(newQuery);
-            for (Map.Entry<String, List<String>> entry : mergedQueryParams.entrySet())
+            if (newQuery==null)
+                setQueryString(oldQuery);
+            else if (oldQuery==null)
+                setQueryString(newQuery);
+            else
             {
-                if (newQueryParams.containsKey(entry.getKey()))
-                    continue;
-                for (String value : entry.getValue())
-                    mergedQuery.append("&").append(entry.getKey()).append("=").append(value);
+                // Build the new merged query string, parameters in the
+                // new query string hide parameters in the old query string.
+                StringBuilder mergedQuery = new StringBuilder();
+                if (newQuery!=null)
+                    mergedQuery.append(newQuery);
+                for (Map.Entry<String, List<String>> entry : mergedQueryParams.entrySet())
+                {
+                    if (newQueryParams!=null && newQueryParams.containsKey(entry.getKey()))
+                        continue;
+                    for (String value : entry.getValue())
+                    {
+                        if (mergedQuery.length()>0)
+                            mergedQuery.append("&");
+                        URIUtil.encodePath(mergedQuery,entry.getKey());
+                        mergedQuery.append('=');
+                        URIUtil.encodePath(mergedQuery,value);
+                    }
+                }
+                setQueryString(mergedQuery.toString());
             }
-
-            setQueryString(mergedQuery.toString());
         }
     }
 
@@ -2245,23 +2435,6 @@
     @Override
     public <T extends HttpUpgradeHandler> T upgrade(Class<T> handlerClass) throws IOException, ServletException
     {
-        if (getContext() == null)
-            throw new ServletException ("Unable to instantiate "+handlerClass);
-
-        try
-        {
-            //Instantiate an instance and inject it
-            T h = getContext().createInstance(handlerClass);
-
-            //TODO handle the rest of the upgrade process
-
-            return h;
-        }
-        catch (Exception e)
-        {
-            if (e instanceof ServletException)
-                throw (ServletException)e;
-            throw new ServletException(e);
-        }
+        throw new ServletException("HttpServletRequest.upgrade() not supported in Jetty");
     }
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/RequestLog.java b/jetty-server/src/main/java/org/eclipse/jetty/server/RequestLog.java
index ecc9bd7..e5a7595 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/RequestLog.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/RequestLog.java
@@ -18,13 +18,24 @@
 
 package org.eclipse.jetty.server; 
 
-import org.eclipse.jetty.util.component.LifeCycle;
+import org.eclipse.jetty.server.handler.RequestLogHandler;
 
 /** 
  * A <code>RequestLog</code> can be attached to a {@link org.eclipse.jetty.server.handler.RequestLogHandler} to enable 
  * logging of requests/responses.
+ * @see RequestLogHandler#setRequestLog(RequestLog)
+ * @see Server#setRequestLog(RequestLog)
  */
-public interface RequestLog extends LifeCycle
+public interface RequestLog
 {
+    /* ------------------------------------------------------------ */
+    /**
+     * @param request The request to log.
+     * @param response The response to log.  Note that for some requests
+     * the response instance may not have been fully populated (Eg 400 bad request
+     * responses are sent without a servlet response object).  Thus for basic
+     * log information it is best to consult {@link Response#getCommittedMetaData()}
+     * and {@link Response#getHttpChannel()} directly.
+     */
     public void log(Request request, Response response);
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/RequestLogCollection.java b/jetty-server/src/main/java/org/eclipse/jetty/server/RequestLogCollection.java
new file mode 100644
index 0000000..2359c32
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/RequestLogCollection.java
@@ -0,0 +1,46 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server;
+
+import java.util.ArrayList;
+
+import static java.util.Arrays.asList;
+
+class RequestLogCollection
+    implements RequestLog
+{
+    private final ArrayList<RequestLog> delegates;
+
+    public RequestLogCollection(RequestLog... requestLogs)
+    {
+        delegates = new ArrayList<>(asList(requestLogs));
+    }
+
+    public void add(RequestLog requestLog)
+    {
+        delegates.add(requestLog);
+    }
+
+    @Override
+    public void log(Request request, Response response)
+    {
+        for (RequestLog delegate:delegates)
+            delegate.log(request, response);
+    }
+}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ResourceCache.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ResourceCache.java
index 0d7dbde..a209bf1 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/ResourceCache.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ResourceCache.java
@@ -32,30 +32,33 @@
 import java.util.concurrent.atomic.AtomicReference;
 
 import org.eclipse.jetty.http.DateGenerator;
+import org.eclipse.jetty.http.GzipHttpContent;
 import org.eclipse.jetty.http.HttpContent;
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.MimeTypes;
+import org.eclipse.jetty.http.MimeTypes.Type;
+import org.eclipse.jetty.http.PreEncodedHttpField;
+import org.eclipse.jetty.http.ResourceHttpContent;
 import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.resource.Resource;
 import org.eclipse.jetty.util.resource.ResourceFactory;
 
-
-/* ------------------------------------------------------------ */
-/** 
- * 
- */
-public class ResourceCache
+// TODO rename to ContentCache
+public class ResourceCache implements HttpContent.Factory
 {
     private static final Logger LOG = Log.getLogger(ResourceCache.class);
 
-    private final ConcurrentMap<String,Content> _cache;
+    private final ConcurrentMap<String,CachedHttpContent> _cache;
     private final AtomicInteger _cachedSize;
     private final AtomicInteger _cachedFiles;
     private final ResourceFactory _factory;
     private final ResourceCache _parent;
     private final MimeTypes _mimeTypes;
-    private final boolean _etagSupported;
+    private final boolean _etags;
+    private final boolean _gzip;
     private final boolean  _useFileMappedBuffer;
     
     private int _maxCachedFileSize =128*1024*1024;
@@ -64,18 +67,24 @@
     
     /* ------------------------------------------------------------ */
     /** Constructor.
+     * @param parent the parent resource cache
+     * @param factory the resource factory
      * @param mimeTypes Mimetype to use for meta data
+     * @param useFileMappedBuffer true to file memory mapped buffers
+     * @param etags true to support etags 
+     * @param gzip true to support gzip 
      */
-    public ResourceCache(ResourceCache parent, ResourceFactory factory, MimeTypes mimeTypes,boolean useFileMappedBuffer,boolean etags)
+    public ResourceCache(ResourceCache parent, ResourceFactory factory, MimeTypes mimeTypes,boolean useFileMappedBuffer,boolean etags,boolean gzip)
     {
         _factory = factory;
-        _cache=new ConcurrentHashMap<String,Content>();
+        _cache=new ConcurrentHashMap<String,CachedHttpContent>();
         _cachedSize=new AtomicInteger();
         _cachedFiles=new AtomicInteger();
         _mimeTypes=mimeTypes;
         _parent=parent;
         _useFileMappedBuffer=useFileMappedBuffer;
-        _etagSupported=etags;
+        _etags=etags;
+        _gzip=gzip;
     }
 
     /* ------------------------------------------------------------ */
@@ -150,7 +159,7 @@
             {
                 for (String path : _cache.keySet())
                 {
-                    Content content = _cache.remove(path);
+                    CachedHttpContent content = _cache.remove(path);
                     if (content!=null)
                         content.invalidate();
                 }
@@ -159,21 +168,30 @@
     }
 
     /* ------------------------------------------------------------ */
+    @Deprecated
+    public HttpContent lookup(String pathInContext)
+        throws IOException
+    {
+        return getContent(pathInContext);
+    }
+
+    /* ------------------------------------------------------------ */
     /** Get a Entry from the cache.
      * Get either a valid entry object or create a new one if possible.
      *
      * @param pathInContext The key into the cache
      * @return The entry matching <code>pathInContext</code>, or a new entry 
      * if no matching entry was found. If the content exists but is not cachable, 
-     * then a {@link ResourceAsHttpContent} instance is return. If 
+     * then a {@link ResourceHttpContent} instance is return. If 
      * the resource does not exist, then null is returned.
      * @throws IOException Problem loading the resource
      */
-    public HttpContent lookup(String pathInContext)
+    @Override
+    public HttpContent getContent(String pathInContext)
         throws IOException
     {
         // Is the content in this cache?
-        Content content =_cache.get(pathInContext);
+        CachedHttpContent content =_cache.get(pathInContext);
         if (content!=null && (content).isValid())
             return content;
        
@@ -196,11 +214,14 @@
     
     /* ------------------------------------------------------------ */
     /**
-     * @param resource
+     * @param resource the resource to test
      * @return True if the resource is cacheable. The default implementation tests the cache sizes.
      */
     protected boolean isCacheable(Resource resource)
     {
+        if (_maxCachedFiles<=0)
+            return false;
+        
         long len = resource.length();
 
         // Will it fit in the cache?
@@ -211,33 +232,76 @@
     private HttpContent load(String pathInContext, Resource resource)
         throws IOException
     {
-        Content content=null;
         
         if (resource==null || !resource.exists())
             return null;
         
+        if (resource.isDirectory())
+            return new ResourceHttpContent(resource,_mimeTypes.getMimeByExtension(resource.toString()),getMaxCachedFileSize());
+        
         // Will it fit in the cache?
-        if (!resource.isDirectory() && isCacheable(resource))
+        if (isCacheable(resource))
         {   
-            // Create the Content (to increment the cache sizes before adding the content 
-            content = new Content(pathInContext,resource);
+            CachedHttpContent content=null;
+            
+            // Look for a gzip resource
+            if (_gzip)
+            {
+                String pathInContextGz=pathInContext+".gz";
+                CachedHttpContent contentGz = _cache.get(pathInContextGz);
+                if (contentGz==null || !contentGz.isValid())
+                {
+                    contentGz=null;
+                    Resource resourceGz=_factory.getResource(pathInContextGz);
+                    if (resourceGz.exists() && resourceGz.lastModified()>=resource.lastModified() && resourceGz.length()<resource.length())
+                    {
+                        contentGz = new CachedHttpContent(pathInContextGz,resourceGz,null);
+                        shrinkCache();
+                        CachedHttpContent added = _cache.putIfAbsent(pathInContextGz,contentGz);
+                        if (added!=null)
+                        {
+                            contentGz.invalidate();
+                            contentGz=added;
+                        }
+                    }
+                }
+                content = new CachedHttpContent(pathInContext,resource,contentGz);
+            }
+            else 
+                content = new CachedHttpContent(pathInContext,resource,null);
 
             // reduce the cache to an acceptable size.
             shrinkCache();
 
             // Add it to the cache.
-            Content added = _cache.putIfAbsent(pathInContext,content);
+            CachedHttpContent added = _cache.putIfAbsent(pathInContext,content);
             if (added!=null)
             {
                 content.invalidate();
                 content=added;
             }
-
+            
             return content;
         }
         
-        return new HttpContent.ResourceAsHttpContent(resource,_mimeTypes.getMimeByExtension(resource.toString()),getMaxCachedFileSize(),_etagSupported);
+        // Look for a gzip resource or content
+        String mt = _mimeTypes.getMimeByExtension(pathInContext);
+        if (_gzip)
+        {
+            // Is the gzip content cached?
+            String pathInContextGz=pathInContext+".gz";
+            CachedHttpContent contentGz = _cache.get(pathInContextGz);
+            if (contentGz!=null && contentGz.isValid() && contentGz.getResource().lastModified()>=resource.lastModified())
+                return new ResourceHttpContent(resource,mt,getMaxCachedFileSize(),contentGz);
+            
+            // Is there a gzip resource?
+            Resource resourceGz=_factory.getResource(pathInContextGz);
+            if (resourceGz.exists() && resourceGz.lastModified()>=resource.lastModified() && resourceGz.length()<resource.length())
+                return new ResourceHttpContent(resource,mt,getMaxCachedFileSize(),
+                       new ResourceHttpContent(resourceGz,_mimeTypes.getMimeByExtension(pathInContextGz),getMaxCachedFileSize()));
+        }
         
+        return new ResourceHttpContent(resource,mt,getMaxCachedFileSize());
     }
     
     /* ------------------------------------------------------------ */
@@ -247,10 +311,10 @@
         while (_cache.size()>0 && (_cachedFiles.get()>_maxCachedFiles || _cachedSize.get()>_maxCacheSize))
         {
             // Scan the entire cache and generate an ordered list by last accessed time.
-            SortedSet<Content> sorted= new TreeSet<Content>(
-                    new Comparator<Content>()
+            SortedSet<CachedHttpContent> sorted= new TreeSet<CachedHttpContent>(
+                    new Comparator<CachedHttpContent>()
                     {
-                        public int compare(Content c1, Content c2)
+                        public int compare(CachedHttpContent c1, CachedHttpContent c2)
                         {
                             if (c1._lastAccessed<c2._lastAccessed)
                                 return -1;
@@ -258,17 +322,17 @@
                             if (c1._lastAccessed>c2._lastAccessed)
                                 return 1;
 
-                            if (c1._length<c2._length)
+                            if (c1._contentLengthValue<c2._contentLengthValue)
                                 return -1;
                             
                             return c1._key.compareTo(c2._key);
                         }
                     });
-            for (Content content : _cache.values())
+            for (CachedHttpContent content : _cache.values())
                 sorted.add(content);
             
             // Invalidate least recently used first
-            for (Content content : sorted)
+            for (CachedHttpContent content : sorted)
             {
                 if (_cachedFiles.get()<=_maxCachedFiles && _cachedSize.get()<=_maxCacheSize)
                     break;
@@ -320,40 +384,52 @@
     /* ------------------------------------------------------------ */
     /** MetaData associated with a context Resource.
      */
-    public class Content implements HttpContent
+    public class CachedHttpContent implements HttpContent
     {
-        final Resource _resource;
-        final int _length;
         final String _key;
-        final long _lastModified;
-        final ByteBuffer _lastModifiedBytes;
-        final ByteBuffer _contentType;
-        final String _etag;
+        final Resource _resource;
+        final int _contentLengthValue;
+        final HttpField _contentType;
+        final String _characterEncoding;
+        final MimeTypes.Type _mimeType;
+        final HttpField _contentLength;
+        final HttpField _lastModified;
+        final long _lastModifiedValue;
+        final HttpField _etag;
+        final CachedGzipHttpContent _gzipped;
         
         volatile long _lastAccessed;
         AtomicReference<ByteBuffer> _indirectBuffer=new AtomicReference<ByteBuffer>();
         AtomicReference<ByteBuffer> _directBuffer=new AtomicReference<ByteBuffer>();
 
         /* ------------------------------------------------------------ */
-        Content(String pathInContext,Resource resource)
+        CachedHttpContent(String pathInContext,Resource resource,CachedHttpContent gzipped)
         {
             _key=pathInContext;
             _resource=resource;
 
-            String mimeType = _mimeTypes.getMimeByExtension(_resource.toString());
-            _contentType=(mimeType==null?null:BufferUtil.toBuffer(mimeType));
-            boolean exists=resource.exists();
-            _lastModified=exists?resource.lastModified():-1;
-            _lastModifiedBytes=_lastModified<0?null:BufferUtil.toBuffer(DateGenerator.formatDate(_lastModified));
+            String contentType = _mimeTypes.getMimeByExtension(_resource.toString());
+            _contentType=contentType==null?null:new PreEncodedHttpField(HttpHeader.CONTENT_TYPE,contentType);
+            _characterEncoding = _contentType==null?null:MimeTypes.getCharsetFromContentType(contentType);
+            _mimeType = _contentType==null?null:MimeTypes.CACHE.get(MimeTypes.getContentTypeWithoutCharset(contentType));
             
-            _length=exists?(int)resource.length():0;
-            _cachedSize.addAndGet(_length);
+            boolean exists=resource.exists();
+            _lastModifiedValue=exists?resource.lastModified():-1L;
+            _lastModified=_lastModifiedValue==-1?null
+                :new PreEncodedHttpField(HttpHeader.LAST_MODIFIED,DateGenerator.formatDate(_lastModifiedValue));
+            
+            _contentLengthValue=exists?(int)resource.length():0;
+            _contentLength=new PreEncodedHttpField(HttpHeader.CONTENT_LENGTH,Long.toString(_contentLengthValue));
+            
+            _cachedSize.addAndGet(_contentLengthValue);
             _cachedFiles.incrementAndGet();
             _lastAccessed=System.currentTimeMillis();
             
-            _etag=ResourceCache.this._etagSupported?resource.getWeakETag():null;
+            _etag=ResourceCache.this._etags?new PreEncodedHttpField(HttpHeader.ETAG,resource.getWeakETag()):null;
+            
+            _gzipped=gzipped==null?null:new CachedGzipHttpContent(this,gzipped);        
         }
-
+        
 
         /* ------------------------------------------------------------ */
         public String getKey()
@@ -382,15 +458,22 @@
 
         /* ------------------------------------------------------------ */
         @Override
-        public String getETag()
+        public HttpField getETag()
         {
             return _etag;
         }
+
+        /* ------------------------------------------------------------ */
+        @Override
+        public String getETagValue()
+        {
+            return _etag.getValue();
+        }
         
         /* ------------------------------------------------------------ */
         boolean isValid()
         {
-            if (_lastModified==_resource.lastModified() && _length==_resource.length())
+            if (_lastModifiedValue==_resource.lastModified() && _contentLengthValue==_resource.length())
             {
                 _lastAccessed=System.currentTimeMillis();
                 return true;
@@ -405,30 +488,73 @@
         protected void invalidate()
         {
             // Invalidate it
-            _cachedSize.addAndGet(-_length);
+            _cachedSize.addAndGet(-_contentLengthValue);
             _cachedFiles.decrementAndGet();
-            _resource.close(); 
+            _resource.close();
         }
 
         /* ------------------------------------------------------------ */
         @Override
-        public String getLastModified()
+        public HttpField getLastModified()
         {
-            return BufferUtil.toString(_lastModifiedBytes);
+            return _lastModified;
+        }
+        
+        /* ------------------------------------------------------------ */
+        @Override
+        public String getLastModifiedValue()
+        {
+            return _lastModified==null?null:_lastModified.getValue();
+        }
+
+
+        /* ------------------------------------------------------------ */
+        @Override
+        public HttpField getContentType()
+        {
+            return _contentType;
+        }
+        
+        /* ------------------------------------------------------------ */
+        @Override
+        public String getContentTypeValue()
+        {
+            return _contentType==null?null:_contentType.getValue();
         }
 
         /* ------------------------------------------------------------ */
         @Override
-        public String getContentType()
+        public HttpField getContentEncoding()
         {
-            return BufferUtil.toString(_contentType);
+            return null;
         }
 
         /* ------------------------------------------------------------ */
         @Override
+        public String getContentEncodingValue()
+        {
+            return null;
+        }   
+        
+        /* ------------------------------------------------------------ */
+        @Override
+        public String getCharacterEncoding()
+        {
+            return _characterEncoding;
+        }
+
+        /* ------------------------------------------------------------ */
+        @Override
+        public Type getMimeType()
+        {
+            return _mimeType;
+        }
+
+
+        /* ------------------------------------------------------------ */
+        @Override
         public void release()
         {
-            // don't release while cached. Release when invalidated.
         }
 
         /* ------------------------------------------------------------ */
@@ -473,12 +599,19 @@
                 return null;
             return buffer.asReadOnlyBuffer();
         }
+
+        /* ------------------------------------------------------------ */
+        @Override
+        public HttpField getContentLength()
+        {
+            return _contentLength;
+        }
         
         /* ------------------------------------------------------------ */
         @Override
-        public long getContentLength()
+        public long getContentLengthValue()
         {
-            return _length;
+            return _contentLengthValue;
         }
 
         /* ------------------------------------------------------------ */
@@ -499,12 +632,65 @@
             return _resource.getReadableByteChannel();
         }
 
-
         /* ------------------------------------------------------------ */
         @Override
         public String toString()
         {
-            return String.format("CachedContent@%x{r=%s,e=%b,lm=%s,ct=%s}",hashCode(),_resource,_resource.exists(),BufferUtil.toString(_lastModifiedBytes),_contentType);
-        }   
+            return String.format("CachedContent@%x{r=%s,e=%b,lm=%s,ct=%s,gz=%b}",hashCode(),_resource,_resource.exists(),_lastModified,_contentType,_gzipped!=null);
+        }
+
+        /* ------------------------------------------------------------ */
+        @Override
+        public HttpContent getGzipContent()
+        {
+            return (_gzipped!=null && _gzipped.isValid())?_gzipped:null;
+        }
     }
+
+    /* ------------------------------------------------------------ */
+    /* ------------------------------------------------------------ */
+    /* ------------------------------------------------------------ */
+    public class CachedGzipHttpContent extends GzipHttpContent
+    {
+        private final CachedHttpContent _content; 
+        private final CachedHttpContent _contentGz;
+        private final HttpField _etag;
+        
+        CachedGzipHttpContent(CachedHttpContent content, CachedHttpContent contentGz)
+        {
+            super(content,contentGz);
+            _content=content;
+            _contentGz=contentGz;
+            
+            _etag=(ResourceCache.this._etags)?new PreEncodedHttpField(HttpHeader.ETAG,_content.getResource().getWeakETag("--gzip")):null;
+        }
+
+        public boolean isValid()
+        {
+            return _contentGz.isValid() && _content.isValid() && _content.getResource().lastModified() <= _contentGz.getResource().lastModified();
+        }
+
+        @Override
+        public HttpField getETag()
+        {
+            if (_etag!=null)
+                return _etag;
+            return super.getETag();
+        }
+
+        @Override
+        public String getETagValue()
+        {
+            if (_etag!=null)
+                return _etag.getValue();
+            return super.getETagValue();
+        }
+        
+        @Override
+        public String toString()
+        {
+            return "Cached"+super.toString();
+        }
+    }
+
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ResourceContentFactory.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ResourceContentFactory.java
new file mode 100644
index 0000000..2e0edde
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ResourceContentFactory.java
@@ -0,0 +1,104 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server;
+
+import java.io.IOException;
+
+import org.eclipse.jetty.http.HttpContent;
+import org.eclipse.jetty.http.HttpContent.Factory;
+import org.eclipse.jetty.http.MimeTypes;
+import org.eclipse.jetty.http.ResourceHttpContent;
+import org.eclipse.jetty.util.resource.Resource;
+import org.eclipse.jetty.util.resource.ResourceFactory;
+
+public class ResourceContentFactory implements Factory
+{
+    private final ResourceFactory _factory;
+    private final MimeTypes _mimeTypes;
+    private final int _maxBufferSize;
+    private final boolean _gzip;
+    
+
+    /* ------------------------------------------------------------ */
+    public ResourceContentFactory(ResourceFactory factory, MimeTypes mimeTypes, int maxBufferSize, boolean gzip)
+    {
+        _factory=factory;
+        _mimeTypes=mimeTypes;
+        _maxBufferSize=maxBufferSize;
+        _gzip=gzip;
+    }
+
+    /* ------------------------------------------------------------ */
+    /** Get a Entry from the cache.
+     * Get either a valid entry object or create a new one if possible.
+     *
+     * @param pathInContext The key into the cache
+     * @return The entry matching <code>pathInContext</code>, or a new entry 
+     * if no matching entry was found. If the content exists but is not cachable, 
+     * then a {@link ResourceHttpContent} instance is return. If 
+     * the resource does not exist, then null is returned.
+     * @throws IOException Problem loading the resource
+     */
+    @Override
+    public HttpContent getContent(String pathInContext)
+        throws IOException
+    {
+       
+        // try loading the content from our factory.
+        Resource resource=_factory.getResource(pathInContext);
+        HttpContent loaded = load(pathInContext,resource);
+        return loaded;
+    }
+    
+    
+    /* ------------------------------------------------------------ */
+    private HttpContent load(String pathInContext, Resource resource)
+        throws IOException
+    {   
+        if (resource==null || !resource.exists())
+            return null;
+        
+        if (resource.isDirectory())
+            return new ResourceHttpContent(resource,_mimeTypes.getMimeByExtension(resource.toString()),_maxBufferSize);
+        
+        // Look for a gzip resource or content
+        String mt = _mimeTypes.getMimeByExtension(pathInContext);
+        if (_gzip)
+        {
+            // Is there a gzip resource? 
+            String pathInContextGz=pathInContext+".gz";
+            Resource resourceGz=_factory.getResource(pathInContextGz);
+            if (resourceGz.exists() && resourceGz.lastModified()>=resource.lastModified() && resourceGz.length()<resource.length())
+                return new ResourceHttpContent(resource,mt,_maxBufferSize,
+                       new ResourceHttpContent(resourceGz,_mimeTypes.getMimeByExtension(pathInContextGz),_maxBufferSize));
+        }
+        
+        return new ResourceHttpContent(resource,mt,_maxBufferSize);
+    }
+    
+    
+    /* ------------------------------------------------------------ */
+    @Override
+    public String toString()
+    {
+        return "ResourceContentFactory["+_factory+"]@"+hashCode();
+    }
+    
+
+}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java
index 93cc88b..d7c2425 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java
@@ -18,8 +18,6 @@
 
 package org.eclipse.jetty.server;
 
-import static org.eclipse.jetty.util.QuotedStringTokenizer.isQuoted;
-
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.nio.channels.IllegalSelectorException;
@@ -43,17 +41,19 @@
 import org.eclipse.jetty.http.HttpField;
 import org.eclipse.jetty.http.HttpFields;
 import org.eclipse.jetty.http.HttpGenerator;
-import org.eclipse.jetty.http.HttpGenerator.ResponseInfo;
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpHeaderValue;
 import org.eclipse.jetty.http.HttpScheme;
 import org.eclipse.jetty.http.HttpStatus;
 import org.eclipse.jetty.http.HttpURI;
 import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
 import org.eclipse.jetty.http.MimeTypes;
+import org.eclipse.jetty.http.PreEncodedHttpField;
 import org.eclipse.jetty.io.RuntimeIOException;
 import org.eclipse.jetty.server.handler.ErrorHandler;
 import org.eclipse.jetty.util.ByteArrayISO8859Writer;
+import org.eclipse.jetty.util.Jetty;
 import org.eclipse.jetty.util.QuotedStringTokenizer;
 import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.URIUtil;
@@ -69,6 +69,7 @@
     private static final String __COOKIE_DELIM="\",;\\ \t";
     private final static String __01Jan1970_COOKIE = DateGenerator.formatCookieDate(0).trim();
     private final static int __MIN_BUFFER_SIZE = 1;
+    private final static HttpField __EXPIRES_01JAN1970 = new PreEncodedHttpField(HttpHeader.EXPIRES,DateGenerator.__01Jan1970);
     
 
     // Cookie building buffer. Reduce garbage for cookie using applications
@@ -80,15 +81,6 @@
           return new StringBuilder(128);
        }
     };
-
-    /* ------------------------------------------------------------ */
-    public static Response getResponse(HttpServletResponse response)
-    {
-        if (response instanceof Response)
-            return (Response)response;
-        return HttpChannel.getCurrentHttpChannel().getResponse();
-    }
-    
     
     public enum OutputType
     {
@@ -108,10 +100,10 @@
      */
     public final static String HTTP_ONLY_COMMENT = "__HTTP_ONLY__";
 
-    private final HttpChannel<?> _channel;
+    private final HttpChannel _channel;
     private final HttpFields _fields = new HttpFields();
     private final AtomicInteger _include = new AtomicInteger();
-    private HttpOutput _out;
+    private final HttpOutput _out;
     private int _status = HttpStatus.OK_200;
     private String _reason;
     private Locale _locale;
@@ -124,13 +116,13 @@
     private long _contentLength = -1;
     
 
-    public Response(HttpChannel<?> channel, HttpOutput out)
+    public Response(HttpChannel channel, HttpOutput out)
     {
         _channel = channel;
         _out = out;
     }
 
-    protected HttpChannel<?> getHttpChannel()
+    public HttpChannel getHttpChannel()
     {
         return _channel;
     }
@@ -145,45 +137,15 @@
         _contentType = null;
         _outputType = OutputType.NONE;
         _contentLength = -1;
-        _out.reset();
+        _out.recycle();
         _fields.clear();
         _explicitEncoding=false;
     }
-
-    public void setHeaders(HttpContent httpContent)
-    {
-        Response response = _channel.getResponse();
-        String contentType = httpContent.getContentType();
-        if (contentType != null && !response.getHttpFields().containsKey(HttpHeader.CONTENT_TYPE.asString()))
-            setContentType(contentType);
-        
-        if (httpContent.getContentLength() > 0)
-            setLongContentLength(httpContent.getContentLength());
-
-        String lm = httpContent.getLastModified();
-        if (lm != null)
-            response.getHttpFields().put(HttpHeader.LAST_MODIFIED, lm);
-        else if (httpContent.getResource() != null)
-        {
-            long lml = httpContent.getResource().lastModified();
-            if (lml != -1)
-                response.getHttpFields().putDateField(HttpHeader.LAST_MODIFIED, lml);
-        }
-
-        String etag=httpContent.getETag();
-        if (etag!=null)
-            response.getHttpFields().put(HttpHeader.ETAG,etag);
-    }
     
     public HttpOutput getHttpOutput()
     {
         return _out;
     }
-    
-    public void setHttpOutput(HttpOutput out)
-    {
-        _out=out;
-    }
 
     public boolean isIncluding()
     {
@@ -256,7 +218,7 @@
      * @param domain the domain
      * @param path the path
      * @param maxAge the maximum age
-     * @param comment the comment (only present on versions > 0)
+     * @param comment the comment (only present on versions &gt; 0)
      * @param isSecure true if secure cookie
      * @param isHttpOnly true if for http only
      * @param version version of cookie logic to use (0 == default behavior)
@@ -300,7 +262,9 @@
         boolean quote_path = has_path && isQuoteNeededForCookie(path);
         
         // Upgrade the version if we have a comment or we need to quote value/path/domain or if they were already quoted
-        if (version==0 && ( comment!=null || quote_name || quote_value || quote_domain || quote_path || isQuoted(name) || isQuoted(value) || isQuoted(path) || isQuoted(domain)))
+        if (version==0 && ( comment!=null || quote_name || quote_value || quote_domain || quote_path ||
+                QuotedStringTokenizer.isQuoted(name) || QuotedStringTokenizer.isQuoted(value) ||
+                QuotedStringTokenizer.isQuoted(path) || QuotedStringTokenizer.isQuoted(domain)))
             version=1;
 
         // Append version
@@ -377,7 +341,7 @@
         _fields.add(HttpHeader.SET_COOKIE.toString(), buf.toString());
 
         // Expire responses with set-cookie headers so they do not get cached.
-        _fields.put(HttpHeader.EXPIRES.toString(), DateGenerator.__01Jan1970);
+        _fields.put(__EXPIRES_01JAN1970);
     }
 
 
@@ -440,9 +404,13 @@
             int port = uri.getPort();
             if (port < 0)
                 port = HttpScheme.HTTPS.asString().equalsIgnoreCase(uri.getScheme()) ? 443 : 80;
-            if (!request.getServerName().equalsIgnoreCase(uri.getHost()) ||
-                    request.getServerPort() != port ||
-                    !path.startsWith(request.getContextPath())) //TODO the root context path is "", with which every non null string starts
+            
+            // Is it the same server?
+            if (!request.getServerName().equalsIgnoreCase(uri.getHost()))
+                return url;
+            if (request.getServerPort() != port)
+                return url;
+            if (!path.startsWith(request.getContextPath())) //TODO the root context path is "", with which every non null string starts
                 return url;
         }
 
@@ -550,10 +518,17 @@
         if (isIncluding())
             return;
 
+        if (isCommitted())
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Aborting on sendError on committed response {} {}",code,message);
+            code=-1;
+        }
+        
         switch(code)
         {
             case -1:
-                _channel.abort();
+                _channel.abort(new IOException());
                 return;
             case 102:
                 sendProcessing();
@@ -619,7 +594,9 @@
                     writer.write(". Reason:\n<pre>    ");
                     writer.write(message);
                     writer.write("</pre>");
-                    writer.write("</p>\n<hr /><i><small>Powered by Jetty://</small></i>");
+                    writer.write("</p>\n<hr />");
+
+                    getHttpChannel().getHttpConfiguration().writePoweredBy(writer,null,"<hr/>");
                     writer.write("\n</body>\n</html>\n");
 
                     writer.flush();
@@ -650,6 +627,7 @@
      * request has a Expect header starting with 102, then a 102 response is
      * sent. This indicates that the request still be processed and real response
      * can still be sent.   This method is called by sendError if it is passed 102.
+     * @throws IOException if unable to send the 102 response
      * @see javax.servlet.http.HttpServletResponse#sendError(int)
      */
     public void sendProcessing() throws IOException
@@ -662,9 +640,9 @@
     
     /**
      * Sends a response with one of the 300 series redirection codes.
-     * @param code
-     * @param location
-     * @throws IOException
+     * @param code the redirect status code
+     * @param location the location to send in <code>Location</code> headers
+     * @throws IOException if unable to send the redirect
      */
     public void sendRedirect(int code, String location) throws IOException
     {
@@ -784,7 +762,7 @@
     @Override
     public String getHeader(String name)
     {
-        return _fields.getStringField(name);
+        return _fields.get(name);
     }
 
     @Override
@@ -844,7 +822,7 @@
                 _contentLength = value;
         }
     }
-
+    
     @Override
     public void setStatus(int sc)
     {
@@ -916,7 +894,7 @@
             if (encoding == null)
             {
                 if (_mimeType!=null && _mimeType.isCharsetAssumed())
-                    encoding=_mimeType.getCharset().toString();
+                    encoding=_mimeType.getCharsetString();
                 else
                 {
                     encoding = MimeTypes.inferCharsetFromContentType(_contentType);
@@ -926,16 +904,18 @@
                 }
             }
             
-            if (_writer != null && _writer.isFor(encoding))
+            Locale locale = getLocale();
+            
+            if (_writer != null && _writer.isFor(locale,encoding))
                 _writer.reopen();
             else
             {
                 if (StringUtil.__ISO_8859_1.equalsIgnoreCase(encoding))
-                    _writer = new ResponseWriter(new Iso88591HttpWriter(_out),encoding);
+                    _writer = new ResponseWriter(new Iso88591HttpWriter(_out),locale,encoding);
                 else if (StringUtil.__UTF8.equalsIgnoreCase(encoding))
-                    _writer = new ResponseWriter(new Utf8HttpWriter(_out),encoding);
+                    _writer = new ResponseWriter(new Utf8HttpWriter(_out),locale,encoding);
                 else
-                    _writer = new ResponseWriter(new EncodingHttpWriter(_out, encoding),encoding);
+                    _writer = new ResponseWriter(new EncodingHttpWriter(_out, encoding),locale,encoding);
             }
             
             // Set the output type at the end, because setCharacterEncoding() checks for it
@@ -1075,7 +1055,7 @@
                 _characterEncoding = HttpGenerator.__STRICT?encoding:StringUtil.normalizeCharset(encoding);
                 if (_mimeType!=null)
                 {
-                    _contentType=_mimeType.getBaseType().asString()+ "; charset=" + _characterEncoding;
+                    _contentType=_mimeType.getBaseType().asString()+ ";charset=" + _characterEncoding;
                     _mimeType = MimeTypes.CACHE.get(_contentType);
                     if (_mimeType==null || HttpGenerator.__STRICT)
                         _fields.put(HttpHeader.CONTENT_TYPE, _contentType);
@@ -1084,13 +1064,13 @@
                 }
                 else if (_contentType != null)
                 {
-                    _contentType = MimeTypes.getContentTypeWithoutCharset(_contentType) + "; charset=" + _characterEncoding;
+                    _contentType = MimeTypes.getContentTypeWithoutCharset(_contentType) + ";charset=" + _characterEncoding;
                     _fields.put(HttpHeader.CONTENT_TYPE, _contentType);
                 }
             }
         }
     }
-
+    
     @Override
     public void setContentType(String contentType)
     {
@@ -1115,7 +1095,7 @@
             
             String charset;
             if (_mimeType!=null && _mimeType.getCharset()!=null && !_mimeType.isCharsetAssumed())
-                charset=_mimeType.getCharset().toString();
+                charset=_mimeType.getCharsetString();
             else
                 charset = MimeTypes.getCharsetFromContentType(contentType);
 
@@ -1123,17 +1103,17 @@
             {
                 if (_characterEncoding != null)
                 {
-                    _contentType = contentType + "; charset=" + _characterEncoding;
+                    _contentType = contentType + ";charset=" + _characterEncoding;
                     _mimeType = null;
                 }
             }
-            else if (isWriting() && !charset.equals(_characterEncoding))
+            else if (isWriting() && !charset.equalsIgnoreCase(_characterEncoding))
             {
                 // too late to change the character encoding;
                 _mimeType = null;
                 _contentType = MimeTypes.getContentTypeWithoutCharset(_contentType);
                 if (_characterEncoding != null)
-                    _contentType = _contentType + "; charset=" + _characterEncoding;
+                    _contentType = _contentType + ";charset=" + _characterEncoding;
             }
             else
             {
@@ -1184,13 +1164,13 @@
         _contentLength = -1;
         _fields.clear();
 
-        String connection = _channel.getRequest().getHttpFields().getStringField(HttpHeader.CONNECTION);
+        String connection = _channel.getRequest().getHeader(HttpHeader.CONNECTION.asString());
+                
         if (connection != null)
         {
-            String[] values = connection.split(",");
-            for (int i = 0; values != null && i < values.length; i++)
+            for (String value: StringUtil.csvSplit(null,connection,0,connection.length()))
             {
-                HttpHeaderValue cb = HttpHeaderValue.CACHE.get(values[0].trim());
+                HttpHeaderValue cb = HttpHeaderValue.CACHE.get(value);
 
                 if (cb != null)
                 {
@@ -1242,21 +1222,28 @@
         if (isCommitted())
             throw new IllegalStateException("Committed");
 
-        switch (_outputType)
-        {
-            case STREAM:
-            case WRITER:
-                _out.reset();
-                break;
-            default:
-        }
-
         _out.resetBuffer();
     }
 
-    protected ResponseInfo newResponseInfo()
+    protected MetaData.Response newResponseMetaData()
     {
-        return new ResponseInfo(_channel.getRequest().getHttpVersion(), _fields, getLongContentLength(), getStatus(), getReason(), _channel.getRequest().isHead());
+        return new MetaData.Response(_channel.getRequest().getHttpVersion(), getStatus(), getReason(), _fields, getLongContentLength());
+    }
+    
+    /** Get the MetaData.Response committed for this response.
+     * This may differ from the meta data in this response for 
+     * exceptional responses (eg 4xx and 5xx responses generated
+     * by the container) and the committedMetaData should be used 
+     * for logging purposes.
+     * @return The committed MetaData or a {@link #newResponseMetaData()}
+     * if not yet committed.
+     */
+    public MetaData.Response getCommittedMetaData()
+    {
+        MetaData.Response meta = _channel.getCommittedMetaData();
+        if (meta==null)
+            return newResponseMetaData();
+        return meta;
     }
 
     @Override
@@ -1322,27 +1309,73 @@
     }
     
 
-    private static class ResponseWriter extends PrintWriter
+    public void putHeaders(HttpContent content,long contentLength, boolean etag)
     {
-        private final String _encoding;
-        private final HttpWriter _httpWriter;
-        
-        public ResponseWriter(HttpWriter httpWriter,String encoding)
+        HttpField lm = content.getLastModified();
+        if (lm!=null)
+            _fields.put(lm);
+
+        if (contentLength==0)
         {
-            super(httpWriter);
-            _httpWriter=httpWriter;
-            _encoding=encoding;
+            _fields.put(content.getContentLength());
+            _contentLength=content.getContentLengthValue();
+        }
+        else if (contentLength>0)
+        {
+            _fields.putLongField(HttpHeader.CONTENT_LENGTH,contentLength);
+            _contentLength=contentLength;
         }
 
-        public boolean isFor(String encoding)
+        HttpField ct=content.getContentType();
+        if (ct!=null)
         {
-            return _encoding.equalsIgnoreCase(encoding);
+            _fields.put(ct);
+            _contentType=ct.getValue();
+            _characterEncoding=content.getCharacterEncoding();
+            _mimeType=content.getMimeType();
         }
         
-        protected void reopen()
+        HttpField ce=content.getContentEncoding();
+        if (ce!=null)
+            _fields.put(ce);
+        
+        if (etag)
         {
-            super.clearError();
-            out=_httpWriter;
+            HttpField et = content.getETag();
+            if (et!=null)
+                _fields.put(et);
+        }
+    }
+    
+    public static void putHeaders(HttpServletResponse response, HttpContent content, long contentLength, boolean etag)
+    {   
+        long lml=content.getResource().lastModified();
+        if (lml>=0)
+            response.setDateHeader(HttpHeader.LAST_MODIFIED.asString(),lml);
+
+        if (contentLength==0)
+            contentLength=content.getContentLengthValue();
+        if (contentLength >=0)
+        {
+            if (contentLength<Integer.MAX_VALUE)
+                response.setContentLength((int)contentLength);
+            else
+                response.setHeader(HttpHeader.CONTENT_LENGTH.asString(),Long.toString(contentLength));
+        }
+
+        String ct=content.getContentTypeValue();
+        if (ct!=null && response.getContentType()==null)
+            response.setContentType(ct);
+
+        String ce=content.getContentEncodingValue();
+        if (ce!=null)
+            response.setHeader(HttpHeader.CONTENT_ENCODING.asString(),ce);
+        
+        if (etag)
+        {
+            String et=content.getETagValue();
+            if (et!=null)
+                response.setHeader(HttpHeader.ETAG.asString(),et);
         }
     }
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ResponseWriter.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ResponseWriter.java
new file mode 100644
index 0000000..a9f4e1d
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ResponseWriter.java
@@ -0,0 +1,481 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server;
+
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.io.PrintWriter;
+import java.util.Formatter;
+import java.util.Locale;
+
+import javax.servlet.ServletResponse;
+
+import org.eclipse.jetty.io.EofException;
+import org.eclipse.jetty.io.RuntimeIOException;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+
+/* ------------------------------------------------------------ */
+/** Specialized PrintWriter for servlet Responses
+ * <p>An instance of ResponseWriter is the {@link PrintWriter} subclass returned by {@link Response#getWriter()}.
+ * It differs from the standard {@link PrintWriter} in that:<ul>
+ * <li>It does not support autoflush</li>
+ * <li>The default Locale for {@link #format(String, Object...)} is the locale obtained by {@link ServletResponse#getLocale()}</li>
+ * <li>If a write or print method is called while {@link #checkError()}  returns true, then a {@link RuntimeIOException} is thrown to stop needless iterations.</li>
+ * <li>The writer may be reopen to allow for recycling</li>
+ * </ul>
+ * 
+ */
+public class ResponseWriter extends PrintWriter
+{
+    private static final Logger LOG = Log.getLogger(ResponseWriter.class);
+    private final static String __lineSeparator = System.getProperty("line.separator");
+    private final static String __trueln = "true"+__lineSeparator;
+    private final static String __falseln = "false"+__lineSeparator;
+    
+    private final HttpWriter _httpWriter;
+    private final Locale _locale;
+    private final String _encoding;
+    private IOException _ioException;
+    private boolean _isClosed = false;
+    private Formatter _formatter;
+
+    public ResponseWriter(HttpWriter httpWriter,Locale locale,String encoding)
+    {
+        super(httpWriter,false);
+        _httpWriter=httpWriter;
+        _locale=locale;
+        _encoding=encoding;
+    }
+
+    public boolean isFor(Locale locale, String encoding)
+    {
+        if (_locale==null && locale!=null)
+            return false;
+        if (_encoding==null && encoding!=null)
+            return false;
+        return _encoding.equalsIgnoreCase(encoding) && _locale.equals(locale);
+    }
+
+    protected void reopen()
+    {
+        synchronized (lock)
+        {
+            _isClosed=false;
+            clearError();
+            out=_httpWriter;
+        }
+    }
+
+    @Override
+    protected void clearError()
+    {
+        synchronized (lock)
+        {
+            _ioException=null;
+            super.clearError();
+        }
+    }
+    
+    @Override
+    public boolean checkError()
+    {
+        synchronized (lock)
+        {
+            return _ioException!=null || super.checkError();
+        }
+    }
+    
+    private void setError(Throwable th)
+    {
+        super.setError();
+
+        if (th instanceof IOException)
+            _ioException=(IOException)th;
+        else
+        {
+            _ioException=new IOException(String.valueOf(th));
+            _ioException.initCause(th);
+        }
+
+        if (LOG.isDebugEnabled())
+            LOG.debug(th);
+    }
+
+
+    @Override
+    protected void setError()
+    {
+        setError(new IOException());
+    }
+
+    /** Check to make sure that the stream has not been closed */
+    private void isOpen() throws IOException
+    {       
+        if (_ioException!=null)
+            throw new RuntimeIOException(_ioException); 
+        
+        if (_isClosed)
+            throw new EofException("Stream closed");
+    }
+
+    @Override
+    public void flush()
+    {
+        try
+        {
+            synchronized (lock)
+            {
+                isOpen();
+                out.flush();
+            }
+        }
+        catch (IOException ex)
+        {
+            setError(ex);
+        }
+    }
+
+    @Override
+    public void close()
+    {
+        try
+        {
+            synchronized (lock)
+            {
+                out.close();
+                _isClosed = true;
+            }
+        }
+        catch (IOException ex)
+        {
+            setError(ex);
+        }
+    }
+
+    @Override
+    public void write(int c)
+    {
+        try
+        {
+            synchronized (lock)
+            {
+                isOpen();
+                out.write(c);
+            }
+        }
+        catch (InterruptedIOException ex)
+        {
+            LOG.debug(ex);
+            Thread.currentThread().interrupt();
+        }
+        catch (IOException ex)
+        {
+            setError(ex);
+        }
+    }
+    
+    @Override
+    public void write(char buf[], int off, int len)
+    {
+        try
+        {
+            synchronized (lock)
+            {
+                isOpen();
+                out.write(buf,off,len);
+            }
+        }
+        catch (InterruptedIOException ex)
+        {
+            LOG.debug(ex);
+            Thread.currentThread().interrupt();
+        }
+        catch (IOException ex)
+        {
+            setError(ex);
+        }
+    }
+
+    @Override
+    public void write(char buf[])
+    { 
+        this.write(buf,0,buf.length);
+    }
+
+    @Override
+    public void write(String s, int off, int len)
+    {
+        try
+        {
+            synchronized (lock)
+            {
+                isOpen();
+                out.write(s,off,len);
+            }
+        }
+        catch (InterruptedIOException ex)
+        {
+            LOG.debug(ex);
+            Thread.currentThread().interrupt();
+        }
+        catch (IOException ex)
+        {
+            setError(ex);
+        }
+    }
+
+    @Override
+    public void write(String s)
+    {
+        this.write(s,0,s.length());
+    }
+
+    @Override
+    public void print(boolean b)
+    {
+        this.write(b?"true":"false");
+    }
+    
+    @Override
+    public void print(char c)
+    {
+        this.write(c);
+    }
+
+    @Override
+    public void print(int i)
+    {
+        this.write(String.valueOf(i));
+    }
+
+    @Override
+    public void print(long l)
+    {
+        this.write(String.valueOf(l));
+    }
+
+    @Override
+    public void print(float f)
+    {
+        this.write(String.valueOf(f));
+    }
+
+    @Override
+    public void print(double d)
+    {
+        this.write(String.valueOf(d));
+    }
+
+    @Override
+    public void print(char s[])
+    {
+        this.write(s);
+    }
+
+    @Override
+    public void print(String s)
+    {
+        if (s == null)
+            s = "null";
+        this.write(s);
+    }
+
+    @Override
+    public void print(Object obj)
+    {
+        this.write(String.valueOf(obj));
+    }
+
+    @Override
+    public void println()
+    {
+        try
+        {
+            synchronized (lock)
+            {
+                isOpen();
+                out.write(__lineSeparator);
+            }
+        }
+        catch (InterruptedIOException ex)
+        {
+            LOG.debug(ex);
+            Thread.currentThread().interrupt();
+        }
+        catch (IOException ex)
+        {
+            setError(ex);
+        }
+    }
+
+    @Override
+    public void println(boolean b)
+    {
+        println(b?__trueln:__falseln);
+    }
+
+    @Override
+    public void println(char c)
+    {
+        try
+        {
+            synchronized (lock)
+            {
+                isOpen();
+                out.write(c);
+            }
+        }
+        catch (InterruptedIOException ex)
+        {
+            LOG.debug(ex);
+            Thread.currentThread().interrupt();
+        }
+        catch (IOException ex)
+        {
+            setError(ex);
+        }
+    }
+
+    @Override
+    public void println(int x)
+    {
+        this.println(String.valueOf(x));
+    }
+
+    @Override
+    public void println(long x)
+    {
+        this.println(String.valueOf(x));
+    }
+    
+    @Override
+    public void println(float x)
+    {
+        this.println(String.valueOf(x));
+    }
+
+    @Override
+    public void println(double x)
+    {
+        this.println(String.valueOf(x));
+    }
+
+    @Override
+    public void println(char s[])
+    {
+        try
+        {
+            synchronized (lock)
+            {
+                isOpen();
+                out.write(s,0,s.length);
+                out.write(__lineSeparator);
+            }
+        }
+        catch (InterruptedIOException ex)
+        {
+            LOG.debug(ex);
+            Thread.currentThread().interrupt();
+        }
+        catch (IOException ex)
+        {
+            setError(ex);
+        }
+    }
+
+    @Override
+    public void println(String s)
+    {
+        if (s == null)
+            s = "null";
+        
+        try
+        {
+            synchronized (lock)
+            {
+                isOpen();
+                out.write(s,0,s.length());
+                out.write(__lineSeparator);
+            }
+        }
+        catch (InterruptedIOException ex)
+        {
+            LOG.debug(ex);
+            Thread.currentThread().interrupt();
+        }
+        catch (IOException ex)
+        {
+            setError(ex);
+        }
+    }
+
+    @Override
+    public void println(Object x)
+    {
+        this.println(String.valueOf(x));
+    }
+
+    @Override
+    public PrintWriter printf(String format, Object... args)
+    {
+        return format(_locale,format,args);
+    }
+
+    @Override
+    public PrintWriter printf(Locale l, String format, Object... args)
+    {
+        return format(l,format,args);
+    }
+
+    @Override
+    public PrintWriter format(String format, Object... args)
+    {
+        return format(_locale,format,args);
+    }
+
+    @Override
+    public PrintWriter format(Locale l, String format, Object... args)
+    { 
+        try 
+        {
+            synchronized (lock) 
+            {
+                isOpen();
+                if ((_formatter == null) || (_formatter.locale() != l))
+                    _formatter = new Formatter(this, l);
+                _formatter.format(l, format, args);
+            }
+        } 
+        catch (InterruptedIOException ex)
+        {
+            LOG.debug(ex);
+            Thread.currentThread().interrupt();
+        }
+        catch (IOException ex)
+        {
+            setError(ex);
+        }
+        return this;
+    }
+
+    
+    
+}
\ No newline at end of file
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/SecureRequestCustomizer.java b/jetty-server/src/main/java/org/eclipse/jetty/server/SecureRequestCustomizer.java
index 2ebfbaf..7dc7458 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/SecureRequestCustomizer.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/SecureRequestCustomizer.java
@@ -25,36 +25,54 @@
 import javax.net.ssl.SSLSession;
 import javax.servlet.ServletRequest;
 
+import org.eclipse.jetty.http.BadMessageException;
 import org.eclipse.jetty.http.HttpScheme;
 import org.eclipse.jetty.io.ssl.SslConnection;
 import org.eclipse.jetty.io.ssl.SslConnection.DecryptedEndPoint;
 import org.eclipse.jetty.util.TypeUtil;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.ssl.SniX509ExtendedKeyManager;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.eclipse.jetty.util.ssl.X509;
 
-
-/* ------------------------------------------------------------ */
-/** Customizer that extracts the attribute from an {@link SSLContext}
+/**
+ * <p>Customizer that extracts the attribute from an {@link SSLContext}
  * and sets them on the request with {@link ServletRequest#setAttribute(String, Object)}
- * according to Servlet Specification Requirements.
+ * according to Servlet Specification Requirements.</p>
  */
 public class SecureRequestCustomizer implements HttpConfiguration.Customizer
 {
     private static final Logger LOG = Log.getLogger(SecureRequestCustomizer.class);
-    
+
     /**
      * The name of the SSLSession attribute that will contain any cached information.
      */
     public static final String CACHED_INFO_ATTR = CachedInfo.class.getName();
 
+    private boolean _sniHostCheck;
+
+
+    public SecureRequestCustomizer()
+    {
+        this(true);
+    }
+
+    public SecureRequestCustomizer(boolean sniHostCheck)
+    {
+        _sniHostCheck=sniHostCheck;
+    }
+
     @Override
     public void customize(Connector connector, HttpConfiguration channelConfig, Request request)
     {
         if (request.getHttpChannel().getEndPoint() instanceof DecryptedEndPoint)
         {
-            request.setScheme(HttpScheme.HTTPS.asString());
             request.setSecure(true);
+            
+            if (request.getHttpURI().getScheme()==null)
+                request.setScheme(HttpScheme.HTTPS.asString());
+            
             SslConnection.DecryptedEndPoint ssl_endp = (DecryptedEndPoint)request.getHttpChannel().getEndPoint();
             SslConnection sslConnection = ssl_endp.getSslConnection();
             SSLEngine sslEngine=sslConnection.getSSLEngine();
@@ -62,32 +80,48 @@
         }
     }
 
-    /* ------------------------------------------------------------ */
-    /*
-     * Customise the request attributes to be set for SSL requests. <br>
+    /**
+     * <p>
+     * Customizes the request attributes to be set for SSL requests.
+     * </p>
+     * <p>
      * The requirements of the Servlet specs are:
+     * </p>
      * <ul>
-     * <li> an attribute named "javax.servlet.request.ssl_session_id" of type
-     * String (since Servlet Spec 3.0).</li>
-     * <li> an attribute named "javax.servlet.request.cipher_suite" of type
-     * String.</li>
-     * <li> an attribute named "javax.servlet.request.key_size" of type Integer.</li>
-     * <li> an attribute named "javax.servlet.request.X509Certificate" of type
-     * java.security.cert.X509Certificate[]. This is an array of objects of type
-     * X509Certificate, the order of this array is defined as being in ascending
-     * order of trust. The first certificate in the chain is the one set by the
-     * client, the next is the one used to authenticate the first, and so on.
-     * </li>
+     * <li>an attribute named "javax.servlet.request.ssl_session_id" of type String (since Servlet Spec 3.0).</li>
+     * <li>an attribute named "javax.servlet.request.cipher_suite" of type String.</li>
+     * <li>an attribute named "javax.servlet.request.key_size" of type Integer.</li>
+     * <li>an attribute named "javax.servlet.request.X509Certificate" of type java.security.cert.X509Certificate[]. This
+     * is an array of objects of type X509Certificate, the order of this array is defined as being in ascending order of
+     * trust. The first certificate in the chain is the one set by the client, the next is the one used to authenticate
+     * the first, and so on.</li>
      * </ul>
-     *
+     * 
+     * @param sslEngine
+     *            the sslEngine to be customized.
      * @param request
-     *                HttpRequest to be customised.
+     *            HttpRequest to be customized.
      */
     public void customize(SSLEngine sslEngine, Request request)
     {
         request.setScheme(HttpScheme.HTTPS.asString());
         SSLSession sslSession = sslEngine.getSession();
 
+        if (_sniHostCheck)
+        {
+            String name = request.getServerName();
+            X509 x509 = (X509)sslSession.getValue(SniX509ExtendedKeyManager.SNI_X509);
+
+            if (x509!=null && !x509.matches(name))
+            {
+                LOG.warn("Host {} does not match SNI {}",name,x509);
+                throw new BadMessageException(400,"Host does not match SNI");
+            }
+
+            if (LOG.isDebugEnabled())
+                LOG.debug("Host {} matched SNI {}",name,x509);
+        }
+
         try
         {
             String cipherSuite=sslSession.getCipherSuite();
@@ -102,9 +136,9 @@
                 certs=cachedInfo.getCerts();
                 idStr=cachedInfo.getIdStr();
             }
-            else 
+            else
             {
-                keySize=new Integer(SslContextFactory.deduceKeyLength(cipherSuite));
+                keySize=SslContextFactory.deduceKeyLength(cipherSuite);
                 certs=SslContextFactory.getCertChain(sslSession);
                 byte[] bytes = sslSession.getId();
                 idStr = TypeUtil.toHexString(bytes);
@@ -130,10 +164,7 @@
     {
         return String.format("%s@%x",this.getClass().getSimpleName(),hashCode());
     }
-    
-    /* ------------------------------------------------------------ */
-    /* ------------------------------------------------------------ */
-    /* ------------------------------------------------------------ */
+
     /**
      * Simple bundle of information that is cached in the SSLSession. Stores the
      * effective keySize and the client certificate chain.
@@ -166,7 +197,4 @@
             return _idStr;
         }
     }
-
-
-
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Server.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Server.java
index 96d10b6..e0fd515 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/Server.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Server.java
@@ -44,6 +44,7 @@
 import org.eclipse.jetty.http.HttpMethod;
 import org.eclipse.jetty.http.HttpStatus;
 import org.eclipse.jetty.http.HttpURI;
+import org.eclipse.jetty.http.PreEncodedHttpField;
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.server.handler.HandlerWrapper;
 import org.eclipse.jetty.server.handler.StatisticsHandler;
@@ -60,6 +61,7 @@
 import org.eclipse.jetty.util.component.LifeCycle;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.Locker;
 import org.eclipse.jetty.util.thread.QueuedThreadPool;
 import org.eclipse.jetty.util.thread.ShutdownThread;
 import org.eclipse.jetty.util.thread.ThreadPool;
@@ -84,9 +86,12 @@
     private boolean _stopAtShutdown;
     private boolean _dumpAfterStart=false;
     private boolean _dumpBeforeStop=false;
-    
+    private RequestLog _requestLog;
+
+    private final Locker _dateLocker = new Locker();
     private volatile DateField _dateField;
-    
+
+
     /* ------------------------------------------------------------ */
     public Server()
     {
@@ -108,8 +113,11 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** Convenience constructor
+    /**
+     * Convenience constructor
+     * <p>
      * Creates server and a {@link ServerConnector} at the passed address.
+     * @param addr the inet socket address to create the connector from
      */
     public Server(@Name("address")InetSocketAddress addr)
     {
@@ -120,8 +128,6 @@
         setConnectors(new Connector[]{connector});
     }
 
-
-
     /* ------------------------------------------------------------ */
     public Server(@Name("threadpool") ThreadPool pool)
     {
@@ -130,6 +136,18 @@
         setServer(this);
     }
 
+    /* ------------------------------------------------------------ */
+    public RequestLog getRequestLog()
+    {
+        return _requestLog;
+    }
+
+    /* ------------------------------------------------------------ */
+    public void setRequestLog(RequestLog requestLog)
+    {
+        updateBean(_requestLog,requestLog);
+        _requestLog = requestLog;
+    }
 
     /* ------------------------------------------------------------ */
     @ManagedAttribute("version of this server")
@@ -143,8 +161,8 @@
     {
         return _stopAtShutdown;
     }
-   
-    
+
+
     /* ------------------------------------------------------------ */
     /**
      * Set a graceful stop time.
@@ -291,15 +309,15 @@
         long now=System.currentTimeMillis();
         long seconds = now/1000;
         DateField df = _dateField;
-        
+
         if (df==null || df._seconds!=seconds)
         {
-            synchronized (this) // Trade some contention for less garbage
+            try(Locker.Lock lock = _dateLocker.lock())
             {
                 df = _dateField;
                 if (df==null || df._seconds!=seconds)
                 {
-                    HttpField field=new HttpGenerator.CachedHttpField(HttpHeader.DATE,DateGenerator.formatDate(now));
+                    HttpField field=new PreEncodedHttpField(HttpHeader.DATE,DateGenerator.formatDate(now));
                     _dateField=new DateField(seconds,field);
                     return field;
                 }
@@ -320,7 +338,7 @@
         //Register the Server with the handler thread for receiving
         //remote stop commands
         ShutdownMonitor.register(this);
-        
+
         //Start a thread waiting to receive "stop" commands.
         ShutdownMonitor.getInstance().start(); // initialize
 
@@ -339,7 +357,7 @@
             {
                 if (connector instanceof AbstractConnector)
                     acceptors+=((AbstractConnector)connector).getAcceptors();
-                    
+
                 if (connector instanceof ServerConnector)
                     selectors+=((ServerConnector)connector).getSelectorManager().getSelectorCount();
             }
@@ -348,7 +366,7 @@
         int needed=1+selectors+acceptors;
         if (max>0 && needed>max)
             throw new IllegalStateException(String.format("Insufficient threads: max=%d < needed(acceptors=%d + selectors=%d + request=1)",max,acceptors,selectors));
-        
+
         try
         {
             super.doStart();
@@ -362,7 +380,7 @@
         for (Connector connector : _connectors)
         {
             try
-            {   
+            {
                 connector.start();
             }
             catch(Throwable e)
@@ -370,7 +388,7 @@
                 mex.add(e);
             }
         }
-        
+
         if (isDumpAfterStart())
             dumpStdErr();
 
@@ -394,6 +412,9 @@
         if (isDumpBeforeStop())
             dumpStdErr();
 
+        if (LOG.isDebugEnabled())
+            LOG.debug("doStop {}",this);
+        
         MultiException mex=new MultiException();
 
         // list if graceful futures
@@ -404,7 +425,6 @@
             futures.add(connector.shutdown());
 
         // Then tell the contexts that we are shutting down
-        
         Handler[] gracefuls = getChildHandlersByClass(Graceful.class);
         for (Handler graceful : gracefuls)
             futures.add(((Graceful)graceful).shutdown());
@@ -462,14 +482,12 @@
 
         if (getStopAtShutdown())
             ShutdownThread.deregister(this);
-        
+
         //Unregister the Server with the handler thread for receiving
         //remote stop commands as we are stopped already
         ShutdownMonitor.deregister(this);
-        
 
         mex.ifExceptionThrow();
-
     }
 
     /* ------------------------------------------------------------ */
@@ -478,14 +496,14 @@
      * or after the entire request has been received (for short requests of known length), or
      * on the dispatch of an async request.
      */
-    public void handle(HttpChannel<?> connection) throws IOException, ServletException
+    public void handle(HttpChannel connection) throws IOException, ServletException
     {
         final String target=connection.getRequest().getPathInfo();
         final Request request=connection.getRequest();
         final Response response=connection.getResponse();
 
         if (LOG.isDebugEnabled())
-            LOG.debug(request.getDispatcherType()+" "+request.getMethod()+" "+target+" on "+connection);
+            LOG.debug("{} on {}{}",request.getDispatcherType(),connection,"\n"+request.getMethod()+" "+request.getHttpURI()+"\n"+request.getHttpFields());
 
         if (HttpMethod.OPTIONS.is(request.getMethod()) || "*".equals(target))
         {
@@ -499,7 +517,7 @@
             handle(target, request, request, response);
 
         if (LOG.isDebugEnabled())
-            LOG.debug("RESPONSE "+target+"  "+connection.getResponse().getStatus()+" handled="+request.isHandled());
+            LOG.debug("RESPONSE for {} h={}{}",target,request.isHandled(),"\n"+response.getStatus()+" "+response.getReason()+"\n"+response.getHttpFields());
     }
 
     /* ------------------------------------------------------------ */
@@ -515,24 +533,24 @@
      * or after the entire request has been received (for short requests of known length), or
      * on the dispatch of an async request.
      */
-    public void handleAsync(HttpChannel<?> connection) throws IOException, ServletException
+    public void handleAsync(HttpChannel connection) throws IOException, ServletException
     {
         final HttpChannelState state = connection.getRequest().getHttpChannelState();
         final AsyncContextEvent event = state.getAsyncContextEvent();
 
         final Request baseRequest=connection.getRequest();
         final String path=event.getPath();
-        
+
         if (path!=null)
         {
             // this is a dispatch with a path
             ServletContext context=event.getServletContext();
-            HttpURI uri = new HttpURI(URIUtil.addPaths(context==null?null:context.getContextPath(), path));            
-            baseRequest.setUri(uri);
-            baseRequest.setRequestURI(null);
+            String query=baseRequest.getQueryString();
+            baseRequest.setURIPathQuery(URIUtil.addPaths(context==null?null:context.getContextPath(), path));
+            HttpURI uri = baseRequest.getHttpURI();
             baseRequest.setPathInfo(uri.getDecodedPath());
             if (uri.getQuery()!=null)
-                baseRequest.mergeQueryParameters(uri.getQuery(), true); //we have to assume dispatch path and query are UTF8
+                baseRequest.mergeQueryParameters(query,uri.getQuery(), true); //we have to assume dispatch path and query are UTF8
         }
 
         final String target=baseRequest.getPathInfo();
@@ -708,6 +726,6 @@
             _seconds = seconds;
             _dateField = dateField;
         }
-        
+
     }
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java
index f05dbb7..1665a19 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java
@@ -20,10 +20,12 @@
 
 import java.io.IOException;
 import java.net.InetSocketAddress;
+import java.net.ServerSocket;
 import java.net.Socket;
 import java.net.SocketException;
 import java.nio.channels.Channel;
 import java.nio.channels.SelectionKey;
+import java.nio.channels.Selector;
 import java.nio.channels.ServerSocketChannel;
 import java.nio.channels.SocketChannel;
 import java.util.concurrent.Executor;
@@ -32,9 +34,10 @@
 import org.eclipse.jetty.io.ByteBufferPool;
 import org.eclipse.jetty.io.Connection;
 import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.ManagedSelector;
 import org.eclipse.jetty.io.SelectChannelEndPoint;
 import org.eclipse.jetty.io.SelectorManager;
-import org.eclipse.jetty.io.SelectorManager.ManagedSelector;
+import org.eclipse.jetty.util.Callback;
 import org.eclipse.jetty.util.annotation.ManagedAttribute;
 import org.eclipse.jetty.util.annotation.ManagedObject;
 import org.eclipse.jetty.util.annotation.Name;
@@ -44,13 +47,12 @@
 /**
  * This {@link Connector} implementation is the primary connector for the
  * Jetty server over TCP/IP.  By the use of various {@link ConnectionFactory} instances it is able
- * to accept connections for HTTP, SPDY and WebSocket, either directly or over SSL.
+ * to accept connections for HTTP, HTTP/2 and WebSocket, either directly or over SSL.
  * <p>
  * The connector is a fully asynchronous NIO based implementation that by default will
  * use all the commons services (eg {@link Executor}, {@link Scheduler})  of the
  * passed {@link Server} instance, but all services may also be constructor injected
  * into the connector so that it may operate with dedicated or otherwise shared services.
- * <p>
  * <h2>Connection Factories</h2>
  * Various convenience constructors are provided to assist with common configurations of
  * ConnectionFactories, whose generic use is described in {@link AbstractConnector}.
@@ -58,7 +60,6 @@
  * default to use a {@link HttpConnectionFactory}.  If an non null {@link SslContextFactory}
  * instance is passed, then this used to instantiate a {@link SslConnectionFactory} which is
  * prepended to the other passed or default factories.
- * <p>
  * <h2>Selectors</h2>
  * The connector will use the {@link Executor} service to execute a number of Selector Tasks,
  * which are implemented to each use a NIO {@link Selector} instance to asynchronously
@@ -104,7 +105,7 @@
      *          the number of acceptor threads to use, or -1 for a default value. Acceptors accept new TCP/IP connections.  If 0, then 
      *          the selector threads are used to accept connections.
      * @param selectors
-     *          the number of selector threads, or <=0 for a default value. Selectors notice and schedule established connection that can make IO progress.
+     *          the number of selector threads, or &lt;=0 for a default value. Selectors notice and schedule established connection that can make IO progress.
      */
     public ServerConnector(
         @Name("server") Server server,
@@ -122,7 +123,7 @@
      *          the number of acceptor threads to use, or -1 for a default value. Acceptors accept new TCP/IP connections.  If 0, then 
      *          the selector threads are used to accept connections.
      * @param selectors
-     *          the number of selector threads, or <=0 for a default value. Selectors notice and schedule established connection that can make IO progress.
+     *          the number of selector threads, or &lt;=0 for a default value. Selectors notice and schedule established connection that can make IO progress.
      * @param factories Zero or more {@link ConnectionFactory} instances used to create and configure connections.
      */
     public ServerConnector(
@@ -171,7 +172,7 @@
      *          the number of acceptor threads to use, or -1 for a default value. Acceptors accept new TCP/IP connections.  If 0, then 
      *          the selector threads are used to accept connections.
      * @param selectors
-     *          the number of selector threads, or <=0 for a default value. Selectors notice and schedule established connection that can make IO progress.
+     *          the number of selector threads, or &lt;=0 for a default value. Selectors notice and schedule established connection that can make IO progress.
      */
     public ServerConnector(
         @Name("server") Server server,
@@ -194,7 +195,7 @@
         @Name("sslContextFactory") SslContextFactory sslContextFactory,
         @Name("factories") ConnectionFactory... factories)
     {
-        this(server,null,null,null,-1,-1,AbstractConnectionFactory.getFactories(sslContextFactory,factories));
+        this(server, null, null, null, -1, -1, AbstractConnectionFactory.getFactories(sslContextFactory, factories));
     }
 
     /** Generic Server Connection.
@@ -211,7 +212,7 @@
      *          the number of acceptor threads to use, or -1 for a default value. Acceptors accept new TCP/IP connections.  If 0, then 
      *          the selector threads are used to accept connections.
      * @param selectors
-     *          the number of selector threads, or <=0 for a default value. Selectors notice and schedule established connection that can make IO progress.
+     *          the number of selector threads, or &lt;=0 for a default value. Selectors notice and schedule established connection that can make IO progress.
      * @param factories 
      *          Zero or more {@link ConnectionFactory} instances used to create and configure connections.
      */
@@ -225,9 +226,16 @@
         @Name("factories") ConnectionFactory... factories)
     {
         super(server,executor,scheduler,bufferPool,acceptors,factories);
-        _manager = new ServerConnectorManager(getExecutor(), getScheduler(), 
+        _manager = newSelectorManager(getExecutor(), getScheduler(),
             selectors>0?selectors:Math.max(1,Math.min(4,Runtime.getRuntime().availableProcessors()/2)));
         addBean(_manager, true);
+        setSelectorPriorityDelta(-1);
+        setAcceptorPriorityDelta(-2);
+    }
+
+    protected SelectorManager newSelectorManager(Executor executor, Scheduler scheduler, int selectors)
+    {
+        return new ServerConnectorManager(executor, scheduler, selectors);
     }
 
     @Override
@@ -249,24 +257,21 @@
         return channel!=null && channel.isOpen();
     }
 
-
-    @ManagedAttribute("The priority delta to apply to selector threads")
+    /**
+     * @return the selector priority delta
+     * @deprecated not implemented
+     */
+    @Deprecated
     public int getSelectorPriorityDelta()
     {
         return _manager.getSelectorPriorityDelta();
     }
 
     /**
-     * Sets the selector thread priority delta to the given amount.
-     * <p>This allows the selector threads to run at a different priority.
-     * Typically this would be used to lower the priority to give preference 
-     * to handling previously accepted connections rather than accepting
-     * new connections.</p>
-     *
-     * @param selectorPriorityDelta the amount to set the thread priority delta to
-     *                              (may be negative)
-     * @see Thread#getPriority()
+     * @param selectorPriorityDelta the selector priority delta
+     * @deprecated not implemented
      */
+    @Deprecated
     public void setSelectorPriorityDelta(int selectorPriorityDelta)
     {
         _manager.setSelectorPriorityDelta(selectorPriorityDelta);
@@ -337,7 +342,7 @@
     @Override
     public Future<Void> shutdown()
     {
-        // TODO shutdown all the connections
+        // shutdown all the connections
         return super.shutdown();
     }
 
@@ -480,9 +485,9 @@
         _reuseAddress = reuseAddress;
     }
 
-    private final class ServerConnectorManager extends SelectorManager
+    protected class ServerConnectorManager extends SelectorManager
     {
-        private ServerConnectorManager(Executor executor, Scheduler scheduler, int selectors)
+        public ServerConnectorManager(Executor executor, Scheduler scheduler, int selectors)
         {
             super(executor, scheduler, selectors);
         }
@@ -518,7 +523,5 @@
             onEndPointClosed(endpoint);
             super.endPointClosed(endpoint);
         }
-        
-        
     }
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/SessionIdManager.java b/jetty-server/src/main/java/org/eclipse/jetty/server/SessionIdManager.java
index cb0dabf..a7f12fb 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/SessionIdManager.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/SessionIdManager.java
@@ -42,7 +42,7 @@
     
     /**
      * Remove session from the list of known sessions for a given ID.
-     * @param session
+     * @param session the session to remove
      */
     public void removeSession(HttpSession session);
     
@@ -53,8 +53,10 @@
     public void invalidateAll(String id);
     
     /**
-     * @param request
-     * @param created
+     * Create a new Session ID.
+     * 
+     * @param request the request with the sesion
+     * @param created the timestamp for when the session was created
      * @return the new session id
      */
     public String newSessionId(HttpServletRequest request,long created);
@@ -67,7 +69,7 @@
     /* ------------------------------------------------------------ */
     /** Get a cluster ID from a node ID.
      * Strip node identifier from a located session ID.
-     * @param nodeId
+     * @param nodeId the node id
      * @return the cluster id
      */
     public String getClusterId(String nodeId);
@@ -84,9 +86,9 @@
     /* ------------------------------------------------------------ */
     /** Change the existing session id.
     * 
-    * @param oldClusterId
-    * @param oldNodeId
-    * @param request
+    * @param oldClusterId the old cluster id
+    * @param oldNodeId the old node id
+    * @param request the request containing the session
     */
     public void renewSessionId(String oldClusterId, String oldNodeId, HttpServletRequest request);    
 
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/SessionManager.java b/jetty-server/src/main/java/org/eclipse/jetty/server/SessionManager.java
index dccd943..a2fda2e 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/SessionManager.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/SessionManager.java
@@ -23,6 +23,7 @@
 
 import javax.servlet.SessionCookieConfig;
 import javax.servlet.SessionTrackingMode;
+import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
@@ -307,10 +308,10 @@
     /* ------------------------------------------------------------ */
     /** Change the existing session id.
     * 
-    * @param oldClusterId
-    * @param oldNodeId
-    * @param newClusterId
-    * @param newNodeId
+    * @param oldClusterId the old cluster id
+    * @param oldNodeId the old node id
+    * @param newClusterId the new cluster id
+    * @param newNodeId the new node id
     */
     public void renewSessionId(String oldClusterId, String oldNodeId, String newClusterId, String newNodeId);  
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ShutdownMonitor.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ShutdownMonitor.java
index 3b71a74..198e5c4 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/ShutdownMonitor.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ShutdownMonitor.java
@@ -259,7 +259,7 @@
          * Stop the registered lifecycles, optionally
          * calling destroy on them.
          * 
-         * @param destroy
+         * @param destroy true if {@link Destroyable}'s should also be destroyed.
          */
         public void stopLifeCycles (boolean destroy)
         {
@@ -450,7 +450,7 @@
     }
 
     /**
-     * @param exitVm
+     * @param exitVm true to exit the VM on shutdown
      */
     public void setExitVm(boolean exitVm)
     {
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Slf4jRequestLog.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Slf4jRequestLog.java
index 6d95b00..f7cc01f 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/Slf4jRequestLog.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Slf4jRequestLog.java
@@ -27,7 +27,7 @@
  * Implementation of NCSARequestLog where output is sent as a SLF4J INFO Log message on the named logger "org.eclipse.jetty.server.RequestLog"
  */
 @ManagedObject("NCSA standard format request log to slf4j bridge")
-public class Slf4jRequestLog extends AbstractNCSARequestLog implements RequestLog
+public class Slf4jRequestLog extends AbstractNCSARequestLog
 {
     private Slf4jLog logger;
     private String loggerName;
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/SocketCustomizationListener.java b/jetty-server/src/main/java/org/eclipse/jetty/server/SocketCustomizationListener.java
new file mode 100644
index 0000000..cdc4021
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/SocketCustomizationListener.java
@@ -0,0 +1,97 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server;
+
+import java.net.Socket;
+
+import org.eclipse.jetty.io.ChannelEndPoint;
+import org.eclipse.jetty.io.Connection;
+import org.eclipse.jetty.io.Connection.Listener;
+import org.eclipse.jetty.io.ssl.SslConnection;
+import org.eclipse.jetty.io.ssl.SslConnection.DecryptedEndPoint;
+import org.eclipse.jetty.io.EndPoint;
+
+
+/* ------------------------------------------------------------ */
+/** 
+ * A Connection Lister for customization of SocketConnections.
+ * <p>
+ * Instances of this listener may be added to a {@link Connector} (or 
+ * {@link ConnectionFactory}) so that they are applied to all connections
+ * for that connector (or protocol) and thus allow additional Socket
+ * configuration to be applied by implementing {@link #customize(Socket, Class, boolean)}
+ */
+public class SocketCustomizationListener implements Listener
+{
+    private final boolean _ssl;
+    
+    /**
+     * Construct with SSL unwrapping on.
+     */
+    public SocketCustomizationListener()
+    {
+        this(true);
+    }
+    
+    /**
+     * @param ssl If True, then a Socket underlying an SSLConnection is unwrapped
+     * and notified.
+     */
+    public SocketCustomizationListener(boolean ssl)
+    {
+        _ssl=ssl;
+    }
+
+    @Override
+    public void onOpened(Connection connection)
+    {
+        EndPoint endp = connection.getEndPoint();
+        boolean ssl=false;
+        
+        if (_ssl && endp instanceof DecryptedEndPoint)
+        {
+            endp = ((DecryptedEndPoint)endp).getSslConnection().getEndPoint();
+            ssl=true;
+        }
+        
+        if (endp instanceof ChannelEndPoint) 
+        {
+            Socket socket = ((ChannelEndPoint)endp).getSocket();
+            customize(socket,connection.getClass(),ssl);
+        }
+    }
+
+    /* ------------------------------------------------------------ */
+    /** This method may be extended to configure a socket on open 
+     * events.
+     * @param socket The Socket to configure
+     * @param connection The class of the connection (The socket may be wrapped
+     * by an {@link SslConnection} prior to this connection).
+     * @param ssl True if the socket is wrapped with an SslConnection
+     */
+    protected void customize(Socket socket, Class<? extends Connection> connection, boolean ssl)
+    {
+    }
+
+    @Override
+    public void onClosed(Connection connection)
+    {
+    }
+
+}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/SslConnectionFactory.java b/jetty-server/src/main/java/org/eclipse/jetty/server/SslConnectionFactory.java
index 42abe64..3c9dbb5 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/SslConnectionFactory.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/SslConnectionFactory.java
@@ -47,7 +47,7 @@
 
     public SslConnectionFactory(@Name("sslContextFactory") SslContextFactory factory, @Name("next") String nextProtocol)
     {
-        super("SSL-"+nextProtocol);
+        super("SSL");
         _sslContextFactory=factory==null?new SslContextFactory():factory;
         _nextProtocol=nextProtocol;
         addBean(_sslContextFactory);
@@ -97,6 +97,7 @@
     @Override
     public String toString()
     {
-        return String.format("%s@%x{%s}",this.getClass().getSimpleName(),hashCode(),getProtocol());
+        return String.format("%s@%x{%s->%s}",this.getClass().getSimpleName(),hashCode(),getProtocol(),_nextProtocol);
     }
+
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/UserIdentity.java b/jetty-server/src/main/java/org/eclipse/jetty/server/UserIdentity.java
index 48026fd..e2c386e 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/UserIdentity.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/UserIdentity.java
@@ -23,13 +23,12 @@
 
 import javax.security.auth.Subject;
 
-/* ------------------------------------------------------------ */
-/** User object that encapsulates user identity and operations such as run-as-role actions,
+/** 
+ * User object that encapsulates user identity and operations such as run-as-role actions,
  * checking isUserInRole and getUserPrincipal.
- *
+ * <p>
  * Implementations of UserIdentity should be immutable so that they may be
  * cached by Authenticators and LoginServices.
- *
  */
 public interface UserIdentity
 {
@@ -50,7 +49,7 @@
      * This call is used to satisfy authorization calls from
      * container code which will be using translated role names.
      * @param role A role name.
-     * @param scope
+     * @param scope the scope
      * @return True if the user can act in that role.
      */
     boolean isUserInRole(String role, Scope scope);
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/AbstractHandlerContainer.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/AbstractHandlerContainer.java
index 4524672..4db474d 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/AbstractHandlerContainer.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/AbstractHandlerContainer.java
@@ -25,6 +25,7 @@
 
 import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.HandlerContainer;
+import org.eclipse.jetty.server.Server;
 
 
 /* ------------------------------------------------------------ */
@@ -117,4 +118,21 @@
         }
         return null;
     }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public void setServer(Server server)
+    {
+        if (server==getServer())
+            return;
+        
+        if (isStarted())
+            throw new IllegalStateException(STARTED);
+
+        super.setServer(server);
+        Handler[] handlers=getHandlers();
+        if (handlers!=null)
+            for (Handler h : handlers)
+                h.setServer(server);
+    }
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/AllowSymLinkAliasChecker.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/AllowSymLinkAliasChecker.java
index 0136ee4..f6dad19 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/AllowSymLinkAliasChecker.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/AllowSymLinkAliasChecker.java
@@ -18,14 +18,13 @@
 
 package org.eclipse.jetty.server.handler;
 
-import java.io.File;
-import java.net.URI;
 import java.nio.file.Files;
 import java.nio.file.Path;
 
 import org.eclipse.jetty.server.handler.ContextHandler.AliasCheck;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.resource.PathResource;
 import org.eclipse.jetty.util.resource.Resource;
 
 
@@ -41,56 +40,62 @@
     private static final Logger LOG = Log.getLogger(AllowSymLinkAliasChecker.class);
     
     @Override
-    public boolean check(String path, Resource resource)
+    public boolean check(String uri, Resource resource)
     {
+        // Only support PathResource alias checking
+        if (!(resource instanceof PathResource))
+            return false;
+        
+        PathResource pathResource = (PathResource)resource;
+
         try
         {
-            File file =resource.getFile();
-            if (file==null)
-                return false;
+            Path path = pathResource.getPath();
+            Path alias = pathResource.getAliasPath();
             
-            // If the file exists
-            if (file.exists())
-            {
-                // we can use the real path method to check the symlinks resolve to the alias
-                URI real = file.toPath().toRealPath().toUri();
-                if (real.equals(resource.getAlias()))
+            // is the file itself a symlink?
+            if (Files.isSymbolicLink(path))
+            {        
+                alias = path.getParent().resolve(alias);
+                if (LOG.isDebugEnabled())
+                {
+                    LOG.debug("path ={}",path);
+                    LOG.debug("alias={}",alias);
+                }
+                if (Files.isSameFile(path,alias))
                 {
                     if (LOG.isDebugEnabled())
-                        LOG.debug("Allow symlink {} --> {}",resource,real);
+                        LOG.debug("Allow symlink {} --> {}",resource,pathResource.getAliasPath());
                     return true;
                 }
             }
-            else
+            
+            // No, so let's check each element ourselves
+            Path d = path.getRoot();
+            for (Path e:path)
             {
-                // file does not exists, so we have to walk the path and links ourselves.
-                Path p = file.toPath().toAbsolutePath();
-                File d = p.getRoot().toFile();
-                for (Path e:p)
+                d=d.resolve(e);
+                
+                while (Files.exists(d) && Files.isSymbolicLink(d))
                 {
-                    d=new File(d,e.toString());
-                    
-                    while (d.exists() && Files.isSymbolicLink(d.toPath()))
-                    {
-                        Path link=Files.readSymbolicLink(d.toPath());
-                        if (!link.isAbsolute())
-                            link=link.resolve(d.toPath());
-                        d=link.toFile().getAbsoluteFile().getCanonicalFile();
-                    }
+                    Path link=Files.readSymbolicLink(d);                    
+                    if (!link.isAbsolute())
+                        link=d.resolve(link);
+                    d=link;
                 }
-                if (resource.getAlias().equals(d.toURI()))
-                {
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("Allow symlink {} --> {}",resource,d);
-                    return true;
-                }
+            }
+            if (pathResource.getAliasPath().equals(d))
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Allow path symlink {} --> {}",resource,d);
+                return true;
             }
         }
         catch(Exception e)
         {
-            e.printStackTrace();
             LOG.ignore(e);
         }
+        
         return false;
     }
 
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java
index 375d883..94f931c 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java
@@ -64,8 +64,10 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.eclipse.jetty.http.HttpURI;
 import org.eclipse.jetty.http.MimeTypes;
 import org.eclipse.jetty.server.ClassLoaderDump;
+import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.Dispatcher;
 import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.HandlerContainer;
@@ -79,6 +81,7 @@
 import org.eclipse.jetty.util.URIUtil;
 import org.eclipse.jetty.util.annotation.ManagedAttribute;
 import org.eclipse.jetty.util.annotation.ManagedObject;
+import org.eclipse.jetty.util.component.DumpableCollection;
 import org.eclipse.jetty.util.component.Graceful;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
@@ -98,8 +101,9 @@
  * and org.eclipse.jetty.server.Request.maxFormContentSize.  These can also be configured with {@link #setMaxFormContentSize(int)} and {@link #setMaxFormKeys(int)}
  * <p>
  * This servers executore is made available via a context attributed "org.eclipse.jetty.server.Executor".
- *
- * @org.apache.xbean.XBean description="Creates a basic HTTP context"
+ * <p>
+ * By default, the context is created with alias checkers for {@link AllowSymLinkAliasChecker} (unix only) and {@link ApproveNonExistentDirectoryAliases}.
+ * If these alias checkers are not required, then {@link #clearAliasChecks()} or {@link #setAliasChecks(List)} should be called.
  */
 @ManagedObject("URI Context")
 public class ContextHandler extends ScopedHandler implements Attributes, Graceful
@@ -107,9 +111,9 @@
     public final static int SERVLET_MAJOR_VERSION=3;
     public final static int SERVLET_MINOR_VERSION=1;
     public static final Class<?>[] SERVLET_LISTENER_TYPES = new Class[] {ServletContextListener.class,
-                                                                      ServletContextAttributeListener.class,
-                                                                      ServletRequestListener.class,
-                                                                      ServletRequestAttributeListener.class};
+        ServletContextAttributeListener.class,
+        ServletRequestListener.class,
+        ServletRequestAttributeListener.class};
 
     public static final int DEFAULT_LISTENER_TYPE_INDEX = 1;
     public static final int EXTENDED_LISTENER_TYPE_INDEX = 0;
@@ -121,6 +125,8 @@
 
     private static final ThreadLocal<Context> __context = new ThreadLocal<Context>();
 
+    private static String __serverInfo = "jetty/" + Server.getVersion();
+
     /**
      * If a context attribute with this name is set, it is interpreted as a comma separated list of attribute name. Any other context attributes that are set
      * with a name from this list will result in a call to {@link #setManagedAttribute(String, Object)}, which typically initiates the creation of a JMX MBean
@@ -150,6 +156,19 @@
         return null;
     }
 
+    /* ------------------------------------------------------------ */
+    public static String getServerInfo()
+    {
+        return __serverInfo;
+    }
+
+    /* ------------------------------------------------------------ */
+    public static void setServerInfo(String serverInfo)
+    {
+        __serverInfo = serverInfo;
+    }
+
+
 
     protected Context _scontext;
     private final AttributesMap _attributes;
@@ -171,13 +190,15 @@
     private int _maxFormKeys = Integer.getInteger("org.eclipse.jetty.server.Request.maxFormKeys",-1).intValue();
     private int _maxFormContentSize = Integer.getInteger("org.eclipse.jetty.server.Request.maxFormContentSize",-1).intValue();
     private boolean _compactPath = false;
+    private boolean _usingSecurityManager = System.getSecurityManager()!=null;
 
     private final List<EventListener> _eventListeners=new CopyOnWriteArrayList<>();
     private final List<EventListener> _programmaticListeners=new CopyOnWriteArrayList<>();
-    private final List<ServletContextListener> _contextListeners=new CopyOnWriteArrayList<>();
-    private final List<ServletContextAttributeListener> _contextAttributeListeners=new CopyOnWriteArrayList<>();
-    private final List<ServletRequestListener> _requestListeners=new CopyOnWriteArrayList<>();
-    private final List<ServletRequestAttributeListener> _requestAttributeListeners=new CopyOnWriteArrayList<>();
+    private final List<ServletContextListener> _servletContextListeners=new CopyOnWriteArrayList<>();
+    private final List<ServletContextAttributeListener> _servletContextAttributeListeners=new CopyOnWriteArrayList<>();
+    private final List<ServletRequestListener> _servletRequestListeners=new CopyOnWriteArrayList<>();
+    private final List<ServletRequestAttributeListener> _servletRequestAttributeListeners=new CopyOnWriteArrayList<>();
+    private final List<ContextScopeListener> _contextListeners = new CopyOnWriteArrayList<>();
     private final List<EventListener> _durableListeners = new CopyOnWriteArrayList<>();
     private Map<String, Object> _managedAttributes;
     private String[] _protectedTargets;
@@ -187,35 +208,24 @@
     private volatile Availability _availability;
 
     /* ------------------------------------------------------------ */
-    /**
-     *
-     */
     public ContextHandler()
     {
-        super();
-        _scontext = new Context();
-        _attributes = new AttributesMap();
-        _initParams = new HashMap<String, String>();
-        addAliasCheck(new ApproveNonExistentDirectoryAliases());
+        this((Context)null);
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     *
-     */
     protected ContextHandler(Context context)
     {
         super();
-        _scontext = context;
+        _scontext = context==null?new Context():context;
         _attributes = new AttributesMap();
         _initParams = new HashMap<String, String>();
         addAliasCheck(new ApproveNonExistentDirectoryAliases());
+        if (File.separatorChar=='/')
+            addAliasCheck(new AllowSymLinkAliasChecker());
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     *
-     */
     public ContextHandler(String contextPath)
     {
         this();
@@ -223,9 +233,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     *
-     */
     public ContextHandler(HandlerContainer parent, String contextPath)
     {
         this();
@@ -241,10 +248,11 @@
     public void dump(Appendable out, String indent) throws IOException
     {
         dumpBeans(out,indent,
-            Collections.singletonList(new ClassLoaderDump(getClassLoader())),
-            _initParams.entrySet(),
-            _attributes.getAttributeEntrySet(),
-            _scontext.getAttributeEntrySet());
+                Collections.singletonList(new ClassLoaderDump(getClassLoader())),
+                Collections.singletonList(new DumpableCollection("Handler attributes "+this,((AttributesMap)getAttributes()).getAttributeEntrySet())),
+                Collections.singletonList(new DumpableCollection("Context attributes "+this,((Context)getServletContext()).getAttributeEntrySet())),
+                Collections.singletonList(new DumpableCollection("Initparams "+this,getInitParams().entrySet()))
+                );
     }
 
     /* ------------------------------------------------------------ */
@@ -283,6 +291,18 @@
     }
 
     /* ------------------------------------------------------------ */
+    public boolean isUsingSecurityManager()
+    {
+        return _usingSecurityManager;
+    }
+
+    /* ------------------------------------------------------------ */
+    public void setUsingSecurityManager(boolean usingSecurityManager)
+    {
+        _usingSecurityManager = usingSecurityManager;
+    }
+
+    /* ------------------------------------------------------------ */
     /**
      * Set the virtual hosts for the context. Only requests that have a matching host header or fully qualified URL will be passed to that context with a
      * virtual host name. A context with no virtual host names or a null virtual host name is available to all requests that are not served by a context with a
@@ -553,9 +573,10 @@
     public void setEventListeners(EventListener[] eventListeners)
     {
         _contextListeners.clear();
-        _contextAttributeListeners.clear();
-        _requestListeners.clear();
-        _requestAttributeListeners.clear();
+        _servletContextListeners.clear();
+        _servletContextAttributeListeners.clear();
+        _servletRequestListeners.clear();
+        _servletRequestAttributeListeners.clear();
         _eventListeners.clear();
 
         if (eventListeners!=null)
@@ -566,6 +587,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Add a context event listeners.
+     * @param listener the event listener to add
      *
      * @see ServletContextListener
      * @see ServletContextAttributeListener
@@ -579,22 +601,26 @@
         if (!(isStarted() || isStarting()))
             _durableListeners.add(listener);
 
+        if (listener instanceof ContextScopeListener)
+            _contextListeners.add((ContextScopeListener)listener);
+
         if (listener instanceof ServletContextListener)
-            _contextListeners.add((ServletContextListener)listener);
+            _servletContextListeners.add((ServletContextListener)listener);
 
         if (listener instanceof ServletContextAttributeListener)
-            _contextAttributeListeners.add((ServletContextAttributeListener)listener);
+            _servletContextAttributeListeners.add((ServletContextAttributeListener)listener);
 
         if (listener instanceof ServletRequestListener)
-            _requestListeners.add((ServletRequestListener)listener);
+            _servletRequestListeners.add((ServletRequestListener)listener);
 
         if (listener instanceof ServletRequestAttributeListener)
-            _requestAttributeListeners.add((ServletRequestAttributeListener)listener);
+            _servletRequestAttributeListeners.add((ServletRequestAttributeListener)listener);
     }
 
     /* ------------------------------------------------------------ */
     /**
      * Remove a context event listeners.
+     * @param listener the event listener to remove
      *
      * @see ServletContextListener
      * @see ServletContextAttributeListener
@@ -605,24 +631,27 @@
     {
         _eventListeners.remove(listener);
 
-        if (listener instanceof ServletContextListener)
+        if (listener instanceof ContextScopeListener)
             _contextListeners.remove(listener);
 
+        if (listener instanceof ServletContextListener)
+            _servletContextListeners.remove(listener);
+
         if (listener instanceof ServletContextAttributeListener)
-            _contextAttributeListeners.remove(listener);
+            _servletContextAttributeListeners.remove(listener);
 
         if (listener instanceof ServletRequestListener)
-            _requestListeners.remove(listener);
+            _servletRequestListeners.remove(listener);
 
         if (listener instanceof ServletRequestAttributeListener)
-            _requestAttributeListeners.remove(listener);
+            _servletRequestAttributeListeners.remove(listener);
     }
 
     /* ------------------------------------------------------------ */
     /**
      * Apply any necessary restrictions on a programmatic added listener.
      *
-     * @param listener
+     * @param listener the programmatic listener to add
      */
     protected void addProgrammaticListener (EventListener listener)
     {
@@ -678,6 +707,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Set Available status.
+     * @param available true to set as enabled
      */
     public void setAvailable(boolean available)
     {
@@ -714,13 +744,14 @@
         if (_contextPath == null)
             throw new IllegalStateException("Null contextPath");
 
-        _logger = Log.getLogger(getDisplayName() == null?getContextPath():getDisplayName());
+        if (_logger==null)
+            _logger = Log.getLogger(getDisplayName() == null?getContextPath():getDisplayName());
         ClassLoader old_classloader = null;
         Thread current_thread = null;
         Context old_context = null;
 
         _attributes.setAttribute("org.eclipse.jetty.server.Executor",getServer().getThreadPool());
-        
+
         try
         {
             // Set the classloader
@@ -757,6 +788,7 @@
     /**
      * Extensible startContext. this method is called from {@link ContextHandler#doStart()} instead of a call to super.doStart(). This allows derived classes to
      * insert additional handling (Eg configuration) before the call to super.doStart by this method will start contained handlers.
+     * @throws Exception if unable to start the context
      *
      * @see org.eclipse.jetty.server.handler.ContextHandler.Context
      */
@@ -764,34 +796,37 @@
     {
         String managedAttributes = _initParams.get(MANAGED_ATTRIBUTES);
         if (managedAttributes != null)
-        {
-            _managedAttributes = new HashMap<String, Object>();
-            String[] attributes = managedAttributes.split(",");
-            for (String attribute : attributes)
-            {
-                _managedAttributes.put(attribute.trim(),null);
-            }
-
-            Enumeration<String> e = _scontext.getAttributeNames();
-            while (e.hasMoreElements())
-            {
-                String name = e.nextElement();
-                Object value = _scontext.getAttribute(name);
-                checkManagedAttribute(name,value);
-            }
-        }
+            addEventListener(new ManagedAttributeListener(this,StringUtil.csvSplit(managedAttributes)));
 
         super.doStart();
 
         // Call context listeners
-        if (!_contextListeners.isEmpty())
+        if (!_servletContextListeners.isEmpty())
         {
             ServletContextEvent event = new ServletContextEvent(_scontext);
-            for (ServletContextListener listener:_contextListeners)
+            for (ServletContextListener listener:_servletContextListeners)
                 callContextInitialized(listener, event);
         }
     }
 
+
+    /* ------------------------------------------------------------ */
+    protected void stopContext () throws Exception
+    {
+        //stop all the handler hierarchy
+        super.doStop();
+
+        //Call the context listeners
+        if (!_servletContextListeners.isEmpty())
+        {
+            ServletContextEvent event = new ServletContextEvent(_scontext);
+            for (int i = _servletContextListeners.size(); i-->0;)
+                callContextDestroyed(_servletContextListeners.get(i),event);
+        }
+    }
+
+
+
     /* ------------------------------------------------------------ */
     protected void callContextInitialized (ServletContextListener l, ServletContextEvent e)
     {
@@ -818,6 +853,7 @@
         _availability = Availability.UNAVAILABLE;
 
         ClassLoader old_classloader = null;
+        ClassLoader old_webapploader = null;
         Thread current_thread = null;
 
         Context old_context = __context.get();
@@ -827,20 +863,13 @@
             // Set the classloader
             if (_classLoader != null)
             {
+                old_webapploader = _classLoader;
                 current_thread = Thread.currentThread();
                 old_classloader = current_thread.getContextClassLoader();
                 current_thread.setContextClassLoader(_classLoader);
             }
 
-            super.doStop();
-
-            // Context listeners
-            if (!_contextListeners.isEmpty())
-            {
-                ServletContextEvent event = new ServletContextEvent(_scontext);
-                for (int i = _contextListeners.size(); i-->0;)
-                    callContextDestroyed(_contextListeners.get(i),event);
-            }
+            stopContext();
 
             //retain only durable listeners
             setEventListeners(_durableListeners.toArray(new EventListener[_durableListeners.size()]));
@@ -849,13 +878,6 @@
             if (_errorHandler != null)
                 _errorHandler.stop();
 
-            Enumeration<String> e = _scontext.getAttributeNames();
-            while (e.hasMoreElements())
-            {
-                String name = e.nextElement();
-                checkManagedAttribute(name,null);
-            }
-
             for (EventListener l : _programmaticListeners)
                 removeEventListener(l);
             _programmaticListeners.clear();
@@ -865,13 +887,15 @@
             LOG.info("Stopped {}", this);
             __context.set(old_context);
             // reset the classloader
-            if (_classLoader != null && current_thread!=null)
+            if ((old_classloader == null || (old_classloader != old_webapploader)) && current_thread != null)
                 current_thread.setContextClassLoader(old_classloader);
         }
 
         _scontext.clearAttributes();
     }
 
+
+    /* ------------------------------------------------------------ */
     public boolean checkVirtualHost(final Request baseRequest)
     {
         if (_vhosts != null && _vhosts.length > 0)
@@ -911,7 +935,9 @@
         }
         return true;
     }
-    
+
+
+    /* ------------------------------------------------------------ */
     public boolean checkContextPath(String uri)
     {
         // Are we not the root context?
@@ -925,7 +951,7 @@
         }
         return true;
     }
-    
+
     /* ------------------------------------------------------------ */
     /*
      * @see org.eclipse.jetty.server.Handler#handle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
@@ -940,7 +966,7 @@
 
         if (!checkContextPath(target))
             return false;
-        
+
         // Are we not the root context?
         // redirect null path infos
         if (!_allowNullPathInfo && _contextPath.length() == target.length() && _contextPath.length()>1)
@@ -1051,6 +1077,9 @@
                 baseRequest.setPathInfo(pathInfo);
             }
 
+            if (old_context != _scontext)
+                enterScope(baseRequest,dispatch);
+
             if (LOG.isDebugEnabled())
                 LOG.debug("context={}|{}|{} @ {}",baseRequest.getContextPath(),baseRequest.getServletPath(), baseRequest.getPathInfo(),this);
 
@@ -1069,6 +1098,8 @@
         {
             if (old_context != _scontext)
             {
+                exitScope(baseRequest);
+
                 // reset the classloader
                 if (_classLoader != null && current_thread!=null)
                 {
@@ -1100,14 +1131,14 @@
             if (new_context)
             {
                 // Handle the REALLY SILLY request events!
-                if (!_requestAttributeListeners.isEmpty())
-                    for (ServletRequestAttributeListener l :_requestAttributeListeners)
+                if (!_servletRequestAttributeListeners.isEmpty())
+                    for (ServletRequestAttributeListener l :_servletRequestAttributeListeners)
                         baseRequest.addEventListener(l);
 
-                if (!_requestListeners.isEmpty())
+                if (!_servletRequestListeners.isEmpty())
                 {
                     final ServletRequestEvent sre = new ServletRequestEvent(_scontext,request);
-                    for (ServletRequestListener l : _requestListeners)
+                    for (ServletRequestListener l : _servletRequestListeners)
                         l.requestInitialized(sre);
                 }
             }
@@ -1134,34 +1165,91 @@
             // Handle more REALLY SILLY request events!
             if (new_context)
             {
-                if (!_requestListeners.isEmpty())
+                if (!_servletRequestListeners.isEmpty())
                 {
                     final ServletRequestEvent sre = new ServletRequestEvent(_scontext,request);
-                    for (int i=_requestListeners.size();i-->0;)
-                        _requestListeners.get(i).requestDestroyed(sre);
+                    for (int i=_servletRequestListeners.size();i-->0;)
+                        _servletRequestListeners.get(i).requestDestroyed(sre);
                 }
 
-                if (!_requestAttributeListeners.isEmpty())
+                if (!_servletRequestAttributeListeners.isEmpty())
                 {
-                    for (int i=_requestAttributeListeners.size();i-->0;)
-                        baseRequest.removeEventListener(_requestAttributeListeners.get(i));
+                    for (int i=_servletRequestAttributeListeners.size();i-->0;)
+                        baseRequest.removeEventListener(_servletRequestAttributeListeners.get(i));
+                }
+            }
+        }
+    }
+
+
+
+
+    /**
+     * @param request A request that is applicable to the scope, or null
+     * @param reason An object that indicates the reason the scope is being entered.
+     */
+    protected void enterScope(Request request, Object reason)
+    {
+        if (!_contextListeners.isEmpty())
+        {
+            for (ContextScopeListener listener:_contextListeners)
+            {
+                try
+                {
+                    listener.enterScope(_scontext,request,reason);
+                }
+                catch(Throwable e)
+                {
+                    LOG.warn(e);
+                }
+            }
+        }
+    }
+
+
+    /**
+     * @param request A request that is applicable to the scope, or null
+     */
+    protected void exitScope(Request request)
+    {
+        if (!_contextListeners.isEmpty())
+        {
+            for (int i = _contextListeners.size(); i-->0;)
+            {
+                try
+                {
+                    _contextListeners.get(i).exitScope(_scontext,request);
+                }
+                catch(Throwable e)
+                {
+                    LOG.warn(e);
                 }
             }
         }
     }
 
     /* ------------------------------------------------------------ */
-    /*
-     * Handle a runnable in this context
+    /**
+     * Handle a runnable in the scope of this context and a particular request
+     * @param request The request to scope the thread to (may be null if no particular request is in scope)
+     * @param runnable The runnable to run.
      */
-    public void handle(Runnable runnable)
+    public void handle(Request request, Runnable runnable)
     {
         ClassLoader old_classloader = null;
         Thread current_thread = null;
-        Context old_context = null;
+        Context old_context = __context.get();
+
+        // Are we already in the scope?
+        if (old_context==_scontext)
+        {
+            runnable.run();
+            return;
+        }
+
+        // Nope, so enter the scope and then exit
         try
         {
-            old_context = __context.get();
             __context.set(_scontext);
 
             // Set the classloader
@@ -1172,12 +1260,15 @@
                 current_thread.setContextClassLoader(_classLoader);
             }
 
+            enterScope(request,runnable);
             runnable.run();
         }
         finally
         {
+            exitScope(request);
+
             __context.set(old_context);
-            if (old_classloader != null && current_thread!=null)
+            if (old_classloader != null)
             {
                 current_thread.setContextClassLoader(old_classloader);
             }
@@ -1185,11 +1276,21 @@
     }
 
     /* ------------------------------------------------------------ */
+    /*
+     * Handle a runnable in the scope of this context
+     */
+    public void handle(Runnable runnable)
+    {
+        handle(null,runnable);
+    }
+
+    /* ------------------------------------------------------------ */
     /**
      * Check the target. Called by {@link #handle(String, Request, HttpServletRequest, HttpServletResponse)} when a target within a context is determined. If
      * the target is protected, 404 is returned.
+     * @param target the target to test
+     * @return true if target is a protected target
      */
-    /* ------------------------------------------------------------ */
     public boolean isProtectedTarget(String target)
     {
         if (target == null || _protectedTargets == null)
@@ -1205,7 +1306,7 @@
             {
                 if (target.length()==t.length())
                     return true;
-                
+
                 // Check that the target prefix really is a path segment, thus
                 // it can end with /, a query, a target or a parameter
                 char c=target.charAt(t.length());
@@ -1229,7 +1330,7 @@
             _protectedTargets = null;
             return;
         }
-        
+
         _protectedTargets = Arrays.copyOf(targets, targets.length);
     }
 
@@ -1250,7 +1351,6 @@
     @Override
     public void removeAttribute(String name)
     {
-        checkManagedAttribute(name,null);
         _attributes.removeAttribute(name);
     }
 
@@ -1264,7 +1364,6 @@
     @Override
     public void setAttribute( String name, Object value)
     {
-        checkManagedAttribute(name,value);
         _attributes.setAttribute(name,value);
     }
 
@@ -1277,37 +1376,16 @@
     {
         _attributes.clearAttributes();
         _attributes.addAll(attributes);
-        Enumeration<String> e = _attributes.getAttributeNames();
-        while (e.hasMoreElements())
-        {
-            String name = e.nextElement();
-            checkManagedAttribute(name,attributes.getAttribute(name));
-        }
     }
 
     /* ------------------------------------------------------------ */
     @Override
     public void clearAttributes()
     {
-        Enumeration<String> e = _attributes.getAttributeNames();
-        while (e.hasMoreElements())
-        {
-            String name = e.nextElement();
-            checkManagedAttribute(name,null);
-        }
         _attributes.clearAttributes();
     }
 
     /* ------------------------------------------------------------ */
-    public void checkManagedAttribute(String name, Object value)
-    {
-        if (_managedAttributes != null && _managedAttributes.containsKey(name))
-        {
-            setManagedAttribute(name,value);
-        }
-    }
-
-    /* ------------------------------------------------------------ */
     public void setManagedAttribute(String name, Object value)
     {
         Object old = _managedAttributes.put(name,value);
@@ -1406,10 +1484,10 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** 
+    /**
      * Set the base resource for this context.
-     * @param resourceBase A string representing the base resource for the context. Any string accepted 
-     * by {@link Resource#newResource(String)} may be passed and the call is equivalent to 
+     * @param resourceBase A string representing the base resource for the context. Any string accepted
+     * by {@link Resource#newResource(String)} may be passed and the call is equivalent to
      * <code>setBaseResource(newResource(resourceBase));</code>
      */
     public void setResourceBase(String resourceBase)
@@ -1448,8 +1526,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     */
     public void setWelcomeFiles(String[] files)
     {
         _welcomeFiles = files;
@@ -1486,7 +1562,7 @@
     {
         if (errorHandler != null)
             errorHandler.setServer(getServer());
-        updateBean(_errorHandler,errorHandler);
+        updateBean(_errorHandler,errorHandler,true);
         _errorHandler = errorHandler;
     }
 
@@ -1500,7 +1576,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Set the maximum size of a form post, to protect against DOS attacks from large forms.
-     * @param maxSize
+     * @param maxSize the maximum size of the form content (in bytes)
      */
     public void setMaxFormContentSize(int maxSize)
     {
@@ -1516,7 +1592,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Set the maximum number of form Keys to protect against DOS attack from crafted hash keys.
-     * @param max
+     * @param max the maximum number of form keys
      */
     public void setMaxFormKeys(int max)
     {
@@ -1618,11 +1694,11 @@
             encoding = _localeEncodingMap.get(locale.getLanguage());
         return encoding;
     }
-    
+
     /* ------------------------------------------------------------ */
-    /** 
+    /**
      * Get all of the locale encodings
-     * 
+     *
      * @return a map of all the locale encodings: key is name of the locale and value is the char encoding
      */
     public Map<String,String> getLocaleEncodings()
@@ -1647,7 +1723,7 @@
         {
             path = URIUtil.canonicalPath(path);
             Resource resource = _baseResource.addPath(path);
-            
+
             if (checkAlias(path,resource))
                 return resource;
             return null;
@@ -1662,14 +1738,14 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * @param path
-     * @param resource
+     * @param path the path to check the alias for
+     * @param resource the resource
      * @return True if the alias is OK
      */
     public boolean checkAlias(String path, Resource resource)
     {
         // Is the resource aliased?
-        if (resource.getAlias() != null)
+        if (resource.isAlias())
         {
             if (LOG.isDebugEnabled())
                 LOG.debug("Aliased resource: " + resource + "~=" + resource.getAlias());
@@ -1689,19 +1765,25 @@
         }
         return true;
     }
-    
+
     /* ------------------------------------------------------------ */
     /**
      * Convert URL to Resource wrapper for {@link Resource#newResource(URL)} enables extensions to provide alternate resource implementations.
+     * @param url the url to convert to a Resource
+     * @return the Resource for that url
+     * @throws IOException if unable to create a Resource from the URL
      */
     public Resource newResource(URL url) throws IOException
     {
         return Resource.newResource(url);
     }
-    
+
     /* ------------------------------------------------------------ */
     /**
      * Convert URL to Resource wrapper for {@link Resource#newResource(URL)} enables extensions to provide alternate resource implementations.
+     * @param uri the URI to convert to a Resource
+     * @return the Resource for that URI
+     * @throws IOException if unable to create a Resource from the URL
      */
     public Resource newResource(URI uri) throws IOException
     {
@@ -1785,7 +1867,7 @@
     {
         return _aliasChecks;
     }
-    
+
     /* ------------------------------------------------------------ */
     /**
      * @param checks list of AliasCheck instances
@@ -1798,6 +1880,16 @@
 
     /* ------------------------------------------------------------ */
     /**
+     * clear the list of AliasChecks
+     */
+    public void clearAliasChecks()
+    {
+        _aliasChecks.clear();
+    }
+
+
+    /* ------------------------------------------------------------ */
+    /**
      * Context.
      * <p>
      * A partial implementation of {@link javax.servlet.ServletContext}. A complete implementation is provided by the derived {@link ContextHandler}.
@@ -1805,7 +1897,7 @@
      *
      *
      */
-    public class Context extends NoContext
+    public class Context extends StaticContext
     {
         protected boolean _enabled = true; //whether or not the dynamic API is enabled for callers
         protected boolean _extendedListenerTypes = false;
@@ -1935,21 +2027,17 @@
 
             try
             {
-                String query = null;
-                int q = 0;
-                if ((q = uriInContext.indexOf('?')) > 0)
-                {
-                    query = uriInContext.substring(q + 1);
-                    uriInContext = uriInContext.substring(0,q);
-                }
+                HttpURI uri = new HttpURI(null,null,0,uriInContext);
 
-                String pathInContext = URIUtil.canonicalPath(URIUtil.decodePath(uriInContext));
-                if (pathInContext!=null)
-                {
-                    String uri = URIUtil.addPaths(getContextPath(),uriInContext);
-                    ContextHandler context = ContextHandler.this;
-                    return new Dispatcher(context,uri,pathInContext,query);
-                }
+                String pathInfo=URIUtil.canonicalPath(uri.getDecodedPath());
+                if (pathInfo==null)
+                    return null;
+
+                String contextPath=getContextPath();
+                if (contextPath!=null && contextPath.length()>0)
+                    uri.setPath(URIUtil.addPaths(contextPath,uri.getPath()));
+
+                return new Dispatcher(ContextHandler.this,uri,pathInfo);
             }
             catch (Exception e)
             {
@@ -1996,7 +2084,7 @@
         {
             Resource resource = ContextHandler.this.getResource(path);
             if (resource != null && resource.exists())
-                return resource.getURL();
+                return resource.getURI().toURL();
             return null;
         }
 
@@ -2120,7 +2208,6 @@
         @Override
         public synchronized void setAttribute(String name, Object value)
         {
-            checkManagedAttribute(name,value);
             Object old_value = super.getAttribute(name);
 
             if (value == null)
@@ -2128,11 +2215,11 @@
             else
                 super.setAttribute(name,value);
 
-            if (!_contextAttributeListeners.isEmpty())
+            if (!_servletContextAttributeListeners.isEmpty())
             {
                 ServletContextAttributeEvent event = new ServletContextAttributeEvent(_scontext,name,old_value == null?value:old_value);
 
-                for (ServletContextAttributeListener l : _contextAttributeListeners)
+                for (ServletContextAttributeListener l : _servletContextAttributeListeners)
                 {
                     if (old_value == null)
                         l.attributeAdded(event);
@@ -2151,15 +2238,13 @@
         @Override
         public synchronized void removeAttribute(String name)
         {
-            checkManagedAttribute(name,null);
-
             Object old_value = super.getAttribute(name);
             super.removeAttribute(name);
-            if (old_value != null &&!_contextAttributeListeners.isEmpty())
+            if (old_value != null &&!_servletContextAttributeListeners.isEmpty())
             {
                 ServletContextAttributeEvent event = new ServletContextAttributeEvent(_scontext,name,old_value);
 
-                for (ServletContextAttributeListener l : _contextAttributeListeners)
+                for (ServletContextAttributeListener l : _servletContextAttributeListeners)
                     l.attributeRemoved(event);
             }
         }
@@ -2212,8 +2297,8 @@
 
             try
             {
-                @SuppressWarnings("unchecked")
-                Class<? extends EventListener> clazz = _classLoader==null?Loader.loadClass(ContextHandler.class,className):_classLoader.loadClass(className);
+                @SuppressWarnings({ "unchecked", "rawtypes" })
+                Class<? extends EventListener> clazz = _classLoader==null?Loader.loadClass(ContextHandler.class,className):(Class)_classLoader.loadClass(className);
                 addListener(clazz);
             }
             catch (ClassNotFoundException e)
@@ -2283,55 +2368,54 @@
 
         public void setExtendedListenerTypes (boolean extended)
         {
-           _extendedListenerTypes = extended;
+            _extendedListenerTypes = extended;
         }
 
-       public boolean isExtendedListenerTypes()
-       {
-           return _extendedListenerTypes;
-       }
+        public boolean isExtendedListenerTypes()
+        {
+            return _extendedListenerTypes;
+        }
 
+        @Override
+        public ClassLoader getClassLoader()
+        {
+            if (!_enabled)
+                throw new UnsupportedOperationException();
 
-       @Override
-       public ClassLoader getClassLoader()
-       {
-           if (!_enabled)
-               throw new UnsupportedOperationException();
-           
-           //no security manager just return the classloader
-           if (System.getSecurityManager() == null)
-               return _classLoader;
-           else
-           {
-               //check to see if the classloader of the caller is the same as the context
-               //classloader, or a parent of it
-               try
-               {
-                   Class<?> reflect = Loader.loadClass(getClass(), "sun.reflect.Reflection");
-                   Method getCallerClass = reflect.getMethod("getCallerClass", Integer.TYPE);
-                   Class<?> caller = (Class<?>)getCallerClass.invoke(null, 2);
+            //no security manager just return the classloader
+            if (!_usingSecurityManager)
+                return _classLoader;
+            else
+            {
+                //check to see if the classloader of the caller is the same as the context
+                //classloader, or a parent of it
+                try
+                {
+                    Class<?> reflect = Loader.loadClass(getClass(), "sun.reflect.Reflection");
+                    Method getCallerClass = reflect.getMethod("getCallerClass", Integer.TYPE);
+                    Class<?> caller = (Class<?>)getCallerClass.invoke(null, 2);
 
-                   boolean ok = false;
-                   ClassLoader callerLoader = caller.getClassLoader();
-                   while (!ok && callerLoader != null)
-                   {
-                       if (callerLoader == _classLoader) 
-                           ok = true;
-                       else
-                           callerLoader = callerLoader.getParent();    
-                   }
+                    boolean ok = false;
+                    ClassLoader callerLoader = caller.getClassLoader();
+                    while (!ok && callerLoader != null)
+                    {
+                        if (callerLoader == _classLoader)
+                            ok = true;
+                        else
+                            callerLoader = callerLoader.getParent();
+                    }
 
-                   if (ok)
-                       return _classLoader;
-               }
-               catch (Exception e)      
-               {
-                   LOG.warn("Unable to check classloader of caller",e);
-               }
-              
-               AccessController.checkPermission(new RuntimePermission("getClassLoader"));
-               return _classLoader;
-           }
+                    if (ok)
+                        return _classLoader;
+                }
+                catch (Exception e)
+                {
+                    LOG.warn("Unable to check classloader of caller",e);
+                }
+
+                AccessController.checkPermission(new RuntimePermission("getClassLoader"));
+                return _classLoader;
+            }
         }
 
         @Override
@@ -2365,23 +2449,29 @@
             return _enabled;
         }
 
-
-
         public <T> T createInstance (Class<T> clazz) throws Exception
         {
             T o = clazz.newInstance();
             return o;
         }
+
+        @Override
+        public String getVirtualServerName()
+        {
+            String[] hosts = getVirtualHosts();
+            if (hosts!=null && hosts.length>0)
+                return hosts[0];
+            return null;
+        }
     }
 
-
-    public static class NoContext extends AttributesMap implements ServletContext
+    public static class StaticContext extends AttributesMap implements ServletContext
     {
         private int _effectiveMajorVersion = SERVLET_MAJOR_VERSION;
         private int _effectiveMinorVersion = SERVLET_MINOR_VERSION;
 
         /* ------------------------------------------------------------ */
-        public NoContext()
+        public StaticContext()
         {
         }
 
@@ -2448,12 +2538,7 @@
         @Override
         public String getServerInfo()
         {
-            // NOTE: DO NOT CHANGE
-            //   this is used by weld to detect Jetty
-            //   implementation version
-            // See: https://github.com/weld/core/blob/master/environments/servlet/core/src/main/java/org/jboss/weld/environment/jetty/JettyContainer.java
-            //   and its touch(ContainerContext) method
-            return "jetty/" + Server.getVersion();
+            return __serverInfo;
         }
 
         @Override
@@ -2523,7 +2608,6 @@
             return null;
         }
 
-
         @Override
         public boolean setInitParameter(String name, String value)
         {
@@ -2679,7 +2763,6 @@
         @Override
         public ClassLoader getClassLoader()
         {
-            AccessController.checkPermission(new RuntimePermission("getClassLoader"));
             return ContextHandler.class.getClassLoader();
         }
 
@@ -2718,13 +2801,9 @@
             LOG.warn(__unimplmented);
         }
 
-        /**
-         * @see javax.servlet.ServletContext#getVirtualServerName()
-         */
         @Override
         public String getVirtualServerName()
         {
-            // TODO 3.1 Auto-generated method stub
             return null;
         }
     }
@@ -2758,53 +2837,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** Approve Aliases with same suffix.
-     * Eg. a symbolic link from /foobar.html to /somewhere/wibble.html would be
-     * approved because both the resource and alias end with ".html".
-     */
-    @Deprecated
-    public static class ApproveSameSuffixAliases implements AliasCheck
-    {
-        {
-            LOG.warn("ApproveSameSuffixAlias is not safe for production");
-        }
-        
-        @Override
-        public boolean check(String path, Resource resource)
-        {
-            int dot = path.lastIndexOf('.');
-            if (dot<0)
-                return false;
-            String suffix=path.substring(dot);
-            return resource.toString().endsWith(suffix);
-        }
-    }
-
-
-    /* ------------------------------------------------------------ */
-    /** Approve Aliases with a path prefix.
-     * Eg. a symbolic link from /dirA/foobar.html to /dirB/foobar.html would be
-     * approved because both the resource and alias end with "/foobar.html".
-     */
-    @Deprecated
-    public static class ApprovePathPrefixAliases implements AliasCheck
-    {
-        {
-            LOG.warn("ApprovePathPrefixAliases is not safe for production");
-        }
-        
-        @Override
-        public boolean check(String path, Resource resource)
-        {
-            int slash = path.lastIndexOf('/');
-            if (slash<0 || slash==path.length()-1)
-                return false;
-            String suffix=path.substring(slash);
-            return resource.toString().endsWith(suffix);
-        }
-    }
-    
-    /* ------------------------------------------------------------ */
     /** Approve Aliases of a non existent directory.
      * If a directory "/foobar/" does not exist, then the resource is
      * aliased to "/foobar".  Accept such aliases.
@@ -2816,17 +2848,36 @@
         {
             if (resource.exists())
                 return false;
-            
+
             String a=resource.getAlias().toString();
-            String r=resource.getURL().toString();
-            
+            String r=resource.getURI().toString();
+
             if (a.length()>r.length())
                 return a.startsWith(r) && a.length()==r.length()+1 && a.endsWith("/");
             if (a.length()<r.length())
                 return r.startsWith(a) && r.length()==a.length()+1 && r.endsWith("/");
-            
-            return a.equals(r); 
+
+            return a.equals(r);
         }
     }
 
+
+    /** Listener for all threads entering context scope, including async IO callbacks
+     */
+    public static interface ContextScopeListener extends EventListener
+    {
+        /**
+         * @param context The context being entered
+         * @param request A request that is applicable to the scope, or null
+         * @param reason An object that indicates the reason the scope is being entered
+         */
+        void enterScope(Context context, Request request, Object reason);
+
+
+        /**
+         * @param context The context being exited
+         * @param request A request that is applicable to the scope, or null
+         */
+        void exitScope(Context context, Request request);
+    }
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandlerCollection.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandlerCollection.java
index 78c8948..45676f2 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandlerCollection.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandlerCollection.java
@@ -19,11 +19,9 @@
 package org.eclipse.jetty.server.handler;
 
 import java.io.IOException;
-import java.lang.reflect.Array;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -236,6 +234,7 @@
     /* ------------------------------------------------------------ */
     /** Add a context handler.
      * @param contextPath  The context path to add
+     * @param resourceBase the base (root) Resource
      * @return the ContextHandler just added
      */
     public ContextHandler addContext(String contextPath,String resourceBase)
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/DebugHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/DebugHandler.java
index e30f213..97a9b38 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/DebugHandler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/DebugHandler.java
@@ -27,9 +27,11 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.eclipse.jetty.http.HttpURI;
 import org.eclipse.jetty.io.Connection;
 import org.eclipse.jetty.server.AbstractConnector;
 import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.DebugListener;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.Response;
 import org.eclipse.jetty.util.DateCache;
@@ -42,6 +44,7 @@
  * Details of the request and response are written to an output stream
  * and the current thread name is updated with information that will link
  * to the details in that output.
+ * @deprecated Use {@link DebugListener}
  */
 public class DebugHandler extends HandlerWrapper implements Connection.Listener
 {
@@ -64,8 +67,8 @@
         boolean suspend=false;
         boolean retry=false;
         String name=(String)request.getAttribute("org.eclipse.jetty.thread.name");
-        if (name==null)
-            name=old_name+":"+baseRequest.getScheme()+"://"+baseRequest.getLocalAddr()+":"+baseRequest.getLocalPort()+baseRequest.getUri();
+        if (name == null)
+            name = old_name + ":" + baseRequest.getHttpURI();
         else
             retry=true;
 
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/DefaultHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/DefaultHandler.java
index f6a7899..78d2ab7 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/DefaultHandler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/DefaultHandler.java
@@ -48,7 +48,6 @@
  * For all other requests a normal 404 is served.
  *
  *
- * @org.apache.xbean.XBean
  */
 public class DefaultHandler extends AbstractHandler
 {
@@ -134,7 +133,7 @@
                 {
                     writer.write("<li><a href=\"");
                     if (context.getVirtualHosts()!=null && context.getVirtualHosts().length>0)
-                        writer.write("http://"+context.getVirtualHosts()[0]+":"+request.getLocalPort());
+                        writer.write(request.getScheme()+"://"+context.getVirtualHosts()[0]+":"+request.getLocalPort());
                     writer.write(context.getContextPath());
                     if (context.getContextPath().length()>1 && context.getContextPath().endsWith("/"))
                         writer.write("/");
@@ -163,8 +162,9 @@
             }
 
             writer.write("</ul><hr>");
-            writer.write("<a href=\"http://eclipse.org/jetty\"><img border=0 src=\"/favicon.ico\"/></a>&nbsp;");
-            writer.write("<a href=\"http://eclipse.org/jetty\">Powered by Jetty:// Java Web Server</a><hr/>\n");
+
+            baseRequest.getHttpChannel().getHttpConfiguration()
+                .writePoweredBy(writer,"<a href=\"http://eclipse.org/jetty\"><img border=0 src=\"/favicon.ico\"/></a>&nbsp;","<hr/>\n");
 
             writer.write("\n</BODY>\n</HTML>\n");
             writer.flush();
@@ -173,7 +173,7 @@
             {
                 writer.writeTo(out);
             }
-        } 
+        }
     }
 
     /* ------------------------------------------------------------ */
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java
index 9591e53..a30a1e3 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java
@@ -39,6 +39,7 @@
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.util.ByteArrayISO8859Writer;
+import org.eclipse.jetty.util.Jetty;
 import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
@@ -141,7 +142,7 @@
     protected void writeErrorPageHead(HttpServletRequest request, Writer writer, int code, String message)
         throws IOException
         {
-        writer.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/>\n");
+        writer.write("<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/>\n");
         writer.write("<title>Error ");
         writer.write(Integer.toString(code));
 
@@ -162,7 +163,9 @@
         writeErrorPageMessage(request,writer,code,message,uri);
         if (showStacks)
             writeErrorPageStacks(request,writer);
-        writer.write("<hr><i><small>Powered by Jetty://</small></i><hr/>\n");
+
+        Request.getBaseRequest(request).getHttpChannel().getHttpConfiguration()
+            .writePoweredBy(writer,"<hr>","<hr/>\n");
     }
 
     /* ------------------------------------------------------------ */
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/HandlerCollection.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/HandlerCollection.java
index 4b4aca7..f799b3a 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/HandlerCollection.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/HandlerCollection.java
@@ -35,14 +35,13 @@
 import org.eclipse.jetty.util.annotation.ManagedObject;
 
 /* ------------------------------------------------------------ */
-/** A collection of handlers.
+/** 
+ * A collection of handlers.
  * <p>
  * The default implementations  calls all handlers in list order,
  * regardless of the response status or exceptions. Derived implementation
  * may alter the order or the conditions of calling the contained
  * handlers.
- * <p>
- *
  */
 @ManagedObject("Handler of multiple handlers")
 public class HandlerCollection extends AbstractHandlerContainer
@@ -136,17 +135,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    @Override
-    public void setServer(Server server)
-    {
-        super.setServer(server);
-        Handler[] handlers=getHandlers();
-        if (handlers!=null)
-            for (Handler h : handlers)
-                h.setServer(server);
-    }
-
-    /* ------------------------------------------------------------ */
     /* Add a handler.
      * This implementation adds the passed handler to the end of the existing collection of handlers.
      * @see org.eclipse.jetty.server.server.HandlerContainer#addHandler(org.eclipse.jetty.server.server.Handler)
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/HandlerWrapper.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/HandlerWrapper.java
index e3f3fd5..c8ef17b 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/HandlerWrapper.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/HandlerWrapper.java
@@ -25,11 +25,13 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.eclipse.jetty.http.HttpStatus;
 import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.util.annotation.ManagedAttribute;
 import org.eclipse.jetty.util.annotation.ManagedObject;
+import org.eclipse.jetty.util.component.LifeCycle;
 
 /* ------------------------------------------------------------ */
 /** A <code>HandlerWrapper</code> acts as a {@link Handler} but delegates the {@link Handler#handle handle} method and
@@ -85,37 +87,38 @@
         
         Handler old=_handler;
         _handler=handler;
-        updateBean(old,_handler);
+        updateBean(old,_handler,true);
+    }
+
+    /* ------------------------------------------------------------ */
+    /** 
+     * Replace the current handler with another HandlerWrapper
+     * linked to the current handler.  
+     * <p>
+     * This is equivalent to:
+     * <pre>
+     *   wrapper.setHandler(getHandler());
+     *   setHandler(wrapper);
+     * </pre>
+     * @param wrapper the wrapper to insert
+     */
+    public void insertHandler(HandlerWrapper wrapper)
+    {
+        if (wrapper==null || wrapper.getHandler()!=null)
+            throw new IllegalArgumentException();
+        wrapper.setHandler(getHandler());
+        setHandler(wrapper);
     }
 
     /* ------------------------------------------------------------ */
     @Override
     public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
     {
-        if (_handler!=null && isStarted())
-        {
-            _handler.handle(target,baseRequest, request, response);
-        }
+        Handler handler=_handler;
+        if (handler!=null)
+            handler.handle(target,baseRequest, request, response);
     }
 
-
-    /* ------------------------------------------------------------ */
-    @Override
-    public void setServer(Server server)
-    {
-        if (server==getServer())
-            return;
-        
-        if (isStarted())
-            throw new IllegalStateException(STARTED);
-
-        super.setServer(server);
-        Handler h=getHandler();
-        if (h!=null)
-            h.setServer(server);
-    }
-
-
     /* ------------------------------------------------------------ */
     @Override
     protected void expandChildren(List<Handler> list, Class<?> byClass)
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/HotSwapHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/HotSwapHandler.java
index 68eaad1..a0685f2 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/HotSwapHandler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/HotSwapHandler.java
@@ -77,7 +77,7 @@
             throw new IllegalArgumentException("Parameter handler is null.");
         try
         {
-            updateBean(_handler,handler);
+            updateBean(_handler,handler,true);
             _handler=handler;
             Server server = getServer();
             handler.setServer(server);
@@ -124,20 +124,6 @@
 
     /* ------------------------------------------------------------ */
     @Override
-    public void setServer(Server server)
-    {
-        if (isRunning())
-            throw new IllegalStateException(RUNNING);
-
-        super.setServer(server);
-
-        Handler h = getHandler();
-        if (h != null)
-            h.setServer(server);
-    }
-
-    /* ------------------------------------------------------------ */
-    @Override
     protected void expandChildren(List<Handler> list, Class<?> byClass)
     {
         expandHandler(_handler,list,byClass);
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/IPAccessHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/IPAccessHandler.java
index 747b88d..cdc1fc2 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/IPAccessHandler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/IPAccessHandler.java
@@ -57,12 +57,11 @@
  * are always applied, so that even if an entry matches the white list, a black list
  * entry will override it.
  * <p>
- * <p>
  * You can change white list policy setting whiteListByPath to true. In this mode a request will be white listed
  * IF it has a matching URL in the white list, otherwise the black list applies, e.g. in default mode when
  * whiteListByPath = false and wl = "127.0.0.1|/foo", /bar request from 127.0.0.1 will be blacklisted,
  * if whiteListByPath=true then not.
- * </p>
+ * <p>
  * Internet addresses may be specified as absolute address or as a combination of
  * four octet wildcard specifications (a.b.c.d) that are defined as follows.
  * </p>
@@ -70,9 +69,9 @@
  * nnn - an absolute value (0-255)
  * mmm-nnn - an inclusive range of absolute values,
  *           with following shorthand notations:
- *           nnn- => nnn-255
- *           -nnn => 0-nnn
- *           -    => 0-255
+ *           nnn- =&gt; nnn-255
+ *           -nnn =&gt; 0-nnn
+ *           -    =&gt; 0-255
  * a,b,... - a list of wildcard specifications
  * </pre>
  * <p>
@@ -201,7 +200,7 @@
     public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
     {
         // Get the real remote IP (not the one set by the forwarded headers (which may be forged))
-        HttpChannel<?> channel = baseRequest.getHttpChannel();
+        HttpChannel channel = baseRequest.getHttpChannel();
         if (channel!=null)
         {
             EndPoint endp=channel.getEndPoint();
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/IdleTimeoutHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/IdleTimeoutHandler.java
index fb52e50..f0a8d3a 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/IdleTimeoutHandler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/IdleTimeoutHandler.java
@@ -26,22 +26,20 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.eclipse.jetty.io.EndPoint;
 import org.eclipse.jetty.server.HttpChannel;
-import org.eclipse.jetty.server.HttpConnection;
 import org.eclipse.jetty.server.Request;
 
 /**
  * Handler to adjust the idle timeout of requests while dispatched.
  * Can be applied in jetty.xml with
  * <pre>
- *   &lt;Get id='handler' name='Handler'/>
- *   &lt;Set name='Handler'>
- *     &lt;New id='idleTimeoutHandler' class='org.eclipse.jetty.server.handler.IdleTimeoutHandler'>
- *       &lt;Set name='Handler'>&lt;Ref id='handler'/>&lt;/Set>
- *       &lt;Set name='IdleTimeoutMs'>5000&lt;/Set>
- *     &lt;/New>
- *   &lt;/Set>
+ *   &lt;Get id='handler' name='Handler'/&gt;
+ *   &lt;Set name='Handler'&gt;
+ *     &lt;New id='idleTimeoutHandler' class='org.eclipse.jetty.server.handler.IdleTimeoutHandler'&gt;
+ *       &lt;Set name='Handler'&gt;&lt;Ref id='handler'/&gt;&lt;/Set&gt;
+ *       &lt;Set name='IdleTimeoutMs'&gt;5000&lt;/Set&gt;
+ *     &lt;/New&gt;
+ *   &lt;/Set&gt;
  * </pre>
  */
 public class IdleTimeoutHandler extends HandlerWrapper
@@ -80,7 +78,7 @@
     @Override
     public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
     {
-        final HttpChannel<?> channel = baseRequest.getHttpChannel();
+        final HttpChannel channel = baseRequest.getHttpChannel();
         final long idle_timeout=baseRequest.getHttpChannel().getIdleTimeout();
         channel.setIdleTimeout(_idleTimeoutMs);
         
@@ -90,35 +88,35 @@
         }
         finally
         {
-                if (_applyToAsync && request.isAsyncStarted())
+            if (_applyToAsync && request.isAsyncStarted())
+            {
+                request.getAsyncContext().addListener(new AsyncListener()
                 {
-                    request.getAsyncContext().addListener(new AsyncListener()
+                    @Override
+                    public void onTimeout(AsyncEvent event) throws IOException
+                    {                            
+                    }
+
+                    @Override
+                    public void onStartAsync(AsyncEvent event) throws IOException
                     {
-                        @Override
-                        public void onTimeout(AsyncEvent event) throws IOException
-                        {                            
-                        }
-                        
-                        @Override
-                        public void onStartAsync(AsyncEvent event) throws IOException
-                        {
-                        }
-                        
-                        @Override
-                        public void onError(AsyncEvent event) throws IOException
-                        {
-                            channel.setIdleTimeout(idle_timeout);
-                        }
-                        
-                        @Override
-                        public void onComplete(AsyncEvent event) throws IOException
-                        {
-                            channel.setIdleTimeout(idle_timeout);
-                        }
-                    });
-                }
-                else 
-                    channel.setIdleTimeout(idle_timeout);
+                    }
+
+                    @Override
+                    public void onError(AsyncEvent event) throws IOException
+                    {
+                        channel.setIdleTimeout(idle_timeout);
+                    }
+
+                    @Override
+                    public void onComplete(AsyncEvent event) throws IOException
+                    {
+                        channel.setIdleTimeout(idle_timeout);
+                    }
+                });
+            }
+            else 
+                channel.setIdleTimeout(idle_timeout);
         }
     }
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ManagedAttributeListener.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ManagedAttributeListener.java
new file mode 100644
index 0000000..8401af5
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ManagedAttributeListener.java
@@ -0,0 +1,107 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler;
+
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.servlet.ServletContextAttributeEvent;
+import javax.servlet.ServletContextAttributeListener;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+/* ------------------------------------------------------------ */
+/** Enable Jetty style JMX MBeans from within a Context 
+ */
+public class ManagedAttributeListener implements  ServletContextListener, ServletContextAttributeListener
+{
+    private static final Logger LOG = Log.getLogger(ManagedAttributeListener.class);
+
+    final Set<String> _managedAttributes=new HashSet<>();
+    final ContextHandler _context;
+    
+    public ManagedAttributeListener(ContextHandler context,String... managedAttributes)
+    {
+        _context=context;
+
+        for (String attr:managedAttributes)
+            _managedAttributes.add(attr);
+        
+        if (LOG.isDebugEnabled())
+            LOG.debug("managedAttributes {}",_managedAttributes);
+    }
+
+    @Override
+    public void attributeReplaced(ServletContextAttributeEvent event)
+    {
+        if (_managedAttributes.contains(event.getName()))
+            updateBean(event.getName(),event.getValue(),event.getServletContext().getAttribute(event.getName()));
+    }
+    
+    @Override
+    public void attributeRemoved(ServletContextAttributeEvent event)
+    {
+        if (_managedAttributes.contains(event.getName()))
+            updateBean(event.getName(),event.getValue(),null);                    
+    }
+    
+    @Override
+    public void attributeAdded(ServletContextAttributeEvent event)
+    {
+        if (_managedAttributes.contains(event.getName()))
+            updateBean(event.getName(),null,event.getValue());    
+    }
+
+    @Override
+    public void contextInitialized(ServletContextEvent event)
+    {                 
+        // Update existing attributes
+        Enumeration<String> e = event.getServletContext().getAttributeNames();
+        while (e.hasMoreElements())
+        {
+            String name = e.nextElement();
+            if (_managedAttributes.contains(name))
+                updateBean(name,null,event.getServletContext().getAttribute(name));
+        }
+    }
+    
+    @Override
+    public void contextDestroyed(ServletContextEvent event)
+    {
+        Enumeration<String> e = _context.getServletContext().getAttributeNames();
+        while (e.hasMoreElements())
+        {
+            String name = e.nextElement();
+            if (_managedAttributes.contains(name))
+                updateBean(name,event.getServletContext().getAttribute(name),null);
+        }
+    }
+    
+    protected void updateBean(String name,Object oldBean,Object newBean)
+    {
+        LOG.info("update {} {}->{} on {}",name,oldBean,newBean,_context);
+        if (LOG.isDebugEnabled())
+            LOG.debug("update {} {}->{} on {}",name,oldBean,newBean,_context);
+        _context.updateBean(oldBean,newBean,false);
+    }
+}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/RequestLogHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/RequestLogHandler.java
index 7c8f4b5..4c70a67 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/RequestLogHandler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/RequestLogHandler.java
@@ -20,67 +20,27 @@
 
 import java.io.IOException;
 
-import javax.servlet.AsyncEvent;
-import javax.servlet.AsyncListener;
 import javax.servlet.DispatcherType;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.eclipse.jetty.server.AsyncContextState;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.RequestLog;
-import org.eclipse.jetty.server.Response;
-import org.eclipse.jetty.util.component.AbstractLifeCycle;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
+import org.eclipse.jetty.server.Server;
 
 
 /**
  * RequestLogHandler.
  * This handler can be used to wrap an individual context for context logging.
+ * To set a {@link RequestLog} instance for the entire {@link Server}, use 
+ * {@link Server#setRequestLog(RequestLog)} instead of this handler.
  *
- *
- * @org.apache.xbean.XBean
+ * @see Server#setRequestLog(RequestLog)
  */
 public class RequestLogHandler extends HandlerWrapper
 {
-    private static final Logger LOG = Log.getLogger(RequestLogHandler.class);
     private RequestLog _requestLog;
-    private final AsyncListener _listener = new AsyncListener()
-    {
-        
-        @Override
-        public void onTimeout(AsyncEvent event) throws IOException
-        {
-            
-        }
-        
-        @Override
-        public void onStartAsync(AsyncEvent event) throws IOException
-        {
-            event.getAsyncContext().addListener(this);
-        }
-        
-        @Override
-        public void onError(AsyncEvent event) throws IOException
-        {
-            HttpServletResponse response = (HttpServletResponse)event.getAsyncContext().getResponse();
-            if (!response.isCommitted())
-                response.setStatus(500);
-            
-        }
-        
-        @Override
-        public void onComplete(AsyncEvent event) throws IOException
-        {
-            AsyncContextState context = (AsyncContextState)event.getAsyncContext();
-            Request request=context.getHttpChannelState().getBaseRequest();
-            Response response=request.getResponse();
-            _requestLog.log(request,response);
-        }
-    };
 
     /* ------------------------------------------------------------ */
     /*
@@ -90,29 +50,10 @@
     public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
             throws IOException, ServletException
     {
-        try
-        {
-            super.handle(target, baseRequest, request, response);
-        }
-        catch(Error|IOException|ServletException|RuntimeException e)
-        {
-            if (!response.isCommitted() && !baseRequest.getHttpChannelState().isAsync())
-                response.setStatus(500);
-            throw e;
-        }
-        finally
-        {
-            if (_requestLog != null && baseRequest.getDispatcherType().equals(DispatcherType.REQUEST))
-            {
-                if (baseRequest.getHttpChannelState().isAsync())
-                {
-                    if (baseRequest.getHttpChannelState().isInitial())
-                        baseRequest.getAsyncContext().addListener(_listener);
-                }
-                else
-                    _requestLog.log(baseRequest, (Response)response);
-            }
-        }
+        if (baseRequest.getDispatcherType()==DispatcherType.REQUEST)
+            baseRequest.getHttpChannel().addRequestLog(_requestLog);
+        if (_handler!=null)
+            _handler.handle(target,baseRequest, request, response);
     }
 
     /* ------------------------------------------------------------ */
@@ -128,35 +69,5 @@
         return _requestLog;
     }
     
-    /* ------------------------------------------------------------ */
-    @Override
-    protected void doStart() throws Exception
-    {
-        if (_requestLog==null)
-        {
-            LOG.warn("!RequestLog");
-            _requestLog=new NullRequestLog();
-        }
-        super.doStart();
-    }
-    
-    /* ------------------------------------------------------------ */
-    @Override
-    protected void doStop() throws Exception
-    {
-        super.doStop();
-        if (_requestLog instanceof NullRequestLog)
-            _requestLog=null;
-    }
 
-    /* ------------------------------------------------------------ */
-    /* ------------------------------------------------------------ */
-    /* ------------------------------------------------------------ */
-    private static class NullRequestLog extends AbstractLifeCycle implements RequestLog
-    {
-        @Override
-        public void log(Request request, Response response)
-        {            
-        }
-    }
 }
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ResourceHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ResourceHandler.java
index 3e7e5a0..6a38a71 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ResourceHandler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ResourceHandler.java
@@ -45,7 +45,7 @@
 import org.eclipse.jetty.util.URIUtil;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.util.resource.FileResource;
+import org.eclipse.jetty.util.resource.PathResource;
 import org.eclipse.jetty.util.resource.Resource;
 
 
@@ -57,7 +57,6 @@
  * Requests for resources that do not exist are let pass (Eg no 404's).
  *
  *
- * @org.apache.xbean.XBean
  */
 public class ResourceHandler extends HandlerWrapper
 {
@@ -318,8 +317,7 @@
         {
             path=URIUtil.canonicalPath(path);
             Resource r = base.addPath(path);
-            
-            if (r!=null && r.getAlias()!=null && (_context==null || !_context.checkAlias(path, r)))
+            if (r!=null && r.isAlias() && (_context==null || !_context.checkAlias(path, r)))
             {
                 if (LOG.isDebugEnabled())
                     LOG.debug("resource={} alias={}",r,r.getAlias());
@@ -546,7 +544,7 @@
                 if (_minMemoryMappedContentLength>0 && 
                     resource.length()>_minMemoryMappedContentLength &&
                     resource.length()<Integer.MAX_VALUE &&
-                    resource instanceof FileResource)
+                    resource instanceof PathResource)
                 {
                     ByteBuffer buffer = BufferUtil.toMappedBuffer(resource.getFile());
                     ((HttpOutput)out).sendContent(buffer,callback);
@@ -566,7 +564,7 @@
                 // Can we use a memory mapped file?
                 if (_minMemoryMappedContentLength>0 && 
                     resource.length()>_minMemoryMappedContentLength &&
-                    resource instanceof FileResource)
+                    resource instanceof PathResource)
                 {
                     ByteBuffer buffer = BufferUtil.toMappedBuffer(resource.getFile());
                     ((HttpOutput)out).sendContent(buffer);
@@ -590,7 +588,7 @@
         if (_directory)
         {
             String listing = resource.getListHTML(request.getRequestURI(),request.getPathInfo().lastIndexOf("/") > 0);
-            response.setContentType("text/html; charset=UTF-8");
+            response.setContentType("text/html;charset=utf-8");
             response.getWriter().println(listing);
         }
         else
@@ -601,9 +599,9 @@
     /** Set the response headers.
      * This method is called to set the response headers such as content type and content length.
      * May be extended to add additional headers.
-     * @param response
-     * @param resource
-     * @param mimeType
+     * @param response the http response
+     * @param resource the resource
+     * @param mimeType the mime type
      */
     protected void doResponseHeaders(HttpServletResponse response, Resource resource, String mimeType)
     {
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ScopedHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ScopedHandler.java
index dc1b88f..eae9c2b 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ScopedHandler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ScopedHandler.java
@@ -40,7 +40,7 @@
  * {@link #doHandle(String, Request, HttpServletRequest, HttpServletResponse)} method
  * is called on all contained handlers.</p>
  *
- * <p>For example if Scoped handlers A, B & C were chained together, then
+ * <p>For example if Scoped handlers A, B &amp; C were chained together, then
  * the calling order would be:</p>
  * <pre>
  * A.handle(...)
@@ -52,7 +52,7 @@
  *              C.doHandle(...)
  * </pre>
  *
- * <p>If non scoped handler X was in the chained A, B, X & C, then
+ * <p>If non scoped handler X was in the chained A, B, X &amp; C, then
  * the calling order would be:</p>
  * <pre>
  * A.handle(...)
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/SecuredRedirectHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/SecuredRedirectHandler.java
index 57a6957..a65b783 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/SecuredRedirectHandler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/SecuredRedirectHandler.java
@@ -27,7 +27,6 @@
 import org.eclipse.jetty.http.HttpStatus;
 import org.eclipse.jetty.server.HttpChannel;
 import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.HttpConnection;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.util.URIUtil;
 
@@ -42,7 +41,7 @@
     @Override
     public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
     {
-        HttpChannel<?> channel = baseRequest.getHttpChannel();
+        HttpChannel channel = baseRequest.getHttpChannel();
         if (baseRequest.isSecure() || (channel == null))
         {
             // nothing to do
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ShutdownHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ShutdownHandler.java
index 2c499dc..0b77020 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ShutdownHandler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ShutdownHandler.java
@@ -198,8 +198,10 @@
         doShutdown(baseRequest, response);
     }
 
-    protected void doShutdown(Request baseRequest, HttpServletResponse response) throws IOException {
-        for (Connector connector : getServer().getConnectors()) {
+    protected void doShutdown(Request baseRequest, HttpServletResponse response) throws IOException 
+    {
+        for (Connector connector : getServer().getConnectors()) 
+        {
             connector.shutdown();
         }
 
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/StatisticsHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/StatisticsHandler.java
index 4f4627e..450c54a 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/StatisticsHandler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/StatisticsHandler.java
@@ -21,6 +21,7 @@
 import java.io.IOException;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
@@ -31,7 +32,9 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.eclipse.jetty.http.HttpStatus;
 import org.eclipse.jetty.server.AsyncContextEvent;
+import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.HttpChannelState;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.Response;
@@ -40,12 +43,15 @@
 import org.eclipse.jetty.util.annotation.ManagedObject;
 import org.eclipse.jetty.util.annotation.ManagedOperation;
 import org.eclipse.jetty.util.component.Graceful;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.statistic.CounterStatistic;
 import org.eclipse.jetty.util.statistic.SampleStatistic;
 
 @ManagedObject("Request Statistics Gathering")
 public class StatisticsHandler extends HandlerWrapper implements Graceful
 {
+    private static final Logger LOG = Log.getLogger(StatisticsHandler.class);
     private final AtomicLong _statsStartedAt = new AtomicLong();
 
     private final CounterStatistic _requestStats = new CounterStatistic();
@@ -66,6 +72,8 @@
 
     private final AtomicReference<FutureCallback> _shutdown=new AtomicReference<>();
     
+    private final AtomicBoolean _wrapWarning = new AtomicBoolean();
+    
     private final AsyncListener _onCompletion = new AsyncListener()
     {
         @Override
@@ -135,17 +143,17 @@
     }
 
     @Override
-    public void handle(String path, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException, ServletException
+    public void handle(String path, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
     {
         _dispatchedStats.increment();
 
         final long start;
-        HttpChannelState state = request.getHttpChannelState();
+        HttpChannelState state = baseRequest.getHttpChannelState();
         if (state.isInitial())
         {
             // new request
             _requestStats.increment();
-            start = request.getTimeStamp();
+            start = baseRequest.getTimeStamp();
         }
         else
         {
@@ -156,7 +164,19 @@
 
         try
         {
-            super.handle(path, request, httpRequest, httpResponse);
+            Handler handler = getHandler();
+            if (handler!=null && _shutdown.get()==null && isStarted())
+                handler.handle(path, baseRequest, request, response);
+            else if (baseRequest.isHandled())
+            {
+                if (_wrapWarning.compareAndSet(false,true))
+                    LOG.warn("Bad statistics configuration. Latencies will be incorrect in {}",this);
+            }
+            else
+            {
+                baseRequest.setHandled(true);
+                response.sendError(HttpStatus.SERVICE_UNAVAILABLE_503);
+            }
         }
         finally
         {
@@ -178,13 +198,13 @@
             {
                 long d=_requestStats.decrement();
                 _requestTimeStats.set(dispatched);
-                updateResponse(request);
+                updateResponse(baseRequest);
                 
                 // If we have no more dispatches, should we signal shutdown?
                 FutureCallback shutdown = _shutdown.get();
                 if (shutdown!=null)
                 {
-                    httpResponse.flushBuffer();
+                    response.flushBuffer();
                     if (d==0)
                         shutdown.succeeded();
                 }   
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipFactory.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipFactory.java
new file mode 100644
index 0000000..f0a76b6
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipFactory.java
@@ -0,0 +1,32 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.util.zip.Deflater;
+
+import org.eclipse.jetty.server.Request;
+
+public interface GzipFactory
+{
+    Deflater getDeflater(Request request, long content_length);
+
+    boolean isMimeTypeGzipable(String mimetype);
+
+    void recycle(Deflater deflater);
+}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipHandler.java
new file mode 100644
index 0000000..8a14d13
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipHandler.java
@@ -0,0 +1,604 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import static org.eclipse.jetty.http.GzipHttpContent.ETAG_GZIP_QUOTE;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Set;
+import java.util.zip.Deflater;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.GzipHttpContent;
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MimeTypes;
+import org.eclipse.jetty.http.PathMap;
+import org.eclipse.jetty.server.HttpOutput;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.handler.HandlerWrapper;
+import org.eclipse.jetty.util.IncludeExclude;
+import org.eclipse.jetty.util.RegexSet;
+import org.eclipse.jetty.util.StringUtil;
+import org.eclipse.jetty.util.URIUtil;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+
+/**
+ * A Handler that can dynamically GZIP compress responses.   Unlike 
+ * previous and 3rd party GzipFilters, this mechanism works with asynchronously
+ * generated responses and does not need to wrap the response or it's output
+ * stream.  Instead it uses the efficient {@link org.eclipse.jetty.server.HttpOutput.Interceptor} mechanism.
+ * <p>
+ * The handler can be applied to the entire server (a gzip.mod is included in
+ * the distribution) or it may be applied to individual contexts.
+ * </p>
+ */
+public class GzipHandler extends HandlerWrapper implements GzipFactory
+{
+    private static final Logger LOG = Log.getLogger(GzipHandler.class);
+
+    public final static String GZIP = "gzip";
+    public final static String DEFLATE = "deflate";
+    public final static int DEFAULT_MIN_GZIP_SIZE=16;
+    private int _minGzipSize=DEFAULT_MIN_GZIP_SIZE;
+    private int _compressionLevel=Deflater.DEFAULT_COMPRESSION;
+    private boolean _checkGzExists = true;
+    
+    // non-static, as other GzipHandler instances may have different configurations
+    private final ThreadLocal<Deflater> _deflater = new ThreadLocal<Deflater>();
+
+    private final IncludeExclude<String> _agentPatterns=new IncludeExclude<>(RegexSet.class,RegexSet.MATCHER);
+    private final IncludeExclude<String> _methods = new IncludeExclude<>();
+    private final IncludeExclude<String> _paths = new IncludeExclude<>(PathMap.PathSet.class,PathMap.PathSet.MATCHER);
+    private final IncludeExclude<String> _mimeTypes = new IncludeExclude<>();
+    
+    private HttpField _vary;
+
+
+    /* ------------------------------------------------------------ */
+    /**
+     * Instantiates a new gzip handler.
+     * The excluded Mime Types are initialized to common known 
+     * images, audio, video and other already compressed types.
+     * The included methods is initialized to GET.
+     * The excluded agent patterns are set to exclude MSIE 6.0
+     */
+    public GzipHandler()
+    {
+        _methods.include(HttpMethod.GET.asString());
+        for (String type:MimeTypes.getKnownMimeTypes())
+        {
+            if ("image/svg+xml".equals(type))
+                _paths.exclude("*.svgz");
+            else if (type.startsWith("image/")||
+                type.startsWith("audio/")||
+                type.startsWith("video/"))
+                _mimeTypes.exclude(type);
+        }
+        _mimeTypes.exclude("application/compress");
+        _mimeTypes.exclude("application/zip");
+        _mimeTypes.exclude("application/gzip");
+        _mimeTypes.exclude("application/bzip2");
+        _mimeTypes.exclude("application/x-rar-compressed");
+        LOG.debug("{} mime types {}",this,_mimeTypes);
+        
+        _agentPatterns.exclude(".*MSIE 6.0.*");
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @param patterns Regular expressions matching user agents to exclude
+     */
+    public void addExcludedAgentPatterns(String... patterns)
+    {
+        _agentPatterns.exclude(patterns);
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @param methods The methods to exclude in compression
+     */
+    public void addExcludedMethods(String... methods)
+    {
+        for (String m : methods)
+            _methods.exclude(m);
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * Set the mime types.
+     * @param types The mime types to exclude (without charset or other parameters).
+     * For backward compatibility the mimetypes may be comma separated strings, but this
+     * will not be supported in future versions.
+     */
+    public void addExcludedMimeTypes(String... types)
+    {
+        for (String t : types)
+            _mimeTypes.exclude(StringUtil.csvSplit(t));
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @param pathspecs Path specs (as per servlet spec) to exclude. If a 
+     * ServletContext is available, the paths are relative to the context path,
+     * otherwise they are absolute.
+     * For backward compatibility the pathspecs may be comma separated strings, but this
+     * will not be supported in future versions.
+     */
+    public void addExcludedPaths(String... pathspecs)
+    {
+        for (String p : pathspecs)
+            _paths.exclude(StringUtil.csvSplit(p));
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @param patterns Regular expressions matching user agents to exclude
+     */
+    public void addIncludedAgentPatterns(String... patterns)
+    {
+        _agentPatterns.include(patterns);
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @param methods The methods to include in compression
+     */
+    public void addIncludedMethods(String... methods)
+    {
+        for (String m : methods)
+            _methods.include(m);
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * Add included mime types. Inclusion takes precedence over
+     * exclusion.
+     * @param types The mime types to include (without charset or other parameters)
+     * For backward compatibility the mimetypes may be comma separated strings, but this
+     * will not be supported in future versions.
+     */
+    public void addIncludedMimeTypes(String... types)
+    {
+        for (String t : types)
+            _mimeTypes.include(StringUtil.csvSplit(t));
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * Add path specs to include. Inclusion takes precedence over exclusion.
+     * @param pathspecs Path specs (as per servlet spec) to include. If a 
+     * ServletContext is available, the paths are relative to the context path,
+     * otherwise they are absolute
+     * For backward compatibility the pathspecs may be comma separated strings, but this
+     * will not be supported in future versions.
+     */
+    public void addIncludedPaths(String... pathspecs)
+    {
+        for (String p : pathspecs)
+            _paths.include(StringUtil.csvSplit(p));
+    }
+    
+    /* ------------------------------------------------------------ */
+    @Override
+    protected void doStart() throws Exception
+    {
+        _vary=(_agentPatterns.size()>0)?GzipHttpOutputInterceptor.VARY_ACCEPT_ENCODING_USER_AGENT:GzipHttpOutputInterceptor.VARY_ACCEPT_ENCODING;
+        super.doStart();
+    }
+
+    /* ------------------------------------------------------------ */
+    public boolean getCheckGzExists()
+    {
+        return _checkGzExists;
+    }
+
+    /* ------------------------------------------------------------ */
+    public int getCompressionLevel()
+    {
+        return _compressionLevel;
+    }
+    
+    /* ------------------------------------------------------------ */
+    @Override
+    public Deflater getDeflater(Request request, long content_length)
+    {
+        String ua = request.getHttpFields().get(HttpHeader.USER_AGENT);
+        if (ua!=null && !isAgentGzipable(ua))
+        {
+            LOG.debug("{} excluded user agent {}",this,request);
+            return null;
+        }
+        
+        if (content_length>=0 && content_length<_minGzipSize)
+        {
+            LOG.debug("{} excluded minGzipSize {}",this,request);
+            return null;
+        }
+
+        // If not HTTP/2, then we must check the accept encoding header
+        if (request.getHttpVersion()!=HttpVersion.HTTP_2)
+        {
+            HttpField accept = request.getHttpFields().getField(HttpHeader.ACCEPT_ENCODING);
+
+            if (accept==null)
+            {
+                LOG.debug("{} excluded !accept {}",this,request);
+                return null;
+            }
+            boolean gzip = accept.contains("gzip");
+
+            if (!gzip)
+            {
+                LOG.debug("{} excluded not gzip accept {}",this,request);
+                return null;
+            }
+        }
+        
+        Deflater df = _deflater.get();
+        if (df==null)
+            df=new Deflater(_compressionLevel,true);        
+        else
+            _deflater.set(null);
+        
+        return df;
+    }
+    
+    /* ------------------------------------------------------------ */
+    public String[] getExcludedAgentPatterns()
+    {
+        Set<String> excluded=_agentPatterns.getExcluded();
+        return excluded.toArray(new String[excluded.size()]);
+    }
+
+    /* ------------------------------------------------------------ */
+    public String[] getExcludedMethods()
+    {
+        Set<String> excluded=_methods.getExcluded();
+        return excluded.toArray(new String[excluded.size()]);
+    }
+
+    /* ------------------------------------------------------------ */
+    public String[] getExcludedMimeTypes()
+    {
+        Set<String> excluded=_mimeTypes.getExcluded();
+        return excluded.toArray(new String[excluded.size()]);
+    }
+
+    /* ------------------------------------------------------------ */
+    public String[] getExcludedPaths()
+    {
+        Set<String> excluded=_paths.getExcluded();
+        return excluded.toArray(new String[excluded.size()]);
+    }
+
+    /* ------------------------------------------------------------ */
+    public String[] getIncludedAgentPatterns()
+    {
+        Set<String> includes=_agentPatterns.getIncluded();
+        return includes.toArray(new String[includes.size()]);
+    }
+    
+    /* ------------------------------------------------------------ */
+    public String[] getIncludedMethods()
+    {
+        Set<String> includes=_methods.getIncluded();
+        return includes.toArray(new String[includes.size()]);
+    }
+
+    /* ------------------------------------------------------------ */
+    public String[] getIncludedMimeTypes()
+    {
+        Set<String> includes=_mimeTypes.getIncluded();
+        return includes.toArray(new String[includes.size()]);
+    }
+
+    /* ------------------------------------------------------------ */
+    public String[] getIncludedPaths()
+    {
+        Set<String> includes=_paths.getIncluded();
+        return includes.toArray(new String[includes.size()]);
+    }
+
+    /* ------------------------------------------------------------ */
+    @Deprecated
+    public String[] getMethods()
+    {
+        return getIncludedMethods();
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * Get the minimum reponse size.
+     *
+     * @return minimum reponse size
+     */
+    public int getMinGzipSize()
+    {
+        return _minGzipSize;
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @see org.eclipse.jetty.server.handler.HandlerWrapper#handle(java.lang.String, org.eclipse.jetty.server.Request, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+     */
+    @Override
+    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+    {
+        ServletContext context = baseRequest.getServletContext();
+        String path = context==null?baseRequest.getRequestURI():URIUtil.addPaths(baseRequest.getServletPath(),baseRequest.getPathInfo());
+        LOG.debug("{} handle {} in {}",this,baseRequest,context);
+        
+        HttpOutput out = baseRequest.getResponse().getHttpOutput();   
+        // Are we already being gzipped?
+        HttpOutput.Interceptor interceptor = out.getInterceptor();
+        while (interceptor!=null)
+        {
+            if (interceptor instanceof GzipHttpOutputInterceptor)
+            {
+                LOG.debug("{} already intercepting {}",this,request);
+                _handler.handle(target,baseRequest, request, response);
+                return;
+            }
+            interceptor=interceptor.getNextInterceptor();
+        }
+        
+        // If not a supported method - no Vary because no matter what client, this URI is always excluded
+        if (!_methods.matches(baseRequest.getMethod()))
+        {
+            LOG.debug("{} excluded by method {}",this,request);
+            _handler.handle(target,baseRequest, request, response);
+            return;
+        }
+        
+        // If not a supported URI- no Vary because no matter what client, this URI is always excluded
+        // Use pathInfo because this is be
+        if (!isPathGzipable(path))
+        {
+            LOG.debug("{} excluded by path {}",this,request);
+            _handler.handle(target,baseRequest, request, response);
+            return;
+        }
+
+        // Exclude non compressible mime-types known from URI extension. - no Vary because no matter what client, this URI is always excluded
+        String mimeType = context==null?null:context.getMimeType(path);
+        if (mimeType!=null)
+        {
+            mimeType = MimeTypes.getContentTypeWithoutCharset(mimeType);
+            if (!isMimeTypeGzipable(mimeType))
+            {
+                LOG.debug("{} excluded by path suffix mime type {}",this,request);
+                // handle normally without setting vary header
+                _handler.handle(target,baseRequest, request, response);
+                return;
+            }
+        }
+        
+        if (_checkGzExists && context!=null)
+        {
+            String realpath=request.getServletContext().getRealPath(path);
+            if (realpath!=null)
+            {
+                File gz=new File(realpath+".gz");
+                if (gz.exists())
+                {
+                    LOG.debug("{} gzip exists {}",this,request);
+                    // allow default servlet to handle
+                    _handler.handle(target,baseRequest, request, response);
+                    return;
+                }
+            }
+        }
+        
+        // Special handling for etags
+        String etag = baseRequest.getHttpFields().get(HttpHeader.IF_NONE_MATCH); 
+        if (etag!=null)
+        {
+            int i=etag.indexOf(ETAG_GZIP_QUOTE);
+            if (i>0)
+            {
+                while (i>=0)
+                {
+                    etag=etag.substring(0,i)+etag.substring(i+GzipHttpContent.ETAG_GZIP.length());
+                    i=etag.indexOf(ETAG_GZIP_QUOTE,i);
+                }
+                baseRequest.getHttpFields().put(new HttpField(HttpHeader.IF_NONE_MATCH,etag));
+            }
+        }
+
+        // install interceptor and handle
+        out.setInterceptor(new GzipHttpOutputInterceptor(this,_vary,baseRequest.getHttpChannel(),out.getInterceptor()));
+        if (_handler!=null)
+            _handler.handle(target,baseRequest, request, response);
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * Checks to see if the userAgent is excluded
+     *
+     * @param ua the user agent
+     * @return boolean true if excluded
+     */
+    protected boolean isAgentGzipable(String ua)
+    {
+        if (ua == null)
+            return false;
+        
+        return _agentPatterns.matches(ua);
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public boolean isMimeTypeGzipable(String mimetype)
+    {
+        return _mimeTypes.matches(mimetype);
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * Checks to see if the path is included or not excluded 
+     *
+     * @param requestURI
+     *            the request uri
+     * @return boolean true if gzipable
+     */
+    protected boolean isPathGzipable(String requestURI)
+    {
+        if (requestURI == null)
+            return true;
+        
+        return _paths.matches(requestURI);
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public void recycle(Deflater deflater)
+    {
+        deflater.reset();
+        if (_deflater.get()==null)
+            _deflater.set(deflater);
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @param checkGzExists If true, check if a static gz file exists for
+     * the resource that the DefaultServlet may serve as precompressed.
+     */
+    public void setCheckGzExists(boolean checkGzExists)
+    {
+        _checkGzExists = checkGzExists;
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @param compressionLevel  The compression level to use to initialize {@link Deflater#setLevel(int)}
+     */
+    public void setCompressionLevel(int compressionLevel)
+    {
+        _compressionLevel = compressionLevel;
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @param patterns Regular expressions matching user agents to exclude
+     */
+    public void setExcludedAgentPatterns(String... patterns)
+    {
+        _agentPatterns.getExcluded().clear();
+        addExcludedAgentPatterns(patterns);
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @param method to exclude
+     */
+    public void setExcludedMethods(String... method)
+    {
+        _methods.getExcluded().clear();
+        _methods.exclude(method);
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * Set the mime types.
+     * @param types The mime types to exclude (without charset or other parameters)
+     */
+    public void setExcludedMimeTypes(String... types)
+    {
+        _mimeTypes.getExcluded().clear();
+        _mimeTypes.exclude(types);
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @param pathspecs Path specs (as per servlet spec) to exclude. If a 
+     * ServletContext is available, the paths are relative to the context path,
+     * otherwise they are absolute.
+     */
+    public void setExcludedPaths(String... pathspecs)
+    {
+        _paths.getExcluded().clear();
+        _paths.exclude(pathspecs);
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @param patterns Regular expressions matching user agents to include
+     */
+    public void setIncludedAgentPatterns(String... patterns)
+    {
+        _agentPatterns.getIncluded().clear();
+        addIncludedAgentPatterns(patterns);
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @param methods The methods to include in compression
+     */
+    public void setIncludedMethods(String... methods)
+    {
+        _methods.getIncluded().clear();
+        _methods.include(methods);
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * Set included mime types. Inclusion takes precedence over
+     * exclusion.
+     * @param types The mime types to include (without charset or other parameters)
+     */
+    public void setIncludedMimeTypes(String... types)
+    {
+        _mimeTypes.getIncluded().clear();
+        _mimeTypes.include(types);
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * Set the path specs to include. Inclusion takes precedence over exclusion.
+     * @param pathspecs Path specs (as per servlet spec) to include. If a 
+     * ServletContext is available, the paths are relative to the context path,
+     * otherwise they are absolute
+     */
+    public void setIncludedPaths(String... pathspecs)
+    {
+        _paths.getIncluded().clear();
+        _paths.include(pathspecs);
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * Set the minimum response size to trigger dynamic compresssion
+     *
+     * @param minGzipSize minimum response size in bytes
+     */
+    public void setMinGzipSize(int minGzipSize)
+    {
+        _minGzipSize = minGzipSize;
+    }
+}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipHttpOutputInterceptor.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipHttpOutputInterceptor.java
new file mode 100644
index 0000000..0aa28d7
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipHttpOutputInterceptor.java
@@ -0,0 +1,368 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.nio.ByteBuffer;
+import java.nio.channels.WritePendingException;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.zip.CRC32;
+import java.util.zip.Deflater;
+
+import org.eclipse.jetty.http.GzipHttpContent;
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.MimeTypes;
+import org.eclipse.jetty.http.PreEncodedHttpField;
+import org.eclipse.jetty.server.HttpChannel;
+import org.eclipse.jetty.server.HttpOutput;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.IteratingNestedCallback;
+import org.eclipse.jetty.util.StringUtil;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+public class GzipHttpOutputInterceptor implements HttpOutput.Interceptor
+{
+    public static Logger LOG = Log.getLogger(GzipHttpOutputInterceptor.class);
+    private final static byte[] GZIP_HEADER = new byte[] { (byte)0x1f, (byte)0x8b, Deflater.DEFLATED, 0, 0, 0, 0, 0, 0, 0 };
+
+    public final static HttpField VARY_ACCEPT_ENCODING_USER_AGENT=new PreEncodedHttpField(HttpHeader.VARY,HttpHeader.ACCEPT_ENCODING+", "+HttpHeader.USER_AGENT);
+    public final static HttpField VARY_ACCEPT_ENCODING=new PreEncodedHttpField(HttpHeader.VARY,HttpHeader.ACCEPT_ENCODING.asString());
+    
+    private enum GZState {  MIGHT_COMPRESS, NOT_COMPRESSING, COMMITTING, COMPRESSING, FINISHED};
+    private final AtomicReference<GZState> _state = new AtomicReference<>(GZState.MIGHT_COMPRESS);
+    private final CRC32 _crc = new CRC32();
+
+    private final GzipFactory _factory;
+    private final HttpOutput.Interceptor _interceptor;
+    private final HttpChannel _channel;
+    private final HttpField _vary;
+    private final int _bufferSize;
+    
+    private Deflater _deflater;
+    private ByteBuffer _buffer;
+
+    public GzipHttpOutputInterceptor(GzipFactory factory, HttpChannel channel, HttpOutput.Interceptor next)
+    {
+        this(factory,VARY_ACCEPT_ENCODING_USER_AGENT,channel.getHttpConfiguration().getOutputBufferSize(),channel,next);
+    }
+    
+    public GzipHttpOutputInterceptor(GzipFactory factory, HttpField vary, HttpChannel channel, HttpOutput.Interceptor next)
+    {
+        this(factory,vary,channel.getHttpConfiguration().getOutputBufferSize(),channel,next);
+    }
+    
+    public GzipHttpOutputInterceptor(GzipFactory factory, HttpField vary, int bufferSize, HttpChannel channel, HttpOutput.Interceptor next)
+    {
+        _factory=factory;
+        _channel=channel;
+        _interceptor=next;
+        _vary=vary;
+        _bufferSize=bufferSize;
+    }
+
+    public HttpOutput.Interceptor getNextInterceptor()
+    {
+        return _interceptor;
+    }
+    
+    @Override
+    public boolean isOptimizedForDirectBuffers()
+    {
+        return false; // No point as deflator is in user space.
+    }
+    
+    
+    @Override
+    public void write(ByteBuffer content, boolean complete, Callback callback)
+    {
+        switch (_state.get())
+        {
+            case MIGHT_COMPRESS:
+                commit(content,complete,callback);
+                break;
+                
+            case NOT_COMPRESSING:
+                _interceptor.write(content, complete, callback);
+                return;
+                
+            case COMMITTING:
+                callback.failed(new WritePendingException());
+                break;
+
+            case COMPRESSING:
+                gzip(content,complete,callback);
+                break;
+
+            default:
+                callback.failed(new IllegalStateException("state="+_state.get()));
+                break;
+        }
+    }
+
+    private void addTrailer()
+    {
+        int i=_buffer.limit();
+        _buffer.limit(i+8);
+        
+        int v=(int)_crc.getValue();
+        _buffer.put(i++,(byte)(v & 0xFF));
+        _buffer.put(i++,(byte)((v>>>8) & 0xFF));
+        _buffer.put(i++,(byte)((v>>>16) & 0xFF));
+        _buffer.put(i++,(byte)((v>>>24) & 0xFF));
+        
+        v=_deflater.getTotalIn();
+        _buffer.put(i++,(byte)(v & 0xFF));
+        _buffer.put(i++,(byte)((v>>>8) & 0xFF));
+        _buffer.put(i++,(byte)((v>>>16) & 0xFF));
+        _buffer.put(i++,(byte)((v>>>24) & 0xFF));
+    }
+    
+    
+    private void gzip(ByteBuffer content, boolean complete, final Callback callback)
+    {
+        if (content.hasRemaining() || complete)
+            new GzipBufferCB(content,complete,callback).iterate();
+        else
+            callback.succeeded();
+    }
+
+    protected void commit(ByteBuffer content, boolean complete, Callback callback)
+    {
+        // Are we excluding because of status?
+        int sc = _channel.getResponse().getStatus();
+        if (sc>0 && (sc<200 || sc==204 || sc==205 || sc>=300))
+        {
+            LOG.debug("{} exclude by status {}",this,sc);
+            noCompression();
+            _interceptor.write(content, complete, callback);
+            return;
+        }
+        
+        // Are we excluding because of mime-type?
+        String ct = _channel.getResponse().getContentType();
+        if (ct!=null)
+        {
+            ct=MimeTypes.getContentTypeWithoutCharset(ct);
+            if (!_factory.isMimeTypeGzipable(StringUtil.asciiToLowerCase(ct)))
+            {
+                LOG.debug("{} exclude by mimeType {}",this,ct);
+                noCompression();
+                _interceptor.write(content, complete, callback);
+                return;
+            }
+        }
+        
+        // Has the Content-Encoding header already been set?
+        String ce=_channel.getResponse().getHeader("Content-Encoding");
+        if (ce != null)
+        {
+            LOG.debug("{} exclude by content-encoding {}",this,ce);
+            noCompression();
+            _interceptor.write(content, complete, callback);
+            return;
+        }
+        
+        // Are we the thread that commits?
+        if (_state.compareAndSet(GZState.MIGHT_COMPRESS,GZState.COMMITTING))
+        {
+            // We are varying the response due to accept encoding header.
+            HttpFields fields = _channel.getResponse().getHttpFields();
+            fields.add(_vary);
+
+            long content_length = _channel.getResponse().getContentLength();
+            if (content_length<0 && complete)
+                content_length=content.remaining();
+            
+            _deflater = _factory.getDeflater(_channel.getRequest(),content_length);
+            
+            if (_deflater==null)
+            {
+                LOG.debug("{} exclude no deflater",this);
+                _state.set(GZState.NOT_COMPRESSING);
+                _interceptor.write(content, complete, callback);
+                return;
+            }
+
+            fields.put(GzipHttpContent.CONTENT_ENCODING_GZIP);
+            _crc.reset();
+            _buffer=_channel.getByteBufferPool().acquire(_bufferSize,false);
+            BufferUtil.fill(_buffer,GZIP_HEADER,0,GZIP_HEADER.length);
+
+            // Adjust headers
+            _channel.getResponse().setContentLength(-1);
+            String etag=fields.get(HttpHeader.ETAG);
+            if (etag!=null)
+            {
+                int end = etag.length()-1;
+                etag=(etag.charAt(end)=='"')?etag.substring(0,end)+GzipHttpContent.ETAG_GZIP+'"':etag+GzipHttpContent.ETAG_GZIP;
+                fields.put(HttpHeader.ETAG,etag);
+            }
+            
+            LOG.debug("{} compressing {}",this,_deflater);
+            _state.set(GZState.COMPRESSING);
+            
+            gzip(content,complete,callback);
+        }
+        else
+            callback.failed(new WritePendingException());
+    }
+
+    public void noCompression()
+    {
+        while (true)
+        {
+            switch (_state.get())
+            {
+                case NOT_COMPRESSING:
+                    return;
+
+                case MIGHT_COMPRESS:
+                    if (_state.compareAndSet(GZState.MIGHT_COMPRESS,GZState.NOT_COMPRESSING))
+                        return;
+                    break;
+
+                default:
+                    throw new IllegalStateException(_state.get().toString());
+            }
+        }
+    }
+
+    public void noCompressionIfPossible()
+    {
+        while (true)
+        {
+            switch (_state.get())
+            {
+                case COMPRESSING:
+                case NOT_COMPRESSING:
+                    return;
+
+                case MIGHT_COMPRESS:
+                    if (_state.compareAndSet(GZState.MIGHT_COMPRESS,GZState.NOT_COMPRESSING))
+                        return;
+                    break;
+
+                default:
+                    throw new IllegalStateException(_state.get().toString());
+            }
+        }
+    }
+    
+    public boolean mightCompress()
+    {
+        return _state.get()==GZState.MIGHT_COMPRESS;
+    }
+    
+    private class GzipBufferCB extends IteratingNestedCallback
+    {        
+        private ByteBuffer _copy;
+        private final ByteBuffer _content;
+        private final boolean _last;
+        public GzipBufferCB(ByteBuffer content, boolean complete, Callback callback)
+        {
+            super(callback);
+            _content=content;
+            _last=complete;
+        }
+
+        @Override
+        protected Action process() throws Exception
+        {
+            if (_deflater==null)
+                return Action.SUCCEEDED;
+                
+            if (_deflater.needsInput())
+            {                
+                if (BufferUtil.isEmpty(_content))
+                {                    
+                    if (_deflater.finished())
+                    {
+                        _factory.recycle(_deflater);
+                        _deflater=null;
+                        _channel.getByteBufferPool().release(_buffer);
+                        _buffer=null;
+                        if (_copy!=null)
+                        {
+                            _channel.getByteBufferPool().release(_copy);
+                            _copy=null;
+                        }
+                        return Action.SUCCEEDED;
+                    }
+                    
+                    if (!_last)
+                    {
+                        return Action.SUCCEEDED;
+                    }
+                    
+                    _deflater.finish();
+                }
+                else if (_content.hasArray())
+                {
+                    byte[] array=_content.array();
+                    int off=_content.arrayOffset()+_content.position();
+                    int len=_content.remaining();
+                    BufferUtil.clear(_content);
+                    
+                    _crc.update(array,off,len);
+                    _deflater.setInput(array,off,len);                
+                    if (_last)
+                        _deflater.finish();
+                }
+                else
+                {
+                    if (_copy==null)
+                        _copy=_channel.getByteBufferPool().acquire(_bufferSize,false);
+                    BufferUtil.clearToFill(_copy);
+                    int took=BufferUtil.put(_content,_copy);
+                    BufferUtil.flipToFlush(_copy,0);
+                    if (took==0)
+                        throw new IllegalStateException();
+                   
+                    byte[] array=_copy.array();
+                    int off=_copy.arrayOffset()+_copy.position();
+                    int len=_copy.remaining();
+
+                    _crc.update(array,off,len);
+                    _deflater.setInput(array,off,len);                
+                    if (_last && BufferUtil.isEmpty(_content))
+                        _deflater.finish();
+                }
+            }
+
+            BufferUtil.compact(_buffer);
+            int off=_buffer.arrayOffset()+_buffer.limit();
+            int len=_buffer.capacity()-_buffer.limit() - (_last?8:0);
+            if (len>0)
+            {
+                int produced=_deflater.deflate(_buffer.array(),off,len,Deflater.NO_FLUSH);
+                _buffer.limit(_buffer.limit()+produced);
+            }
+            boolean finished=_deflater.finished();
+            
+            if (finished)
+                addTrailer();
+                
+            _interceptor.write(_buffer,finished,this);
+            return Action.SCHEDULED;
+        }
+    }
+}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/package-info.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/package-info.java
new file mode 100644
index 0000000..13fe7f6
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/package-info.java
@@ -0,0 +1,23 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+/**
+ * Jetty GZIP Handler 
+ */
+package org.eclipse.jetty.server.handler.gzip;
+
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSession.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSession.java
index 9ed8b82..06281e3 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSession.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSession.java
@@ -23,6 +23,7 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSessionActivationListener;
@@ -45,7 +46,7 @@
 public abstract class AbstractSession implements AbstractSessionManager.SessionIf
 {
     final static Logger LOG = SessionHandler.LOG;
-    public final static String SESSION_KNOWN_ONLY_TO_AUTHENTICATED="org.eclipse.jetty.security.sessionKnownOnlytoAuthenticated";
+    public final static String SESSION_CREATED_SECURE="org.eclipse.jetty.security.sessionCreatedSecure";
     private  String _clusterId; // ID without any node (ie "worker") id appended
     private  String _nodeId;    // ID of session with node(ie "worker") id appended
     private final AbstractSessionManager _manager;
@@ -97,6 +98,7 @@
     /* ------------------------------------------------------------- */
     /**
      * asserts that the session is valid
+     * @throws IllegalStateException if the sesion is invalid
      */
     protected void checkValid() throws IllegalStateException
     {
@@ -106,8 +108,8 @@
     
     /* ------------------------------------------------------------- */
     /** Check to see if session has expired as at the time given.
-     * @param time
-     * @return
+     * @param time the time in milliseconds
+     * @return true if expired
      */
     protected boolean checkExpiry(long time)
     {
@@ -154,6 +156,12 @@
     {
         return _cookieSet;
     }
+    
+    /* ------------------------------------------------------------- */
+    public void setCookieSetTime(long time)
+    {
+        _cookieSet = time;
+    }
 
     /* ------------------------------------------------------------- */
     @Override
@@ -463,11 +471,12 @@
     
     /* ------------------------------------------------------------ */
     /**
-     * @param name
-     * @param value
+     * @param name the name of the attribute
+     * @param value the value of the attribute
+     * @return true if attribute changed
      * @deprecated use changeAttribute(String,Object) instead
-     * @return
      */
+    @Deprecated
     protected boolean updateAttribute (String name, Object value)
     {
         Object old=null;
@@ -497,9 +506,9 @@
      * in the session. The appropriate session attribute listeners are
      * also called.
      * 
-     * @param name
-     * @param value
-     * @return
+     * @param name the name of the attribute
+     * @param value the value of the attribute
+     * @return the old value for the attribute
      */
     protected Object changeAttribute (String name, Object value)
     {
@@ -559,7 +568,11 @@
     }
 
     /* ------------------------------------------------------------- */
-    /** If value implements HttpSessionBindingListener, call valueBound() */
+    /** 
+     * Bind value if value implements {@link HttpSessionBindingListener} (calls {@link HttpSessionBindingListener#valueBound(HttpSessionBindingEvent)}) 
+     * @param name the name with which the object is bound or unbound  
+     * @param value the bound value
+     */
     public void bindValue(java.lang.String name, Object value)
     {
         if (value!=null&&value instanceof HttpSessionBindingListener)
@@ -600,7 +613,11 @@
     }
 
     /* ------------------------------------------------------------- */
-    /** If value implements HttpSessionBindingListener, call valueUnbound() */
+    /**
+     * Unbind value if value implements {@link HttpSessionBindingListener} (calls {@link HttpSessionBindingListener#valueUnbound(HttpSessionBindingEvent)}) 
+     * @param name the name with which the object is bound or unbound  
+     * @param value the bound value
+     */
     public void unbindValue(java.lang.String name, Object value)
     {
         if (value!=null&&value instanceof HttpSessionBindingListener)
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionIdManager.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionIdManager.java
index ba55a2e..32cff50 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionIdManager.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionIdManager.java
@@ -67,13 +67,13 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * Set the workname. If set, the workername is dot appended to the session
+     * Set the workername. If set, the workername is dot appended to the session
      * ID and can be used to assist session affinity in a load balancer.
      * A worker name starting with $ is used as a request attribute name to
      * lookup the worker name that can be dynamically set by a request
-     * customiser.
+     * Customizer.
      *
-     * @param workerName
+     * @param workerName the name of the worker
      */
     public void setWorkerName(String workerName)
     {
@@ -244,8 +244,8 @@
 
     /** Get the session ID with any worker ID.
      *
-     * @param clusterId
-     * @param request
+     * @param clusterId the cluster id
+     * @param request the request
      * @return sessionId plus any worker ID.
      */
     @Override
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionManager.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionManager.java
index 5a2e1b4..a833ae7 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionManager.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionManager.java
@@ -53,15 +53,12 @@
 import org.eclipse.jetty.util.statistic.CounterStatistic;
 import org.eclipse.jetty.util.statistic.SampleStatistic;
 
-/* ------------------------------------------------------------ */
 /**
- * An Abstract implementation of SessionManager. The partial implementation of
- * SessionManager interface provides the majority of the handling required to
- * implement a SessionManager. Concrete implementations of SessionManager based
- * on AbstractSessionManager need only implement the newSession method to return
- * a specialised version of the Session inner class that provides an attribute
- * Map.
+ * An Abstract implementation of SessionManager.
  * <p>
+ * The partial implementation of SessionManager interface provides the majority of the handling required to implement a
+ * SessionManager. Concrete implementations of SessionManager based on AbstractSessionManager need only implement the
+ * newSession method to return a specialized version of the Session inner class that provides an attribute Map.
  */
 @SuppressWarnings("deprecation")
 @ManagedObject("Abstract Session Manager")
@@ -405,6 +402,7 @@
     /**
      * HTTPS request. Can be overridden by setting SessionCookieConfig.setSecure(true),
      * in which case the session cookie will be marked as secure on both HTTPS and HTTP.
+     * @param secureRequestOnly true to set Session Cookie Config as secure
      */
     public void setSecureRequestOnly(boolean secureRequestOnly)
     {
@@ -423,7 +421,7 @@
      * A sessioncookie is marked as secure IFF any of the following conditions are true:
      * <ol>
      * <li>SessionCookieConfig.setSecure == true</li>
-     * <li>SessionCookieConfig.setSecure == false && _secureRequestOnly==true && request is HTTPS</li>
+     * <li>SessionCookieConfig.setSecure == false &amp;&amp; _secureRequestOnly==true &amp;&amp; request is HTTPS</li>
      * </ol>
      * According to SessionCookieConfig javadoc, case 1 can be used when:
      * "... even though the request that initiated the session came over HTTP,
@@ -431,14 +429,16 @@
      * SSL offloading load balancer. In this case, the traffic between the client
      * and the load balancer will be over HTTPS, whereas the traffic between the
      * load balancer and the web container will be over HTTP."
-     *
+     * <p>
      * For case 2, you can use _secureRequestOnly to determine if you want the
-     * Servlet Spec 3.0  default behaviour when SessionCookieConfig.setSecure==false,
+     * Servlet Spec 3.0  default behavior when SessionCookieConfig.setSecure==false,
      * which is:
+     * <cite>
      * "they shall be marked as secure only if the request that initiated the
      * corresponding session was also secure"
-     *
-     * The default for _secureRequestOnly is true, which gives the above behaviour. If
+     * </cite>
+     * <p>
+     * The default for _secureRequestOnly is true, which gives the above behavior. If
      * you set it to false, then a session cookie is NEVER marked as secure, even if
      * the initiating request was secure.
      *
@@ -563,6 +563,8 @@
     {
         AbstractSession session=newSession(request);
         session.setMaxInactiveInterval(_dftMaxIdleSecs);
+        if (request.isSecure())
+            session.setAttribute(AbstractSession.SESSION_CREATED_SECURE, Boolean.TRUE);
         addSession(session,true);
         return session;
     }
@@ -613,9 +615,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @param seconds
-     */
     @Override
     public void setMaxInactiveInterval(int seconds)
     {
@@ -670,6 +669,8 @@
     /**
      * Add the session Registers the session with this manager and registers the
      * session ID with the sessionIDManager;
+     * @param session the session
+     * @param created true if session was created
      */
     protected void addSession(AbstractSession session, boolean created)
     {
@@ -702,7 +703,7 @@
     /**
      * Prepare sessions for session manager shutdown
      * 
-     * @throws Exception
+     * @throws Exception if unable to shutdown sesssions
      */
     protected abstract void shutdownSessions() throws Exception;
 
@@ -710,7 +711,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Create a new session instance
-     * @param request
+     * @param request the request to build the session from
      * @return the new session
      */
     protected abstract AbstractSession newSession(HttpServletRequest request);
@@ -747,10 +748,12 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** Remove session from manager
+    /** 
+     * Remove session from manager
      * @param session The session to remove
      * @param invalidate True if {@link HttpSessionListener#sessionDestroyed(HttpSessionEvent)} and
      * {@link SessionIdManager#invalidateAll(String)} should be called.
+     * @return if the session was removed 
      */
     public boolean removeSession(AbstractSession session, boolean invalidate)
     {
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashSessionIdManager.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashSessionIdManager.java
index 65e5033..da34b38 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashSessionIdManager.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashSessionIdManager.java
@@ -32,6 +32,8 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
+import org.eclipse.jetty.server.SessionIdManager;
+
 /* ------------------------------------------------------------ */
 /**
  * HashSessionIdManager. An in-memory implementation of the session ID manager.
@@ -62,6 +64,7 @@
 
     /* ------------------------------------------------------------ */
     /**
+     * @param id the id of the session
      * @return Collection of Sessions for the passed session ID
      */
     public Collection<HttpSession> getSession(String id)
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashSessionManager.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashSessionManager.java
index 89e8e13..0039aad 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashSessionManager.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashSessionManager.java
@@ -599,11 +599,13 @@
                 if (isDeleteUnrestorableSessions() && file.exists() && file.getParentFile().equals(_storeDir) )
                 {
                     file.delete();
-                    LOG.warn("Deleting file for unrestorable session "+idInCuster, error);
+                    LOG.warn("Deleting file for unrestorable session {} {}",idInCuster,error);
+                    __log.debug(error);
                 }
                 else
                 {
-                    __log.warn("Problem restoring session "+idInCuster, error);
+                    __log.warn("Problem restoring session {} {}",idInCuster, error);
+                    __log.debug(error);
                 }
             }
             else
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashedSession.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashedSession.java
index 8e8e365..b89c7f9 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashedSession.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashedSession.java
@@ -245,6 +245,7 @@
      *
      * The session is idled by persisting it, then clearing the session values attribute map and finally setting
      * it to an idled state.
+     * @throws Exception if unable to save session
      */
     public synchronized void idle()
     throws Exception
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionIdManager.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionIdManager.java
index 68cc12e..3bfb8ba 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionIdManager.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionIdManager.java
@@ -530,7 +530,7 @@
          * Convert a camel case identifier into either upper or lower
          * depending on the way the db stores identifiers.
          *
-         * @param identifier
+         * @param identifier the raw identifier
          * @return the converted identifier
          */
         public String convertIdentifier (String identifier)
@@ -629,8 +629,8 @@
     /**
      * Configure jdbc connection information via a jdbc Driver
      *
-     * @param driverClassName
-     * @param connectionUrl
+     * @param driverClassName the driver classname
+     * @param connectionUrl the driver connection url
      */
     public void setDriverInfo (String driverClassName, String connectionUrl)
     {
@@ -641,8 +641,8 @@
     /**
      * Configure jdbc connection information via a jdbc Driver
      *
-     * @param driverClass
-     * @param connectionUrl
+     * @param driverClass the driver class
+     * @param connectionUrl the driver connection url
      */
     public void setDriverInfo (Driver driverClass, String connectionUrl)
     {
@@ -682,9 +682,10 @@
     }
 
     /**
-     * @param name
+     * @param name the name of the blob
      * @deprecated see DbAdaptor.setBlobType
      */
+    @Deprecated
     public void setBlobType (String name)
     {
         _dbAdaptor.setBlobType(name);
@@ -704,27 +705,30 @@
     }
 
     /**
-     * @return
+     * @return the blob type
      * @deprecated see DbAdaptor.getBlobType
      */
+    @Deprecated
     public String getBlobType ()
     {
         return _dbAdaptor.getBlobType();
     }
 
     /**
-     * @return
+     * @return the long type
      * @deprecated see DbAdaptor.getLogType
      */
+    @Deprecated
     public String getLongType()
     {
         return _dbAdaptor.getLongType();
     }
 
     /**
-     * @param longType
+     * @param longType the long type
      * @deprecated see DbAdaptor.setLongType
      */
+    @Deprecated
     public void setLongType(String longType)
     {
        _dbAdaptor.setLongType(longType);
@@ -1026,7 +1030,7 @@
      * Get a connection from the driver or datasource.
      *
      * @return the connection for the datasource
-     * @throws SQLException
+     * @throws SQLException if unable to get the connection
      */
     protected Connection getConnection ()
     throws SQLException
@@ -1036,11 +1040,6 @@
         else
             return DriverManager.getConnection(_connectionUrl);
     }
-    
-
-
-
-
 
     /**
      * Set up the tables in the database
@@ -1251,6 +1250,8 @@
      */
     private void scavenge ()
     {
+        Set<String> candidateIds = getAllCandidateExpiredSessionIds();
+        
         Connection connection = null;
         try
         {
@@ -1284,7 +1285,7 @@
                         }
                     }
                 }
-                scavengeSessions(expiredSessionIds, false);
+                scavengeSessions(candidateIds, expiredSessionIds, false);
 
 
                 //Pass 2: find sessions that have expired a while ago for which this node was their last manager
@@ -1307,7 +1308,7 @@
                                 if (LOG.isDebugEnabled()) LOG.debug ("Found expired sessionId="+sessionId+" last managed by "+getWorkerName());
                             }
                         }
-                        scavengeSessions(expiredSessionIds, false);
+                        scavengeSessions(candidateIds, expiredSessionIds, false);
                     }
 
 
@@ -1330,9 +1331,13 @@
                                 if (LOG.isDebugEnabled()) LOG.debug ("Found expired sessionId="+sessionId);
                             }
                         }
-                        scavengeSessions(expiredSessionIds, true);
+                        scavengeSessions(candidateIds, expiredSessionIds, true);
                     }
                 }
+                
+                //Tell session managers to check remaining sessions in memory that may have expired 
+                //but are no longer in the database
+                scavengeSessions(candidateIds);
             }
         }
         catch (Exception e)
@@ -1364,24 +1369,20 @@
     /**
      * @param expiredSessionIds
      */
-    private void scavengeSessions (Set<String> expiredSessionIds, boolean forceDelete)
+    private void scavengeSessions (Set<String> candidateIds, Set<String> expiredSessionIds, boolean forceDelete)
     {       
         Set<String> remainingIds = new HashSet<String>(expiredSessionIds);
-        Handler[] contexts = _server.getChildHandlersByClass(ContextHandler.class);
-        for (int i=0; contexts!=null && i<contexts.length; i++)
+        Set<SessionManager> managers = getAllSessionManagers();
+        for (SessionManager m:managers)
         {
-            SessionHandler sessionHandler = ((ContextHandler)contexts[i]).getChildHandlerByClass(SessionHandler.class);
-            if (sessionHandler != null)
+            Set<String> successfullyExpiredIds = ((JDBCSessionManager)m).expire(expiredSessionIds);
+            if (successfullyExpiredIds != null)
             {
-                SessionManager manager = sessionHandler.getSessionManager();
-                if (manager != null && manager instanceof JDBCSessionManager)
-                {
-                    Set<String> successfullyExpiredIds = ((JDBCSessionManager)manager).expire(expiredSessionIds);
-                    if (successfullyExpiredIds != null)
-                        remainingIds.removeAll(successfullyExpiredIds);
-                }
+                remainingIds.removeAll(successfullyExpiredIds);
+                candidateIds.removeAll(successfullyExpiredIds);
             }
         }
+    
 
         //Any remaining ids are of those sessions that no context removed
         if (!remainingIds.isEmpty() && forceDelete)
@@ -1403,6 +1404,63 @@
             }
         }
     }
+    
+    /**
+     * These are the session ids that the session managers thought had 
+     * expired, but were not expired in the database. This could be
+     * because the session is live on another node, or that the
+     * session no longer exists in the database because some other
+     * node removed it.
+     * @param candidateIds
+     */
+    private void scavengeSessions (Set<String> candidateIds)
+    {
+        if (candidateIds.isEmpty())
+            return;
+        
+        
+        Set<SessionManager> managers = getAllSessionManagers();
+        
+        for (SessionManager m:managers)
+        {
+            //tell the session managers to check the sessions that have expired in memory
+            //if they are no longer in the database, they should be removed
+            ((JDBCSessionManager)m).expireCandidates(candidateIds);
+        }
+    }
+    
+    private Set<String>  getAllCandidateExpiredSessionIds()
+    {
+        HashSet<String> candidateIds = new HashSet<>();
+        
+        Set<SessionManager> managers = getAllSessionManagers();
+        
+        for (SessionManager m:managers)
+        {
+            candidateIds.addAll(((JDBCSessionManager)m).getCandidateExpiredIds());
+        }
+        
+        return candidateIds;
+    }
+    
+    
+    private Set<SessionManager> getAllSessionManagers()
+    {
+        HashSet<SessionManager> managers = new HashSet<>();
+    
+        Handler[] contexts = _server.getChildHandlersByClass(ContextHandler.class);
+        for (int i=0; contexts!=null && i<contexts.length; i++)
+        {
+            SessionHandler sessionHandler = ((ContextHandler)contexts[i]).getChildHandlerByClass(SessionHandler.class);
+            if (sessionHandler != null)
+            {
+                SessionManager manager = sessionHandler.getSessionManager();
+                if (manager != null && manager instanceof JDBCSessionManager)
+                    managers.add(manager);
+            }
+        }
+        return managers;
+    }
 
 
    
@@ -1412,7 +1470,7 @@
     {
         if (expiredIds == null || expiredIds.isEmpty())
             return;
-
+        
         String[] ids = expiredIds.toArray(new String[expiredIds.size()]);
         try (Connection con = getConnection())
         {
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionManager.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionManager.java
index 66c98be..7b86fbb 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionManager.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionManager.java
@@ -37,6 +37,10 @@
 import java.util.concurrent.atomic.AtomicReference;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSessionEvent;
+import javax.servlet.http.HttpSessionListener;
+
+import org.eclipse.jetty.server.SessionIdManager;
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.server.session.JDBCSessionIdManager.SessionTableSchema;
 import org.eclipse.jetty.util.ClassLoadingObjectInputStream;
@@ -44,23 +48,24 @@
 import org.eclipse.jetty.util.log.Logger;
 
 /**
- * JDBCSessionManager
- *
+ * JDBCSessionManager.
+ * <p>
  * SessionManager that persists sessions to a database to enable clustering.
- *
+ * <p>
  * Session data is persisted to the JettySessions table:
- *
- * rowId (unique in cluster: webapp name/path + virtualhost + sessionId)
- * contextPath (of the context owning the session)
- * sessionId (unique in a context)
- * lastNode (name of node last handled session)
- * accessTime (time in milliseconds session was accessed)
- * lastAccessTime (previous time in milliseconds session was accessed)
- * createTime (time in milliseconds session created)
- * cookieTime (time in milliseconds session cookie created)
- * lastSavedTime (last time in milliseconds session access times were saved)
- * expiryTime (time in milliseconds that the session is due to expire)
- * map (attribute map)
+ * <dl>
+ * <dt>rowId</dt><dd>(unique in cluster: webapp name/path + virtualhost + sessionId)</dd>
+ * <dt>contextPath</dt><dd>(of the context owning the session)</dd>
+ * <dt>sessionId</dt><dd>(unique in a context)</dd>
+ * <dt>lastNode</dt><dd>(name of node last handled session)</dd>
+ * <dt>accessTime</dt><dd>(time in milliseconds session was accessed)</dd>
+ * <dt>lastAccessTime</dt><dd>(previous time in milliseconds session was accessed)</dd>
+ * <dt>createTime</dt><dd>(time in milliseconds session created)</dd>
+ * <dt>cookieTime</dt><dd>(time in milliseconds session cookie created)</dd>
+ * <dt>lastSavedTime</dt><dd>(last time in milliseconds session access times were saved)</dd>
+ * <dt>expiryTime</dt><dd>(time in milliseconds that the session is due to expire)</dd>
+ * <dt>map</dt><dd>(attribute map)</dd>
+ * </dl>
  *
  * As an optimization, to prevent thrashing the database, we do not persist
  * the accessTime and lastAccessTime every time the session is accessed. Rather,
@@ -94,10 +99,7 @@
         protected boolean _dirty=false;
         
         
-        /**
-         * Time in msec since the epoch that a session cookie was set for this session
-         */
-        protected long _cookieSet;
+     
         
         
         /**
@@ -139,7 +141,7 @@
         /**
          * Session from a request.
          *
-         * @param request
+         * @param request the request
          */
         protected Session (HttpServletRequest request)
         {
@@ -154,10 +156,11 @@
         
         /**
          * Session restored from database
-         * @param sessionId
-         * @param rowId
-         * @param created
-         * @param accessed
+         * @param sessionId the session id
+         * @param rowId the row id
+         * @param created the created timestamp
+         * @param accessed the access timestamp
+         * @param maxInterval the max inactive interval (in seconds)
          */
         protected Session (String sessionId, String rowId, long created, long accessed, long maxInterval)
         {
@@ -219,16 +222,7 @@
             return _canonicalContext;
         }
         
-        public void setCookieSet (long ms)
-        {
-            _cookieSet = ms;
-        }
-
-        public synchronized long getCookieSet ()
-        {
-            return _cookieSet;
-        }
-
+       
         public synchronized void setLastNode (String node)
         {
             _lastNode=node;
@@ -257,11 +251,6 @@
                 _dirty=true;
         }
 
-        @Override
-        protected void cookieSet()
-        {
-            _cookieSet = getAccessed();
-        }
 
         /**
          * Entry to session.
@@ -396,7 +385,7 @@
         {
             return "Session rowId="+_rowId+",id="+getId()+",lastNode="+_lastNode+
                             ",created="+getCreationTime()+",accessed="+getAccessed()+
-                            ",lastAccessed="+getLastAccessedTime()+",cookieSet="+_cookieSet+
+                            ",lastAccessed="+getLastAccessedTime()+",cookieSet="+getCookieSetTime()+
                             ",maxInterval="+getMaxInactiveInterval()+",lastSaved="+_lastSaved+",expiry="+_expiryTime;
         }
     }
@@ -420,7 +409,7 @@
      * If any session attribute does change, then the attributes and
      * the accessed time are persisted.
      *
-     * @param sec
+     * @param sec the save interval in seconds
      */
     public void setSaveInterval (long sec)
     {
@@ -443,7 +432,7 @@
      * This could be used eg with a JMS backplane to notify nodes
      * that the session has changed and to delete the session from
      * the node's cache, and re-read it from the database.
-     * @param session
+     * @param session the session to invalidate
      */
     public void cacheInvalidate (Session session)
     {
@@ -580,6 +569,11 @@
             }
             else
             {
+                if (memSession != null)
+                {
+                    //Session must have been removed from db by another node
+                    removeSession(memSession, true);
+                }
                 //No session in db with matching id and context path.
                 LOG.debug("getSession({}): No session in database matching id={}",idInCluster,idInCluster);
             }
@@ -706,7 +700,7 @@
     /**
      * Invalidate a session.
      *
-     * @param idInCluster
+     * @param idInCluster the id in the cluster
      */
     protected void invalidateSession (String idInCluster)
     {
@@ -781,15 +775,6 @@
         return new Session(request);
     }
     
-    
-    /**
-     * @param sessionId
-     * @param rowId
-     * @param created
-     * @param accessed
-     * @param maxInterval
-     * @return
-     */
     protected AbstractSession newSession (String sessionId, String rowId, long created, long accessed, long maxInterval)
     {
         return new Session(sessionId, rowId, created, accessed, maxInterval);
@@ -823,7 +808,8 @@
      * Expire any Sessions we have in memory matching the list of
      * expired Session ids.
      *
-     * @param sessionIds
+     * @param sessionIds the session ids to expire
+     * @return the set of successfully expired ids
      */
     protected Set<String> expire (Set<String> sessionIds)
     {
@@ -885,12 +871,61 @@
         }
     }
     
-  
+    protected void expireCandidates (Set<String> candidateIds)
+    {
+        Iterator<String> itor = candidateIds.iterator();
+        long now = System.currentTimeMillis();
+        while (itor.hasNext())
+        {
+            String id = itor.next();
+
+            //check if expired in db
+            try
+            {
+                Session memSession = _sessions.get(id);
+                if (memSession == null)
+                {
+                    continue; //no longer in memory
+                }
+
+                Session s = loadSession(id,  canonicalize(_context.getContextPath()), getVirtualHost(_context));
+                if (s == null)
+                {
+                    //session no longer exists, can be safely expired
+                    memSession.timeout();
+                }
+            }
+            catch (Exception e)
+            {
+                LOG.warn("Error checking db for expiry for session {}", id);
+            }
+        }
+    }
+    
+    protected Set<String> getCandidateExpiredIds ()
+    {
+        HashSet<String> expiredIds = new HashSet<>();
+
+        Iterator<String> itor = _sessions.keySet().iterator();
+        while (itor.hasNext())
+        {
+            String id = itor.next();
+            //check to see if session should have expired
+            Session session = _sessions.get(id);
+            if (session._expiryTime > 0 &&  System.currentTimeMillis() > session._expiryTime)
+                expiredIds.add(id);           
+        }
+        return expiredIds;
+    }
+
+
     /**
      * Load a session from the database
-     * @param id
+     * @param id the id
+     * @param canonicalContextPath the canonical context path
+     * @param vhost the virtual host
      * @return the session data that was loaded
-     * @throws Exception
+     * @throws Exception if unable to load the session
      */
     protected Session loadSession (final String id, final String canonicalContextPath, final String vhost)
     throws Exception
@@ -921,7 +956,7 @@
                                                   result.getLong(_sessionTableSchema.getCreateTimeColumn()), 
                                                   result.getLong(_sessionTableSchema.getAccessTimeColumn()), 
                                                   maxInterval);
-                        session.setCookieSet(result.getLong(_sessionTableSchema.getCookieTimeColumn()));
+                        session.setCookieSetTime(result.getLong(_sessionTableSchema.getCookieTimeColumn()));
                         session.setLastAccessedTime(result.getLong(_sessionTableSchema.getLastAccessTimeColumn()));
                         session.setLastNode(result.getString(_sessionTableSchema.getLastNodeColumn()));
                         session.setLastSaved(result.getLong(_sessionTableSchema.getLastSavedTimeColumn()));
@@ -954,7 +989,7 @@
         if (_context==null)
             load.run();
         else
-            _context.getContextHandler().handle(load);
+            _context.getContextHandler().handle(null,load);
 
         if (_exception.get()!=null)
         {
@@ -970,8 +1005,8 @@
     /**
      * Insert a session into the database.
      *
-     * @param session
-     * @throws Exception
+     * @param session the session
+     * @throws Exception if unable to store the session
      */
     protected void storeSession (Session session)
     throws Exception
@@ -995,7 +1030,7 @@
             statement.setLong(6, session.getAccessed());//accessTime
             statement.setLong(7, session.getLastAccessedTime()); //lastAccessTime
             statement.setLong(8, session.getCreationTime()); //time created
-            statement.setLong(9, session.getCookieSet());//time cookie was set
+            statement.setLong(9, session.getCookieSetTime());//time cookie was set
             statement.setLong(10, now); //last saved time
             statement.setLong(11, session.getExpiryTime());
             statement.setLong(12, session.getMaxInactiveInterval());
@@ -1023,7 +1058,7 @@
      * Update data on an existing persisted session.
      *
      * @param data the session
-     * @throws Exception
+     * @throws Exception if unable to update the session
      */
     protected void updateSession (Session data)
     throws Exception
@@ -1066,7 +1101,7 @@
      * Update the node on which the session was last seen to be my node.
      *
      * @param data the session
-     * @throws Exception
+     * @throws Exception if unable to update the session node
      */
     protected void updateSessionNode (Session data)
     throws Exception
@@ -1120,8 +1155,8 @@
      * Delete a session from the database. Should only be called
      * when the session has been invalidated.
      *
-     * @param data
-     * @throws Exception
+     * @param data the session data
+     * @throws Exception if unable to delete the session
      */
     protected void deleteSession (Session data)
     throws Exception
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionHandler.java
index dbbe4d6..629388f 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionHandler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionHandler.java
@@ -158,7 +158,7 @@
                 session = baseRequest.getSession(false);
                 if (session != null)
                 {
-                    if (session != old_session)
+                    if ((session != old_session) && (request.getDispatcherType() == DispatcherType.ASYNC || request.getDispatcherType() == DispatcherType.REQUEST))
                     {
                         access = session;
                         HttpCookie cookie = _sessionManager.access(session,request.isSecure());
@@ -192,11 +192,14 @@
         }
         finally
         {
+            //if we accessed an existing session entering this context, then complete it
             if (access != null)
                 _sessionManager.complete(access);
 
+            
+            //if there is a session that was created during handling this context, then complete it
             HttpSession session = baseRequest.getSession(false);
-            if (session != null && old_session == null && session != access)
+            if ((session != null && old_session == null && session != access) && (request.getDispatcherType() == DispatcherType.ASYNC || request.getDispatcherType() == DispatcherType.REQUEST))
                 _sessionManager.complete(session);
 
             if (old_session_manager != null && old_session_manager != _sessionManager)
@@ -228,8 +231,8 @@
     /**
      * Look for a requested session ID in cookies and URI parameters
      *
-     * @param baseRequest
-     * @param request
+     * @param baseRequest the request to check
+     * @param request the request to check
      */
     protected void checkRequestedSessionId(Request baseRequest, HttpServletRequest request)
     {
@@ -321,9 +324,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @param listener
-     */
     public void addEventListener(EventListener listener)
     {
         if (_sessionManager != null)
@@ -331,9 +331,6 @@
     }
     
     /* ------------------------------------------------------------ */
-    /**
-     * @param listener
-     */
     public void removeEventListener(EventListener listener)
     {
         if (_sessionManager != null)
diff --git a/jetty-server/src/test/config/etc/keystore b/jetty-server/src/test/config/etc/keystore
new file mode 100644
index 0000000..d6592f9
--- /dev/null
+++ b/jetty-server/src/test/config/etc/keystore
Binary files differ
diff --git a/jetty-server/src/main/config/etc/keystore.pkf b/jetty-server/src/test/config/etc/keystore.pkf
similarity index 100%
rename from jetty-server/src/main/config/etc/keystore.pkf
rename to jetty-server/src/test/config/etc/keystore.pkf
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/AbstractHttpTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/AbstractHttpTest.java
index ae6a977..3468b6c 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/AbstractHttpTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/AbstractHttpTest.java
@@ -18,9 +18,6 @@
 
 package org.eclipse.jetty.server;
 
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
@@ -29,22 +26,29 @@
 import java.net.Socket;
 import java.net.URISyntaxException;
 import java.nio.charset.StandardCharsets;
-
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.eclipse.jetty.io.ArrayByteBufferPool;
 import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.eclipse.jetty.toolchain.test.TestTracker;
 import org.eclipse.jetty.toolchain.test.http.SimpleHttpParser;
 import org.eclipse.jetty.toolchain.test.http.SimpleHttpResponse;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.StdErrLog;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
 
 public abstract class AbstractHttpTest
 {
+    @Rule
+    public TestTracker tracker = new TestTracker();
+
     protected static Server server;
     protected static ServerConnector connector;
     protected String httpVersion;
@@ -80,11 +84,10 @@
         socket.setSoTimeout((int)connector.getIdleTimeout());
         BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8));
         PrintWriter writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
-        String request = "GET / " + httpVersion + "\r\n";
 
-        writer.write(request);
-        writer.write("Host: localhost");
-        writer.println("\r\n");
+        writer.write("GET / " + httpVersion + "\r\n");
+        writer.write("Host: localhost\r\n");
+        writer.write("\r\n");
         writer.flush();
 
         SimpleHttpResponse response = httpParser.readResponse(reader);
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/AsyncRequestReadTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/AsyncRequestReadTest.java
index 9078f39..d188105 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/AsyncRequestReadTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/AsyncRequestReadTest.java
@@ -18,11 +18,6 @@
 
 package org.eclipse.jetty.server;
 
-import static org.hamcrest.Matchers.containsString;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
@@ -47,6 +42,11 @@
 import org.junit.Before;
 import org.junit.Test;
 
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
 public class AsyncRequestReadTest
 {
     private static Server server;
@@ -75,11 +75,11 @@
     {
         server.setHandler(new AsyncStreamHandler());
         server.start();
-        
+
         try (final Socket socket =  new Socket("localhost",connector.getLocalPort()))
         {
             socket.setSoTimeout(1000);
-            
+
             byte[] content = new byte[32*4096];
             Arrays.fill(content, (byte)120);
 
@@ -93,8 +93,8 @@
             byte[] h=header.getBytes(StandardCharsets.ISO_8859_1);
             out.write(h);
             out.write(content);
-            
-            
+
+
             header=
                 "POST / HTTP/1.1\r\n"+
                     "Host: localhost\r\n"+
@@ -123,7 +123,7 @@
     {
         server.setHandler(new AsyncStreamHandler());
         server.start();
-        
+
         asyncReadTest(64,4,4,20);
         asyncReadTest(256,16,16,50);
         asyncReadTest(256,1,128,10);
@@ -184,7 +184,7 @@
 
             final AsyncContext async = request.startAsync();
             // System.err.println("handle "+request.getContentLength());
-            
+
             new Thread()
             {
                 @Override
@@ -194,7 +194,7 @@
                     try(InputStream in = request.getInputStream();)
                     {
                         // System.err.println("reading...");
-                        
+
                         byte[] b = new byte[4*4096];
                         int read;
                         while((read =in.read(b))>=0)
@@ -216,18 +216,18 @@
             }.start();
         }
     }
-    
+
 
     @Test
     public void testPartialRead() throws Exception
     {
         server.setHandler(new PartialReaderHandler());
         server.start();
-        
+
         try (final Socket socket =  new Socket("localhost",connector.getLocalPort()))
         {
-            socket.setSoTimeout(1000);
-            
+            socket.setSoTimeout(10000);
+
             byte[] content = new byte[32*4096];
             Arrays.fill(content, (byte)88);
 
@@ -241,7 +241,7 @@
             byte[] h=header.getBytes(StandardCharsets.ISO_8859_1);
             out.write(h);
             out.write(content);
-            
+
             header= "POST /?read=10 HTTP/1.1\r\n"+
                     "Host: localhost\r\n"+
                     "Content-Length: "+content.length+"\r\n"+
@@ -252,7 +252,7 @@
             out.write(h);
             out.write(content);
             out.flush();
-            
+
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             assertThat(in.readLine(),containsString("HTTP/1.1 200 OK"));
             assertThat(in.readLine(),containsString("Content-Length:"));
@@ -273,11 +273,11 @@
     {
         server.setHandler(new PartialReaderHandler());
         server.start();
-        
+
         try (final Socket socket =  new Socket("localhost",connector.getLocalPort()))
         {
             socket.setSoTimeout(10000);
-            
+
             byte[] content = new byte[32*4096];
             Arrays.fill(content, (byte)88);
 
@@ -308,11 +308,11 @@
     {
         server.setHandler(new PartialReaderHandler());
         server.start();
-        
+
         try (final Socket socket =  new Socket("localhost",connector.getLocalPort()))
         {
             socket.setSoTimeout(1000);
-            
+
             byte[] content = new byte[32*4096];
             Arrays.fill(content, (byte)88);
 
@@ -334,7 +334,7 @@
             assertThat(in.readLine(),containsString("Server:"));
             in.readLine();
             assertThat(in.readLine(),containsString("XXXXXXX"));
-            
+
             socket.close();
         }
     }
@@ -346,7 +346,7 @@
         {
             httpResponse.setStatus(200);
             request.setHandled(true);
-                        
+
             BufferedReader in = request.getReader();
             PrintWriter out =httpResponse.getWriter();
             int read=Integer.valueOf(request.getParameter("read"));
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/AsyncStressTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/AsyncStressTest.java
index 7c3f4c9..4b8a77e 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/AsyncStressTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/AsyncStressTest.java
@@ -202,7 +202,7 @@
             long resume_after=-1;
             long complete_after=-1;
 
-            final String uri=baseRequest.getUri().toString();
+            final String uri=baseRequest.getHttpURI().toString();
 
             if (request.getParameter("read")!=null)
                 read_before=Integer.parseInt(request.getParameter("read"));
@@ -255,7 +255,7 @@
                                     Request br=(Request)asyncContext.getRequest();
                                     System.err.println("\n"+e.toString());
                                     System.err.println(baseRequest+"=="+br);
-                                    System.err.println(uri+"=="+br.getUri());
+                                    System.err.println(uri+"=="+br.getHttpURI());
                                     System.err.println(asyncContext+"=="+br.getHttpChannelState());
 
                                     LOG.warn(e);
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ConnectionOpenCloseTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ConnectionOpenCloseTest.java
index e56b4b0..61c4583 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/ConnectionOpenCloseTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ConnectionOpenCloseTest.java
@@ -188,8 +188,8 @@
         server.start();
 
         final AtomicInteger callbacks = new AtomicInteger();
-        final CountDownLatch openLatch = new CountDownLatch(1);
-        final CountDownLatch closeLatch = new CountDownLatch(1);
+        final CountDownLatch openLatch = new CountDownLatch(2);
+        final CountDownLatch closeLatch = new CountDownLatch(2);
         connector.addBean(new Connection.Listener.Adapter()
         {
             @Override
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ConnectorCloseTestBase.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ConnectorCloseTestBase.java
index 6201c80..22c27c6 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/ConnectorCloseTestBase.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ConnectorCloseTestBase.java
@@ -30,11 +30,14 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
+import org.eclipse.jetty.toolchain.test.AdvancedRunner;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 
 /**
  * HttpServer Tester.
  */
+@RunWith(AdvancedRunner.class)
 public abstract class ConnectorCloseTestBase extends HttpServerTestFixture
 {
     private static String __content =
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ConnectorTimeoutTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ConnectorTimeoutTest.java
index 373218d..caad449 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/ConnectorTimeoutTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ConnectorTimeoutTest.java
@@ -18,11 +18,17 @@
 
 package org.eclipse.jetty.server;
 
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.net.Socket;
 import java.net.SocketException;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
 import java.util.concurrent.Exchanger;
 import java.util.concurrent.TimeUnit;
 
@@ -31,16 +37,29 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.eclipse.jetty.io.AbstractConnection;
 import org.eclipse.jetty.io.EndPoint;
 import org.eclipse.jetty.io.ssl.SslConnection;
 import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.eclipse.jetty.toolchain.test.AdvancedRunner;
+import org.eclipse.jetty.toolchain.test.TestTracker;
 import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.StdErrLog;
 import org.hamcrest.Matchers;
 import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 
+@RunWith(AdvancedRunner.class)
 public abstract class ConnectorTimeoutTest extends HttpServerTestFixture
 {
+    @Rule
+    public TestTracker tracker = new TestTracker();
+    
     protected static final int MAX_IDLE_TIME=500;
     private int sleepTime = MAX_IDLE_TIME + MAX_IDLE_TIME/5;
     private int minimumTestRuntime = MAX_IDLE_TIME-MAX_IDLE_TIME/5;
@@ -51,8 +70,15 @@
         System.setProperty("org.eclipse.jetty.io.nio.IDLE_TICK","100");
     }
 
+    @Before
+    public void before()
+    {
+        super.before();
+        if (_httpConfiguration!=null)
+            _httpConfiguration.setBlockingTimeout(-1L);
+    }
 
-    @Test
+    @Test(timeout=60000)
     public void testMaxIdleWithRequest10() throws Exception
     {
         configureServer(new HelloWorldHandler());
@@ -82,7 +108,7 @@
         Assert.assertTrue(System.currentTimeMillis() - start < maximumTestRuntime);
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testMaxIdleWithRequest11() throws Exception
     {
         configureServer(new EchoHandler());
@@ -115,7 +141,7 @@
         Assert.assertTrue(System.currentTimeMillis() - start < maximumTestRuntime);
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testMaxIdleWithRequest10NoClientClose() throws Exception
     {
         final Exchanger<EndPoint> exchanger = new Exchanger<>();
@@ -189,7 +215,7 @@
         Assert.assertFalse(endPoint.isOpen());
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testMaxIdleWithRequest10ClientIgnoresClose() throws Exception
     {
         final Exchanger<EndPoint> exchanger = new Exchanger<>();
@@ -265,7 +291,7 @@
         Assert.assertFalse(endPoint.isOpen());
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testMaxIdleWithRequest11NoClientClose() throws Exception
     {
         final Exchanger<EndPoint> exchanger = new Exchanger<>();
@@ -342,7 +368,232 @@
         Assert.assertFalse(endPoint.isOpen());
     }
 
-    @Test
+    @Test(timeout=60000)
+    @Ignore // TODO make more stable
+    public void testNoBlockingTimeoutRead() throws Exception
+    {
+        _httpConfiguration.setBlockingTimeout(-1L);
+        
+        configureServer(new EchoHandler());
+        Socket client=newSocket(_serverURI.getHost(),_serverURI.getPort());
+        client.setSoTimeout(10000);
+        InputStream is=client.getInputStream();
+        Assert.assertFalse(client.isClosed());
+
+        OutputStream os=client.getOutputStream();
+        os.write(("GET / HTTP/1.1\r\n"+
+                "host: "+_serverURI.getHost()+":"+_serverURI.getPort()+"\r\n"+
+                "Transfer-Encoding: chunked\r\n" +
+                "Content-Type: text/plain\r\n" +
+                "Connection: close\r\n" +
+                "\r\n"+
+                "5\r\n"+
+                "LMNOP\r\n")
+                .getBytes("utf-8"));
+        os.flush();
+
+        long start = System.currentTimeMillis();
+        try
+        {
+            Thread.sleep(250);
+            os.write("1".getBytes("utf-8"));
+            os.flush();
+            Thread.sleep(250);
+            os.write("0".getBytes("utf-8"));
+            os.flush();
+            Thread.sleep(250);
+            os.write("\r".getBytes("utf-8"));
+            os.flush();
+            Thread.sleep(250);
+            os.write("\n".getBytes("utf-8"));
+            os.flush();
+            Thread.sleep(250);
+            os.write("0123456789ABCDEF\r\n".getBytes("utf-8"));
+            os.write("0\r\n".getBytes("utf-8"));
+            os.write("\r\n".getBytes("utf-8"));
+            os.flush();   
+        }
+        catch(Exception e)
+        {
+            e.printStackTrace();
+        }
+        long duration=System.currentTimeMillis() - start;
+        Assert.assertThat(duration,Matchers.greaterThan(500L));
+
+        // read the response
+        String response = IO.toString(is);
+        Assert.assertThat(response,Matchers.startsWith("HTTP/1.1 200 OK"));
+        Assert.assertThat(response,Matchers.containsString("LMNOP0123456789ABCDEF"));
+
+    }
+    
+    @Test(timeout=60000)
+    @Ignore // TODO make more stable
+    public void testBlockingTimeoutRead() throws Exception
+    {
+        _httpConfiguration.setBlockingTimeout(750L);
+        
+        configureServer(new EchoHandler());
+        Socket client=newSocket(_serverURI.getHost(),_serverURI.getPort());
+        client.setSoTimeout(10000);
+        InputStream is=client.getInputStream();
+        Assert.assertFalse(client.isClosed());
+
+        OutputStream os=client.getOutputStream();
+        os.write(("GET / HTTP/1.1\r\n"+
+                "host: "+_serverURI.getHost()+":"+_serverURI.getPort()+"\r\n"+
+                "Transfer-Encoding: chunked\r\n" +
+                "Content-Type: text/plain\r\n" +
+                "Connection: close\r\n" +
+                "\r\n"+
+                "5\r\n"+
+                "LMNOP\r\n")
+                .getBytes("utf-8"));
+        os.flush();
+
+        long start = System.currentTimeMillis();
+        try
+        {
+            ((StdErrLog)Log.getLogger(HttpChannel.class)).setHideStacks(true);
+            Thread.sleep(300);
+            os.write("1".getBytes("utf-8"));
+            os.flush();
+            Thread.sleep(300);
+            os.write("0".getBytes("utf-8"));
+            os.flush();
+            Thread.sleep(300);
+            os.write("\r".getBytes("utf-8"));
+            os.flush();
+            Thread.sleep(300);
+            os.write("\n".getBytes("utf-8"));
+            os.flush();
+            Thread.sleep(300);
+            os.write("0123456789ABCDEF\r\n".getBytes("utf-8"));
+            os.write("0\r\n".getBytes("utf-8"));
+            os.write("\r\n".getBytes("utf-8"));
+            os.flush();   
+        }
+        catch(Exception e)
+        {
+        }
+        finally
+        {
+            ((StdErrLog)Log.getLogger(HttpChannel.class)).setHideStacks(false);
+        }
+        long duration=System.currentTimeMillis() - start;
+        Assert.assertThat(duration,Matchers.greaterThan(500L));
+        
+        try
+        {
+            // read the response
+            String response = IO.toString(is);
+            Assert.assertThat(response,Matchers.startsWith("HTTP/1.1 500 "));
+            Assert.assertThat(response,Matchers.containsString("InterruptedIOException"));
+        }
+        catch(SSLException e)
+        {
+        }
+
+    }
+
+    @Test(timeout=60000)
+    @Ignore // TODO make more stable
+    public void testNoBlockingTimeoutWrite() throws Exception
+    {
+        configureServer(new HugeResponseHandler());
+        Socket client=newSocket(_serverURI.getHost(),_serverURI.getPort());
+        client.setSoTimeout(10000);
+
+        Assert.assertFalse(client.isClosed());
+
+        OutputStream os=client.getOutputStream();
+        BufferedReader is=new BufferedReader(new InputStreamReader(client.getInputStream(),StandardCharsets.ISO_8859_1),2048);
+
+        os.write((
+                "GET / HTTP/1.0\r\n"+
+                "host: "+_serverURI.getHost()+":"+_serverURI.getPort()+"\r\n"+
+                "connection: keep-alive\r\n"+
+                "Connection: close\r\n"+
+        "\r\n").getBytes("utf-8"));
+        os.flush();
+        
+        // read the header
+        String line=is.readLine();
+        Assert.assertThat(line,Matchers.startsWith("HTTP/1.1 200 OK"));
+        while(line.length()!=0)
+            line=is.readLine();
+        
+        for (int i=0;i<(128*1024);i++)
+        {
+            if (i%1028==0)
+            {
+                Thread.sleep(20);
+                // System.err.println("read "+System.currentTimeMillis());
+            }
+            line=is.readLine();
+            Assert.assertThat(line,Matchers.notNullValue());
+            Assert.assertEquals(1022,line.length());
+        }
+    }
+
+    @Test(timeout=60000)
+    @Ignore // TODO make more stable
+    public void testBlockingTimeoutWrite() throws Exception
+    {
+        _httpConfiguration.setBlockingTimeout(750L);
+        configureServer(new HugeResponseHandler());
+        Socket client=newSocket(_serverURI.getHost(),_serverURI.getPort());
+        client.setSoTimeout(10000);
+
+        Assert.assertFalse(client.isClosed());
+
+        OutputStream os=client.getOutputStream();
+        BufferedReader is=new BufferedReader(new InputStreamReader(client.getInputStream(),StandardCharsets.ISO_8859_1),2048);
+
+        os.write((
+                "GET / HTTP/1.0\r\n"+
+                "host: "+_serverURI.getHost()+":"+_serverURI.getPort()+"\r\n"+
+                "connection: keep-alive\r\n"+
+                "Connection: close\r\n"+
+        "\r\n").getBytes("utf-8"));
+        os.flush();
+        
+        // read the header
+        String line=is.readLine();
+        Assert.assertThat(line,Matchers.startsWith("HTTP/1.1 200 OK"));
+        while(line.length()!=0)
+            line=is.readLine();
+
+        long start=System.currentTimeMillis();
+        try
+        {
+            ((StdErrLog)Log.getLogger(HttpChannel.class)).setHideStacks(true);
+            ((StdErrLog)Log.getLogger(AbstractConnection.class)).setHideStacks(true);
+            for (int i=0;i<(128*1024);i++)
+            {
+                if (i%1028==0)
+                {
+                    Thread.sleep(20);
+                    // System.err.println("read "+System.currentTimeMillis());
+                }
+                line=is.readLine();
+                if (line==null)
+                    break;
+            }
+        }
+        catch(Throwable e)
+        {}
+        finally
+        {
+            ((StdErrLog)Log.getLogger(AbstractConnection.class)).setHideStacks(false);
+            ((StdErrLog)Log.getLogger(HttpChannel.class)).setHideStacks(false);
+        }
+        long end=System.currentTimeMillis();
+        long duration = end-start;
+        Assert.assertThat(duration,Matchers.lessThan(20L*128L));
+    }
+    
+    @Test(timeout=60000)
     public void testMaxIdleNoRequest() throws Exception
     {
         configureServer(new EchoHandler());
@@ -351,6 +602,38 @@
         InputStream is=client.getInputStream();
         Assert.assertFalse(client.isClosed());
 
+        OutputStream os=client.getOutputStream();
+        os.write("GET ".getBytes("utf-8"));
+        os.flush();
+
+        Thread.sleep(sleepTime);
+        long start = System.currentTimeMillis();
+        try
+        {
+            IO.toString(is);
+            Assert.assertEquals(-1, is.read());
+        }
+        catch(SSLException e)
+        {
+            e.printStackTrace();
+        }
+        catch(Exception e)
+        {
+            e.printStackTrace();
+        }
+        Assert.assertTrue(System.currentTimeMillis() - start < maximumTestRuntime);
+
+    }
+
+    @Test(timeout=60000)
+    public void testMaxIdleNothingSent() throws Exception
+    {
+        configureServer(new EchoHandler());
+        Socket client=newSocket(_serverURI.getHost(),_serverURI.getPort());
+        client.setSoTimeout(10000);
+        InputStream is=client.getInputStream();
+        Assert.assertFalse(client.isClosed());
+
         Thread.sleep(sleepTime);
         long start = System.currentTimeMillis();
         try
@@ -360,7 +643,7 @@
         }
         catch(SSLException e)
         {
-
+            // e.printStackTrace();
         }
         catch(Exception e)
         {
@@ -370,7 +653,7 @@
 
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testMaxIdleWithSlowRequest() throws Exception
     {
         configureServer(new EchoHandler());
@@ -410,7 +693,7 @@
         }
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testMaxIdleWithSlowResponse() throws Exception
     {
         configureServer(new SlowResponseHandler());
@@ -439,7 +722,7 @@
         }
     }
 
-    @Test
+    @Test(timeout=60000)
     public void testMaxIdleWithWait() throws Exception
     {
         configureServer(new WaitHandler());
@@ -482,6 +765,27 @@
             out.close();
         }
     }
+    
+    protected static class HugeResponseHandler extends AbstractHandler
+    {
+        @Override
+        public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+        {
+            baseRequest.setHandled(true);
+            response.setStatus(200);
+            OutputStream out = response.getOutputStream();
+            byte[] buffer = new byte[128*1024*1024];
+            Arrays.fill(buffer,(byte)'x');
+            for (int i=0;i<128*1024;i++)
+            {
+                buffer[i*1024+1022]='\r';
+                buffer[i*1024+1023]='\n';
+            }
+            ByteBuffer bb = ByteBuffer.wrap(buffer);
+            ((HttpOutput)out).sendContent(bb);
+            out.close();
+        }
+    }
 
     protected static class WaitHandler extends AbstractHandler
     {
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/DumpHandler.java b/jetty-server/src/test/java/org/eclipse/jetty/server/DumpHandler.java
index c46ab4a..2fa7fd6 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/DumpHandler.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/DumpHandler.java
@@ -106,6 +106,8 @@
         writer.write("<pre>\ncontentType="+request.getContentType()+"\n</pre>\n");
         writer.write("<pre>\nencoding="+request.getCharacterEncoding()+"\n</pre>\n");
         writer.write("<pre>\nservername="+request.getServerName()+"\n</pre>\n");
+        writer.write("<pre>\nlocal="+request.getLocalAddr()+":"+request.getLocalPort()+"\n</pre>\n");
+        writer.write("<pre>\nremote="+request.getRemoteAddr()+":"+request.getRemotePort()+"\n</pre>\n");
         writer.write("<h3>Header:</h3><pre>");
         writer.write(request.getMethod()+" "+request.getRequestURI()+" "+request.getProtocol()+"\n");
         Enumeration<String> headers = request.getHeaderNames();
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ExtendedServerTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ExtendedServerTest.java
index be46562..7a16f50 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/ExtendedServerTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ExtendedServerTest.java
@@ -21,7 +21,6 @@
 import java.io.IOException;
 import java.io.OutputStream;
 import java.net.Socket;
-import java.nio.ByteBuffer;
 import java.nio.channels.SelectionKey;
 import java.nio.channels.SocketChannel;
 import java.nio.charset.StandardCharsets;
@@ -30,12 +29,11 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.eclipse.jetty.http.HttpMethod;
 import org.eclipse.jetty.http.HttpVersion;
 import org.eclipse.jetty.io.Connection;
 import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.ManagedSelector;
 import org.eclipse.jetty.io.SelectChannelEndPoint;
-import org.eclipse.jetty.io.SelectorManager.ManagedSelector;
 import org.eclipse.jetty.server.handler.AbstractHandler;
 import org.eclipse.jetty.util.thread.Scheduler;
 import org.hamcrest.Matchers;
@@ -80,10 +78,10 @@
         }
 
         @Override
-        public void onSelected()
+        public Runnable onSelected()
         {
             _lastSelected=System.currentTimeMillis();
-            super.onSelected();
+            return super.onSelected();
         }
 
         long getLastSelected()
@@ -100,15 +98,15 @@
         }
 
         @Override
-        protected HttpChannelOverHttp newHttpChannel(HttpInput<ByteBuffer> httpInput)
+        protected HttpChannelOverHttp newHttpChannel()
         {
-            return new HttpChannelOverHttp(getConnector(), getHttpConfiguration(), getEndPoint(), this, httpInput)
+            return new HttpChannelOverHttp(this, getConnector(), getHttpConfiguration(), getEndPoint(), this)
             {
                 @Override
-                public boolean startRequest(HttpMethod httpMethod, String method, ByteBuffer uri, HttpVersion version)
+                public boolean startRequest(String method, String uri, HttpVersion version)
                 {
                     getRequest().setAttribute("DispatchedAt",((ExtendedEndPoint)getEndPoint()).getLastSelected());
-                    return super.startRequest(httpMethod,method,uri,version);
+                    return super.startRequest(method,uri,version);
                 }
             };
         }
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/GracefulStopTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/GracefulStopTest.java
index 696533e..58ddd5a 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/GracefulStopTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/GracefulStopTest.java
@@ -18,116 +18,286 @@
 
 package org.eclipse.jetty.server;
 
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.lessThan;
+import static org.junit.Assert.assertThat;
+
+import java.io.EOFException;
 import java.io.IOException;
+import java.io.InputStream;
+import java.net.ConnectException;
 import java.net.Socket;
-import java.nio.charset.StandardCharsets;
+import java.nio.channels.ClosedChannelException;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.eclipse.jetty.io.EofException;
 import org.eclipse.jetty.server.handler.AbstractHandler;
 import org.eclipse.jetty.server.handler.StatisticsHandler;
 import org.eclipse.jetty.util.IO;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.StdErrLog;
 import org.hamcrest.Matchers;
 import org.junit.Assert;
-import org.junit.Before;
 import org.junit.Test;
 
-public class GracefulStopTest
+public class GracefulStopTest 
 {
-    private Server server;
-
-    @Before
-    public void setup() throws Exception
+    /**
+     * Test of standard graceful timeout mechanism when a block request does
+     * not complete
+     * @throws Exception on test failure
+     */
+    @Test
+    public void testGracefulNoWaiter() throws Exception
     {
-        server = new Server(0);
-        StatisticsHandler stats = new StatisticsHandler();
-        TestHandler test=new TestHandler();
-        server.setHandler(stats);
-        stats.setHandler(test);
-        server.setStopTimeout(10 * 1000);
-        
+        Server server= new Server();
+        server.setStopTimeout(1000);
+
+        ServerConnector connector = new ServerConnector(server);
+        connector.setPort(0);
+        server.addConnector(connector);
+
+        TestHandler handler = new TestHandler();
+        server.setHandler(handler);
+
         server.start();
+        final int port=connector.getLocalPort();
+        Socket client = new Socket("127.0.0.1", port);
+        client.getOutputStream().write((
+                "POST / HTTP/1.0\r\n"+
+                        "Host: localhost:"+port+"\r\n" +
+                        "Content-Type: plain/text\r\n" +
+                        "Content-Length: 10\r\n" +
+                        "\r\n"+
+                        "12345"
+                ).getBytes());
+        client.getOutputStream().flush();
+        handler.latch.await();
+
+        long start = System.nanoTime();
+        server.stop();
+        long stop = System.nanoTime();
+        
+        // No Graceful waiters
+        assertThat(TimeUnit.NANOSECONDS.toMillis(stop-start),lessThan(900L));
+
+        assertThat(client.getInputStream().read(),Matchers.is(-1));
+
+        assertThat(handler.handling.get(),Matchers.is(false));
+        assertThat(handler.thrown.get(),
+                Matchers.anyOf(
+                instanceOf(ClosedChannelException.class),
+                instanceOf(EofException.class),
+                instanceOf(EOFException.class))
+                );
+
+        client.close();
     }
 
+    /**
+     * Test of standard graceful timeout mechanism when a block request does
+     * not complete
+     * @throws Exception on test failure
+     */
     @Test
-    public void testGraceful() throws Exception
+    public void testGracefulTimeout() throws Exception
     {
-        new Thread()
-        {
-            @Override
-            public void run()
-            {
-                try
-                {
-                    TimeUnit.SECONDS.sleep(1);
-                    server.stop();
-                }
-                catch (Exception e)
-                {
-                    e.printStackTrace();
-                }
-            }
-        }.start();
+        Server server= new Server();
+        server.setStopTimeout(1000);
 
-        try(Socket socket = new Socket("localhost",server.getBean(NetworkConnector.class).getLocalPort());)
+        ServerConnector connector = new ServerConnector(server);
+        connector.setPort(0);
+        server.addConnector(connector);
+
+        TestHandler handler = new TestHandler();
+        StatisticsHandler stats = new StatisticsHandler();
+        server.setHandler(stats);
+        stats.setHandler(handler);
+
+        server.start();
+        final int port=connector.getLocalPort();
+        Socket client = new Socket("127.0.0.1", port);
+        client.getOutputStream().write((
+                "POST / HTTP/1.0\r\n"+
+                        "Host: localhost:"+port+"\r\n" +
+                        "Content-Type: plain/text\r\n" +
+                        "Content-Length: 10\r\n" +
+                        "\r\n"+
+                        "12345"
+                ).getBytes());
+        client.getOutputStream().flush();
+        handler.latch.await();
+
+        long start = System.nanoTime();
+        try
         {
-            socket.getOutputStream().write("GET / HTTP/1.0\r\n\r\n".getBytes(StandardCharsets.ISO_8859_1));
-            String out = IO.toString(socket.getInputStream());
-            Assert.assertThat(out,Matchers.containsString("200 OK"));
+            server.stop();
+            Assert.fail();
         }
-    }
-    
-    @Test
-    public void testGracefulTimout() throws Exception
-    {
-        server.setStopTimeout(100);
-        new Thread()
+        catch(TimeoutException e)
         {
-            @Override
-            public void run()
-            {
-                try
-                {
-                    TimeUnit.SECONDS.sleep(1);
-                    server.stop();
-                }
-                catch (Exception e)
-                {
-                    //e.printStackTrace();
-                }
-            }
-        }.start();
+            long stop = System.nanoTime();
+            // No Graceful waiters
+            assertThat(TimeUnit.NANOSECONDS.toMillis(stop-start),greaterThan(900L));
+        }
 
-        try(Socket socket = new Socket("localhost",server.getBean(NetworkConnector.class).getLocalPort());)
+        assertThat(client.getInputStream().read(),Matchers.is(-1));
+
+        assertThat(handler.handling.get(),Matchers.is(false));
+        assertThat(handler.thrown.get(),instanceOf(ClosedChannelException.class));
+
+        client.close();
+    }
+
+
+    /**
+     * Test of standard graceful timeout mechanism when a block request does
+     * complete. Note that even though the request completes after 100ms, the
+     * stop always takes 1000ms
+     * @throws Exception on test failure
+     */
+    @Test
+    public void testGracefulComplete() throws Exception
+    {
+        Server server= new Server();
+        server.setStopTimeout(10000);
+
+        ServerConnector connector = new ServerConnector(server);
+        connector.setPort(0);
+        server.addConnector(connector);
+
+        TestHandler handler = new TestHandler();
+        StatisticsHandler stats = new StatisticsHandler();
+        server.setHandler(stats);
+        stats.setHandler(handler);
+
+        server.start();
+        final int port=connector.getLocalPort();
+
+        try(final Socket client1 = new Socket("127.0.0.1", port);final Socket client2 = new Socket("127.0.0.1", port);)
         {
-            socket.getOutputStream().write("GET / HTTP/1.0\r\n\r\n".getBytes(StandardCharsets.ISO_8859_1));
-            String out = IO.toString(socket.getInputStream());
-            Assert.assertEquals("",out);
+            client1.getOutputStream().write((
+                    "POST / HTTP/1.0\r\n"+
+                            "Host: localhost:"+port+"\r\n" +
+                            "Content-Type: plain/text\r\n" +
+                            "Content-Length: 10\r\n" +
+                            "\r\n"+
+                            "12345"
+                    ).getBytes());
+            client1.getOutputStream().flush();
+            handler.latch.await();
+
+            new Thread()
+            {
+                @Override
+                public void run() 
+                {
+                    long now = TimeUnit.NANOSECONDS.toMillis(System.nanoTime());
+                    long end = now+500;
+                    
+
+                    
+                    try
+                    {
+                        Thread.sleep(100);
+
+                        // Try creating a new connection
+                        try
+                        {
+                            new Socket("127.0.0.1", port);
+                            throw new IllegalStateException();
+                        }
+                        catch(ConnectException e)
+                        {
+                            
+                        }
+                        
+                        // Try another request on existing connection
+
+                        client2.getOutputStream().write((
+                                "GET / HTTP/1.0\r\n"+
+                                        "Host: localhost:"+port+"\r\n" +
+                                        "\r\n"
+                                ).getBytes());
+                        client2.getOutputStream().flush();
+                        String response2 = IO.toString(client2.getInputStream());
+                        assertThat(response2, containsString(" 503 "));
+
+                        now = TimeUnit.NANOSECONDS.toMillis(System.nanoTime());
+                        Thread.sleep(end-now);
+                        client1.getOutputStream().write("567890".getBytes());
+                    }
+                    catch(Exception e)
+                    {
+                        e.printStackTrace();
+                    }
+                }
+            }.start();
+
+            long start = System.nanoTime();
+            server.stop();
+            long stop = System.nanoTime();
+            assertThat(TimeUnit.NANOSECONDS.toMillis(stop-start),greaterThan(490L));
+            assertThat(TimeUnit.NANOSECONDS.toMillis(stop-start),lessThan(10000L));
+
+            String response = IO.toString(client1.getInputStream());
+
+            assertThat(handler.handling.get(),Matchers.is(false));
+            assertThat(response, containsString(" 200 OK"));
+            assertThat(response, containsString("read 10/10"));
+            
+            assertThat(stats.getRequests(),Matchers.is(2));
+            assertThat(stats.getResponses5xx(),Matchers.is(1));
         }
     }
 
-    private static class TestHandler extends AbstractHandler
-    {
+
+    static class TestHandler extends AbstractHandler 
+    {		
+        final CountDownLatch latch = new CountDownLatch(1);
+        final AtomicReference<Throwable> thrown = new AtomicReference<Throwable>();
+        final AtomicBoolean handling = new AtomicBoolean(false);
+
         @Override
-        public void handle(final String s, final Request request, final HttpServletRequest httpServletRequest, final HttpServletResponse httpServletResponse)
-            throws IOException, ServletException
+        public void handle(String target, Request baseRequest,
+                HttpServletRequest request, HttpServletResponse response)
+                        throws IOException, ServletException 
         {
+            handling.set(true);
+            latch.countDown();
+            int c=0;
             try
             {
-                TimeUnit.SECONDS.sleep(2);
-            }
-            catch (InterruptedException e)
-            {
-            }
+                int content_length = request.getContentLength();
+                InputStream in = request.getInputStream();
 
-            httpServletResponse.getWriter().write("OK");
-            httpServletResponse.setStatus(200);
-            request.setHandled(true);
+                while(true)
+                {
+                    if (in.read()<0)
+                        break;
+                    c++;
+                }
+
+                baseRequest.setHandled(true);
+                response.setStatus(200);
+                response.getWriter().printf("read %d/%d%n",c,content_length);
+            }
+            catch(Throwable th)
+            {
+                thrown.set(th);
+            }
+            finally
+            {
+                handling.set(false);
+            }
         }
     }
 
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpConnectionTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpConnectionTest.java
index 020e7d5..829669c 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpConnectionTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpConnectionTest.java
@@ -25,8 +25,6 @@
 package org.eclipse.jetty.server;
 
 import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.greaterThan;
-import static org.hamcrest.Matchers.startsWith;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
@@ -49,6 +47,7 @@
 import org.eclipse.jetty.http.MimeTypes;
 import org.eclipse.jetty.server.handler.AbstractHandler;
 import org.eclipse.jetty.server.handler.ErrorHandler;
+import org.eclipse.jetty.util.log.AbstractLogger;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.log.StdErrLog;
@@ -56,12 +55,8 @@
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 
-/**
- *
- */
 public class HttpConnectionTest
 {
     private Server server;
@@ -202,7 +197,7 @@
     public void testBadPathDotDotPath() throws Exception
     {
         String response=connector.getResponses("GET /ooops/../../path HTTP/1.0\nHost: localhost:80\n\n");
-        checkContains(response,0,"HTTP/1.1 400 Bad Request");
+        checkContains(response,0,"HTTP/1.1 400 Bad URI");
     }
     
     @Test
@@ -217,28 +212,28 @@
     public void testBadPathEncodedDotDotPath() throws Exception
     {
         String response=connector.getResponses("GET /ooops/%2e%2e/%2e%2e/path HTTP/1.0\nHost: localhost:80\n\n");
-        checkContains(response,0,"HTTP/1.1 400 Bad Request");
+        checkContains(response,0,"HTTP/1.1 400 Bad URI");
     }
     
     @Test
     public void testBadDotDotPath() throws Exception
     {
         String response=connector.getResponses("GET ../path HTTP/1.0\nHost: localhost:80\n\n");
-        checkContains(response,0,"HTTP/1.1 400 Bad Request");
+        checkContains(response,0,"HTTP/1.1 400 Bad URI");
     }
     
     @Test
     public void testBadSlashDotDotPath() throws Exception
     {
         String response=connector.getResponses("GET /../path HTTP/1.0\nHost: localhost:80\n\n");
-        checkContains(response,0,"HTTP/1.1 400 Bad Request");
+        checkContains(response,0,"HTTP/1.1 400 Bad URI");
     }
 
     @Test
     public void testEncodedBadDotDotPath() throws Exception
     {
         String response=connector.getResponses("GET %2e%2e/path HTTP/1.0\nHost: localhost:80\n\n");
-        checkContains(response,0,"HTTP/1.1 400 Bad Request");
+        checkContains(response,0,"HTTP/1.1 400 Bad URI");
     }
 
     @Test
@@ -449,7 +444,7 @@
                                            "12345\015\012"+
                                            "0;\015\012\015\012");
             offset = checkContains(response,offset,"HTTP/1.1 200");
-            offset = checkContains(response,offset,"encoding=ISO-8859-1");
+            offset = checkContains(response,offset,"encoding=iso-8859-1");
             offset = checkContains(response,offset,"/R1");
             offset = checkContains(response,offset,"12345");
 
@@ -689,6 +684,7 @@
 
     /**
      * Creates a request header over 1k in size, by creating a single header entry with an huge value.
+     * @throws Exception if test failure
      */
     @Test
     public void testOversizedBuffer() throws Exception
@@ -717,6 +713,7 @@
 
     /**
      * Creates a request header with over 1000 entries.
+     * @throws Exception if test failure
      */
     @Test
     public void testExcessiveHeader() throws Exception
@@ -768,7 +765,7 @@
 
         try
         {
-            ((StdErrLog)Log.getLogger(HttpChannel.class)).info("Excpect IOException: Response header too large...");
+            ((AbstractLogger)Log.getLogger(HttpChannel.class)).info("Excpect IOException: Response header too large...");
             ((StdErrLog)Log.getLogger(HttpChannel.class)).setHideStacks(true);
             int offset = 0;
 
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpInputTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpInputTest.java
new file mode 100644
index 0000000..50c9ed0
--- /dev/null
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpInputTest.java
@@ -0,0 +1,593 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.nullValue;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.EOFException;
+import java.io.IOException;
+import java.util.Queue;
+import java.util.concurrent.TimeoutException;
+
+import javax.servlet.ReadListener;
+
+import org.eclipse.jetty.toolchain.test.AdvancedRunner;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.ConcurrentArrayQueue;
+import org.hamcrest.Matchers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AdvancedRunner.class)
+public class HttpInputTest
+{
+    Queue<String> _history = new ConcurrentArrayQueue<String>()
+            {
+                @Override
+                public boolean add(String s)
+                {
+                    //System.err.println("history: "+s);
+                    return super.add(s);
+                }
+            };
+    Queue<String> _fillAndParseSimulate = new ConcurrentArrayQueue<>();
+    HttpInput _in;
+    
+    ReadListener _listener = new ReadListener()
+    {
+        @Override
+        public void onError(Throwable t)
+        {
+            _history.add("onError:"+t);
+        }
+        
+        @Override
+        public void onDataAvailable() throws IOException
+        {
+            _history.add("onDataAvailable");
+        }
+        
+        @Override
+        public void onAllDataRead() throws IOException
+        {
+            _history.add("onAllDataRead");
+        }
+    };
+    
+    public class TContent extends HttpInput.Content
+    {
+        private final String _content;
+        public TContent(String content)
+        {
+            super(BufferUtil.toBuffer(content));
+            _content=content;
+        }
+        
+        @Override
+        public void succeeded()
+        {
+            _history.add("Content succeeded "+_content);
+            super.succeeded();
+        }
+        
+        @Override
+        public void failed(Throwable x)
+        {
+            _history.add("Content failed "+_content);
+            super.failed(x);
+        }
+    }
+    
+    @Before
+    public void before()
+    {
+        _in=new HttpInput(new HttpChannelState(new HttpChannel(null,new HttpConfiguration(),null,null)
+        {
+            @Override
+            public void asyncReadFillInterested()
+            {
+                _history.add("asyncReadFillInterested");
+            }
+        })
+        {
+            
+            @Override
+            public void onReadUnready()
+            {
+                _history.add("unready");
+                super.onReadUnready();
+            }
+
+            @Override
+            public boolean onReadPossible()
+            {
+                _history.add("onReadPossible");
+                return super.onReadPossible();
+            }
+            
+            @Override
+            public boolean onReadReady()
+            {
+                _history.add("ready");
+                return super.onReadReady();
+            }
+        })
+        {
+            @Override
+            protected void produceContent() throws IOException
+            {
+                _history.add("produceContent "+_fillAndParseSimulate.size()); 
+                
+                for (String s=_fillAndParseSimulate.poll();s!=null;s=_fillAndParseSimulate.poll())
+                {
+                    if ("_EOF_".equals(s))
+                        _in.eof();
+                    else
+                        _in.addContent(new TContent(s));
+                }
+            }
+
+            @Override
+            protected void blockForContent() throws IOException
+            {
+                _history.add("blockForContent"); 
+                super.blockForContent();
+            }
+        };
+    }
+    
+    @After
+    public void after()
+    {
+        assertThat(_history.poll(),nullValue());
+    }
+    
+    @Test
+    public void testEmpty() throws Exception
+    {
+        assertThat(_in.available(),equalTo(0));
+        assertThat(_history.poll(),equalTo("produceContent 0"));
+        assertThat(_history.poll(),nullValue());
+        
+        assertThat(_in.isFinished(),equalTo(false));
+        assertThat(_in.isReady(),equalTo(true));
+        assertThat(_history.poll(),nullValue());
+    }
+
+    @Test
+    public void testRead() throws Exception
+    {
+        _in.addContent(new TContent("AB"));
+        _in.addContent(new TContent("CD"));
+        _fillAndParseSimulate.offer("EF");
+        _fillAndParseSimulate.offer("GH");
+        assertThat(_in.available(),equalTo(2));
+        assertThat(_in.isFinished(),equalTo(false));
+        assertThat(_in.isReady(),equalTo(true));
+
+        assertThat(_in.getContentConsumed(),equalTo(0L));
+        assertThat(_in.read(),equalTo((int)'A'));
+        assertThat(_in.getContentConsumed(),equalTo(1L));
+        assertThat(_in.read(),equalTo((int)'B'));
+        assertThat(_in.getContentConsumed(),equalTo(2L));
+        
+        assertThat(_history.poll(),equalTo("Content succeeded AB"));
+        assertThat(_history.poll(),nullValue());
+        
+        assertThat(_in.read(),equalTo((int)'C'));
+        assertThat(_in.read(),equalTo((int)'D'));
+        
+        assertThat(_history.poll(),equalTo("Content succeeded CD"));
+        assertThat(_history.poll(),nullValue());
+        
+        assertThat(_in.read(),equalTo((int)'E'));
+        assertThat(_in.read(),equalTo((int)'F'));
+
+        assertThat(_history.poll(),equalTo("produceContent 2"));
+        assertThat(_history.poll(),equalTo("Content succeeded EF"));
+        assertThat(_history.poll(),nullValue());
+        
+        assertThat(_in.read(),equalTo((int)'G'));
+        assertThat(_in.read(),equalTo((int)'H'));
+        
+        assertThat(_history.poll(),equalTo("Content succeeded GH"));
+        assertThat(_history.poll(),nullValue());
+        
+        assertThat(_in.getContentConsumed(),equalTo(8L));
+        
+        assertThat(_history.poll(),nullValue());
+    }
+
+    @Test
+    public void testBlockingRead() throws Exception
+    {
+        new Thread()
+        {
+            public void run() 
+            {
+                try
+                {
+                    Thread.sleep(500);
+                    _in.addContent(new TContent("AB"));
+                }
+                catch(Throwable th)
+                {
+                    th.printStackTrace();
+                }
+            }
+        }.start();
+        
+        assertThat(_in.read(),equalTo((int)'A'));
+        
+        assertThat(_history.poll(),equalTo("produceContent 0"));
+        assertThat(_history.poll(),equalTo("blockForContent"));
+        assertThat(_history.poll(),nullValue());
+        
+        assertThat(_in.read(),equalTo((int)'B'));
+        
+        assertThat(_history.poll(),equalTo("Content succeeded AB"));
+        assertThat(_history.poll(),nullValue());
+    }
+
+    @Test
+    public void testReadEOF() throws Exception
+    {
+        _in.addContent(new TContent("AB"));
+        _in.addContent(new TContent("CD"));
+        _in.eof();
+
+        assertThat(_in.isFinished(),equalTo(false));
+        assertThat(_in.available(),equalTo(2));
+        assertThat(_in.isFinished(),equalTo(false));
+
+        assertThat(_in.read(),equalTo((int)'A'));
+        assertThat(_in.read(),equalTo((int)'B'));
+        assertThat(_history.poll(),equalTo("Content succeeded AB"));
+        assertThat(_history.poll(),nullValue());
+        
+        assertThat(_in.read(),equalTo((int)'C'));
+        assertThat(_in.isFinished(),equalTo(false));
+        assertThat(_in.read(),equalTo((int)'D'));
+        assertThat(_history.poll(),equalTo("Content succeeded CD"));
+        assertThat(_history.poll(),nullValue());
+        assertThat(_in.isFinished(),equalTo(false));
+        
+        assertThat(_in.read(),equalTo(-1));
+        assertThat(_in.isFinished(),equalTo(true));
+        
+        assertThat(_history.poll(),nullValue());
+    }
+
+    @Test
+    public void testReadEarlyEOF() throws Exception
+    {
+        _in.addContent(new TContent("AB"));
+        _in.addContent(new TContent("CD"));
+        _in.earlyEOF();
+
+        assertThat(_in.isFinished(),equalTo(false));
+        assertThat(_in.available(),equalTo(2));
+        assertThat(_in.isFinished(),equalTo(false));
+
+        assertThat(_in.read(),equalTo((int)'A'));
+        assertThat(_in.read(),equalTo((int)'B'));
+        
+        assertThat(_in.read(),equalTo((int)'C'));
+        assertThat(_in.isFinished(),equalTo(false));
+        assertThat(_in.read(),equalTo((int)'D'));
+        
+        try
+        {
+            _in.read();
+            fail();
+        }
+        catch(EOFException eof)
+        {
+            assertThat(_in.isFinished(),equalTo(true));
+        }
+
+        assertThat(_history.poll(),equalTo("Content succeeded AB"));
+        assertThat(_history.poll(),equalTo("Content succeeded CD"));
+        assertThat(_history.poll(),nullValue());
+    }
+    
+    @Test
+    public void testBlockingEOF() throws Exception
+    {
+        new Thread()
+        {
+            public void run() 
+            {
+                try
+                {
+                    Thread.sleep(500);
+                    _in.eof();
+                }
+                catch(Throwable th)
+                {
+                    th.printStackTrace();
+                }
+            }
+        }.start();
+
+        assertThat(_in.isFinished(),equalTo(false));
+        assertThat(_in.read(),equalTo(-1));
+        assertThat(_in.isFinished(),equalTo(true));
+        
+        assertThat(_history.poll(),equalTo("produceContent 0"));
+        assertThat(_history.poll(),equalTo("blockForContent"));
+        assertThat(_history.poll(),nullValue());   
+    }
+    
+    @Test
+    public void testAsyncEmpty() throws Exception
+    {
+        _in.setReadListener(_listener);
+        assertThat(_history.poll(),equalTo("produceContent 0"));
+        assertThat(_history.poll(),equalTo("unready"));
+        assertThat(_history.poll(),nullValue());
+        
+        _in.run();
+        assertThat(_history.poll(),equalTo("onDataAvailable"));
+        assertThat(_history.poll(),nullValue());
+
+        assertThat(_in.isReady(),equalTo(false));
+        assertThat(_history.poll(),equalTo("produceContent 0"));
+        assertThat(_history.poll(),equalTo("unready"));
+        assertThat(_history.poll(),nullValue());
+        
+        assertThat(_in.isReady(),equalTo(false));
+        assertThat(_history.poll(),equalTo("produceContent 0"));
+        assertThat(_history.poll(),equalTo("unready"));
+        assertThat(_history.poll(),nullValue());
+    }
+    
+
+    @Test
+    public void testAsyncRead() throws Exception
+    {
+        _in.setReadListener(_listener);
+        assertThat(_history.poll(),equalTo("produceContent 0"));
+        assertThat(_history.poll(),equalTo("unready"));
+        assertThat(_history.poll(),nullValue());
+        
+        _in.run();
+        assertThat(_history.poll(),equalTo("onDataAvailable"));
+        assertThat(_history.poll(),nullValue());
+
+        assertThat(_in.isReady(),equalTo(false));
+        assertThat(_history.poll(),equalTo("produceContent 0"));
+        assertThat(_history.poll(),equalTo("unready"));
+        assertThat(_history.poll(),nullValue());
+        
+        _in.addContent(new TContent("AB"));
+        _fillAndParseSimulate.add("CD");
+        
+        assertThat(_history.poll(),equalTo("onReadPossible"));
+        assertThat(_history.poll(),nullValue());
+        _in.run();
+        assertThat(_history.poll(),equalTo("onDataAvailable"));
+        assertThat(_history.poll(),nullValue());
+
+        assertThat(_in.isReady(),equalTo(true));
+        assertThat(_in.read(),equalTo((int)'A'));
+        
+        assertThat(_in.isReady(),equalTo(true));
+        assertThat(_in.read(),equalTo((int)'B'));
+
+        assertThat(_history.poll(),equalTo("Content succeeded AB"));
+        assertThat(_history.poll(),nullValue());
+        
+        assertThat(_in.isReady(),equalTo(true));
+        assertThat(_history.poll(),equalTo("produceContent 1"));
+        assertThat(_history.poll(),equalTo("onReadPossible"));
+        assertThat(_history.poll(),nullValue());
+
+        assertThat(_in.read(),equalTo((int)'C'));
+        
+        assertThat(_in.isReady(),equalTo(true));
+        assertThat(_in.read(),equalTo((int)'D'));
+        assertThat(_history.poll(),equalTo("Content succeeded CD"));
+        assertThat(_history.poll(),nullValue());
+        
+
+        assertThat(_in.isReady(),equalTo(false));
+        assertThat(_history.poll(),equalTo("produceContent 0"));
+        assertThat(_history.poll(),equalTo("unready"));
+        assertThat(_history.poll(),nullValue());
+    }
+    
+    @Test
+    public void testAsyncEOF() throws Exception
+    {
+        _in.setReadListener(_listener);
+        assertThat(_history.poll(),equalTo("produceContent 0"));
+        assertThat(_history.poll(),equalTo("unready"));
+        assertThat(_history.poll(),nullValue());
+
+        _in.run();
+        assertThat(_history.poll(),equalTo("onDataAvailable"));
+        assertThat(_history.poll(),nullValue());
+
+        _in.eof();
+        assertThat(_in.isReady(),equalTo(true));
+        assertThat(_in.isFinished(),equalTo(false));
+        assertThat(_history.poll(),equalTo("onReadPossible"));
+        assertThat(_history.poll(),nullValue());
+
+        assertThat(_in.read(),equalTo(-1));
+        assertThat(_in.isFinished(),equalTo(true));
+        assertThat(_history.poll(),equalTo("ready"));
+        assertThat(_history.poll(),nullValue());
+    }
+    
+    @Test
+    public void testAsyncReadEOF() throws Exception
+    {
+        _in.setReadListener(_listener);
+        assertThat(_history.poll(),equalTo("produceContent 0"));
+        assertThat(_history.poll(),equalTo("unready"));
+        assertThat(_history.poll(),nullValue());
+        
+        _in.run();
+        assertThat(_history.poll(),equalTo("onDataAvailable"));
+        assertThat(_history.poll(),nullValue());
+
+        assertThat(_in.isReady(),equalTo(false));
+        assertThat(_history.poll(),equalTo("produceContent 0"));
+        assertThat(_history.poll(),equalTo("unready"));
+        assertThat(_history.poll(),nullValue());
+        
+        _in.addContent(new TContent("AB"));
+        _fillAndParseSimulate.add("_EOF_");
+        
+        assertThat(_history.poll(),equalTo("onReadPossible"));
+        assertThat(_history.poll(),nullValue());
+        
+        _in.run();
+        assertThat(_history.poll(),equalTo("onDataAvailable"));
+        assertThat(_history.poll(),nullValue());
+
+        assertThat(_in.isReady(),equalTo(true));
+        assertThat(_in.read(),equalTo((int)'A'));
+        
+        assertThat(_in.isReady(),equalTo(true));
+        assertThat(_in.read(),equalTo((int)'B'));
+
+        assertThat(_history.poll(),equalTo("Content succeeded AB"));
+        assertThat(_history.poll(),nullValue());
+
+        assertThat(_in.isFinished(),equalTo(false));
+        assertThat(_in.isReady(),equalTo(true));
+        assertThat(_history.poll(),equalTo("produceContent 1"));
+        assertThat(_history.poll(),equalTo("onReadPossible"));
+        assertThat(_history.poll(),nullValue());
+
+        assertThat(_in.isFinished(),equalTo(false));
+        assertThat(_in.read(),equalTo(-1));        
+        assertThat(_in.isFinished(),equalTo(true));
+        assertThat(_history.poll(),equalTo("ready"));
+        assertThat(_history.poll(),nullValue());
+        
+        assertThat(_in.isReady(),equalTo(true));
+        assertThat(_history.poll(),nullValue());
+
+    }
+
+    
+    @Test
+    public void testAsyncError() throws Exception
+    {
+        _in.setReadListener(_listener);
+        assertThat(_history.poll(),equalTo("produceContent 0"));
+        assertThat(_history.poll(),equalTo("unready"));
+        assertThat(_history.poll(),nullValue());
+        _in.run();
+        assertThat(_history.poll(),equalTo("onDataAvailable"));
+        assertThat(_history.poll(),nullValue());
+
+        assertThat(_in.isReady(),equalTo(false));
+        assertThat(_history.poll(),equalTo("produceContent 0"));
+        assertThat(_history.poll(),equalTo("unready"));
+        assertThat(_history.poll(),nullValue());
+        
+        _in.failed(new TimeoutException());
+        assertThat(_history.poll(),equalTo("onReadPossible"));
+        assertThat(_history.poll(),nullValue());
+        
+        _in.run();
+        assertThat(_in.isFinished(),equalTo(true));
+        assertThat(_history.poll(),equalTo("onError:java.util.concurrent.TimeoutException"));
+        assertThat(_history.poll(),nullValue());
+
+        assertThat(_in.isReady(),equalTo(true));
+        try
+        {
+            _in.read();
+            fail();
+        }
+        catch(IOException e)
+        {
+            assertThat(e.getCause(),Matchers.instanceOf(TimeoutException.class));
+            assertThat(_in.isFinished(),equalTo(true));   
+        }
+
+        assertThat(_history.poll(),nullValue());
+    }
+    
+
+    @Test
+    public void testRecycle() throws Exception
+    {
+        testAsyncRead();
+        _in.recycle();
+        testAsyncRead();
+        _in.recycle();
+        testReadEOF();
+    }
+    
+    @Test
+    public void testConsumeAll() throws Exception
+    {
+        _in.addContent(new TContent("AB"));
+        _in.addContent(new TContent("CD"));
+        _fillAndParseSimulate.offer("EF");
+        _fillAndParseSimulate.offer("GH");
+        assertThat(_in.read(),equalTo((int)'A'));
+        
+        assertFalse(_in.consumeAll());
+        assertThat(_in.getContentConsumed(),equalTo(8L));
+
+        assertThat(_history.poll(),equalTo("Content succeeded AB"));
+        assertThat(_history.poll(),equalTo("Content succeeded CD"));
+        assertThat(_history.poll(),equalTo("produceContent 2"));
+        assertThat(_history.poll(),equalTo("Content succeeded EF"));
+        assertThat(_history.poll(),equalTo("Content succeeded GH"));
+        assertThat(_history.poll(),equalTo("produceContent 0"));
+        assertThat(_history.poll(),nullValue());
+    }
+    
+    @Test
+    public void testConsumeAllEOF() throws Exception
+    {
+        _in.addContent(new TContent("AB"));
+        _in.addContent(new TContent("CD"));
+        _fillAndParseSimulate.offer("EF");
+        _fillAndParseSimulate.offer("GH");
+        _fillAndParseSimulate.offer("_EOF_");
+        assertThat(_in.read(),equalTo((int)'A'));
+        
+        assertTrue(_in.consumeAll());
+        assertThat(_in.getContentConsumed(),equalTo(8L));
+
+        assertThat(_history.poll(),equalTo("Content succeeded AB"));
+        assertThat(_history.poll(),equalTo("Content succeeded CD"));
+        assertThat(_history.poll(),equalTo("produceContent 3"));
+        assertThat(_history.poll(),equalTo("Content succeeded EF"));
+        assertThat(_history.poll(),equalTo("Content succeeded GH"));
+        assertThat(_history.poll(),nullValue());
+    }
+}
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpManyWaysToAsyncCommitBadBehaviourTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpManyWaysToAsyncCommitBadBehaviourTest.java
index 3526827..f03282b 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpManyWaysToAsyncCommitBadBehaviourTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpManyWaysToAsyncCommitBadBehaviourTest.java
@@ -30,6 +30,7 @@
 import java.util.concurrent.TimeoutException;
 
 import javax.servlet.AsyncContext;
+import javax.servlet.DispatcherType;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -86,6 +87,13 @@
         public void handle(String target, Request baseRequest, final HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
         {
             final CyclicBarrier resumeBarrier = new CyclicBarrier(1);
+            
+            if (baseRequest.getDispatcherType()==DispatcherType.ERROR)
+            {
+                response.sendError(500);
+                return;
+            }
+            
             if (request.getAttribute(CONTEXT_ATTRIBUTE) == null)
             {
                 final AsyncContext asyncContext = baseRequest.startAsync();
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestBase.java b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestBase.java
index 9d0dad2..08c7a03 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestBase.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestBase.java
@@ -18,6 +18,16 @@
 
 package org.eclipse.jetty.server;
 
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.startsWith;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
 import java.io.BufferedReader;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -31,6 +41,7 @@
 import java.util.Arrays;
 import java.util.concurrent.Exchanger;
 import java.util.concurrent.atomic.AtomicBoolean;
+
 import javax.servlet.ServletException;
 import javax.servlet.ServletInputStream;
 import javax.servlet.ServletOutputStream;
@@ -40,27 +51,21 @@
 import org.eclipse.jetty.io.EndPoint;
 import org.eclipse.jetty.io.EofException;
 import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.eclipse.jetty.toolchain.test.AdvancedRunner;
 import org.eclipse.jetty.toolchain.test.annotation.Slow;
 import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.log.AbstractLogger;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.StdErrLog;
 import org.hamcrest.Matchers;
 import org.junit.Assert;
 import org.junit.Test;
-
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.greaterThanOrEqualTo;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.not;
-import static org.hamcrest.Matchers.startsWith;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import org.junit.runner.RunWith;
 
 /**
  *
  */
+@RunWith(AdvancedRunner.class)
 public abstract class HttpServerTestBase extends HttpServerTestFixture
 {
     private static final String REQUEST1_HEADER = "POST / HTTP/1.0\n" + "Host: localhost\n" + "Content-Type: text/xml; charset=utf-8\n" + "Connection: close\n" + "Content-Length: ";
@@ -105,7 +110,7 @@
                     + "</nimbus>\n";
     protected static final String RESPONSE2 =
             "HTTP/1.1 200 OK\n" +
-                    "Content-Type: text/xml; charset=ISO-8859-1\n" +
+                    "Content-Type: text/xml;charset=iso-8859-1\n" +
                     "Content-Length: " + RESPONSE2_CONTENT.getBytes().length + "\n" +
                     "Server: Jetty(" + Server.getVersion() + ")\n" +
                     "\n" +
@@ -183,7 +188,7 @@
         {
             client.setSoTimeout(10000);
             ((StdErrLog)Log.getLogger(HttpConnection.class)).setHideStacks(true);
-            ((StdErrLog) Log.getLogger(HttpConnection.class)).info("expect request is too large, then ISE extra data ...");
+            ((AbstractLogger) Log.getLogger(HttpConnection.class)).info("expect request is too large, then ISE extra data ...");
             OutputStream os = client.getOutputStream();
 
             byte[] buffer = new byte[64 * 1024];
@@ -214,7 +219,7 @@
         try (Socket client = newSocket(_serverURI.getHost(), _serverURI.getPort()))
         {
             ((StdErrLog)Log.getLogger(HttpConnection.class)).setHideStacks(true);
-            ((StdErrLog)Log.getLogger(HttpConnection.class)).info("expect URI is too large, then ISE extra data ...");
+            ((AbstractLogger)Log.getLogger(HttpConnection.class)).info("expect URI is too large, then ISE extra data ...");
             OutputStream os = client.getOutputStream();
 
             byte[] buffer = new byte[64 * 1024];
@@ -334,7 +339,7 @@
         try (Socket client = newSocket(_serverURI.getHost(), _serverURI.getPort()))
         {
             ((StdErrLog)Log.getLogger(HttpConnection.class)).setHideStacks(true);
-            ((StdErrLog)Log.getLogger(HttpConnection.class)).info("expect header is too large, then ISE extra data ...");
+            ((AbstractLogger)Log.getLogger(HttpConnection.class)).info("expect header is too large, then ISE extra data ...");
             OutputStream os = client.getOutputStream();
 
             byte[] buffer = new byte[64 * 1024];
@@ -1025,8 +1030,8 @@
             }
 
             String in = new String(b, 0, i, StandardCharsets.UTF_8);
-            assertTrue(in.contains("123456789"));
-            assertTrue(in.contains("abcdefghZ"));
+            assertThat(in,containsString("123456789"));
+            assertThat(in,containsString("abcdefghZ"));
             assertFalse(in.contains("Wibble"));
 
             in = new String(b, i, b.length - i, StandardCharsets.UTF_16);
@@ -1125,9 +1130,9 @@
             os.flush();
 
             String in = IO.toString(is);
-            assertTrue(in.contains("123456789"));
-            assertTrue(in.contains("abcdefghi"));
-            assertTrue(in.contains("Wibble"));
+            assertThat(in,containsString("123456789"));
+            assertThat(in,containsString("abcdefghi"));
+            assertThat(in,containsString("Wibble"));
         }
     }
 
@@ -1176,7 +1181,7 @@
         try
         {
             ((StdErrLog)Log.getLogger(HttpChannel.class)).setHideStacks(true);
-            ((StdErrLog)Log.getLogger(HttpChannel.class)).info("Expecting exception after commit then could not send 500....");
+            ((AbstractLogger)Log.getLogger(HttpChannel.class)).info("Expecting exception after commit then could not send 500....");
             OutputStream os = client.getOutputStream();
             InputStream is = client.getInputStream();
 
@@ -1193,7 +1198,7 @@
 
             assertEquals(-1, is.read()); // Closed by error!
 
-            assertTrue(in.contains("HTTP/1.1 200 OK"));
+            assertThat(in,containsString("HTTP/1.1 200 OK"));
             assertTrue(in.indexOf("Transfer-Encoding: chunked") > 0);
             assertTrue(in.indexOf("Now is the time for all good men to come to the aid of the party") > 0);
             assertThat(in, Matchers.not(Matchers.containsString("\r\n0\r\n")));
@@ -1423,6 +1428,7 @@
         {
             int point = points[j];
 
+            // System.err.println("write: "+new String(bytes, last, point - last));
             os.write(bytes, last, point - last);
             last = point;
             os.flush();
@@ -1433,6 +1439,7 @@
         }
 
         // Write the last fragment
+        // System.err.println("Write: "+new String(bytes, last, bytes.length - last));
         os.write(bytes, last, bytes.length - last);
         os.flush();
         Thread.sleep(PAUSE);
@@ -1443,9 +1450,7 @@
     {
         configureServer(new NoopHandler());
         final int REQS = 2;
-        char[] fill = new char[65 * 1024];
-        Arrays.fill(fill, '.');
-        String content = "This is a loooooooooooooooooooooooooooooooooo" +
+        final String content = "This is a coooooooooooooooooooooooooooooooooo" +
                 "ooooooooooooooooooooooooooooooooooooooooooooo" +
                 "ooooooooooooooooooooooooooooooooooooooooooooo" +
                 "ooooooooooooooooooooooooooooooooooooooooooooo" +
@@ -1454,9 +1459,8 @@
                 "ooooooooooooooooooooooooooooooooooooooooooooo" +
                 "ooooooooooooooooooooooooooooooooooooooooooooo" +
                 "ooooooooooooooooooooooooooooooooooooooooooooo" +
-                "oooooooooooonnnnnnnnnnnnnnnnggggggggg content" +
-                new String(fill);
-        final byte[] bytes = content.getBytes();
+                "oooooooooooonnnnnnnnnnnnnnnntent";
+        final int cl = content.getBytes().length;
 
         Socket client = newSocket(_serverURI.getHost(), _serverURI.getPort());
         final OutputStream out = client.getOutputStream();
@@ -1468,12 +1472,15 @@
             {
                 try
                 {
+                    byte[] bytes=(
+                            "GET / HTTP/1.1\r\n"+
+                                    "Host: localhost\r\n"
+                                    +"Content-Length: " + cl + "\r\n" +
+                                    "\r\n"+
+                                    content).getBytes(StandardCharsets.ISO_8859_1);
+                                    
                     for (int i = 0; i < REQS; i++)
-                    {
-                        out.write("GET / HTTP/1.1\r\nHost: localhost\r\n".getBytes(StandardCharsets.ISO_8859_1));
-                        out.write(("Content-Length: " + bytes.length + "\r\n" + "\r\n").getBytes(StandardCharsets.ISO_8859_1));
                         out.write(bytes, 0, bytes.length);
-                    }
                     out.write("GET / HTTP/1.1\r\nHost: last\r\nConnection: close\r\n\r\n".getBytes(StandardCharsets.ISO_8859_1));
                     out.flush();
                 }
@@ -1485,7 +1492,7 @@
         }.start();
 
         String resps = readResponse(client);
-
+                
         int offset = 0;
         for (int i = 0; i < (REQS + 1); i++)
         {
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestFixture.java b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestFixture.java
index c060342..06def0c 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestFixture.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestFixture.java
@@ -37,6 +37,7 @@
 import org.eclipse.jetty.server.handler.HandlerWrapper;
 import org.eclipse.jetty.toolchain.test.PropertyFlag;
 import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
 import org.junit.After;
 import org.junit.Before;
 
@@ -45,8 +46,10 @@
     protected static final long PAUSE=10L;
     protected static final int LOOPS= PropertyFlag.isEnabled("test.stress")?250:50;
 
+    protected QueuedThreadPool _threadPool;
     protected Server _server;
     protected URI _serverURI;
+    protected HttpConfiguration _httpConfiguration;
     protected ServerConnector _connector;
     protected String _scheme="http";
 
@@ -62,15 +65,23 @@
     @Before
     public void before()
     {
-        _server = new Server();
+        _threadPool = new QueuedThreadPool();
+        _server = new Server(_threadPool);
     }
 
     protected void startServer(ServerConnector connector) throws Exception
     {
+        startServer(connector,new HandlerWrapper());
+    }
+    
+    protected void startServer(ServerConnector connector, Handler handler) throws Exception
+    {
         _connector = connector;
-        _connector.getConnectionFactory(HttpConnectionFactory.class).getHttpConfiguration().setSendDateHeader(false);
+        _httpConfiguration=_connector.getConnectionFactory(HttpConnectionFactory.class).getHttpConfiguration();
+        _httpConfiguration.setBlockingTimeout(-1);
+        _httpConfiguration.setSendDateHeader(false);
         _server.addConnector(_connector);
-        _server.setHandler(new HandlerWrapper());
+        _server.setHandler(handler);
         _server.start();
         _serverURI = _server.getURI();
     }
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpURITest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpURITest.java
deleted file mode 100644
index 7976217..0000000
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpURITest.java
+++ /dev/null
@@ -1,402 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.server;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.net.URLEncoder;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-
-import org.eclipse.jetty.http.HttpURI;
-import org.eclipse.jetty.util.MultiMap;
-import org.eclipse.jetty.util.TypeUtil;
-import org.eclipse.jetty.util.Utf8Appendable;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class HttpURITest
-{
-    private final String[][] partial_tests=
-    {
-       /* 0*/ {"/path/info",null,null,null,null,"/path/info",null,null,null},
-       /* 1*/ {"/path/info#fragment",null,null,null,null,"/path/info",null,null,"fragment"},
-       /* 2*/ {"/path/info?query",null,null,null,null,"/path/info",null,"query",null},
-       /* 3*/ {"/path/info?query#fragment",null,null,null,null,"/path/info",null,"query","fragment"},
-       /* 4*/ {"/path/info;param",null,null,null,null,"/path/info","param",null,null},
-       /* 5*/ {"/path/info;param#fragment",null,null,null,null,"/path/info","param",null,"fragment"},
-       /* 6*/ {"/path/info;param?query",null,null,null,null,"/path/info","param","query",null},
-       /* 7*/ {"/path/info;param?query#fragment",null,null,null,null,"/path/info","param","query","fragment"},
-       /* 8*/ {"//host/path/info",null,"//host","host",null,"/path/info",null,null,null},
-       /* 9*/ {"//user@host/path/info",null,"//user@host","host",null,"/path/info",null,null,null},
-       /*10*/ {"//user@host:8080/path/info",null,"//user@host:8080","host","8080","/path/info",null,null,null},
-       /*11*/ {"//host:8080/path/info",null,"//host:8080","host","8080","/path/info",null,null,null},
-       /*12*/ {"http:/path/info","http",null,null,null,"/path/info",null,null,null},
-       /*13*/ {"http:/path/info#fragment","http",null,null,null,"/path/info",null,null,"fragment"},
-       /*14*/ {"http:/path/info?query","http",null,null,null,"/path/info",null,"query",null},
-       /*15*/ {"http:/path/info?query#fragment","http",null,null,null,"/path/info",null,"query","fragment"},
-       /*16*/ {"http:/path/info;param","http",null,null,null,"/path/info","param",null,null},
-       /*17*/ {"http:/path/info;param#fragment","http",null,null,null,"/path/info","param",null,"fragment"},
-       /*18*/ {"http:/path/info;param?query","http",null,null,null,"/path/info","param","query",null},
-       /*19*/ {"http:/path/info;param?query#fragment","http",null,null,null,"/path/info","param","query","fragment"},
-       /*20*/ {"http://user@host:8080/path/info;param?query#fragment","http","//user@host:8080","host","8080","/path/info","param","query","fragment"},
-       /*21*/ {"xxxxx://user@host:8080/path/info;param?query#fragment","xxxxx","//user@host:8080","host","8080","/path/info","param","query","fragment"},
-       /*22*/ {"http:///;?#","http","//",null,null,"/","","",""},
-       /*23*/ {"/path/info?a=?query",null,null,null,null,"/path/info",null,"a=?query",null},
-       /*24*/ {"/path/info?a=;query",null,null,null,null,"/path/info",null,"a=;query",null},
-       /*25*/ {"//host:8080//",null,"//host:8080","host","8080","//",null,null,null},
-       /*26*/ {"file:///path/info","file","//",null,null,"/path/info",null,null,null},
-       /*27*/ {"//",null,"//",null,null,null,null,null,null},
-       /*28*/ {"/;param",null, null, null,null,"/", "param",null,null},
-       /*29*/ {"/?x=y",null, null, null,null,"/", null,"x=y",null},
-       /*30*/ {"/?abc=test",null, null, null,null,"/", null,"abc=test",null},
-       /*31*/ {"/#fragment",null, null, null,null,"/", null,null,"fragment"},
-       /*32*/ {"http://localhost:8080", "http", "//localhost:8080", "localhost", "8080", null, null, null, null},
-       /*33*/ {"./?foo:bar=:1:1::::",null,null,null,null,"./",null,"foo:bar=:1:1::::",null}
-    };
-
-    @Test
-    public void testPartialURIs() throws Exception
-    {
-        HttpURI uri = new HttpURI(true);
-
-        for (int t=0;t<partial_tests.length;t++)
-        {
-            uri.parse(partial_tests[t][0].getBytes(),0,partial_tests[t][0].length());
-            assertEquals(t+" "+partial_tests[t][0],partial_tests[t][1],uri.getScheme());
-            assertEquals(t+" "+partial_tests[t][0],partial_tests[t][2],uri.getAuthority());
-            assertEquals(t+" "+partial_tests[t][0],partial_tests[t][3],uri.getHost());
-            assertEquals(t+" "+partial_tests[t][0],partial_tests[t][4]==null?-1:Integer.parseInt(partial_tests[t][4]),uri.getPort());
-            assertEquals(t+" "+partial_tests[t][0],partial_tests[t][5],uri.getPath());
-            assertEquals(t+" "+partial_tests[t][0],partial_tests[t][6],uri.getParam());
-            assertEquals(t+" "+partial_tests[t][0],partial_tests[t][7],uri.getQuery());
-            assertEquals(t+" "+partial_tests[t][0],partial_tests[t][8],uri.getFragment());
-            assertEquals(partial_tests[t][0], uri.toString());
-        }
-
-    }
-
-    private final String[][] path_tests=
-    {
-       /* 0*/ {"/path/info",null,null,null,null,"/path/info",null,null,null},
-       /* 1*/ {"/path/info#fragment",null,null,null,null,"/path/info",null,null,"fragment"},
-       /* 2*/ {"/path/info?query",null,null,null,null,"/path/info",null,"query",null},
-       /* 3*/ {"/path/info?query#fragment",null,null,null,null,"/path/info",null,"query","fragment"},
-       /* 4*/ {"/path/info;param",null,null,null,null,"/path/info","param",null,null},
-       /* 5*/ {"/path/info;param#fragment",null,null,null,null,"/path/info","param",null,"fragment"},
-       /* 6*/ {"/path/info;param?query",null,null,null,null,"/path/info","param","query",null},
-       /* 7*/ {"/path/info;param?query#fragment",null,null,null,null,"/path/info","param","query","fragment"},
-       /* 8*/ {"//host/path/info",null,null,null,null,"//host/path/info",null,null,null},
-       /* 9*/ {"//user@host/path/info",null,null,null,null,"//user@host/path/info",null,null,null},
-       /*10*/ {"//user@host:8080/path/info",null,null,null,null,"//user@host:8080/path/info",null,null,null},
-       /*11*/ {"//host:8080/path/info",null,null,null,null,"//host:8080/path/info",null,null,null},
-       /*12*/ {"http:/path/info","http",null,null,null,"/path/info",null,null,null},
-       /*13*/ {"http:/path/info#fragment","http",null,null,null,"/path/info",null,null,"fragment"},
-       /*14*/ {"http:/path/info?query","http",null,null,null,"/path/info",null,"query",null},
-       /*15*/ {"http:/path/info?query#fragment","http",null,null,null,"/path/info",null,"query","fragment"},
-       /*16*/ {"http:/path/info;param","http",null,null,null,"/path/info","param",null,null},
-       /*17*/ {"http:/path/info;param#fragment","http",null,null,null,"/path/info","param",null,"fragment"},
-       /*18*/ {"http:/path/info;param?query","http",null,null,null,"/path/info","param","query",null},
-       /*19*/ {"http:/path/info;param?query#fragment","http",null,null,null,"/path/info","param","query","fragment"},
-       /*20*/ {"http://user@host:8080/path/info;param?query#fragment","http","//user@host:8080","host","8080","/path/info","param","query","fragment"},
-       /*21*/ {"xxxxx://user@host:8080/path/info;param?query#fragment","xxxxx","//user@host:8080","host","8080","/path/info","param","query","fragment"},
-       /*22*/ {"http:///;?#","http","//",null,null,"/","","",""},
-       /*23*/ {"/path/info?a=?query",null,null,null,null,"/path/info",null,"a=?query",null},
-       /*24*/ {"/path/info?a=;query",null,null,null,null,"/path/info",null,"a=;query",null},
-       /*25*/ {"//host:8080//",null,null,null,null,"//host:8080//",null,null,null},
-       /*26*/ {"file:///path/info","file","//",null,null,"/path/info",null,null,null},
-       /*27*/ {"//",null,null,null,null,"//",null,null,null},
-       /*28*/ {"http://localhost/","http","//localhost","localhost",null,"/",null,null,null},
-       /*29*/ {"http://localhost:8080/", "http", "//localhost:8080", "localhost","8080","/", null, null,null},
-       /*30*/ {"http://localhost/?x=y", "http", "//localhost", "localhost",null,"/", null,"x=y",null},
-       /*31*/ {"/;param",null, null, null,null,"/", "param",null,null},
-       /*32*/ {"/?x=y",null, null, null,null,"/", null,"x=y",null},
-       /*33*/ {"/?abc=test",null, null, null,null,"/", null,"abc=test",null},
-       /*34*/ {"/#fragment",null, null, null,null,"/", null,null,"fragment"},
-       /*35*/ {"http://192.0.0.1:8080/","http","//192.0.0.1:8080","192.0.0.1","8080","/",null,null,null},
-       /*36*/ {"http://[2001:db8::1]:8080/","http","//[2001:db8::1]:8080","[2001:db8::1]","8080","/",null,null,null},
-       /*37*/ {"http://user@[2001:db8::1]:8080/","http","//user@[2001:db8::1]:8080","[2001:db8::1]","8080","/",null,null,null},
-       /*38*/ {"http://[2001:db8::1]/","http","//[2001:db8::1]","[2001:db8::1]",null,"/",null,null,null},
-       /*39*/ {"//[2001:db8::1]:8080/",null,null,null,null,"//[2001:db8::1]:8080/",null,null,null},
-       /*40*/ {"http://user@[2001:db8::1]:8080/","http","//user@[2001:db8::1]:8080","[2001:db8::1]","8080","/",null,null,null},
-       /*41*/ {"*",null,null,null,null,"*",null, null,null}
-    };
-
-    @Test
-    public void testPathURIs() throws Exception
-    {
-        HttpURI uri = new HttpURI();
-
-        for (int t=0;t<path_tests.length;t++)
-        {
-            uri.parse(path_tests[t][0].getBytes(),0,path_tests[t][0].length());
-            assertEquals(t+" "+path_tests[t][0],path_tests[t][1],uri.getScheme());
-            assertEquals(t+" "+path_tests[t][0],path_tests[t][2],uri.getAuthority());
-            assertEquals(t+" "+path_tests[t][0],path_tests[t][3],uri.getHost());
-            assertEquals(t+" "+path_tests[t][0],path_tests[t][4]==null?-1:Integer.parseInt(path_tests[t][4]),uri.getPort());
-            assertEquals(t+" "+path_tests[t][0],path_tests[t][5],uri.getPath());
-            assertEquals(t+" "+path_tests[t][0],path_tests[t][6],uri.getParam());
-            assertEquals(t+" "+path_tests[t][0],path_tests[t][7],uri.getQuery());
-            assertEquals(t+" "+path_tests[t][0],path_tests[t][8],uri.getFragment());
-            assertEquals(path_tests[t][0], uri.toString());
-        }
-
-    }
-
-    @Test
-    public void testInvalidAddress() throws Exception
-    {
-        assertInvalidURI("http://[ffff::1:8080/", "Invalid URL; no closing ']' -- should throw exception");
-        assertInvalidURI("**", "only '*', not '**'");
-        assertInvalidURI("*/", "only '*', not '*/'");
-    }
-
-    private void assertInvalidURI(String invalidURI, String message)
-    {
-        HttpURI uri = new HttpURI();
-        try
-        {
-            uri.parse(invalidURI);
-            fail(message);
-        }
-        catch (IllegalArgumentException e)
-        {
-            assertTrue(true);
-        }
-    }
-
-    private final String[][] encoding_tests=
-    {
-       /* 0*/ {"/path/info","/path/info", "UTF-8"},
-       /* 1*/ {"/path/%69nfo","/path/info", "UTF-8"},
-       /* 2*/ {"http://host/path/%69nfo","/path/info", "UTF-8"},
-       /* 3*/ {"http://host/path/%69nf%c2%a4","/path/inf\u00a4", "UTF-8"},
-       /* 4*/ {"http://host/path/%E5", "/path/\u00e5", "ISO-8859-1"},
-       /* 5*/ {"/foo/%u30ED/bar%3Fabc%3D123%26xyz%3D456","/foo/\u30ed/bar?abc=123&xyz=456","UTF-8"}
-    };
-
-    @Test
-    public void testEncoded()
-    {
-        HttpURI uri = new HttpURI();
-
-        for (int t=0;t<encoding_tests.length;t++)
-        {
-            uri.parse(encoding_tests[t][0]);
-            assertEquals(""+t,encoding_tests[t][1],uri.getDecodedPath(encoding_tests[t][2]));
-            
-            if ("UTF-8".equalsIgnoreCase(encoding_tests[t][2]))
-                assertEquals(""+t,encoding_tests[t][1],uri.getDecodedPath());
-        }
-    }
-    
-    @Test
-    public void testNoPercentEncodingOfQueryUsingNonUTF8() throws Exception
-    {
-        byte[] utf8_bytes = "/%D0%A1%D1%82%D1%80%D0%BE%D0%BD%D0%B3-%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80/%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3?".getBytes("UTF-8");
-        byte[] cp1251_bytes = TypeUtil.fromHexString("e2fbe1f0e0edee3dd2e5ecefe5f0e0f2f3f0e0");
-        String expectedCP1251String = new String(cp1251_bytes, "cp1251");
-        String expectedCP1251Key = new String(cp1251_bytes, 0, 7, "cp1251");
-        String expectedCP1251Value = new String(cp1251_bytes, 8, cp1251_bytes.length-8, "cp1251");
-       
-        //paste both byte arrays together to form the uri
-        byte[] allbytes = new byte[utf8_bytes.length+cp1251_bytes.length];
-        int i=0;
-        for (;i<utf8_bytes.length;i++) {
-            allbytes[i] = utf8_bytes[i];
-        }
-        for (int j=0; j< cp1251_bytes.length;j++)
-            allbytes[i+j] = cp1251_bytes[j];
-        
-        //Test using a HttpUri that expects a particular charset encoding. See URIUtil.__CHARSET
-        HttpURI uri = new HttpURI(Charset.forName("cp1251"));
-        uri.parse(allbytes, 0, allbytes.length);
-        assertEquals(expectedCP1251String, uri.getQuery("cp1251"));
-        
-        //Test params decoded correctly
-        MultiMap params = new MultiMap();
-        uri.decodeQueryTo(params);
-        String val = params.getString(expectedCP1251Key);
-        assertNotNull(val);
-        assertEquals(expectedCP1251Value, val);
-        
-        //Test using HttpURI where you pass in the charset encoding.
-        HttpURI httpuri = new HttpURI();
-        httpuri.parse(allbytes,0,allbytes.length);
-        assertNotNull(httpuri.getQuery("UTF-8")); //still get back a query string, just incorrectly encoded
-        assertEquals(expectedCP1251String, httpuri.getQuery("cp1251"));
-        
-        //Test params decoded correctly
-        params.clear();
-        httpuri.decodeQueryTo(params, "cp1251");
-        val = params.getString(expectedCP1251Key);
-        assertNotNull(val);
-        assertEquals(expectedCP1251Value, val);
-        
-        //test able to set the query encoding and call getQueryString multiple times
-        Request request = new Request(null,null);
-        request.setUri(httpuri);    
-        request.setAttribute("org.eclipse.jetty.server.Request.queryEncoding", "ISO-8859-1");
-        assertNotNull (request.getQueryString()); //will be incorrect encoding but not null
-        request.setAttribute("org.eclipse.jetty.server.Request.queryEncoding", "cp1251");
-        assertEquals(expectedCP1251String, request.getQueryString());
-    }
-    
-    @Test
-    public void testPercentEncodingOfQueryStringUsingNonUTF8() throws UnsupportedEncodingException
-    {
-    
-      byte[] utf8_bytes = "/%D0%A1%D1%82%D1%80%D0%BE%D0%BD%D0%B3-%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80/%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3?".getBytes("UTF-8");
-      byte[] cp1251_bytes = "%e2%fb%e1%f0%e0%ed%ee=%d2%e5%ec%ef%e5%f0%e0%f2%f3%f0%e0".getBytes("cp1251");
-      
-      byte[] key_bytes = TypeUtil.fromHexString("e2fbe1f0e0edee");
-      byte[] val_bytes = TypeUtil.fromHexString("d2e5ecefe5f0e0f2f3f0e0");
-      String expectedCP1251String = new String(cp1251_bytes, "cp1251");
-      String expectedCP1251Key = new String(key_bytes, "cp1251");
-      String expectedCP1251Value = new String(val_bytes, "cp1251");
-      
-      byte[] allbytes = new byte[utf8_bytes.length+cp1251_bytes.length];
-      
-      //stick both arrays together to form uri
-      int i=0;
-      for (;i<utf8_bytes.length;i++) {
-          allbytes[i] = utf8_bytes[i];
-      }
-      for (int j=0; j< cp1251_bytes.length;j++)
-          allbytes[i+j] = cp1251_bytes[j];
-
-
-      HttpURI httpuri = new HttpURI();
-      httpuri.parse(allbytes,0,allbytes.length);
-      assertNotNull(httpuri.getQuery("UTF-8")); //will be incorrectly encoded, but no errors
-      assertEquals(expectedCP1251String, httpuri.getQuery("cp1251"));
-
-      //test params decoded correctly
-      MultiMap params = new MultiMap();
-      httpuri.decodeQueryTo(params, "cp1251");
-      String val = params.getString(expectedCP1251Key);
-      assertNotNull(val);
-      assertEquals(expectedCP1251Value, val);
-      
-      //test able to set the query encoding and call getQueryString multiple times
-      Request request = new Request(null,null);
-      request.setUri(httpuri);    
-      request.setAttribute("org.eclipse.jetty.server.Request.queryEncoding", "ISO-8859-1");
-      assertNotNull (request.getQueryString()); //will be incorrect encoding but not null
-      request.setAttribute("org.eclipse.jetty.server.Request.queryEncoding", "cp1251");
-      assertEquals(expectedCP1251String, request.getQueryString());
-      
-    }
-
-    @Test
-    public void testUnicodeErrors() throws UnsupportedEncodingException
-    {
-        String uri="http://server/path?invalid=data%uXXXXhere%u000";
-        try
-        {
-            URLDecoder.decode(uri,"UTF-8");
-            Assert.assertTrue(false);
-        }
-        catch (IllegalArgumentException e)
-        {
-        }
-
-        HttpURI huri=new HttpURI(uri);
-        MultiMap<String> params = new MultiMap<>();
-        huri.decodeQueryTo(params);
-        assertEquals("data"+Utf8Appendable.REPLACEMENT+"here"+Utf8Appendable.REPLACEMENT,params.getValue("invalid",0));
-
-        huri=new HttpURI(uri);
-        params = new MultiMap<>();
-        huri.decodeQueryTo(params,StandardCharsets.UTF_8);
-        assertEquals("data"+Utf8Appendable.REPLACEMENT+"here"+Utf8Appendable.REPLACEMENT,params.getValue("invalid",0));
-
-    }
-
-    @Test
-    public void testExtB() throws Exception
-    {
-        for (String value: new String[]{"a","abcdABCD","\u00C0","\u697C","\uD869\uDED5","\uD840\uDC08"} )
-        {
-            HttpURI uri = new HttpURI("/path?value="+URLEncoder.encode(value,"UTF-8"));
-
-            MultiMap<String> parameters = new MultiMap<>();
-            uri.decodeQueryTo(parameters,StandardCharsets.UTF_8);
-            assertEquals(value,parameters.getString("value"));
-        }
-    }
-
-
-    private final String[][] connect_tests=
-    {
-       /* 0*/ {"  localhost:8080  ","localhost","8080"},
-       /* 1*/ {"  127.0.0.1:8080  ","127.0.0.1","8080"},
-       /* 2*/ {"  [127::0::0::1]:8080  ","[127::0::0::1]","8080"},
-       /* 3*/ {"  error  ",null,null},
-       /* 4*/ {"  http://localhost:8080/  ",null,null},
-    };
-
-    @Test
-    public void testCONNECT() throws Exception
-    {
-        HttpURI uri = new HttpURI();
-        for (int i=0;i<connect_tests.length;i++)
-        {
-            try
-            {
-                byte[] buf = connect_tests[i][0].getBytes(StandardCharsets.UTF_8);
-
-                uri.parseConnect(buf,2,buf.length-4);
-                assertEquals("path"+i,connect_tests[i][0].trim(),uri.getPath());
-                assertEquals("host"+i,connect_tests[i][1],uri.getHost());
-                assertEquals("port"+i,Integer.parseInt(connect_tests[i][2]),uri.getPort());
-            }
-            catch(Exception e)
-            {
-                assertNull("error"+i,connect_tests[i][1]);
-            }
-        }
-    }
-
-    @Test
-    public void testNonURIAscii() throws Exception
-    {
-        String url = "http://www.foo.com/ma\u00F1ana";
-        byte[] asISO = url.getBytes(StandardCharsets.ISO_8859_1);
-        new String(asISO, StandardCharsets.ISO_8859_1);
-
-        //use a non UTF-8 charset as the encoding and url-escape as per
-        //http://www.w3.org/TR/html40/appendix/notes.html#non-ascii-chars
-        String s = URLEncoder.encode(url, "ISO-8859-1");
-        HttpURI uri = new HttpURI(StandardCharsets.ISO_8859_1);
-
-        //parse it, using the same encoding
-        uri.parse(s);
-
-        //decode the url encoding
-        String d = URLDecoder.decode(uri.getCompletePath(), "ISO-8859-1");
-        assertEquals(url, d);
-    }
-}
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpWriterTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpWriterTest.java
index 4bc9d99..1d75485 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpWriterTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpWriterTest.java
@@ -24,8 +24,8 @@
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 
+import org.eclipse.jetty.io.ArrayByteBufferPool;
 import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.io.MappedByteBufferPool;
 import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.TypeUtil;
@@ -43,16 +43,17 @@
     {
         _bytes = BufferUtil.allocate(2048);
 
-        final ByteBufferPool bufferPool = new MappedByteBufferPool();
-        HttpChannel<?> channel = new HttpChannel<ByteBuffer>(null,new HttpConfiguration(),null,null,new ByteBufferQueuedHttpInput())
+        final ByteBufferPool pool = new ArrayByteBufferPool();
+        
+        HttpChannel channel = new HttpChannel(null,new HttpConfiguration(),null,null)
         {
             @Override
             public ByteBufferPool getByteBufferPool()
             {
-                return bufferPool;
+                return pool;
             }
         };
-
+        
         _httpOut = new HttpOutput(channel)
         {
             @Override
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/PartialRFC2616Test.java b/jetty-server/src/test/java/org/eclipse/jetty/server/PartialRFC2616Test.java
index 439ac20..ec73fe7 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/PartialRFC2616Test.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/PartialRFC2616Test.java
@@ -37,14 +37,17 @@
 import org.eclipse.jetty.http.HttpFields;
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.server.handler.HandlerCollection;
+import org.eclipse.jetty.toolchain.test.AdvancedRunner;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 
 /**
  *
  */
+@RunWith(AdvancedRunner.class)
 public class PartialRFC2616Test
 {
     private Server server;
@@ -102,7 +105,7 @@
             assertEquals("3.3.1 RFC 850 ANSI C",d3,d2);
 
             fields.putDateField("Date",d1.getTime());
-            assertEquals("3.3.1 RFC 822 preferred","Sun, 06 Nov 1994 08:49:37 GMT",fields.getStringField("Date"));
+            assertEquals("3.3.1 RFC 822 preferred","Sun, 06 Nov 1994 08:49:37 GMT",fields.get("Date"));
         }
         catch (Exception e)
         {
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ProxyConnectionTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ProxyConnectionTest.java
new file mode 100644
index 0000000..5d2e359
--- /dev/null
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ProxyConnectionTest.java
@@ -0,0 +1,171 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server;
+
+import org.eclipse.jetty.server.handler.ErrorHandler;
+import org.hamcrest.Matchers;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ *
+ */
+public class ProxyConnectionTest
+{
+    private Server _server;
+    private LocalConnector _connector;
+
+    @Before
+    public void init() throws Exception
+    {
+        _server = new Server();
+
+        
+        HttpConnectionFactory http = new HttpConnectionFactory();
+        http.getHttpConfiguration().setRequestHeaderSize(1024);
+        http.getHttpConfiguration().setResponseHeaderSize(1024);
+        
+        ProxyConnectionFactory proxy = new ProxyConnectionFactory();
+        
+        _connector = new LocalConnector(_server,null,null,null,1,proxy,http);
+        _connector.setIdleTimeout(1000);
+        _server.addConnector(_connector);
+        _server.setHandler(new DumpHandler());
+        ErrorHandler eh=new ErrorHandler();
+        eh.setServer(_server);
+        _server.addBean(eh);
+        _server.start();
+    }
+
+    @After
+    public void destroy() throws Exception
+    {
+        _server.stop();
+        _server.join();
+    }
+
+    @Test
+    public void testSimple() throws Exception
+    {
+        String response=_connector.getResponses("PROXY TCP 1.2.3.4 5.6.7.8 111 222\r\n"+
+                "GET /path HTTP/1.1\n"+
+                "Host: server:80\n"+
+                "Connection: close\n"+
+                "\n");
+        
+        Assert.assertThat(response,Matchers.containsString("HTTP/1.1 200"));
+        Assert.assertThat(response,Matchers.containsString("pathInfo=/path"));
+        Assert.assertThat(response,Matchers.containsString("local=5.6.7.8:222"));
+        Assert.assertThat(response,Matchers.containsString("remote=1.2.3.4:111"));
+    }
+    
+    @Test
+    public void testIPv6() throws Exception
+    {
+        String response=_connector.getResponses("PROXY UNKNOWN eeee:eeee:eeee:eeee:eeee:eeee:eeee:eeee ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff 65535 65535\r\n"+
+                "GET /path HTTP/1.1\n"+
+                "Host: server:80\n"+
+                "Connection: close\n"+
+                "\n");
+        
+        Assert.assertThat(response,Matchers.containsString("HTTP/1.1 200"));
+        Assert.assertThat(response,Matchers.containsString("pathInfo=/path"));
+        Assert.assertThat(response,Matchers.containsString("remote=eeee:eeee:eeee:eeee:eeee:eeee:eeee:eeee:65535"));
+        Assert.assertThat(response,Matchers.containsString("local=ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:65535"));
+    }
+    
+    @Test
+    public void testTooLong() throws Exception
+    {
+        String response=_connector.getResponses("PROXY TOOLONG!!! eeee:eeee:eeee:eeee:0000:0000:0000:0000 ffff:ffff:ffff:ffff:0000:0000:0000:0000 65535 65535\r\n"+
+                "GET /path HTTP/1.1\n"+
+                "Host: server:80\n"+
+                "Connection: close\n"+
+                "\n");
+        
+        Assert.assertThat(response,Matchers.equalTo(""));
+    }
+    
+    @Test
+    public void testNotComplete() throws Exception
+    {
+        _connector.setIdleTimeout(100);
+        String response=_connector.getResponses("PROXY TIMEOUT");
+        Assert.assertThat(response,Matchers.equalTo(""));
+    }
+    
+    @Test
+    public void testBadChar() throws Exception
+    {
+        String response=_connector.getResponses("PROXY\tTCP 1.2.3.4 5.6.7.8 111 222\r\n"+
+                "GET /path HTTP/1.1\n"+
+                "Host: server:80\n"+
+                "Connection: close\n"+
+                "\n");
+        Assert.assertThat(response,Matchers.equalTo(""));
+    }
+    
+    @Test
+    public void testBadCRLF() throws Exception
+    {
+        String response=_connector.getResponses("PROXY TCP 1.2.3.4 5.6.7.8 111 222\r \n"+
+                "GET /path HTTP/1.1\n"+
+                "Host: server:80\n"+
+                "Connection: close\n"+
+                "\n");
+        Assert.assertThat(response,Matchers.equalTo(""));
+    }
+    
+    @Test
+    public void testBadPort() throws Exception
+    {
+        String response=_connector.getResponses("PROXY TCP 1.2.3.4 5.6.7.8 9999999999999 222\r\n"+
+                "GET /path HTTP/1.1\n"+
+                "Host: server:80\n"+
+                "Connection: close\n"+
+                "\n");
+        Assert.assertThat(response,Matchers.equalTo(""));
+    }
+    
+    @Test
+    public void testMissingField() throws Exception
+    {
+        String response=_connector.getResponses("PROXY TCP 1.2.3.4 5.6.7.8 222\r\n"+
+                "GET /path HTTP/1.1\n"+
+                "Host: server:80\n"+
+                "Connection: close\n"+
+                "\n");
+        Assert.assertThat(response,Matchers.equalTo(""));
+    }
+    
+    @Test
+    public void testHTTP() throws Exception
+    {
+        String response=_connector.getResponses(
+                "GET /path HTTP/1.1\n"+
+                "Host: server:80\n"+
+                "Connection: close\n"+
+                "\n");
+        Assert.assertThat(response,Matchers.equalTo(""));
+    }
+}
+
+
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/QueuedHttpInputTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/QueuedHttpInputTest.java
deleted file mode 100644
index cac01b0..0000000
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/QueuedHttpInputTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.server;
-
-import org.junit.Test;
-
-public class QueuedHttpInputTest
-{
-    @Test
-    public void testNoContentMessageComplete() throws Exception
-    {
-        ByteBufferQueuedHttpInput input = new ByteBufferQueuedHttpInput();
-        input.messageComplete();
-
-        input.getNextContent();
-    }
-}
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java
index 307d5dd..bfe27e4 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java
@@ -18,7 +18,6 @@
 
 package org.eclipse.jetty.server;
 
-import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.startsWith;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -58,7 +57,6 @@
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.util.IO;
 import org.eclipse.jetty.util.MultiPartInputStreamParser;
-import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.Utf8Appendable;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
@@ -66,6 +64,7 @@
 import org.hamcrest.Matchers;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 public class RequestTest
@@ -130,6 +129,7 @@
 
     }
 
+    @Ignore("Empty headers are not 7230 compliant")
     @Test
     public void testEmptyHeaders() throws Exception
     {
@@ -229,7 +229,7 @@
         contextHandler.setContextPath("/foo");
         contextHandler.setResourceBase(".");
         contextHandler.setHandler(new MultiPartRequestHandler(testTmpDir));
-        contextHandler.addEventListener(new Request.MultiPartCleanerListener()
+        contextHandler.addEventListener(new MultiPartCleanerListener()
         {
 
             @Override
@@ -291,7 +291,7 @@
         contextHandler.setContextPath("/foo");
         contextHandler.setResourceBase(".");
         contextHandler.setHandler(new BadMultiPartRequestHandler(testTmpDir));
-        contextHandler.addEventListener(new Request.MultiPartCleanerListener()
+        contextHandler.addEventListener(new MultiPartCleanerListener()
         {
 
             @Override
@@ -358,9 +358,9 @@
         "Connection: close\n"+
         "\n";
 
-        LOG.info("Expecting NotUtf8Exception byte 62 in state 3...");
+        LOG.info("Expecting NotUtf8Exception in state 36...");
         String responses=_connector.getResponses(request);
-        assertTrue(responses.startsWith("HTTP/1.1 200"));
+        assertThat(responses,startsWith("HTTP/1.1 200"));
     }
 
     @Test
@@ -382,13 +382,13 @@
         "\n";
 
         String responses=_connector.getResponses(request);
-        assertThat(responses,Matchers.startsWith("HTTP/1.1 400"));
+        assertThat(responses, Matchers.startsWith("HTTP/1.1 400"));
     }
 
     @Test
     public void testContentTypeEncoding() throws Exception
     {
-        final ArrayList<String> results = new ArrayList<String>();
+        final ArrayList<String> results = new ArrayList<>();
         _handler._checker = new RequestTester()
         {
             @Override
@@ -428,10 +428,10 @@
         assertEquals(null,results.get(i++));
 
         assertEquals("text/html;charset=utf8",results.get(i++));
-        assertEquals("UTF-8",results.get(i++));
+        assertEquals("utf-8",results.get(i++));
 
         assertEquals("text/html; charset=\"utf8\"",results.get(i++));
-        assertEquals("UTF-8",results.get(i++));
+        assertEquals("utf-8",results.get(i++));
 
         assertTrue(results.get(i++).startsWith("text/html"));
         assertEquals(" x=z; ",results.get(i++));
@@ -440,7 +440,7 @@
     @Test
     public void testHostPort() throws Exception
     {
-        final ArrayList<String> results = new ArrayList<String>();
+        final ArrayList<String> results = new ArrayList<>();
         _handler._checker = new RequestTester()
         {
             @Override
@@ -461,7 +461,7 @@
                 "Connection: close\n"+
                 "\n");
         int i=0;
-        assertThat(response,Matchers.containsString("200 OK"));
+        assertThat(response, Matchers.containsString("200 OK"));
         assertEquals("http://myhost/",results.get(i++));
         assertEquals("0.0.0.0",results.get(i++));
         assertEquals("myhost",results.get(i++));
@@ -475,7 +475,7 @@
                 "Connection: close\n"+
                 "\n");
         i=0;
-        assertThat(response,Matchers.containsString("200 OK"));
+        assertThat(response, Matchers.containsString("200 OK"));
         assertEquals("http://myhost:8888/",results.get(i++));
         assertEquals("0.0.0.0",results.get(i++));
         assertEquals("myhost",results.get(i++));
@@ -487,7 +487,7 @@
                 "GET http://myhost:8888/ HTTP/1.0\n"+
                 "\n");
         i=0;
-        assertThat(response,Matchers.containsString("200 OK"));
+        assertThat(response, Matchers.containsString("200 OK"));
         assertEquals("http://myhost:8888/",results.get(i++));
         assertEquals("0.0.0.0",results.get(i++));
         assertEquals("myhost",results.get(i++));
@@ -500,7 +500,7 @@
                 "Connection: close\n"+
                 "\n");
         i=0;
-        assertThat(response,Matchers.containsString("200 OK"));
+        assertThat(response, Matchers.containsString("200 OK"));
         assertEquals("http://myhost:8888/",results.get(i++));
         assertEquals("0.0.0.0",results.get(i++));
         assertEquals("myhost",results.get(i++));
@@ -515,7 +515,7 @@
                 "\n");
         i=0;
 
-        assertThat(response,Matchers.containsString("200 OK"));
+        assertThat(response, Matchers.containsString("200 OK"));
         assertEquals("http://1.2.3.4/",results.get(i++));
         assertEquals("0.0.0.0",results.get(i++));
         assertEquals("1.2.3.4",results.get(i++));
@@ -529,7 +529,7 @@
                 "Connection: close\n"+
                 "\n");
         i=0;
-        assertThat(response,Matchers.containsString("200 OK"));
+        assertThat(response, Matchers.containsString("200 OK"));
         assertEquals("http://1.2.3.4:8888/",results.get(i++));
         assertEquals("0.0.0.0",results.get(i++));
         assertEquals("1.2.3.4",results.get(i++));
@@ -543,7 +543,7 @@
                 "Connection: close\n"+
                 "\n");
         i=0;
-        assertThat(response,Matchers.containsString("200 OK"));
+        assertThat(response, Matchers.containsString("200 OK"));
         assertEquals("http://[::1]/",results.get(i++));
         assertEquals("0.0.0.0",results.get(i++));
         assertEquals("[::1]",results.get(i++));
@@ -557,7 +557,7 @@
                 "Connection: close\n"+
                 "\n");
         i=0;
-        assertThat(response,Matchers.containsString("200 OK"));
+        assertThat(response, Matchers.containsString("200 OK"));
         assertEquals("http://[::1]:8888/",results.get(i++));
         assertEquals("0.0.0.0",results.get(i++));
         assertEquals("[::1]",results.get(i++));
@@ -573,7 +573,7 @@
                 "Connection: close\n"+
                 "\n");
         i=0;
-        assertThat(response,Matchers.containsString("200 OK"));
+        assertThat(response, Matchers.containsString("200 OK"));
         assertEquals("https://[::1]/",results.get(i++));
         assertEquals("remote",results.get(i++));
         assertEquals("[::1]",results.get(i++));
@@ -589,7 +589,7 @@
                 "x-forwarded-proto: https\n"+
                 "\n");
         i=0;
-        assertThat(response,Matchers.containsString("200 OK"));
+        assertThat(response, Matchers.containsString("200 OK"));
         assertEquals("https://[::1]:8888/",results.get(i++));
         assertEquals("remote",results.get(i++));
         assertEquals("[::1]",results.get(i++));
@@ -637,13 +637,89 @@
             Log.getRootLogger().debug("test l={}",l);
             String response = _connector.getResponses(request);
             Log.getRootLogger().debug(response);
-            assertThat(response,Matchers.containsString(" 200 OK"));
+            assertThat(response, Matchers.containsString(" 200 OK"));
             assertEquals(l,length.get());
             content+="x";
         }
     }
 
     @Test
+    public void testEncodedForm() throws Exception
+    {
+        _handler._checker = new RequestTester()
+        {
+            @Override
+            public boolean check(HttpServletRequest request,HttpServletResponse response) throws IOException
+            {
+                String actual = request.getParameter("name2");
+                return "test2".equals(actual);
+            }
+        };
+
+
+        String content="name1=test&name2=test2&name3=&name4=test";
+        String request="POST / HTTP/1.1\r\n"+
+            "Host: whatever\r\n"+
+            "Content-Type: "+MimeTypes.Type.FORM_ENCODED.asString()+"\r\n" +
+            "Content-Length: "+content.length()+"\r\n"+
+            "Connection: close\r\n"+
+            "\r\n"+
+            content;
+        String response = _connector.getResponses(request);
+        assertThat(response,Matchers.containsString(" 200 OK"));
+    }
+
+    @Test
+    public void testEncodedFormUnknownMethod() throws Exception
+    {
+        _handler._checker = new RequestTester()
+        {
+            @Override
+            public boolean check(HttpServletRequest request,HttpServletResponse response) throws IOException
+            {
+                return request.getParameter("name1")==null && request.getParameter("name2")==null && request.getParameter("name3")==null;
+            }
+        };
+
+        String content="name1=test&name2=test2&name3=&name4=test";
+        String request="UNKNOWN / HTTP/1.1\r\n"+
+            "Host: whatever\r\n"+
+            "Content-Type: "+MimeTypes.Type.FORM_ENCODED.asString()+"\r\n" +
+            "Content-Length: "+content.length()+"\r\n"+
+            "Connection: close\r\n"+
+            "\r\n"+
+            content;
+        String response = _connector.getResponses(request);
+        assertThat(response,Matchers.containsString(" 200 OK"));
+    }
+
+    @Test
+    public void testEncodedFormExtraMethod() throws Exception
+    {
+        _handler._checker = new RequestTester()
+        {
+            @Override
+            public boolean check(HttpServletRequest request,HttpServletResponse response) throws IOException
+            {
+                String actual = request.getParameter("name2");
+                return "test2".equals(actual);
+            }
+        };
+
+        _connector.getConnectionFactory(HttpConnectionFactory.class).getHttpConfiguration().addFormEncodedMethod("Extra");
+        String content="name1=test&name2=test2&name3=&name4=test";
+        String request="EXTRA / HTTP/1.1\r\n"+
+            "Host: whatever\r\n"+
+            "Content-Type: "+MimeTypes.Type.FORM_ENCODED.asString()+"\r\n" +
+            "Content-Length: "+content.length()+"\r\n"+
+            "Connection: close\r\n"+
+            "\r\n"+
+            content;
+        String response = _connector.getResponses(request);
+        assertThat(response,Matchers.containsString(" 200 OK"));
+    }
+    
+    @Test
     public void test8859EncodedForm() throws Exception
     {
         _handler._checker = new RequestTester()
@@ -659,7 +735,6 @@
             }
         };
 
-
         String content="name1=test&name2=test%E4&name3=&name4=test";
         String request="POST / HTTP/1.1\r\n"+
             "Host: whatever\r\n"+
@@ -888,9 +963,9 @@
                     "\n",
                     200, TimeUnit.MILLISECONDS
                     );
-        assertTrue(response.indexOf("200")>0);
-        assertFalse(response.indexOf("Connection: close")>0);
-        assertTrue(response.indexOf("Hello World")>0);
+        assertThat(response, Matchers.containsString("200"));
+        assertThat(response, Matchers.not(Matchers.containsString("Connection: close")));
+        assertThat(response, Matchers.containsString("Hello World"));
 
         response=_connector.getResponses(
                     "GET / HTTP/1.1\n"+
@@ -898,9 +973,9 @@
                     "Connection: close\n"+
                     "\n"
                     );
-        assertTrue(response.indexOf("200")>0);
-        assertTrue(response.indexOf("Connection: close")>0);
-        assertTrue(response.indexOf("Hello World")>0);
+        assertThat(response, Matchers.containsString("200"));
+        assertThat(response, Matchers.containsString("Connection: close"));
+        assertThat(response, Matchers.containsString("Hello World"));
 
         response=_connector.getResponses(
                     "GET / HTTP/1.1\n"+
@@ -909,18 +984,18 @@
                     "\n"
                     );
 
-        assertTrue(response.indexOf("200")>0);
-        assertTrue(response.indexOf("Connection: close")>0);
-        assertTrue(response.indexOf("Hello World")>0);
+        assertThat(response, Matchers.containsString("200"));
+        assertThat(response, Matchers.containsString("Connection: close"));
+        assertThat(response, Matchers.containsString("Hello World"));
 
         response=_connector.getResponses(
                     "GET / HTTP/1.0\n"+
                     "Host: whatever\n"+
                     "\n"
                     );
-        assertTrue(response.indexOf("200")>0);
-        assertFalse(response.indexOf("Connection: close")>0);
-        assertTrue(response.indexOf("Hello World")>0);
+        assertThat(response, Matchers.containsString("200"));
+        assertThat(response, Matchers.not(Matchers.containsString("Connection: close")));
+        assertThat(response, Matchers.containsString("Hello World"));
 
         response=_connector.getResponses(
                     "GET / HTTP/1.0\n"+
@@ -928,8 +1003,8 @@
                     "Connection: Other, close\n"+
                     "\n"
                     );
-        assertTrue(response.indexOf("200")>0);
-        assertTrue(response.indexOf("Hello World")>0);
+        assertThat(response, Matchers.containsString("200"));
+        assertThat(response, Matchers.containsString("Hello World"));
 
         response=_connector.getResponses(
                     "GET / HTTP/1.0\n"+
@@ -938,9 +1013,9 @@
                     "\n",
                     200, TimeUnit.MILLISECONDS
                     );
-        assertTrue(response.indexOf("200")>0);
-        assertTrue(response.indexOf("Connection: keep-alive")>0);
-        assertTrue(response.indexOf("Hello World")>0);
+        assertThat(response, Matchers.containsString("200"));
+        assertThat(response, Matchers.containsString("Connection: keep-alive"));
+        assertThat(response, Matchers.containsString("Hello World"));
 
         _handler._checker = new RequestTester()
         {
@@ -960,9 +1035,9 @@
                     "\n",
                     200, TimeUnit.MILLISECONDS
                     );
-        assertTrue(response.indexOf("200")>0);
-        assertTrue(response.indexOf("Connection: TE,Other")>0);
-        assertTrue(response.indexOf("Hello World")>0);
+        assertThat(response, Matchers.containsString("200"));
+        assertThat(response, Matchers.containsString("Connection: TE,Other"));
+        assertThat(response, Matchers.containsString("Hello World"));
 
         response=_connector.getResponses(
                     "GET / HTTP/1.1\n"+
@@ -970,15 +1045,15 @@
                     "Connection: close\n"+
                     "\n"
                     );
-        assertThat(response,Matchers.containsString("200 OK"));
-        assertThat(response,Matchers.containsString("Connection: close"));
-        assertThat(response,Matchers.containsString("Hello World"));
+        assertThat(response, Matchers.containsString("200 OK"));
+        assertThat(response, Matchers.containsString("Connection: close"));
+        assertThat(response, Matchers.containsString("Hello World"));
     }
 
     @Test
     public void testCookies() throws Exception
     {
-        final ArrayList<Cookie> cookies = new ArrayList<Cookie>();
+        final ArrayList<Cookie> cookies = new ArrayList<>();
 
         _handler._checker = new RequestTester()
         {
@@ -1048,8 +1123,8 @@
                 "Connection: close\n"+
                 "\n"
         );
-        assertThat(response,startsWith("HTTP/1.1 200 OK"));
-        assertThat(response.substring(15),containsString("HTTP/1.1 200 OK"));
+        assertThat(response, Matchers.startsWith("HTTP/1.1 200 OK"));
+        assertThat(response.substring(15), Matchers.containsString("HTTP/1.1 200 OK"));
         assertEquals(4,cookies.size());
         assertEquals("name", cookies.get(0).getName());
         assertEquals("value", cookies.get(0).getValue());
@@ -1073,8 +1148,8 @@
                 "Connection: close\n"+
                 "\n"
         );
-        assertThat(response,startsWith("HTTP/1.1 200 OK"));
-        assertThat(response.substring(15),containsString("HTTP/1.1 200 OK"));
+        assertThat(response, Matchers.startsWith("HTTP/1.1 200 OK"));
+        assertThat(response.substring(15), Matchers.containsString("HTTP/1.1 200 OK"));
         assertEquals(4,cookies.size());
         assertEquals("name", cookies.get(0).getName());
         assertEquals("value", cookies.get(0).getValue());
@@ -1133,6 +1208,7 @@
 
     }
 
+    @Ignore("No longer relevant")
     @Test
     public void testCookieLeak() throws Exception
     {
@@ -1178,7 +1254,7 @@
         +
         "POST / HTTP/1.1\r\n"+
         "Host: whatever\r\n"+
-        "Cookie:\r\n"+
+        "Cookie: \r\n"+
         "Connection: close\r\n"+
         "\r\n";
 
@@ -1260,7 +1336,7 @@
         {
             long start=System.currentTimeMillis();
             String response = _connector.getResponses(request);
-            assertTrue(response.contains("Form too many keys"));
+            assertThat(response,Matchers.containsString("IllegalStateException"));
             long now=System.currentTimeMillis();
             assertTrue((now-start)<5000);
         }
@@ -1306,7 +1382,7 @@
         {
             long start=System.currentTimeMillis();
             String response = _connector.getResponses(request);
-            assertTrue(response.contains("Form too large:"));
+            assertTrue(response.contains("IllegalStateException"));
             long now=System.currentTimeMillis();
             assertTrue((now-start)<5000);
         }
@@ -1413,7 +1489,7 @@
                 request.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, mpce);
 
                 //We should get an error when we getParams if there was a problem parsing the multipart
-                String field1 = request.getParameter("xxx");
+                request.getParameter("xxx");
                 //A 200 response is actually wrong here
             }
             catch (RuntimeException e)
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ResourceCacheTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ResourceCacheTest.java
index 5ed9afa..67c6e24 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/ResourceCacheTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ResourceCacheTest.java
@@ -29,6 +29,7 @@
 
 import org.eclipse.jetty.http.HttpContent;
 import org.eclipse.jetty.http.MimeTypes;
+import org.eclipse.jetty.http.ResourceHttpContent;
 import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.util.resource.Resource;
 import org.eclipse.jetty.util.resource.ResourceCollection;
@@ -48,9 +49,9 @@
         Resource[] r = rc.getResources();
         MimeTypes mime = new MimeTypes();
 
-        ResourceCache rc3 = new ResourceCache(null,r[2],mime,false,false);
-        ResourceCache rc2 = new ResourceCache(rc3,r[1],mime,false,false);
-        ResourceCache rc1 = new ResourceCache(rc2,r[0],mime,false,false);
+        ResourceCache rc3 = new ResourceCache(null,r[2],mime,false,false,false);
+        ResourceCache rc2 = new ResourceCache(rc3,r[1],mime,false,false,false);
+        ResourceCache rc1 = new ResourceCache(rc2,r[0],mime,false,false,false);
 
         assertEquals("1 - one", getContent(rc1, "1.txt"));
         assertEquals("2 - two", getContent(rc1, "2.txt"));
@@ -78,8 +79,8 @@
         Resource[] r = rc.getResources();
         MimeTypes mime = new MimeTypes();
 
-        ResourceCache rc3 = new ResourceCache(null,r[2],mime,false,false);
-        ResourceCache rc2 = new ResourceCache(rc3,r[1],mime,false,false)
+        ResourceCache rc3 = new ResourceCache(null,r[2],mime,false,false,false);
+        ResourceCache rc2 = new ResourceCache(rc3,r[1],mime,false,false,false)
         {
             @Override
             public boolean isCacheable(Resource resource)
@@ -88,7 +89,7 @@
             }
         };
 
-        ResourceCache rc1 = new ResourceCache(rc2,r[0],mime,false,false);
+        ResourceCache rc1 = new ResourceCache(rc2,r[0],mime,false,false,false);
 
         assertEquals("1 - one", getContent(rc1, "1.txt"));
         assertEquals("2 - two", getContent(rc1, "2.txt"));
@@ -129,19 +130,19 @@
         directory=Resource.newResource(files[0].getParentFile().getAbsolutePath());
 
 
-        cache=new ResourceCache(null,directory,new MimeTypes(),false,false);
+        cache=new ResourceCache(null,directory,new MimeTypes(),false,false,false);
 
         cache.setMaxCacheSize(95);
         cache.setMaxCachedFileSize(85);
         cache.setMaxCachedFiles(4);
 
         assertTrue(cache.lookup("does not exist")==null);
-        assertTrue(cache.lookup(names[9]) instanceof HttpContent.ResourceAsHttpContent);
+        assertTrue(cache.lookup(names[9]) instanceof ResourceHttpContent);
 
         HttpContent content;
         content=cache.lookup(names[8]);
         assertTrue(content!=null);
-        assertEquals(80,content.getContentLength());
+        assertEquals(80,content.getContentLengthValue());
 
         assertEquals(80,cache.getCachedSize());
         assertEquals(1,cache.getCachedFiles());
@@ -242,7 +243,7 @@
         Resource[] resources = rc.getResources();
         MimeTypes mime = new MimeTypes();
 
-        ResourceCache cache = new ResourceCache(null,resources[0],mime,false,false);
+        ResourceCache cache = new ResourceCache(null,resources[0],mime,false,false,false);
 
         assertEquals("4 - four", getContent(cache, "four.txt"));
         assertEquals("4 - four (no extension)", getContent(cache, "four"));
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java
index 4bd9597..8af5fdc 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java
@@ -44,11 +44,13 @@
 import javax.servlet.http.HttpServletResponse;
 
 import org.eclipse.jetty.http.HttpFields;
-import org.eclipse.jetty.http.HttpGenerator.ResponseInfo;
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpURI;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
 import org.eclipse.jetty.io.AbstractEndPoint;
 import org.eclipse.jetty.io.ByteArrayEndPoint;
+import org.eclipse.jetty.io.RuntimeIOException;
 import org.eclipse.jetty.server.handler.AbstractHandler;
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.server.session.HashSessionIdManager;
@@ -66,7 +68,7 @@
 public class ResponseTest
 {
     private Server _server;
-    private HttpChannel<ByteBuffer> _channel;
+    private HttpChannel _channel;
 
     @Before
     public void init() throws Exception
@@ -80,33 +82,47 @@
         _server.start();
 
         AbstractEndPoint endp = new ByteArrayEndPoint(_scheduler, 5000);
-        ByteBufferQueuedHttpInput input = new ByteBufferQueuedHttpInput();
-        _channel = new HttpChannel<ByteBuffer>(connector, new HttpConfiguration(), endp, new HttpTransport()
+        _channel = new HttpChannel(connector, new HttpConfiguration(), endp, new HttpTransport()
         {
+            private Throwable _channelError;
+            
             @Override
-            public void send(ResponseInfo info, ByteBuffer content, boolean lastContent, Callback callback)
+            public void send(MetaData.Response info, boolean head, ByteBuffer content, boolean lastContent, Callback callback)
             {
-                callback.succeeded();
+                if (_channelError==null)
+                    callback.succeeded();
+                else
+                    callback.failed(_channelError);
+            }
+
+            @Override
+            public boolean isPushSupported()
+            {
+                return false;
             }
             
             @Override
-            public void send(ByteBuffer responseBodyContent, boolean lastContent, Callback callback)
-            {
-                send(null,responseBodyContent, lastContent, callback);
+            public void push(org.eclipse.jetty.http.MetaData.Request request)
+            {   
             }
-
+            
             @Override
-            public void completed()
+            public void onCompleted()
             {
             }
 
             @Override
-            public void abort()
+            public void abort(Throwable failure)
             {
-                
+                _channelError=failure;
             }
 
-        }, input);
+            @Override
+            public boolean isOptimizedForDirectBuffers()
+            {
+                return false;
+            }
+        });
     }
 
     @After
@@ -129,9 +145,9 @@
         response.setContentType("foo/bar");
         assertEquals("foo/bar", response.getContentType());
         response.getWriter();
-        assertEquals("foo/bar; charset=ISO-8859-1", response.getContentType());
+        assertEquals("foo/bar;charset=iso-8859-1", response.getContentType());
         response.setContentType("foo2/bar2");
-        assertEquals("foo2/bar2; charset=ISO-8859-1", response.getContentType());
+        assertEquals("foo2/bar2;charset=iso-8859-1", response.getContentType());
         response.setHeader("name", "foo");
 
         Iterator<String> en = response.getHeaders("name").iterator();
@@ -148,16 +164,16 @@
         response.setContentType("text/html");
         assertEquals("text/html", response.getContentType());
         response.getWriter();
-        assertEquals("text/html; charset=ISO-8859-1", response.getContentType());
+        assertEquals("text/html;charset=utf-8", response.getContentType());
         response.setContentType("foo2/bar2");
-        assertEquals("foo2/bar2; charset=ISO-8859-1", response.getContentType());
+        assertEquals("foo2/bar2;charset=utf-8", response.getContentType());
 
         response.recycle();
         response.setContentType("text/xml;charset=ISO-8859-7");
         response.getWriter();
         assertEquals("text/xml;charset=ISO-8859-7", response.getContentType());
         response.setContentType("text/html;charset=UTF-8");
-        assertEquals("text/html; charset=ISO-8859-7", response.getContentType());
+        assertEquals("text/html;charset=ISO-8859-7", response.getContentType());
 
         response.recycle();
         response.setContentType("text/html;charset=US-ASCII");
@@ -165,9 +181,9 @@
         assertEquals("text/html;charset=US-ASCII", response.getContentType());
 
         response.recycle();
-        response.setContentType("text/html; charset=utf-8");
+        response.setContentType("text/html; charset=UTF-8");
         response.getWriter();
-        assertEquals("text/html; charset=UTF-8", response.getContentType());
+        assertEquals("text/html;charset=utf-8", response.getContentType());
 
         response.recycle();
         response.setContentType("text/json");
@@ -178,17 +194,17 @@
         response.setContentType("text/json");
         response.setCharacterEncoding("UTF-8");
         response.getWriter();
-        assertEquals("text/json; charset=UTF-8", response.getContentType());
+        assertEquals("text/json;charset=utf-8", response.getContentType());
 
         response.recycle();
         response.setCharacterEncoding("xyz");
         response.setContentType("foo/bar");
-        assertEquals("foo/bar; charset=xyz", response.getContentType());
+        assertEquals("foo/bar;charset=xyz", response.getContentType());
 
         response.recycle();
         response.setContentType("foo/bar");
         response.setCharacterEncoding("xyz");
-        assertEquals("foo/bar; charset=xyz", response.getContentType());
+        assertEquals("foo/bar;charset=xyz", response.getContentType());
 
         response.recycle();
         response.setCharacterEncoding("xyz");
@@ -198,7 +214,7 @@
         response.recycle();
         response.setContentType("foo/bar;charset=abc");
         response.setCharacterEncoding("xyz");
-        assertEquals("foo/bar; charset=xyz", response.getContentType());
+        assertEquals("foo/bar;charset=xyz", response.getContentType());
 
         response.recycle();
         response.setCharacterEncoding("xyz");
@@ -235,14 +251,14 @@
         response.setLocale(java.util.Locale.ITALIAN);
         assertEquals(null, response.getContentType());
         response.setContentType("text/plain");
-        assertEquals("text/plain; charset=ISO-8859-2", response.getContentType());
+        assertEquals("text/plain;charset=ISO-8859-2", response.getContentType());
 
         response.recycle();
         response.setContentType("text/plain");
         response.setCharacterEncoding("utf-8");
         response.setLocale(java.util.Locale.ITALIAN);
-        assertEquals("text/plain; charset=UTF-8", response.getContentType());
-        assertTrue(response.toString().indexOf("charset=UTF-8") > 0);
+        assertEquals("text/plain;charset=utf-8", response.getContentType());
+        assertTrue(response.toString().indexOf("charset=utf-8") > 0);
     }
 
     @Test
@@ -252,25 +268,25 @@
 
         response.setContentType("foo/bar");
         response.setCharacterEncoding("utf-8");
-        assertEquals("foo/bar; charset=UTF-8", response.getContentType());
+        assertEquals("foo/bar;charset=utf-8", response.getContentType());
         response.getWriter();
-        assertEquals("foo/bar; charset=UTF-8", response.getContentType());
+        assertEquals("foo/bar;charset=utf-8", response.getContentType());
         response.setContentType("foo2/bar2");
-        assertEquals("foo2/bar2; charset=UTF-8", response.getContentType());
+        assertEquals("foo2/bar2;charset=utf-8", response.getContentType());
         response.setCharacterEncoding("ISO-8859-1");
-        assertEquals("foo2/bar2; charset=UTF-8", response.getContentType());
+        assertEquals("foo2/bar2;charset=utf-8", response.getContentType());
 
         response.recycle();
 
         response.setContentType("text/html");
-        response.setCharacterEncoding("utf-8");
-        assertEquals("text/html; charset=UTF-8", response.getContentType());
+        response.setCharacterEncoding("UTF-8");
+        assertEquals("text/html;charset=utf-8", response.getContentType());
         response.getWriter();
-        assertEquals("text/html; charset=UTF-8", response.getContentType());
+        assertEquals("text/html;charset=utf-8", response.getContentType());
         response.setContentType("text/xml");
-        assertEquals("text/xml; charset=UTF-8", response.getContentType());
+        assertEquals("text/xml;charset=utf-8", response.getContentType());
         response.setCharacterEncoding("ISO-8859-1");
-        assertEquals("text/xml; charset=UTF-8", response.getContentType());
+        assertEquals("text/xml;charset=utf-8", response.getContentType());
     }
 
     @Test
@@ -279,25 +295,25 @@
         Response response = newResponse();
         response.setCharacterEncoding("utf-8");
         response.setContentType("foo/bar");
-        assertEquals("foo/bar; charset=UTF-8", response.getContentType());
+        assertEquals("foo/bar;charset=utf-8", response.getContentType());
         response.getWriter();
-        assertEquals("foo/bar; charset=UTF-8", response.getContentType());
+        assertEquals("foo/bar;charset=utf-8", response.getContentType());
         response.setContentType("foo2/bar2");
-        assertEquals("foo2/bar2; charset=UTF-8", response.getContentType());
+        assertEquals("foo2/bar2;charset=utf-8", response.getContentType());
         response.setCharacterEncoding("ISO-8859-1");
-        assertEquals("foo2/bar2; charset=UTF-8", response.getContentType());
+        assertEquals("foo2/bar2;charset=utf-8", response.getContentType());
 
         response.recycle();
 
         response.setCharacterEncoding("utf-8");
         response.setContentType("text/html");
-        assertEquals("text/html; charset=UTF-8", response.getContentType());
+        assertEquals("text/html;charset=utf-8", response.getContentType());
         response.getWriter();
-        assertEquals("text/html; charset=UTF-8", response.getContentType());
+        assertEquals("text/html;charset=utf-8", response.getContentType());
         response.setContentType("text/xml");
-        assertEquals("text/xml; charset=UTF-8", response.getContentType());
+        assertEquals("text/xml;charset=utf-8", response.getContentType());
         response.setCharacterEncoding("iso-8859-1");
-        assertEquals("text/xml; charset=UTF-8", response.getContentType());
+        assertEquals("text/xml;charset=utf-8", response.getContentType());
     }
 
     @Test
@@ -306,26 +322,26 @@
         Response response = newResponse();
 
         response.setCharacterEncoding("utf16");
-        response.setContentType("foo/bar; charset=utf-8");
-        assertEquals("foo/bar; charset=utf-8", response.getContentType());
+        response.setContentType("foo/bar; charset=UTF-8");
+        assertEquals("foo/bar; charset=UTF-8", response.getContentType());
         response.getWriter();
-        assertEquals("foo/bar; charset=utf-8", response.getContentType());
+        assertEquals("foo/bar; charset=UTF-8", response.getContentType());
         response.setContentType("foo2/bar2");
-        assertEquals("foo2/bar2; charset=UTF-8", response.getContentType());
+        assertEquals("foo2/bar2;charset=utf-8", response.getContentType());
         response.setCharacterEncoding("ISO-8859-1");
-        assertEquals("foo2/bar2; charset=UTF-8", response.getContentType());
+        assertEquals("foo2/bar2;charset=utf-8", response.getContentType());
 
         response.recycle();
 
         response.setCharacterEncoding("utf16");
         response.setContentType("text/html; charset=utf-8");
-        assertEquals("text/html; charset=UTF-8", response.getContentType());
+        assertEquals("text/html;charset=utf-8", response.getContentType());
         response.getWriter();
-        assertEquals("text/html; charset=UTF-8", response.getContentType());
+        assertEquals("text/html;charset=utf-8", response.getContentType());
         response.setContentType("text/xml");
-        assertEquals("text/xml; charset=UTF-8", response.getContentType());
+        assertEquals("text/xml;charset=utf-8", response.getContentType());
         response.setCharacterEncoding("iso-8859-1");
-        assertEquals("text/xml; charset=UTF-8", response.getContentType());
+        assertEquals("text/xml;charset=utf-8", response.getContentType());
     }
 
     @Test
@@ -336,19 +352,19 @@
         response.setContentType("foo/bar; other=xyz");
         assertEquals("foo/bar; other=xyz", response.getContentType());
         response.getWriter();
-        assertEquals("foo/bar; other=xyz; charset=ISO-8859-1", response.getContentType());
+        assertEquals("foo/bar; other=xyz;charset=iso-8859-1", response.getContentType());
         response.setContentType("foo2/bar2");
-        assertEquals("foo2/bar2; charset=ISO-8859-1", response.getContentType());
+        assertEquals("foo2/bar2;charset=iso-8859-1", response.getContentType());
 
         response.recycle();
 
-        response.setCharacterEncoding("utf-8");
+        response.setCharacterEncoding("uTf-8");
         response.setContentType("text/html; other=xyz");
-        assertEquals("text/html; other=xyz; charset=UTF-8", response.getContentType());
+        assertEquals("text/html; other=xyz;charset=utf-8", response.getContentType());
         response.getWriter();
-        assertEquals("text/html; other=xyz; charset=UTF-8", response.getContentType());
+        assertEquals("text/html; other=xyz;charset=utf-8", response.getContentType());
         response.setContentType("text/xml");
-        assertEquals("text/xml; charset=UTF-8", response.getContentType());
+        assertEquals("text/xml;charset=utf-8", response.getContentType());
     }
 
     @Test
@@ -366,17 +382,17 @@
 
         response.setCharacterEncoding("utf16");
         response.setContentType("text/html; other=xyz charset=utf-8");
-        assertEquals("text/html; other=xyz charset=utf-8; charset=UTF-16", response.getContentType());
+        assertEquals("text/html; other=xyz charset=utf-8;charset=utf-16", response.getContentType());
         response.getWriter();
-        assertEquals("text/html; other=xyz charset=utf-8; charset=UTF-16", response.getContentType());
+        assertEquals("text/html; other=xyz charset=utf-8;charset=utf-16", response.getContentType());
 
         response.recycle();
 
         response.setCharacterEncoding("utf16");
         response.setContentType("foo/bar; other=pq charset=utf-8 other=xyz");
-        assertEquals("foo/bar; other=pq charset=utf-8 other=xyz; charset=UTF-16", response.getContentType());
+        assertEquals("foo/bar; other=pq charset=utf-8 other=xyz;charset=utf-16", response.getContentType());
         response.getWriter();
-        assertEquals("foo/bar; other=pq charset=utf-8 other=xyz; charset=UTF-16", response.getContentType());
+        assertEquals("foo/bar; other=pq charset=utf-8 other=xyz;charset=utf-16", response.getContentType());
     }
 
     @Test
@@ -410,13 +426,38 @@
     }
 
     @Test
+    public void testWriteRuntimeIOException() throws Exception
+    {
+        Response response = newResponse();
+
+        PrintWriter writer = response.getWriter();
+        writer.println("test");
+        writer.flush();
+        Assert.assertFalse(writer.checkError());
+        
+        Throwable cause = new IOException("problem at mill");
+        _channel.abort(cause);
+        writer.println("test");
+        Assert.assertTrue(writer.checkError());
+        try
+        {
+            writer.println("test");
+            Assert.fail();
+        }
+        catch(RuntimeIOException e)
+        {
+            Assert.assertEquals(cause,e.getCause());
+        }
+        
+    }
+
+    @Test
     public void testEncodeRedirect()
             throws Exception
     {
         Response response = newResponse();
         Request request = response.getHttpChannel().getRequest();
-        request.setServerName("myhost");
-        request.setServerPort(8888);
+        request.setAuthority("myhost",8888);
         request.setContextPath("/path");
 
         assertEquals("http://myhost:8888/path/info;param?query=0&more=1#target", response.encodeURL("http://myhost:8888/path/info;param?query=0&more=1#target"));
@@ -492,9 +533,9 @@
                     Response response = newResponse();
                     Request request = response.getHttpChannel().getRequest();
 
-                    request.setServerName(host);
-                    request.setServerPort(port);
-                    request.setUri(new HttpURI("/path/info;param;jsessionid=12345?query=0&more=1#target"));
+                    request.setScheme("http");
+                    request.setAuthority(host,port);
+                    request.setURIPathQuery("/path/info;param;jsessionid=12345?query=0&more=1#target");
                     request.setContextPath("/path");
                     request.setRequestedSessionId("12345");
                     request.setRequestedSessionIdFromCookie(i>2);
@@ -614,7 +655,7 @@
 
         response.addCookie(cookie);
 
-        String set = response.getHttpFields().getStringField("Set-Cookie");
+        String set = response.getHttpFields().get("Set-Cookie");
 
         assertEquals("name=value;Version=1;Path=/path;Domain=domain;Secure;HttpOnly;Comment=comment", set);
     }
@@ -658,7 +699,7 @@
     @Test
     public void testFlushAfterFullContent() throws Exception
     {
-        Response response = _channel.getResponse();
+        Response response = newResponse();
         byte[] data = new byte[]{(byte)0xCA, (byte)0xFE};
         ServletOutputStream output = response.getOutputStream();
         response.setContentLength(data.length);
@@ -676,23 +717,23 @@
         HttpFields fields = response.getHttpFields();
 
         response.addSetCookie("null",null,null,null,-1,null,false,false,-1);
-        assertEquals("null=",fields.getStringField("Set-Cookie"));
+        assertEquals("null=",fields.get("Set-Cookie"));
 
         fields.clear();
         
         response.addSetCookie("minimal","value",null,null,-1,null,false,false,-1);
-        assertEquals("minimal=value",fields.getStringField("Set-Cookie"));
+        assertEquals("minimal=value",fields.get("Set-Cookie"));
 
         fields.clear();
         //test cookies with same name, domain and path, only 1 allowed
         response.addSetCookie("everything","wrong","domain","path",0,"to be replaced",true,true,0);
         response.addSetCookie("everything","value","domain","path",0,"comment",true,true,0);
-        assertEquals("everything=value;Version=1;Path=path;Domain=domain;Expires=Thu, 01-Jan-1970 00:00:00 GMT;Max-Age=0;Secure;HttpOnly;Comment=comment",fields.getStringField("Set-Cookie"));
+        assertEquals("everything=value;Version=1;Path=path;Domain=domain;Expires=Thu, 01-Jan-1970 00:00:00 GMT;Max-Age=0;Secure;HttpOnly;Comment=comment",fields.get("Set-Cookie"));
         Enumeration<String> e =fields.getValues("Set-Cookie");
         assertTrue(e.hasMoreElements());
         assertEquals("everything=value;Version=1;Path=path;Domain=domain;Expires=Thu, 01-Jan-1970 00:00:00 GMT;Max-Age=0;Secure;HttpOnly;Comment=comment",e.nextElement());
         assertFalse(e.hasMoreElements());
-        assertEquals("Thu, 01 Jan 1970 00:00:00 GMT",fields.getStringField("Expires"));
+        assertEquals("Thu, 01 Jan 1970 00:00:00 GMT",fields.get("Expires"));
         assertFalse(e.hasMoreElements());
         
         //test cookies with same name, different domain
@@ -751,31 +792,31 @@
 
         fields.clear();
         response.addSetCookie("ev erything","va lue","do main","pa th",1,"co mment",true,true,1);
-        String setCookie=fields.getStringField("Set-Cookie");
+        String setCookie=fields.get("Set-Cookie");
         assertThat(setCookie,Matchers.startsWith("\"ev erything\"=\"va lue\";Version=1;Path=\"pa th\";Domain=\"do main\";Expires="));
         assertThat(setCookie,Matchers.endsWith(" GMT;Max-Age=1;Secure;HttpOnly;Comment=\"co mment\""));
 
         fields.clear();
         response.addSetCookie("name","value",null,null,-1,null,false,false,0);
-        setCookie=fields.getStringField("Set-Cookie");
+        setCookie=fields.get("Set-Cookie");
         assertEquals(-1,setCookie.indexOf("Version="));
         fields.clear();
         response.addSetCookie("name","v a l u e",null,null,-1,null,false,false,0);
-        setCookie=fields.getStringField("Set-Cookie");
+        setCookie=fields.get("Set-Cookie");
 
         fields.clear();
         response.addSetCookie("json","{\"services\":[\"cwa\", \"aa\"]}",null,null,-1,null,false,false,-1);
-        assertEquals("json=\"{\\\"services\\\":[\\\"cwa\\\", \\\"aa\\\"]}\"",fields.getStringField("Set-Cookie"));
+        assertEquals("json=\"{\\\"services\\\":[\\\"cwa\\\", \\\"aa\\\"]}\"",fields.get("Set-Cookie"));
 
         fields.clear();
         response.addSetCookie("name","value","domain",null,-1,null,false,false,-1);
         response.addSetCookie("name","other","domain",null,-1,null,false,false,-1);
-        assertEquals("name=other;Domain=domain",fields.getStringField("Set-Cookie"));
+        assertEquals("name=other;Domain=domain",fields.get("Set-Cookie"));
         response.addSetCookie("name","more","domain",null,-1,null,false,false,-1);
-        assertEquals("name=more;Domain=domain",fields.getStringField("Set-Cookie"));
+        assertEquals("name=more;Domain=domain",fields.get("Set-Cookie"));
         response.addSetCookie("foo","bar","domain",null,-1,null,false,false,-1);
         response.addSetCookie("foo","bob","domain",null,-1,null,false,false,-1);
-        assertEquals("name=more;Domain=domain",fields.getStringField("Set-Cookie"));
+        assertEquals("name=more;Domain=domain",fields.get("Set-Cookie"));
 
         e=fields.getValues("Set-Cookie");
         assertEquals("name=more;Domain=domain",e.nextElement());
@@ -783,14 +824,15 @@
 
         fields.clear();
         response.addSetCookie("name","value%=",null,null,-1,null,false,false,0);
-        setCookie=fields.getStringField("Set-Cookie");
+        setCookie=fields.get("Set-Cookie");
         assertEquals("name=value%=",setCookie);
 
     }
     
     private Response newResponse()
     {
-        _channel.reset();
+        _channel.recycle();
+        _channel.getRequest().setMetaData(new MetaData.Request("GET",new HttpURI("/path/info"),HttpVersion.HTTP_1_0,new HttpFields()));
         return new Response(_channel, _channel.getResponse().getHttpOutput());
     }
 
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ServerConnectorHttpServerTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ServerConnectorHttpServerTest.java
index d841245..a94f951 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/ServerConnectorHttpServerTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ServerConnectorHttpServerTest.java
@@ -18,11 +18,14 @@
 
 package org.eclipse.jetty.server;
 
+import org.eclipse.jetty.toolchain.test.AdvancedRunner;
 import org.junit.Before;
+import org.junit.runner.RunWith;
 
 /**
  * HttpServer Tester.
  */
+@RunWith(AdvancedRunner.class)
 public class ServerConnectorHttpServerTest extends HttpServerTestBase
 {
     @Before
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ServerConnectorTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ServerConnectorTest.java
index 3f8f022..8ee21c5 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/ServerConnectorTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ServerConnectorTest.java
@@ -18,19 +18,16 @@
 
 package org.eclipse.jetty.server;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.PrintWriter;
 import java.lang.reflect.Field;
 import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
 import java.net.Socket;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.nio.charset.StandardCharsets;
+import java.util.Collection;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
@@ -41,9 +38,19 @@
 import org.eclipse.jetty.server.handler.AbstractHandler;
 import org.eclipse.jetty.server.handler.DefaultHandler;
 import org.eclipse.jetty.server.handler.HandlerList;
+import org.eclipse.jetty.toolchain.test.OS;
 import org.eclipse.jetty.util.IO;
 import org.junit.Test;
 
+import static org.hamcrest.Matchers.anyOf;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertThat;
+
 public class ServerConnectorTest
 {
     public static class ReuseInfoHandler extends AbstractHandler
@@ -74,9 +81,9 @@
             {
                 t.printStackTrace(out);
             }
-            
+
             out.printf("socket.getReuseAddress() = %b%n",socket.getReuseAddress());
-            
+
             baseRequest.setHandled(true);
         }
     }
@@ -92,7 +99,7 @@
         return new URI(String.format("http://%s:%d/",host,port));
     }
 
-    private String getResponse(URI uri) throws MalformedURLException, IOException
+    private String getResponse(URI uri) throws IOException
     {
         HttpURLConnection http = (HttpURLConnection)uri.toURL().openConnection();
         assertThat("Valid Response Code",http.getResponseCode(),anyOf(is(200),is(404)));
@@ -125,7 +132,12 @@
             String response = getResponse(uri);
             assertThat("Response",response,containsString("connector.getReuseAddress() = true"));
             assertThat("Response",response,containsString("connector._reuseAddress() = true"));
-            assertThat("Response",response,containsString("socket.getReuseAddress() = true"));
+
+            // Java on Windows is incapable of propagating reuse-address this to the opened socket.
+            if (!OS.IS_WINDOWS)
+            {
+                assertThat("Response",response,containsString("socket.getReuseAddress() = true"));
+            }
         }
         finally
         {
@@ -156,7 +168,12 @@
             String response = getResponse(uri);
             assertThat("Response",response,containsString("connector.getReuseAddress() = true"));
             assertThat("Response",response,containsString("connector._reuseAddress() = true"));
-            assertThat("Response",response,containsString("socket.getReuseAddress() = true"));
+
+            // Java on Windows is incapable of propagating reuse-address this to the opened socket.
+            if (!OS.IS_WINDOWS)
+            {
+                assertThat("Response",response,containsString("socket.getReuseAddress() = true"));
+            }
         }
         finally
         {
@@ -187,11 +204,35 @@
             String response = getResponse(uri);
             assertThat("Response",response,containsString("connector.getReuseAddress() = false"));
             assertThat("Response",response,containsString("connector._reuseAddress() = false"));
-            assertThat("Response",response,containsString("socket.getReuseAddress() = false"));
+
+            // Java on Windows is incapable of propagating reuse-address this to the opened socket.
+            if (!OS.IS_WINDOWS)
+            {
+                assertThat("Response",response,containsString("socket.getReuseAddress() = false"));
+            }
         }
         finally
         {
             server.stop();
         }
     }
+
+    @Test
+    public void testAddFirstConnectionFactory() throws Exception
+    {
+        Server server = new Server();
+        ServerConnector connector = new ServerConnector(server);
+        server.addConnector(connector);
+
+        HttpConnectionFactory http = new HttpConnectionFactory();
+        connector.addConnectionFactory(http);
+        ProxyConnectionFactory proxy = new ProxyConnectionFactory();
+        connector.addFirstConnectionFactory(proxy);
+
+        Collection<ConnectionFactory> factories = connector.getConnectionFactories();
+        assertEquals(2, factories.size());
+        assertSame(proxy, factories.iterator().next());
+        assertEquals(2, connector.getBeans(ConnectionFactory.class).size());
+        assertEquals(proxy.getProtocol(), connector.getDefaultProtocol());
+    }
 }
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ServerConnectorTimeoutTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ServerConnectorTimeoutTest.java
index a7e7cae..27e96c4 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/ServerConnectorTimeoutTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ServerConnectorTimeoutTest.java
@@ -100,15 +100,17 @@
     private String getResponse(String request) throws UnsupportedEncodingException, IOException, InterruptedException
     {
         ServerConnector connector = (ServerConnector)_connector;
-        Socket socket = new Socket((String)null,connector.getLocalPort());
-        socket.setSoTimeout(10 * MAX_IDLE_TIME);
-        socket.getOutputStream().write(request.getBytes(StandardCharsets.UTF_8));
-        InputStream inputStream = socket.getInputStream();
-        long start = System.currentTimeMillis();
-        String response = IO.toString(inputStream);
-        long timeElapsed = System.currentTimeMillis() - start;
-        assertTrue("Time elapsed should be at least MAX_IDLE_TIME",timeElapsed > MAX_IDLE_TIME);
-        return response;
-    }
 
+        try (Socket socket = new Socket((String)null,connector.getLocalPort()))
+        {
+            socket.setSoTimeout(10 * MAX_IDLE_TIME);
+            socket.getOutputStream().write(request.getBytes(StandardCharsets.UTF_8));
+            InputStream inputStream = socket.getInputStream();
+            long start = System.currentTimeMillis();
+            String response = IO.toString(inputStream);
+            long timeElapsed = System.currentTimeMillis() - start;
+            assertTrue("Time elapsed should be at least MAX_IDLE_TIME",timeElapsed > MAX_IDLE_TIME);
+            return response;
+        }
+    }
 }
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ThreadStarvationTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ThreadStarvationTest.java
new file mode 100644
index 0000000..fa46de2
--- /dev/null
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ThreadStarvationTest.java
@@ -0,0 +1,215 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.net.SocketException;
+import java.util.concurrent.Exchanger;
+import java.util.concurrent.TimeUnit;
+
+import javax.net.ssl.SSLException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.ssl.SslConnection;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.eclipse.jetty.toolchain.test.AdvancedRunner;
+import org.eclipse.jetty.toolchain.test.TestTracker;
+import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AdvancedRunner.class)
+public class ThreadStarvationTest extends HttpServerTestFixture
+{
+    ServerConnector _connector;
+    
+    @Rule
+    public TestTracker tracker = new TestTracker();
+
+    @Before
+    public void init() throws Exception
+    {
+        _threadPool.setMinThreads(4);
+        _threadPool.setMaxThreads(4);
+        _threadPool.setDetailedDump(false);
+        _connector = new ServerConnector(_server,1,1);
+        _connector.setIdleTimeout(10000);
+    }
+
+    @Test
+    public void testReadInput() throws Exception
+    {
+        startServer(_connector,new ReadHandler());
+        System.err.println(_threadPool.dump());
+        
+        Socket client=newSocket(_serverURI.getHost(),_serverURI.getPort());
+        client.setSoTimeout(10000);
+
+        OutputStream os=client.getOutputStream();
+        InputStream is=client.getInputStream();
+
+        os.write((
+                "GET / HTTP/1.0\r\n"+
+                "host: "+_serverURI.getHost()+":"+_serverURI.getPort()+"\r\n"+
+                "content-length: 10\r\n" +
+                "\r\n" +
+                "0123456789\r\n").getBytes("utf-8"));
+        os.flush();
+
+        String response = IO.toString(is);
+        assertEquals(-1, is.read());
+        assertThat(response,containsString("200 OK"));
+        assertThat(response,containsString("Read Input 10"));
+
+    }
+    
+    @Test
+    public void testEWYKStarvation() throws Exception
+    {
+        System.setProperty("org.eclipse.jetty.io.ManagedSelector$SelectorProducer.ExecutionStrategy","org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume");
+        startServer(_connector,new ReadHandler());
+        
+        Socket[] client = new Socket[3];
+        OutputStream[] os = new OutputStream[client.length];
+        InputStream[] is = new InputStream[client.length];
+        
+        for (int i=0;i<client.length;i++)
+        {
+            client[i]=newSocket(_serverURI.getHost(),_serverURI.getPort());
+            client[i].setSoTimeout(10000);
+
+            os[i]=client[i].getOutputStream();
+            is[i]=client[i].getInputStream();
+
+            os[i].write((
+                    "PUT / HTTP/1.0\r\n"+
+                            "host: "+_serverURI.getHost()+":"+_serverURI.getPort()+"\r\n"+
+                            "content-length: 10\r\n" +
+                    "\r\n1").getBytes("utf-8"));
+            os[i].flush();
+        }
+        Thread.sleep(500);
+        System.err.println(_threadPool.dump());
+
+        for (int i=0;i<client.length;i++)
+        {
+            os[i].write(("234567890\r\n").getBytes("utf-8"));
+            os[i].flush();
+        }
+
+        Thread.sleep(500);
+        System.err.println(_threadPool.dump());
+
+        for (int i=0;i<client.length;i++)
+        {
+            String response = IO.toString(is[i]);
+            assertEquals(-1, is[i].read());
+            assertThat(response,containsString("200 OK"));
+            assertThat(response,containsString("Read Input 10"));
+        }
+        
+    }
+    
+
+    @Test
+    public void testPECStarvation() throws Exception
+    {
+        System.setProperty("org.eclipse.jetty.io.ManagedSelector$SelectorProducer.ExecutionStrategy","org.eclipse.jetty.util.thread.strategy.ProduceExecuteConsume");
+
+        startServer(_connector,new ReadHandler());
+        System.err.println(_threadPool.dump());
+        
+        Socket[] client = new Socket[3];
+        OutputStream[] os = new OutputStream[client.length];
+        InputStream[] is = new InputStream[client.length];
+        
+        for (int i=0;i<client.length;i++)
+        {
+            client[i]=newSocket(_serverURI.getHost(),_serverURI.getPort());
+            client[i].setSoTimeout(10000);
+
+            os[i]=client[i].getOutputStream();
+            is[i]=client[i].getInputStream();
+
+            os[i].write((
+                    "PUT / HTTP/1.0\r\n"+
+                            "host: "+_serverURI.getHost()+":"+_serverURI.getPort()+"\r\n"+
+                            "content-length: 10\r\n" +
+                    "\r\n1").getBytes("utf-8"));
+            os[i].flush();
+        }
+        Thread.sleep(500);
+        System.err.println(_threadPool.dump());
+
+        for (int i=0;i<client.length;i++)
+        {
+            os[i].write(("234567890\r\n").getBytes("utf-8"));
+            os[i].flush();
+        }
+
+        Thread.sleep(500);
+        System.err.println(_threadPool.dump());
+
+        for (int i=0;i<client.length;i++)
+        {
+            String response = IO.toString(is[i]);
+            assertEquals(-1, is[i].read());
+            assertThat(response,containsString("200 OK"));
+            assertThat(response,containsString("Read Input 10"));
+        }
+        
+    }
+    
+
+    protected static class ReadHandler extends AbstractHandler
+    {
+        @Override
+        public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+        {
+            baseRequest.setHandled(true);
+            response.setStatus(200);
+
+            int l = request.getContentLength();
+            int r = 0;
+            while (r<l)
+            {
+                if (request.getInputStream().read()>=0)
+                    r++;
+            }
+            
+            response.getOutputStream().write(("Read Input "+r+"\r\n").getBytes());
+        }
+    }
+}
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/BadRequestLogHandlerTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/BadRequestLogHandlerTest.java
index a18f192..ace4af3 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/BadRequestLogHandlerTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/BadRequestLogHandlerTest.java
@@ -18,8 +18,8 @@
 
 package org.eclipse.jetty.server.handler;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -74,7 +74,8 @@
         @Override
         public void log(Request request, Response response)
         {
-            captured.add(String.format("%s %s %s %03d",request.getMethod(),request.getUri().toString(),request.getProtocol(),response.getStatus()));
+            int status = response.getCommittedMetaData().getStatus();
+            captured.add(String.format("%s %s %s %03d",request.getMethod(),request.getHttpURI(),request.getProtocol(),status));
         }
     }
     
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerGetResourceTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerGetResourceTest.java
index baab4c5..27edbe7 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerGetResourceTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerGetResourceTest.java
@@ -18,10 +18,12 @@
 
 package org.eclipse.jetty.server.handler;
 
+import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -89,6 +91,8 @@
         
         server = new Server();
         context =new ContextHandler("/");
+        context.clearAliasChecks();
+        context.addAliasCheck(new ContextHandler.ApproveNonExistentDirectoryAliases());
         context.setBaseResource(Resource.newResource(docroot));
         context.addAliasCheck(new ContextHandler.AliasCheck()
         {
@@ -122,7 +126,7 @@
         try
         {
             context.getResource(path);
-            fail();
+            fail("Expected " + MalformedURLException.class);
         }
         catch(MalformedURLException e)
         {
@@ -131,7 +135,7 @@
         try
         {
             context.getServletContext().getResource(path);
-            fail();
+            fail("Expected " + MalformedURLException.class);
         }
         catch(MalformedURLException e)
         {
@@ -300,17 +304,20 @@
     @Test
     public void testSlashSlash() throws Exception
     {
+        File expected = new File(docroot, OS.separators("subdir/data.txt"));
+        URL expectedUrl = expected.toURI().toURL();
+        
         String path="//subdir/data.txt";
         Resource resource=context.getResource(path);
-        assertNull(resource);
+        assertThat("Resource: " + resource, resource.getFile(), is(expected));
         URL url=context.getServletContext().getResource(path);
-        assertNull(url);
+        assertThat("Resource: " + url, url, is(expectedUrl));
         
         path="/subdir//data.txt";
         resource=context.getResource(path);
-        assertNull(resource);
+        assertThat("Resource: " + resource, resource.getFile(), is(expected));
         url=context.getServletContext().getResource(path);
-        assertNull(url);
+        assertThat("Resource: " + url, url, is(expectedUrl));
     }
 
     @Test
@@ -353,8 +360,8 @@
     @Test
     public void testSymlinkKnown() throws Exception
     {
-        if (!OS.IS_UNIX)
-            return;
+        Assume.assumeTrue(OS.IS_UNIX);
+        
         try
         {
             allowSymlinks.set(true);
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/DebugHandlerTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/DebugHandlerTest.java
new file mode 100644
index 0000000..56f7252
--- /dev/null
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/DebugHandlerTest.java
@@ -0,0 +1,181 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.nio.charset.StandardCharsets;
+import java.security.KeyStore;
+import java.util.concurrent.Executor;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.TrustManagerFactory;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.LeakTrackingByteBufferPool;
+import org.eclipse.jetty.io.MappedByteBufferPool;
+import org.eclipse.jetty.server.AbstractConnectionFactory;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+import org.eclipse.jetty.toolchain.test.SimpleRequest;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.eclipse.jetty.util.thread.Scheduler;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class DebugHandlerTest
+{
+    public final static HostnameVerifier __hostnameverifier = new HostnameVerifier()
+    {
+        public boolean verify(String hostname, SSLSession session)
+        {
+            return true;
+        }
+    };
+    
+    private SSLContext sslContext;
+    private Server server;
+    private URI serverURI;
+    private URI secureServerURI;
+    
+    @SuppressWarnings("deprecation")
+    private DebugHandler debugHandler;
+    private ByteArrayOutputStream capturedLog;
+    
+    @SuppressWarnings("deprecation")
+    @Before
+    public void startServer() throws Exception
+    {
+        server = new Server();
+        
+        ServerConnector httpConnector = new ServerConnector(server);
+        httpConnector.setPort(0);
+        server.addConnector(httpConnector);
+        
+        File keystorePath = MavenTestingUtils.getTestResourceFile("keystore");
+        SslContextFactory sslContextFactory = new SslContextFactory();
+        sslContextFactory.setKeyStorePath(keystorePath.getAbsolutePath());
+        sslContextFactory.setKeyStorePassword("storepwd");
+        sslContextFactory.setKeyManagerPassword("keypwd");
+        sslContextFactory.setTrustStorePath(keystorePath.getAbsolutePath());
+        sslContextFactory.setTrustStorePassword("storepwd");
+        ByteBufferPool pool = new LeakTrackingByteBufferPool(new MappedByteBufferPool.Tagged());
+        ServerConnector sslConnector = new ServerConnector(server,
+                (Executor)null,
+                (Scheduler)null, pool, 1, 1, 
+                AbstractConnectionFactory.getFactories(sslContextFactory,new HttpConnectionFactory()));
+        
+        server.addConnector(sslConnector);
+        
+        debugHandler = new DebugHandler();
+        capturedLog = new ByteArrayOutputStream();
+        debugHandler.setOutputStream(capturedLog);
+        debugHandler.setHandler(new AbstractHandler()
+            {
+                @Override
+                public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+                {
+                    baseRequest.setHandled(true);
+                    response.setStatus(HttpStatus.OK_200);
+                }
+            });
+        server.setHandler(debugHandler);
+        server.start();
+        
+        String host = httpConnector.getHost();
+        if(host == null) host = "localhost";
+        
+        serverURI = URI.create(String.format("http://%s:%d/", host, httpConnector.getLocalPort()));
+        secureServerURI = URI.create(String.format("https://%s:%d/", host, sslConnector.getLocalPort()));
+        
+        KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
+        try (InputStream stream = sslContextFactory.getKeyStoreResource().getInputStream())
+        {
+            keystore.load(stream, "storepwd".toCharArray());
+        }
+        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+        trustManagerFactory.init(keystore);
+        sslContext = SSLContext.getInstance("TLS");
+        sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
+
+        try
+        {
+            HttpsURLConnection.setDefaultHostnameVerifier(__hostnameverifier);
+            SSLContext sc = SSLContext.getInstance("TLS");
+            sc.init(null, SslContextFactory.TRUST_ALL_CERTS, new java.security.SecureRandom());
+            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
+        }
+        catch(Exception e)
+        {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
+    
+    @After
+    public void stopServer() throws Exception
+    {
+        server.stop();
+    }
+    
+    @Test
+    public void testThreadName() throws IOException
+    {
+        SimpleRequest req = new SimpleRequest(serverURI);
+        req.getString("/foo/bar?a=b");
+        
+        String log = capturedLog.toString(StandardCharsets.UTF_8.name());
+        String expectedThreadName = String.format("//%s:%s/foo/bar?a=b",serverURI.getHost(),serverURI.getPort());
+        assertThat("ThreadName", log, containsString(expectedThreadName));
+        // Look for bad/mangled/duplicated schemes
+        assertThat("ThreadName", log, not(containsString("http:"+expectedThreadName)));
+        assertThat("ThreadName", log, not(containsString("https:"+expectedThreadName)));
+    }
+    
+    @Test
+    public void testSecureThreadName() throws IOException
+    {
+        SimpleRequest req = new SimpleRequest(secureServerURI);
+        req.getString("/foo/bar?a=b");
+        
+        String log = capturedLog.toString(StandardCharsets.UTF_8.name());
+        String expectedThreadName = String.format("https://%s:%s/foo/bar?a=b",secureServerURI.getHost(),secureServerURI.getPort());
+        assertThat("ThreadName", log, containsString(expectedThreadName));
+        // Look for bad/mangled/duplicated schemes
+        assertThat("ThreadName", log, not(containsString("http:"+expectedThreadName)));
+        assertThat("ThreadName", log, not(containsString("https:"+expectedThreadName)));
+    }
+}
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/RequestLogHandlerTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/RequestLogHandlerTest.java
index b4a82f9..510b9fb 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/RequestLogHandlerTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/RequestLogHandlerTest.java
@@ -18,8 +18,9 @@
 
 package org.eclipse.jetty.server.handler;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertThat;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -41,6 +42,8 @@
 
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.HttpChannel;
+import org.eclipse.jetty.server.HttpChannelState;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.RequestLog;
 import org.eclipse.jetty.server.Response;
@@ -50,6 +53,7 @@
 import org.eclipse.jetty.util.component.AbstractLifeCycle;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.log.StdErrLog;
 import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -75,7 +79,8 @@
         @Override
         public void log(Request request, Response response)
         {
-            captured.add(String.format("%s %s %s %03d",request.getMethod(),request.getRequestURI(),request.getProtocol(),response.getStatus()));
+            int status = response.getCommittedMetaData().getStatus();
+            captured.add(String.format("%s %s %s %03d",request.getMethod(),request.getRequestURI(),request.getProtocol(),status));
         }
     }
 
@@ -372,6 +377,7 @@
 
     /**
      * Test a RequestLogHandler at the end of a HandlerCollection. all other configuration on server at defaults.
+     * @throws Exception if test failure
      */
     @Test(timeout = 4000)
     public void testLogHandlerCollection() throws Exception
@@ -433,8 +439,77 @@
         }
     }
 
+    @Test(timeout = 4000)
+    public void testMultipleLogHandlers() throws Exception
+    {
+        Server server = new Server();
+        ServerConnector connector = new ServerConnector(server);
+        connector.setPort(0);
+        server.setConnectors(new Connector[]{connector});
+
+        List<CaptureLog> captureLogs = new ArrayList<>();
+        List<Handler> handlerList = new ArrayList<>();
+        handlerList.add(testHandler);
+
+        for (int i = 0; i < 4; ++i) {
+            CaptureLog captureLog = new CaptureLog();
+            captureLogs.add(captureLog);
+            RequestLogHandler requestLog = new RequestLogHandler();
+            requestLog.setRequestLog(captureLog);
+            handlerList.add(requestLog);
+        }
+
+        HandlerCollection handlers = new HandlerCollection();
+        handlers.setHandlers(handlerList.toArray(new Handler[0]));
+        server.setHandler(handlers);
+
+        try
+        {
+            server.start();
+
+            String host = connector.getHost();
+            if (host == null)
+            {
+                host = "localhost";
+            }
+            int port = connector.getLocalPort();
+
+            URI serverUri = new URI("http",null,host,port,requestPath,null,null);
+
+            // Make call to test handler
+            HttpURLConnection connection = (HttpURLConnection)serverUri.toURL().openConnection();
+            try
+            {
+                connection.setAllowUserInteraction(false);
+
+                // log response status code
+                int statusCode = connection.getResponseCode();
+                LOG.debug("Response Status Code: {}",statusCode);
+
+                if (statusCode == 200)
+                {
+                    // collect response message and log it
+                    String content = getResponseContent(connection);
+                    LOG.debug("Response Content: {}",content);
+                }
+            }
+            finally
+            {
+                connection.disconnect();
+            }
+
+            for (CaptureLog captureLog:captureLogs)
+                assertRequestLog(captureLog);
+        }
+        finally
+        {
+            server.stop();
+        }
+    }
+
     /**
      * Test a RequestLogHandler at the end of a HandlerCollection and also with the default ErrorHandler as server bean in place.
+     * @throws Exception if test failure
      */
     @Test(timeout = 4000)
     public void testLogHandlerCollection_ErrorHandler_ServerBean() throws Exception
@@ -501,6 +576,7 @@
 
     /**
      * Test a RequestLogHandler at the end of a HandlerCollection and also with the ErrorHandler in place.
+     * @throws Exception if test failure
      */
     @Test(timeout=4000)
     public void testLogHandlerCollection_AltErrorHandler() throws Exception
@@ -574,6 +650,7 @@
     
     /**
      * Test a RequestLogHandler at the end of a HandlerCollection and also with the ErrorHandler in place.
+     * @throws Exception if test failure
      */
     @Test(timeout=4000)
     public void testLogHandlerCollection_OKErrorHandler() throws Exception
@@ -647,6 +724,7 @@
     
     /**
      * Test a RequestLogHandler at the end of a HandlerCollection and also with the ErrorHandler in place.
+     * @throws Exception if test failure
      */
     @Test(timeout=4000)
     public void testLogHandlerCollection_DispatchErrorHandler() throws Exception
@@ -660,9 +738,9 @@
         server.addBean(errorDispatcher);
         
         ContextHandlerCollection contexts = new ContextHandlerCollection();
-        ContextHandler errorContext = new ContextHandler("errorok");
+        ContextHandler errorContext = new ContextHandler("/errorok");
         errorContext.setHandler(new OKErrorHandler());
-        ContextHandler testContext = new ContextHandler("test");
+        ContextHandler testContext = new ContextHandler("/test");
         testContext.setHandler(testHandler);
         contexts.addHandler(errorContext);
         contexts.addHandler(testContext);
@@ -737,6 +815,8 @@
 
         try
         {
+            ((StdErrLog)Log.getLogger(HttpChannel.class)).setHideStacks(true);
+            ((StdErrLog)Log.getLogger(HttpChannelState.class)).setHideStacks(true);
             server.start();
 
             String host = connector.getHost();
@@ -775,6 +855,8 @@
         finally
         {
             server.stop();
+            ((StdErrLog)Log.getLogger(HttpChannel.class)).setHideStacks(false);
+            ((StdErrLog)Log.getLogger(HttpChannelState.class)).setHideStacks(false);
         }
     }
 
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/RequestLogTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/RequestLogTest.java
new file mode 100644
index 0000000..6156677
--- /dev/null
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/RequestLogTest.java
@@ -0,0 +1,300 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.Assert.assertThat;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.util.Arrays;
+import java.util.concurrent.Exchanger;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.server.AbstractNCSARequestLog;
+import org.eclipse.jetty.server.LocalConnector;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.Server;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RequestLogTest
+{
+    Exchanger<String> _log;
+    Server _server;
+    LocalConnector _connector;
+    
+
+    @Before
+    public void before() throws Exception
+    {
+        _log = new Exchanger<String>();
+        _server = new Server();
+        _connector = new LocalConnector(_server);
+        _server.addConnector(_connector);
+        _server.setRequestLog(new Log());
+        _server.setHandler(new TestHandler());
+        _server.start();
+    }
+    
+    @After
+    public void after() throws Exception
+    {
+
+        _server.stop();
+    }
+    
+    
+    @Test
+    public void testNotHandled() throws Exception
+    {
+        _connector.getResponses("GET /foo HTTP/1.0\n\n");
+        String log = _log.exchange(null,5,TimeUnit.SECONDS);
+        assertThat(log,containsString("GET /foo HTTP/1.0\" 404 "));
+    }
+
+    @Test
+    public void testRequestLine() throws Exception
+    {
+        _connector.getResponses("GET /foo?data=1 HTTP/1.0\nhost: host:80\n\n");
+        String log = _log.exchange(null,5,TimeUnit.SECONDS);
+        // TODO should be without host (https://bugs.eclipse.org/bugs/show_bug.cgi?id=480276)
+        // assertThat(log,containsString("GET /foo?data=1 HTTP/1.0\" 200 "));
+        assertThat(log,containsString("GET //host:80/foo?data=1 HTTP/1.0\" 200 "));
+        
+        _connector.getResponses("GET //host/foo?data=1 HTTP/1.0\n\n");
+        log = _log.exchange(null,5,TimeUnit.SECONDS);
+        assertThat(log,containsString("GET //host/foo?data=1 HTTP/1.0\" 200 "));
+        
+        _connector.getResponses("GET //absolute:80/foo?data=1 HTTP/1.0\nhost: host:80\n\n");
+        log = _log.exchange(null,5,TimeUnit.SECONDS);
+        // TODO should it be with absolute? (https://bugs.eclipse.org/bugs/show_bug.cgi?id=480276)
+        // assertThat(log,containsString("GET //absolute:80/foo?data=1 HTTP/1.0\" 200 "));
+        assertThat(log,containsString("GET //host:80/foo?data=1 HTTP/1.0\" 200 "));
+        
+        _connector.getResponses("GET http://host:80/foo?data=1 HTTP/1.0\n\n");
+        log = _log.exchange(null,5,TimeUnit.SECONDS);
+        assertThat(log,containsString("GET http://host:80/foo?data=1 HTTP/1.0\" 200 "));   
+    }
+    
+    @Test
+    public void testSmallData() throws Exception
+    {
+        _connector.getResponses("GET /foo?data=42 HTTP/1.0\n\n");
+        String log = _log.exchange(null,5,TimeUnit.SECONDS);
+        assertThat(log,containsString("GET /foo?"));
+        assertThat(log,containsString(" 200 42 "));
+    }
+    
+    @Test
+    public void testBigData() throws Exception
+    {
+        _connector.getResponses("GET /foo?data=102400 HTTP/1.0\n\n");
+        String log = _log.exchange(null,5,TimeUnit.SECONDS);
+        assertThat(log,containsString("GET /foo?"));
+        assertThat(log,containsString(" 200 102400 "));
+    }
+    
+    @Test
+    public void testStatus() throws Exception
+    {
+        _connector.getResponses("GET /foo?status=206 HTTP/1.0\n\n");
+        String log = _log.exchange(null,5,TimeUnit.SECONDS);
+        assertThat(log,containsString("GET /foo?"));
+        assertThat(log,containsString(" 206 0 "));
+    }
+    
+    @Test
+    public void testStatusData() throws Exception
+    {
+        _connector.getResponses("GET /foo?status=206&data=42 HTTP/1.0\n\n");
+        String log = _log.exchange(null,5,TimeUnit.SECONDS);
+        assertThat(log,containsString("GET /foo?"));
+        assertThat(log,containsString(" 206 42 "));
+    }
+    
+    @Test
+    public void testBadRequest() throws Exception
+    {
+        _connector.getResponses("XXXXXXXXXXXX\n\n");
+        String log = _log.exchange(null,5,TimeUnit.SECONDS);
+        assertThat(log,containsString("\"- - -\""));
+        assertThat(log,containsString(" 400 0 "));
+    }
+    
+    @Test
+    public void testBadCharacter() throws Exception
+    {
+        _connector.getResponses("METHOD /f\00o HTTP/1.0\n\n");
+        String log = _log.exchange(null,5,TimeUnit.SECONDS);
+        assertThat(log,containsString("\"- - -\""));
+        assertThat(log,containsString(" 400 0 "));
+    }
+    
+    @Test
+    public void testBadVersion() throws Exception
+    {
+        _connector.getResponses("METHOD /foo HTTP/9\n\n");
+        String log = _log.exchange(null,5,TimeUnit.SECONDS);
+        assertThat(log,containsString("\"- - -\""));
+        assertThat(log,containsString(" 400 0 "));
+    }
+    
+    @Test
+    public void testLongURI() throws Exception
+    {
+        char[] chars = new char[10000];
+        Arrays.fill(chars,'o');
+        String ooo = new String(chars);
+        _connector.getResponses("METHOD /f"+ooo+" HTTP/1.0\n\n");
+        String log = _log.exchange(null,5,TimeUnit.SECONDS);
+        assertThat(log,containsString("\"- - -\""));
+        assertThat(log,containsString(" 414 0 "));
+    }
+    
+    @Test
+    public void testLongHeader() throws Exception
+    {
+        char[] chars = new char[10000];
+        Arrays.fill(chars,'o');
+        String ooo = new String(chars);
+        _connector.getResponses("METHOD /foo HTTP/1.0\name: f+"+ooo+"\n\n");
+        String log = _log.exchange(null,5,TimeUnit.SECONDS);
+        assertThat(log,containsString("\"METHOD /foo HTTP/1.0\""));
+        assertThat(log,containsString(" 413 0 "));
+    }
+    
+    @Test
+    public void testBadRequestNoHost() throws Exception
+    {
+        _connector.getResponses("GET /foo HTTP/1.1\n\n");
+        String log = _log.exchange(null,5,TimeUnit.SECONDS);
+        assertThat(log,containsString("GET /foo "));
+        assertThat(log,containsString(" 400 0 "));
+    }
+    
+    private class Log extends AbstractNCSARequestLog
+    {
+        {
+            super.setExtended(true);
+        }
+
+        @Override
+        protected boolean isEnabled()
+        {
+            return true;
+        }
+
+        @Override
+        public void write(String requestEntry) throws IOException
+        {
+            try
+            {
+                _log.exchange(requestEntry);
+            }
+            catch(Exception e)
+            {
+                e.printStackTrace();
+            }
+        }
+    }
+    
+    private class TestHandler extends AbstractHandler
+    {
+        @Override
+        public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+        {
+            String q = request.getQueryString();
+            if (q==null)
+                return;
+            
+            baseRequest.setHandled(true);
+            for (String action : q.split("\\&"))
+            {
+                String[] param = action.split("=");
+                String name=param[0];
+                String value=param.length>1?param[1]:null;
+                switch(name)
+                {
+                    case "status":
+                    {
+                        response.setStatus(Integer.parseInt(value));
+                        break;
+                    }
+                        
+                    case "data":
+                    {
+                        int data = Integer.parseInt(value);
+                        PrintWriter out = response.getWriter();
+                        
+                        int w=0;
+                        while (w<data)
+                        {
+                            if ((data-w)>17)
+                            {
+                                w+=17;
+                                out.print("0123456789ABCDEF\n");
+                            }
+                            else
+                            {
+                                w++;
+                                out.print("\n");
+                            }
+                        }
+                        break;
+                    }
+
+                    case "throw":
+                    {
+                        try
+                        {
+                            throw (Throwable)(Class.forName(value).newInstance());
+                        }
+                        catch(ServletException | IOException | Error | RuntimeException e)
+                        {
+                            throw e;
+                        }
+                        catch(Throwable e)
+                        {
+                            throw new ServletException(e);
+                        }
+                    }
+                    case "flush":
+                    {
+                        response.flushBuffer();
+                        break;
+                    }
+                    
+                    case "read":
+                    {
+                        InputStream in = request.getInputStream();
+                        while (in.read()>=0);
+                        break;
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ScopedHandlerTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ScopedHandlerTest.java
index ef44950..22a1c17 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ScopedHandlerTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ScopedHandlerTest.java
@@ -27,6 +27,7 @@
 import javax.servlet.http.HttpServletResponse;
 
 import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.Response;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -82,6 +83,9 @@
     @Test
     public void testDouble() throws Exception
     {
+        Request request = new Request(null,null);
+        Response response = new Response(null,null);
+        
         TestHandler handler0 = new TestHandler("0");
         OtherHandler handlerA = new OtherHandler("A");
         TestHandler handler1 = new TestHandler("1");
@@ -90,7 +94,7 @@
         handlerA.setHandler(handler1);
         handler1.setHandler(handlerB);
         handler0.start();
-        handler0.handle("target",null,null,null);
+        handler0.handle("target",request,request,response);
         handler0.stop();
         String history=_history.toString();
         assertEquals(">S0>S1>W0>HA>W1>HB<HB<W1<HA<W0<S1<S0",history);
@@ -99,6 +103,9 @@
     @Test
     public void testTriple() throws Exception
     {
+        Request request = new Request(null,null);
+        Response response = new Response(null,null);
+        
         TestHandler handler0 = new TestHandler("0");
         OtherHandler handlerA = new OtherHandler("A");
         TestHandler handler1 = new TestHandler("1");
@@ -111,7 +118,7 @@
         handlerB.setHandler(handler2);
         handler2.setHandler(handlerC);
         handler0.start();
-        handler0.handle("target",null,null,null);
+        handler0.handle("target",request,request,response);
         handler0.stop();
         String history=_history.toString();
         assertEquals(">S0>S1>S2>W0>HA>W1>HB>W2>HC<HC<W2<HB<W1<HA<W0<S2<S1<S0",history);
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/SecuredRedirectHandlerTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/SecuredRedirectHandlerTest.java
index 0ce700a..c885f72 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/SecuredRedirectHandlerTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/SecuredRedirectHandlerTest.java
@@ -18,8 +18,9 @@
 
 package org.eclipse.jetty.server.handler;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
 
 import java.io.File;
 import java.io.IOException;
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/StatisticsHandlerTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/StatisticsHandlerTest.java
index 91a8768..e595dce 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/StatisticsHandlerTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/StatisticsHandlerTest.java
@@ -171,42 +171,68 @@
         assertEquals(0, _statsHandler.getAsyncDispatches());
         assertEquals(0, _statsHandler.getExpires());
         assertEquals(2, _statsHandler.getResponses2xx());
+    }
 
+
+    @Test
+    public void testTwoRequests() throws Exception
+    {
+        final CyclicBarrier barrier[] = {new CyclicBarrier(3), new CyclicBarrier(3)};
         _latchHandler.reset(2);
-        barrier[0] = new CyclicBarrier(3);
-        barrier[1] = new CyclicBarrier(3);
+        _statsHandler.setHandler(new AbstractHandler()
+        {
+            @Override
+            public void handle(String path, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException, ServletException
+            {
+                request.setHandled(true);
+                try
+                {
+                    barrier[0].await();
+                    barrier[1].await();
+                }
+                catch (Exception x)
+                {
+                    Thread.currentThread().interrupt();
+                    throw (IOException)new IOException().initCause(x);
+                }
+            }
+        });
+        _server.start();
 
+        String request = "GET / HTTP/1.1\r\n" +
+                "Host: localhost\r\n" +
+                "\r\n";
+    
         _connector.executeRequest(request);
         _connector.executeRequest(request);
 
         barrier[0].await();
 
-        assertEquals(4, _statistics.getConnectionsOpen());
+        assertEquals(2, _statistics.getConnectionsOpen());
 
-        assertEquals(4, _statsHandler.getRequests());
+        assertEquals(2, _statsHandler.getRequests());
         assertEquals(2, _statsHandler.getRequestsActive());
         assertEquals(2, _statsHandler.getRequestsActiveMax());
 
-        assertEquals(4, _statsHandler.getDispatched());
+        assertEquals(2, _statsHandler.getDispatched());
         assertEquals(2, _statsHandler.getDispatchedActive());
         assertEquals(2, _statsHandler.getDispatchedActiveMax());
 
-
         barrier[1].await();
         assertTrue(_latchHandler.await());
 
-        assertEquals(4, _statsHandler.getRequests());
+        assertEquals(2, _statsHandler.getRequests());
         assertEquals(0, _statsHandler.getRequestsActive());
         assertEquals(2, _statsHandler.getRequestsActiveMax());
 
-        assertEquals(4, _statsHandler.getDispatched());
+        assertEquals(2, _statsHandler.getDispatched());
         assertEquals(0, _statsHandler.getDispatchedActive());
         assertEquals(2, _statsHandler.getDispatchedActiveMax());
 
         assertEquals(0, _statsHandler.getAsyncRequests());
         assertEquals(0, _statsHandler.getAsyncDispatches());
         assertEquals(0, _statsHandler.getExpires());
-        assertEquals(4, _statsHandler.getResponses2xx());
+        assertEquals(2, _statsHandler.getResponses2xx());
     }
 
     @Test
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/session/HashSessionManagerTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/session/HashSessionManagerTest.java
index 7787bb2..b7a5eed 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/session/HashSessionManagerTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/session/HashSessionManagerTest.java
@@ -25,11 +25,7 @@
 import org.eclipse.jetty.toolchain.test.FS;
 import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
 import org.eclipse.jetty.util.IO;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.StdErrLog;
-import org.junit.After;
 import org.junit.Assert;
-import org.junit.Before;
 import org.junit.Test;
 
 public class HashSessionManagerTest
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/session/SessionCookieTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/session/SessionCookieTest.java
index e3322e5..0004a15 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/session/SessionCookieTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/session/SessionCookieTest.java
@@ -31,24 +31,14 @@
 
 import org.eclipse.jetty.http.HttpCookie;
 import org.junit.Test;
+
 /**
  * SessionCookieTest
- *
- *
  */
 public class SessionCookieTest
 {
-
     public class MockSession extends AbstractSession
     {
-
-
-        /**
-         * @param abstractSessionManager
-         * @param created
-         * @param accessed
-         * @param clusterId
-         */
         protected MockSession(AbstractSessionManager abstractSessionManager, long created, long accessed, String clusterId)
         {
             super(abstractSessionManager, created, accessed, clusterId);
@@ -72,9 +62,6 @@
             return null;
         }
 
-        /** 
-         * @see javax.servlet.http.HttpSession#getValueNames()
-         */
         @Override
         public String[] getValueNames()
         {
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SelectChannelServerSslTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SelectChannelServerSslTest.java
index 5f931f5..a242a51 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SelectChannelServerSslTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SelectChannelServerSslTest.java
@@ -128,7 +128,7 @@
         startServer(connector);
 
         KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
-        try (InputStream stream = new FileInputStream(sslContextFactory.getKeyStorePath()))
+        try (InputStream stream = sslContextFactory.getKeyStoreResource().getInputStream())
         {
             keystore.load(stream, "storepwd".toCharArray());
         }
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SniSslConnectionFactoryTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SniSslConnectionFactoryTest.java
new file mode 100644
index 0000000..5bdb81b
--- /dev/null
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SniSslConnectionFactoryTest.java
@@ -0,0 +1,404 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.ssl;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.nio.charset.StandardCharsets;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Queue;
+
+import javax.net.ssl.SNIHostName;
+import javax.net.ssl.SNIServerName;
+import javax.net.ssl.SSLParameters;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.io.Connection;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.SecureRequestCustomizer;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.SocketCustomizationListener;
+import org.eclipse.jetty.server.SslConnectionFactory;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.eclipse.jetty.util.ConcurrentArrayQueue;
+import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.Utf8StringBuilder;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.hamcrest.Matchers;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SniSslConnectionFactoryTest
+{
+    private Server _server;
+    private ServerConnector _connector;
+    private HttpConfiguration _https_config;
+    private int _port;
+
+    @Before
+    public void before() throws Exception
+    {
+        String keystorePath = "src/test/resources/snikeystore";
+        File keystoreFile = new File(keystorePath);
+        if (!keystoreFile.exists())
+            throw new FileNotFoundException(keystoreFile.getAbsolutePath());
+
+        _server = new Server();
+
+        HttpConfiguration http_config = new HttpConfiguration();
+        http_config.setSecureScheme("https");
+        http_config.setSecurePort(8443);
+        http_config.setOutputBufferSize(32768);
+        _https_config = new HttpConfiguration(http_config);
+        _https_config.addCustomizer(new SecureRequestCustomizer());
+
+        SslContextFactory sslContextFactory = new SslContextFactory();
+        sslContextFactory.setKeyStorePath(keystoreFile.getAbsolutePath());
+        sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
+        sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
+
+        ServerConnector https = _connector = new ServerConnector(_server,
+                new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
+                new HttpConnectionFactory(_https_config));
+        _server.addConnector(https);
+
+        _server.setHandler(new AbstractHandler()
+        {
+            @Override
+            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+            {
+                baseRequest.setHandled(true);
+                response.setStatus(200);
+                response.setHeader("X-URL", request.getRequestURI());
+                response.setHeader("X-HOST", request.getServerName());
+            }
+        });
+
+        _server.start();
+        _port = https.getLocalPort();
+    }
+
+    @After
+    public void after() throws Exception
+    {
+        if (_server != null)
+            _server.stop();
+    }
+
+    @Test
+    public void testConnect() throws Exception
+    {
+        String response = getResponse("127.0.0.1", null);
+        Assert.assertThat(response, Matchers.containsString("X-HOST: 127.0.0.1"));
+    }
+
+    @Test
+    public void testSNIConnectNoWild() throws Exception
+    {
+        // Use the alternate keystore without wildcard certificates.
+        _server.stop();
+        _server.removeConnector(_connector);
+
+        SslContextFactory sslContextFactory = new SslContextFactory();
+        sslContextFactory.setKeyStorePath("src/test/resources/snikeystore_nowild");
+        sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
+        sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
+
+        _connector = new ServerConnector(_server,
+                new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
+                new HttpConnectionFactory(_https_config));
+        _server.addConnector(_connector);
+        _server.start();
+        _port = _connector.getLocalPort();
+
+        // The first entry in the keystore is www.example.com, and it will
+        // be returned by default, so make sure that here we don't ask for it.
+        String response = getResponse("jetty.eclipse.org", "jetty.eclipse.org");
+        Assert.assertThat(response, Matchers.containsString("X-HOST: jetty.eclipse.org"));
+    }
+
+    @Test
+    public void testSNIConnect() throws Exception
+    {
+        String response = getResponse("jetty.eclipse.org", "jetty.eclipse.org");
+        Assert.assertThat(response, Matchers.containsString("X-HOST: jetty.eclipse.org"));
+
+        response = getResponse("www.example.com", "www.example.com");
+        Assert.assertThat(response, Matchers.containsString("X-HOST: www.example.com"));
+
+        response = getResponse("foo.domain.com", "*.domain.com");
+        Assert.assertThat(response, Matchers.containsString("X-HOST: foo.domain.com"));
+
+        response = getResponse("m.san.com", "san example");
+        Assert.assertThat(response, Matchers.containsString("X-HOST: m.san.com"));
+
+        response = getResponse("www.san.com", "san example");
+        Assert.assertThat(response, Matchers.containsString("X-HOST: www.san.com"));
+    }
+
+    @Test
+    public void testWildSNIConnect() throws Exception
+    {
+        String response = getResponse("domain.com", "www.domain.com", "*.domain.com");
+        Assert.assertThat(response, Matchers.containsString("X-HOST: www.domain.com"));
+
+        response = getResponse("domain.com", "domain.com", "*.domain.com");
+        Assert.assertThat(response, Matchers.containsString("X-HOST: domain.com"));
+
+        response = getResponse("www.domain.com", "www.domain.com", "*.domain.com");
+        Assert.assertThat(response, Matchers.containsString("X-HOST: www.domain.com"));
+    }
+
+    @Test
+    public void testBadSNIConnect() throws Exception
+    {
+        String response = getResponse("www.example.com", "some.other.com", "www.example.com");
+        Assert.assertThat(response, Matchers.containsString("HTTP/1.1 400 "));
+        Assert.assertThat(response, Matchers.containsString("Host does not match SNI"));
+    }
+
+    @Test
+    public void testSameConnectionRequestsForManyDomains() throws Exception
+    {
+        SslContextFactory clientContextFactory = new SslContextFactory(true);
+        clientContextFactory.start();
+        SSLSocketFactory factory = clientContextFactory.getSslContext().getSocketFactory();
+        try (SSLSocket sslSocket = (SSLSocket)factory.createSocket("127.0.0.1", _port))
+        {
+            SNIHostName serverName = new SNIHostName("m.san.com");
+            SSLParameters params = sslSocket.getSSLParameters();
+            params.setServerNames(Collections.singletonList(serverName));
+            sslSocket.setSSLParameters(params);
+            sslSocket.startHandshake();
+
+            // The first request binds the socket to an alias.
+            String request = "" +
+                    "GET /ctx/path HTTP/1.1\r\n" +
+                    "Host: m.san.com\r\n" +
+                    "\r\n";
+            OutputStream output = sslSocket.getOutputStream();
+            output.write(request.getBytes(StandardCharsets.UTF_8));
+            output.flush();
+
+            InputStream input = sslSocket.getInputStream();
+            String response = response(input);
+            Assert.assertTrue(response.startsWith("HTTP/1.1 200 "));
+
+            // Same socket, send a request for a different domain but same alias.
+            request = "" +
+                    "GET /ctx/path HTTP/1.1\r\n" +
+                    "Host: www.san.com\r\n" +
+                    "\r\n";
+            output.write(request.getBytes(StandardCharsets.UTF_8));
+            output.flush();
+
+            response = response(input);
+            Assert.assertTrue(response.startsWith("HTTP/1.1 200 "));
+
+            // Same socket, send a request for a different domain but different alias.
+            request = "" +
+                    "GET /ctx/path HTTP/1.1\r\n" +
+                    "Host: www.example.com\r\n" +
+                    "\r\n";
+            output.write(request.getBytes(StandardCharsets.UTF_8));
+            output.flush();
+
+            response = response(input);
+            Assert.assertTrue(response.startsWith("HTTP/1.1 400 "));
+            Assert.assertThat(response, Matchers.containsString("Host does not match SNI"));
+        }
+        finally
+        {
+            clientContextFactory.stop();
+        }
+    }
+
+    @Test
+    public void testSameConnectionRequestsForManyWildDomains() throws Exception
+    {
+        SslContextFactory clientContextFactory = new SslContextFactory(true);
+        clientContextFactory.start();
+        SSLSocketFactory factory = clientContextFactory.getSslContext().getSocketFactory();
+        try (SSLSocket sslSocket = (SSLSocket)factory.createSocket("127.0.0.1", _port))
+        {
+            SNIHostName serverName = new SNIHostName("www.domain.com");
+            SSLParameters params = sslSocket.getSSLParameters();
+            params.setServerNames(Collections.singletonList(serverName));
+            sslSocket.setSSLParameters(params);
+            sslSocket.startHandshake();
+
+            String request = "" +
+                    "GET /ctx/path HTTP/1.1\r\n" +
+                    "Host: www.domain.com\r\n" +
+                    "\r\n";
+            OutputStream output = sslSocket.getOutputStream();
+            output.write(request.getBytes(StandardCharsets.UTF_8));
+            output.flush();
+
+            InputStream input = sslSocket.getInputStream();
+            String response = response(input);
+            Assert.assertTrue(response.startsWith("HTTP/1.1 200 "));
+
+            // Now, on the same socket, send a request for a different valid domain.
+            request = "" +
+                    "GET /ctx/path HTTP/1.1\r\n" +
+                    "Host: assets.domain.com\r\n" +
+                    "\r\n";
+            output.write(request.getBytes(StandardCharsets.UTF_8));
+            output.flush();
+
+            response = response(input);
+            Assert.assertTrue(response.startsWith("HTTP/1.1 200 "));
+
+            // Now make a request for an invalid domain for this connection.
+            request = "" +
+                    "GET /ctx/path HTTP/1.1\r\n" +
+                    "Host: www.example.com\r\n" +
+                    "\r\n";
+            output.write(request.getBytes(StandardCharsets.UTF_8));
+            output.flush();
+
+            response = response(input);
+            Assert.assertTrue(response.startsWith("HTTP/1.1 400 "));
+            Assert.assertThat(response, Matchers.containsString("Host does not match SNI"));
+        }
+        finally
+        {
+            clientContextFactory.stop();
+        }
+    }
+
+    private String response(InputStream input) throws IOException
+    {
+        Utf8StringBuilder buffer = new Utf8StringBuilder();
+        int crlfs = 0;
+        while (true)
+        {
+            int read = input.read();
+            Assert.assertTrue(read >= 0);
+            buffer.append((byte)read);
+            crlfs = (read == '\r' || read == '\n') ? crlfs + 1 : 0;
+            if (crlfs == 4)
+                break;
+        }
+        return buffer.toString();
+    }
+
+    private String getResponse(String host, String cn) throws Exception
+    {
+        String response = getResponse(host, host, cn);
+        Assert.assertThat(response, Matchers.startsWith("HTTP/1.1 200 "));
+        Assert.assertThat(response, Matchers.containsString("X-URL: /ctx/path"));
+        return response;
+    }
+
+    private String getResponse(String sniHost, String reqHost, String cn) throws Exception
+    {
+        SslContextFactory clientContextFactory = new SslContextFactory(true);
+        clientContextFactory.start();
+        SSLSocketFactory factory = clientContextFactory.getSslContext().getSocketFactory();
+        try (SSLSocket sslSocket = (SSLSocket)factory.createSocket("127.0.0.1", _port))
+        {
+            if (cn != null)
+            {
+                SNIHostName serverName = new SNIHostName(sniHost);
+                List<SNIServerName> serverNames = new ArrayList<>();
+                serverNames.add(serverName);
+
+                SSLParameters params = sslSocket.getSSLParameters();
+                params.setServerNames(serverNames);
+                sslSocket.setSSLParameters(params);
+            }
+            sslSocket.startHandshake();
+
+            if (cn != null)
+            {
+                X509Certificate cert = ((X509Certificate)sslSocket.getSession().getPeerCertificates()[0]);
+                Assert.assertThat(cert.getSubjectX500Principal().getName("CANONICAL"), Matchers.startsWith("cn=" + cn));
+            }
+
+            String response = "GET /ctx/path HTTP/1.0\r\nHost: " + reqHost + ":" + _port + "\r\n\r\n";
+            sslSocket.getOutputStream().write(response.getBytes(StandardCharsets.ISO_8859_1));
+            return IO.toString(sslSocket.getInputStream());
+        }
+        finally
+        {
+            clientContextFactory.stop();
+        }
+    }
+
+    @Test
+    public void testSocketCustomization() throws Exception
+    {
+        final Queue<String> history = new ConcurrentArrayQueue<>();
+
+        _connector.addBean(new SocketCustomizationListener()
+        {
+            @Override
+            protected void customize(Socket socket, Class<? extends Connection> connection, boolean ssl)
+            {
+                history.add("customize connector " + connection + "," + ssl);
+            }
+        });
+
+        _connector.getBean(SslConnectionFactory.class).addBean(new SocketCustomizationListener()
+        {
+            @Override
+            protected void customize(Socket socket, Class<? extends Connection> connection, boolean ssl)
+            {
+                history.add("customize ssl " + connection + "," + ssl);
+            }
+        });
+
+        _connector.getBean(HttpConnectionFactory.class).addBean(new SocketCustomizationListener()
+        {
+            @Override
+            protected void customize(Socket socket, Class<? extends Connection> connection, boolean ssl)
+            {
+                history.add("customize http " + connection + "," + ssl);
+            }
+        });
+
+        String response = getResponse("127.0.0.1", null);
+        Assert.assertThat(response, Matchers.containsString("X-HOST: 127.0.0.1"));
+
+        Assert.assertEquals("customize connector class org.eclipse.jetty.io.ssl.SslConnection,false", history.poll());
+        Assert.assertEquals("customize ssl class org.eclipse.jetty.io.ssl.SslConnection,false", history.poll());
+        Assert.assertEquals("customize connector class org.eclipse.jetty.server.HttpConnection,true", history.poll());
+        Assert.assertEquals("customize http class org.eclipse.jetty.server.HttpConnection,true", history.poll());
+        Assert.assertEquals(0, history.size());
+    }
+}
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SslConnectionFactoryTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SslConnectionFactoryTest.java
new file mode 100644
index 0000000..9d7e859
--- /dev/null
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SslConnectionFactoryTest.java
@@ -0,0 +1,239 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.ssl;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.nio.charset.StandardCharsets;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Queue;
+
+import javax.net.ssl.SNIHostName;
+import javax.net.ssl.SNIServerName;
+import javax.net.ssl.SSLParameters;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.io.Connection;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.SecureRequestCustomizer;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.SocketCustomizationListener;
+import org.eclipse.jetty.server.SslConnectionFactory;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.eclipse.jetty.util.ConcurrentArrayQueue;
+import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.hamcrest.Matchers;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SslConnectionFactoryTest
+{        
+    Server _server;
+    ServerConnector _connector;
+    int _port;
+    
+    @Before
+    public void before() throws Exception
+    {
+        String keystorePath = "src/test/resources/keystore";
+        File keystoreFile = new File(keystorePath);
+        if (!keystoreFile.exists())
+        {
+            throw new FileNotFoundException(keystoreFile.getAbsolutePath());
+        }
+
+        _server = new Server();
+
+        HttpConfiguration http_config = new HttpConfiguration();
+        http_config.setSecureScheme("https");
+        http_config.setSecurePort(8443);
+        http_config.setOutputBufferSize(32768);
+        HttpConfiguration https_config = new HttpConfiguration(http_config);
+        https_config.addCustomizer(new SecureRequestCustomizer());
+
+        
+        SslContextFactory sslContextFactory = new SslContextFactory();
+        sslContextFactory.setKeyStorePath(keystoreFile.getAbsolutePath());
+        sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
+        sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
+
+        ServerConnector https = _connector = new ServerConnector(_server,
+            new SslConnectionFactory(sslContextFactory,HttpVersion.HTTP_1_1.asString()),
+                new HttpConnectionFactory(https_config));
+        https.setPort(0);
+        https.setIdleTimeout(30000);
+
+        _server.addConnector(https);
+        
+        _server.setHandler(new AbstractHandler()
+        {
+            @Override
+            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+            {
+                response.setStatus(200);
+                response.getWriter().write("url="+request.getRequestURI()+"\nhost="+request.getServerName());
+                response.flushBuffer();
+            }
+        });
+        
+        _server.start();
+        _port=https.getLocalPort();   
+    }
+    
+    @After
+    public void after() throws Exception
+    {
+        _server.stop();
+        _server=null;
+    }
+    
+    @Test
+    public void testConnect() throws Exception
+    {
+        String response= getResponse("127.0.0.1",null);        
+        Assert.assertThat(response,Matchers.containsString("host=127.0.0.1"));
+    }
+    
+    @Test
+    public void testSNIConnect() throws Exception
+    {
+        String response;
+        
+        response= getResponse("localhost","localhost","jetty.eclipse.org");
+        Assert.assertThat(response,Matchers.containsString("host=localhost"));
+    }
+
+
+    private String getResponse(String host,String cn) throws Exception
+    {
+        String response = getResponse(host,host,cn);
+        Assert.assertThat(response,Matchers.startsWith("HTTP/1.1 200 OK"));
+        Assert.assertThat(response,Matchers.containsString("url=/ctx/path"));
+        return response;
+    }
+
+    @Test
+    public void testBadHandshake() throws Exception
+    {
+        try(Socket socket=new Socket("127.0.0.1", _port); OutputStream out = socket.getOutputStream())
+        {
+            out.write("Rubbish".getBytes());
+            out.flush();
+            
+            Assert.assertThat(socket.getInputStream().read(),Matchers.equalTo(-1));
+        }
+        
+    }
+    
+    private String getResponse(String sniHost,String reqHost, String cn) throws Exception
+    {
+        SslContextFactory clientContextFactory = new SslContextFactory(true);
+        clientContextFactory.start();
+        SSLSocketFactory factory = clientContextFactory.getSslContext().getSocketFactory();
+        
+        SSLSocket sslSocket = (SSLSocket)factory.createSocket("127.0.0.1", _port);
+
+        if (cn!=null)
+        {        
+            SNIHostName serverName = new SNIHostName(sniHost);
+            List<SNIServerName> serverNames = new ArrayList<>();
+            serverNames.add(serverName);
+
+            SSLParameters params = sslSocket.getSSLParameters();
+            params.setServerNames(serverNames);
+            sslSocket.setSSLParameters(params);
+        }
+        sslSocket.startHandshake();
+
+        
+        if (cn!=null)
+        {                                        
+            X509Certificate cert = ((X509Certificate)sslSocket.getSession().getPeerCertificates()[0]);
+            
+            Assert.assertThat(cert.getSubjectX500Principal().getName("CANONICAL"), Matchers.startsWith("cn="+cn));
+        }
+
+        sslSocket.getOutputStream().write(("GET /ctx/path HTTP/1.0\r\nHost: "+reqHost+":"+_port+"\r\n\r\n").getBytes(StandardCharsets.ISO_8859_1));
+        String response = IO.toString(sslSocket.getInputStream());
+        
+        sslSocket.close();
+        clientContextFactory.stop();
+        return response;
+    }
+    
+
+    @Test
+    public void testSocketCustomization() throws Exception
+    {
+        final Queue<String> history = new ConcurrentArrayQueue<>();
+        
+        _connector.addBean(new SocketCustomizationListener()
+        {
+            @Override
+            protected void customize(Socket socket, Class<? extends Connection> connection, boolean ssl)
+            {
+                history.add("customize connector "+connection+","+ssl);
+            }            
+        });
+
+        _connector.getBean(SslConnectionFactory.class).addBean(new SocketCustomizationListener()
+        {
+            @Override
+            protected void customize(Socket socket, Class<? extends Connection> connection, boolean ssl)
+            {
+                history.add("customize ssl "+connection+","+ssl);
+            }            
+        });
+        
+        _connector.getBean(HttpConnectionFactory.class).addBean(new SocketCustomizationListener()
+        {
+            @Override
+            protected void customize(Socket socket, Class<? extends Connection> connection, boolean ssl)
+            {
+                history.add("customize http "+connection+","+ssl);
+            }            
+        });
+
+        String response= getResponse("127.0.0.1",null);        
+        Assert.assertThat(response,Matchers.containsString("host=127.0.0.1"));
+        
+        Assert.assertEquals("customize connector class org.eclipse.jetty.io.ssl.SslConnection,false",history.poll());
+        Assert.assertEquals("customize ssl class org.eclipse.jetty.io.ssl.SslConnection,false",history.poll());
+        Assert.assertEquals("customize connector class org.eclipse.jetty.server.HttpConnection,true",history.poll());
+        Assert.assertEquals("customize http class org.eclipse.jetty.server.HttpConnection,true",history.poll());
+        Assert.assertEquals(0,history.size());
+    }
+    
+}
diff --git a/jetty-server/src/test/resources/jetty-logging.properties b/jetty-server/src/test/resources/jetty-logging.properties
index adf68c7..f345cd6 100644
--- a/jetty-server/src/test/resources/jetty-logging.properties
+++ b/jetty-server/src/test/resources/jetty-logging.properties
@@ -1,3 +1,3 @@
 org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
-#org.eclipse.jetty.LEVEL=DEBUG
+org.eclipse.jetty.LEVEL=INFO
 #org.eclipse.jetty.server.LEVEL=DEBUG
diff --git a/jetty-server/src/test/resources/keystore b/jetty-server/src/test/resources/keystore
index b727bd0..d6592f9 100644
--- a/jetty-server/src/test/resources/keystore
+++ b/jetty-server/src/test/resources/keystore
Binary files differ
diff --git a/jetty-server/src/test/resources/snikeystore b/jetty-server/src/test/resources/snikeystore
new file mode 100644
index 0000000..3c69266
--- /dev/null
+++ b/jetty-server/src/test/resources/snikeystore
Binary files differ
diff --git a/jetty-server/src/test/resources/snikeystore_nowild b/jetty-server/src/test/resources/snikeystore_nowild
new file mode 100644
index 0000000..91c6166
--- /dev/null
+++ b/jetty-server/src/test/resources/snikeystore_nowild
Binary files differ
diff --git a/jetty-servlet/pom.xml b/jetty-servlet/pom.xml
index b2fb0ee..f25edef 100644
--- a/jetty-servlet/pom.xml
+++ b/jetty-servlet/pom.xml
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>jetty-project</artifactId>
     <groupId>org.eclipse.jetty</groupId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-servlet</artifactId>
@@ -16,34 +16,8 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-                <Import-Package>javax.servlet.*;version="[2.6.0,3.2)",org.eclipse.jetty.jmx.*;version="9.1";resolution:=optional,*</Import-Package>
-                <_nouses>true</_nouses>
-              </instructions>
-            </configuration>
-           </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <!--
-        Required for OSGI
-        -->
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
         <executions>
           <execution>
             <id>tests</id>
@@ -54,23 +28,6 @@
         </executions>
       </plugin>
       <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
         <configuration>
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/BaseHolder.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/BaseHolder.java
index feabdea..5455b4a 100644
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/BaseHolder.java
+++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/BaseHolder.java
@@ -38,7 +38,7 @@
  * Base class for all servlet-related classes that may be lazily instantiated  (eg servlet, filter, 
  * listener), and/or require metadata to be held regarding their origin 
  * (web.xml, annotation, programmatic api etc).
- * 
+ * @param <T> the type of holder
  */
 public abstract class BaseHolder<T> extends AbstractLifeCycle implements Dumpable
 {
@@ -68,7 +68,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Do any setup necessary after starting
-     * @throws Exception
+     * @throws Exception if unable to initialize
      */
     public void initialize()
     throws Exception
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/DefaultServlet.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/DefaultServlet.java
index 56df44c..be9e814 100644
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/DefaultServlet.java
+++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/DefaultServlet.java
@@ -18,6 +18,9 @@
 
 package org.eclipse.jetty.servlet;
 
+import static org.eclipse.jetty.http.GzipHttpContent.ETAG_GZIP_QUOTE;
+import static org.eclipse.jetty.http.GzipHttpContent.removeGzipFromETag;
+
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
@@ -39,18 +42,23 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.eclipse.jetty.http.DateParser;
+import org.eclipse.jetty.http.GzipHttpContent;
 import org.eclipse.jetty.http.HttpContent;
 import org.eclipse.jetty.http.HttpField;
 import org.eclipse.jetty.http.HttpFields;
-import org.eclipse.jetty.http.HttpGenerator.CachedHttpField;
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpMethod;
 import org.eclipse.jetty.http.MimeTypes;
 import org.eclipse.jetty.http.PathMap.MappedEntry;
+import org.eclipse.jetty.http.PreEncodedHttpField;
+import org.eclipse.jetty.http.ResourceHttpContent;
 import org.eclipse.jetty.io.WriterOutputStream;
 import org.eclipse.jetty.server.HttpOutput;
 import org.eclipse.jetty.server.InclusiveByteRange;
+import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.ResourceCache;
+import org.eclipse.jetty.server.ResourceContentFactory;
 import org.eclipse.jetty.server.Response;
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.util.BufferUtil;
@@ -66,16 +74,15 @@
 import org.eclipse.jetty.util.resource.ResourceFactory;
 
 
-
-/* ------------------------------------------------------------ */
-/** The default servlet.
- * 
+/** 
+ * The default servlet.
+ * <p>
  * This servlet, normally mapped to /, provides the handling for static
  * content, OPTION and TRACE methods for the context.
  * The following initParameters are supported, these can be set either
  * on the servlet itself or as ServletContext initParameters with a prefix
  * of org.eclipse.jetty.servlet.Default. :
- * <PRE>
+ * <pre>
  *  acceptRanges      If true, range requests and responses are
  *                    supported
  *
@@ -134,10 +141,7 @@
  *                    Other file extensions that signify that a file is gzip compressed. Eg ".svgz"
  *
  *
- * </PRE>
- *
- *
- *
+ * </pre>
  *
  */
 public class DefaultServlet extends HttpServlet implements ResourceFactory
@@ -146,7 +150,7 @@
 
     private static final long serialVersionUID = 4930458713846881193L;
     
-    private static final CachedHttpField ACCEPT_RANGES = new CachedHttpField(HttpHeader.ACCEPT_RANGES, "bytes");
+    private static final PreEncodedHttpField ACCEPT_RANGES = new PreEncodedHttpField(HttpHeader.ACCEPT_RANGES, "bytes");
     
     private ServletContext _servletContext;
     private ContextHandler _contextHandler;
@@ -162,6 +166,7 @@
 
     private Resource _resourceBase;
     private ResourceCache _cache;
+    private HttpContent.Factory _contentFactory;
 
     private MimeTypes _mimeTypes;
     private String[] _welcomes;
@@ -243,8 +248,8 @@
 
         String cc=getInitParameter("cacheControl");
         if (cc!=null)
-            _cacheControl=new CachedHttpField(HttpHeader.CACHE_CONTROL, cc);
-        
+            _cacheControl=new PreEncodedHttpField(HttpHeader.CACHE_CONTROL, cc);
+
         String resourceCache = getInitParameter("resourceCache");
         int max_cache_size=getInitInt("maxCacheSize", -2);
         int max_cached_file_size=getInitInt("maxCachedFileSize", -2);
@@ -258,23 +263,23 @@
             _cache=(ResourceCache)_servletContext.getAttribute(resourceCache);
 
             if (LOG.isDebugEnabled())
-                LOG.debug("Cache {}={}",resourceCache,_cache);
+                LOG.debug("Cache {}={}",resourceCache,_contentFactory);
         }
 
         _etags = getInitBoolean("etags",_etags);
-        
+
         try
         {
             if (_cache==null && (max_cached_files!=-2 || max_cache_size!=-2 || max_cached_file_size!=-2))
             {
-                _cache= new ResourceCache(null,this,_mimeTypes,_useFileMappedBuffer,_etags);
-
+                _cache = new ResourceCache(null,this,_mimeTypes,_useFileMappedBuffer,_etags,_gzip);
                 if (max_cache_size>=0)
                     _cache.setMaxCacheSize(max_cache_size);
                 if (max_cached_file_size>=-1)
                     _cache.setMaxCachedFileSize(max_cached_file_size);
                 if (max_cached_files>=-1)
                     _cache.setMaxCachedFiles(max_cached_files);
+                _servletContext.setAttribute(resourceCache==null?"resourceCache":resourceCache,_cache);
             }
         }
         catch (Exception e)
@@ -282,37 +287,38 @@
             LOG.warn(Log.EXCEPTION,e);
             throw new UnavailableException(e.toString());
         }
-        
-       _gzipEquivalentFileExtensions = new ArrayList<String>();
-       String otherGzipExtensions = getInitParameter("otherGzipFileExtensions");
-       if (otherGzipExtensions != null)
-       {
-           //comma separated list
-           StringTokenizer tok = new StringTokenizer(otherGzipExtensions,",",false);
-           while (tok.hasMoreTokens())
-           {
-               String s = tok.nextToken().trim();
-               _gzipEquivalentFileExtensions.add((s.charAt(0)=='.'?s:"."+s));
-           }
-       }
-       else
-       {
-           //.svgz files are gzipped svg files and must be served with Content-Encoding:gzip
-           _gzipEquivalentFileExtensions.add(".svgz");   
-       }
 
-       _servletHandler= _contextHandler.getChildHandlerByClass(ServletHandler.class);
-       for (ServletHolder h :_servletHandler.getServlets())
-           if (h.getServletInstance()==this)
-               _defaultHolder=h;
+        _contentFactory=_cache==null?new ResourceContentFactory(this,_mimeTypes,-1,_gzip):_cache; // TODO pass a buffer size
 
+        _gzipEquivalentFileExtensions = new ArrayList<String>();
+        String otherGzipExtensions = getInitParameter("otherGzipFileExtensions");
+        if (otherGzipExtensions != null)
+        {
+            //comma separated list
+            StringTokenizer tok = new StringTokenizer(otherGzipExtensions,",",false);
+            while (tok.hasMoreTokens())
+            {
+                String s = tok.nextToken().trim();
+                _gzipEquivalentFileExtensions.add((s.charAt(0)=='.'?s:"."+s));
+            }
+        }
+        else
+        {
+            //.svgz files are gzipped svg files and must be served with Content-Encoding:gzip
+            _gzipEquivalentFileExtensions.add(".svgz");   
+        }
 
-       if (LOG.isDebugEnabled())
-           LOG.debug("resource base = "+_resourceBase);
+        _servletHandler= _contextHandler.getChildHandlerByClass(ServletHandler.class);
+        for (ServletHolder h :_servletHandler.getServlets())
+            if (h.getServletInstance()==this)
+                _defaultHolder=h;
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("resource base = "+_resourceBase);
     }
 
     /**
-     * Compute the field _contextHandler.<br/>
+     * Compute the field _contextHandler.<br>
      * In the case where the DefaultServlet is deployed on the HttpService it is likely that
      * this method needs to be overwritten to unwrap the ServletContext facade until we reach
      * the original jetty's ContextHandler.
@@ -423,8 +429,8 @@
         String servletPath=null;
         String pathInfo=null;
         Enumeration<String> reqRanges = null;
-        Boolean included =request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI)!=null;
-        if (included!=null && included.booleanValue())
+        boolean included =request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI)!=null;
+        if (included)
         {
             servletPath=(String)request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH);
             pathInfo=(String)request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO);
@@ -436,7 +442,6 @@
         }
         else
         {
-            included = Boolean.FALSE;
             servletPath = _pathInfoOnly?"/":request.getServletPath();
             pathInfo = request.getPathInfo();
 
@@ -448,155 +453,72 @@
 
         String pathInContext=URIUtil.addPaths(servletPath,pathInfo);
         boolean endsWithSlash=(pathInfo==null?request.getServletPath():pathInfo).endsWith(URIUtil.SLASH);
-
-
-        // Find the resource and content
-        Resource resource=null;
+        boolean gzippable=_gzip && !endsWithSlash && !included && reqRanges==null;
+        
         HttpContent content=null;
-        boolean close_content=true;
+        boolean release_content=true;
         try
         {
-            // is gzip enabled?
-            String pathInContextGz=null;
-            boolean gzip=false;
-            if (!included.booleanValue() && _gzip && reqRanges==null && !endsWithSlash )
-            {
-                // Look for a gzip resource
-                pathInContextGz=pathInContext+".gz";
-                if (_cache==null)
-                    resource=getResource(pathInContextGz);
-                else
-                {
-                    content=_cache.lookup(pathInContextGz);
-                    resource=(content==null)?null:content.getResource();
-                }
-
-                // Does a gzip resource exist?
-                if (resource!=null && resource.exists() && !resource.isDirectory())
-                {
-                    // Tell caches that response may vary by accept-encoding
-                    response.addHeader(HttpHeader.VARY.asString(),HttpHeader.ACCEPT_ENCODING.asString());
-                    
-                    // Does the client accept gzip?
-                    String accept=request.getHeader(HttpHeader.ACCEPT_ENCODING.asString());
-                    if (accept!=null && accept.indexOf("gzip")>=0)
-                        gzip=true;
-                }
-            }
-
-            // find resource
-            if (!gzip)
-            {
-                if (_cache==null)
-                    resource=getResource(pathInContext);
-                else
-                {
-                    content=_cache.lookup(pathInContext);
-                    resource=content==null?null:content.getResource();
-                }
-            }
-
+            // Find the content
+            content=_contentFactory.getContent(pathInContext);
             if (LOG.isDebugEnabled())
-                LOG.debug(String.format("uri=%s, resource=%s, content=%s",request.getRequestURI(),resource,content));
-
-            // Handle resource
-            if (resource==null || !resource.exists())
+                LOG.info("content={}",content);
+            
+            // Not found?
+            if (content==null || !content.getResource().exists())
             {
                 if (included)
                     throw new FileNotFoundException("!" + pathInContext);
                 response.sendError(HttpServletResponse.SC_NOT_FOUND);
+                return;
             }
-            else if (!resource.isDirectory())
+            
+            // Directory?
+            if (content.getResource().isDirectory())
             {
-                if (endsWithSlash && pathInContext.length()>1)
-                {
-                    String q=request.getQueryString();
-                    pathInContext=pathInContext.substring(0,pathInContext.length()-1);
-                    if (q!=null&&q.length()!=0)
-                        pathInContext+="?"+q;
-                    response.sendRedirect(response.encodeRedirectURL(URIUtil.addPaths(_servletContext.getContextPath(),pathInContext)));
-                }
-                else
-                {
-                    // ensure we have content
-                    if (content==null)
-                        content=new HttpContent.ResourceAsHttpContent(resource,_mimeTypes.getMimeByExtension(resource.toString()),response.getBufferSize(),_etags);
-
-                    if (included.booleanValue() || passConditionalHeaders(request,response, resource,content))
-                    {
-                        if (gzip || isGzippedContent(pathInContext))
-                        {
-                            response.setHeader(HttpHeader.CONTENT_ENCODING.asString(),"gzip");
-                            String mt=_servletContext.getMimeType(pathInContext);
-                            if (mt!=null)
-                                response.setContentType(mt);
-                        }
-                        close_content=sendData(request,response,included.booleanValue(),resource,content,reqRanges);
-                    }
-                }
+                sendWelcome(content,pathInContext,endsWithSlash,included,request,response);
+                return;
             }
-            else
+            
+            // Strip slash?
+            if (endsWithSlash && pathInContext.length()>1)
             {
-                String welcome=null;
-
-                if (!endsWithSlash || (pathInContext.length()==1 && request.getAttribute("org.eclipse.jetty.server.nullPathInfo")!=null))
-                {
-                    StringBuffer buf=request.getRequestURL();
-                    synchronized(buf)
-                    {
-                        int param=buf.lastIndexOf(";");
-                        if (param<0)
-                            buf.append('/');
-                        else
-                            buf.insert(param,'/');
-                        String q=request.getQueryString();
-                        if (q!=null&&q.length()!=0)
-                        {
-                            buf.append('?');
-                            buf.append(q);
-                        }
-                        response.setContentLength(0);
-                        response.sendRedirect(response.encodeRedirectURL(buf.toString()));
-                    }
-                }
-                // else look for a welcome file
-                else if (null!=(welcome=getWelcomeFile(pathInContext)))
+                String q=request.getQueryString();
+                pathInContext=pathInContext.substring(0,pathInContext.length()-1);
+                if (q!=null&&q.length()!=0)
+                    pathInContext+="?"+q;
+                response.sendRedirect(response.encodeRedirectURL(URIUtil.addPaths(_servletContext.getContextPath(),pathInContext)));
+                return;
+            }
+            
+            // Conditional response?
+            if (!included && !passConditionalHeaders(request,response,content))
+                return;
+                
+            // Gzip?
+            HttpContent gzip_content = gzippable?content.getGzipContent():null;
+            if (gzip_content!=null)
+            {
+                // Tell caches that response may vary by accept-encoding
+                response.addHeader(HttpHeader.VARY.asString(),HttpHeader.ACCEPT_ENCODING.asString());
+                
+                // Does the client accept gzip?
+                String accept=request.getHeader(HttpHeader.ACCEPT_ENCODING.asString());
+                if (accept!=null && accept.indexOf("gzip")>=0)
                 {
                     if (LOG.isDebugEnabled())
-                        LOG.debug("welcome={}",welcome);
-                    if (_redirectWelcome)
-                    {
-                        // Redirect to the index
-                        response.setContentLength(0);
-                        String q=request.getQueryString();
-                        if (q!=null&&q.length()!=0)
-                            response.sendRedirect(response.encodeRedirectURL(URIUtil.addPaths( _servletContext.getContextPath(),welcome)+"?"+q));
-                        else
-                            response.sendRedirect(response.encodeRedirectURL(URIUtil.addPaths( _servletContext.getContextPath(),welcome)));
-                    }
-                    else
-                    {
-                        // Forward to the index
-                        RequestDispatcher dispatcher=request.getRequestDispatcher(welcome);
-                        if (dispatcher!=null)
-                        {
-                            if (included.booleanValue())
-                                dispatcher.include(request,response);
-                            else
-                            {
-                                request.setAttribute("org.eclipse.jetty.server.welcome",welcome);
-                                dispatcher.forward(request,response);
-                            }
-                        }
-                    }
-                }
-                else
-                {
-                    content=new HttpContent.ResourceAsHttpContent(resource,_mimeTypes.getMimeByExtension(resource.toString()),_etags);
-                    if (included.booleanValue() || passConditionalHeaders(request,response, resource,content))
-                        sendDirectory(request,response,resource,pathInContext);
+                        LOG.debug("gzip={}",gzip_content);
+                    content=gzip_content;
                 }
             }
+
+            // TODO this should be done by HttpContent#getContentEncoding
+            if (isGzippedContent(pathInContext))
+                response.setHeader(HttpHeader.CONTENT_ENCODING.asString(),"gzip");
+                
+            // Send the data
+            release_content=sendData(request,response,included,content,reqRanges);
+            
         }
         catch(IllegalArgumentException e)
         {
@@ -606,21 +528,80 @@
         }
         finally
         {
-            if (close_content)
+            if (release_content)
             {
                 if (content!=null)
                     content.release();
-                else if (resource!=null)
-                    resource.close();
             }
         }
 
     }
 
-    /**
-     * @param resource
-     * @return
-     */
+    protected void sendWelcome(HttpContent content, String pathInContext, boolean endsWithSlash, boolean included, HttpServletRequest request, HttpServletResponse response)
+        throws ServletException, IOException
+    {                
+        // Redirect to directory
+        if (!endsWithSlash || (pathInContext.length()==1 && request.getAttribute("org.eclipse.jetty.server.nullPathInfo")!=null))
+        {
+            StringBuffer buf=request.getRequestURL();
+            synchronized(buf)
+            {
+                int param=buf.lastIndexOf(";");
+                if (param<0)
+                    buf.append('/');
+                else
+                    buf.insert(param,'/');
+                String q=request.getQueryString();
+                if (q!=null&&q.length()!=0)
+                {
+                    buf.append('?');
+                    buf.append(q);
+                }
+                response.setContentLength(0);
+                response.sendRedirect(response.encodeRedirectURL(buf.toString()));
+            }
+            return;
+        }
+        
+        // look for a welcome file
+        String welcome=getWelcomeFile(pathInContext);
+        if (welcome!=null)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("welcome={}",welcome);
+            if (_redirectWelcome)
+            {
+                // Redirect to the index
+                response.setContentLength(0);
+                String q=request.getQueryString();
+                if (q!=null&&q.length()!=0)
+                    response.sendRedirect(response.encodeRedirectURL(URIUtil.addPaths( _servletContext.getContextPath(),welcome)+"?"+q));
+                else
+                    response.sendRedirect(response.encodeRedirectURL(URIUtil.addPaths( _servletContext.getContextPath(),welcome)));
+            }
+            else
+            {
+                // Forward to the index
+                RequestDispatcher dispatcher=request.getRequestDispatcher(welcome);
+                if (dispatcher!=null)
+                {
+                    if (included)
+                        dispatcher.include(request,response);
+                    else
+                    {
+                        request.setAttribute("org.eclipse.jetty.server.welcome",welcome);
+                        dispatcher.forward(request,response);
+                    }
+                }
+            }
+            return;
+        }
+         
+        if (included || passConditionalHeaders(request,response, content))
+            sendDirectory(request,response,content.getResource(),pathInContext);
+    }
+
+    /* ------------------------------------------------------------ */
     protected boolean isGzippedContent(String path)
     {
         if (path == null) return false;
@@ -704,26 +685,67 @@
     /* ------------------------------------------------------------ */
     /* Check modification date headers.
      */
-    protected boolean passConditionalHeaders(HttpServletRequest request,HttpServletResponse response, Resource resource, HttpContent content)
+    protected boolean passConditionalHeaders(HttpServletRequest request,HttpServletResponse response, HttpContent content)
     throws IOException
     {
         try
         {
+            String ifm=null;
+            String ifnm=null;
+            String ifms=null;
+            long ifums=-1;
+            
+            if (request instanceof Request)
+            {
+                // Find multiple fields by iteration as an optimization 
+                HttpFields fields = ((Request)request).getHttpFields();
+                for (int i=fields.size();i-->0;)
+                {
+                    HttpField field=fields.getField(i);
+                    if (field.getHeader() != null)
+                    {
+                        switch (field.getHeader())
+                        {
+                            case IF_MATCH:
+                                ifm=field.getValue();
+                                break;
+                            case IF_NONE_MATCH:
+                                ifnm=field.getValue();
+                                break;
+                            case IF_MODIFIED_SINCE:
+                                ifms=field.getValue();
+                                break;
+                            case IF_UNMODIFIED_SINCE:
+                                ifums=DateParser.parseDate(field.getValue());
+                                break;
+                            default:
+                        }
+                    }
+                }
+            }
+            else
+            {
+                ifm=request.getHeader(HttpHeader.IF_MATCH.asString());
+                ifnm=request.getHeader(HttpHeader.IF_NONE_MATCH.asString());
+                ifms=request.getHeader(HttpHeader.IF_MODIFIED_SINCE.asString());
+                ifums=request.getDateHeader(HttpHeader.IF_UNMODIFIED_SINCE.asString());
+            }
+            
             if (!HttpMethod.HEAD.is(request.getMethod()))
             {
                 if (_etags)
                 {
-                    String ifm=request.getHeader(HttpHeader.IF_MATCH.asString());
+                    String etag=content.getETagValue();
                     if (ifm!=null)
                     {
                         boolean match=false;
-                        if (content.getETag()!=null)
+                        if (etag!=null)
                         {
                             QuotedStringTokenizer quoted = new QuotedStringTokenizer(ifm,", ",false,true);
                             while (!match && quoted.hasMoreTokens())
                             {
                                 String tag = quoted.nextToken();
-                                if (content.getETag().equals(tag))
+                                if (etag.equals(tag) || tag.endsWith(ETAG_GZIP_QUOTE) && etag.equals(removeGzipFromETag(tag)))
                                     match=true;
                             }
                         }
@@ -735,34 +757,25 @@
                         }
                     }
                     
-                    String if_non_match_etag=request.getHeader(HttpHeader.IF_NONE_MATCH.asString());
-                    if (if_non_match_etag!=null && content.getETag()!=null)
+                    if (ifnm!=null && etag!=null)
                     {
-                        // Look for GzipFiltered version of etag
-                        if (content.getETag().equals(request.getAttribute("o.e.j.s.GzipFilter.ETag")))
+                        // Handle special case of exact match OR gzip exact match
+                        if (etag.equals(ifnm) || ifnm.endsWith(ETAG_GZIP_QUOTE) && ifnm.indexOf(',')<0 && etag.equals(removeGzipFromETag(etag)))
                         {
                             response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
-                            response.setHeader(HttpHeader.ETAG.asString(),if_non_match_etag);
+                            response.setHeader(HttpHeader.ETAG.asString(),ifnm);
                             return false;
                         }
                         
-                        // Handle special case of exact match.
-                        if (content.getETag().equals(if_non_match_etag))
-                        {
-                            response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
-                            response.setHeader(HttpHeader.ETAG.asString(),content.getETag());
-                            return false;
-                        }
-
                         // Handle list of tags
-                        QuotedStringTokenizer quoted = new QuotedStringTokenizer(if_non_match_etag,", ",false,true);
+                        QuotedStringTokenizer quoted = new QuotedStringTokenizer(ifnm,", ",false,true);
                         while (quoted.hasMoreTokens())
                         {
                             String tag = quoted.nextToken();
-                            if (content.getETag().equals(tag))
+                            if (etag.equals(tag) || tag.endsWith(ETAG_GZIP_QUOTE) && etag.equals(removeGzipFromETag(tag))) 
                             {
                                 response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
-                                response.setHeader(HttpHeader.ETAG.asString(),content.getETag());
+                                response.setHeader(HttpHeader.ETAG.asString(),tag);
                                 return false;
                             }
                         }
@@ -773,34 +786,32 @@
                 }
                 
                 // Handle if modified since
-                String ifms=request.getHeader(HttpHeader.IF_MODIFIED_SINCE.asString());
                 if (ifms!=null)
                 {
                     //Get jetty's Response impl
-                    String mdlm=content.getLastModified();
+                    String mdlm=content.getLastModifiedValue();
                     if (mdlm!=null && ifms.equals(mdlm))
                     {
                         response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                         if (_etags)
-                            response.setHeader(HttpHeader.ETAG.asString(),content.getETag());
+                            response.setHeader(HttpHeader.ETAG.asString(),content.getETagValue());
                         response.flushBuffer();
                         return false;
                     }
 
                     long ifmsl=request.getDateHeader(HttpHeader.IF_MODIFIED_SINCE.asString());
-                    if (ifmsl!=-1 && resource.lastModified()/1000 <= ifmsl/1000)
+                    if (ifmsl!=-1 && content.getResource().lastModified()/1000 <= ifmsl/1000)
                     { 
                         response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                         if (_etags)
-                            response.setHeader(HttpHeader.ETAG.asString(),content.getETag());
+                            response.setHeader(HttpHeader.ETAG.asString(),content.getETagValue());
                         response.flushBuffer();
                         return false;
                     }
                 }
 
                 // Parse the if[un]modified dates and compare to resource
-                long date=request.getDateHeader(HttpHeader.IF_UNMODIFIED_SINCE.asString());
-                if (date!=-1 && resource.lastModified()/1000 > date/1000)
+                if (ifums!=-1 && content.getResource().lastModified()/1000 > ifums/1000)
                 {
                     response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED);
                     return false;
@@ -853,8 +864,8 @@
             return;
         }
 
-        data=dir.getBytes("UTF-8");
-        response.setContentType("text/html; charset=UTF-8");
+        data=dir.getBytes("utf-8");
+        response.setContentType("text/html;charset=utf-8");
         response.setContentLength(data.length);
         response.getOutputStream().write(data);
     }
@@ -863,12 +874,11 @@
     protected boolean sendData(HttpServletRequest request,
             HttpServletResponse response,
             boolean include,
-            Resource resource,
             final HttpContent content,
             Enumeration<String> reqRanges)
     throws IOException
     {
-        final long content_length = (content==null)?resource.length():content.getContentLength();
+        final long content_length = content.getContentLengthValue();
         
         // Get the output stream (or writer)
         OutputStream out =null;
@@ -877,7 +887,7 @@
         {
             out = response.getOutputStream();
 
-            // has a filter already written to the response?
+            // has something already written to the response?
             written = out instanceof HttpOutput
                 ? ((HttpOutput)out).isWritten()
                 : true;
@@ -896,31 +906,25 @@
             //  if there were no ranges, send entire entity
             if (include)
             {
-                resource.writeTo(out,0,content_length);
+                // write without headers
+                content.getResource().writeTo(out,0,content_length);
             }
             // else if we can't do a bypass write because of wrapping
-            else if (content==null || written || !(out instanceof HttpOutput))
+            else if (written || !(out instanceof HttpOutput))
             {
                 // write normally
-                writeHeaders(response,content,written?-1:content_length);
-                ByteBuffer buffer = (content==null)?null:content.getIndirectBuffer();
+                putHeaders(response,content,written?-1:0);
+                ByteBuffer buffer = content.getIndirectBuffer();
                 if (buffer!=null)
                     BufferUtil.writeTo(buffer,out);
                 else
-                    resource.writeTo(out,0,content_length);
+                    content.getResource().writeTo(out,0,content_length);
             }
             // else do a bypass write
             else
             {
                 // write the headers
-                if (response instanceof Response)
-                {
-                    Response r = (Response)response;
-                    writeOptionHeaders(r.getHttpFields());
-                    r.setHeaders(content);
-                }
-                else
-                    writeHeaders(response,content,content_length);
+                putHeaders(response,content,0);
 
                 // write the content asynchronously if supported
                 if (request.isAsyncSupported())
@@ -958,7 +962,6 @@
                 }
                 // otherwise write content blocking
                 ((HttpOutput)out).sendContent(content);
-                
             }
         }
         else
@@ -969,11 +972,11 @@
             //  if there are no satisfiable ranges, send 416 response
             if (ranges==null || ranges.size()==0)
             {
-                writeHeaders(response, content, content_length);
+                putHeaders(response,content,0);
                 response.setStatus(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
                 response.setHeader(HttpHeader.CONTENT_RANGE.asString(),
                         InclusiveByteRange.to416HeaderRangeString(content_length));
-                resource.writeTo(out,0,content_length);
+                content.getResource().writeTo(out,0,content_length);
                 return true;
             }
 
@@ -983,13 +986,13 @@
             {
                 InclusiveByteRange singleSatisfiableRange = ranges.get(0);
                 long singleLength = singleSatisfiableRange.getSize(content_length);
-                writeHeaders(response,content,singleLength                     );
+                putHeaders(response,content,singleLength);
                 response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
                 if (!response.containsHeader(HttpHeader.DATE.asString()))
                     response.addDateHeader(HttpHeader.DATE.asString(),System.currentTimeMillis());
                 response.setHeader(HttpHeader.CONTENT_RANGE.asString(),
                         singleSatisfiableRange.toHeaderRangeString(content_length));
-                resource.writeTo(out,singleSatisfiableRange.getFirst(content_length),singleLength);
+                content.getResource().writeTo(out,singleSatisfiableRange.getFirst(content_length),singleLength);
                 return true;
             }
 
@@ -997,8 +1000,8 @@
             //  216 response which does not require an overall
             //  content-length header
             //
-            writeHeaders(response,content,-1);
-            String mimetype=(content==null?null:content.getContentType());
+            putHeaders(response,content,-1);
+            String mimetype=(content==null?null:content.getContentTypeValue());
             if (mimetype==null)
                 LOG.warn("Unknown mimetype for "+request.getRequestURI());
             MultiPartOutputStream multi = new MultiPartOutputStream(out);
@@ -1016,7 +1019,7 @@
                 ctp = "multipart/byteranges; boundary=";
             response.setContentType(ctp+multi.getBoundary());
 
-            InputStream in=resource.getInputStream();
+            InputStream in=content.getResource().getInputStream();
             long pos=0;
 
             // calculate the content-length
@@ -1050,7 +1053,7 @@
                     if (start<pos)
                     {
                         in.close();
-                        in=resource.getInputStream();
+                        in=content.getResource().getInputStream();
                         pos=0;
                     }
                     if (pos<start)
@@ -1064,7 +1067,7 @@
                 }
                 else
                     // Handle cached resource
-                    (resource).writeTo(multi,start,size);
+                    content.getResource().writeTo(multi,start,size);
             }
             if (in!=null)
                 in.close();
@@ -1074,83 +1077,31 @@
     }
 
     /* ------------------------------------------------------------ */
-    protected void writeHeaders(HttpServletResponse response,HttpContent content,long count)
+    protected void putHeaders(HttpServletResponse response,HttpContent content, long contentLength)
     {
-        if (content == null)
-        {
-            // No content, then no headers to process
-            // This is possible during bypass write because of wrapping
-            // See .sendData() for more details.
-            return;
-        }
-        
-        if (content.getContentType()!=null && response.getContentType()==null)
-            response.setContentType(content.getContentType().toString());
-
         if (response instanceof Response)
         {
-            Response r=(Response)response;
-            HttpFields fields = r.getHttpFields();
+            Response r = (Response)response;
+            r.putHeaders(content,contentLength,_etags);
+            HttpFields f = r.getHttpFields();
+            if (_acceptRanges)
+                f.put(ACCEPT_RANGES);
 
-            if (content.getLastModified()!=null)
-                fields.put(HttpHeader.LAST_MODIFIED,content.getLastModified());
-            else if (content.getResource()!=null)
-            {
-                long lml=content.getResource().lastModified();
-                if (lml!=-1)
-                    fields.putDateField(HttpHeader.LAST_MODIFIED,lml);
-            }
-
-            if (count != -1)
-                r.setLongContentLength(count);
-
-            writeOptionHeaders(fields);
-            
-            if (_etags)
-                fields.put(HttpHeader.ETAG,content.getETag());
+            if (_cacheControl!=null)
+                f.put(_cacheControl);
         }
         else
         {
-            long lml=content.getResource().lastModified();
-            if (lml>=0)
-                response.setDateHeader(HttpHeader.LAST_MODIFIED.asString(),lml);
+            Response.putHeaders(response,content,contentLength,_etags);
+            if (_acceptRanges)
+                response.setHeader(ACCEPT_RANGES.getName(),ACCEPT_RANGES.getValue());
 
-            if (count != -1)
-            {
-                if (count<Integer.MAX_VALUE)
-                    response.setContentLength((int)count);
-                else
-                    response.setHeader(HttpHeader.CONTENT_LENGTH.asString(),Long.toString(count));
-            }
-
-            writeOptionHeaders(response);
-
-            if (_etags)
-                response.setHeader(HttpHeader.ETAG.asString(),content.getETag());
+            if (_cacheControl!=null)
+                response.setHeader(_cacheControl.getName(),_cacheControl.getValue());
         }
     }
 
     /* ------------------------------------------------------------ */
-    protected void writeOptionHeaders(HttpFields fields)
-    {
-        if (_acceptRanges)
-            fields.put(ACCEPT_RANGES);
-
-        if (_cacheControl!=null)
-            fields.put(_cacheControl);
-    }
-
-    /* ------------------------------------------------------------ */
-    protected void writeOptionHeaders(HttpServletResponse response)
-    {
-        if (_acceptRanges)
-            response.setHeader(HttpHeader.ACCEPT_RANGES.asString(),"bytes");
-
-        if (_cacheControl!=null)
-            response.setHeader(HttpHeader.CACHE_CONTROL.asString(),_cacheControl.getValue());
-    }
-
-    /* ------------------------------------------------------------ */
     /*
      * @see javax.servlet.Servlet#destroy()
      */
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/FilterHolder.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/FilterHolder.java
index a11f0bc..29b1b31 100644
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/FilterHolder.java
+++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/FilterHolder.java
@@ -37,10 +37,6 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
-/* --------------------------------------------------------------------- */
-/**
- *
- */
 public class FilterHolder extends Holder<Filter>
 {
     private static final Logger LOG = Log.getLogger(FilterHolder.class);
@@ -61,6 +57,7 @@
 
     /* ---------------------------------------------------------------- */
     /** Constructor
+     * @param source the holder source
      */
     public FilterHolder(Holder.Source source)
     {
@@ -69,6 +66,7 @@
 
     /* ---------------------------------------------------------------- */
     /** Constructor
+     * @param filter the filter class
      */
     public FilterHolder(Class<? extends Filter> filter)
     {
@@ -78,6 +76,7 @@
 
     /* ---------------------------------------------------------------- */
     /** Constructor for existing filter.
+     * @param filter the filter
      */
     public FilterHolder(Filter filter)
     {
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/FilterMapping.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/FilterMapping.java
index 90aa721..8978185 100644
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/FilterMapping.java
+++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/FilterMapping.java
@@ -45,6 +45,8 @@
 
     /* ------------------------------------------------------------ */
     /** Dispatch type from name
+     * @param type the type name
+     * @return the dispatcher type
      */
     public static DispatcherType dispatch(String type)
     {
@@ -63,6 +65,8 @@
 
     /* ------------------------------------------------------------ */
     /** Dispatch type from name
+     * @param type the dispatcher type
+     * @return the type constant ({@link #REQUEST}, {@link #ASYNC}, {@link #FORWARD}, {@link #INCLUDE}, or {@link #ERROR})
      */
     public static int dispatch(DispatcherType type)
     {
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/Holder.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/Holder.java
index 27c53d0..6e39ef1 100644
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/Holder.java
+++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/Holder.java
@@ -42,7 +42,7 @@
  * 
  * Specialization of AbstractHolder for servlet-related classes that 
  * have init-params etc
- * 
+ * @param <T> the type of holder
  */
 @ManagedObject("Holder - a container for servlets and the like")
 public class Holder<T> extends BaseHolder<T>
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/Invoker.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/Invoker.java
index 999a086..ec87f24 100644
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/Invoker.java
+++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/Invoker.java
@@ -34,7 +34,6 @@
 
 import org.eclipse.jetty.server.Dispatcher;
 import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.HttpChannel;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.server.handler.HandlerWrapper;
@@ -227,7 +226,7 @@
 
         if (holder!=null)
         {
-            final Request baseRequest=(request instanceof Request)?((Request)request):HttpChannel.getCurrentHttpChannel().getRequest();
+            final Request baseRequest=Request.getBaseRequest(request);
             holder.handle(baseRequest,
                     new InvokedRequest(request,included,servlet,servlet_path,path_info),
                           response);
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletContextHandler.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletContextHandler.java
index a96df98..f79803c 100644
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletContextHandler.java
+++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletContextHandler.java
@@ -35,6 +35,7 @@
 import javax.servlet.FilterRegistration;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
@@ -57,21 +58,24 @@
 import org.eclipse.jetty.server.handler.ErrorHandler;
 import org.eclipse.jetty.server.handler.HandlerCollection;
 import org.eclipse.jetty.server.handler.HandlerWrapper;
+import org.eclipse.jetty.server.handler.gzip.GzipHandler;
 import org.eclipse.jetty.server.session.SessionHandler;
 import org.eclipse.jetty.servlet.BaseHolder.Source;
+import org.eclipse.jetty.util.DecoratedObjectFactory;
 import org.eclipse.jetty.util.annotation.ManagedAttribute;
 import org.eclipse.jetty.util.annotation.ManagedObject;
 import org.eclipse.jetty.util.component.LifeCycle;
 
-
-/* ------------------------------------------------------------ */
-/** Servlet Context.
+/** 
+ * Servlet Context.
+ * <p>
  * This extension to the ContextHandler allows for
  * simple construction of a context with ServletHandler and optionally
- * session and security handlers, et.<pre>
+ * session and security handlers, et.
+ * <pre>
  *   new ServletContext("/context",Context.SESSIONS|Context.NO_SECURITY);
  * </pre>
- * <p/>
+ * <p>
  * This class should have been called ServletContext, but this would have
  * cause confusion with {@link ServletContext}.
  */
@@ -80,16 +84,18 @@
 {
     public final static int SESSIONS=1;
     public final static int SECURITY=2;
+    public final static int GZIP=4;
     public final static int NO_SESSIONS=0;
     public final static int NO_SECURITY=0;
     
     public interface ServletContainerInitializerCaller extends LifeCycle {};
 
-    protected final List<Decorator> _decorators= new ArrayList<>();
+    protected final DecoratedObjectFactory _objFactory = new DecoratedObjectFactory();
     protected Class<? extends SecurityHandler> _defaultSecurityHandlerClass=org.eclipse.jetty.security.ConstraintSecurityHandler.class;
     protected SessionHandler _sessionHandler;
     protected SecurityHandler _securityHandler;
     protected ServletHandler _servletHandler;
+    protected GzipHandler _gzipHandler;
     protected int _options;
     protected JspConfigDescriptor _jspConfig;
 
@@ -135,6 +141,7 @@
         this(parent,contextPath,sessionHandler,securityHandler,servletHandler,errorHandler,0);
     }
     
+    /* ------------------------------------------------------------ */
     public ServletContextHandler(HandlerContainer parent, String contextPath, SessionHandler sessionHandler, SecurityHandler securityHandler, ServletHandler servletHandler, ErrorHandler errorHandler,int options)
     {
         super((ContextHandler.Context)null);
@@ -166,43 +173,90 @@
     {
         HandlerWrapper handler=this;
         
-        // Skip any injected handlers
-        while (handler.getHandler() instanceof HandlerWrapper)
-        {
-            HandlerWrapper wrapper = (HandlerWrapper)handler.getHandler();
-            if (wrapper instanceof SessionHandler ||
-                wrapper instanceof SecurityHandler ||
-                wrapper instanceof ServletHandler)
-                break;
-            handler=wrapper;
-        }
-        
+        // link session handler
         if (getSessionHandler()!=null)
         {
-            if (handler==this)
-                super.setHandler(_sessionHandler);
-            else
-                handler.setHandler(_sessionHandler);
+            
+            while (!(handler.getHandler() instanceof SessionHandler) && 
+                   !(handler.getHandler() instanceof SecurityHandler) && 
+                   !(handler.getHandler() instanceof GzipHandler) && 
+                   !(handler.getHandler() instanceof ServletHandler) && 
+                   handler.getHandler() instanceof HandlerWrapper)
+                handler=(HandlerWrapper)handler.getHandler();
+            
+            if (handler.getHandler()!=_sessionHandler)
+            {
+                if (handler== this)
+                    super.setHandler(_sessionHandler);
+                else
+                    handler.setHandler(_sessionHandler);
+            }
             handler=_sessionHandler;
         }
-
+        
+        // link security handler
         if (getSecurityHandler()!=null)
         {
-            if (handler==this)
-                super.setHandler(_securityHandler);
-            else
-                handler.setHandler(_securityHandler);
+            while (!(handler.getHandler() instanceof SecurityHandler) && 
+                   !(handler.getHandler() instanceof GzipHandler) && 
+                   !(handler.getHandler() instanceof ServletHandler) && 
+                   handler.getHandler() instanceof HandlerWrapper)
+                handler=(HandlerWrapper)handler.getHandler();
+
+            if (handler.getHandler()!=_securityHandler)
+            {
+                if (handler== this)
+                    super.setHandler(_securityHandler);
+                else
+                    handler.setHandler(_securityHandler);
+            }
             handler=_securityHandler;
         }
 
+        // link gzip handler
+        if (getGzipHandler()!=null)
+        {
+            while (!(handler.getHandler() instanceof GzipHandler) && 
+                   !(handler.getHandler() instanceof ServletHandler) && 
+                   handler.getHandler() instanceof HandlerWrapper)
+                handler=(HandlerWrapper)handler.getHandler();
+
+            if (handler.getHandler()!=_gzipHandler)
+            {
+                if (handler== this)
+                    super.setHandler(_gzipHandler);
+                else
+                    handler.setHandler(_gzipHandler);
+            }
+            handler=_gzipHandler;
+        }
+
+        
+        // link servlet handler
         if (getServletHandler()!=null)
         {
-            if (handler==this)
-                super.setHandler(_servletHandler);
-            else
-                handler.setHandler(_servletHandler);
+            while (!(handler.getHandler() instanceof ServletHandler) && 
+                   handler.getHandler() instanceof HandlerWrapper)
+                handler=(HandlerWrapper)handler.getHandler();
+
+            if (handler.getHandler()!=_servletHandler)
+            {
+                if (handler== this)
+                    super.setHandler(_servletHandler);
+                else
+                    handler.setHandler(_servletHandler);
+            }
             handler=_servletHandler;
-        } 
+        }
+        
+    }
+    
+    /* ------------------------------------------------------------ */
+    @Override
+    protected void doStart() throws Exception
+    {
+        getServletContext().setAttribute(DecoratedObjectFactory.ATTR, _objFactory);
+        super.doStart();
     }
     
     /* ------------------------------------------------------------ */
@@ -213,8 +267,7 @@
     protected void doStop() throws Exception
     {
         super.doStop();
-        if (_decorators != null)
-            _decorators.clear();
+        _objFactory.clear();
     }
 
     /* ------------------------------------------------------------ */
@@ -275,18 +328,13 @@
 
         if (_servletHandler != null)
         {
-            //Call decorators on all holders, and also on any EventListeners before
-            //decorators are called on any other classes (like servlets and filters)
-            for (int i=_decorators.size()-1;i>=0; i--)
+            // Call decorators on all holders, and also on any EventListeners before
+            // decorators are called on any other classes (like servlets and filters)
+            if(_servletHandler.getListeners() != null)
             {
-                Decorator decorator = _decorators.get(i);
-                //Do any decorations on the ListenerHolders AND the listener instances first up
-                if (_servletHandler.getListeners()!=null)
-                {
-                    for (ListenerHolder holder:_servletHandler.getListeners())
-                    {             
-                        decorator.decorate(holder.getListener());
-                    }
+                for (ListenerHolder holder:_servletHandler.getListeners())
+                {             
+                    _objFactory.decorate(holder.getListener());
                 }
             }
         }
@@ -297,6 +345,13 @@
         if (_servletHandler != null)
             _servletHandler.initialize();
     }
+    
+    /* ------------------------------------------------------------ */
+    @Override
+    protected void stopContext() throws Exception
+    {
+        super.stopContext();
+    }
 
     /* ------------------------------------------------------------ */
     /**
@@ -336,7 +391,22 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** conveniance method to add a servlet.
+    /**
+     * @return Returns the gzipHandler.
+     */
+    @ManagedAttribute(value="context gzip handler", readonly=true)
+    public GzipHandler getGzipHandler()
+    {
+        if (_gzipHandler==null && (_options&GZIP)!=0 && !isStarted())
+            _gzipHandler=new GzipHandler();
+        return _gzipHandler;
+    }
+    
+    /* ------------------------------------------------------------ */
+    /** Convenience method to add a servlet.
+     * @param className the servlet class name
+     * @param pathSpec the path spec to map servlet to
+     * @return the ServletHolder for the added servlet
      */
     public ServletHolder addServlet(String className,String pathSpec)
     {
@@ -344,7 +414,10 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** conveniance method to add a servlet.
+    /** Convenience method to add a servlet.
+     * @param servlet the servlet class
+     * @param pathSpec the path spec to map servlet to
+     * @return the ServletHolder for the added servlet
      */
     public ServletHolder addServlet(Class<? extends Servlet> servlet,String pathSpec)
     {
@@ -352,7 +425,9 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** conveniance method to add a servlet.
+    /** Convenience method to add a servlet.
+     * @param servlet the servlet holder
+     * @param pathSpec the path spec
      */
     public void addServlet(ServletHolder servlet,String pathSpec)
     {
@@ -360,7 +435,10 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** conveniance method to add a filter
+    /** Convenience method to add a filter
+     * @param holder the filter holder
+     * @param pathSpec the path spec
+     * @param dispatches the dispatcher types for this filter
      */
     public void addFilter(FilterHolder holder,String pathSpec,EnumSet<DispatcherType> dispatches)
     {
@@ -368,7 +446,11 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** convenience method to add a filter
+    /** Convenience method to add a filter
+     * @param filterClass the filter class
+     * @param pathSpec the path spec
+     * @param dispatches the dispatcher types for this filter
+     * @return the FilterHolder that was created
      */
     public FilterHolder addFilter(Class<? extends Filter> filterClass,String pathSpec,EnumSet<DispatcherType> dispatches)
     {
@@ -376,7 +458,11 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** convenience method to add a filter
+    /** Convenience method to add a filter
+     * @param filterClass the filter class name 
+     * @param pathSpec the path spec
+     * @param dispatches the dispatcher types for this filter
+     * @return the FilterHolder that was created
      */
     public FilterHolder addFilter(String filterClass,String pathSpec,EnumSet<DispatcherType> dispatches)
     {
@@ -457,6 +543,23 @@
         super.callContextDestroyed(l, e);
     }
 
+    private boolean replaceHandler(Handler handler,Handler replace)
+    {
+        HandlerWrapper wrapper=this;
+        while(true)
+        {
+            if (wrapper.getHandler()==handler)
+            {
+                wrapper.setHandler(replace);
+                return true;
+            }
+            
+            if (!(wrapper.getHandler() instanceof HandlerWrapper))
+                return false;
+            wrapper = (HandlerWrapper)wrapper.getHandler();
+        }
+    }
+    
     /* ------------------------------------------------------------ */
     /**
      * @param sessionHandler The sessionHandler to set.
@@ -466,10 +569,17 @@
         if (isStarted())
             throw new IllegalStateException("STARTED");
 
+        Handler next=null;
         if (_sessionHandler!=null)
+        {
+            next=_sessionHandler.getHandler();
             _sessionHandler.setHandler(null);
+            replaceHandler(_sessionHandler,sessionHandler);
+        }
 
         _sessionHandler = sessionHandler;
+        if (next!=null && _sessionHandler.getHandler()==null)
+            _sessionHandler.setHandler(next);
         relinkHandlers();
     }
 
@@ -482,12 +592,44 @@
         if (isStarted())
             throw new IllegalStateException("STARTED");
 
+        Handler next=null;
         if (_securityHandler!=null)
+        {
+            next=_securityHandler.getHandler();
             _securityHandler.setHandler(null);
+            replaceHandler(_securityHandler,securityHandler);
+        }
+        
         _securityHandler = securityHandler;
+        if (next!=null && _securityHandler.getHandler()==null)
+            _securityHandler.setHandler(next);
         relinkHandlers();
     }
 
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @param gzipHandler The {@link GzipHandler} to set on this context.
+     */
+    public void setGzipHandler(GzipHandler gzipHandler)
+    {
+        if (isStarted())
+            throw new IllegalStateException("STARTED");
+
+        Handler next=null;
+        if (_gzipHandler!=null)
+        {
+            next=_gzipHandler.getHandler();
+            _gzipHandler.setHandler(null);
+            replaceHandler(_gzipHandler,gzipHandler);
+        }
+        
+        _gzipHandler = gzipHandler;
+        if (next!=null && _gzipHandler.getHandler()==null)
+            _gzipHandler.setHandler(next);
+        relinkHandlers();
+    }
+    
     /* ------------------------------------------------------------ */
     /**
      * @param servletHandler The servletHandler to set.
@@ -502,29 +644,12 @@
         {
             next=_servletHandler.getHandler();
             _servletHandler.setHandler(null);
+            replaceHandler(_servletHandler,servletHandler);
         }
         _servletHandler = servletHandler;
+        if (next!=null && _servletHandler.getHandler()==null)
+            _servletHandler.setHandler(next);
         relinkHandlers();
-        _servletHandler.setHandler(next);
-    }
-    
-    /* ------------------------------------------------------------ */
-    @Override
-    public void setHandler(Handler handler)
-    {
-        if (handler instanceof ServletHandler)
-            setServletHandler((ServletHandler) handler);
-        else if (handler instanceof SessionHandler)
-            setSessionHandler((SessionHandler) handler);
-        else if (handler instanceof SecurityHandler)
-            setSecurityHandler((SecurityHandler)handler);
-        else if (handler == null || handler instanceof HandlerWrapper)
-        {
-            super.setHandler(handler);
-            relinkHandlers();
-        }
-        else
-            throw new IllegalArgumentException();
     }
     
     
@@ -551,47 +676,66 @@
         h.setHandler(handler);
         relinkHandlers();
     }
-
+    
     /* ------------------------------------------------------------ */
     /**
-     * @return The decorator list used to resource inject new Filters, Servlets and EventListeners
+     * The DecoratedObjectFactory for use by IoC containers (weld / spring / etc)
+     * 
+     * @return The DecoratedObjectFactory
      */
-    public List<Decorator> getDecorators()
+    public DecoratedObjectFactory getObjectFactory()
     {
-        return Collections.unmodifiableList(_decorators);
+        return _objFactory;
     }
 
     /* ------------------------------------------------------------ */
     /**
-     * @param decorators The lis of {@link Decorator}s
+     * @return The decorator list used to resource inject new Filters, Servlets and EventListeners
+     * @deprecated use the {@link DecoratedObjectFactory} from getAttribute("org.eclipse.jetty.util.DecoratedObjectFactory") or {@link #getObjectFactory()} instead
      */
+    @Deprecated
+    public List<Decorator> getDecorators()
+    {
+        List<Decorator> ret = new ArrayList<ServletContextHandler.Decorator>();
+        for (org.eclipse.jetty.util.Decorator decorator : _objFactory)
+        {
+            ret.add(new LegacyDecorator(decorator));
+        }
+        return Collections.unmodifiableList(ret);
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @param decorators The list of {@link Decorator}s
+     * @deprecated use the {@link DecoratedObjectFactory} from getAttribute("org.eclipse.jetty.util.DecoratedObjectFactory") or {@link #getObjectFactory()} instead
+     */
+    @Deprecated
     public void setDecorators(List<Decorator> decorators)
     {
-        _decorators.clear();
-        _decorators.addAll(decorators);
+        _objFactory.setDecorators(decorators);
     }
 
     /* ------------------------------------------------------------ */
     /**
      * @param decorator The decorator to add
+     * @deprecated use the {@link DecoratedObjectFactory} from getAttribute("org.eclipse.jetty.util.DecoratedObjectFactory") or {@link #getObjectFactory()} instead
      */
+    @Deprecated
     public void addDecorator(Decorator decorator)
     {
-        _decorators.add(decorator);
+        _objFactory.addDecorator(decorator);
     }
-
+    
     /* ------------------------------------------------------------ */
     void destroyServlet(Servlet servlet)
     {
-        for (Decorator decorator : _decorators)
-            decorator.destroy(servlet);
+        _objFactory.destroy(servlet);
     }
 
     /* ------------------------------------------------------------ */
     void destroyFilter(Filter filter)
     {
-        for (Decorator decorator : _decorators)
-            decorator.destroy(filter);
+        _objFactory.destroy(filter);
     }
 
     /* ------------------------------------------------------------ */
@@ -1144,11 +1288,7 @@
             try
             {
                 T f = createInstance(c);
-                for (int i=_decorators.size()-1; i>=0; i--)
-                {
-                    Decorator decorator = _decorators.get(i);
-                    f=decorator.decorate(f);
-                }
+                f = _objFactory.decorate(f);
                 return f;
             }
             catch (Exception e)
@@ -1164,11 +1304,7 @@
             try
             {
                 T s = createInstance(c);
-                for (int i=_decorators.size()-1; i>=0; i--)
-                {
-                    Decorator decorator = _decorators.get(i);
-                    s=decorator.decorate(s);
-                }
+                s = _objFactory.decorate(s);
                 return s;
             }
             catch (Exception e)
@@ -1311,11 +1447,7 @@
             try
             {
                 T l = createInstance(clazz);
-                for (int i=_decorators.size()-1; i>=0; i--)
-                {
-                    Decorator decorator = _decorators.get(i);
-                    l=decorator.decorate(l);
-                }
+                l = _objFactory.decorate(l);
                 return l;
             }            
             catch (Exception e)
@@ -1355,11 +1487,39 @@
 
 
     /* ------------------------------------------------------------ */
-    /** Interface to decorate loaded classes.
+    /** 
+     * Legacy Interface to decorate loaded classes.
+     * <p>
+     * Left for backwards compatibility with Weld / CDI
+     * @deprecated use new {@link org.eclipse.jetty.util.Decorator} 
      */
-    public interface Decorator
+    @Deprecated
+    public interface Decorator extends org.eclipse.jetty.util.Decorator
     {
-        <T> T decorate (T o);
-        void destroy (Object o);
+    }
+    
+    /**
+     * Implementation of the legacy interface to decorate loaded classes.
+     */
+    private static class LegacyDecorator implements Decorator
+    {
+        private org.eclipse.jetty.util.Decorator decorator;
+        
+        public LegacyDecorator(org.eclipse.jetty.util.Decorator decorator)
+        {
+            this.decorator = decorator;
+        }
+
+        @Override
+        public <T> T decorate(T o)
+        {
+            return decorator.decorate(o);
+        }
+
+        @Override
+        public void destroy(Object o)
+        {
+            decorator.destroy(o);
+        }
     }
 }
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java
index c3b152c..45866be 100644
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java
+++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java
@@ -57,7 +57,6 @@
 import org.eclipse.jetty.io.RuntimeIOException;
 import org.eclipse.jetty.security.IdentityService;
 import org.eclipse.jetty.security.SecurityHandler;
-import org.eclipse.jetty.server.HttpChannel;
 import org.eclipse.jetty.server.QuietServletException;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.ServletRequestHttpWrapper;
@@ -77,8 +76,9 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
-/* --------------------------------------------------------------------- */
-/** Servlet HttpHandler.
+/** 
+ * Servlet HttpHandler.
+ * <p>
  * This handler maps requests to servlets that implement the
  * javax.servlet.http.HttpServlet API.
  * <P>
@@ -89,10 +89,6 @@
  * Unless run as part of a {@link ServletContextHandler} or derivative, the {@link #initialize()}
  * method must be called manually after start().
  */
-
-/* ------------------------------------------------------------ */
-/**
- */
 @ManagedObject("Servlet Handler")
 public class ServletHandler extends ScopedHandler
 {
@@ -146,7 +142,7 @@
         throws Exception
     {
         ContextHandler.Context context=ContextHandler.getCurrentContext();
-        _servletContext=context==null?new ContextHandler.NoContext():context;
+        _servletContext=context==null?new ContextHandler.StaticContext():context;
         _contextHandler=(ServletContextHandler)(context==null?null:context.getContextHandler());
 
         if (_contextHandler!=null)
@@ -410,8 +406,8 @@
     /**
      * Get the ServletMapping matching the path
      * 
-     * @param pathSpec
-     * @return
+     * @param pathSpec the path spec
+     * @return the servlet mapping for the path spec (or null if not found)
      */
     public ServletMapping getServletMapping(String pathSpec)
     {
@@ -593,11 +589,18 @@
         }
         catch(RuntimeIOException e)
         {
+            if (e.getCause() instanceof IOException)
+            {
+                LOG.debug(e);
+                throw (IOException)e.getCause();
+            }
             throw e;
         }
         catch(Exception e)
         {
-            if (!(DispatcherType.REQUEST.equals(type) || DispatcherType.ASYNC.equals(type)))
+            //TODO, can we let all error handling fall through to HttpChannel?
+            
+            if (baseRequest.isAsyncStarted() || !(DispatcherType.REQUEST.equals(type) || DispatcherType.ASYNC.equals(type)))
             {
                 if (e instanceof IOException)
                     throw (IOException)e;
@@ -835,6 +838,7 @@
 
     /* ------------------------------------------------------------ */
     /** Initialize filters and load-on-startup servlets.
+     * @throws Exception if unable to initialize
      */
     public void initialize()
         throws Exception
@@ -909,7 +913,7 @@
     
     /* ------------------------------------------------------------ */
     /** Add a holder for a listener
-     * @param filter
+     * @param listener the listener for the holder
      */
     public void addListener (ListenerHolder listener)
     {
@@ -943,7 +947,9 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * see also newServletHolder(Class)
+     * Add a new servlet holder
+     * @param source the holder source
+     * @return the servlet holder
      */
     public ServletHolder newServletHolder(Holder.Source source)
     {
@@ -952,6 +958,8 @@
 
     /* ------------------------------------------------------------ */
     /** Convenience method to add a servlet.
+     * @param className the class name
+     * @param pathSpec the path spec
      * @return The servlet holder.
      */
     public ServletHolder addServletWithMapping (String className,String pathSpec)
@@ -963,7 +971,9 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** conveniance method to add a servlet.
+    /** Convenience method to add a servlet.
+     * @param servlet the servlet class
+     * @param pathSpec the path spec
      * @return The servlet holder.
      */
     public ServletHolder addServletWithMapping (Class<? extends Servlet> servlet,String pathSpec)
@@ -976,7 +986,7 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** conveniance method to add a servlet.
+    /** Convenience method to add a servlet.
      * @param servlet servlet holder to add
      * @param pathSpec servlet mappings for the servletHolder
      */
@@ -1006,8 +1016,9 @@
 
 
     /* ------------------------------------------------------------ */
-    /**Convenience method to add a pre-constructed ServletHolder.
-     * @param holder
+    /**
+     * Convenience method to add a pre-constructed ServletHolder.
+     * @param holder the servlet holder
      */
     public void addServlet(ServletHolder holder)
     {
@@ -1015,8 +1026,9 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** Convenience method to add a pre-constructed ServletMapping.
-     * @param mapping
+    /** 
+     * Convenience method to add a pre-constructed ServletMapping.
+     * @param mapping the servlet mapping
      */
     public void addServletMapping (ServletMapping mapping)
     {
@@ -1182,13 +1194,15 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** Convenience method to add a filter with a mapping
-     * @param className
-     * @param pathSpec
-     * @param dispatches
+    /** 
+     * Convenience method to add a filter with a mapping
+     * @param className the filter class name
+     * @param pathSpec the path spec
+     * @param dispatches the dispatcher types for this filter
      * @return the filter holder created
      * @deprecated use {@link #addFilterWithMapping(Class, String, EnumSet)} instead
      */
+    @Deprecated
     public FilterHolder addFilter (String className,String pathSpec,EnumSet<DispatcherType> dispatches)
     {
         return addFilterWithMapping(className, pathSpec, dispatches);
@@ -1196,9 +1210,9 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * convenience method to add a filter and mapping
-     * @param filter
-     * @param filterMapping
+     * Convenience method to add a filter and mapping
+     * @param filter the filter holder
+     * @param filterMapping the filter mapping
      */
     public void addFilter (FilterHolder filter, FilterMapping filterMapping)
     {
@@ -1209,8 +1223,9 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** Convenience method to add a preconstructed FilterHolder
-     * @param filter
+    /** 
+     * Convenience method to add a preconstructed FilterHolder
+     * @param filter the filter holder
      */
     public void addFilter (FilterHolder filter)
     {
@@ -1219,8 +1234,9 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** Convenience method to add a preconstructed FilterMapping
-     * @param mapping
+    /** 
+     * Convenience method to add a preconstructed FilterMapping
+     * @param mapping the filter mapping
      */
     public void addFilterMapping (FilterMapping mapping)
     {
@@ -1263,15 +1279,15 @@
     
 
     /* ------------------------------------------------------------ */
-    /** Convenience method to add a preconstructed FilterMapping
-     * @param mapping
+    /** 
+     * Convenience method to add a preconstructed FilterMapping
+     * @param mapping the filter mapping
      */
     public void prependFilterMapping (FilterMapping mapping)
     {
         if (mapping != null)
         {
-            Source source = mapping.getFilterHolder().getSource();
-            
+            Source source = (mapping.getFilterHolder()==null?null:mapping.getFilterHolder().getSource());
             FilterMapping[] mappings = getFilterMappings();
             if (mappings==null || mappings.length==0)
             {
@@ -1322,7 +1338,7 @@
      * @param mapping the FilterMapping to add
      * @param pos the position in the existing arry at which to add it
      * @param before if true, insert before  pos, if false insert after it
-     * @return
+     * @return the new FilterMappings post-insert
      */
     protected FilterMapping[] insertFilterMapping (FilterMapping mapping, int pos, boolean before)
     {
@@ -1632,7 +1648,7 @@
         public void doFilter(ServletRequest request, ServletResponse response)
             throws IOException, ServletException
         {
-            final Request baseRequest=(request instanceof Request)?((Request)request):HttpChannel.getCurrentHttpChannel().getRequest();
+            final Request baseRequest=Request.getBaseRequest(request);
 
             // pass to next filter
             if (_filterHolder!=null)
@@ -1734,7 +1750,7 @@
             // Call servlet
             HttpServletRequest srequest = (HttpServletRequest)request;
             if (_servletHolder == null)
-                notFound((request instanceof Request)?((Request)request):HttpChannel.getCurrentHttpChannel().getRequest(), srequest, (HttpServletResponse)response);
+                notFound(Request.getBaseRequest(request), srequest, (HttpServletResponse)response);
             else
             {
                 if (LOG.isDebugEnabled())
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java
index 7c30234..1ae25d8 100644
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java
+++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java
@@ -33,6 +33,7 @@
 import java.util.Stack;
 
 import javax.servlet.MultipartConfigElement;
+import javax.servlet.RequestDispatcher;
 import javax.servlet.Servlet;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletContext;
@@ -46,6 +47,7 @@
 
 import org.eclipse.jetty.security.IdentityService;
 import org.eclipse.jetty.security.RunAsToken;
+import org.eclipse.jetty.server.MultiPartCleanerListener;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.UserIdentity;
 import org.eclipse.jetty.server.handler.ContextHandler;
@@ -55,17 +57,13 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
-
-
-
-/* --------------------------------------------------------------------- */
-/** Servlet Instance and Context Holder.
+/**
+ * Servlet Instance and Context Holder.
+ * <p>
  * Holds the name, params and some state of a javax.servlet.Servlet
  * instance. It implements the ServletConfig interface.
  * This class will organise the loading of the servlet when needed or
  * requested.
- *
- *
  */
 @ManagedObject("Servlet Holder")
 public class ServletHolder extends Holder<Servlet> implements UserIdentity.Scope, Comparable<ServletHolder>
@@ -90,11 +88,11 @@
     private transient boolean _enabled = true;
     private transient UnavailableException _unavailableEx;
 
-    public static final String GLASSFISH_SENTINEL_CLASS = "org.glassfish.jsp.api.ResourceInjector";
+
     public static final String APACHE_SENTINEL_CLASS = "org.apache.tomcat.InstanceManager";
     public static final  String JSP_GENERATED_PACKAGE_NAME = "org.eclipse.jetty.servlet.jspPackagePrefix";
     public static final Map<String,String> NO_MAPPED_ROLES = Collections.emptyMap();
-    public static enum JspContainer {GLASSFISH, APACHE, OTHER}; 
+    public static enum JspContainer {APACHE, OTHER};
 
     /* ---------------------------------------------------------------- */
     /** Constructor .
@@ -106,6 +104,7 @@
 
     /* ---------------------------------------------------------------- */
     /** Constructor .
+     * @param creator the holder source
      */
     public ServletHolder(Holder.Source creator)
     {
@@ -114,6 +113,7 @@
 
     /* ---------------------------------------------------------------- */
     /** Constructor for existing servlet.
+     * @param servlet the servlet
      */
     public ServletHolder(Servlet servlet)
     {
@@ -123,6 +123,8 @@
 
     /* ---------------------------------------------------------------- */
     /** Constructor for servlet class.
+     * @param name the name of the servlet
+     * @param servlet the servlet class
      */
     public ServletHolder(String name, Class<? extends Servlet> servlet)
     {
@@ -133,6 +135,8 @@
 
     /* ---------------------------------------------------------------- */
     /** Constructor for servlet class.
+     * @param name the servlet name
+     * @param servlet the servlet
      */
     public ServletHolder(String name, Servlet servlet)
     {
@@ -143,6 +147,7 @@
 
     /* ---------------------------------------------------------------- */
     /** Constructor for servlet class.
+     * @param servlet the servlet class
      */
     public ServletHolder(Class<? extends Servlet> servlet)
     {
@@ -180,10 +185,13 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** Set the initialize order.
-     * Holders with order<0, are initialized on use. Those with
-     * order>=0 are initialized in increasing order when the handler
+    /**
+     * Set the initialize order.
+     * <p>
+     * Holders with order&lt;0, are initialized on use. Those with
+     * order&gt;=0 are initialized in increasing order when the handler
      * is started.
+     * @param order the servlet init order
      */
     public void setInitOrder(int order)
     {
@@ -192,7 +200,8 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** Comparitor by init order.
+    /**
+     * Comparator by init order.
      */
     @Override
     public int compareTo(ServletHolder sh)
@@ -280,7 +289,7 @@
         _enabled = enabled;
     }
 
-    
+
     /* ------------------------------------------------------------ */
     public void doStart()
         throws Exception
@@ -288,7 +297,7 @@
         _unavailable=0;
         if (!_enabled)
             return;
-        
+
         // Handle JSP file forced paths
         if (_forcedPath != null)
         {
@@ -305,7 +314,7 @@
                 setClassName(jsp.getClassName());
             }
             else
-            { 
+            {
                 if (getClassName() == null)
                 {
                     // Look for normal JSP servlet
@@ -326,12 +335,12 @@
                         //container does not support startup precompilation, it will be compiled at runtime when handling a request for this jsp.
                         //See also adaptForcedPathToJspContainer
                         setInitParameter("jspFile", _forcedPath);
-                    }                       
+                    }
                 }
             }
         }
-        
-        
+
+
         //check servlet has a class (ie is not a preliminary registration). If preliminary, fail startup.
         try
         {
@@ -380,8 +389,8 @@
             _servlet = new SingleThreadedWrapper();
 
     }
-    
-    
+
+
     /* ------------------------------------------------------------ */
     @Override
     public void initialize ()
@@ -406,8 +415,8 @@
         }
         _initialized = true;
     }
-    
-    
+
+
     /* ------------------------------------------------------------ */
     public void doStop()
         throws Exception
@@ -455,6 +464,7 @@
     /* ------------------------------------------------------------ */
     /** Get the servlet.
      * @return The servlet
+     * @throws ServletException if unable to init the servlet on first use
      */
     public synchronized Servlet getServlet()
         throws ServletException
@@ -485,7 +495,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Check to ensure class of servlet is acceptable.
-     * @throws UnavailableException
+     * @throws UnavailableException if Servlet class is not of type {@link javax.servlet.Servlet}
      */
     public void checkServletType ()
         throws UnavailableException
@@ -515,22 +525,22 @@
 
         return isStarted()&& _unavailable==0;
     }
-    
+
     /* ------------------------------------------------------------ */
     /**
      * Check if there is a javax.servlet.annotation.ServletSecurity
      * annotation on the servlet class. If there is, then we force
-     * it to be loaded on startup, because all of the security 
+     * it to be loaded on startup, because all of the security
      * constraints must be calculated as the container starts.
-     * 
+     *
      */
     private void checkInitOnStartup()
     {
         if (_class==null)
             return;
-        
+
         if ((_class.getAnnotation(javax.servlet.annotation.ServletSecurity.class) != null) && !_initOnStartup)
-            setInitOrder(Integer.MAX_VALUE);    
+            setInitOrder(Integer.MAX_VALUE);
     }
 
     /* ------------------------------------------------------------ */
@@ -588,8 +598,8 @@
                 _servlet=newInstance();
             if (_config==null)
                 _config=new Config();
-            
-          
+
+
 
             // Handle run as
             if (_identityService!=null)
@@ -647,18 +657,15 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * @throws Exception
+     * @throws Exception if unable to init the JSP Servlet
      */
     protected void initJspServlet () throws Exception
     {
         ContextHandler ch = ContextHandler.getContextHandler(getServletHandler().getServletContext());
-            
+
         /* Set the webapp's classpath for Jasper */
         ch.setAttribute("org.apache.catalina.jsp_classpath", ch.getClassPath());
 
-        /* Set the system classpath for Jasper */
-        setInitParameter("com.sun.appserv.jsp.classpath", Loader.getClassPath(ch.getClassLoader().getParent()));
-
         /* Set up other classpath attribute */
         if ("?".equals(getInitParameter("classpath")))
         {
@@ -668,7 +675,7 @@
             if (classpath != null)
                 setInitParameter("classpath", classpath);
         }
-        
+
         /* ensure scratch dir */
         File scratch = null;
         if (getInitParameter("scratchdir") == null)
@@ -677,7 +684,7 @@
             scratch = new File(tmp, "jsp");
             setInitParameter("scratchdir", scratch.getAbsolutePath());
         }
-     
+
         scratch = new File (getInitParameter("scratchdir"));
         if (!scratch.exists()) scratch.mkdir();
     }
@@ -686,8 +693,8 @@
     /**
      * Register a ServletRequestListener that will ensure tmp multipart
      * files are deleted when the request goes out of scope.
-     * 
-     * @throws Exception
+     *
+     * @throws Exception if unable to init the multipart
      */
     protected void initMultiPart () throws Exception
     {
@@ -699,7 +706,7 @@
             //servlet calling Request.getPart() or Request.getParts()
 
             ContextHandler ch = ContextHandler.getContextHandler(getServletHandler().getServletContext());
-            ch.addEventListener(new Request.MultiPartCleanerListener());
+            ch.addEventListener(MultiPartCleanerListener.INSTANCE);
         }
     }
 
@@ -735,16 +742,16 @@
     {
         _runAsRole = role;
     }
-    
+
     /* ------------------------------------------------------------ */
     /**
      * Prepare to service a request.
-     * 
-     * @param baseRequest
-     * @param request
-     * @param response
-     * @throws ServletException
-     * @throws UnavailableException
+     *
+     * @param baseRequest the base request
+     * @param request the request
+     * @param response the response
+     * @throws ServletException if unable to prepare the servlet
+     * @throws UnavailableException if not available
      */
     protected void prepare (Request baseRequest, ServletRequest request, ServletResponse response)
     throws ServletException, UnavailableException
@@ -754,7 +761,7 @@
         if (mpce != null)
             baseRequest.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, mpce);
     }
-    
+
     public synchronized Servlet ensureInstance()
     throws ServletException, UnavailableException
     {
@@ -766,19 +773,21 @@
         if (_unavailable!=0 || (!_initOnStartup && servlet==null))
             servlet=getServlet();
         if (servlet==null)
-            throw new UnavailableException("Could not instantiate "+_class);    
-        
+            throw new UnavailableException("Could not instantiate "+_class);
+
         return servlet;
     }
 
     /* ------------------------------------------------------------ */
-    /** Service a request with this servlet.
-     * @param baseRequest
-     * @param request
-     * @param response
-     * @throws ServletException
-     * @throws UnavailableException
-     * @throws IOException
+    /**
+     * Service a request with this servlet.
+     *
+     * @param baseRequest the base request
+     * @param request the request
+     * @param response the response
+     * @throws ServletException if unable to process the servlet
+     * @throws UnavailableException if servlet is unavailable
+     * @throws IOException if unable to process the request or response
      */
     public void handle(Request baseRequest,
                        ServletRequest request,
@@ -827,7 +836,7 @@
 
             // Handle error params.
             if (servlet_error)
-                request.setAttribute("javax.servlet.error.servlet_name",getName());
+                request.setAttribute(RequestDispatcher.ERROR_SERVLET_NAME,getName());
         }
     }
 
@@ -862,13 +871,7 @@
     /* ------------------------------------------------------------ */
     private void adaptForcedPathToJspContainer (ServletRequest request)
     {
-        if (_forcedPath != null && _jspContainer != null && JspContainer.GLASSFISH.equals(_jspContainer))
-        {
-            //if container is glassfish, set the request attribute org.apache.catalina.jsp_file to
-            //ensure the delegate jsp will be compiled
-
-            request.setAttribute("org.apache.catalina.jsp_file",_forcedPath);
-        }
+        //no-op for apache jsp
     }
 
     /* ------------------------------------------------------------ */
@@ -876,29 +879,17 @@
     {
         if (_jspContainer == null)
         {
-            //check for glassfish
             try
             {
-                //if container is glassfish, set the request attribute org.apache.catalina.jsp_file to
-                //ensure the delegate jsp will be compiled
-                Loader.loadClass(Holder.class, GLASSFISH_SENTINEL_CLASS);
-                if (LOG.isDebugEnabled())LOG.debug("Glassfish jasper detected");
-                _jspContainer = JspContainer.GLASSFISH;
+                //check for apache
+                Loader.loadClass(Holder.class, APACHE_SENTINEL_CLASS);
+                if (LOG.isDebugEnabled())LOG.debug("Apache jasper detected");
+                _jspContainer = JspContainer.APACHE;
             }
-            catch (ClassNotFoundException e)
+            catch (ClassNotFoundException x)
             {
-                try
-                {
-                    //check for apache
-                    Loader.loadClass(Holder.class, APACHE_SENTINEL_CLASS);
-                    if (LOG.isDebugEnabled())LOG.debug("Apache jasper detected");
-                    _jspContainer = JspContainer.APACHE;
-                }
-                catch (ClassNotFoundException x)
-                {
-                    if (LOG.isDebugEnabled())LOG.debug("Other jasper detected");
-                    _jspContainer = JspContainer.OTHER;
-                }
+                if (LOG.isDebugEnabled())LOG.debug("Other jasper detected");
+                _jspContainer = JspContainer.OTHER;
             }
         }
     }
@@ -908,7 +899,7 @@
     {
         if (jsp == null)
             return "";
-        
+
         int i = jsp.lastIndexOf('/') + 1;
         jsp = jsp.substring(i);
         try
@@ -926,14 +917,14 @@
             return tmp;
         }
     }
-    
-    
+
+
     /* ------------------------------------------------------------ */
     private String getPackageOfJspClass (String jsp)
     {
         if (jsp == null)
             return "";
-        
+
         int i = jsp.lastIndexOf('/');
         if (i <= 0)
             return "";
@@ -942,7 +933,7 @@
             Class<?> jspUtil = Loader.loadClass(Holder.class, "org.apache.jasper.compiler.JspUtil");
             Method makeJavaPackage = jspUtil.getMethod("makeJavaPackage", String.class);
             return (String)makeJavaPackage.invoke(null, jsp.substring(0,i));
-        } 
+        }
         catch (Exception e)
         {
             String tmp = jsp.substring(1).replace('/','.');
@@ -952,25 +943,25 @@
             return tmp;
         }
     }
-    
-    
+
+
     /* ------------------------------------------------------------ */
     private String getJspPackagePrefix ()
     {
         String jspPackageName = (String)getServletHandler().getServletContext().getInitParameter(JSP_GENERATED_PACKAGE_NAME );
         if (jspPackageName == null)
             jspPackageName = "org.apache.jsp";
-        
+
         return jspPackageName;
     }
-    
-    
+
+
     /* ------------------------------------------------------------ */
     private String getClassNameForJsp (String jsp)
     {
         if (jsp == null)
-            return null; 
-        
+            return null;
+
         return getJspPackagePrefix() + "." +getPackageOfJspClass(jsp) + "." + getNameOfJspClass(jsp);
     }
 
@@ -1194,9 +1185,9 @@
     /* ------------------------------------------------------------ */
     /**
      * @return the newly created Servlet instance
-     * @throws ServletException
-     * @throws IllegalAccessException
-     * @throws InstantiationException
+     * @throws ServletException if unable to create a new instance
+     * @throws IllegalAccessException if not allowed to create a new instance
+     * @throws InstantiationException if creating new instance resulted in error
      */
     protected Servlet newInstance() throws ServletException, IllegalAccessException, InstantiationException
     {
@@ -1217,7 +1208,7 @@
             throw se;
         }
     }
-    
+
 
     /* ------------------------------------------------------------ */
     @Override
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletMapping.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletMapping.java
index 9b257d2..bd1247f 100644
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletMapping.java
+++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletMapping.java
@@ -65,6 +65,25 @@
     {
         _pathSpecs = pathSpecs;
     }
+    
+    
+    /* ------------------------------------------------------------ */
+    /** Test if the list of path specs contains a particular one.
+     * @param pathSpec
+     * @return
+     */
+    public boolean containsPathSpec (String pathSpec)
+    {
+        if (_pathSpecs == null || _pathSpecs.length == 0)
+            return false;
+        
+        for (String p:_pathSpecs)
+        {
+            if (p.equals(pathSpec))
+                return true;
+        }
+        return false;
+    }
 
     /* ------------------------------------------------------------ */
     /**
@@ -86,9 +105,6 @@
     
     
     /* ------------------------------------------------------------ */
-    /**
-     * @return
-     */
     @ManagedAttribute(value="default", readonly=true)
     public boolean isDefault()
     {
@@ -97,9 +113,6 @@
     
     
     /* ------------------------------------------------------------ */
-    /**
-     * @param fromDefault
-     */
     public void setDefault(boolean fromDefault)
     {
         _default = fromDefault;
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletTester.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletTester.java
deleted file mode 100644
index be92e2d..0000000
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletTester.java
+++ /dev/null
@@ -1,259 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlet;
-
-import java.net.InetAddress;
-import java.nio.ByteBuffer;
-import java.util.EnumSet;
-import java.util.Enumeration;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-import javax.servlet.DispatcherType;
-import javax.servlet.Filter;
-import javax.servlet.Servlet;
-
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.LocalConnector;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.util.Attributes;
-import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.component.ContainerLifeCycle;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.util.resource.Resource;
-
-public class ServletTester extends ContainerLifeCycle
-{
-    private static final Logger LOG = Log.getLogger(ServletTester.class);
-    
-    private final Server _server=new Server();
-    private final LocalConnector _connector=new LocalConnector(_server);
-    private final ServletContextHandler _context;
-    
-    public Server getServer()
-    {
-        return _server;
-    }
-    
-    public LocalConnector getConnector()
-    {
-        return _connector;
-    }
-    
-    public void setVirtualHosts(String[] vhosts)
-    {
-        _context.setVirtualHosts(vhosts);
-    }
-
-    public void addVirtualHosts(String[] virtualHosts)
-    {
-        _context.addVirtualHosts(virtualHosts);
-    }
-
-    public ServletHolder addServlet(String className, String pathSpec)
-    {
-        return _context.addServlet(className,pathSpec);
-    }
-
-    public ServletHolder addServlet(Class<? extends Servlet> servlet, String pathSpec)
-    {
-        return _context.addServlet(servlet,pathSpec);
-    }
-
-    public void addServlet(ServletHolder servlet, String pathSpec)
-    {
-        _context.addServlet(servlet,pathSpec);
-    }
-
-    public void addFilter(FilterHolder holder, String pathSpec, EnumSet<DispatcherType> dispatches)
-    {
-        _context.addFilter(holder,pathSpec,dispatches);
-    }
-
-    public FilterHolder addFilter(Class<? extends Filter> filterClass, String pathSpec, EnumSet<DispatcherType> dispatches)
-    {
-        return _context.addFilter(filterClass,pathSpec,dispatches);
-    }
-
-    public FilterHolder addFilter(String filterClass, String pathSpec, EnumSet<DispatcherType> dispatches)
-    {
-        return _context.addFilter(filterClass,pathSpec,dispatches);
-    }
-
-    public Object getAttribute(String name)
-    {
-        return _context.getAttribute(name);
-    }
-
-    public Enumeration<String> getAttributeNames()
-    {
-        return _context.getAttributeNames();
-    }
-
-    public Attributes getAttributes()
-    {
-        return _context.getAttributes();
-    }
-
-    public String getContextPath()
-    {
-        return _context.getContextPath();
-    }
-
-    public String getInitParameter(String name)
-    {
-        return _context.getInitParameter(name);
-    }
-
-    public String setInitParameter(String name, String value)
-    {
-        return _context.setInitParameter(name,value);
-    }
-
-    public Enumeration<String> getInitParameterNames()
-    {
-        return _context.getInitParameterNames();
-    }
-
-    public Map<String, String> getInitParams()
-    {
-        return _context.getInitParams();
-    }
-
-    public void removeAttribute(String name)
-    {
-        _context.removeAttribute(name);
-    }
-
-    public void setAttribute(String name, Object value)
-    {
-        _context.setAttribute(name,value);
-    }
-
-    public void setContextPath(String contextPath)
-    {
-        _context.setContextPath(contextPath);
-    }
-
-    public Resource getBaseResource()
-    {
-        return _context.getBaseResource();
-    }
-
-    public String getResourceBase()
-    {
-        return _context.getResourceBase();
-    }
-
-    public void setResourceBase(String resourceBase)
-    {
-        _context.setResourceBase(resourceBase);
-    }
-
-    public ServletTester()
-    {
-        this("/",ServletContextHandler.SECURITY|ServletContextHandler.SESSIONS);
-    }
-
-    public ServletTester(String ctxPath)
-    {
-        this(ctxPath,ServletContextHandler.SECURITY|ServletContextHandler.SESSIONS);
-    }
-
-    public ServletTester(String contextPath,int options)
-    {
-        _context=new ServletContextHandler(_server,contextPath,options);
-        _server.setConnectors(new Connector[]{_connector});
-        addBean(_server);
-    }
-
-    public ServletContextHandler getContext()
-    {
-        return _context;
-    }
-
-    public String getResponses(String request) throws Exception
-    {
-        if (LOG.isDebugEnabled())
-        {
-            LOG.debug("Request: {}",request);
-        }
-        return _connector.getResponses(request);
-    }
-    
-    public String getResponses(String request, long idleFor,TimeUnit units) throws Exception
-    {
-        if (LOG.isDebugEnabled())
-        {
-            LOG.debug("Request: {}",request);
-        }
-        return _connector.getResponses(request, idleFor, units);
-    }
-    
-    public ByteBuffer getResponses(ByteBuffer request) throws Exception
-    {
-        if (LOG.isDebugEnabled())
-        {
-            LOG.debug("Request (Buffer): {}",BufferUtil.toUTF8String(request));
-        }
-        return _connector.getResponses(request);
-    }
-    
-    public ByteBuffer getResponses(ByteBuffer requestsBuffer,long idleFor,TimeUnit units) throws Exception
-    {
-        if (LOG.isDebugEnabled())
-        {
-            LOG.debug("Requests (Buffer): {}",BufferUtil.toUTF8String(requestsBuffer));
-        }
-        return _connector.getResponses(requestsBuffer, idleFor, units);
-    }
-
-    /** Create a port based connector.
-     * This methods adds a port connector to the server
-     * @return A URL to access the server via the connector.
-     * @throws Exception
-     */
-    public String createConnector(boolean localhost) throws Exception
-    {
-        ServerConnector connector = new ServerConnector(_server);
-        if (localhost)
-            connector.setHost("127.0.0.1");
-        _server.addConnector(connector);
-        if (_server.isStarted())
-            connector.start();
-        else
-            connector.open();
-
-        return "http://"+(localhost?"127.0.0.1":
-            InetAddress.getLocalHost().getHostAddress()
-        )+":"+connector.getLocalPort();
-    }
-
-    public LocalConnector createLocalConnector()
-    {
-        LocalConnector connector = new LocalConnector(_server);
-        _server.addConnector(connector);
-        return connector;
-    }
-
-
-
-}
diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncContextDispatchWithQueryStrings.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncContextDispatchWithQueryStrings.java
index 86eebe5..1d6d19b 100644
--- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncContextDispatchWithQueryStrings.java
+++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncContextDispatchWithQueryStrings.java
@@ -18,8 +18,9 @@
 
 package org.eclipse.jetty.servlet;
 
+import static org.hamcrest.Matchers.startsWith;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertThat;
 
 import java.io.IOException;
 
@@ -43,69 +44,77 @@
  * This tests verifies that merging of queryStrings works when dispatching
  * Requests via {@link AsyncContext} multiple times.
  */
-public class AsyncContextDispatchWithQueryStrings {
+public class AsyncContextDispatchWithQueryStrings 
+{
+    private Server _server = new Server();
+    private ServletContextHandler _contextHandler = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
+    private LocalConnector _connector = new LocalConnector(_server);
 
-        private Server _server = new Server();
-        private ServletContextHandler _contextHandler = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
-        private LocalConnector _connector = new LocalConnector(_server);
+    @Before
+    public void setUp() throws Exception 
+    {
+        _connector.setIdleTimeout(30000);
+        _server.setConnectors(new Connector[] { _connector });
 
-        @Before
-        public void setUp() throws Exception {
-                _connector.setIdleTimeout(30000);
-                _server.setConnectors(new Connector[] { _connector });
+        _contextHandler.setContextPath("/");
+        _contextHandler.addServlet(new ServletHolder(new TestServlet()), "/initialCall");
+        _contextHandler.addServlet(new ServletHolder(new TestServlet()), "/firstDispatchWithNewQueryString");
+        _contextHandler.addServlet(new ServletHolder(new TestServlet()), "/secondDispatchNewValueForExistingQueryString");
 
-                _contextHandler.setContextPath("/");
-                _contextHandler.addServlet(new ServletHolder(new TestServlet()), "/initialCall");
-                _contextHandler.addServlet(new ServletHolder(new TestServlet()), "/firstDispatchWithNewQueryString");
-                _contextHandler.addServlet(new ServletHolder(new TestServlet()), "/secondDispatchNewValueForExistingQueryString");
+        HandlerList handlers = new HandlerList();
+        handlers.setHandlers(new Handler[] { _contextHandler, new DefaultHandler() });
 
-                HandlerList handlers = new HandlerList();
-                handlers.setHandlers(new Handler[] { _contextHandler, new DefaultHandler() });
+        _server.setHandler(handlers);
+        _server.start();
+    }
 
-                _server.setHandler(handlers);
-                _server.start();
+    @Test
+    public void testMultipleDispatchesWithNewQueryStrings() throws Exception 
+    {
+        String request = 
+                "GET /initialCall?initialParam=right HTTP/1.1\r\n" + 
+                        "Host: localhost\r\n" + 
+                        "Content-Type: application/x-www-form-urlencoded\r\n" +
+                        "Connection: close\r\n" + "\r\n";
+        String responseString = _connector.getResponses(request);
+        assertThat(responseString,startsWith("HTTP/1.1 200"));
+    }
+
+    @After
+    public void tearDown() throws Exception 
+    {
+        _server.stop();
+        _server.join();
+    }
+
+    private class TestServlet extends HttpServlet 
+    {
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
+        {
+            String uri = request.getRequestURI();
+            String queryString = request.getQueryString();
+            if ("/initialCall".equals(uri)) 
+            {
+                AsyncContext async = request.startAsync();
+                async.dispatch("/firstDispatchWithNewQueryString?newQueryString=initialValue");
+                assertEquals("initialParam=right", queryString);
+            } 
+            else if ("/firstDispatchWithNewQueryString".equals(uri)) 
+            {
+                AsyncContext async = request.startAsync();
+                async.dispatch("/secondDispatchNewValueForExistingQueryString?newQueryString=newValue");
+                assertEquals("newQueryString=initialValue&initialParam=right", queryString);
+            } 
+            else 
+            {
+                response.setContentType("text/html");
+                response.setStatus(HttpServletResponse.SC_OK);
+                response.getWriter().println("<h1>woohhooooo</h1>");
+                assertEquals("newQueryString=newValue&initialParam=right", queryString);
+            }
         }
-
-        @Test
-        public void testMultipleDispatchesWithNewQueryStrings() throws Exception {
-                String request = "GET /initialCall?initialParam=right HTTP/1.1\r\n" + "Host: localhost\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n"
-                                + "Connection: close\r\n" + "\r\n";
-                String responseString = _connector.getResponses(request);
-                assertTrue("Not the expected response. Check STDOUT for details.", responseString.startsWith("HTTP/1.1 200"));
-        }
-
-        @After
-        public void tearDown() throws Exception {
-                _server.stop();
-                _server.join();
-        }
-
-        private class TestServlet extends HttpServlet {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-                        String path = request.getRequestURI();
-                        String queryString = request.getQueryString();
-                        if ("/initialCall".equals(path)) 
-                        {
-                            AsyncContext async = request.startAsync();
-                            async.dispatch("/firstDispatchWithNewQueryString?newQueryString=initialValue");
-                            assertEquals("initialParam=right", queryString);
-                        } 
-                        else if ("/firstDispatchWithNewQueryString".equals(path)) 
-                        {
-                            AsyncContext async = request.startAsync();
-                            async.dispatch("/secondDispatchNewValueForExistingQueryString?newQueryString=newValue");
-                            assertEquals("newQueryString=initialValue&initialParam=right", queryString);
-                        } 
-                        else 
-                        {
-                            response.setContentType("text/html");
-                            response.setStatus(HttpServletResponse.SC_OK);
-                            response.getWriter().println("<h1>woohhooooo</h1>");
-                            assertEquals("newQueryString=newValue&initialParam=right", queryString);
-                        }
-                }
-        }
+    }
 }
diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncContextListenersTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncContextListenersTest.java
index 11485ca..ce254a7 100644
--- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncContextListenersTest.java
+++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncContextListenersTest.java
@@ -24,7 +24,10 @@
 import java.io.OutputStream;
 import java.net.Socket;
 import java.nio.charset.StandardCharsets;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
 
 import javax.servlet.AsyncContext;
 import javax.servlet.AsyncEvent;
@@ -68,7 +71,7 @@
     @Test
     public void testListenerClearedOnSecondRequest() throws Exception
     {
-        final AtomicInteger completes = new AtomicInteger();
+        final AtomicReference<CountDownLatch> completes = new AtomicReference<>(new CountDownLatch(1));
         String path = "/path";
         prepare(path, new HttpServlet()
         {
@@ -86,7 +89,7 @@
                     @Override
                     public void onComplete(AsyncEvent event) throws IOException
                     {
-                        completes.incrementAndGet();
+                        completes.get().countDown();
                     }
 
                     @Override
@@ -118,23 +121,23 @@
             SimpleHttpParser parser = new SimpleHttpParser();
             SimpleHttpResponse response = parser.readResponse(reader);
             Assert.assertEquals("200", response.getCode());
-            Assert.assertEquals(1, completes.get());
+            completes.get().await(10,TimeUnit.SECONDS);
 
             // Send a second request
-            completes.set(0);
+            completes.set(new CountDownLatch(1));
             output.write(request.getBytes(StandardCharsets.UTF_8));
             output.flush();
 
             response = parser.readResponse(reader);
             Assert.assertEquals("200", response.getCode());
-            Assert.assertEquals(1, completes.get());
+            completes.get().await(10,TimeUnit.SECONDS);
         }
     }
 
     @Test
     public void testListenerAddedFromListener() throws Exception
     {
-        final AtomicInteger completes = new AtomicInteger();
+        final AtomicReference<CountDownLatch> completes = new AtomicReference<>(new CountDownLatch(1));
         String path = "/path";
         prepare(path, new HttpServlet()
         {
@@ -157,7 +160,7 @@
                     @Override
                     public void onComplete(AsyncEvent event) throws IOException
                     {
-                        completes.incrementAndGet();
+                        completes.get().countDown();
                     }
 
                     @Override
@@ -189,22 +192,22 @@
             SimpleHttpParser parser = new SimpleHttpParser();
             SimpleHttpResponse response = parser.readResponse(reader);
             Assert.assertEquals("200", response.getCode());
-            Assert.assertEquals(1, completes.get());
+            completes.get().await(10,TimeUnit.SECONDS);
 
             // Send a second request
-            completes.set(0);
+            completes.set(new CountDownLatch(1));
             output.write(request.getBytes(StandardCharsets.UTF_8));
             output.flush();
 
             response = parser.readResponse(reader);
             Assert.assertEquals("200", response.getCode());
-            Assert.assertEquals(1, completes.get());
+            completes.get().await(10,TimeUnit.SECONDS);
         }
     }
     @Test
     public void testAsyncDispatchAsyncCompletePreservesListener() throws Exception
     {
-        final AtomicInteger completes = new AtomicInteger();
+        final AtomicReference<CountDownLatch> completes = new AtomicReference<>(new CountDownLatch(1));
         final String path = "/path";
         prepare(path + "/*", new HttpServlet()
         {
@@ -226,7 +229,7 @@
                         @Override
                         public void onComplete(AsyncEvent event) throws IOException
                         {
-                            completes.incrementAndGet();
+                            completes.get().countDown();
                         }
 
                         @Override
@@ -267,16 +270,16 @@
             SimpleHttpParser parser = new SimpleHttpParser();
             SimpleHttpResponse response = parser.readResponse(reader);
             Assert.assertEquals("200", response.getCode());
-            Assert.assertEquals(1, completes.get());
+            completes.get().await(10,TimeUnit.SECONDS);
 
             // Send a second request
-            completes.set(0);
+            completes.set(new CountDownLatch(1));
             output.write(request.getBytes(StandardCharsets.UTF_8));
             output.flush();
 
             response = parser.readResponse(reader);
             Assert.assertEquals("200", response.getCode());
-            Assert.assertEquals(1, completes.get());
+            completes.get().await(10,TimeUnit.SECONDS);
         }
     }
 }
diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncContextTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncContextTest.java
index 038fc2b..c8ce663 100644
--- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncContextTest.java
+++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncContextTest.java
@@ -410,7 +410,7 @@
         
         BufferedReader br = new BufferedReader(new StringReader(responseString));
 
-        assertEquals("HTTP/1.1 500 Async Exception",br.readLine());
+        assertEquals("HTTP/1.1 500 Server Error",br.readLine());
         br.readLine();// connection close
         br.readLine();// server
         br.readLine();// empty
diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncIOServletTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncIOServletTest.java
index 51d1b10..034a26c 100644
--- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncIOServletTest.java
+++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncIOServletTest.java
@@ -18,6 +18,13 @@
 
 package org.eclipse.jetty.servlet;
 
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
@@ -30,6 +37,7 @@
 import java.util.concurrent.atomic.AtomicInteger;
 
 import javax.servlet.AsyncContext;
+import javax.servlet.DispatcherType;
 import javax.servlet.ReadListener;
 import javax.servlet.ServletException;
 import javax.servlet.ServletInputStream;
@@ -39,33 +47,36 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.server.handler.ContextHandler.Context;
+import org.eclipse.jetty.toolchain.test.AdvancedRunner;
 import org.eclipse.jetty.toolchain.test.http.SimpleHttpParser;
 import org.eclipse.jetty.toolchain.test.http.SimpleHttpResponse;
 import org.eclipse.jetty.util.IO;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.instanceOf;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.not;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-
+@RunWith (AdvancedRunner.class)
 public class AsyncIOServletTest
 {
     private Server server;
     private ServerConnector connector;
     private ServletContextHandler context;
     private String path = "/path";
+    private static final ThreadLocal<String> scope = new ThreadLocal<>();
 
     public void startServer(HttpServlet servlet) throws Exception
     {
         server = new Server();
         connector = new ServerConnector(server);
+        connector.setIdleTimeout(30000);
+        connector.getConnectionFactory(HttpConnectionFactory.class).getHttpConfiguration().setDelayDispatchUntilContent(false);
         server.addConnector(connector);
 
         context = new ServletContextHandler(server, "/", false, false);
@@ -73,9 +84,34 @@
         holder.setAsyncSupported(true);
         context.addServlet(holder, path);
 
+        context.addEventListener(new ContextHandler.ContextScopeListener()
+        {
+            @Override
+            public void enterScope(Context context, Request request, Object reason)
+            {
+                if (scope.get()!=null)
+                    throw new IllegalStateException();
+                scope.set("SCOPPED");
+                
+            }
+            @Override
+            public void exitScope(Context context, Request request)
+            {
+                if (scope.get()==null)
+                    throw new IllegalStateException();
+                scope.set(null);
+            } 
+        });
+        
         server.start();
     }
 
+    private static void assertScope()
+    {
+        if (scope.get()==null)
+            Assert.fail("Not in scope");
+    }
+    
     @After
     public void stopServer() throws Exception
     {
@@ -102,12 +138,14 @@
             @Override
             protected void service(HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
             {
+                assertScope();
                 final AsyncContext asyncContext = request.startAsync(request, response);
                 request.getInputStream().setReadListener(new ReadListener()
                 {
                     @Override
                     public void onDataAvailable() throws IOException
                     {
+                        assertScope();
                         if (throwable instanceof RuntimeException)
                             throw (RuntimeException)throwable;
                         if (throwable instanceof Error)
@@ -118,15 +156,18 @@
                     @Override
                     public void onAllDataRead() throws IOException
                     {
+                        assertScope();
                     }
 
                     @Override
                     public void onError(Throwable t)
                     {
+                        assertScope();
                         Assert.assertThat("onError type",t,instanceOf(throwable.getClass()));
                         Assert.assertThat("onError message",t.getMessage(),is(throwable.getMessage()));
                         latch.countDown();
                         response.setStatus(500);
+                        
                         asyncContext.complete();
                     }
                 });
@@ -142,15 +183,21 @@
 
         try (Socket client = new Socket("localhost", connector.getLocalPort()))
         {
+            client.setSoTimeout(5000);
             OutputStream output = client.getOutputStream();
             output.write(request.getBytes("UTF-8"));
             output.flush();
 
-            SimpleHttpParser parser = new SimpleHttpParser();
-            SimpleHttpResponse response = parser.readResponse(new BufferedReader(new InputStreamReader(client.getInputStream(), "UTF-8")));
-
+            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
+            String line=in.readLine();
+            assertThat(line, containsString("500 Server Error"));
+            while (line.length()>0)
+            {
+                line=in.readLine();
+            }
+            line=in.readLine();
+            
             Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
-            Assert.assertEquals("500", response.getCode());
         }
     }
 
@@ -163,6 +210,7 @@
             @Override
             protected void service(HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
             {
+                assertScope();
                 final AsyncContext asyncContext = request.startAsync(request, response);
                 asyncContext.setTimeout(0);
                 final ServletInputStream inputStream = request.getInputStream();
@@ -171,6 +219,7 @@
                     @Override
                     public void onDataAvailable() throws IOException
                     {
+                        assertScope();
                         while (inputStream.isReady() && !inputStream.isFinished())
                             inputStream.read();
                     }
@@ -178,11 +227,13 @@
                     @Override
                     public void onAllDataRead() throws IOException
                     {
+                        assertScope();
                     }
 
                     @Override
                     public void onError(Throwable t)
                     {
+                        assertScope();
                         response.setStatus(status);
                         // Do not put Connection: close header here, the test
                         // verifies that the server closes no matter what.
@@ -207,6 +258,7 @@
 
         try (Socket client = new Socket("localhost", connector.getLocalPort()))
         {
+            client.setSoTimeout(5000);
             OutputStream output = client.getOutputStream();
             output.write(request.getBytes("UTF-8"));
             output.flush();
@@ -230,25 +282,35 @@
             @Override
             protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
             {
+                assertScope();
+                if (request.getDispatcherType()==DispatcherType.ERROR)
+                {
+                    response.flushBuffer();
+                    return;
+                }
+                
                 final AsyncContext asyncContext = request.startAsync(request, response);
                 request.getInputStream().setReadListener(new ReadListener()
                 {
                     @Override
                     public void onDataAvailable() throws IOException
                     {
+                        assertScope();
                         throw new NullPointerException("explicitly_thrown_by_test_1");
                     }
 
                     @Override
                     public void onAllDataRead() throws IOException
                     {
+                        assertScope();
                     }
 
                     @Override
-                    public void onError(Throwable t)
+                    public void onError(final Throwable t)
                     {
+                        assertScope();
                         errors.incrementAndGet();
-                        throw new NullPointerException("explicitly_thrown_by_test_2");
+                        throw new NullPointerException("explicitly_thrown_by_test_2"){{this.initCause(t);}};
                     }
                 });
             }
@@ -295,12 +357,14 @@
             @Override
             protected void service(HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
             {
+                assertScope();
                 final AsyncContext asyncContext = request.startAsync(request, response);
                 response.getOutputStream().setWriteListener(new WriteListener()
                 {
                     @Override
                     public void onWritePossible() throws IOException
                     {
+                        assertScope();
                         if (throwable instanceof RuntimeException)
                             throw (RuntimeException)throwable;
                         if (throwable instanceof Error)
@@ -311,6 +375,7 @@
                     @Override
                     public void onError(Throwable t)
                     {
+                        assertScope();
                         latch.countDown();
                         response.setStatus(500);
                         asyncContext.complete();
@@ -353,6 +418,7 @@
             @Override
             protected void service(HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
             {
+                assertScope();
                 response.flushBuffer();
                 
                 final AsyncContext async = request.startAsync();
@@ -362,6 +428,7 @@
                     @Override
                     public void onWritePossible() throws IOException
                     {
+                        assertScope();
                         while (out.isReady())
                         {
                             try
@@ -383,6 +450,7 @@
                     @Override
                     public void onError(Throwable t)
                     {
+                        assertScope();
                         async.complete();
                         latch.countDown();
                     }
@@ -417,9 +485,9 @@
     
 
     @Test
-    public void testIsNotReadyAtEOF() throws Exception
+    public void testIsReadyAtEOF() throws Exception
     {
-        String text = "Test\n";
+        String text = "TEST\n";
         final byte[] data = text.getBytes(StandardCharsets.ISO_8859_1);
         
         startServer(new HttpServlet()
@@ -427,6 +495,7 @@
             @Override
             protected void service(HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
             {
+                assertScope();
                 response.flushBuffer();
                 
                 final AsyncContext async = request.startAsync();
@@ -442,6 +511,7 @@
                     @Override
                     public void onError(Throwable t)
                     {
+                        assertScope();
                         t.printStackTrace();
                         async.complete();
                     }
@@ -449,6 +519,7 @@
                     @Override
                     public void onDataAvailable() throws IOException
                     {
+                        assertScope();
                         while(in.isReady() && !in.isFinished())
                         {
                             int b = in.read();
@@ -465,6 +536,7 @@
                     @Override
                     public void onAllDataRead() throws IOException
                     {
+                        assertScope();
                         out.write(String.format("i=%d eof=%b finished=%b",_i,_minusOne,_finished).getBytes(StandardCharsets.ISO_8859_1));
                         async.complete();                        
                     }
@@ -483,6 +555,7 @@
         {
             OutputStream output = client.getOutputStream();
             output.write(request.getBytes("UTF-8"));
+            output.flush();
             output.write(data);
             output.flush();
 
@@ -492,7 +565,282 @@
             while (line.length()>0)
                 line=in.readLine();
             line=in.readLine();
-            assertThat(line, containsString("i="+data.length+" eof=false finished=true"));
+            assertThat(line, containsString("i="+data.length+" eof=true finished=true"));
+        }
+    }
+    
+
+    @Test
+    public void testOnAllDataRead() throws Exception
+    {
+        String text = "X";
+        final byte[] data = text.getBytes(StandardCharsets.ISO_8859_1);
+        
+        startServer(new HttpServlet()
+        {
+            @Override
+            protected void service(HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
+            {
+                assertScope();
+                response.flushBuffer();
+                
+                final AsyncContext async = request.startAsync();
+                async.setTimeout(5000);
+                final ServletInputStream in = request.getInputStream();
+                final ServletOutputStream out = response.getOutputStream();
+                
+                in.setReadListener(new ReadListener()
+                {
+                    @Override
+                    public void onError(Throwable t)
+                    {
+                        assertScope();
+                        t.printStackTrace();
+                        async.complete();
+                    }
+                    
+                    @Override
+                    public void onDataAvailable() throws IOException
+                    {
+                        assertScope();
+                        try
+                        {
+                            Thread.sleep(1000);
+                            if (!in.isReady())
+                                throw new IllegalStateException();
+                            if (in.read()!='X')
+                                throw new IllegalStateException();
+                            if (!in.isReady())
+                                throw new IllegalStateException();
+                            if (in.read()!=-1)
+                                throw new IllegalStateException();
+                        }
+                        catch(Exception e)
+                        {
+                            e.printStackTrace();
+                        }
+                    }
+                    
+                    @Override
+                    public void onAllDataRead() throws IOException
+                    {
+                        assertScope();
+                        out.write("OK\n".getBytes(StandardCharsets.ISO_8859_1));
+                        async.complete();                        
+                    }
+                });
+            }
+        });
+
+        String request = "GET " + path + " HTTP/1.1\r\n" +
+                "Host: localhost:" + connector.getLocalPort() + "\r\n" +
+                "Content-Type: text/plain\r\n"+
+                "Content-Length: "+data.length+"\r\n" +
+                "Connection: close\r\n" +
+                "\r\n";
+
+        try (Socket client = new Socket("localhost", connector.getLocalPort()))
+        {
+            client.setSoTimeout(5000);
+            OutputStream output = client.getOutputStream();
+            output.write(request.getBytes("UTF-8"));
+            output.flush();
+            Thread.sleep(100);
+            output.write(data);
+            output.flush();
+
+            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
+            String line=in.readLine();
+            assertThat(line, containsString("200 OK"));
+            while (line.length()>0)
+                line=in.readLine();
+            line=in.readLine();
+            assertThat(line, containsString("OK"));
+        }
+    }
+    
+    @Test
+    public void testOtherThreadOnAllDataRead() throws Exception
+    {
+        String text = "X";
+        final byte[] data = text.getBytes(StandardCharsets.ISO_8859_1);
+        
+        startServer(new HttpServlet()
+        {
+            @Override
+            protected void service(HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
+            {
+                assertScope();
+                response.flushBuffer();
+                
+                final AsyncContext async = request.startAsync();
+                async.setTimeout(500000);
+                final ServletInputStream in = request.getInputStream();
+                final ServletOutputStream out = response.getOutputStream();
+                
+                if (request.getDispatcherType()==DispatcherType.ERROR)
+                    throw new IllegalStateException();
+                
+                in.setReadListener(new ReadListener()
+                {
+                    @Override
+                    public void onError(Throwable t)
+                    {
+                        assertScope();
+                        t.printStackTrace();
+                        async.complete();
+                    }
+                    
+                    @Override
+                    public void onDataAvailable() throws IOException
+                    {
+                        assertScope();
+                        async.start(
+                        new Runnable()
+                        {
+                            public void run()
+                            {
+                                assertScope();
+                                try
+                                {
+                                    Thread.sleep(1000);
+                                    if (!in.isReady())
+                                        throw new IllegalStateException();
+                                    if (in.read()!='X')
+                                        throw new IllegalStateException();
+                                    if (!in.isReady())
+                                        throw new IllegalStateException();
+                                    if (in.read()!=-1)
+                                        throw new IllegalStateException();
+                                }
+                                catch(Exception e)
+                                {
+                                    e.printStackTrace();
+                                }
+                            }
+                        });
+                    }
+                    
+                    @Override
+                    public void onAllDataRead() throws IOException
+                    {
+                        out.write("OK\n".getBytes(StandardCharsets.ISO_8859_1));
+                        async.complete();                        
+                    }
+                });
+            }
+        });
+
+        String request = "GET " + path + " HTTP/1.1\r\n" +
+                "Host: localhost:" + connector.getLocalPort() + "\r\n" +
+                "Content-Type: text/plain\r\n"+
+                "Content-Length: "+data.length+"\r\n" +
+                "Connection: close\r\n" +
+                "\r\n";
+
+        try (Socket client = new Socket("localhost", connector.getLocalPort()))
+        {
+            client.setSoTimeout(500000);
+            OutputStream output = client.getOutputStream();
+            output.write(request.getBytes("UTF-8"));
+            output.flush();
+            Thread.sleep(100);
+            output.write(data);
+            output.flush();
+
+            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
+            String line=in.readLine();
+            assertThat(line, containsString("200 OK"));
+            while (line.length()>0)
+                line=in.readLine();
+            line=in.readLine();
+            assertThat(line, containsString("OK"));
+        }
+    }
+    
+
+    @Test
+    public void testCompleteBeforeOnAllDataRead() throws Exception
+    {
+        String text = "XYZ";
+        final byte[] data = text.getBytes(StandardCharsets.ISO_8859_1);
+        final AtomicBoolean allDataRead = new AtomicBoolean(false);
+        
+        startServer(new HttpServlet()
+        {
+            @Override
+            protected void service(HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
+            {
+                assertScope();
+                response.flushBuffer();
+                
+                final AsyncContext async = request.startAsync();
+                final ServletInputStream in = request.getInputStream();
+                final ServletOutputStream out = response.getOutputStream();
+                
+                in.setReadListener(new ReadListener()
+                {
+                    @Override
+                    public void onError(Throwable t)
+                    {
+                        assertScope();
+                        t.printStackTrace();
+                    }
+                    
+                    @Override
+                    public void onDataAvailable() throws IOException
+                    {
+                        assertScope();
+                        while (in.isReady())
+                        {
+                            int b = in.read();
+                            if (b<0)
+                            {
+                                out.write("OK\n".getBytes(StandardCharsets.ISO_8859_1));
+                                async.complete();
+                                return;
+                            } 
+                        }
+                    }
+                    
+                    @Override
+                    public void onAllDataRead() throws IOException
+                    {
+                        assertScope();
+                        out.write("BAD!!!\n".getBytes(StandardCharsets.ISO_8859_1));
+                        allDataRead.set(true);
+                        throw new IllegalStateException();     
+                    }
+                });
+            }
+        });
+
+        String request = "GET " + path + " HTTP/1.1\r\n" +
+                "Host: localhost:" + connector.getLocalPort() + "\r\n" +
+                "Content-Type: text/plain\r\n"+
+                "Content-Length: "+data.length+"\r\n" +
+                "Connection: close\r\n" +
+                "\r\n";
+
+        try (Socket client = new Socket("localhost", connector.getLocalPort()))
+        {
+            OutputStream output = client.getOutputStream();
+            output.write(request.getBytes("UTF-8"));
+            output.flush();
+            Thread.sleep(100);
+            output.write(data);
+            output.flush();
+
+            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
+            String line=in.readLine();
+            assertThat(line, containsString("200 OK"));
+            while (line.length()>0)
+            {
+                line=in.readLine();
+            }
+            line=in.readLine();
+            assertThat(line, containsString("OK"));
+            Assert.assertFalse(allDataRead.get());
         }
     }
     
@@ -508,6 +856,7 @@
             @Override
             protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
             {
+                assertScope();
                 final AsyncContext asyncContext = request.startAsync(request, response);
                 response.setStatus(200);
                 response.getOutputStream().close();
@@ -516,12 +865,14 @@
                     @Override
                     public void onDataAvailable() throws IOException 
                     {
+                        assertScope();
                         oda.set(true);
                     }
 
                     @Override
                     public void onAllDataRead() throws IOException 
                     {
+                        assertScope();
                         asyncContext.complete();
                         latch.countDown();
                     }
@@ -529,6 +880,7 @@
                     @Override
                     public void onError(Throwable t) 
                     {
+                        assertScope();
                         t.printStackTrace();
                         asyncContext.complete();
                     }        
diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncListenerTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncListenerTest.java
new file mode 100644
index 0000000..dd7d630
--- /dev/null
+++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncListenerTest.java
@@ -0,0 +1,648 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.servlet;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.nio.charset.StandardCharsets;
+import java.util.EnumSet;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.AsyncEvent;
+import javax.servlet.AsyncListener;
+import javax.servlet.DispatcherType;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.server.LocalConnector;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.junit.Ignore;
+import org.junit.Test;
+
+@Ignore("Not handling Exceptions during Async very well")
+public class AsyncListenerTest
+{
+    // Unique named RuntimeException to help during debugging / assertions
+    @SuppressWarnings("serial")
+    public static class FooRuntimeException extends RuntimeException
+    {
+    }
+
+    // Unique named Exception to help during debugging / assertions
+    @SuppressWarnings("serial")
+    public static class FooException extends Exception
+    {
+    }
+
+    // Unique named Throwable to help during debugging / assertions
+    @SuppressWarnings("serial")
+    public static class FooThrowable extends Throwable
+    {
+    }
+
+    // Unique named Error to help during debugging / assertions
+    @SuppressWarnings("serial")
+    public static class FooError extends Error
+    {
+    }
+
+    /**
+     * Basic AsyncListener adapter that simply logs (and makes testcase writing easier) 
+     */
+    public static class AsyncListenerAdapter implements AsyncListener
+    {
+        private static final Logger LOG = Log.getLogger(AsyncListenerTest.AsyncListenerAdapter.class);
+
+        @Override
+        public void onComplete(AsyncEvent event) throws IOException
+        {
+            LOG.info("onComplete({})",event);
+        }
+
+        @Override
+        public void onTimeout(AsyncEvent event) throws IOException
+        {
+            LOG.info("onTimeout({})",event);
+        }
+
+        @Override
+        public void onError(AsyncEvent event) throws IOException
+        {
+            LOG.info("onError({})",event);
+        }
+
+        @Override
+        public void onStartAsync(AsyncEvent event) throws IOException
+        {
+            LOG.info("onStartAsync({})",event);
+        }
+    }
+
+    /**
+     * Common ErrorContext for normal and async error handling
+     */
+    public static class ErrorContext implements AsyncListener
+    {
+        private static final Logger LOG = Log.getLogger(AsyncListenerTest.ErrorContext.class);
+
+        public void report(Throwable t, ServletRequest req, ServletResponse resp) throws IOException
+        {
+            if (resp instanceof HttpServletResponse)
+            {
+                ((HttpServletResponse)resp).setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+            }
+            resp.setContentType("text/plain");
+            resp.setCharacterEncoding(StandardCharsets.UTF_8.name());
+            PrintWriter out = resp.getWriter();
+            t.printStackTrace(out);
+        }
+
+        private void reportThrowable(AsyncEvent event) throws IOException
+        {
+            Throwable t = event.getThrowable();
+            if (t == null)
+            {
+                return;
+            }
+            ServletRequest req = event.getAsyncContext().getRequest();
+            ServletResponse resp = event.getAsyncContext().getResponse();
+            report(t,req,resp);
+        }
+
+        @Override
+        public void onComplete(AsyncEvent event) throws IOException
+        {
+            LOG.info("onComplete({})",event);
+            reportThrowable(event);
+        }
+
+        @Override
+        public void onTimeout(AsyncEvent event) throws IOException
+        {
+            LOG.info("onTimeout({})",event);
+            reportThrowable(event);
+        }
+
+        @Override
+        public void onError(AsyncEvent event) throws IOException
+        {
+            LOG.info("onError({})",event);
+            reportThrowable(event);
+        }
+
+        @Override
+        public void onStartAsync(AsyncEvent event) throws IOException
+        {
+            LOG.info("onStartAsync({})",event);
+            reportThrowable(event);
+        }
+    }
+
+    /**
+     * Common filter for all test cases that should handle Errors in a consistent way
+     * regardless of how the exception / error occurred in the servlets in the chain.
+     */
+    public static class ErrorFilter implements Filter
+    {
+        private final List<ErrorContext> tracking;
+
+        public ErrorFilter(List<ErrorContext> tracking)
+        {
+            this.tracking = tracking;
+        }
+
+        @Override
+        public void destroy()
+        {
+        }
+
+        @Override
+        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
+        {
+            ErrorContext err = new ErrorContext();
+            tracking.add(err);
+            try
+            {
+                chain.doFilter(request,response);
+            }
+            catch (Throwable t)
+            {
+                err.report(t,request,response);
+            }
+            finally
+            {
+                if (request.isAsyncStarted())
+                {
+                    request.getAsyncContext().addListener(err);
+                }
+            }
+        }
+
+        @Override
+        public void init(FilterConfig filterConfig) throws ServletException
+        {
+        }
+    }
+
+    /**
+     * Normal non-async testcase of error handling from a filter
+     * 
+     * @throws Exception
+     *             on test failure
+     */
+    @Test
+    public void testFilterErrorNoAsync() throws Exception
+    {
+        Server server = new Server();
+        LocalConnector conn = new LocalConnector(server);
+        conn.setIdleTimeout(10000);
+        server.addConnector(conn);
+
+        ServletContextHandler context = new ServletContextHandler();
+        context.setContextPath("/");
+        @SuppressWarnings("serial")
+        HttpServlet servlet = new HttpServlet()
+        {
+            public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+            {
+                throw new FooRuntimeException();
+            }
+        };
+        ServletHolder holder = new ServletHolder(servlet);
+        holder.setAsyncSupported(true);
+        context.addServlet(holder,"/err/*");
+        List<ErrorContext> tracking = new LinkedList<ErrorContext>();
+        ErrorFilter filter = new ErrorFilter(tracking);
+        context.addFilter(new FilterHolder(filter),"/*",EnumSet.allOf(DispatcherType.class));
+
+        server.setHandler(context);
+
+        try
+        {
+            server.start();
+            String resp = conn.getResponses("GET /err/ HTTP/1.1\n" + "Host: localhost\n" + "Connection: close\n" + "\n");
+            assertThat("Response status",resp,containsString("HTTP/1.1 500 Server Error"));
+            assertThat("Response",resp,containsString(FooRuntimeException.class.getName()));
+        }
+        finally
+        {
+            server.stop();
+        }
+    }
+
+    /**
+     * async testcase of error handling from a filter.
+     * 
+     * Async Started, then application Exception
+     * 
+     * @throws Exception
+     *             on test failure
+     */
+    @Test
+    public void testFilterErrorAsyncStart_Exception() throws Exception
+    {
+        Server server = new Server();
+        LocalConnector conn = new LocalConnector(server);
+        conn.setIdleTimeout(10000);
+        server.addConnector(conn);
+
+        ServletContextHandler context = new ServletContextHandler();
+        context.setContextPath("/");
+        @SuppressWarnings("serial")
+        HttpServlet servlet = new HttpServlet()
+        {
+            public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+            {
+                req.startAsync();
+                // before listeners are added, toss Exception
+                throw new FooRuntimeException();
+            }
+        };
+        ServletHolder holder = new ServletHolder(servlet);
+        holder.setAsyncSupported(true);
+        context.addServlet(holder,"/err/*");
+        List<ErrorContext> tracking = new LinkedList<ErrorContext>();
+        ErrorFilter filter = new ErrorFilter(tracking);
+        context.addFilter(new FilterHolder(filter),"/*",EnumSet.allOf(DispatcherType.class));
+
+        server.setHandler(context);
+
+        try
+        {
+            server.start();
+            String resp = conn.getResponses("GET /err/ HTTP/1.1\n" + "Host: localhost\n" + "Connection: close\n" + "\n");
+            assertThat("Response status",resp,containsString("HTTP/1.1 500 Server Error"));
+            assertThat("Response",resp,containsString(FooRuntimeException.class.getName()));
+        }
+        finally
+        {
+            server.stop();
+        }
+    }
+
+    /**
+     * async testcase of error handling from a filter.
+     * 
+     * Async Started, add listener that does nothing, then application Exception
+     * 
+     * @throws Exception
+     *             on test failure
+     */
+    @Test
+    public void testFilterErrorAsyncStart_AddEmptyListener_Exception() throws Exception
+    {
+        Server server = new Server();
+        LocalConnector conn = new LocalConnector(server);
+        conn.setIdleTimeout(10000);
+        server.addConnector(conn);
+
+        ServletContextHandler context = new ServletContextHandler();
+        context.setContextPath("/");
+        @SuppressWarnings("serial")
+        HttpServlet servlet = new HttpServlet()
+        {
+            public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+            {
+                AsyncContext ctx = req.startAsync();
+                ctx.addListener(new AsyncListenerAdapter());
+                throw new FooRuntimeException();
+            }
+        };
+        ServletHolder holder = new ServletHolder(servlet);
+        holder.setAsyncSupported(true);
+        context.addServlet(holder,"/err/*");
+        List<ErrorContext> tracking = new LinkedList<ErrorContext>();
+        ErrorFilter filter = new ErrorFilter(tracking);
+        context.addFilter(new FilterHolder(filter),"/*",EnumSet.allOf(DispatcherType.class));
+
+        server.setHandler(context);
+
+        try
+        {
+            server.start();
+            String resp = conn.getResponses("GET /err/ HTTP/1.1\n" + "Host: localhost\n" + "Connection: close\n" + "\n");
+            assertThat("Response status",resp,containsString("HTTP/1.1 500 Server Error"));
+            assertThat("Response",resp,containsString(FooRuntimeException.class.getName()));
+        }
+        finally
+        {
+            server.stop();
+        }
+    }
+
+    /**
+     * async testcase of error handling from a filter.
+     * 
+     * Async Started, add listener that completes only, then application Exception
+     * 
+     * @throws Exception
+     *             on test failure
+     */
+    @Test
+    public void testFilterErrorAsyncStart_AddListener_Exception() throws Exception
+    {
+        Server server = new Server();
+        LocalConnector conn = new LocalConnector(server);
+        conn.setIdleTimeout(10000);
+        server.addConnector(conn);
+
+        ServletContextHandler context = new ServletContextHandler();
+        context.setContextPath("/");
+        @SuppressWarnings("serial")
+        HttpServlet servlet = new HttpServlet()
+        {
+            public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+            {
+                AsyncContext ctx = req.startAsync();
+                ctx.addListener(new AsyncListenerAdapter()
+                {
+                    @Override
+                    public void onError(AsyncEvent event) throws IOException
+                    {
+                        System.err.println("### ONERROR");
+                        event.getThrowable().printStackTrace(System.err);
+                        event.getAsyncContext().complete();
+                    }
+                });
+                throw new FooRuntimeException();
+            }
+        };
+        ServletHolder holder = new ServletHolder(servlet);
+        holder.setAsyncSupported(true);
+        context.addServlet(holder,"/err/*");
+        List<ErrorContext> tracking = new LinkedList<ErrorContext>();
+        ErrorFilter filter = new ErrorFilter(tracking);
+        context.addFilter(new FilterHolder(filter),"/*",EnumSet.allOf(DispatcherType.class));
+
+        server.setHandler(context);
+
+        try
+        {
+            server.start();
+            String resp = conn.getResponses("GET /err/ HTTP/1.1\n" + "Host: localhost\n" + "Connection: close\n" + "\n");
+            assertThat("Response status",resp,containsString("HTTP/1.1 500 Server Error"));
+            assertThat("Response",resp,containsString(FooRuntimeException.class.getName()));
+        }
+        finally
+        {
+            server.stop();
+        }
+    }
+
+    /**
+     * async testcase of error handling from a filter.
+     * 
+     * Async Started, add listener, in onStartAsync throw Exception
+     * 
+     * @throws Exception
+     *             on test failure
+     */
+    @Test
+    public void testFilterErrorAsyncStart_AddListener_ExceptionDuringOnStart() throws Exception
+    {
+        Server server = new Server();
+        LocalConnector conn = new LocalConnector(server);
+        conn.setIdleTimeout(10000);
+        server.addConnector(conn);
+
+        ServletContextHandler context = new ServletContextHandler();
+        context.setContextPath("/");
+        @SuppressWarnings("serial")
+        HttpServlet servlet = new HttpServlet()
+        {
+            public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+            {
+                AsyncContext ctx = req.startAsync();
+                ctx.addListener(new AsyncListenerAdapter()
+                {
+                    @Override
+                    public void onStartAsync(AsyncEvent event) throws IOException
+                    {
+                        throw new FooRuntimeException();
+                    }
+                });
+            }
+        };
+        ServletHolder holder = new ServletHolder(servlet);
+        holder.setAsyncSupported(true);
+        context.addServlet(holder,"/err/*");
+        List<ErrorContext> tracking = new LinkedList<ErrorContext>();
+        ErrorFilter filter = new ErrorFilter(tracking);
+        context.addFilter(new FilterHolder(filter),"/*",EnumSet.allOf(DispatcherType.class));
+
+        server.setHandler(context);
+
+        try
+        {
+            server.start();
+            String resp = conn.getResponses("GET /err/ HTTP/1.1\n" + "Host: localhost\n" + "Connection: close\n" + "\n");
+            assertThat("Response status",resp,containsString("HTTP/1.1 500 Server Error"));
+            assertThat("Response",resp,containsString(FooRuntimeException.class.getName()));
+        }
+        finally
+        {
+            server.stop();
+        }
+    }
+    
+    /**
+     * async testcase of error handling from a filter.
+     * 
+     * Async Started, add listener, in onComplete throw Exception
+     * 
+     * @throws Exception
+     *             on test failure
+     */
+    @Test
+    public void testFilterErrorAsyncStart_AddListener_ExceptionDuringOnComplete() throws Exception
+    {
+        Server server = new Server();
+        LocalConnector conn = new LocalConnector(server);
+        conn.setIdleTimeout(10000);
+        server.addConnector(conn);
+
+        ServletContextHandler context = new ServletContextHandler();
+        context.setContextPath("/");
+        @SuppressWarnings("serial")
+        HttpServlet servlet = new HttpServlet()
+        {
+            public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+            {
+                AsyncContext ctx = req.startAsync();
+                ctx.addListener(new AsyncListenerAdapter()
+                {
+                    @Override
+                    public void onComplete(AsyncEvent event) throws IOException
+                    {
+                        throw new FooRuntimeException();
+                    }
+                });
+                ctx.complete();
+            }
+        };
+        ServletHolder holder = new ServletHolder(servlet);
+        holder.setAsyncSupported(true);
+        context.addServlet(holder,"/err/*");
+        List<ErrorContext> tracking = new LinkedList<ErrorContext>();
+        ErrorFilter filter = new ErrorFilter(tracking);
+        context.addFilter(new FilterHolder(filter),"/*",EnumSet.allOf(DispatcherType.class));
+
+        server.setHandler(context);
+
+        try
+        {
+            server.start();
+            String resp = conn.getResponses("GET /err/ HTTP/1.1\n" + "Host: localhost\n" + "Connection: close\n" + "\n");
+            assertThat("Response status",resp,containsString("HTTP/1.1 500 Server Error"));
+            assertThat("Response",resp,containsString(FooRuntimeException.class.getName()));
+        }
+        finally
+        {
+            server.stop();
+        }
+    }
+
+    /**
+     * async testcase of error handling from a filter.
+     * 
+     * Async Started, add listener, in onTimeout throw Exception
+     * 
+     * @throws Exception
+     *             on test failure
+     */
+    @Test
+    public void testFilterErrorAsyncStart_AddListener_ExceptionDuringOnTimeout() throws Exception
+    {
+        Server server = new Server();
+        LocalConnector conn = new LocalConnector(server);
+        conn.setIdleTimeout(10000);
+        server.addConnector(conn);
+
+        ServletContextHandler context = new ServletContextHandler();
+        context.setContextPath("/");
+        @SuppressWarnings("serial")
+        HttpServlet servlet = new HttpServlet()
+        {
+            public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+            {
+                AsyncContext ctx = req.startAsync();
+                ctx.setTimeout(1000);
+                ctx.addListener(new AsyncListenerAdapter()
+                {
+                    @Override
+                    public void onTimeout(AsyncEvent event) throws IOException
+                    {
+                        throw new FooRuntimeException();
+                    }
+                });
+            }
+        };
+        ServletHolder holder = new ServletHolder(servlet);
+        holder.setAsyncSupported(true);
+        context.addServlet(holder,"/err/*");
+        List<ErrorContext> tracking = new LinkedList<ErrorContext>();
+        ErrorFilter filter = new ErrorFilter(tracking);
+        context.addFilter(new FilterHolder(filter),"/*",EnumSet.allOf(DispatcherType.class));
+
+        server.setHandler(context);
+
+        try
+        {
+            server.start();
+            String resp = conn.getResponses("GET /err/ HTTP/1.1\n" + "Host: localhost\n" + "Connection: close\n" + "\n");
+            assertThat("Response status",resp,containsString("HTTP/1.1 500 Server Error"));
+            assertThat("Response",resp,containsString(FooRuntimeException.class.getName()));
+        }
+        finally
+        {
+            server.stop();
+        }
+    }
+
+    /**
+     * async testcase of error handling from a filter.
+     * 
+     * Async Started, no listener, in start() throw Exception
+     * 
+     * @throws Exception
+     *             on test failure
+     */
+    @Test
+    public void testFilterErrorAsyncStart_NoListener_ExceptionDuringStart() throws Exception
+    {
+        Server server = new Server();
+        LocalConnector conn = new LocalConnector(server);
+        conn.setIdleTimeout(10000);
+        server.addConnector(conn);
+
+        ServletContextHandler context = new ServletContextHandler();
+        context.setContextPath("/");
+        @SuppressWarnings("serial")
+        HttpServlet servlet = new HttpServlet()
+        {
+            public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+            {
+                AsyncContext ctx = req.startAsync();
+                ctx.setTimeout(1000);
+                ctx.start(new Runnable()
+                {
+                    @Override
+                    public void run()
+                    {
+                        throw new FooRuntimeException();
+                    }
+                });
+            }
+        };
+        ServletHolder holder = new ServletHolder(servlet);
+        holder.setAsyncSupported(true);
+        context.addServlet(holder,"/err/*");
+        List<ErrorContext> tracking = new LinkedList<ErrorContext>();
+        ErrorFilter filter = new ErrorFilter(tracking);
+        context.addFilter(new FilterHolder(filter),"/*",EnumSet.allOf(DispatcherType.class));
+
+        server.setHandler(context);
+
+        try
+        {
+            server.start();
+            String resp = conn.getResponses("GET /err/ HTTP/1.1\n" + "Host: localhost\n" + "Connection: close\n" + "\n");
+            assertThat("Response status",resp,containsString("HTTP/1.1 500 Server Error"));
+            assertThat("Response",resp,containsString(FooRuntimeException.class.getName()));
+        }
+        finally
+        {
+            server.stop();
+        }
+    }
+}
diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncServletIOTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncServletIOTest.java
index cb17eac..721e791 100644
--- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncServletIOTest.java
+++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncServletIOTest.java
@@ -18,6 +18,10 @@
 
 package org.eclipse.jetty.servlet;
 
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.startsWith;
+import static org.junit.Assert.assertEquals;
+
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
@@ -46,6 +50,7 @@
 import javax.servlet.http.HttpServletResponse;
 
 import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.DebugListener;
 import org.eclipse.jetty.server.HttpConfiguration;
 import org.eclipse.jetty.server.HttpConnectionFactory;
 import org.eclipse.jetty.server.Server;
@@ -57,10 +62,7 @@
 import org.junit.Before;
 import org.junit.Test;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.assertEquals;
-
-// TODO need  these on SPDY as well!
+// TODO need  these on HTTP2 as well!
 public class AsyncServletIOTest 
 {    
     private static final Logger LOG = Log.getLogger(AsyncServletIOTest.class);
@@ -82,6 +84,7 @@
         _server.setConnectors(new Connector[]{ _connector });
         ServletContextHandler context = new ServletContextHandler();
         context.setContextPath("/ctx");
+        context.addEventListener(new DebugListener());
         _server.setHandler(context);
         _servletHandler=context.getServletHandler();
         
@@ -223,7 +226,8 @@
         .append("Host: localhost\r\n")
         .append("Content-Type: text/plain\r\n")
         .append("Content-Length: 10\r\n")
-        .append("\r\n");
+        .append("\r\n")
+        .append("0");
         
         int port=_port;
         try (Socket socket = new Socket("localhost",port))
@@ -403,19 +407,18 @@
                         if (!onDataAvailable.compareAndSet(false,true))
                             throw new IllegalStateException();
                         
-                        // System.err.println("ODA");
+                        //System.err.println("ODA");
                         while (in.isReady() && !in.isFinished())
                         {
                             _oda.incrementAndGet();
                             int len=in.read(_buf);
-                            // System.err.println("read "+len);
+                            //System.err.println("read "+len);
                             if (len>0)
                                 _read.addAndGet(len);
                         }
 
                         if (!onDataAvailable.compareAndSet(true,false))
                             throw new IllegalStateException();
-                        
                     }
                     
                     @Override
diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncServletTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncServletTest.java
index 2393730..111c302 100644
--- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncServletTest.java
+++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/AsyncServletTest.java
@@ -18,8 +18,6 @@
 
 package org.eclipse.jetty.servlet;
 
-import static org.junit.Assert.assertEquals;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.Socket;
@@ -28,6 +26,9 @@
 import java.util.List;
 import java.util.Timer;
 import java.util.TimerTask;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 import javax.servlet.AsyncContext;
 import javax.servlet.AsyncEvent;
@@ -43,6 +44,8 @@
 import javax.servlet.http.HttpServletResponseWrapper;
 
 import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.DebugListener;
+import org.eclipse.jetty.server.QuietServletException;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.RequestLog;
 import org.eclipse.jetty.server.Response;
@@ -60,6 +63,12 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.startsWith;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+
 
 @RunWith(AdvancedRunner.class)
 public class AsyncServletTest
@@ -73,13 +82,15 @@
     protected List<String> _log;
     protected int _expectedLogs;
     protected String _expectedCode;
+    protected static List<String> __history=new CopyOnWriteArrayList<>();
+    protected static CountDownLatch __latch;
 
     @Before
     public void setUp() throws Exception
     {
         _connector = new ServerConnector(_server);
         _server.setConnectors(new Connector[]{ _connector });
-        
+
         _log=new ArrayList<>();
         RequestLog log=new Log();
         RequestLogHandler logHandler = new RequestLogHandler();
@@ -91,7 +102,8 @@
         ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
         context.setContextPath("/ctx");
         logHandler.setHandler(context);
-        
+        context.addEventListener(new DebugListener());
+
         _servletHandler=context.getServletHandler();
         ServletHolder holder=new ServletHolder(_servlet);
         holder.setAsyncSupported(true);
@@ -102,289 +114,383 @@
         _servletHandler.addServletWithMapping(new ServletHolder(new FwdServlet()),"/fwd/*");
         _server.start();
         _port=_connector.getLocalPort();
+        __history.clear();
+        __latch=new CountDownLatch(1);
     }
 
     @After
     public void tearDown() throws Exception
     {
+        _server.stop();
         assertEquals(_expectedLogs,_log.size());
         Assert.assertThat(_log.get(0), Matchers.containsString(_expectedCode));
-        _server.stop();
     }
 
     @Test
     public void testNormal() throws Exception
     {
         String response=process(null,null);
-        assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-        assertContains(
-                "history: REQUEST /ctx/path/info\r\n"+
-                "history: initial\r\n",response);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+                "REQUEST /ctx/path/info",
+                "initial"));
         assertContains("NORMAL",response);
-        assertNotContains("history: onTimeout",response);
-        assertNotContains("history: onComplete",response);
+        assertFalse(__history.contains("onTimeout"));
+        assertFalse(__history.contains("onComplete"));
     }
 
     @Test
     public void testSleep() throws Exception
     {
         String response=process("sleep=200",null);
-        assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-        assertContains(
-                "history: REQUEST /ctx/path/info\r\n"+
-                "history: initial\r\n",response);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+                "REQUEST /ctx/path/info",
+                "initial"));
         assertContains("SLEPT",response);
-        assertNotContains("history: onTimeout",response);
-        assertNotContains("history: onComplete",response);
+        assertFalse(__history.contains("onTimeout"));
+        assertFalse(__history.contains("onComplete"));
     }
 
     @Test
-    public void testSuspend() throws Exception
+    public void testNonAsync() throws Exception
+    {
+        String response=process("",null);
+        Assert.assertThat(response,Matchers.startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial"));
+
+        assertContains("NORMAL",response);
+    }
+    
+    @Test
+    public void testStart() throws Exception
     {
         _expectedCode="500 ";
-        String response=process("suspend=200",null);
+        String response=process("start=200",null);
+        Assert.assertThat(response,Matchers.startsWith("HTTP/1.1 500 Async Timeout"));
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "onTimeout",
+            "ERROR /ctx/path/info",
+            "!initial",
+            "onComplete"));
+
+        assertContains("ERROR DISPATCH: /ctx/path/info",response);
+    }
+
+    @Test
+    public void testStartOnTimeoutDispatch() throws Exception
+    {
+        String response=process("start=200&timeout=dispatch",null);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "onTimeout",
+            "dispatch",
+            "ASYNC /ctx/path/info",
+            "!initial",
+            "onComplete"));
+
+        assertContains("DISPATCHED",response);
+    }
+
+    @Test
+    public void testStartOnTimeoutError() throws Exception
+    {
+        _expectedCode="500 ";
+        String response=process("start=200&timeout=error",null);
+        assertThat(response,startsWith("HTTP/1.1 500 Server Error"));
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "onTimeout",
+            "error",
+            "onError",
+            "ERROR /ctx/path/info",
+            "!initial",
+            "onComplete"));
+
+        assertContains("ERROR DISPATCH",response);
+    }
+
+    @Test
+    public void testStartOnTimeoutErrorComplete() throws Exception
+    {
+        String response=process("start=200&timeout=error&error=complete",null);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "onTimeout",
+            "error",
+            "onError",
+            "complete",
+            "onComplete"));
+
+        assertContains("COMPLETED",response);
+    }
+
+    @Test
+    public void testStartOnTimeoutErrorDispatch() throws Exception
+    {
+        String response=process("start=200&timeout=error&error=dispatch",null);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "onTimeout",
+            "error",
+            "onError",
+            "dispatch",
+            "ASYNC /ctx/path/info",
+            "!initial",
+            "onComplete"));
+
+        assertContains("DISPATCHED",response);
+    }
+
+    @Test
+    public void testStartOnTimeoutComplete() throws Exception
+    {
+        String response=process("start=200&timeout=complete",null);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "onTimeout",
+            "complete",
+            "onComplete"));
+
+        assertContains("COMPLETED",response);
+    }
+
+    @Test
+    public void testStartWaitDispatch() throws Exception
+    {
+        String response=process("start=200&dispatch=10",null);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "dispatch",
+            "ASYNC /ctx/path/info",
+            "!initial",
+            "onComplete"));
+        assertFalse(__history.contains("onTimeout"));
+    }
+
+    @Test
+    public void testStartDispatch() throws Exception
+    {
+        String response=process("start=200&dispatch=0",null);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "dispatch",
+            "ASYNC /ctx/path/info",
+            "!initial",
+            "onComplete"));
+    }
+
+    @Test
+    public void testStartError() throws Exception
+    {
+        _expectedCode="500 ";
+        String response=process("start=200&throw=1",null);
+        assertThat(response,startsWith("HTTP/1.1 500 Server Error"));
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "onError",
+            "ERROR /ctx/path/info",
+            "!initial",
+            "onComplete"));
+        assertContains("ERROR DISPATCH: /ctx/path/info",response);
+    }
+
+    @Test
+    public void testStartWaitComplete() throws Exception
+    {
+        String response=process("start=200&complete=50",null);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "complete",
+            "onComplete"));
+        assertContains("COMPLETED",response);
+        assertFalse(__history.contains("onTimeout"));
+        assertFalse(__history.contains("!initial"));
+    }
+
+    @Test
+    public void testStartComplete() throws Exception
+    {
+        String response=process("start=200&complete=0",null);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "complete",
+            "onComplete"));
+        assertContains("COMPLETED",response);
+        assertFalse(__history.contains("onTimeout"));
+        assertFalse(__history.contains("!initial"));
+    }
+
+    @Test
+    public void testStartWaitDispatchStartWaitDispatch() throws Exception
+    {
+        String response=process("start=1000&dispatch=10&start2=1000&dispatch2=10",null);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "dispatch",
+            "ASYNC /ctx/path/info",
+            "!initial",
+            "onStartAsync",
+            "start",
+            "dispatch",
+            "ASYNC /ctx/path/info",
+            "!initial",
+            "onComplete"));
+        assertContains("DISPATCHED",response);
+    }
+
+    @Test
+    public void testStartWaitDispatchStartComplete() throws Exception
+    {
+        String response=process("start=1000&dispatch=10&start2=1000&complete2=10",null);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "dispatch",
+            "ASYNC /ctx/path/info",
+            "!initial",
+            "onStartAsync",
+            "start",
+            "complete",
+            "onComplete"));
+        assertContains("COMPLETED",response);
+    }
+
+    @Test
+    public void testStartWaitDispatchStart() throws Exception
+    {
+        _expectedCode="500 ";
+        String response=process("start=1000&dispatch=10&start2=10",null);
         assertEquals("HTTP/1.1 500 Async Timeout",response.substring(0,26));
-        assertContains(
-            "history: REQUEST /ctx/path/info\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: onTimeout\r\n"+
-            "history: ERROR /ctx/path/info\r\n"+
-            "history: !initial\r\n"+
-            "history: onComplete\r\n",response);
-
-        assertContains("ERROR: /ctx/path/info",response);
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "dispatch",
+            "ASYNC /ctx/path/info",
+            "!initial",
+            "onStartAsync",
+            "start",
+            "onTimeout",
+            "ERROR /ctx/path/info",
+            "!initial",
+            "onComplete"));
+        assertContains("ERROR DISPATCH: /ctx/path/info",response);
     }
 
     @Test
-    public void testSuspendOnTimeoutDispatch() throws Exception
+    public void testStartTimeoutStartDispatch() throws Exception
     {
-        String response=process("suspend=200&timeout=dispatch",null);
-        assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-        assertContains(
-            "history: REQUEST /ctx/path/info\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: onTimeout\r\n"+
-            "history: dispatch\r\n"+
-            "history: ASYNC /ctx/path/info\r\n"+
-            "history: !initial\r\n"+
-            "history: onComplete\r\n",response);
-
+        String response=process("start=10&start2=1000&dispatch2=10",null);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "onTimeout",
+            "ERROR /ctx/path/info",
+            "!initial",
+            "onStartAsync",
+            "start",
+            "dispatch",
+            "ASYNC /ctx/path/info",
+            "!initial",
+            "onComplete"));
         assertContains("DISPATCHED",response);
     }
 
     @Test
-    public void testSuspendOnTimeoutComplete() throws Exception
+    public void testStartTimeoutStartComplete() throws Exception
     {
-        String response=process("suspend=200&timeout=complete",null);
-        assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-        assertContains(
-            "history: REQUEST /ctx/path/info\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: onTimeout\r\n"+
-            "history: complete\r\n"+
-            "history: onComplete\r\n",response);
-
+        String response=process("start=10&start2=1000&complete2=10",null);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "onTimeout",
+            "ERROR /ctx/path/info",
+            "!initial",
+            "onStartAsync",
+            "start",
+            "complete",
+            "onComplete"));
         assertContains("COMPLETED",response);
     }
 
     @Test
-    public void testSuspendWaitResume() throws Exception
-    {
-        String response=process("suspend=200&resume=10",null);
-        assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-        assertContains(
-            "history: REQUEST /ctx/path/info\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: resume\r\n"+
-            "history: ASYNC /ctx/path/info\r\n"+
-            "history: !initial\r\n"+
-            "history: onComplete\r\n",response);
-        assertNotContains("history: onTimeout",response);
-    }
-
-    @Test
-    public void testSuspendResume() throws Exception
-    {
-        String response=process("suspend=200&resume=0",null);
-        assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-        assertContains(
-            "history: REQUEST /ctx/path/info\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: resume\r\n"+
-            "history: ASYNC /ctx/path/info\r\n"+
-            "history: !initial\r\n"+
-            "history: onComplete\r\n",response);
-        assertContains("history: onComplete",response);
-    }
-
-    @Test
-    public void testSuspendWaitComplete() throws Exception
-    {
-        String response=process("suspend=200&complete=50",null);
-        assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-        assertContains(
-            "history: REQUEST /ctx/path/info\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: complete\r\n"+
-            "history: onComplete\r\n",response);
-        assertContains("COMPLETED",response);
-        assertNotContains("history: onTimeout",response);
-        assertNotContains("history: !initial",response);
-    }
-
-    @Test
-    public void testSuspendComplete() throws Exception
-    {
-        String response=process("suspend=200&complete=0",null);
-        assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-        assertContains(
-            "history: REQUEST /ctx/path/info\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: complete\r\n"+
-            "history: onComplete\r\n",response);
-        assertContains("COMPLETED",response);
-        assertNotContains("history: onTimeout",response);
-        assertNotContains("history: !initial",response);
-    }
-
-    @Test
-    public void testSuspendWaitResumeSuspendWaitResume() throws Exception
-    {
-        String response=process("suspend=1000&resume=10&suspend2=1000&resume2=10",null);
-        assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-        assertContains(
-            "history: REQUEST /ctx/path/info\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: resume\r\n"+
-            "history: ASYNC /ctx/path/info\r\n"+
-            "history: !initial\r\n"+
-            "history: suspend\r\n"+
-            "history: resume\r\n"+
-            "history: ASYNC /ctx/path/info\r\n"+
-            "history: !initial\r\n"+
-            "history: onComplete\r\n",response);
-        assertContains("DISPATCHED",response);
-    }
-
-    @Test
-    public void testSuspendWaitResumeSuspendComplete() throws Exception
-    {
-        String response=process("suspend=1000&resume=10&suspend2=1000&complete2=10",null);
-        assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-        assertContains(
-            "history: REQUEST /ctx/path/info\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: resume\r\n"+
-            "history: ASYNC /ctx/path/info\r\n"+
-            "history: !initial\r\n"+
-            "history: suspend\r\n"+
-            "history: complete\r\n"+
-            "history: onComplete\r\n",response);
-        assertContains("COMPLETED",response);
-    }
-
-    @Test
-    public void testSuspendWaitResumeSuspend() throws Exception
+    public void testStartTimeoutStart() throws Exception
     {
         _expectedCode="500 ";
-        String response=process("suspend=1000&resume=10&suspend2=10",null);
-        assertEquals("HTTP/1.1 500 Async Timeout",response.substring(0,26));
-        assertContains(
-            "history: REQUEST /ctx/path/info\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: resume\r\n"+
-            "history: ASYNC /ctx/path/info\r\n"+
-            "history: !initial\r\n"+
-            "history: suspend\r\n"+
-            "history: onTimeout\r\n"+
-            "history: ERROR /ctx/path/info\r\n"+
-            "history: !initial\r\n"+
-            "history: onComplete\r\n",response);
-        assertContains("ERROR: /ctx/path/info",response);
-    }
-
-    @Test
-    public void testSuspendTimeoutSuspendResume() throws Exception
-    {
-        String response=process("suspend=10&suspend2=1000&resume2=10",null);
-        assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-        assertContains(
-            "history: REQUEST /ctx/path/info\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: onTimeout\r\n"+
-            "history: ERROR /ctx/path/info\r\n"+
-            "history: !initial\r\n"+
-            "history: suspend\r\n"+
-            "history: resume\r\n"+
-            "history: ASYNC /ctx/path/info\r\n"+
-            "history: !initial\r\n"+
-            "history: onComplete\r\n",response);
-        assertContains("DISPATCHED",response);
-    }
-
-    @Test
-    public void testSuspendTimeoutSuspendComplete() throws Exception
-    {
-        String response=process("suspend=10&suspend2=1000&complete2=10",null);
-        assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-        assertContains(
-            "history: REQUEST /ctx/path/info\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: onTimeout\r\n"+
-            "history: ERROR /ctx/path/info\r\n"+
-            "history: !initial\r\n"+
-            "history: suspend\r\n"+
-            "history: complete\r\n"+
-            "history: onComplete\r\n",response);
-        assertContains("COMPLETED",response);
-    }
-
-    @Test
-    public void testSuspendTimeoutSuspend() throws Exception
-    {
-        _expectedCode="500 ";
-        String response=process("suspend=10&suspend2=10",null);
-        assertContains(
-            "history: REQUEST /ctx/path/info\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: onTimeout\r\n"+
-            "history: ERROR /ctx/path/info\r\n"+
-            "history: !initial\r\n"+
-            "history: suspend\r\n"+
-            "history: onTimeout\r\n"+
-            "history: ERROR /ctx/path/info\r\n"+
-            "history: !initial\r\n"+
-            "history: onComplete\r\n",response);
-        assertContains("ERROR: /ctx/path/info",response);
+        String response=process("start=10&start2=10",null);
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "onTimeout",
+            "ERROR /ctx/path/info",
+            "!initial",
+            "onStartAsync",
+            "start",
+            "onTimeout",
+            "ERROR /ctx/path/info",
+            "!initial",
+            "onComplete"));
+        assertContains("ERROR DISPATCH: /ctx/path/info",response);
     }
 
     @Test
     public void testWrapStartDispatch() throws Exception
     {
-        String response=process("wrap=true&suspend=200&resume=20",null);
-        assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-        assertContains(
-            "history: REQUEST /ctx/path/info\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: resume\r\n"+
-            "history: ASYNC /ctx/path/info\r\n"+
-            "history: wrapped REQ RSP\r\n"+
-            "history: !initial\r\n"+
-            "history: onComplete\r\n",response);
+        String response=process("wrap=true&start=200&dispatch=20",null);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "dispatch",
+            "ASYNC /ctx/path/info",
+            "wrapped REQ RSP",
+            "!initial",
+            "onComplete"));
         assertContains("DISPATCHED",response);
     }
 
@@ -392,127 +498,122 @@
     @Test
     public void testStartDispatchEncodedPath() throws Exception
     {
-        String response=process("suspend=200&resume=20&path=/p%20th3",null);
-        assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-        assertContains(
-            "history: REQUEST /ctx/path/info\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: resume\r\n"+
-            "history: ASYNC /ctx/p%20th3\r\n"+
-            "history: !initial\r\n"+
-            "history: onComplete\r\n",response);
+        String response=process("start=200&dispatch=20&path=/p%20th3",null);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "REQUEST /ctx/path/info",
+            "initial",
+            "start",
+            "dispatch",
+            "ASYNC /ctx/p%20th3",
+            "!initial",
+            "onComplete"));
         assertContains("DISPATCHED",response);
     }
-    
-    
+
+
     @Test
     public void testFwdStartDispatch() throws Exception
     {
-        String response=process("fwd","suspend=200&resume=20",null);
-        assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-        assertContains(
-            "history: FWD REQUEST /ctx/fwd/info\r\n"+
-            "history: FORWARD /ctx/path1\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: resume\r\n"+
-            "history: FWD ASYNC /ctx/fwd/info\r\n"+
-            "history: FORWARD /ctx/path1\r\n"+
-            "history: !initial\r\n"+
-            "history: onComplete\r\n",response);
+        String response=process("fwd","start=200&dispatch=20",null);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "FWD REQUEST /ctx/fwd/info",
+            "FORWARD /ctx/path1",
+            "initial",
+            "start",
+            "dispatch",
+            "FWD ASYNC /ctx/fwd/info",
+            "FORWARD /ctx/path1",
+            "!initial",
+            "onComplete"));
         assertContains("DISPATCHED",response);
     }
-    
+
     @Test
     public void testFwdStartDispatchPath() throws Exception
     {
-        String response=process("fwd","suspend=200&resume=20&path=/path2",null);
-        assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-        assertContains(
-            "history: FWD REQUEST /ctx/fwd/info\r\n"+
-            "history: FORWARD /ctx/path1\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: resume\r\n"+
-            "history: ASYNC /ctx/path2\r\n"+
-            "history: !initial\r\n"+
-            "history: onComplete\r\n",response);
+        String response=process("fwd","start=200&dispatch=20&path=/path2",null);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "FWD REQUEST /ctx/fwd/info",
+            "FORWARD /ctx/path1",
+            "initial",
+            "start",
+            "dispatch",
+            "ASYNC /ctx/path2",
+            "!initial",
+            "onComplete"));
         assertContains("DISPATCHED",response);
     }
 
     @Test
     public void testFwdWrapStartDispatch() throws Exception
     {
-        String response=process("fwd","wrap=true&suspend=200&resume=20",null);
-        assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-        assertContains(
-            "history: FWD REQUEST /ctx/fwd/info\r\n"+
-            "history: FORWARD /ctx/path1\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: resume\r\n"+
-            "history: ASYNC /ctx/path1\r\n"+
-            "history: wrapped REQ RSP\r\n"+
-            "history: !initial\r\n"+
-            "history: onComplete\r\n",response);
+        String response=process("fwd","wrap=true&start=200&dispatch=20",null);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "FWD REQUEST /ctx/fwd/info",
+            "FORWARD /ctx/path1",
+            "initial",
+            "start",
+            "dispatch",
+            "ASYNC /ctx/path1",
+            "wrapped REQ RSP",
+            "!initial",
+            "onComplete"));
         assertContains("DISPATCHED",response);
     }
-    
+
     @Test
     public void testFwdWrapStartDispatchPath() throws Exception
     {
-        String response=process("fwd","wrap=true&suspend=200&resume=20&path=/path2",null);
-        assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-        assertContains(
-            "history: FWD REQUEST /ctx/fwd/info\r\n"+
-            "history: FORWARD /ctx/path1\r\n"+
-            "history: initial\r\n"+
-            "history: suspend\r\n"+
-            "history: resume\r\n"+
-            "history: ASYNC /ctx/path2\r\n"+
-            "history: wrapped REQ RSP\r\n"+
-            "history: !initial\r\n"+
-            "history: onComplete\r\n",response);
+        String response=process("fwd","wrap=true&start=200&dispatch=20&path=/path2",null);
+        assertThat(response,startsWith("HTTP/1.1 200 OK"));
+        assertThat(__history,contains(
+            "FWD REQUEST /ctx/fwd/info",
+            "FORWARD /ctx/path1",
+            "initial",
+            "start",
+            "dispatch",
+            "ASYNC /ctx/path2",
+            "wrapped REQ RSP",
+            "!initial",
+            "onComplete"));
         assertContains("DISPATCHED",response);
     }
-    
-    
+
+
     @Test
     public void testAsyncRead() throws Exception
     {
-        _expectedLogs=2;
-        String header="GET /ctx/path/info?suspend=2000&resume=1500 HTTP/1.1\r\n"+
+        String header="GET /ctx/path/info?start=2000&dispatch=1500 HTTP/1.1\r\n"+
             "Host: localhost\r\n"+
             "Content-Length: 10\r\n"+
-            "\r\n";
-        String body="12345678\r\n";
-        String close="GET /ctx/path/info HTTP/1.1\r\n"+
-            "Host: localhost\r\n"+
             "Connection: close\r\n"+
             "\r\n";
+        String body="12345678\r\n";
 
         try (Socket socket = new Socket("localhost",_port))
         {
             socket.setSoTimeout(10000);
             socket.getOutputStream().write(header.getBytes(StandardCharsets.ISO_8859_1));
-            Thread.sleep(500);
             socket.getOutputStream().write(body.getBytes(StandardCharsets.ISO_8859_1),0,2);
             Thread.sleep(500);
             socket.getOutputStream().write(body.getBytes(StandardCharsets.ISO_8859_1),2,8);
-            socket.getOutputStream().write(close.getBytes(StandardCharsets.ISO_8859_1));
 
             String response = IO.toString(socket.getInputStream());
-            assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
-            assertContains(
-                "history: REQUEST /ctx/path/info\r\n"+
-                "history: initial\r\n"+
-                "history: suspend\r\n"+
-                "history: async-read=10\r\n"+
-                "history: resume\r\n"+
-                "history: ASYNC /ctx/path/info\r\n"+
-                "history: !initial\r\n"+
-                "history: onComplete\r\n",response);
+            __latch.await(1,TimeUnit.SECONDS);
+            assertThat(response,startsWith("HTTP/1.1 200 OK"));
+            assertThat(__history,contains(
+                "REQUEST /ctx/path/info",
+                "initial",
+                "start",
+                "async-read=10",
+                "dispatch",
+                "ASYNC /ctx/path/info",
+                "!initial",
+                "onComplete"));
         }
     }
 
@@ -520,7 +621,7 @@
     {
         return process("path",query,content);
     }
-    
+
     public synchronized String process(String path,String query,String content) throws Exception
     {
         String request = "GET /ctx/"+path+"/info";
@@ -543,7 +644,10 @@
         {
             socket.setSoTimeout(1000000);
             socket.getOutputStream().write(request.getBytes(StandardCharsets.UTF_8));
-            return IO.toString(socket.getInputStream());
+            socket.getOutputStream().flush();
+            String response = IO.toString(socket.getInputStream());
+            __latch.await(1,TimeUnit.SECONDS);
+            return response;
         }
         catch(Exception e)
         {
@@ -551,6 +655,7 @@
             e.printStackTrace();
             throw e;
         }
+        
     }
 
     protected void assertContains(String content,String response)
@@ -568,13 +673,13 @@
         @Override
         public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
         {
-            response.addHeader("history","FWD "+request.getDispatcherType()+" "+request.getRequestURI());
+            __history.add("FWD "+request.getDispatcherType()+" "+request.getRequestURI());
             if (request instanceof ServletRequestWrapper || response instanceof ServletResponseWrapper)
-                response.addHeader("history","wrapped"+((request instanceof ServletRequestWrapper)?" REQ":"")+((response instanceof ServletResponseWrapper)?" RSP":""));
+                __history.add("wrapped"+((request instanceof ServletRequestWrapper)?" REQ":"")+((response instanceof ServletResponseWrapper)?" RSP":""));
             request.getServletContext().getRequestDispatcher("/path1").forward(request,response);
         }
     }
-    
+
     private static class AsyncServlet extends HttpServlet
     {
         private static final long serialVersionUID = -8161977157098646562L;
@@ -593,36 +698,36 @@
             {
                 // ignored
             }
-            
+
             // System.err.println(request.getDispatcherType()+" "+request.getRequestURI());
-            response.addHeader("history",request.getDispatcherType()+" "+request.getRequestURI());
+            __history.add(request.getDispatcherType()+" "+request.getRequestURI());
             if (request instanceof ServletRequestWrapper || response instanceof ServletResponseWrapper)
-                response.addHeader("history","wrapped"+((request instanceof ServletRequestWrapper)?" REQ":"")+((response instanceof ServletResponseWrapper)?" RSP":""));
-                
+                __history.add("wrapped"+((request instanceof ServletRequestWrapper)?" REQ":"")+((response instanceof ServletResponseWrapper)?" RSP":""));
+
             boolean wrap="true".equals(request.getParameter("wrap"));
             int read_before=0;
             long sleep_for=-1;
-            long suspend_for=-1;
-            long suspend2_for=-1;
-            long resume_after=-1;
-            long resume2_after=-1;
+            long start_for=-1;
+            long start2_for=-1;
+            long dispatch_after=-1;
+            long dispatch2_after=-1;
             long complete_after=-1;
             long complete2_after=-1;
 
-            
+
             if (request.getParameter("read")!=null)
                 read_before=Integer.parseInt(request.getParameter("read"));
             if (request.getParameter("sleep")!=null)
                 sleep_for=Integer.parseInt(request.getParameter("sleep"));
-            if (request.getParameter("suspend")!=null)
-                suspend_for=Integer.parseInt(request.getParameter("suspend"));
-            if (request.getParameter("suspend2")!=null)
-                suspend2_for=Integer.parseInt(request.getParameter("suspend2"));
-            if (request.getParameter("resume")!=null)
-                resume_after=Integer.parseInt(request.getParameter("resume"));
+            if (request.getParameter("start")!=null)
+                start_for=Integer.parseInt(request.getParameter("start"));
+            if (request.getParameter("start2")!=null)
+                start2_for=Integer.parseInt(request.getParameter("start2"));
+            if (request.getParameter("dispatch")!=null)
+                dispatch_after=Integer.parseInt(request.getParameter("dispatch"));
             final String path=request.getParameter("path");
-            if (request.getParameter("resume2")!=null)
-                resume2_after=Integer.parseInt(request.getParameter("resume2"));
+            if (request.getParameter("dispatch2")!=null)
+                dispatch2_after=Integer.parseInt(request.getParameter("dispatch2"));
             if (request.getParameter("complete")!=null)
                 complete_after=Integer.parseInt(request.getParameter("complete"));
             if (request.getParameter("complete2")!=null)
@@ -631,7 +736,7 @@
             if (request.getAttribute("State")==null)
             {
                 request.setAttribute("State",new Integer(1));
-                response.addHeader("history","initial");
+                __history.add("initial");
                 if (read_before>0)
                 {
                     byte[] buf=new byte[read_before];
@@ -659,7 +764,7 @@
                                 while(b!=-1)
                                     if((b=in.read())>=0)
                                         c++;
-                                response.addHeader("history","async-read="+c);
+                                __history.add("async-read="+c);
                             }
                             catch(Exception e)
                             {
@@ -669,13 +774,16 @@
                     }.start();
                 }
 
-                if (suspend_for>=0)
+                if (start_for>=0)
                 {
                     final AsyncContext async=wrap?request.startAsync(new HttpServletRequestWrapper(request),new HttpServletResponseWrapper(response)):request.startAsync();
-                    if (suspend_for>0)
-                        async.setTimeout(suspend_for);
+                    if (start_for>0)
+                        async.setTimeout(start_for);
                     async.addListener(__listener);
-                    response.addHeader("history","suspend");
+                    __history.add("start");
+
+                    if ("1".equals(request.getParameter("throw")))
+                        throw new QuietServletException(new Exception("test throw in async 1"));
 
                     if (complete_after>0)
                     {
@@ -688,7 +796,7 @@
                                 {
                                     response.setStatus(200);
                                     response.getOutputStream().println("COMPLETED\n");
-                                    response.addHeader("history","complete");
+                                    __history.add("complete");
                                     async.complete();
                                 }
                                 catch(Exception e)
@@ -706,18 +814,18 @@
                     {
                         response.setStatus(200);
                         response.getOutputStream().println("COMPLETED\n");
-                        response.addHeader("history","complete");
+                        __history.add("complete");
                         async.complete();
                     }
-                    else if (resume_after>0)
+                    else if (dispatch_after>0)
                     {
-                        TimerTask resume = new TimerTask()
+                        TimerTask dispatch = new TimerTask()
                         {
                             @Override
                             public void run()
                             {
-                                ((HttpServletResponse)async.getResponse()).addHeader("history","resume");
-                                if (path!=null)             
+                                __history.add("dispatch");
+                                if (path!=null)
                                 {
                                     int q=path.indexOf('?');
                                     String uriInContext=(q>=0)
@@ -731,13 +839,13 @@
                         };
                         synchronized (_timer)
                         {
-                            _timer.schedule(resume,resume_after);
+                            _timer.schedule(dispatch,dispatch_after);
                         }
                     }
-                    else if (resume_after==0)
+                    else if (dispatch_after==0)
                     {
-                        ((HttpServletResponse)async.getResponse()).addHeader("history","resume");
-                        if (path!=null)             
+                        __history.add("dispatch");
+                        if (path!=null)
                             async.dispatch(path);
                         else
                             async.dispatch();
@@ -765,20 +873,22 @@
             }
             else
             {
-                response.addHeader("history","!initial");
+                __history.add("!initial");
 
-                if (suspend2_for>=0 && request.getAttribute("2nd")==null)
+                if (start2_for>=0 && request.getAttribute("2nd")==null)
                 {
                     final AsyncContext async=wrap?request.startAsync(new HttpServletRequestWrapper(request),new HttpServletResponseWrapper(response)):request.startAsync();
                     async.addListener(__listener);
                     request.setAttribute("2nd","cycle");
 
-                    if (suspend2_for>0)
+                    if (start2_for>0)
                     {
-                        async.setTimeout(suspend2_for);
+                        async.setTimeout(start2_for);
                     }
-                    // continuation.addContinuationListener(__listener);
-                    response.addHeader("history","suspend");
+                    __history.add("start");
+
+                    if ("2".equals(request.getParameter("throw")))
+                        throw new QuietServletException(new Exception("test throw in async 2"));
 
                     if (complete2_after>0)
                     {
@@ -791,7 +901,7 @@
                                 {
                                     response.setStatus(200);
                                     response.getOutputStream().println("COMPLETED\n");
-                                    response.addHeader("history","complete");
+                                    __history.add("complete");
                                     async.complete();
                                 }
                                 catch(Exception e)
@@ -809,34 +919,34 @@
                     {
                         response.setStatus(200);
                         response.getOutputStream().println("COMPLETED\n");
-                        response.addHeader("history","complete");
+                        __history.add("complete");
                         async.complete();
                     }
-                    else if (resume2_after>0)
+                    else if (dispatch2_after>0)
                     {
-                        TimerTask resume = new TimerTask()
+                        TimerTask dispatch = new TimerTask()
                         {
                             @Override
                             public void run()
                             {
-                                response.addHeader("history","resume");
+                                __history.add("dispatch");
                                 async.dispatch();
                             }
                         };
                         synchronized (_timer)
                         {
-                            _timer.schedule(resume,resume2_after);
+                            _timer.schedule(dispatch,dispatch2_after);
                         }
                     }
-                    else if (resume2_after==0)
+                    else if (dispatch2_after==0)
                     {
-                        response.addHeader("history","dispatch");
+                        __history.add("dispatch");
                         async.dispatch();
                     }
                 }
                 else if(request.getDispatcherType()==DispatcherType.ERROR)
                 {
-                    response.getOutputStream().println("ERROR: "+request.getContextPath()+request.getServletPath()+request.getPathInfo());
+                    response.getOutputStream().println("ERROR DISPATCH: "+request.getContextPath()+request.getServletPath()+request.getPathInfo());
                 }
                 else
                 {
@@ -853,17 +963,25 @@
         @Override
         public void onTimeout(AsyncEvent event) throws IOException
         {
-            ((HttpServletResponse)event.getSuppliedResponse()).addHeader("history","onTimeout");
+            __history.add("onTimeout");
             String action=event.getSuppliedRequest().getParameter("timeout");
             if (action!=null)
             {
-                ((HttpServletResponse)event.getSuppliedResponse()).addHeader("history",action);
-                if ("dispatch".equals(action))
-                    event.getAsyncContext().dispatch();
-                if ("complete".equals(action))
+                __history.add(action);
+
+                switch(action)
                 {
-                    event.getSuppliedResponse().getOutputStream().println("COMPLETED\n");
-                    event.getAsyncContext().complete();
+                    case "dispatch":
+                        event.getAsyncContext().dispatch();
+                        break;
+
+                    case "complete":
+                        event.getSuppliedResponse().getOutputStream().println("COMPLETED\n");
+                        event.getAsyncContext().complete();
+                        break;
+
+                    case "error":
+                        throw new RuntimeException("error in onTimeout");
                 }
             }
         }
@@ -871,17 +989,37 @@
         @Override
         public void onStartAsync(AsyncEvent event) throws IOException
         {
+            __history.add("onStartAsync");
         }
 
         @Override
         public void onError(AsyncEvent event) throws IOException
         {
+            __history.add("onError");
+            String action=event.getSuppliedRequest().getParameter("error");
+            if (action!=null)
+            {
+                __history.add(action);
+
+                switch(action)
+                {
+                    case "dispatch":
+                        event.getAsyncContext().dispatch();
+                        break;
+
+                    case "complete":
+                        event.getSuppliedResponse().getOutputStream().println("COMPLETED\n");
+                        event.getAsyncContext().complete();
+                        break;
+                }
+            }
         }
 
         @Override
         public void onComplete(AsyncEvent event) throws IOException
         {
-            ((HttpServletResponse)event.getSuppliedResponse()).addHeader("history","onComplete");
+            __history.add("onComplete");
+            __latch.countDown();
         }
     };
 
@@ -889,8 +1027,10 @@
     {
         @Override
         public void log(Request request, Response response)
-        {            
-            _log.add(response.getStatus()+" "+response.getContentCount()+" "+request.getRequestURI());
+        {
+            int status = response.getCommittedMetaData().getStatus();
+            long written = response.getHttpChannel().getBytesWritten();
+            _log.add(status+" "+written+" "+request.getRequestURI());
         }
     }
 }
diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DefaultServletTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DefaultServletTest.java
index 207277a..174c85f 100644
--- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DefaultServletTest.java
+++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DefaultServletTest.java
@@ -41,7 +41,7 @@
 import org.eclipse.jetty.server.HttpConfiguration;
 import org.eclipse.jetty.server.LocalConnector;
 import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.server.handler.AllowSymLinkAliasChecker;
 import org.eclipse.jetty.toolchain.test.FS;
 import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
 import org.eclipse.jetty.toolchain.test.OS;
@@ -99,7 +99,7 @@
         testdir.ensureEmpty();
 
         /* create some content in the docroot */
-        File resBase = testdir.getFile("docroot");
+        File resBase = testdir.getPathFile("docroot").toFile();
         assertTrue(resBase.mkdirs());
         assertTrue(new File(resBase, "one").mkdir());
         assertTrue(new File(resBase, "two").mkdir());
@@ -131,7 +131,7 @@
         testdir.ensureEmpty();
 
         /* create some content in the docroot */
-        File resBase = testdir.getFile("docroot");
+        File resBase = testdir.getPathFile("docroot").toFile();
         FS.ensureDirExists(resBase);
         assertTrue(new File(resBase, "one").mkdir());
         assertTrue(new File(resBase, "two").mkdir());
@@ -154,14 +154,6 @@
 
         String response = connector.getResponses(req1.toString());
 
-        assertResponseContains("/one/", response);
-        assertResponseContains("/two/", response);
-        assertResponseContains("/three/", response);
-        if (!OS.IS_WINDOWS)
-        {
-            assertResponseContains("/f%3F%3Fr", response);
-        }
-
         assertResponseNotContains("<script>", response);
     }
 
@@ -176,7 +168,7 @@
         testdir.ensureEmpty();
 
         /* create some content in the docroot */
-        File resBase = testdir.getFile("docroot");
+        File resBase = testdir.getPathFile("docroot").toFile();
         assertTrue(resBase.mkdirs());
         File wackyDir = new File(resBase, "dir;"); // this should not be double-encoded.
         assertTrue(wackyDir.mkdirs());
@@ -228,7 +220,7 @@
         testdir.ensureEmpty();
 
         /* create some content in the docroot */
-        File resBase = testdir.getFile("docroot");
+        File resBase = testdir.getPathFile("docroot").toFile();
         assertTrue(resBase.mkdirs());
 
         File index = new File(resBase, "index.html");
@@ -328,7 +320,7 @@
     public void testWelcome() throws Exception
     {
         testdir.ensureEmpty();
-        File resBase = testdir.getFile("docroot");
+        File resBase = testdir.getPathFile("docroot").toFile();
         FS.ensureDirExists(resBase);
         File inde = new File(resBase, "index.htm");
         File index = new File(resBase, "index.html");
@@ -372,7 +364,7 @@
     public void testWelcomeServlet() throws Exception
     {
         testdir.ensureEmpty();
-        File resBase = testdir.getFile("docroot");
+        File resBase = testdir.getPathFile("docroot").toFile();
         FS.ensureDirExists(resBase);
         File inde = new File(resBase, "index.htm");
         File index = new File(resBase, "index.html");
@@ -420,7 +412,7 @@
     public void testResourceBase() throws Exception
     {
         testdir.ensureEmpty();
-        File resBase = testdir.getFile("docroot");
+        File resBase = testdir.getPathFile("docroot").toFile();
         FS.ensureDirExists(resBase);
         File foobar = new File(resBase, "foobar.txt");
         File link = new File(resBase, "link.txt");
@@ -439,11 +431,13 @@
 
         if (!OS.IS_WINDOWS)
         {
+            context.clearAliasChecks();
+            
             Files.createSymbolicLink(link.toPath(),foobar.toPath());
             response = connector.getResponses("GET /context/link.txt HTTP/1.0\r\n\r\n");
             assertResponseContains("404", response);
             
-            context.addAliasCheck(new ContextHandler.ApproveAliases());
+            context.addAliasCheck(new AllowSymLinkAliasChecker());
             
             response = connector.getResponses("GET /context/link.txt HTTP/1.0\r\n\r\n");
             assertResponseContains("Foo Bar", response);
@@ -454,7 +448,7 @@
     public void testWelcomeExactServlet() throws Exception
     {
         testdir.ensureEmpty();
-        File resBase = testdir.getFile("docroot");
+        File resBase = testdir.getPathFile("docroot").toFile();
         FS.ensureDirExists(resBase);
         File inde = new File(resBase, "index.htm");
         File index = new File(resBase, "index.html");
@@ -502,7 +496,7 @@
     public void testRangeRequests() throws Exception
     {
         testdir.ensureEmpty();
-        File resBase = testdir.getFile("docroot");
+        File resBase = testdir.getPathFile("docroot").toFile();
         FS.ensureDirExists(resBase);
         File data = new File(resBase, "data.txt");
         createFile(data, "01234567890123456789012345678901234567890123456789012345678901234567890123456789");
@@ -649,7 +643,7 @@
     public void testFiltered() throws Exception
     {
         testdir.ensureEmpty();
-        File resBase = testdir.getFile("docroot");
+        File resBase = testdir.getPathFile("docroot").toFile();
         FS.ensureDirExists(resBase);
         File file0 = new File(resBase, "data0.txt");
         createFile(file0, "Hello Text 0");
@@ -667,16 +661,21 @@
         assertResponseContains("Content-Length: 12", response);
         assertResponseNotContains("Extra Info", response);
 
+        server.stop();
         context.addFilter(OutputFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST));
+        server.start();
+        
         response = connector.getResponses("GET /context/data0.txt HTTP/1.0\r\n\r\n");
         assertResponseContains("Content-Length: 2", response); // 20 something long
         assertResponseContains("Extra Info", response);
         assertResponseNotContains("Content-Length: 12", response);
 
+        server.stop();
         context.getServletHandler().setFilterMappings(new FilterMapping[]{});
         context.getServletHandler().setFilters(new FilterHolder[]{});
-
         context.addFilter(WriterFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST));
+        server.start();
+        
         response = connector.getResponses("GET /context/data0.txt HTTP/1.0\r\n\r\n");
         assertResponseContains("Content-Length: 2", response); // 20 something long
         assertResponseContains("Extra Info", response);
@@ -688,7 +687,7 @@
     public void testGzip() throws Exception
     {
         testdir.ensureEmpty();
-        File resBase = testdir.getFile("docroot");
+        File resBase = testdir.getPathFile("docroot").toFile();
         FS.ensureDirExists(resBase);
         File file0 = new File(resBase, "data0.txt");
         createFile(file0, "Hello Text 0");
@@ -702,23 +701,132 @@
         defholder.setInitParameter("redirectWelcome", "false");
         defholder.setInitParameter("welcomeServlets", "false");
         defholder.setInitParameter("gzip", "true");
+        defholder.setInitParameter("etags", "true");
         defholder.setInitParameter("resourceBase", resBasePath);
 
         String response = connector.getResponses("GET /context/data0.txt HTTP/1.0\r\nHost:localhost:8080\r\n\r\n");
         assertResponseContains("Content-Length: 12", response);
+        assertResponseContains("Content-Type: text/plain",response);
         assertResponseContains("Hello Text 0",response);
         assertResponseContains("Vary: Accept-Encoding",response);
+        assertResponseContains("ETag: ",response);
         assertResponseNotContains("Content-Encoding: gzip",response);
+        int e=response.indexOf("ETag: ");
+        String etag = response.substring(e+6,response.indexOf('"',e+11)+1);
+        String etag_gzip = etag.substring(0,etag.length()-1)+"--gzip\"";
         
         response = connector.getResponses("GET /context/data0.txt HTTP/1.0\r\nHost:localhost:8080\r\nAccept-Encoding:gzip\r\n\r\n");
         assertResponseContains("Content-Length: 9", response);
         assertResponseContains("fake gzip",response);
+        assertResponseContains("Content-Type: text/plain",response);
         assertResponseContains("Vary: Accept-Encoding",response);
         assertResponseContains("Content-Encoding: gzip",response);
+        assertResponseContains("ETag: "+etag_gzip,response);
+        
+        response = connector.getResponses("GET /context/data0.txt.gz HTTP/1.0\r\nHost:localhost:8080\r\nAccept-Encoding:gzip\r\n\r\n");
+        assertResponseContains("Content-Length: 9", response);
+        assertResponseContains("fake gzip",response);
+        assertResponseContains("Content-Type: application/gzip",response);
+        assertResponseNotContains("Vary: Accept-Encoding",response);
+        assertResponseNotContains("Content-Encoding: gzip",response);
+        assertResponseNotContains("ETag: "+etag_gzip,response);
+        assertResponseContains("ETag: ",response);   
+        
+        response = connector.getResponses("GET /context/data0.txt.gz HTTP/1.0\r\nHost:localhost:8080\r\nAccept-Encoding:gzip\r\nIf-None-Match: W/\"wobble\"\r\n\r\n");
+        assertResponseContains("Content-Length: 9", response);
+        assertResponseContains("fake gzip",response);
+        assertResponseContains("Content-Type: application/gzip",response);
+        assertResponseNotContains("Vary: Accept-Encoding",response);
+        assertResponseNotContains("Content-Encoding: gzip",response);
+        assertResponseNotContains("ETag: "+etag_gzip,response);
+        assertResponseContains("ETag: ",response);   
+        
+        response = connector.getResponses("GET /context/data0.txt HTTP/1.0\r\nHost:localhost:8080\r\nAccept-Encoding:gzip\r\nIf-None-Match: "+etag_gzip+"\r\n\r\n");
+        assertResponseContains("304 Not Modified", response);
+        assertResponseContains("ETag: "+etag_gzip,response);
+
+        response = connector.getResponses("GET /context/data0.txt HTTP/1.0\r\nHost:localhost:8080\r\nAccept-Encoding:gzip\r\nIf-None-Match: "+etag+"\r\n\r\n");
+        assertResponseContains("304 Not Modified", response);
+        assertResponseContains("ETag: "+etag,response);
+        
+        response = connector.getResponses("GET /context/data0.txt HTTP/1.0\r\nHost:localhost:8080\r\nAccept-Encoding:gzip\r\nIf-None-Match: W/\"foobar\","+etag_gzip+"\r\n\r\n");
+        assertResponseContains("304 Not Modified", response);
+        assertResponseContains("ETag: "+etag_gzip,response);
+
+        response = connector.getResponses("GET /context/data0.txt HTTP/1.0\r\nHost:localhost:8080\r\nAccept-Encoding:gzip\r\nIf-None-Match: W/\"foobar\","+etag+"\r\n\r\n");
+        assertResponseContains("304 Not Modified", response);
+        assertResponseContains("ETag: "+etag,response);
         
     }
 
+    @Test
+    public void testCachedGzip() throws Exception
+    {
+        testdir.ensureEmpty();
+        File resBase = testdir.getPathFile("docroot").toFile();                
+        FS.ensureDirExists(resBase);
+        File file0 = new File(resBase, "data0.txt");
+        createFile(file0, "Hello Text 0");
+        File file0gz = new File(resBase, "data0.txt.gz");
+        createFile(file0gz, "fake gzip");
 
+        String resBasePath = resBase.getAbsolutePath();
+
+        ServletHolder defholder = context.addServlet(DefaultServlet.class, "/");
+        defholder.setInitParameter("dirAllowed", "false");
+        defholder.setInitParameter("redirectWelcome", "false");
+        defholder.setInitParameter("welcomeServlets", "false");
+        defholder.setInitParameter("gzip", "true");
+        defholder.setInitParameter("etags", "true");
+        defholder.setInitParameter("resourceBase", resBasePath);
+        defholder.setInitParameter("maxCachedFiles", "1024");
+        defholder.setInitParameter("maxCachedFileSize", "200000000");
+        defholder.setInitParameter("maxCacheSize", "256000000"); 
+
+        String response = connector.getResponses("GET /context/data0.txt HTTP/1.0\r\nHost:localhost:8080\r\n\r\n");
+        assertResponseContains("Content-Length: 12", response);
+        assertResponseContains("Content-Type: text/plain",response);
+        assertResponseContains("Hello Text 0",response);
+        assertResponseContains("Vary: Accept-Encoding",response);
+        assertResponseContains("ETag: ",response);
+        assertResponseNotContains("Content-Encoding: gzip",response);
+        int e=response.indexOf("ETag: ");
+        String etag = response.substring(e+6,response.indexOf('"',e+11)+1);
+        String etag_gzip = etag.substring(0,etag.length()-1)+"--gzip\"";
+        
+        response = connector.getResponses("GET /context/data0.txt HTTP/1.0\r\nHost:localhost:8080\r\nAccept-Encoding:gzip\r\n\r\n");
+        assertResponseContains("Content-Length: 9", response);
+        assertResponseContains("fake gzip",response);
+        assertResponseContains("Content-Type: text/plain",response);
+        assertResponseContains("Vary: Accept-Encoding",response);
+        assertResponseContains("Content-Encoding: gzip",response);
+        assertResponseContains("ETag: "+etag_gzip,response);
+        
+        response = connector.getResponses("GET /context/data0.txt.gz HTTP/1.0\r\nHost:localhost:8080\r\nAccept-Encoding:gzip\r\n\r\n");
+        assertResponseContains("Content-Length: 9", response);
+        assertResponseContains("fake gzip",response);
+        assertResponseContains("Content-Type: application/gzip",response);
+        assertResponseNotContains("Vary: Accept-Encoding",response);
+        assertResponseNotContains("Content-Encoding: gzip",response);
+        assertResponseNotContains("ETag: "+etag_gzip,response);
+        assertResponseContains("ETag: ",response);
+        
+        response = connector.getResponses("GET /context/data0.txt HTTP/1.0\r\nHost:localhost:8080\r\nAccept-Encoding:gzip\r\nIf-None-Match: "+etag_gzip+"\r\n\r\n");
+        assertResponseContains("304 Not Modified", response);
+        assertResponseContains("ETag: "+etag_gzip,response);
+
+        response = connector.getResponses("GET /context/data0.txt HTTP/1.0\r\nHost:localhost:8080\r\nAccept-Encoding:gzip\r\nIf-None-Match: "+etag+"\r\n\r\n");
+        assertResponseContains("304 Not Modified", response);
+        assertResponseContains("ETag: "+etag,response);
+        
+        response = connector.getResponses("GET /context/data0.txt HTTP/1.0\r\nHost:localhost:8080\r\nAccept-Encoding:gzip\r\nIf-None-Match: W/\"foobar\","+etag_gzip+"\r\n\r\n");
+        assertResponseContains("304 Not Modified", response);
+        assertResponseContains("ETag: "+etag_gzip,response);
+
+        response = connector.getResponses("GET /context/data0.txt HTTP/1.0\r\nHost:localhost:8080\r\nAccept-Encoding:gzip\r\nIf-None-Match: W/\"foobar\","+etag+"\r\n\r\n");
+        assertResponseContains("304 Not Modified", response);
+        assertResponseContains("ETag: "+etag,response);
+    }
 
     @Test
     public void testIfModifiedSmall() throws Exception
@@ -735,7 +843,7 @@
     public void testIfModified(String content) throws Exception
     {
         testdir.ensureEmpty();
-        File resBase = testdir.getFile("docroot");
+        File resBase = testdir.getPathFile("docroot").toFile();
         FS.ensureDirExists(resBase);
         File file = new File(resBase, "file.txt");
 
@@ -788,7 +896,7 @@
     public void testIfETag(String content) throws Exception
     {
         testdir.ensureEmpty();
-        File resBase = testdir.getFile("docroot");
+        File resBase = testdir.getPathFile("docroot").toFile();
         FS.ensureDirExists(resBase);
         File file = new File(resBase, "file.txt");
 
diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DispatcherForwardTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DispatcherForwardTest.java
index 7266601..51e9f0d 100644
--- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DispatcherForwardTest.java
+++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DispatcherForwardTest.java
@@ -21,6 +21,9 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
 import javax.servlet.ServletException;
 import javax.servlet.ServletInputStream;
 import javax.servlet.http.HttpServlet;
@@ -35,13 +38,15 @@
 import org.junit.Assert;
 import org.junit.Test;
 
+
+@SuppressWarnings("serial")
 public class DispatcherForwardTest
 {
     private Server server;
     private LocalConnector connector;
     private HttpServlet servlet1;
     private HttpServlet servlet2;
-    private List<Exception> failures = new ArrayList<>();
+    private List<Throwable> failures = new ArrayList<>();
 
     public void prepare() throws Exception
     {
@@ -57,9 +62,9 @@
     }
 
     @After
-    public void dispose() throws Exception
+    public void dispose() throws Throwable
     {
-        for (Exception failure : failures)
+        for (Throwable failure : failures)
             throw failure;
         server.stop();
     }
@@ -67,30 +72,38 @@
     // Replacement for Assert that allows to check failures after the response has been sent.
     private <S> void checkThat(S item, Matcher<S> matcher)
     {
-        if (!matcher.matches(item))
-            failures.add(new Exception());
+        try
+        {
+            Assert.assertThat(item,matcher);
+        }
+        catch(Throwable th)
+        {
+            failures.add(th);
+        }
     }
 
     @Test
     public void testQueryRetainedByForwardWithoutQuery() throws Exception
     {
-        // 1. request /one?a=1
+        // 1. request /one?a=1%20one
         // 1. forward /two
-        // 2. assert query => a=1
-        // 1. assert query => a=1
+        // 2. assert query => a=1 one
+        // 1. assert query => a=1 one
 
-        final String query1 = "a=1";
+        CountDownLatch latch = new CountDownLatch(1);
+        final String query1 = "a=1%20one";
         servlet1 = new HttpServlet()
         {
             @Override
             protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
             {
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
 
                 req.getRequestDispatcher("/two").forward(req, resp);
 
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
-                checkThat("1", Matchers.equalTo(req.getParameter("a")));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
+                checkThat(req.getParameter("a"),Matchers.equalTo("1 one"));
+                latch.countDown();
             }
         };
         servlet2 = new HttpServlet()
@@ -98,8 +111,8 @@
             @Override
             protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
             {
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
-                checkThat("1", Matchers.equalTo(req.getParameter("a")));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
+                checkThat(req.getParameter("a"),Matchers.equalTo("1 one"));
             }
         };
 
@@ -111,6 +124,7 @@
                 "Connection: close\r\n" +
                 "\r\n";
         String response = connector.getResponses(request);
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
         Assert.assertTrue(response, response.startsWith("HTTP/1.1 200"));
     }
 
@@ -122,21 +136,23 @@
         // 2. assert query => a=2
         // 1. assert query => a=1
 
-        final String query1 = "a=1&b=2";
-        final String query2 = "a=3";
-        final String query3 = "a=3&b=2";
+        CountDownLatch latch = new CountDownLatch(1);
+        final String query1 = "a=1%20one&b=2%20two";
+        final String query2 = "a=3%20three";
+        final String query3 = "a=3%20three&b=2%20two";
         servlet1 = new HttpServlet()
         {
             @Override
             protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
             {
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
 
                 req.getRequestDispatcher("/two?" + query2).forward(req, resp);
 
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
-                checkThat("1", Matchers.equalTo(req.getParameter("a")));
-                checkThat("2", Matchers.equalTo(req.getParameter("b")));
+                checkThat(req.getQueryString(), Matchers.equalTo(query1));
+                checkThat(req.getParameter("a"),Matchers.equalTo("1 one"));
+                checkThat(req.getParameter("b"),Matchers.equalTo("2 two"));
+                latch.countDown();
             }
         };
         servlet2 = new HttpServlet()
@@ -144,9 +160,9 @@
             @Override
             protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
             {
-                checkThat(query3, Matchers.equalTo(req.getQueryString()));
-                checkThat("3", Matchers.equalTo(req.getParameter("a")));
-                checkThat("2", Matchers.equalTo(req.getParameter("b")));
+                checkThat(req.getQueryString(),Matchers.equalTo(query3));
+                checkThat(req.getParameter("a"),Matchers.equalTo("3 three"));
+                checkThat(req.getParameter("b"),Matchers.equalTo("2 two"));
             }
         };
 
@@ -158,6 +174,7 @@
                 "Connection: close\r\n" +
                 "\r\n";
         String response = connector.getResponses(request);
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
         Assert.assertTrue(response, response.startsWith("HTTP/1.1 200"));
     }
 
@@ -169,20 +186,22 @@
         // 2. assert query => a=1&b=2
         // 1. assert query => a=1
 
-        final String query1 = "a=1";
-        final String query2 = "b=2";
-        final String query3 = "b=2&a=1";
+        CountDownLatch latch = new CountDownLatch(1);
+        final String query1 = "a=1%20one";
+        final String query2 = "b=2%20two";
+        final String query3 = "b=2%20two&a=1%20one";
         servlet1 = new HttpServlet()
         {
             @Override
             protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
             {
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
 
                 req.getRequestDispatcher("/two?" + query2).forward(req, resp);
 
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
-                checkThat("1", Matchers.equalTo(req.getParameter("a")));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
+                checkThat(req.getParameter("a"),Matchers.equalTo("1 one"));
+                latch.countDown();
             }
         };
         servlet2 = new HttpServlet()
@@ -190,9 +209,9 @@
             @Override
             protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
             {
-                checkThat(query3, Matchers.equalTo(req.getQueryString()));
-                checkThat("1", Matchers.equalTo(req.getParameter("a")));
-                checkThat("2", Matchers.equalTo(req.getParameter("b")));
+                checkThat(req.getQueryString(),Matchers.equalTo(query3));
+                checkThat(req.getParameter("a"),Matchers.equalTo("1 one"));
+                checkThat(req.getParameter("b"),Matchers.equalTo("2 two"));
             }
         };
 
@@ -204,6 +223,7 @@
                 "Connection: close\r\n" +
                 "\r\n";
         String response = connector.getResponses(request);
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
         Assert.assertTrue(response, response.startsWith("HTTP/1.1 200"));
     }
 
@@ -215,22 +235,24 @@
         // 2. assert query => a=1 + params => a=1,2
         // 1. assert query => a=1 + params => a=1,2
 
-        final String query1 = "a=1";
-        final String form = "a=2";
+        CountDownLatch latch = new CountDownLatch(1);
+        final String query1 = "a=1%20one";
+        final String form = "a=2%20two";
         servlet1 = new HttpServlet()
         {
             @Override
             protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
             {
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
 
                 req.getRequestDispatcher("/two").forward(req, resp);
 
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
                 String[] values = req.getParameterValues("a");
                 checkThat(values, Matchers.notNullValue());
                 checkThat(2, Matchers.equalTo(values.length));
-                checkThat(values, Matchers.arrayContainingInAnyOrder("1", "2"));
+                checkThat(values, Matchers.arrayContainingInAnyOrder("1 one", "2 two"));
+                latch.countDown();
             }
         };
         servlet2 = new HttpServlet()
@@ -238,11 +260,11 @@
             @Override
             protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
             {
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
                 String[] values = req.getParameterValues("a");
                 checkThat(values, Matchers.notNullValue());
                 checkThat(2, Matchers.equalTo(values.length));
-                checkThat(values, Matchers.arrayContainingInAnyOrder("1", "2"));
+                checkThat(values, Matchers.arrayContainingInAnyOrder("1 one", "2 two"));
             }
         };
 
@@ -257,6 +279,7 @@
                 "\r\n" +
                 form;
         String response = connector.getResponses(request);
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
         Assert.assertTrue(response, response.startsWith("HTTP/1.1 200"));
     }
 
@@ -268,23 +291,25 @@
         // 2. assert query => a=3 + params => a=3,2,1
         // 1. assert query => a=1 + params => a=1,2
 
-        final String query1 = "a=1";
-        final String query2 = "a=3";
-        final String form = "a=2";
+        CountDownLatch latch = new CountDownLatch(1);
+        final String query1 = "a=1%20one";
+        final String query2 = "a=3%20three";
+        final String form = "a=2%20two";
         servlet1 = new HttpServlet()
         {
             @Override
             protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
             {
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
 
                 req.getRequestDispatcher("/two?" + query2).forward(req, resp);
 
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
                 String[] values = req.getParameterValues("a");
                 checkThat(values, Matchers.notNullValue());
                 checkThat(2, Matchers.equalTo(values.length));
-                checkThat(values, Matchers.arrayContainingInAnyOrder("1", "2"));
+                checkThat(values, Matchers.arrayContainingInAnyOrder("1 one", "2 two"));
+                latch.countDown();
             }
         };
         servlet2 = new HttpServlet()
@@ -292,11 +317,11 @@
             @Override
             protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
             {
-                checkThat(query2, Matchers.equalTo(req.getQueryString()));
+                checkThat(req.getQueryString(),Matchers.equalTo(query2));
                 String[] values = req.getParameterValues("a");
                 checkThat(values, Matchers.notNullValue());
                 checkThat(3, Matchers.equalTo(values.length));
-                checkThat(values, Matchers.arrayContainingInAnyOrder("3", "2", "1"));
+                checkThat(values, Matchers.arrayContainingInAnyOrder("3 three", "2 two", "1 one"));
             }
         };
 
@@ -311,6 +336,7 @@
                 "\r\n" +
                 form;
         String response = connector.getResponses(request);
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
         Assert.assertTrue(response, response.startsWith("HTTP/1.1 200"));
     }
 
@@ -322,23 +348,25 @@
         // 2. assert query => a=1&c=3 + params => a=1&b=2&c=3
         // 1. assert query => a=1 + params => a=1&b=2
 
-        final String query1 = "a=1";
-        final String query2 = "c=3";
-        final String query3 = "c=3&a=1";
-        final String form = "b=2";
+        CountDownLatch latch = new CountDownLatch(1);
+        final String query1 = "a=1%20one";
+        final String query2 = "c=3%20three";
+        final String query3 = "c=3%20three&a=1%20one";
+        final String form = "b=2%20two";
         servlet1 = new HttpServlet()
         {
             @Override
             protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
             {
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
 
                 req.getRequestDispatcher("/two?" + query2).forward(req, resp);
 
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
-                checkThat("1", Matchers.equalTo(req.getParameter("a")));
-                checkThat("2", Matchers.equalTo(req.getParameter("b")));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
+                checkThat(req.getParameter("a"),Matchers.equalTo("1 one"));
+                checkThat(req.getParameter("b"),Matchers.equalTo("2 two"));
                 checkThat(req.getParameter("c"), Matchers.nullValue());
+                latch.countDown();
             }
         };
         servlet2 = new HttpServlet()
@@ -346,10 +374,10 @@
             @Override
             protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
             {
-                checkThat(query3, Matchers.equalTo(req.getQueryString()));
-                checkThat("1", Matchers.equalTo(req.getParameter("a")));
-                checkThat("2", Matchers.equalTo(req.getParameter("b")));
-                checkThat("3", Matchers.equalTo(req.getParameter("c")));
+                checkThat(req.getQueryString(),Matchers.equalTo(query3));
+                checkThat(req.getParameter("a"),Matchers.equalTo("1 one"));
+                checkThat(req.getParameter("b"),Matchers.equalTo("2 two"));
+                checkThat(req.getParameter("c"),Matchers.equalTo("3 three"));
             }
         };
 
@@ -364,6 +392,7 @@
                 "\r\n" +
                 form;
         String response = connector.getResponses(request);
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
         Assert.assertTrue(response, response.startsWith("HTTP/1.1 200"));
     }
 
@@ -376,25 +405,27 @@
         // 2. assert query => a=1&c=3 + params => a=1&b=2&c=3
         // 1. assert query => a=1 + params => a=1&b=2
 
-        final String query1 = "a=1";
-        final String query2 = "c=3";
-        final String query3 = "c=3&a=1";
-        final String form = "b=2";
+        CountDownLatch latch = new CountDownLatch(1);
+        final String query1 = "a=1%20one";
+        final String query2 = "c=3%20three";
+        final String query3 = "c=3%20three&a=1%20one";
+        final String form = "b=2%20two";
         servlet1 = new HttpServlet()
         {
             @Override
             protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
             {
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
-                checkThat("1", Matchers.equalTo(req.getParameter("a")));
-                checkThat("2", Matchers.equalTo(req.getParameter("b")));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
+                checkThat(req.getParameter("a"),Matchers.equalTo("1 one"));
+                checkThat(req.getParameter("b"),Matchers.equalTo("2 two"));
 
                 req.getRequestDispatcher("/two?" + query2).forward(req, resp);
 
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
-                checkThat("1", Matchers.equalTo(req.getParameter("a")));
-                checkThat("2", Matchers.equalTo(req.getParameter("b")));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
+                checkThat(req.getParameter("a"),Matchers.equalTo("1 one"));
+                checkThat(req.getParameter("b"),Matchers.equalTo("2 two"));
                 checkThat(req.getParameter("c"), Matchers.nullValue());
+                latch.countDown();
             }
         };
         servlet2 = new HttpServlet()
@@ -402,10 +433,10 @@
             @Override
             protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
             {
-                checkThat(query3, Matchers.equalTo(req.getQueryString()));
-                checkThat("1", Matchers.equalTo(req.getParameter("a")));
-                checkThat("2", Matchers.equalTo(req.getParameter("b")));
-                checkThat("3", Matchers.equalTo(req.getParameter("c")));
+                checkThat(req.getQueryString(),Matchers.equalTo(query3));
+                checkThat(req.getParameter("a"),Matchers.equalTo("1 one"));
+                checkThat(req.getParameter("b"),Matchers.equalTo("2 two"));
+                checkThat(req.getParameter("c"),Matchers.equalTo("3 three"));
             }
         };
 
@@ -420,25 +451,28 @@
                 "\r\n" +
                 form;
         String response = connector.getResponses(request);
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
         Assert.assertTrue(response, response.startsWith("HTTP/1.1 200"));
     }
 
     @Test
     public void testContentCanBeReadViaInputStreamAfterForwardWithoutQuery() throws Exception
     {
-        final String query1 = "a=1";
-        final String form = "c=3";
+        CountDownLatch latch = new CountDownLatch(1);
+        final String query1 = "a=1%20one";
+        final String form = "c=3%20three";
         servlet1 = new HttpServlet()
         {
             @Override
             protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
             {
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
 
                 req.getRequestDispatcher("/two").forward(req, resp);
 
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
                 checkThat(req.getParameter("c"), Matchers.nullValue());
+                latch.countDown();
             }
         };
         servlet2 = new HttpServlet()
@@ -446,7 +480,7 @@
             @Override
             protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
             {
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
                 ServletInputStream input = req.getInputStream();
                 for (int i = 0; i < form.length(); ++i)
                     checkThat(form.charAt(i) & 0xFFFF, Matchers.equalTo(input.read()));
@@ -464,27 +498,30 @@
                 "\r\n" +
                 form;
         String response = connector.getResponses(request);
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
         Assert.assertTrue(response, response.startsWith("HTTP/1.1 200"));
     }
 
     @Test
     public void testContentCanBeReadViaInputStreamAfterForwardWithQuery() throws Exception
     {
-        final String query1 = "a=1";
-        final String query2 = "b=2";
-        final String query3 = "b=2&a=1";
-        final String form = "c=3";
+        CountDownLatch latch = new CountDownLatch(1);
+        final String query1 = "a=1%20one";
+        final String query2 = "b=2%20two";
+        final String query3 = "b=2%20two&a=1%20one";
+        final String form = "c=3%20three";
         servlet1 = new HttpServlet()
         {
             @Override
             protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
             {
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
 
                 req.getRequestDispatcher("/two?" + query2).forward(req, resp);
 
-                checkThat(query1, Matchers.equalTo(req.getQueryString()));
+                checkThat(req.getQueryString(),Matchers.equalTo(query1));
                 checkThat(req.getParameter("c"), Matchers.nullValue());
+                latch.countDown();
             }
         };
         servlet2 = new HttpServlet()
@@ -492,7 +529,7 @@
             @Override
             protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
             {
-                checkThat(query3, Matchers.equalTo(req.getQueryString()));
+                checkThat(req.getQueryString(),Matchers.equalTo(query3));
                 ServletInputStream input = req.getInputStream();
                 for (int i = 0; i < form.length(); ++i)
                     checkThat(form.charAt(i) & 0xFFFF, Matchers.equalTo(input.read()));
@@ -511,6 +548,7 @@
                 "\r\n" +
                 form;
         String response = connector.getResponses(request);
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
         Assert.assertTrue(response, response.startsWith("HTTP/1.1 200"));
     }
 
diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DispatcherTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DispatcherTest.java
index 55357bd..a5cdd30 100644
--- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DispatcherTest.java
+++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DispatcherTest.java
@@ -18,11 +18,18 @@
 
 package org.eclipse.jetty.servlet;
 
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.startsWith;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.List;
+
 import javax.servlet.DispatcherType;
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
@@ -57,12 +64,6 @@
 import org.junit.Before;
 import org.junit.Test;
 
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.startsWith;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
 public class DispatcherTest
 {
     private Server _server;
diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/SSLAsyncIOServletTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/SSLAsyncIOServletTest.java
index 12f8ecc..07cd894 100644
--- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/SSLAsyncIOServletTest.java
+++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/SSLAsyncIOServletTest.java
@@ -26,6 +26,7 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Random;
+
 import javax.servlet.AsyncContext;
 import javax.servlet.ServletException;
 import javax.servlet.ServletOutputStream;
diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletContextHandlerTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletContextHandlerTest.java
index 031bdc1..2a312a4 100644
--- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletContextHandlerTest.java
+++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletContextHandlerTest.java
@@ -27,6 +27,7 @@
 
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -48,8 +49,12 @@
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
 import org.eclipse.jetty.server.handler.HandlerList;
+import org.eclipse.jetty.server.handler.HandlerWrapper;
 import org.eclipse.jetty.server.handler.ResourceHandler;
+import org.eclipse.jetty.server.handler.gzip.GzipHandler;
 import org.eclipse.jetty.server.session.SessionHandler;
+import org.eclipse.jetty.util.DecoratedObjectFactory;
+import org.eclipse.jetty.util.Decorator;
 import org.hamcrest.Matchers;
 import org.junit.After;
 import org.junit.Assert;
@@ -172,6 +177,55 @@
         response = _connector.getResponses(request.toString());
         assertResponseContains("Hello World", response);
     }
+    
+    @Test
+    public void testHandlerBeforeServletHandler() throws Exception
+    {
+        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
+        
+        HandlerWrapper extra = new HandlerWrapper();
+        
+        context.getSessionHandler().insertHandler(extra);
+        
+        context.addServlet(TestServlet.class,"/test");
+        context.setContextPath("/");
+        _server.setHandler(context);
+        _server.start();
+
+        StringBuffer request = new StringBuffer();
+        request.append("GET /test HTTP/1.0\n");
+        request.append("Host: localhost\n");
+        request.append("\n");
+
+        String response = _connector.getResponses(request.toString());
+        assertResponseContains("Test", response);
+        
+        assertEquals(extra,context.getSessionHandler().getHandler());
+    }
+    
+    @Test
+    public void testGzipHandlerOption() throws Exception
+    {
+        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS|ServletContextHandler.GZIP);
+        GzipHandler gzip = context.getGzipHandler();        
+        _server.start();
+        assertEquals(context.getSessionHandler(),context.getHandler());
+        assertEquals(gzip,context.getSessionHandler().getHandler());
+        assertEquals(context.getServletHandler(),gzip.getHandler());
+    }
+    
+    @Test
+    public void testGzipHandlerSet() throws Exception
+    {
+        ServletContextHandler context = new ServletContextHandler();
+        context.setSessionHandler(new SessionHandler());
+        context.setGzipHandler(new GzipHandler());
+        GzipHandler gzip = context.getGzipHandler();        
+        _server.start();
+        assertEquals(context.getSessionHandler(),context.getHandler());
+        assertEquals(gzip,context.getSessionHandler().getHandler());
+        assertEquals(context.getServletHandler(),gzip.getHandler());
+    }
 
     @Test
     public void testReplaceServletHandlerWithServlet() throws Exception
@@ -268,7 +322,7 @@
 
         ResourceHandler rh = new ResourceHandler();
 
-        servletContextHandler.setHandler(rh);    
+        servletContextHandler.insertHandler(rh);    
         assertEquals(shandler, servletContextHandler.getServletHandler());
         assertEquals(rh, servletContextHandler.getHandler());
         assertEquals(rh.getHandler(), shandler);
@@ -310,6 +364,61 @@
         Assert.assertThat(response, Matchers.containsString("404 Fell Through"));
         
     }
+    
+    /**
+     * Test behavior of legacy ServletContextHandler.Decorator, with
+     * new DecoratedObjectFactory class
+     * @throws Exception on test failure
+     */
+    @SuppressWarnings("deprecation")
+    @Test
+    public void testLegacyDecorator() throws Exception
+    {
+        ServletContextHandler context = new ServletContextHandler();
+        context.addDecorator(new DummyLegacyDecorator());
+        _server.setHandler(context);
+        
+        context.addServlet(DecoratedObjectFactoryServlet.class, "/objfactory/*");
+        _server.start();
+
+        String response= _connector.getResponses("GET /objfactory/ HTTP/1.0\r\n\r\n");
+        assertThat("Response status code", response, containsString("200 OK"));
+        
+        String expected = String.format("Attribute[%s] = %s", DecoratedObjectFactory.ATTR, DecoratedObjectFactory.class.getName());
+        assertThat("Has context attribute", response, containsString(expected));
+        
+        assertThat("Decorators size", response, containsString("Decorators.size = [1]"));
+        
+        expected = String.format("decorator[] = %s", DummyLegacyDecorator.class.getName());
+        assertThat("Specific Legacy Decorator", response, containsString(expected));
+    }
+    
+    /**
+     * Test behavior of new {@link org.eclipse.jetty.util.Decorator}, with
+     * new DecoratedObjectFactory class
+     * @throws Exception on test failure
+     */
+    @Test
+    public void testUtilDecorator() throws Exception
+    {
+        ServletContextHandler context = new ServletContextHandler();
+        context.getObjectFactory().addDecorator(new DummyUtilDecorator());
+        _server.setHandler(context);
+        
+        context.addServlet(DecoratedObjectFactoryServlet.class, "/objfactory/*");
+        _server.start();
+
+        String response= _connector.getResponses("GET /objfactory/ HTTP/1.0\r\n\r\n");
+        assertThat("Response status code", response, containsString("200 OK"));
+        
+        String expected = String.format("Attribute[%s] = %s", DecoratedObjectFactory.ATTR, DecoratedObjectFactory.class.getName());
+        assertThat("Has context attribute", response, containsString(expected));
+        
+        assertThat("Decorators size", response, containsString("Decorators.size = [1]"));
+        
+        expected = String.format("decorator[] = %s", DummyUtilDecorator.class.getName());
+        assertThat("Specific Legacy Decorator", response, containsString(expected));
+    }
 
     private int assertResponseContains(String expected, String response)
     {
@@ -340,6 +449,66 @@
             writer.write("Hello World");
         }
     }
+    
+    public static class DummyUtilDecorator implements org.eclipse.jetty.util.Decorator
+    {
+        @Override
+        public <T> T decorate(T o)
+        {
+            return o;
+        }
+
+        @Override
+        public void destroy(Object o)
+        {
+        }
+    }
+    
+    public static class DummyLegacyDecorator implements org.eclipse.jetty.servlet.ServletContextHandler.Decorator
+    {
+        @Override
+        public <T> T decorate(T o)
+        {
+            return o;
+        }
+
+        @Override
+        public void destroy(Object o)
+        {
+        }
+    }
+
+    public static class DecoratedObjectFactoryServlet extends HttpServlet
+    {
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+        {
+            resp.setContentType("text/plain");
+            resp.setStatus(HttpServletResponse.SC_OK);
+            PrintWriter out = resp.getWriter();
+            
+            Object obj = req.getServletContext().getAttribute(DecoratedObjectFactory.ATTR);
+            out.printf("Attribute[%s] = %s%n",DecoratedObjectFactory.ATTR,obj.getClass().getName());
+            
+            if (obj instanceof DecoratedObjectFactory)
+            {
+                out.printf("Object is a DecoratedObjectFactory%n");
+                DecoratedObjectFactory objFactory = (DecoratedObjectFactory)obj;
+                List<Decorator> decorators = objFactory.getDecorators();
+                out.printf("Decorators.size = [%d]%n",decorators.size());
+                for (Decorator decorator : decorators)
+                {
+                    out.printf(" decorator[] = %s%n",decorator.getClass().getName());
+                }
+            }
+            else
+            {
+                out.printf("Object is NOT a DecoratedObjectFactory%n");
+            }
+        }
+    }
 
     public static class TestServlet extends HttpServlet
     {
diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletRequestLogTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletRequestLogTest.java
index e135150..05e7159 100644
--- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletRequestLogTest.java
+++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletRequestLogTest.java
@@ -18,8 +18,8 @@
 
 package org.eclipse.jetty.servlet;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -79,7 +79,8 @@
         @Override
         public void log(Request request, Response response)
         {
-            captured.add(String.format("%s %s %s %03d",request.getMethod(),request.getUri().toString(),request.getProtocol(),response.getStatus()));
+            int status = response.getCommittedMetaData().getStatus();
+            captured.add(String.format("%s %s %s %03d",request.getMethod(),request.getRequestURI(),request.getProtocol(),status));
         }
     }
     
@@ -298,6 +299,7 @@
      * Test a RequestLogHandler at the end of a HandlerCollection.
      * This handler chain is setup to look like Jetty versions up to 9.2. 
      * Default configuration.
+     * @throws Exception on test failure
      */
     @Test(timeout=4000)
     public void testLogHandlerCollection() throws Exception
@@ -382,6 +384,7 @@
     /**
      * Test a RequestLogHandler at the end of a HandlerCollection.
      * and also with the default ErrorHandler as server bean in place.
+     * @throws Exception on test failure
      */
     @Test(timeout=4000)
     public void testLogHandlerCollection_ErrorHandler_ServerBean() throws Exception
@@ -469,6 +472,7 @@
     /**
      * Test a RequestLogHandler at the end of a HandlerCollection
      * using servlet specific error page mapping.
+     * @throws Exception on test failure
      */
     @Test(timeout=4000)
     public void testLogHandlerCollection_SimpleErrorPageMapping() throws Exception
@@ -558,6 +562,7 @@
     
     /**
      * Test an alternate (proposed) setup for using RequestLogHandler in a wrapped style
+     * @throws Exception on test failure
      */
     @Test(timeout=4000)
     public void testLogHandlerWrapped() throws Exception
diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletTester.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletTester.java
new file mode 100644
index 0000000..c30a7c0
--- /dev/null
+++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletTester.java
@@ -0,0 +1,260 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.servlet;
+
+import java.net.InetAddress;
+import java.nio.ByteBuffer;
+import java.util.EnumSet;
+import java.util.Enumeration;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.DispatcherType;
+import javax.servlet.Filter;
+import javax.servlet.Servlet;
+
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.LocalConnector;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.util.Attributes;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.component.ContainerLifeCycle;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.resource.Resource;
+
+public class ServletTester extends ContainerLifeCycle
+{
+    private static final Logger LOG = Log.getLogger(ServletTester.class);
+    
+    private final Server _server=new Server();
+    private final LocalConnector _connector=new LocalConnector(_server);
+    private final ServletContextHandler _context;
+    
+    public Server getServer()
+    {
+        return _server;
+    }
+    
+    public LocalConnector getConnector()
+    {
+        return _connector;
+    }
+    
+    public void setVirtualHosts(String[] vhosts)
+    {
+        _context.setVirtualHosts(vhosts);
+    }
+
+    public void addVirtualHosts(String[] virtualHosts)
+    {
+        _context.addVirtualHosts(virtualHosts);
+    }
+
+    public ServletHolder addServlet(String className, String pathSpec)
+    {
+        return _context.addServlet(className,pathSpec);
+    }
+
+    public ServletHolder addServlet(Class<? extends Servlet> servlet, String pathSpec)
+    {
+        return _context.addServlet(servlet,pathSpec);
+    }
+
+    public void addServlet(ServletHolder servlet, String pathSpec)
+    {
+        _context.addServlet(servlet,pathSpec);
+    }
+
+    public void addFilter(FilterHolder holder, String pathSpec, EnumSet<DispatcherType> dispatches)
+    {
+        _context.addFilter(holder,pathSpec,dispatches);
+    }
+
+    public FilterHolder addFilter(Class<? extends Filter> filterClass, String pathSpec, EnumSet<DispatcherType> dispatches)
+    {
+        return _context.addFilter(filterClass,pathSpec,dispatches);
+    }
+
+    public FilterHolder addFilter(String filterClass, String pathSpec, EnumSet<DispatcherType> dispatches)
+    {
+        return _context.addFilter(filterClass,pathSpec,dispatches);
+    }
+
+    public Object getAttribute(String name)
+    {
+        return _context.getAttribute(name);
+    }
+
+    public Enumeration<String> getAttributeNames()
+    {
+        return _context.getAttributeNames();
+    }
+
+    public Attributes getAttributes()
+    {
+        return _context.getAttributes();
+    }
+
+    public String getContextPath()
+    {
+        return _context.getContextPath();
+    }
+
+    public String getInitParameter(String name)
+    {
+        return _context.getInitParameter(name);
+    }
+
+    public String setInitParameter(String name, String value)
+    {
+        return _context.setInitParameter(name,value);
+    }
+
+    public Enumeration<String> getInitParameterNames()
+    {
+        return _context.getInitParameterNames();
+    }
+
+    public Map<String, String> getInitParams()
+    {
+        return _context.getInitParams();
+    }
+
+    public void removeAttribute(String name)
+    {
+        _context.removeAttribute(name);
+    }
+
+    public void setAttribute(String name, Object value)
+    {
+        _context.setAttribute(name,value);
+    }
+
+    public void setContextPath(String contextPath)
+    {
+        _context.setContextPath(contextPath);
+    }
+
+    public Resource getBaseResource()
+    {
+        return _context.getBaseResource();
+    }
+
+    public String getResourceBase()
+    {
+        return _context.getResourceBase();
+    }
+
+    public void setResourceBase(String resourceBase)
+    {
+        _context.setResourceBase(resourceBase);
+    }
+
+    public ServletTester()
+    {
+        this("/",ServletContextHandler.SECURITY|ServletContextHandler.SESSIONS);
+    }
+
+    public ServletTester(String ctxPath)
+    {
+        this(ctxPath,ServletContextHandler.SECURITY|ServletContextHandler.SESSIONS);
+    }
+
+    public ServletTester(String contextPath,int options)
+    {
+        _context=new ServletContextHandler(_server,contextPath,options);
+        _server.setConnectors(new Connector[]{_connector});
+        addBean(_server);
+    }
+
+    public ServletContextHandler getContext()
+    {
+        return _context;
+    }
+
+    public String getResponses(String request) throws Exception
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("Request: {}",request);
+        }
+        return _connector.getResponses(request);
+    }
+    
+    public String getResponses(String request, long idleFor,TimeUnit units) throws Exception
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("Request: {}",request);
+        }
+        return _connector.getResponses(request, idleFor, units);
+    }
+    
+    public ByteBuffer getResponses(ByteBuffer request) throws Exception
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("Request (Buffer): {}",BufferUtil.toUTF8String(request));
+        }
+        return _connector.getResponses(request);
+    }
+    
+    public ByteBuffer getResponses(ByteBuffer requestsBuffer,long idleFor,TimeUnit units) throws Exception
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("Requests (Buffer): {}",BufferUtil.toUTF8String(requestsBuffer));
+        }
+        return _connector.getResponses(requestsBuffer, idleFor, units);
+    }
+
+    /** Create a port based connector.
+     * This methods adds a port connector to the server
+     * @param localhost true if connector should use localhost, false for default host behavior.
+     * @return A URL to access the server via the connector.
+     * @throws Exception on test failure
+     */
+    public String createConnector(boolean localhost) throws Exception
+    {
+        ServerConnector connector = new ServerConnector(_server);
+        if (localhost)
+            connector.setHost("127.0.0.1");
+        _server.addConnector(connector);
+        if (_server.isStarted())
+            connector.start();
+        else
+            connector.open();
+
+        return "http://"+(localhost?"127.0.0.1":
+            InetAddress.getLocalHost().getHostAddress()
+        )+":"+connector.getLocalPort();
+    }
+
+    public LocalConnector createLocalConnector()
+    {
+        LocalConnector connector = new LocalConnector(_server);
+        _server.addConnector(connector);
+        return connector;
+    }
+
+
+
+}
diff --git a/jetty-servlet/src/test/resources/jetty-logging.properties b/jetty-servlet/src/test/resources/jetty-logging.properties
index 50696d6..ed4316e 100644
--- a/jetty-servlet/src/test/resources/jetty-logging.properties
+++ b/jetty-servlet/src/test/resources/jetty-logging.properties
@@ -1,5 +1,7 @@
 org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
+org.eclipse.jetty.LEVEL=INFO
 #org.eclipse.jetty.LEVEL=DEBUG
 #org.eclipse.jetty.server.LEVEL=DEBUG
 #org.eclipse.jetty.servlet.LEVEL=DEBUG
 #org.eclipse.jetty.io.ChannelEndPoint.LEVEL=DEBUG
+#org.eclipse.jetty.server.DebugListener.LEVEL=DEBUG
\ No newline at end of file
diff --git a/jetty-servlets/pom.xml b/jetty-servlets/pom.xml
index 3d54664..f384cff 100644
--- a/jetty-servlets/pom.xml
+++ b/jetty-servlets/pom.xml
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>jetty-project</artifactId>
     <groupId>org.eclipse.jetty</groupId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-servlets</artifactId>
@@ -16,52 +16,6 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-                <Import-Package>javax.servlet.*;version="[2.6.0,3.2)",*</Import-Package>
-              </instructions>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <!--
-        Required for OSGI
-        -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
         <configuration>
@@ -109,6 +63,20 @@
       <scope>test</scope>
     </dependency>
     <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-http</artifactId>
+      <version>${project.version}</version>
+      <classifier>tests</classifier>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-servlet</artifactId>
+      <version>${project.version}</version>
+      <classifier>tests</classifier>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>org.eclipse.jetty.toolchain</groupId>
       <artifactId>jetty-test-helper</artifactId>
       <scope>test</scope>
diff --git a/jetty-servlets/src/main/config/modules/servlets.mod b/jetty-servlets/src/main/config/modules/servlets.mod
index e8724b8..2e977c0 100644
--- a/jetty-servlets/src/main/config/modules/servlets.mod
+++ b/jetty-servlets/src/main/config/modules/servlets.mod
@@ -2,6 +2,7 @@
 # Jetty Servlets Module
 #
 
+
 [depend]
 servlet
 
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/AsyncGzipFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/AsyncGzipFilter.java
index 65c1db9..0437cdd 100644
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/AsyncGzipFilter.java
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/AsyncGzipFilter.java
@@ -18,555 +18,7 @@
 
 package org.eclipse.jetty.servlets;
 
-import java.io.File;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.regex.Pattern;
-import java.util.zip.Deflater;
-
-import javax.servlet.DispatcherType;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRegistration;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.http.HttpField;
-import org.eclipse.jetty.http.HttpFields;
-import org.eclipse.jetty.http.HttpGenerator;
-import org.eclipse.jetty.http.HttpHeader;
-import org.eclipse.jetty.http.HttpMethod;
-import org.eclipse.jetty.http.MimeTypes;
-import org.eclipse.jetty.server.HttpChannel;
-import org.eclipse.jetty.server.HttpOutput;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.servlets.gzip.GzipFactory;
-import org.eclipse.jetty.servlets.gzip.GzipHttpOutput;
-import org.eclipse.jetty.util.URIUtil;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/* ------------------------------------------------------------ */
-/** Async GZIP Filter
- * This filter is a gzip filter using jetty internal mechanism to apply gzip compression
- * to output that is compatible with async IO and does not need to wrap the response nor output stream.
- * The filter will gzip the content of a response if: <ul>
- * <li>The filter is mapped to a matching path</li>
- * <li>accept-encoding header is set to either gzip, deflate or a combination of those</li>
- * <li>The response status code is >=200 and <300
- * <li>The content length is unknown or more than the <code>minGzipSize</code> initParameter or the minGzipSize is 0(default)</li>
- * <li>If a list of mimeTypes is set by the <code>mimeTypes</code> init parameter, then the Content-Type is in the list.</li>
- * <li>If no mimeType list is set, then the content-type is not in the list defined by <code>excludedMimeTypes</code></li>
- * <li>No content-encoding is specified by the resource</li>
- * </ul>
- *
- * <p>
- * Compressing the content can greatly improve the network bandwidth usage, but at a cost of memory and
- * CPU cycles. If this filter is mapped for static content, then use of efficient direct NIO may be
- * prevented, thus use of the gzip mechanism of the {@link org.eclipse.jetty.servlet.DefaultServlet} is
- * advised instead.
- * </p>
- * <p>
- * This filter extends {@link UserAgentFilter} and if the the initParameter <code>excludedAgents</code>
- * is set to a comma separated list of user agents, then these agents will be excluded from gzip content.
- * </p>
- * <p>Init Parameters:</p>
- * <dl>
- * <dt>bufferSize</dt>       <dd>The output buffer size. Defaults to 8192. Be careful as values <= 0 will lead to an
- *                            {@link IllegalArgumentException}.
- *                            See: {@link java.util.zip.GZIPOutputStream#GZIPOutputStream(java.io.OutputStream, int)}
- *                            and: {@link java.util.zip.DeflaterOutputStream#DeflaterOutputStream(java.io.OutputStream, Deflater, int)}
- * </dd>
- * <dt>minGzipSize</dt>       <dd>Content will only be compressed if content length is either unknown or greater
- *                            than <code>minGzipSize</code>.
- * </dd>
- * <dt>deflateCompressionLevel</dt>       <dd>The compression level used for deflate compression. (0-9).
- *                            See: {@link java.util.zip.Deflater#Deflater(int, boolean)}
- * </dd>
- * <dt>deflateNoWrap</dt>       <dd>The noWrap setting for deflate compression. Defaults to true. (true/false)
- *                            See: {@link java.util.zip.Deflater#Deflater(int, boolean)}
- * </dd>
- * <dt>methods</dt>       <dd>Comma separated list of HTTP methods to compress. If not set, only GET requests are compressed.
- *  </dd>
- * <dt>mimeTypes</dt>       <dd>Comma separated list of mime types to compress. If it is not set, then the excludedMimeTypes list is used.
- * </dd>
- * <dt>excludedMimeTypes</dt>       <dd>Comma separated list of mime types to never compress. If not set, then the default is the commonly known
- * image, video, audio and compressed types.
- * </dd>
-
- * <dt>excludedAgents</dt>       <dd>Comma separated list of user agents to exclude from compression. Does a
- *                            {@link String#contains(CharSequence)} to check if the excluded agent occurs
- *                            in the user-agent header. If it does -> no compression
- * </dd>
- * <dt>excludeAgentPatterns</dt>       <dd>Same as excludedAgents, but accepts regex patterns for more complex matching.
- * </dd>
- * <dt>excludePaths</dt>       <dd>Comma separated list of paths to exclude from compression.
- *                            Does a {@link String#startsWith(String)} comparison to check if the path matches.
- *                            If it does match -> no compression. To match subpaths use <code>excludePathPatterns</code>
- *                            instead.
- * </dd>
- * <dt>excludePathPatterns</dt>       <dd>Same as excludePath, but accepts regex patterns for more complex matching.
- * </dd>
- * <dt>vary</dt>       <dd>Set to the value of the Vary header sent with responses that could be compressed.  By default it is 
- *                            set to 'Vary: Accept-Encoding, User-Agent' since IE6 is excluded by default from the excludedAgents. 
- *                            If user-agents are not to be excluded, then this can be set to 'Vary: Accept-Encoding'.  Note also 
- *                            that shared caches may cache copies of a resource that is varied by User-Agent - one per variation of 
- *                            the User-Agent, unless the cache does some normalization of the UA string.
- * </dd>                         
- * <dt>checkGzExists</dt>       <dd>If set to true, the filter check if a static resource with ".gz" appended exists.  If so then
- *                            the normal processing is done so that the default servlet can send  the pre existing gz content. If not
- *                            set, defaults to the same as the default servlet "gzip" parameter.
- *  </dd>
- *  </dl>
- */
-public class AsyncGzipFilter extends UserAgentFilter implements GzipFactory
+@Deprecated
+public class AsyncGzipFilter extends GzipFilter
 {
-    private static final Logger LOG = Log.getLogger(GzipFilter.class);
-    public final static String GZIP = "gzip";
-    public static final String DEFLATE = "deflate";
-    public final static String ETAG_GZIP="--gzip";
-    public final static String ETAG = "o.e.j.s.GzipFilter.ETag";
-    public final static int DEFAULT_MIN_GZIP_SIZE=256;
-
-    protected ServletContext _context;
-    protected final Set<String> _mimeTypes=new HashSet<>();
-    protected boolean _excludeMimeTypes;
-    protected int _bufferSize=32*1024;
-    protected int _minGzipSize=DEFAULT_MIN_GZIP_SIZE;
-    protected int _deflateCompressionLevel=Deflater.DEFAULT_COMPRESSION;
-    protected boolean _deflateNoWrap = true;
-    protected boolean _checkGzExists = true;
-    
-    // non-static, as other GzipFilter instances may have different configurations
-    protected final ThreadLocal<Deflater> _deflater = new ThreadLocal<Deflater>();
-
-    protected final static ThreadLocal<byte[]> _buffer= new ThreadLocal<byte[]>();
-
-    protected final Set<String> _methods=new HashSet<String>();
-    protected Set<String> _excludedAgents;
-    protected Set<Pattern> _excludedAgentPatterns;
-    protected Set<String> _excludedPaths;
-    protected Set<Pattern> _excludedPathPatterns;
-    protected HttpField _vary=new HttpGenerator.CachedHttpField(HttpHeader.VARY,HttpHeader.ACCEPT_ENCODING+", "+HttpHeader.USER_AGENT);
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.UserAgentFilter#init(javax.servlet.FilterConfig)
-     */
-    @Override
-    public void init(FilterConfig filterConfig) throws ServletException
-    {
-        super.init(filterConfig);
-
-        _context=filterConfig.getServletContext();
-        
-        String tmp=filterConfig.getInitParameter("bufferSize");
-        if (tmp!=null)
-            _bufferSize=Integer.parseInt(tmp);
-        LOG.debug("{} bufferSize={}",this,_bufferSize);
-
-        tmp=filterConfig.getInitParameter("minGzipSize");
-        if (tmp!=null)
-            _minGzipSize=Integer.parseInt(tmp);
-        LOG.debug("{} minGzipSize={}",this,_minGzipSize);
-
-        tmp=filterConfig.getInitParameter("deflateCompressionLevel");
-        if (tmp!=null)
-            _deflateCompressionLevel=Integer.parseInt(tmp);
-        LOG.debug("{} deflateCompressionLevel={}",this,_deflateCompressionLevel);
-
-        tmp=filterConfig.getInitParameter("deflateNoWrap");
-        if (tmp!=null)
-            _deflateNoWrap=Boolean.parseBoolean(tmp);
-        LOG.debug("{} deflateNoWrap={}",this,_deflateNoWrap);
-
-        tmp=filterConfig.getInitParameter("checkGzExists");
-        if (tmp!=null)
-            _checkGzExists=Boolean.parseBoolean(tmp);
-        else
-        {
-            // Look to Default servlet for default
-            ServletRegistration dftServlet = _context.getServletRegistration("default");
-            if (dftServlet!=null && dftServlet.getInitParameter("gzip")!=null)
-                _checkGzExists=Boolean.parseBoolean(dftServlet.getInitParameter("gzip"));
-        }
-        LOG.debug("{} checkGzExists={}",this,_checkGzExists);
-        
-        tmp=filterConfig.getInitParameter("methods");
-        if (tmp!=null)
-        {
-            StringTokenizer tok = new StringTokenizer(tmp,",",false);
-            while (tok.hasMoreTokens())
-                _methods.add(tok.nextToken().trim().toUpperCase(Locale.ENGLISH));
-        }
-        else
-            _methods.add(HttpMethod.GET.asString());
-        LOG.debug("{} methods={}",this,_methods);
-        
-        tmp=filterConfig.getInitParameter("mimeTypes");
-        if (tmp==null)
-        {
-            _excludeMimeTypes=true;
-            tmp=filterConfig.getInitParameter("excludedMimeTypes");
-            if (tmp==null)
-            {
-                for (String type:MimeTypes.getKnownMimeTypes())
-                {
-                    if (type.equals("image/svg+xml")) //always compressable (unless .svgz file)
-                        continue;
-                    if (type.startsWith("image/")||
-                        type.startsWith("audio/")||
-                        type.startsWith("video/"))
-                        _mimeTypes.add(type);
-                }
-                _mimeTypes.add("application/compress");
-                _mimeTypes.add("application/zip");
-                _mimeTypes.add("application/gzip");
-            }
-            else
-            {
-                StringTokenizer tok = new StringTokenizer(tmp,",",false);
-                while (tok.hasMoreTokens())
-                    _mimeTypes.add(tok.nextToken().trim());
-            }
-        }
-        else
-        {
-            StringTokenizer tok = new StringTokenizer(tmp,",",false);
-            while (tok.hasMoreTokens())
-                _mimeTypes.add(tok.nextToken().trim());
-        }
-        LOG.debug("{} mimeTypes={}",this,_mimeTypes);
-        LOG.debug("{} excludeMimeTypes={}",this,_excludeMimeTypes);
-        tmp=filterConfig.getInitParameter("excludedAgents");
-        if (tmp!=null)
-        {
-            _excludedAgents=new HashSet<String>();
-            StringTokenizer tok = new StringTokenizer(tmp,",",false);
-            while (tok.hasMoreTokens())
-               _excludedAgents.add(tok.nextToken().trim());
-        }
-        LOG.debug("{} excludedAgents={}",this,_excludedAgents);
-
-        tmp=filterConfig.getInitParameter("excludeAgentPatterns");
-        if (tmp!=null)
-        {
-            _excludedAgentPatterns=new HashSet<Pattern>();
-            StringTokenizer tok = new StringTokenizer(tmp,",",false);
-            while (tok.hasMoreTokens())
-                _excludedAgentPatterns.add(Pattern.compile(tok.nextToken().trim()));
-        }
-        LOG.debug("{} excludedAgentPatterns={}",this,_excludedAgentPatterns);
-
-        tmp=filterConfig.getInitParameter("excludePaths");
-        if (tmp!=null)
-        {
-            _excludedPaths=new HashSet<String>();
-            StringTokenizer tok = new StringTokenizer(tmp,",",false);
-            while (tok.hasMoreTokens())
-                _excludedPaths.add(tok.nextToken().trim());
-        }
-        LOG.debug("{} excludedPaths={}",this,_excludedPaths);
-
-        tmp=filterConfig.getInitParameter("excludePathPatterns");
-        if (tmp!=null)
-        {
-            _excludedPathPatterns=new HashSet<Pattern>();
-            StringTokenizer tok = new StringTokenizer(tmp,",",false);
-            while (tok.hasMoreTokens())
-                _excludedPathPatterns.add(Pattern.compile(tok.nextToken().trim()));
-        }
-        LOG.debug("{} excludedPathPatterns={}",this,_excludedPathPatterns);
-        
-        tmp=filterConfig.getInitParameter("vary");
-        if (tmp!=null)
-            _vary=new HttpGenerator.CachedHttpField(HttpHeader.VARY,tmp);
-        LOG.debug("{} vary={}",this,_vary);
-        
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.UserAgentFilter#destroy()
-     */
-    @Override
-    public void destroy()
-    {
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.UserAgentFilter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
-     */
-    @Override
-    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
-        throws IOException, ServletException
-    {
-        LOG.debug("{} doFilter {}",this,req);
-        HttpServletRequest request=(HttpServletRequest)req;
-        HttpServletResponse response=(HttpServletResponse)res;
-        HttpChannel<?> channel = HttpChannel.getCurrentHttpChannel();
-        
-        // Have we already started compressing this response?
-        if (req.getDispatcherType()!=DispatcherType.REQUEST)
-        {
-            HttpOutput out = channel.getResponse().getHttpOutput();
-            if (out instanceof GzipHttpOutput && ((GzipHttpOutput)out).mightCompress())
-            {
-                LOG.debug("{} already might compress {}",this,request);
-                super.doFilter(request,response,chain);
-                return;
-            }
-        }
-
-        // If not a supported method or it is an Excluded URI or an excluded UA - no Vary because no matter what client, this URI is always excluded
-        String requestURI = request.getRequestURI();
-        if (!_methods.contains(request.getMethod()))
-        {
-            LOG.debug("{} excluded by method {}",this,request);
-            super.doFilter(request,response,chain);
-            return;
-        }
-        
-        if (isExcludedPath(requestURI))
-        {
-            LOG.debug("{} excluded by path {}",this,request);
-            super.doFilter(request,response,chain);
-            return;
-        }
-
-        // Exclude non compressible mime-types known from URI extension. - no Vary because no matter what client, this URI is always excluded
-        if (_mimeTypes.size()>0 && _excludeMimeTypes)
-        {
-            String mimeType = _context.getMimeType(request.getRequestURI());
-
-            if (mimeType!=null)
-            {
-                mimeType = MimeTypes.getContentTypeWithoutCharset(mimeType);
-                if (_mimeTypes.contains(mimeType))
-                {
-                    LOG.debug("{} excluded by path suffix {}",this,request);
-                    // handle normally without setting vary header
-                    super.doFilter(request,response,chain);
-                    return;
-                }
-            }
-        }
-
-        //If the Content-Encoding is already set, then we won't compress
-        if (response.getHeader("Content-Encoding") != null)
-        {
-            super.doFilter(request,response,chain);
-            return;
-        }
-        
-        if (_checkGzExists && request.getServletContext()!=null)
-        {
-            String path=request.getServletContext().getRealPath(URIUtil.addPaths(request.getServletPath(),request.getPathInfo()));
-            if (path!=null)
-            {
-                File gz=new File(path+".gz");
-                if (gz.exists())
-                {
-                    LOG.debug("{} gzip exists {}",this,request);
-                    // allow default servlet to handle
-                    super.doFilter(request,response,chain);
-                    return;
-                }
-            }
-        }
-        
-        // Special handling for etags
-        String etag = request.getHeader("If-None-Match"); 
-        if (etag!=null)
-        {
-            if (etag.contains(ETAG_GZIP))
-                request.setAttribute(ETAG,etag.replace(ETAG_GZIP,""));
-        }
-
-        HttpOutput out = channel.getResponse().getHttpOutput();
-        if (!(out instanceof GzipHttpOutput))
-        {
-            if (out.getClass()!=HttpOutput.class)
-                throw new IllegalStateException();
-            channel.getResponse().setHttpOutput(out = new GzipHttpOutput(channel));
-        }
-        
-        GzipHttpOutput cout=(GzipHttpOutput)out;
-        
-        try
-        {
-            cout.mightCompress(this);
-            super.doFilter(request,response,chain);
-        }
-        catch(Throwable e)
-        {
-            LOG.debug("{} excepted {}",this,request,e);
-            if (!response.isCommitted())
-            {
-                cout.resetBuffer();
-                cout.noCompressionIfPossible();
-            }
-            throw e;
-        }
-    }
-
-
-    /**
-     * Checks to see if the userAgent is excluded
-     *
-     * @param ua
-     *            the user agent
-     * @return boolean true if excluded
-     */
-    private boolean isExcludedAgent(String ua)
-    {
-        if (ua == null)
-            return false;
-
-        if (_excludedAgents != null)
-        {
-            if (_excludedAgents.contains(ua))
-            {
-                return true;
-            }
-        }
-        if (_excludedAgentPatterns != null)
-        {
-            for (Pattern pattern : _excludedAgentPatterns)
-            {
-                if (pattern.matcher(ua).matches())
-                {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Checks to see if the path is excluded
-     *
-     * @param requestURI
-     *            the request uri
-     * @return boolean true if excluded
-     */
-    private boolean isExcludedPath(String requestURI)
-    {
-        if (requestURI == null)
-            return false;
-        if (_excludedPaths != null)
-        {
-            for (String excludedPath : _excludedPaths)
-            {
-                if (requestURI.startsWith(excludedPath))
-                {
-                    return true;
-                }
-            }
-        }
-        if (_excludedPathPatterns != null)
-        {
-            for (Pattern pattern : _excludedPathPatterns)
-            {
-                if (pattern.matcher(requestURI).matches())
-                {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public HttpField getVaryField()
-    {
-        return _vary;
-    }
-
-    @Override
-    public Deflater getDeflater(Request request, long content_length)
-    {
-        String ua = getUserAgent(request);
-        if (ua!=null && isExcludedAgent(ua))
-        {
-            LOG.debug("{} excluded user agent {}",this,request);
-            return null;
-        }
-        
-        if (content_length>=0 && content_length<_minGzipSize)
-        {
-            LOG.debug("{} excluded minGzipSize {}",this,request);
-            return null;
-        }
-        
-        String accept = request.getHttpFields().get(HttpHeader.ACCEPT_ENCODING);
-        if (accept==null)
-        {
-            LOG.debug("{} excluded !accept {}",this,request);
-            return null;
-        }
-        
-        boolean gzip=false;
-        if (GZIP.equals(accept) || accept.startsWith("gzip,"))
-            gzip=true;
-        else
-        {
-            List<String> list=HttpFields.qualityList(request.getHttpFields().getValues(HttpHeader.ACCEPT_ENCODING.asString(),","));
-            for (String a:list)
-            {
-                if (GZIP.equalsIgnoreCase(HttpFields.valueParameters(a,null)))
-                {
-                    gzip=true;
-                    break;
-                }
-            }
-        }
-        
-        if (!gzip)
-        {
-            LOG.debug("{} excluded not gzip accept {}",this,request);
-            return null;
-        }
-        
-        Deflater df = _deflater.get();
-        if (df==null)
-            df=new Deflater(_deflateCompressionLevel,_deflateNoWrap);        
-        else
-            _deflater.set(null);
-        
-        return df;
-    }
-
-    @Override
-    public void recycle(Deflater deflater)
-    {
-        deflater.reset();
-        if (_deflater.get()==null)
-            _deflater.set(deflater);
-        
-    }
-    
-    @Override
-    public boolean isExcludedMimeType(String mimetype)
-    {
-        return _mimeTypes.contains(mimetype) == _excludeMimeTypes;
-    }
-
-    @Override
-    public int getBufferSize()
-    {
-        return _bufferSize;
-    }
-    
-    
 }
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CGI.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CGI.java
index 87679c4..a88abed 100644
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CGI.java
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CGI.java
@@ -44,11 +44,9 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
-//-----------------------------------------------------------------------------
 /**
  * CGI Servlet.
  * <p>
- * 
  * The following init parameters are used to configure this servlet:
  * <dl>
  * <dt>cgibinResourceBase</dt>
@@ -69,7 +67,6 @@
  * <dt>ignoreExitState</dt>
  * <dd>If true then do not act on a non-zero exec exit status")</dd>
  * </dl>
- * 
  */
 public class CGI extends HttpServlet
 {
@@ -546,13 +543,18 @@
 
         /**
          * Set a name/value pair, null values will be treated as an empty String
+         * @param name the name
+         * @param value the value
          */
         public void set(String name, String value)
         {
             envMap.put(name,name + "=" + StringUtil.nonNull(value));
         }
 
-        /** Get representation suitable for passing to exec. */
+        /** 
+         * Get representation suitable for passing to exec. 
+         * @return the env map as an array 
+         */
         public String[] getEnvArray()
         {
             return envMap.values().toArray(new String[envMap.size()]);
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CloseableDoSFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CloseableDoSFilter.java
index eac9696..ff92dd5 100644
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CloseableDoSFilter.java
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CloseableDoSFilter.java
@@ -21,7 +21,6 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.eclipse.jetty.server.HttpChannel;
 import org.eclipse.jetty.server.Request;
 
 /* ------------------------------------------------------------ */
@@ -35,7 +34,7 @@
     @Override
     protected void closeConnection(HttpServletRequest request, HttpServletResponse response, Thread thread)
     {
-        Request base_request=(request instanceof Request)?(Request)request:HttpChannel.getCurrentHttpChannel().getRequest();
+        Request base_request=Request.getBaseRequest(request);
         base_request.getHttpChannel().getEndPoint().close();
     }
 }
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/ConcatServlet.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/ConcatServlet.java
index 5207f85..61ae202 100644
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/ConcatServlet.java
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/ConcatServlet.java
@@ -44,13 +44,13 @@
  * relative to the context root.  So these script tags:</p>
  * <pre>
  * &lt;script type="text/javascript" src="../js/behaviour.js"&gt;&lt;/script&gt;
- * &lt;script type="text/javascript" src="../js/ajax.js&/chat/chat.js"&gt;&lt;/script&gt;
+ * &lt;script type="text/javascript" src="../js/ajax.js"&gt;&lt;/script&gt;
  * &lt;script type="text/javascript" src="../chat/chat.js"&gt;&lt;/script&gt;
  * </pre>
  * <p>can be replaced with the single tag (with the {@code ConcatServlet}
  * mapped to {@code /concat}):</p>
  * <pre>
- * &lt;script type="text/javascript" src="../concat?/js/behaviour.js&/js/ajax.js&/chat/chat.js"&gt;&lt;/script&gt;
+ * &lt;script type="text/javascript" src="../concat?/js/behaviour.js&amp;/js/ajax.js&amp;/chat/chat.js"&gt;&lt;/script&gt;
  * </pre>
  * <p>The {@link ServletContext#getMimeType(String)} method is used to determine the
  * mime type of each resource. If the types of all resources do not match, then a 415
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CrossOriginFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CrossOriginFilter.java
index e1ba9b9..a4f8cab 100644
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CrossOriginFilter.java
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CrossOriginFilter.java
@@ -26,6 +26,7 @@
 import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
@@ -35,48 +36,76 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
 /**
- * <p>Implementation of the
- * <a href="http://www.w3.org/TR/cors/">cross-origin resource sharing</a>.</p>
- * <p>A typical example is to use this filter to allow cross-domain
+ * Implementation of the
+ * <a href="http://www.w3.org/TR/cors/">cross-origin resource sharing</a>.
+ * <p>
+ * A typical example is to use this filter to allow cross-domain
  * <a href="http://cometd.org">cometd</a> communication using the standard
  * long polling transport instead of the JSONP transport (that is less
- * efficient and less reactive to failures).</p>
- * <p>This filter allows the following configuration parameters:
- * <ul>
- * <li><b>allowedOrigins</b>, a comma separated list of origins that are
+ * efficient and less reactive to failures).
+ * <p>
+ * This filter allows the following configuration parameters:
+ * <dl>
+ * <dt>allowedOrigins</dt>
+ * <dd>a comma separated list of origins that are
  * allowed to access the resources. Default value is <b>*</b>, meaning all
- * origins.<br />
+ * origins.
+ * <p>
  * If an allowed origin contains one or more * characters (for example
  * http://*.domain.com), then "*" characters are converted to ".*", "."
  * characters are escaped to "\." and the resulting allowed origin
- * interpreted as a regular expression.<br />
+ * interpreted as a regular expression.
+ * <p>
  * Allowed origins can therefore be more complex expressions such as
  * https?://*.domain.[a-z]{3} that matches http or https, multiple subdomains
- * and any 3 letter top-level domain (.com, .net, .org, etc.).</li>
- * <li><b>allowedMethods</b>, a comma separated list of HTTP methods that
+ * and any 3 letter top-level domain (.com, .net, .org, etc.).</dd>
+ * 
+ * <dt>allowedTimingOrigins</dt>
+ * <dd>a comma separated list of origins that are
+ * allowed to time the resource. Default value is the empty string, meaning
+ * no origins.
+ * <p>
+ * The check whether the timing header is set, will be performed only if
+ * the user gets general access to the resource using the <b>allowedOrigins</b>.
+ *
+ * <dt>allowedMethods</dt>
+ * <dd>a comma separated list of HTTP methods that
  * are allowed to be used when accessing the resources. Default value is
- * <b>GET,POST,HEAD</b></li>
- * <li><b>allowedHeaders</b>, a comma separated list of HTTP headers that
+ * <b>GET,POST,HEAD</b></dd>
+ * 
+ * 
+ * <dt>allowedHeaders</dt>
+ * <dd>a comma separated list of HTTP headers that
  * are allowed to be specified when accessing the resources. Default value
  * is <b>X-Requested-With,Content-Type,Accept,Origin</b>. If the value is a single "*",
- * this means that any headers will be accepted.</li>
- * <li><b>preflightMaxAge</b>, the number of seconds that preflight requests
+ * this means that any headers will be accepted.</dd>
+ * 
+ * <dt>preflightMaxAge</dt>
+ * <dd>the number of seconds that preflight requests
  * can be cached by the client. Default value is <b>1800</b> seconds, or 30
- * minutes</li>
- * <li><b>allowCredentials</b>, a boolean indicating if the resource allows
- * requests with credentials. Default value is <b>true</b></li>
- * <li><b>exposedHeaders</b>, a comma separated list of HTTP headers that
+ * minutes</dd>
+ * 
+ * <dt>allowCredentials</dt>
+ * <dd>a boolean indicating if the resource allows
+ * requests with credentials. Default value is <b>true</b></dd>
+ * 
+ * <dt>exposedHeaders</dt>
+ * <dd>a comma separated list of HTTP headers that
  * are allowed to be exposed on the client. Default value is the
- * <b>empty list</b></li>
- * <li><b>chainPreflight</b>, if true preflight requests are chained to their
+ * <b>empty list</b></dd>
+ * 
+ * <dt>chainPreflight</dt>
+ * <dd>if true preflight requests are chained to their
  * target resource for normal handling (as an OPTION request).  Otherwise the
- * filter will response to the preflight. Default is <b>true</b>.</li>
- * </ul></p>
- * <p>A typical configuration could be:</p>
+ * filter will response to the preflight. Default is <b>true</b>.</dd>
+ * 
+ * </dl>
+ * A typical configuration could be:
  * <pre>
  * &lt;web-app ...&gt;
  *     ...
@@ -107,8 +136,10 @@
     public static final String ACCESS_CONTROL_MAX_AGE_HEADER = "Access-Control-Max-Age";
     public static final String ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER = "Access-Control-Allow-Credentials";
     public static final String ACCESS_CONTROL_EXPOSE_HEADERS_HEADER = "Access-Control-Expose-Headers";
+    public static final String TIMING_ALLOW_ORIGIN_HEADER = "Timing-Allow-Origin";
     // Implementation constants
     public static final String ALLOWED_ORIGINS_PARAM = "allowedOrigins";
+    public static final String ALLOWED_TIMING_ORIGINS_PARAM = "allowedTimingOrigins";
     public static final String ALLOWED_METHODS_PARAM = "allowedMethods";
     public static final String ALLOWED_HEADERS_PARAM = "allowedHeaders";
     public static final String PREFLIGHT_MAX_AGE_PARAM = "preflightMaxAge";
@@ -117,13 +148,17 @@
     public static final String OLD_CHAIN_PREFLIGHT_PARAM = "forwardPreflight";
     public static final String CHAIN_PREFLIGHT_PARAM = "chainPreflight";
     private static final String ANY_ORIGIN = "*";
+    private static final String DEFAULT_ALLOWED_ORIGINS = "*";
+    private static final String DEFAULT_ALLOWED_TIMING_ORIGINS = "";
     private static final List<String> SIMPLE_HTTP_METHODS = Arrays.asList("GET", "POST", "HEAD");
     private static final List<String> DEFAULT_ALLOWED_METHODS = Arrays.asList("GET", "POST", "HEAD");
     private static final List<String> DEFAULT_ALLOWED_HEADERS = Arrays.asList("X-Requested-With", "Content-Type", "Accept", "Origin");
 
     private boolean anyOriginAllowed;
+    private boolean anyTimingOriginAllowed;
     private boolean anyHeadersAllowed;
     private List<String> allowedOrigins = new ArrayList<String>();
+    private List<String> allowedTimingOrigins = new ArrayList<String>();
     private List<String> allowedMethods = new ArrayList<String>();
     private List<String> allowedHeaders = new ArrayList<String>();
     private List<String> exposedHeaders = new ArrayList<String>();
@@ -134,32 +169,16 @@
     public void init(FilterConfig config) throws ServletException
     {
         String allowedOriginsConfig = config.getInitParameter(ALLOWED_ORIGINS_PARAM);
-        if (allowedOriginsConfig == null)
-            allowedOriginsConfig = "*";
-        String[] allowedOrigins = allowedOriginsConfig.split(",");
-        for (String allowedOrigin : allowedOrigins)
-        {
-            allowedOrigin = allowedOrigin.trim();
-            if (allowedOrigin.length() > 0)
-            {
-                if (ANY_ORIGIN.equals(allowedOrigin))
-                {
-                    anyOriginAllowed = true;
-                    this.allowedOrigins.clear();
-                    break;
-                }
-                else
-                {
-                    this.allowedOrigins.add(allowedOrigin);
-                }
-            }
-        }
+        String allowedTimingOriginsConfig = config.getInitParameter(ALLOWED_TIMING_ORIGINS_PARAM);
+        
+        anyOriginAllowed = generateAllowedOrigins(allowedOrigins, allowedOriginsConfig, DEFAULT_ALLOWED_ORIGINS);
+        anyTimingOriginAllowed = generateAllowedOrigins(allowedTimingOrigins, allowedTimingOriginsConfig, DEFAULT_ALLOWED_TIMING_ORIGINS);
 
         String allowedMethodsConfig = config.getInitParameter(ALLOWED_METHODS_PARAM);
         if (allowedMethodsConfig == null)
             allowedMethods.addAll(DEFAULT_ALLOWED_METHODS);
         else
-            allowedMethods.addAll(Arrays.asList(allowedMethodsConfig.split(",")));
+            allowedMethods.addAll(Arrays.asList(StringUtil.csvSplit(allowedMethodsConfig)));
 
         String allowedHeadersConfig = config.getInitParameter(ALLOWED_HEADERS_PARAM);
         if (allowedHeadersConfig == null)
@@ -167,7 +186,7 @@
         else if ("*".equals(allowedHeadersConfig))
             anyHeadersAllowed = true;
         else
-            allowedHeaders.addAll(Arrays.asList(allowedHeadersConfig.split(",")));
+            allowedHeaders.addAll(Arrays.asList(StringUtil.csvSplit(allowedHeadersConfig)));
 
         String preflightMaxAgeConfig = config.getInitParameter(PREFLIGHT_MAX_AGE_PARAM);
         if (preflightMaxAgeConfig == null)
@@ -189,7 +208,7 @@
         String exposedHeadersConfig = config.getInitParameter(EXPOSED_HEADERS_PARAM);
         if (exposedHeadersConfig == null)
             exposedHeadersConfig = "";
-        exposedHeaders.addAll(Arrays.asList(exposedHeadersConfig.split(",")));
+        exposedHeaders.addAll(Arrays.asList(StringUtil.csvSplit(exposedHeadersConfig)));
 
         String chainPreflightConfig = config.getInitParameter(OLD_CHAIN_PREFLIGHT_PARAM);
         if (chainPreflightConfig != null)
@@ -204,6 +223,7 @@
         {
             LOG.debug("Cross-origin filter configuration: " +
                             ALLOWED_ORIGINS_PARAM + " = " + allowedOriginsConfig + ", " +
+                            ALLOWED_TIMING_ORIGINS_PARAM + " = " + allowedTimingOriginsConfig + ", " +
                             ALLOWED_METHODS_PARAM + " = " + allowedMethodsConfig + ", " +
                             ALLOWED_HEADERS_PARAM + " = " + allowedHeadersConfig + ", " +
                             PREFLIGHT_MAX_AGE_PARAM + " = " + preflightMaxAgeConfig + ", " +
@@ -214,6 +234,29 @@
         }
     }
 
+    private boolean generateAllowedOrigins(List<String> allowedOriginStore, String allowedOriginsConfig, String defaultOrigin) 
+    {
+        if (allowedOriginsConfig == null)
+            allowedOriginsConfig = defaultOrigin;
+        String[] allowedOrigins = StringUtil.csvSplit(allowedOriginsConfig);
+        for (String allowedOrigin : allowedOrigins)
+        {
+            if (allowedOrigin.length() > 0)
+            {
+                if (ANY_ORIGIN.equals(allowedOrigin))
+                {
+                    allowedOriginStore.clear();
+                    return true;
+                }
+                else
+                {
+                    allowedOriginStore.add(allowedOrigin);
+                }
+            }
+        }
+        return false;
+    }
+    
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
     {
         handle((HttpServletRequest)request, (HttpServletResponse)response, chain);
@@ -225,7 +268,7 @@
         // Is it a cross origin request ?
         if (origin != null && isEnabled(request))
         {
-            if (originMatches(origin))
+            if (anyOriginAllowed || originMatches(allowedOrigins, origin))
             {
                 if (isSimpleRequest(request))
                 {
@@ -246,6 +289,15 @@
                     LOG.debug("Cross-origin request to {} is a non-simple cross-origin request", request.getRequestURI());
                     handleSimpleResponse(request, response, origin);
                 }
+
+                if (anyTimingOriginAllowed || originMatches(allowedTimingOrigins, origin))
+                {
+                    response.setHeader(TIMING_ALLOW_ORIGIN_HEADER, origin);
+                }
+                else
+                {
+                    LOG.debug("Cross-origin request to " + request.getRequestURI() + " with origin " + origin + " does not match allowed timing origins " + allowedTimingOrigins);
+                }
             }
             else
             {
@@ -260,12 +312,12 @@
     {
         // WebSocket clients such as Chrome 5 implement a version of the WebSocket
         // protocol that does not accept extra response headers on the upgrade response
-        for (Enumeration connections = request.getHeaders("Connection"); connections.hasMoreElements();)
+        for (Enumeration<String> connections = request.getHeaders("Connection"); connections.hasMoreElements();)
         {
             String connection = (String)connections.nextElement();
             if ("Upgrade".equalsIgnoreCase(connection))
             {
-                for (Enumeration upgrades = request.getHeaders("Upgrade"); upgrades.hasMoreElements();)
+                for (Enumeration<String>  upgrades = request.getHeaders("Upgrade"); upgrades.hasMoreElements();)
                 {
                     String upgrade = (String)upgrades.nextElement();
                     if ("WebSocket".equalsIgnoreCase(upgrade))
@@ -276,11 +328,8 @@
         return true;
     }
 
-    private boolean originMatches(String originList)
+    private boolean originMatches(List<String> allowedOrigins, String originList)
     {
-        if (anyOriginAllowed)
-            return true;
-
         if (originList.trim().length() == 0)
             return false;
 
@@ -400,7 +449,7 @@
             return Collections.emptyList();
 
         List<String> requestedHeaders = new ArrayList<String>();
-        String[] headers = accessControlRequestHeaders.split(",");
+        String[] headers = StringUtil.csvSplit(accessControlRequestHeaders);
         for (String header : headers)
         {
             String h = header.trim();
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/DataRateLimitedServlet.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/DataRateLimitedServlet.java
index 8bf0d40..82a522f 100644
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/DataRateLimitedServlet.java
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/DataRateLimitedServlet.java
@@ -63,7 +63,7 @@
 {
     private static final long serialVersionUID = -4771757707068097025L;
     private int buffersize=8192;
-    private int pause=100;
+    private long pauseNS=TimeUnit.MILLISECONDS.toNanos(100);
     ScheduledThreadPoolExecutor scheduler;
     private final ConcurrentHashMap<String, ByteBuffer> cache=new ConcurrentHashMap<>();
     
@@ -76,7 +76,7 @@
             buffersize=Integer.parseInt(tmp);
         tmp = getInitParameter("pause");
         if (tmp!=null)
-            pause=Integer.parseInt(tmp);
+            pauseNS=TimeUnit.MILLISECONDS.toNanos(Integer.parseInt(tmp));
         tmp = getInitParameter("pool");
         int pool=tmp==null?Runtime.getRuntime().availableProcessors():Integer.parseInt(tmp);
         
@@ -205,7 +205,7 @@
                 
                 // Schedule a timer callback to pause writing.  Because isReady() is not called,
                 // a onWritePossible callback is no scheduled.
-                scheduler.schedule(this,pause,TimeUnit.MILLISECONDS);
+                scheduler.schedule(this,pauseNS,TimeUnit.NANOSECONDS);
             }
         }
         
@@ -261,7 +261,7 @@
         {            
             // If we are able to write
             if(out.isReady())
-            {
+            {   
                 // Position our buffers limit to allow only buffersize bytes to be written
                 int l=content.position()+buffersize;
                 // respect the ultimate limit
@@ -276,7 +276,7 @@
                     async.complete();
                     return;
                 }
-
+                
                 // write our limited buffer.  This will be an asynchronous write
                 // and will always return immediately without blocking.  If a subsequent
                 // call to out.isReady() returns false, then this onWritePossible method
@@ -284,8 +284,8 @@
                 out.write(content);
 
                 // Schedule a timer callback to pause writing.  Because isReady() is not called,
-                // a onWritePossible callback is no scheduled.
-                scheduler.schedule(this,pause,TimeUnit.MILLISECONDS);
+                // a onWritePossible callback is not scheduled.
+                scheduler.schedule(this,pauseNS,TimeUnit.NANOSECONDS);
             }
         }
         
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/DoSFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/DoSFilter.java
index f1e3315..8a13382 100644
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/DoSFilter.java
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/DoSFilter.java
@@ -52,6 +52,7 @@
 import javax.servlet.http.HttpSessionEvent;
 
 import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.annotation.ManagedAttribute;
 import org.eclipse.jetty.util.annotation.ManagedObject;
 import org.eclipse.jetty.util.annotation.ManagedOperation;
@@ -63,7 +64,6 @@
 
 /**
  * Denial of Service filter
- * <p/>
  * <p>
  * This filter is useful for limiting
  * exposure to abuse from request flooding, whether malicious, or as a result of
@@ -81,53 +81,44 @@
  * The {@link #extractUserId(ServletRequest request)} function should be
  * implemented, in order to uniquely identify authenticated users.
  * <p>
- * The following init parameters control the behavior of the filter:<dl>
- * <p/>
+ * The following init parameters control the behavior of the filter:
+ * <dl>
  * <dt>maxRequestsPerSec</dt>
  * <dd>the maximum number of requests from a connection per
  * second. Requests in excess of this are first delayed,
  * then throttled.</dd>
- * <p/>
  * <dt>delayMs</dt>
  * <dd>is the delay given to all requests over the rate limit,
  * before they are considered at all. -1 means just reject request,
  * 0 means no delay, otherwise it is the delay.</dd>
- * <p/>
  * <dt>maxWaitMs</dt>
  * <dd>how long to blocking wait for the throttle semaphore.</dd>
- * <p/>
  * <dt>throttledRequests</dt>
  * <dd>is the number of requests over the rate limit able to be
  * considered at once.</dd>
- * <p/>
  * <dt>throttleMs</dt>
  * <dd>how long to async wait for semaphore.</dd>
- * <p/>
  * <dt>maxRequestMs</dt>
  * <dd>how long to allow this request to run.</dd>
- * <p/>
  * <dt>maxIdleTrackerMs</dt>
  * <dd>how long to keep track of request rates for a connection,
  * before deciding that the user has gone away, and discarding it</dd>
- * <p/>
  * <dt>insertHeaders</dt>
  * <dd>if true , insert the DoSFilter headers into the response. Defaults to true.</dd>
- * <p/>
  * <dt>trackSessions</dt>
  * <dd>if true, usage rate is tracked by session if a session exists. Defaults to true.</dd>
- * <p/>
  * <dt>remotePort</dt>
  * <dd>if true and session tracking is not used, then rate is tracked by IP+port (effectively connection). Defaults to false.</dd>
- * <p/>
  * <dt>ipWhitelist</dt>
  * <dd>a comma-separated list of IP addresses that will not be rate limited</dd>
- * <p/>
  * <dt>managedAttr</dt>
  * <dd>if set to true, then this servlet is set as a {@link ServletContext} attribute with the
  * filter name as the attribute name.  This allows context external mechanism (eg JMX via {@link ContextHandler#MANAGED_ATTRIBUTES}) to
  * manage the configuration of the filter.</dd>
+ * <dt>tooManyCode</dt>
+ * <dd>The status code to send if there are too many requests.  By default is 429 (too many requests), but 503 (Unavailable) is 
+ * another option</dd>
  * </dl>
- * </p>
  * <p>
  * This filter should be configured for {@link DispatcherType#REQUEST} and {@link DispatcherType#ASYNC} and with 
  * <code>&lt;async-supported&gt;true&lt;/async-supported&gt;</code>.
@@ -168,6 +159,7 @@
     static final String REMOTE_PORT_INIT_PARAM = "remotePort";
     static final String IP_WHITELIST_INIT_PARAM = "ipWhitelist";
     static final String ENABLED_INIT_PARAM = "enabled";
+    static final String TOO_MANY_CODE = "tooManyCode";
 
     private static final int USER_AUTH = 2;
     private static final int USER_SESSION = 2;
@@ -178,6 +170,7 @@
     private final String _resumed = "DoSFilter@" + Integer.toHexString(hashCode()) + ".RESUMED";
     private final ConcurrentHashMap<String, RateTracker> _rateTrackers = new ConcurrentHashMap<>();
     private final List<String> _whitelist = new CopyOnWriteArrayList<>();
+    private int _tooManyCode;
     private volatile long _delayMs;
     private volatile long _throttleMs;
     private volatile long _maxWaitMs;
@@ -265,7 +258,10 @@
 
         parameter = filterConfig.getInitParameter(ENABLED_INIT_PARAM);
         setEnabled(parameter == null || Boolean.parseBoolean(parameter));
-
+        
+        parameter = filterConfig.getInitParameter(TOO_MANY_CODE);
+        setTooManyCode(parameter==null?429:Integer.parseInt(parameter));
+        
         _scheduler = startScheduler();
 
         ServletContext context = filterConfig.getServletContext();
@@ -336,7 +332,7 @@
                     LOG.warn("DOS ALERT: Request rejected ip={}, session={}, user={}", request.getRemoteAddr(), request.getRequestedSessionId(), request.getUserPrincipal());
                     if (insertHeaders)
                         response.addHeader("DoSFilter", "unavailable");
-                    response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
+                    response.sendError(getTooManyCode());
                     return;
                 }
                 case 0:
@@ -419,36 +415,43 @@
                     LOG.debug("Rejecting {}", request);
                 if (isInsertHeaders())
                     response.addHeader("DoSFilter", "unavailable");
-                response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
+                response.sendError(getTooManyCode());
             }
         }
         catch (InterruptedException e)
         {
-            response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
+            LOG.ignore(e);
+            response.sendError(getTooManyCode());
         }
         finally
         {
             if (accepted)
             {
-                // Wake up the next highest priority request.
-                for (int p = _queues.length - 1; p >= 0; --p)
+                try
                 {
-                    AsyncContext asyncContext = _queues[p].poll();
-                    if (asyncContext != null)
+                    // Wake up the next highest priority request.
+                    for (int p = _queues.length - 1; p >= 0; --p)
                     {
-                        ServletRequest candidate = asyncContext.getRequest();
-                        Boolean suspended = (Boolean)candidate.getAttribute(_suspended);
-                        if (suspended == Boolean.TRUE)
+                        AsyncContext asyncContext = _queues[p].poll();
+                        if (asyncContext != null)
                         {
-                            if (LOG.isDebugEnabled())
-                                LOG.debug("Resuming {}", request);
-                            candidate.setAttribute(_resumed, Boolean.TRUE);
-                            asyncContext.dispatch();
-                            break;
+                            ServletRequest candidate = asyncContext.getRequest();
+                            Boolean suspended = (Boolean)candidate.getAttribute(_suspended);
+                            if (suspended == Boolean.TRUE)
+                            {
+                                if (LOG.isDebugEnabled())
+                                    LOG.debug("Resuming {}", request);
+                                candidate.setAttribute(_resumed, Boolean.TRUE);
+                                asyncContext.dispatch();
+                                break;
+                            }
                         }
                     }
                 }
-                _passes.release();
+                finally
+                {
+                    _passes.release();
+                }
             }
         }
     }
@@ -539,12 +542,12 @@
      * track of this connection's request rate. If this is not the first request
      * from this connection, return the existing object with the stored stats.
      * If it is the first request, then create a new request tracker.
-     * <p/>
+     * <p>
      * Assumes that each connection has an identifying characteristic, and goes
      * through them in order, taking the first that matches: user id (logged
      * in), session id, client IP address. Unidentifiable connections are lumped
      * into one.
-     * <p/>
+     * <p>
      * When a session expires, its rate tracker is automatically deleted.
      *
      * @param request the current request
@@ -792,6 +795,7 @@
     /**
      * Get delay (in milliseconds) that is applied to all requests
      * over the rate limit, before they are considered at all.
+     * @return the delay in milliseconds
      */
     @ManagedAttribute("delay applied to all requests over the rate limit (in ms)")
     public long getDelayMs()
@@ -1008,6 +1012,16 @@
     {
         _enabled = enabled;
     }
+    
+    public int getTooManyCode()
+    {
+        return _tooManyCode;
+    }
+
+    public void setTooManyCode(int tooManyCode)
+    {
+        _tooManyCode = tooManyCode;
+    }
 
     /**
      * Get a list of IP addresses that will not be rate limited.
@@ -1036,7 +1050,7 @@
     public void setWhitelist(String commaSeparatedList)
     {
         List<String> result = new ArrayList<>();
-        for (String address : commaSeparatedList.split(","))
+        for (String address : StringUtil.csvSplit(commaSeparatedList))
             addWhitelistAddress(result, address);
         clearWhitelist();
         _whitelist.addAll(result);
@@ -1107,6 +1121,7 @@
         }
 
         /**
+         * @param now the time now (in milliseconds)
          * @return the current calculated request rate over the last second
          */
         public boolean isRateExceeded(long now)
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/GzipFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/GzipFilter.java
index 24738a1..9b7faf7 100644
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/GzipFilter.java
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/GzipFilter.java
@@ -18,634 +18,36 @@
 
 package org.eclipse.jetty.servlets;
 
-import java.io.File;
 import java.io.IOException;
-import java.io.OutputStream;
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.regex.Pattern;
-import java.util.zip.Deflater;
 
-import javax.servlet.AsyncEvent;
-import javax.servlet.AsyncListener;
+import javax.servlet.Filter;
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
-import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.http.HttpMethod;
-import org.eclipse.jetty.http.MimeTypes;
-import org.eclipse.jetty.servlets.gzip.AbstractCompressedStream;
-import org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper;
-import org.eclipse.jetty.servlets.gzip.DeflatedOutputStream;
-import org.eclipse.jetty.servlets.gzip.GzipOutputStream;
-import org.eclipse.jetty.util.URIUtil;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
 
 /* ------------------------------------------------------------ */
-/** GZIP Filter
- * This filter will gzip or deflate the content of a response if: <ul>
- * <li>The filter is mapped to a matching path</li>
- * <li>accept-encoding header is set to either gzip, deflate or a combination of those</li>
- * <li>The response status code is >=200 and <300
- * <li>The content length is unknown or more than the <code>minGzipSize</code> initParameter or the minGzipSize is 0(default)</li>
- * <li>If a list of mimeTypes is set by the <code>mimeTypes</code> init parameter, then the Content-Type is in the list.</li>
- * <li>If no mimeType list is set, then the content-type is not in the list defined by <code>excludedMimeTypes</code></li>
- * <li>No content-encoding is specified by the resource</li>
- * </ul>
- *
- * <p>
- * If both gzip and deflate are specified in the accept-encoding header, then gzip will be used.
- * </p>
- * <p>
- * Compressing the content can greatly improve the network bandwidth usage, but at a cost of memory and
- * CPU cycles. If this filter is mapped for static content, then use of efficient direct NIO may be
- * prevented, thus use of the gzip mechanism of the {@link org.eclipse.jetty.servlet.DefaultServlet} is
- * advised instead.
- * </p>
- * <p>
- * This filter extends {@link UserAgentFilter} and if the the initParameter <code>excludedAgents</code>
- * is set to a comma separated list of user agents, then these agents will be excluded from gzip content.
- * </p>
- * <p>Init Parameters:</p>
- * <dl>
- * <dt>bufferSize</dt>       <dd>The output buffer size. Defaults to 8192. Be careful as values <= 0 will lead to an
- *                            {@link IllegalArgumentException}.
- *                            See: {@link java.util.zip.GZIPOutputStream#GZIPOutputStream(java.io.OutputStream, int)}
- *                            and: {@link java.util.zip.DeflaterOutputStream#DeflaterOutputStream(java.io.OutputStream, Deflater, int)}
- * </dd>
- * <dt>minGzipSize</dt>       <dd>Content will only be compressed if content length is either unknown or greater
- *                            than <code>minGzipSize</code>.
- * </dd>
- * <dt>deflateCompressionLevel</dt>       <dd>The compression level used for deflate compression. (0-9).
- *                            See: {@link java.util.zip.Deflater#Deflater(int, boolean)}
- * </dd>
- * <dt>deflateNoWrap</dt>       <dd>The noWrap setting for deflate compression. Defaults to true. (true/false)
- *                            See: {@link java.util.zip.Deflater#Deflater(int, boolean)}
- * </dd>
- * <dt>methods</dt>       <dd>Comma separated list of HTTP methods to compress. If not set, only GET requests are compressed.
- *  </dd>
- * <dt>mimeTypes</dt>       <dd>Comma separated list of mime types to compress. If it is not set, then the excludedMimeTypes list is used.
- * </dd>
- * <dt>excludedMimeTypes</dt>       <dd>Comma separated list of mime types to never compress. If not set, then the default is the commonly known
- * image, video, audio and compressed types.
- * </dd>
-
- * <dt>excludedAgents</dt>       <dd>Comma separated list of user agents to exclude from compression. Does a
- *                            {@link String#contains(CharSequence)} to check if the excluded agent occurs
- *                            in the user-agent header. If it does -> no compression
- * </dd>
- * <dt>excludeAgentPatterns</dt>       <dd>Same as excludedAgents, but accepts regex patterns for more complex matching.
- * </dd>
- * <dt>excludePaths</dt>       <dd>Comma separated list of paths to exclude from compression.
- *                            Does a {@link String#startsWith(String)} comparison to check if the path matches.
- *                            If it does match -> no compression. To match subpaths use <code>excludePathPatterns</code>
- *                            instead.
- * </dd>
- * <dt>excludePathPatterns</dt>       <dd>Same as excludePath, but accepts regex patterns for more complex matching.
- * </dd>
- * <dt>vary</dt>       <dd>Set to the value of the Vary header sent with responses that could be compressed.  By default it is 
- *                            set to 'Vary: Accept-Encoding, User-Agent' since IE6 is excluded by default from the excludedAgents. 
- *                            If user-agents are not to be excluded, then this can be set to 'Vary: Accept-Encoding'.  Note also 
- *                            that shared caches may cache copies of a resource that is varied by User-Agent - one per variation of 
- *                            the User-Agent, unless the cache does some normalization of the UA string.
- * </dd>                         
- * <dt>checkGzExists</dt>       <dd>If set to true, the filter check if a static resource with ".gz" appended exists.  If so then
- *                            the normal processing is done so that the default servlet can send  the pre existing gz content.
- *  </dd>
- *  </dl>
+/** 
  */
-public class GzipFilter extends UserAgentFilter
+
+@Deprecated
+public class GzipFilter implements Filter
 {
-    private static final Logger LOG = Log.getLogger(GzipFilter.class);
-    public final static String GZIP="gzip";
-    public final static String ETAG_GZIP="--gzip\"";
-    public final static String DEFLATE="deflate";
-    public final static String ETAG_DEFLATE="--deflate\"";
-    public final static String ETAG="o.e.j.s.GzipFilter.ETag";
-
-    protected ServletContext _context;
-    protected final Set<String> _mimeTypes=new HashSet<>();
-    protected boolean _excludeMimeTypes;
-    protected int _bufferSize=8192;
-    protected int _minGzipSize=256;
-    protected int _deflateCompressionLevel=Deflater.DEFAULT_COMPRESSION;
-    protected boolean _deflateNoWrap = true;
-    protected boolean _checkGzExists = true;
-    
-    // non-static, as other GzipFilter instances may have different configurations
-    protected final ThreadLocal<Deflater> _deflater = new ThreadLocal<Deflater>();
-
-    protected final static ThreadLocal<byte[]> _buffer= new ThreadLocal<byte[]>();
-
-    protected final Set<String> _methods=new HashSet<String>();
-    protected Set<String> _excludedAgents;
-    protected Set<Pattern> _excludedAgentPatterns;
-    protected Set<String> _excludedPaths;
-    protected Set<Pattern> _excludedPathPatterns;
-    protected String _vary="Accept-Encoding, User-Agent";
-    
-    private static final int STATE_SEPARATOR = 0;
-    private static final int STATE_Q = 1;
-    private static final int STATE_QVALUE = 2;
-    private static final int STATE_DEFAULT = 3;
-
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.UserAgentFilter#init(javax.servlet.FilterConfig)
-     */
     @Override
     public void init(FilterConfig filterConfig) throws ServletException
-    {
-        super.init(filterConfig);
-
-        _context=filterConfig.getServletContext();
-        
-        String tmp=filterConfig.getInitParameter("bufferSize");
-        if (tmp!=null)
-            _bufferSize=Integer.parseInt(tmp);
-
-        tmp=filterConfig.getInitParameter("minGzipSize");
-        if (tmp!=null)
-            _minGzipSize=Integer.parseInt(tmp);
-
-        tmp=filterConfig.getInitParameter("deflateCompressionLevel");
-        if (tmp!=null)
-            _deflateCompressionLevel=Integer.parseInt(tmp);
-
-        tmp=filterConfig.getInitParameter("deflateNoWrap");
-        if (tmp!=null)
-            _deflateNoWrap=Boolean.parseBoolean(tmp);
-
-        tmp=filterConfig.getInitParameter("checkGzExists");
-        if (tmp!=null)
-            _checkGzExists=Boolean.parseBoolean(tmp);
-        
-        tmp=filterConfig.getInitParameter("methods");
-        if (tmp!=null)
-        {
-            StringTokenizer tok = new StringTokenizer(tmp,",",false);
-            while (tok.hasMoreTokens())
-                _methods.add(tok.nextToken().trim().toUpperCase(Locale.ENGLISH));
-        }
-        else
-            _methods.add(HttpMethod.GET.asString());
-        
-        tmp=filterConfig.getInitParameter("mimeTypes");
-        if (tmp==null)
-        {
-            _excludeMimeTypes=true;
-            tmp=filterConfig.getInitParameter("excludedMimeTypes");
-            if (tmp==null)
-            {
-                for (String type:MimeTypes.getKnownMimeTypes())
-                {
-                    if (type.equals("image/svg+xml")) //always compressable (unless .svgz file)
-                        continue;
-                    if (type.startsWith("image/")||
-                        type.startsWith("audio/")||
-                        type.startsWith("video/"))
-                        _mimeTypes.add(type);
-                }
-                _mimeTypes.add("application/compress");
-                _mimeTypes.add("application/zip");
-                _mimeTypes.add("application/gzip");
-            }
-            else
-            {
-                StringTokenizer tok = new StringTokenizer(tmp,",",false);
-                while (tok.hasMoreTokens())
-                    _mimeTypes.add(tok.nextToken().trim());
-            }
-        }
-        else
-        {
-            StringTokenizer tok = new StringTokenizer(tmp,",",false);
-            while (tok.hasMoreTokens())
-                _mimeTypes.add(tok.nextToken().trim());
-        }
-        tmp=filterConfig.getInitParameter("excludedAgents");
-        if (tmp!=null)
-        {
-            _excludedAgents=new HashSet<String>();
-            StringTokenizer tok = new StringTokenizer(tmp,",",false);
-            while (tok.hasMoreTokens())
-               _excludedAgents.add(tok.nextToken().trim());
-        }
-
-        tmp=filterConfig.getInitParameter("excludeAgentPatterns");
-        if (tmp!=null)
-        {
-            _excludedAgentPatterns=new HashSet<Pattern>();
-            StringTokenizer tok = new StringTokenizer(tmp,",",false);
-            while (tok.hasMoreTokens())
-                _excludedAgentPatterns.add(Pattern.compile(tok.nextToken().trim()));
-        }
-
-        tmp=filterConfig.getInitParameter("excludePaths");
-        if (tmp!=null)
-        {
-            _excludedPaths=new HashSet<String>();
-            StringTokenizer tok = new StringTokenizer(tmp,",",false);
-            while (tok.hasMoreTokens())
-                _excludedPaths.add(tok.nextToken().trim());
-        }
-
-        tmp=filterConfig.getInitParameter("excludePathPatterns");
-        if (tmp!=null)
-        {
-            _excludedPathPatterns=new HashSet<Pattern>();
-            StringTokenizer tok = new StringTokenizer(tmp,",",false);
-            while (tok.hasMoreTokens())
-                _excludedPathPatterns.add(Pattern.compile(tok.nextToken().trim()));
-        }
-        
-        tmp=filterConfig.getInitParameter("vary");
-        if (tmp!=null)
-            _vary=tmp;
+    {        
     }
 
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.UserAgentFilter#destroy()
-     */
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
+    {
+        chain.doFilter(request,response);
+    }
+
     @Override
     public void destroy()
-    {
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.UserAgentFilter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
-     */
-    @Override
-    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
-        throws IOException, ServletException
-    {
-        HttpServletRequest request=(HttpServletRequest)req;
-        HttpServletResponse response=(HttpServletResponse)res;
-
-        // If not a supported method or it is an Excluded URI - no Vary because no matter what client, this URI is always excluded
-        String requestURI = request.getRequestURI();
-        if (!_methods.contains(request.getMethod()) || isExcludedPath(requestURI))
-        {
-            super.doFilter(request,response,chain);
-            return;
-        }
-
-        // Exclude non compressible mime-types known from URI extension. - no Vary because no matter what client, this URI is always excluded
-        if (_mimeTypes.size()>0 && _excludeMimeTypes)
-        {
-            String mimeType = _context.getMimeType(request.getRequestURI());
-
-            if (mimeType!=null)
-            {
-                mimeType = MimeTypes.getContentTypeWithoutCharset(mimeType);
-                if (_mimeTypes.contains(mimeType))
-                {
-                    // handle normally without setting vary header
-                    super.doFilter(request,response,chain);
-                    return;
-                }
-            }
-        }
-        
-        //If the Content-Encoding is already set, then we won't compress
-        if (response.getHeader("Content-Encoding") != null)
-        {
-            super.doFilter(request,response,chain);
-            return;
-        }
-
-        if (_checkGzExists && request.getServletContext()!=null)
-        {
-            String path=request.getServletContext().getRealPath(URIUtil.addPaths(request.getServletPath(),request.getPathInfo()));
-            if (path!=null)
-            {
-                File gz=new File(path+".gz");
-                if (gz.exists())
-                {
-                    // allow default servlet to handle
-                    super.doFilter(request,response,chain);
-                    return;
-                }
-            }
-        }
-        
-        // Excluded User-Agents
-        String ua = getUserAgent(request);
-        boolean ua_excluded=ua!=null&&isExcludedAgent(ua);
-        
-        // Acceptable compression type
-        String compressionType = ua_excluded?null:selectCompression(request.getHeader("accept-encoding"));
-
-        // Special handling for etags
-        String etag = request.getHeader("If-None-Match"); 
-        if (etag!=null)
-        {
-            int dd=etag.indexOf("--");
-            if (dd>0)
-                request.setAttribute(ETAG,etag.substring(0,dd)+(etag.endsWith("\"")?"\"":""));
-        }
-
-        CompressedResponseWrapper wrappedResponse = createWrappedResponse(request,response,compressionType);
-
-        boolean exceptional=true;
-        try
-        {
-            super.doFilter(request,wrappedResponse,chain);
-            exceptional=false;
-        }
-        finally
-        {
-            if (request.isAsyncStarted())
-            {
-                request.getAsyncContext().addListener(new FinishOnCompleteListener(wrappedResponse));
-            }
-            else if (exceptional && !response.isCommitted())
-            {
-                wrappedResponse.resetBuffer();
-                wrappedResponse.noCompression();
-            }
-            else
-                wrappedResponse.finish();
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    private String selectCompression(String encodingHeader)
-    {
-        // TODO, this could be a little more robust.
-        // prefer gzip over deflate
-        String compression = null;
-        if (encodingHeader!=null)
-        {
-            
-            String[] encodings = getEncodings(encodingHeader);
-            if (encodings != null)
-            {
-                for (int i=0; i< encodings.length; i++)
-                {
-                    if (encodings[i].toLowerCase(Locale.ENGLISH).contains(GZIP))
-                    {
-                        if (isEncodingAcceptable(encodings[i]))
-                        {
-                            compression = GZIP;
-                            break; //prefer Gzip over deflate
-                        }
-                    }
-
-                    if (encodings[i].toLowerCase(Locale.ENGLISH).contains(DEFLATE))
-                    {
-                        if (isEncodingAcceptable(encodings[i]))
-                        {
-                            compression = DEFLATE; //Keep checking in case gzip is acceptable
-                        }
-                    }
-                }
-            }
-        }
-        return compression;
+    {        
     }
     
-    
-    private String[] getEncodings (String encodingHeader)
-    {
-        if (encodingHeader == null)
-            return null;
-        return encodingHeader.split(",");
-    }
-    
-    private boolean isEncodingAcceptable(String encoding)
-    {    
-        int state = STATE_DEFAULT;
-        int qvalueIdx = -1;
-        for (int i=0;i<encoding.length();i++)
-        {
-            char c = encoding.charAt(i);
-            switch (state)
-            {
-                case STATE_DEFAULT:
-                {
-                    if (';' == c)
-                        state = STATE_SEPARATOR;
-                    break;
-                }
-                case STATE_SEPARATOR:
-                {
-                    if ('q' == c || 'Q' == c)
-                        state = STATE_Q;
-                    break;
-                }
-                case STATE_Q:
-                {
-                    if ('=' == c)
-                        state = STATE_QVALUE;
-                    break;
-                }
-                case STATE_QVALUE:
-                {
-                    if (qvalueIdx < 0 && '0' == c || '1' == c)
-                        qvalueIdx = i;
-                    break;
-                }
-            }
-        }
-        
-        if (qvalueIdx < 0)
-            return true;
-               
-        if ("0".equals(encoding.substring(qvalueIdx).trim()))
-            return false;
-        return true;
-    }
-    
-
-    protected CompressedResponseWrapper createWrappedResponse(HttpServletRequest request, HttpServletResponse response, final String compressionType)
-    {
-        CompressedResponseWrapper wrappedResponse = null;
-        wrappedResponse = new CompressedResponseWrapper(request,response)
-        {
-            @Override
-            protected AbstractCompressedStream newCompressedStream(HttpServletRequest request, HttpServletResponse response) throws IOException
-            {
-                return new AbstractCompressedStream(compressionType,request,this,_vary)
-                {
-                    private Deflater _allocatedDeflater;
-                    private byte[] _allocatedBuffer;
-
-                    @Override
-                    protected OutputStream createStream() throws IOException
-                    {
-                        if (compressionType == null)
-                        {
-                            return null;
-                        }
-                        
-                        // acquire deflater instance
-                        _allocatedDeflater = _deflater.get();   
-                        if (_allocatedDeflater==null)
-                            _allocatedDeflater = new Deflater(_deflateCompressionLevel,_deflateNoWrap);
-                        else
-                        {
-                            _deflater.set(null);
-                            _allocatedDeflater.reset();
-                        }
-                        
-                        // acquire buffer
-                        _allocatedBuffer = _buffer.get();
-                        if (_allocatedBuffer==null)
-                            _allocatedBuffer = new byte[_bufferSize];
-                        else
-                            _buffer.set(null);
-                        
-                        switch (compressionType)
-                        {
-                            case GZIP:
-                                return new GzipOutputStream(_response.getOutputStream(),_allocatedDeflater,_allocatedBuffer);
-                            case DEFLATE:
-                                return new DeflatedOutputStream(_response.getOutputStream(),_allocatedDeflater,_allocatedBuffer);
-                        }
-                        throw new IllegalStateException(compressionType + " not supported");
-                    }
-
-                    @Override
-                    public void finish() throws IOException
-                    {
-                        super.finish();
-                        if (_allocatedDeflater != null && _deflater.get() == null)
-                        {
-                            _deflater.set(_allocatedDeflater);
-                        }
-                        if (_allocatedBuffer != null && _buffer.get() == null)
-                        {
-                            _buffer.set(_allocatedBuffer);
-                        }
-                    }
-                };
-            }
-        };
-        configureWrappedResponse(wrappedResponse);
-        return wrappedResponse;
-    }
-
-    protected void configureWrappedResponse(CompressedResponseWrapper wrappedResponse)
-    {
-        wrappedResponse.setMimeTypes(_mimeTypes,_excludeMimeTypes);
-        wrappedResponse.setBufferSize(_bufferSize);
-        wrappedResponse.setMinCompressSize(_minGzipSize);
-    }
-
-    private class FinishOnCompleteListener implements AsyncListener
-    {    
-        private CompressedResponseWrapper wrappedResponse;
-
-        public FinishOnCompleteListener(CompressedResponseWrapper wrappedResponse)
-        {
-            this.wrappedResponse = wrappedResponse;
-        }
-
-        @Override
-        public void onComplete(AsyncEvent event) throws IOException
-        {          
-            try
-            {
-                wrappedResponse.finish();
-            }
-            catch (IOException e)
-            {
-                LOG.warn(e);
-            }
-        }
-
-        @Override
-        public void onTimeout(AsyncEvent event) throws IOException
-        {
-        }
-
-        @Override
-        public void onError(AsyncEvent event) throws IOException
-        {
-        }
-
-        @Override
-        public void onStartAsync(AsyncEvent event) throws IOException
-        {
-        }
-    }
-
-    /**
-     * Checks to see if the userAgent is excluded
-     *
-     * @param ua
-     *            the user agent
-     * @return boolean true if excluded
-     */
-    private boolean isExcludedAgent(String ua)
-    {
-        if (ua == null)
-            return false;
-
-        if (_excludedAgents != null)
-        {
-            if (_excludedAgents.contains(ua))
-            {
-                return true;
-            }
-        }
-        if (_excludedAgentPatterns != null)
-        {
-            for (Pattern pattern : _excludedAgentPatterns)
-            {
-                if (pattern.matcher(ua).matches())
-                {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Checks to see if the path is excluded
-     *
-     * @param requestURI
-     *            the request uri
-     * @return boolean true if excluded
-     */
-    private boolean isExcludedPath(String requestURI)
-    {
-        if (requestURI == null)
-            return false;
-        if (_excludedPaths != null)
-        {
-            for (String excludedPath : _excludedPaths)
-            {
-                if (requestURI.startsWith(excludedPath))
-                {
-                    return true;
-                }
-            }
-        }
-        if (_excludedPathPatterns != null)
-        {
-            for (Pattern pattern : _excludedPathPatterns)
-            {
-                if (pattern.matcher(requestURI).matches())
-                {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
 }
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/IncludableGzipFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/IncludableGzipFilter.java
index 4421530..44df684 100644
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/IncludableGzipFilter.java
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/IncludableGzipFilter.java
@@ -18,161 +18,7 @@
 
 package org.eclipse.jetty.servlets;
 
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.io.UnsupportedEncodingException;
-import java.util.zip.Deflater;
-import java.util.zip.DeflaterOutputStream;
-import java.util.zip.GZIPOutputStream;
-
-import javax.servlet.DispatcherType;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.io.UncheckedPrintWriter;
-import org.eclipse.jetty.servlets.gzip.AbstractCompressedStream;
-import org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper;
-
-/* ------------------------------------------------------------ */
-/** Includable GZip Filter.
- * This extension to the {@link GzipFilter} that uses Jetty features to allow
- * headers to be set during calls to
- * {@link javax.servlet.RequestDispatcher#include(javax.servlet.ServletRequest, javax.servlet.ServletResponse)}.
- * This allows the gzip filter to function correct during includes and to make a decision to gzip or not
- * at the time the buffer fills and on the basis of all response headers.
- *
- * If the init parameter "uncheckedPrintWriter" is set to "true", then the PrintWriter used by
- * the wrapped getWriter will be {@link UncheckedPrintWriter}.
- *
- */
+@Deprecated
 public class IncludableGzipFilter extends GzipFilter
 {
-    boolean _uncheckedPrintWriter=false;
-
-    @Override
-    public void init(FilterConfig filterConfig) throws ServletException
-    {
-        super.init(filterConfig);
-
-        String tmp=filterConfig.getInitParameter("uncheckedPrintWriter");
-        if (tmp!=null)
-            _uncheckedPrintWriter=Boolean.valueOf(tmp).booleanValue();
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.GzipFilter#createWrappedResponse(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.String)
-     */
-    @Override
-    protected CompressedResponseWrapper createWrappedResponse(HttpServletRequest request, HttpServletResponse response, final String compressionType)
-    {
-        CompressedResponseWrapper wrappedResponse = null;
-        if (compressionType==null)
-        {
-            wrappedResponse = new IncludableResponseWrapper(request,response)
-            {
-                @Override
-                protected AbstractCompressedStream newCompressedStream(HttpServletRequest request,HttpServletResponse response) throws IOException
-                {
-                    return new AbstractCompressedStream(null,request,this,_vary)
-                    {
-                        @Override
-                        protected DeflaterOutputStream createStream() throws IOException
-                        {
-                            return null;
-                        }
-                    };
-                }
-            };
-        }
-        else if (compressionType.equals(GZIP))
-        {
-            wrappedResponse = new IncludableResponseWrapper(request,response)
-            {
-                @Override
-                protected AbstractCompressedStream newCompressedStream(HttpServletRequest request,HttpServletResponse response) throws IOException
-                {
-                    return new AbstractCompressedStream(compressionType,request,this,_vary)
-                    {
-                        @Override
-                        protected DeflaterOutputStream createStream() throws IOException
-                        {
-                            return new GZIPOutputStream(_response.getOutputStream(),_bufferSize);
-                        }
-                    };
-                }
-            };
-        }
-        else if (compressionType.equals(DEFLATE))
-        {
-            wrappedResponse = new IncludableResponseWrapper(request,response)
-            {
-                @Override
-                protected AbstractCompressedStream newCompressedStream(HttpServletRequest request,HttpServletResponse response) throws IOException
-                {
-                    return new AbstractCompressedStream(compressionType,request,this,_vary)
-                    {
-                        @Override
-                        protected DeflaterOutputStream createStream() throws IOException
-                        {
-                            return new DeflaterOutputStream(_response.getOutputStream(),new Deflater(_deflateCompressionLevel, _deflateNoWrap));
-                        }
-                    };
-                }
-            };
-        }
-        else
-        {
-            throw new IllegalStateException(compressionType + " not supported");
-        }
-        configureWrappedResponse(wrappedResponse);
-        return wrappedResponse;
-    }
-
-
-    // Extend CompressedResponseWrapper to be able to set headers during include and to create unchecked printwriters
-    private abstract class IncludableResponseWrapper extends CompressedResponseWrapper
-    {
-        public IncludableResponseWrapper(HttpServletRequest request, HttpServletResponse response)
-        {
-            super(request,response);
-        }
-
-        @Override
-        public void setHeader(String name,String value)
-        {
-            if (getRequest().getDispatcherType()==DispatcherType.INCLUDE)
-            {
-                if (!"etag".equalsIgnoreCase(name) && !name.startsWith("content-"))
-                {
-                    HttpServletResponse response = (HttpServletResponse)getResponse();
-                    response.setHeader("org.eclipse.jetty.server.include."+name,value);
-                }
-            }
-            else
-                super.setHeader(name,value);
-        }
-
-        @Override
-        public void addHeader(String name, String value)
-        {
-            super.addHeader(name, value);
-            HttpServletResponse response = (HttpServletResponse)getResponse();
-            if (!response.containsHeader(name))
-                setHeader(name,value);
-        }
-        
-        @Override
-        protected PrintWriter newWriter(OutputStream out, String encoding) throws UnsupportedEncodingException
-        {
-            if (_uncheckedPrintWriter)
-                return encoding == null?new UncheckedPrintWriter(out):new UncheckedPrintWriter(new OutputStreamWriter(out,encoding));
-            return super.newWriter(out,encoding);
-        }
-    }
-
 }
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java
index 9adb917..cd1be54 100644
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java
@@ -56,7 +56,6 @@
 import org.eclipse.jetty.util.log.Logger;
 
 
-/* ------------------------------------------------------------ */
 /**
  * Multipart Form Data Filter.
  * <p>
@@ -95,6 +94,7 @@
  * </dl>
  * @deprecated See servlet 3.0 apis like javax.servlet.http.HttpServletRequest.getParts()
  */
+@Deprecated
 public class MultiPartFilter implements Filter
 {
     private static final Logger LOG = Log.getLogger(MultiPartFilter.class);
@@ -243,9 +243,6 @@
         MultiMap<Object> _params;
 
         /* ------------------------------------------------------------------------------- */
-        /** Constructor.
-         * @param request
-         */
         public Wrapper(HttpServletRequest request, MultiMap map)
         {
             super(request);
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/PushCacheFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/PushCacheFilter.java
new file mode 100644
index 0000000..44db8ae
--- /dev/null
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/PushCacheFilter.java
@@ -0,0 +1,306 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.servlets;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpURI;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.server.Dispatcher;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.util.StringUtil;
+import org.eclipse.jetty.util.URIUtil;
+import org.eclipse.jetty.util.annotation.ManagedAttribute;
+import org.eclipse.jetty.util.annotation.ManagedObject;
+import org.eclipse.jetty.util.annotation.ManagedOperation;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+/**
+ * <p>A filter that builds a cache of secondary resources associated
+ * to primary resources.</p>
+ * <p>A typical request for a primary resource such as {@code index.html}
+ * is immediately followed by a number of requests for secondary resources.
+ * Secondary resource requests will have a {@code Referer} HTTP header
+ * that points to {@code index.html}, which is used to associate the secondary
+ * resource to the primary resource.</p>
+ * <p>Only secondary resources that are requested within a (small) time period
+ * from the request of the primary resource are associated with the primary
+ * resource.</p>
+ * <p>This allows to build a cache of secondary resources associated with
+ * primary resources. When a request for a primary resource arrives, associated
+ * secondary resources are pushed to the client, unless the request carries
+ * {@code If-xxx} header that hint that the client has the resources in its
+ * cache.</p>
+ */
+@ManagedObject("Push cache based on the HTTP 'Referer' header")
+public class PushCacheFilter implements Filter
+{
+    private static final Logger LOG = Log.getLogger(PushCacheFilter.class);
+
+    private final Set<Integer> _ports = new HashSet<>();
+    private final Set<String> _hosts = new HashSet<>();
+    private final ConcurrentMap<String, PrimaryResource> _cache = new ConcurrentHashMap<>();
+    private long _associatePeriod = 4000L;
+    private int _maxAssociations = 16;
+    private long _renew = System.nanoTime();
+
+    @Override
+    public void init(FilterConfig config) throws ServletException
+    {
+        String associatePeriod = config.getInitParameter("associatePeriod");
+        if (associatePeriod != null)
+            _associatePeriod = Long.parseLong(associatePeriod);
+
+        String maxAssociations = config.getInitParameter("maxAssociations");
+        if (maxAssociations != null)
+            _maxAssociations = Integer.parseInt(maxAssociations);
+
+        String hosts = config.getInitParameter("hosts");
+        if (hosts != null)
+            Collections.addAll(_hosts, StringUtil.csvSplit(hosts));
+
+        String ports = config.getInitParameter("ports");
+        if (ports != null)
+            for (String p : StringUtil.csvSplit(ports))
+                _ports.add(Integer.parseInt(p));
+
+        // Expose for JMX.
+        config.getServletContext().setAttribute(config.getFilterName(), this);
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("period={} max={} hosts={} ports={}", _associatePeriod, _maxAssociations, _hosts, _ports);
+    }
+
+    @Override
+    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException
+    {
+        if (HttpVersion.fromString(req.getProtocol()).getVersion() < 20)
+        {
+            chain.doFilter(req, resp);
+            return;
+        }
+
+        long now = System.nanoTime();
+        HttpServletRequest request = (HttpServletRequest)req;
+
+        // Iterating over fields is more efficient than multiple gets
+        HttpFields fields = Request.getBaseRequest(request).getHttpFields();
+        boolean conditional = false;
+        String referrer = null;
+        loop:
+        for (int i = 0; i < fields.size(); i++)
+        {
+            HttpField field = fields.getField(i);
+            HttpHeader header = field.getHeader();
+            if (header == null)
+                continue;
+
+            switch (header)
+            {
+                case IF_MATCH:
+                case IF_MODIFIED_SINCE:
+                case IF_NONE_MATCH:
+                case IF_UNMODIFIED_SINCE:
+                    conditional = true;
+                    break loop;
+
+                case REFERER:
+                    referrer = field.getValue();
+                    break;
+
+                default:
+                    break;
+            }
+        }
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("{} {} referrer={} conditional={}", request.getMethod(), request.getRequestURI(), referrer, conditional);
+
+        String path = URIUtil.addPaths(request.getServletPath(), request.getPathInfo());
+        String query = request.getQueryString();
+        if (query != null)
+            path += "?" + query;
+        if (referrer != null)
+        {
+            HttpURI referrerURI = new HttpURI(referrer);
+            String host = referrerURI.getHost();
+            int port = referrerURI.getPort();
+            if (port <= 0)
+                port = request.isSecure() ? 443 : 80;
+
+            boolean referredFromHere = _hosts.size() > 0 ? _hosts.contains(host) : host.equals(request.getServerName());
+            referredFromHere &= _ports.size() > 0 ? _ports.contains(port) : port == request.getServerPort();
+
+            if (referredFromHere)
+            {
+                if ("GET".equalsIgnoreCase(request.getMethod()))
+                {
+                    String referrerPath = referrerURI.getPath();
+                    if (referrerPath == null)
+                        referrerPath = "/";
+                    if (referrerPath.startsWith(request.getContextPath()))
+                    {
+                        String referrerPathNoContext = referrerPath.substring(request.getContextPath().length());
+                        if (!referrerPathNoContext.equals(path))
+                        {
+                            PrimaryResource primaryResource = _cache.get(referrerPathNoContext);
+                            if (primaryResource != null)
+                            {
+                                long primaryTimestamp = primaryResource._timestamp.get();
+                                if (primaryTimestamp != 0)
+                                {
+                                    RequestDispatcher dispatcher = request.getServletContext().getRequestDispatcher(path);
+                                    if (now - primaryTimestamp < TimeUnit.MILLISECONDS.toNanos(_associatePeriod))
+                                    {
+                                        ConcurrentMap<String, RequestDispatcher> associated = primaryResource._associated;
+                                        // Not strictly concurrent-safe, just best effort to limit associations.
+                                        if (associated.size() <= _maxAssociations)
+                                        {
+                                            if (associated.putIfAbsent(path, dispatcher) == null)
+                                            {
+                                                if (LOG.isDebugEnabled())
+                                                    LOG.debug("Associated {} to {}", path, referrerPathNoContext);
+                                            }
+                                        }
+                                        else
+                                        {
+                                            if (LOG.isDebugEnabled())
+                                                LOG.debug("Not associated {} to {}, exceeded max associations of {}", path, referrerPathNoContext, _maxAssociations);
+                                        }
+                                    }
+                                    else
+                                    {
+                                        if (LOG.isDebugEnabled())
+                                            LOG.debug("Not associated {} to {}, outside associate period of {}ms", path, referrerPathNoContext, _associatePeriod);
+                                    }
+                                }
+                            }
+                        }
+                        else
+                        {
+                            if (LOG.isDebugEnabled())
+                                LOG.debug("Not associated {} to {}, referring to self", path, referrerPathNoContext);
+                        }
+                    }
+                }
+            }
+            else
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("External referrer {}", referrer);
+            }
+        }
+
+        // Push some resources?
+        PrimaryResource primaryResource = _cache.get(path);
+        if (primaryResource == null)
+        {
+            PrimaryResource t = new PrimaryResource();
+            primaryResource = _cache.putIfAbsent(path, t);
+            primaryResource = primaryResource == null ? t : primaryResource;
+            primaryResource._timestamp.compareAndSet(0, now);
+            if (LOG.isDebugEnabled())
+                LOG.debug("Cached primary resource {}", path);
+        }
+        else
+        {
+            long last = primaryResource._timestamp.get();
+            if (last < _renew && primaryResource._timestamp.compareAndSet(last, now))
+            {
+                primaryResource._associated.clear();
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Clear associated resources for {}", path);
+            }
+        }
+
+        // Push associated for non conditional
+        if (!conditional && !primaryResource._associated.isEmpty())
+        {
+            for (RequestDispatcher dispatcher : primaryResource._associated.values())
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("Pushing {} for {}", dispatcher, path);
+                ((Dispatcher)dispatcher).push(request);
+            }
+        }
+
+        chain.doFilter(request, resp);
+    }
+
+    @Override
+    public void destroy()
+    {
+        clearPushCache();
+    }
+
+    @ManagedAttribute("The push cache contents")
+    public Map<String, String> getPushCache()
+    {
+        Map<String, String> result = new HashMap<>();
+        for (Map.Entry<String, PrimaryResource> entry : _cache.entrySet())
+        {
+            PrimaryResource resource = entry.getValue();
+            String value = String.format("size=%d: %s", resource._associated.size(), new TreeSet<>(resource._associated.keySet()));
+            result.put(entry.getKey(), value);
+        }
+        return result;
+    }
+
+    @ManagedOperation(value = "Renews the push cache contents", impact = "ACTION")
+    public void renewPushCache()
+    {
+        _renew = System.nanoTime();
+    }
+
+    @ManagedOperation(value = "Clears the push cache contents", impact = "ACTION")
+    public void clearPushCache()
+    {
+        _cache.clear();
+    }
+
+    private static class PrimaryResource
+    {
+        private final ConcurrentMap<String, RequestDispatcher> _associated = new ConcurrentHashMap<>();
+        private final AtomicLong _timestamp = new AtomicLong();
+    }
+}
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/PushSessionCacheFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/PushSessionCacheFilter.java
new file mode 100644
index 0000000..0aa0f79
--- /dev/null
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/PushSessionCacheFilter.java
@@ -0,0 +1,214 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.servlets;
+
+import java.io.IOException;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletRequestEvent;
+import javax.servlet.ServletRequestListener;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpURI;
+import org.eclipse.jetty.server.PushBuilder;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.Response;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+
+/* ------------------------------------------------------------ */
+/**
+ */
+public class PushSessionCacheFilter implements Filter
+{
+    private static final String TARGET_ATTR="PushCacheFilter.target";
+    private static final String TIMESTAMP_ATTR="PushCacheFilter.timestamp";
+    private static final Logger LOG = Log.getLogger(PushSessionCacheFilter.class);
+    private final ConcurrentMap<String, Target> _cache = new ConcurrentHashMap<>();
+    
+    private long _associateDelay=5000L;
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
+     */
+    @Override
+    public void init(FilterConfig config) throws ServletException
+    {
+        if (config.getInitParameter("associateDelay")!=null)
+            _associateDelay=Long.valueOf(config.getInitParameter("associateDelay"));
+        
+        // Add a listener that is used to collect information about associated resource,
+        // etags and modified dates
+        config.getServletContext().addListener(new ServletRequestListener()
+        {
+            // Collect information when request is destroyed.
+            @Override
+            public void requestDestroyed(ServletRequestEvent sre)
+            {
+                Request request = Request.getBaseRequest(sre.getServletRequest());
+                Target target = (Target)request.getAttribute(TARGET_ATTR);
+                if (target==null)
+                    return;
+
+                // Update conditional data
+                Response response = request.getResponse();
+                target._etag=response.getHttpFields().get(HttpHeader.ETAG);
+                target._lastModified=response.getHttpFields().get(HttpHeader.LAST_MODIFIED);
+                
+                // Don't associate pushes
+                if (request.isPush())
+                {
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Pushed {} for {}",request.getResponse().getStatus(),request.getRequestURI());
+                    return;
+                } 
+                else if (LOG.isDebugEnabled())
+                    LOG.debug("Served {} for {}",request.getResponse().getStatus(),request.getRequestURI());
+                
+                // Does this request have a referer?
+                String referer = request.getHttpFields().get(HttpHeader.REFERER);
+                
+                if (referer!=null)
+                {
+                    // Is the referer from this contexts?
+                    HttpURI referer_uri = new HttpURI(referer);
+                    if (request.getServerName().equals(referer_uri.getHost()))
+                    {
+                        Target referer_target = _cache.get(referer_uri.getPath());
+                        if (referer_target!=null)
+                        {
+                            HttpSession session = request.getSession();                            
+                            ConcurrentHashMap<String, Long> timestamps = (ConcurrentHashMap<String, Long>)session.getAttribute(TIMESTAMP_ATTR);
+                            Long last = timestamps.get(referer_target._path);
+                            if (last!=null && (System.currentTimeMillis()-last)<_associateDelay)
+                            {
+                                if (referer_target._associated.putIfAbsent(target._path,target)==null)
+                                {
+                                    if (LOG.isDebugEnabled())
+                                        LOG.debug("ASSOCIATE {}->{}",referer_target._path,target._path);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            @Override
+            public void requestInitialized(ServletRequestEvent sre)
+            {
+            }
+            
+        });
+        
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
+     */
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
+    { 
+        // Get Jetty request as these APIs are not yet standard
+        Request baseRequest = Request.getBaseRequest(request);
+        String uri=baseRequest.getRequestURI();
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("{} {} push={}",baseRequest.getMethod(),uri,baseRequest.isPush());
+
+        HttpSession session = baseRequest.getSession(true);
+
+        // find the target for this resource
+        Target target = _cache.get(uri);
+        if (target == null)
+        {
+            Target t=new Target(uri);
+            target = _cache.putIfAbsent(uri,t);
+            target = target==null?t:target;
+        }
+        request.setAttribute(TARGET_ATTR,target);
+        
+        // Set the timestamp for this resource in this session
+        ConcurrentHashMap<String, Long> timestamps = (ConcurrentHashMap<String, Long>)session.getAttribute(TIMESTAMP_ATTR);
+        if (timestamps==null)
+        {
+            timestamps=new ConcurrentHashMap<>();
+            session.setAttribute(TIMESTAMP_ATTR,timestamps);
+        }
+        timestamps.put(uri,System.currentTimeMillis());
+        
+        // push any associated resources
+        if (baseRequest.isPushSupported() && target._associated.size()>0)
+        {
+            PushBuilder builder = baseRequest.getPushBuilder();
+            builder.addHeader("X-Pusher",PushSessionCacheFilter.class.toString());
+            for (Target associated : target._associated.values())
+            {
+                String path = associated._path;
+                if (LOG.isDebugEnabled())
+                    LOG.debug("PUSH {} <- {}",path,uri);
+                
+                builder.path(path).etag(associated._etag).lastModified(associated._lastModified).push();
+            }
+        }
+
+        chain.doFilter(request,response);
+    }
+
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @see javax.servlet.Filter#destroy()
+     */
+    @Override
+    public void destroy()
+    {        
+    }
+
+    
+    public static class Target
+    {
+        final String _path;
+        final ConcurrentMap<String,Target> _associated = new ConcurrentHashMap<>();
+        volatile String _etag;
+        volatile String _lastModified;
+        
+        public Target(String path)
+        {
+            _path=path;
+        }
+        
+        @Override
+        public String toString()
+        {
+            return String.format("Target{p=%s,e=%s,m=%s,a=%d}",_path,_etag,_lastModified,_associated.size());
+        }
+    }
+}
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/PutFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/PutFilter.java
index b31ab31..24a1b75 100644
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/PutFilter.java
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/PutFilter.java
@@ -44,6 +44,7 @@
 import javax.servlet.http.HttpServletResponseWrapper;
 
 import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.URIUtil;
 
 /**
@@ -331,7 +332,7 @@
                 if ("Allow".equalsIgnoreCase(name))
                 {
                     Set<String> options = new HashSet<String>();
-                    options.addAll(Arrays.asList(value.split(" *, *")));
+                    options.addAll(Arrays.asList(StringUtil.csvSplit(value)));
                     options.addAll(_operations);
                     value=null;
                     for (String o : options)
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/QoSFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/QoSFilter.java
index 6d2a1b5..8701134 100644
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/QoSFilter.java
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/QoSFilter.java
@@ -23,6 +23,7 @@
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
+
 import javax.servlet.AsyncContext;
 import javax.servlet.AsyncEvent;
 import javax.servlet.AsyncListener;
@@ -45,19 +46,19 @@
 
 /**
  * Quality of Service Filter.
- * <p/>
+ * <p>
  * This filter limits the number of active requests to the number set by the "maxRequests" init parameter (default 10).
  * If more requests are received, they are suspended and placed on priority queues.  Priorities are determined by
  * the {@link #getPriority(ServletRequest)} method and are a value between 0 and the value given by the "maxPriority"
  * init parameter (default 10), with higher values having higher priority.
- * <p/>
+ * <p>
  * This filter is ideal to prevent wasting threads waiting for slow/limited
  * resources such as a JDBC connection pool.  It avoids the situation where all of a
  * containers thread pool may be consumed blocking on such a slow resource.
  * By limiting the number of active threads, a smaller thread pool may be used as
  * the threads are not wasted waiting.  Thus more memory may be available for use by
  * the active threads.
- * <p/>
+ * <p>
  * Furthermore, this filter uses a priority when resuming waiting requests. So that if
  * a container is under load, and there are many requests waiting for resources,
  * the {@link #getPriority(ServletRequest)} method is used, so that more important
@@ -65,12 +66,12 @@
  * maxRequest limit slightly smaller than the containers thread pool and a high priority
  * allocated to admin users.  Thus regardless of load, admin users would always be
  * able to access the web application.
- * <p/>
+ * <p>
  * The maxRequest limit is policed by a {@link Semaphore} and the filter will wait a short while attempting to acquire
  * the semaphore. This wait is controlled by the "waitMs" init parameter and allows the expense of a suspend to be
  * avoided if the semaphore is shortly available.  If the semaphore cannot be obtained, the request will be suspended
  * for the default suspend period of the container or the valued set as the "suspendMs" init parameter.
- * <p/>
+ * <p>
  * If the "managedAttr" init parameter is set to true, then this servlet is set as a {@link ServletContext} attribute with the
  * filter name as the attribute name.  This allows context external mechanism (eg JMX via {@link ContextHandler#MANAGED_ATTRIBUTES}) to
  * manage the configuration of the filter.
@@ -236,7 +237,7 @@
 
     /**
      * Computes the request priority.
-     * <p/>
+     * <p>
      * The default implementation assigns the following priorities:
      * <ul>
      * <li> 2 - for an authenticated request
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/UserAgentFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/UserAgentFilter.java
deleted file mode 100644
index 9211753..0000000
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/UserAgentFilter.java
+++ /dev/null
@@ -1,158 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets;
-
-import java.io.IOException;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-
-/* ------------------------------------------------------------ */
-/** User Agent Filter.
- * <p>
- * This filter allows efficient matching of user agent strings for
- * downstream or extended filters to use for browser specific logic.
- * </p>
- * <p>
- * The filter is configured with the following init parameters:
- * <dl>
- * <dt>attribute</dt><dd>If set, then the request attribute of this name is set with the matched user agent string</dd>
- * <dt>cacheSize</dt><dd>The size of the user-agent cache, used to avoid reparsing of user agent strings. The entire cache is flushed
- * when this size is reached</dd>
- * <dt>userAgent</dt><dd>A regex {@link Pattern} to extract the essential elements of the user agent.
- * The concatenation of matched pattern groups is used as the user agent name</dd>
- * <dl>
- * An example value for pattern is <code>(?:Mozilla[^\(]*\(compatible;\s*+([^;]*);.*)|(?:.*?([^\s]+/[^\s]+).*)</code>. These two
- * pattern match the common compatibility user-agent strings and extract the real user agent, failing that, the first
- * element of the agent string is returned.
- *
- *
- */
-public class UserAgentFilter implements Filter
-{
-    private static final String __defaultPattern = "(?:Mozilla[^\\(]*\\(compatible;\\s*+([^;]*);.*)|(?:.*?([^\\s]+/[^\\s]+).*)";
-    private Pattern _pattern = Pattern.compile(__defaultPattern);
-    private Map<String, String> _agentCache = new ConcurrentHashMap<String, String>();
-    private int _agentCacheSize=1024;
-    private String _attribute;
-
-    /* ------------------------------------------------------------ */
-    /* (non-Javadoc)
-     * @see javax.servlet.Filter#destroy()
-     */
-    public void destroy()
-    {
-    }
-
-    /* ------------------------------------------------------------ */
-    /* (non-Javadoc)
-     * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
-     */
-    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
-    {
-        if (_attribute!=null && _pattern!=null)
-        {
-            String ua=getUserAgent(request);
-            request.setAttribute(_attribute,ua);
-        }
-        chain.doFilter(request,response);
-    }
-
-    /* ------------------------------------------------------------ */
-    /* (non-Javadoc)
-     * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
-     */
-    public void init(FilterConfig filterConfig) throws ServletException
-    {
-        _attribute=filterConfig.getInitParameter("attribute");
-
-        String p=filterConfig.getInitParameter("userAgent");
-        if (p!=null)
-            _pattern=Pattern.compile(p);
-
-        String size=filterConfig.getInitParameter("cacheSize");
-        if (size!=null)
-            _agentCacheSize=Integer.parseInt(size);
-    }
-
-    /* ------------------------------------------------------------ */
-    public String getUserAgent(ServletRequest request)
-    {
-        String ua=((HttpServletRequest)request).getHeader("User-Agent");
-        return getUserAgent(ua);
-    }
-
-    /* ------------------------------------------------------------ */
-    /** Get UserAgent.
-     * The configured agent patterns are used to match against the passed user agent string.
-     * If any patterns match, the concatenation of pattern groups is returned as the user agent
-     * string. Match results are cached.
-     * @param ua A user agent string
-     * @return The matched pattern groups or the original user agent string
-     */
-    public String getUserAgent(String ua)
-    {
-        if (ua == null)
-            return null;
-
-        String tag = _agentCache.get(ua);
-
-        if (tag == null)
-        {
-            if (_pattern != null)
-            {
-                Matcher matcher = _pattern.matcher(ua);
-                if (matcher.matches())
-                {
-                    if (matcher.groupCount() > 0)
-                    {
-                        for (int g = 1; g <= matcher.groupCount(); g++)
-                        {
-                            String group = matcher.group(g);
-                            if (group != null)
-                                tag = tag == null ? group : tag + group;
-                        }
-                    }
-                    else
-                    {
-                        tag = matcher.group();
-                    }
-                }
-            }
-
-            if (tag == null)
-                tag = ua;
-
-            if (_agentCache.size() >= _agentCacheSize)
-                _agentCache.clear();
-            _agentCache.put(ua, tag);
-        }
-
-        return tag;
-    }
-}
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/AbstractCompressedStream.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/AbstractCompressedStream.java
deleted file mode 100644
index dc2e0d0..0000000
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/AbstractCompressedStream.java
+++ /dev/null
@@ -1,401 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.io.UnsupportedEncodingException;
-
-import javax.servlet.ServletOutputStream;
-import javax.servlet.WriteListener;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.util.ByteArrayOutputStream2;
-
-/* ------------------------------------------------------------ */
-/**
- * Skeletal implementation of a CompressedStream. This class adds compression features to a ServletOutputStream and takes care of setting response headers, etc.
- * Major work and configuration is done here. Subclasses using different kinds of compression only have to implement the abstract methods doCompress() and
- * setContentEncoding() using the desired compression and setting the appropriate Content-Encoding header string.
- */
-public abstract class AbstractCompressedStream extends ServletOutputStream
-{
-    private final String _encoding;
-    protected final String _vary;
-    protected final CompressedResponseWrapper _wrapper;
-    protected final HttpServletResponse _response;
-    protected OutputStream _out;
-    protected ByteArrayOutputStream2 _bOut;
-    protected OutputStream _compressedOutputStream;
-    protected boolean _closed;
-    protected boolean _doNotCompress;
-
-    /**
-     * Instantiates a new compressed stream.
-     *
-     */
-    public AbstractCompressedStream(String encoding,HttpServletRequest request, CompressedResponseWrapper wrapper,String vary)
-            throws IOException
-    {
-        _encoding=encoding;
-        _wrapper = wrapper;
-        _response = (HttpServletResponse)wrapper.getResponse();
-        _vary=vary;
-        
-        if (_wrapper.getMinCompressSize()==0)
-            doCompress();
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Reset buffer.
-     */
-    public void resetBuffer()
-    {
-        if (_response.isCommitted() || _compressedOutputStream!=null )
-            throw new IllegalStateException("Committed");
-        _closed = false;
-        _out = null;
-        _bOut = null;
-        _doNotCompress = false;
-    }
-
-    /* ------------------------------------------------------------ */
-    public void setBufferSize(int bufferSize)
-    {
-        if (_bOut!=null && _bOut.getBuf().length<bufferSize)
-        {
-            ByteArrayOutputStream2 b = new ByteArrayOutputStream2(bufferSize);
-            b.write(_bOut.getBuf(),0,_bOut.size());
-            _bOut=b;
-        }
-    }
-    
-    /* ------------------------------------------------------------ */
-    public void setContentLength()
-    {
-        if (_doNotCompress)
-        {
-            long length=_wrapper.getContentLength();
-            if (length>=0)
-            {
-                if (length < Integer.MAX_VALUE)
-                    _response.setContentLength((int)length);
-                else
-                    _response.setHeader("Content-Length",Long.toString(length));
-            }
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see java.io.OutputStream#flush()
-     */
-    @Override
-    public void flush() throws IOException
-    {
-        if (_out == null || _bOut != null)
-        {
-            long length=_wrapper.getContentLength();
-            if (length > 0 && length < _wrapper.getMinCompressSize())
-                doNotCompress(false);
-            else
-                doCompress();
-        }
-
-        _out.flush();
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see java.io.OutputStream#close()
-     */
-    @Override
-    public void close() throws IOException
-    {
-        if (_closed)
-            return;
-
-        if (_wrapper.getRequest().getAttribute("javax.servlet.include.request_uri") != null)
-            flush();
-        else
-        {
-            if (_bOut != null)
-            {
-                long length=_wrapper.getContentLength();
-                if (length < 0)
-                {
-                    length = _bOut.getCount();
-                    _wrapper.setContentLength(length);
-                }
-                if (length < _wrapper.getMinCompressSize())
-                    doNotCompress(false);
-                else
-                    doCompress();
-            }
-            else if (_out == null)
-            {
-                // No output
-                doNotCompress(false);
-            }
-
-            if (_compressedOutputStream != null)
-                _compressedOutputStream.close();
-            else
-                _out.close();
-            _closed = true;
-        }
-    }
-
-    /**
-     * Finish.
-     *
-     * @throws IOException
-     *             Signals that an I/O exception has occurred.
-     */
-    public void finish() throws IOException
-    {
-        if (!_closed)
-        {
-            if (_out == null || _bOut != null)
-            {
-                long length=_wrapper.getContentLength();
-                if (length<0 &&_bOut==null || length >= 0 && length < _wrapper.getMinCompressSize())
-                    doNotCompress(false);
-                else
-                    doCompress();
-            }
-
-            if (_compressedOutputStream != null && !_closed)
-            {
-                _closed = true;
-                _compressedOutputStream.close();
-            }
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see java.io.OutputStream#write(int)
-     */
-    @Override
-    public void write(int b) throws IOException
-    {
-        checkOut(1);
-        _out.write(b);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see java.io.OutputStream#write(byte[])
-     */
-    @Override
-    public void write(byte b[]) throws IOException
-    {
-        checkOut(b.length);
-        _out.write(b);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see java.io.OutputStream#write(byte[], int, int)
-     */
-    @Override
-    public void write(byte b[], int off, int len) throws IOException
-    {
-        checkOut(len);
-        _out.write(b,off,len);
-    }
-
-    /**
-     * Do compress.
-     *
-     * @throws IOException Signals that an I/O exception has occurred.
-     */
-    public void doCompress() throws IOException
-    {
-        if (_compressedOutputStream==null)
-        {
-            if (_response.isCommitted())
-                throw new IllegalStateException();
-
-            if (_encoding!=null)
-            {
-                setHeader("Content-Encoding", _encoding);
-                if (_response.containsHeader("Content-Encoding"))
-                {
-                    addHeader("Vary",_vary);
-                    _out=_compressedOutputStream=createStream();
-                    if (_out!=null)
-                    {
-                        if (_bOut!=null)
-                        {
-                            _out.write(_bOut.getBuf(),0,_bOut.getCount());
-                            _bOut=null;
-                        }
-
-                        String etag=_wrapper.getETag();
-                        if (etag!=null)
-                        {
-                            int end = etag.length()-1;
-                            if (etag.charAt(end)=='"')
-                                setHeader("ETag",etag.substring(0,end)+"--"+_encoding+'"');
-                            else
-                                setHeader("ETag",etag+"--"+_encoding);
-                        }
-                        return;
-                    }
-                }
-            }
-            
-            doNotCompress(true); // Send vary as it could have been compressed if encoding was present
-        }
-    }
-
-    /**
-     * Do not compress.
-     *
-     * @throws IOException
-     *             Signals that an I/O exception has occurred.
-     */
-    public void doNotCompress(boolean sendVary) throws IOException
-    {
-        if (_compressedOutputStream != null)
-            throw new IllegalStateException("Compressed output stream is already assigned.");
-        if (_out == null || _bOut != null)
-        {
-            if (sendVary)
-                addHeader("Vary",_vary);
-            if (_wrapper.getETag()!=null)
-                setHeader("ETag",_wrapper.getETag());
-                
-            _doNotCompress = true;
-
-            _out = _response.getOutputStream();
-            setContentLength();
-
-            if (_bOut != null)
-                _out.write(_bOut.getBuf(),0,_bOut.getCount());
-            _bOut = null;
-        }
-    }
-
-    /**
-     * Check out.
-     *
-     * @param lengthToWrite
-     *            the length
-     * @throws IOException
-     *             Signals that an I/O exception has occurred.
-     */
-    private void checkOut(int lengthToWrite) throws IOException
-    {
-        if (_closed)
-            throw new IOException("CLOSED");
-
-        if (_out == null)
-        {            
-            // If this first write is larger than buffer size, then we are committing now
-            if (lengthToWrite>_wrapper.getBufferSize())
-            {
-                // if we know this is all the content and it is less than minimum, then do not compress, otherwise do compress
-                long length=_wrapper.getContentLength();
-                if (length>=0 && length<_wrapper.getMinCompressSize())
-                    doNotCompress(false);  // Not compressing by size, so no vary on request headers
-                else
-                    doCompress();
-            }
-            else
-            {
-                // start aggregating writes into a buffered output stream
-                _out = _bOut = new ByteArrayOutputStream2(_wrapper.getBufferSize());
-            }
-        }
-        // else are we aggregating writes?
-        else if (_bOut !=null)
-        {
-            // We are aggregating into the buffered output stream.  
-
-            // If this write fills the buffer, then we are committing
-            if (lengthToWrite>=(_bOut.getBuf().length - _bOut.getCount()))
-            {
-                // if we know this is all the content and it is less than minimum, then do not compress, otherwise do compress
-                long length=_wrapper.getContentLength();
-                if (length>=0 && length<_wrapper.getMinCompressSize())
-                    doNotCompress(false);  // Not compressing by size, so no vary on request headers
-                else
-                    doCompress();
-            }
-        }
-    }
-
-    public OutputStream getOutputStream()
-    {
-        return _out;
-    }
-
-    public boolean isClosed()
-    {
-        return _closed;
-    }
-
-    /**
-     * Allows derived implementations to replace PrintWriter implementation.
-     */
-    protected PrintWriter newWriter(OutputStream out, String encoding) throws UnsupportedEncodingException
-    {
-        return encoding == null?new PrintWriter(out):new PrintWriter(new OutputStreamWriter(out,encoding));
-    }
-
-    protected void addHeader(String name,String value)
-    {
-        _response.addHeader(name, value);
-    }
-
-    protected void setHeader(String name,String value)
-    {
-        _response.setHeader(name, value);
-    }
-
-    @Override
-    public void setWriteListener(WriteListener writeListener)
-    {
-        throw new UnsupportedOperationException("Use AsyncGzipFilter");
-    }
-    
-
-    @Override
-    public boolean isReady()
-    {
-        throw new UnsupportedOperationException("Use AsyncGzipFilter");
-    }
-
-    /**
-     * Create the stream fitting to the underlying compression type.
-     *
-     * @throws IOException
-     *             Signals that an I/O exception has occurred.
-     */
-    protected abstract OutputStream createStream() throws IOException;
-
-
-}
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/CompressedResponseWrapper.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/CompressedResponseWrapper.java
deleted file mode 100644
index b9ad084..0000000
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/CompressedResponseWrapper.java
+++ /dev/null
@@ -1,485 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.io.UnsupportedEncodingException;
-import java.util.Set;
-
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
-
-import org.eclipse.jetty.util.StringUtil;
-
-/*------------------------------------------------------------ */
-/**
- */
-public abstract class CompressedResponseWrapper extends HttpServletResponseWrapper
-{
-
-    public static final int DEFAULT_BUFFER_SIZE = 8192;
-    public static final int DEFAULT_MIN_COMPRESS_SIZE = 256;
-
-    private Set<String> _mimeTypes;
-    private boolean _excludeMimeTypes;
-    private int _bufferSize=DEFAULT_BUFFER_SIZE;
-    private int _minCompressSize=DEFAULT_MIN_COMPRESS_SIZE;
-    protected HttpServletRequest _request;
-
-    private PrintWriter _writer;
-    private AbstractCompressedStream _compressedStream;
-    private String _etag;
-    private long _contentLength=-1;
-    private boolean _noCompression;
-
-    /* ------------------------------------------------------------ */
-    public CompressedResponseWrapper(HttpServletRequest request, HttpServletResponse response)
-    {
-        super(response);
-        _request = request;
-    }
-
-
-    /* ------------------------------------------------------------ */
-    public long getContentLength()
-    {
-        return _contentLength;
-    }
-
-    /* ------------------------------------------------------------ */
-    @Override
-    public int getBufferSize()
-    {
-        return _bufferSize;
-    }
-    
-    /* ------------------------------------------------------------ */
-    public int getMinCompressSize()
-    {
-        return _minCompressSize;
-    }
-    
-    /* ------------------------------------------------------------ */
-    public String getETag()
-    {
-        return _etag;
-    }
-
-    /* ------------------------------------------------------------ */
-    public HttpServletRequest getRequest()
-    {
-        return _request;
-    }
-    
-    /* ------------------------------------------------------------ */
-    /**
-     */
-    public void setMimeTypes(Set<String> mimeTypes,boolean excludeMimeTypes)
-    {
-        _excludeMimeTypes=excludeMimeTypes;
-        _mimeTypes = mimeTypes;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     */
-    @Override
-    public void setBufferSize(int bufferSize)
-    {
-        _bufferSize = bufferSize;
-        if (_compressedStream!=null)
-            _compressedStream.setBufferSize(bufferSize);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper#setMinCompressSize(int)
-     */
-    public void setMinCompressSize(int minCompressSize)
-    {
-        _minCompressSize = minCompressSize;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper#setContentType(java.lang.String)
-     */
-    @Override
-    public void setContentType(String ct)
-    {
-        super.setContentType(ct);
-
-        if (!_noCompression && (_compressedStream==null || _compressedStream.getOutputStream()==null))
-        {
-            if (ct!=null)
-            {
-                int colon=ct.indexOf(";");
-                if (colon>0)
-                    ct=ct.substring(0,colon);
-
-                if (_mimeTypes.contains(StringUtil.asciiToLowerCase(ct))==_excludeMimeTypes)
-                    noCompression();
-            }
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper#setStatus(int, java.lang.String)
-     */
-    @SuppressWarnings("deprecation")
-    @Override
-    public void setStatus(int sc, String sm)
-    {
-        super.setStatus(sc,sm);
-        if (sc<200 || sc==204 || sc==205 || sc>=300)
-            noCompression();
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper#setStatus(int)
-     */
-    @Override
-    public void setStatus(int sc)
-    {
-        super.setStatus(sc);
-        if (sc<200 || sc==204 || sc==205 || sc>=300)
-            noCompression();
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper#setContentLength(int)
-     */
-    @Override
-    public void setContentLength(int length)
-    {
-        if (_noCompression)
-            super.setContentLength(length);
-        else
-            setContentLength((long)length);
-    }
-
-    /* ------------------------------------------------------------ */
-    protected void setContentLength(long length)
-    {
-        _contentLength=length;
-        if (_compressedStream!=null)
-            _compressedStream.setContentLength();
-        else if (_noCompression && _contentLength>=0)
-        {
-            HttpServletResponse response = (HttpServletResponse)getResponse();
-            if(_contentLength<Integer.MAX_VALUE)
-            {
-                response.setContentLength((int)_contentLength);
-            }
-            else
-            {
-                response.setHeader("Content-Length", Long.toString(_contentLength));
-            }
-        }
-    }
-    
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper#addHeader(java.lang.String, java.lang.String)
-     */
-    @Override
-    public void addHeader(String name, String value)
-    {
-        if ("content-length".equalsIgnoreCase(name))
-        {
-            _contentLength=Long.parseLong(value);
-            if (_compressedStream!=null)
-                _compressedStream.setContentLength();
-        }
-        else if ("content-type".equalsIgnoreCase(name))
-        {
-            setContentType(value);
-        }
-        else if ("content-encoding".equalsIgnoreCase(name))
-        {
-            super.addHeader(name,value);
-            if (!isCommitted())
-            {
-                noCompression();
-            }
-        }
-        else if ("etag".equalsIgnoreCase(name))
-            _etag=value;
-        else
-            super.addHeader(name,value);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper#flushBuffer()
-     */
-    @Override
-    public void flushBuffer() throws IOException
-    {
-        if (_writer!=null)
-            _writer.flush();
-        if (_compressedStream!=null)
-            _compressedStream.flush();
-        else
-            getResponse().flushBuffer();
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper#reset()
-     */
-    @Override
-    public void reset()
-    {
-        super.reset();
-        if (_compressedStream!=null)
-            _compressedStream.resetBuffer();
-        _writer=null;
-        _compressedStream=null;
-        _noCompression=false;
-        _contentLength=-1;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper#resetBuffer()
-     */
-    @Override
-    public void resetBuffer()
-    {
-        super.resetBuffer();
-        if (_compressedStream!=null)
-            _compressedStream.resetBuffer();
-        _writer=null;
-        _compressedStream=null;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper#sendError(int, java.lang.String)
-     */
-    @Override
-    public void sendError(int sc, String msg) throws IOException
-    {
-        resetBuffer();
-        super.sendError(sc,msg);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper#sendError(int)
-     */
-    @Override
-    public void sendError(int sc) throws IOException
-    {
-        resetBuffer();
-        super.sendError(sc);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper#sendRedirect(java.lang.String)
-     */
-    @Override
-    public void sendRedirect(String location) throws IOException
-    {
-        resetBuffer();
-        super.sendRedirect(location);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper#noCompression()
-     */
-    public void noCompression()
-    {
-        if (!_noCompression)
-            setDeferredHeaders();
-        _noCompression=true;
-        if (_compressedStream!=null)
-        {
-            try
-            {
-                _compressedStream.doNotCompress(false);
-            }
-            catch (IOException e)
-            {
-                throw new IllegalStateException(e);
-            }
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper#finish()
-     */
-    public void finish() throws IOException
-    {
-        if (_writer!=null && !_compressedStream.isClosed())
-            _writer.flush();
-        if (_compressedStream!=null)
-            _compressedStream.finish();
-        else 
-            setDeferredHeaders();
-    }
-
-    /* ------------------------------------------------------------ */
-    private void setDeferredHeaders()
-    {
-        if (!isCommitted())
-        {
-            if (_contentLength>=0)
-            {
-                if (_contentLength < Integer.MAX_VALUE)
-                    super.setContentLength((int)_contentLength);
-                else
-                    super.setHeader("Content-Length",Long.toString(_contentLength));
-            }
-            if(_etag!=null)
-                super.setHeader("ETag",_etag);
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper#setHeader(java.lang.String, java.lang.String)
-     */
-    @Override
-    public void setHeader(String name, String value)
-    {
-        if (_noCompression)
-            super.setHeader(name,value);
-        else if ("content-length".equalsIgnoreCase(name))
-        {
-            setContentLength(Long.parseLong(value));
-        }
-        else if ("content-type".equalsIgnoreCase(name))
-        {
-            setContentType(value);
-        }
-        else if ("content-encoding".equalsIgnoreCase(name))
-        {
-            super.setHeader(name,value);
-            if (!isCommitted())
-            {
-                noCompression();
-            }
-        }
-        else if ("etag".equalsIgnoreCase(name))
-            _etag=value;
-        else
-            super.setHeader(name,value);
-    }
-
-    /* ------------------------------------------------------------ */
-    @Override
-    public boolean containsHeader(String name)
-    {
-        if (!_noCompression && "etag".equalsIgnoreCase(name) && _etag!=null)
-            return true;
-        return super.containsHeader(name);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper#getOutputStream()
-     */
-    @Override
-    public ServletOutputStream getOutputStream() throws IOException
-    {
-        if (_compressedStream==null)
-        {
-            if (getResponse().isCommitted() || _noCompression)
-                return getResponse().getOutputStream();
-
-            _compressedStream=newCompressedStream(_request,(HttpServletResponse)getResponse());
-        }
-        else if (_writer!=null)
-            throw new IllegalStateException("getWriter() called");
-
-        return _compressedStream;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper#getWriter()
-     */
-    @Override
-    public PrintWriter getWriter() throws IOException
-    {
-        if (_writer==null)
-        {
-            if (_compressedStream!=null)
-                throw new IllegalStateException("getOutputStream() called");
-
-            if (getResponse().isCommitted() || _noCompression)
-                return getResponse().getWriter();
-
-            _compressedStream=newCompressedStream(_request,(HttpServletResponse)getResponse());
-            _writer=newWriter(_compressedStream,getCharacterEncoding());
-        }
-        return _writer;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper#setIntHeader(java.lang.String, int)
-     */
-    @Override
-    public void setIntHeader(String name, int value)
-    {
-        if ("content-length".equalsIgnoreCase(name))
-        {
-            _contentLength=value;
-            if (_compressedStream!=null)
-                _compressedStream.setContentLength();
-        }
-        else
-            super.setIntHeader(name,value);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Allows derived implementations to replace PrintWriter implementation.
-     *
-     * @param out the out
-     * @param encoding the encoding
-     * @return the prints the writer
-     * @throws UnsupportedEncodingException the unsupported encoding exception
-     */
-    protected PrintWriter newWriter(OutputStream out,String encoding) throws UnsupportedEncodingException
-    {
-        return encoding==null?new PrintWriter(out):new PrintWriter(new OutputStreamWriter(out,encoding));
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     *@return the underlying CompressedStream implementation
-     */
-    protected abstract AbstractCompressedStream newCompressedStream(HttpServletRequest _request, HttpServletResponse response) throws IOException;
-
-}
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/DeflatedOutputStream.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/DeflatedOutputStream.java
deleted file mode 100644
index bcc05a0..0000000
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/DeflatedOutputStream.java
+++ /dev/null
@@ -1,101 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.zip.Deflater;
-
-/**
- * Reimplementation of {@link java.util.zip.DeflaterOutputStream} that supports reusing the buffer.
- */
-public class DeflatedOutputStream extends FilterOutputStream
-{
-    protected final Deflater _def;
-    protected final byte[] _buf;
-    protected boolean closed = false;
-
-    public DeflatedOutputStream(OutputStream out, Deflater deflater, byte[] buffer)
-    {
-        super(out);
-        _def = deflater;
-        _buf = buffer;
-    }
-
-    @Override
-    public void write(int b) throws IOException
-    {
-        byte[] buf = new byte[1];
-        buf[0] = (byte)(b & 0xff);
-        write(buf,0,1);
-    }
-
-    @Override
-    public void write(byte[] b, int off, int len) throws IOException
-    {
-        if (_def.finished())
-            throw new IOException("Stream already finished");
-        if ((off | len | (off + len) | (b.length - (off + len))) < 0)
-            throw new IndexOutOfBoundsException();
-        if (len == 0)
-            return;
-        if (!_def.finished())
-        {
-            _def.setInput(b,off,len);
-            while (!_def.needsInput())
-            {
-                deflate();
-            }
-        }
-    }
-
-    private void deflate() throws IOException
-    {
-        int len = _def.deflate(_buf,0,_buf.length);
-        if (len > 0)
-        {
-            out.write(_buf,0,len);
-        }
-    }
-
-    public synchronized void finish() throws IOException
-    {
-        if (!_def.finished())
-        {
-            _def.finish();
-            while (!_def.finished())
-            {
-                deflate();
-            }
-        }
-    }
-
-    @Override
-    public synchronized void close() throws IOException
-    {
-        if (!closed)
-        {
-            finish();
-            out.close();
-            closed = true;
-        }
-    }
-
-}
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/GzipFactory.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/GzipFactory.java
deleted file mode 100644
index 33daa31..0000000
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/GzipFactory.java
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.util.zip.Deflater;
-
-import org.eclipse.jetty.http.HttpField;
-import org.eclipse.jetty.server.Request;
-
-public interface GzipFactory
-{
-    int getBufferSize();
-    
-    HttpField getVaryField();
-
-    Deflater getDeflater(Request request, long content_length);
-
-    boolean isExcludedMimeType(String asciiToLowerCase);
-
-    void recycle(Deflater deflater);
-
-}
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/GzipHandler.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/GzipHandler.java
deleted file mode 100644
index c9976e4..0000000
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/GzipHandler.java
+++ /dev/null
@@ -1,404 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.io.UnsupportedEncodingException;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.zip.DeflaterOutputStream;
-import java.util.zip.GZIPOutputStream;
-
-import javax.servlet.AsyncEvent;
-import javax.servlet.AsyncListener;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.http.HttpMethod;
-import org.eclipse.jetty.http.MimeTypes;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.handler.HandlerWrapper;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/* ------------------------------------------------------------ */
-/**
- * GZIP Handler This handler will gzip the content of a response if:
- * <ul>
- * <li>The handler is mapped to a matching path</li>
- * <li>The response status code is >=200 and <300
- * <li>The content length is unknown or more than the <code>minGzipSize</code> initParameter or the minGzipSize is 0(default)</li>
- * <li>The content-type matches one of the set of mimetypes to be compressed</li>
- * <li>The content-type does NOT match one of the set of mimetypes AND setExcludeMimeTypes is <code>true</code></li>
- * <li>No content-encoding is specified by the resource</li>
- * </ul>
- *
- * <p>
- * Compressing the content can greatly improve the network bandwidth usage, but at a cost of memory and CPU cycles. If this handler is used for static content,
- * then use of efficient direct NIO may be prevented, thus use of the gzip mechanism of the <code>org.eclipse.jetty.servlet.DefaultServlet</code> is advised instead.
- * </p>
- */
-public class GzipHandler extends HandlerWrapper
-{
-    private static final Logger LOG = Log.getLogger(GzipHandler.class);
-
-    final protected Set<String> _mimeTypes=new HashSet<>();
-    protected boolean _excludeMimeTypes=false;
-    protected Set<String> _excludedUA;
-    protected int _bufferSize = 8192;
-    protected int _minGzipSize = 256;
-    protected String _vary = "Accept-Encoding, User-Agent";
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Instantiates a new gzip handler.
-     */
-    public GzipHandler()
-    {
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Get the mime types.
-     *
-     * @return mime types to set
-     */
-    public Set<String> getMimeTypes()
-    {
-        return _mimeTypes;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Set the mime types.
-     *
-     * @param mimeTypes
-     *            the mime types to set
-     */
-    public void setMimeTypes(Set<String> mimeTypes)
-    {
-        _excludeMimeTypes=false;
-        _mimeTypes.clear();
-        _mimeTypes.addAll(mimeTypes);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Set the mime types.
-     *
-     * @param mimeTypes
-     *            the mime types to set
-     */
-    public void setMimeTypes(String mimeTypes)
-    {
-        if (mimeTypes != null)
-        {
-            _excludeMimeTypes=false;
-            _mimeTypes.clear();
-            StringTokenizer tok = new StringTokenizer(mimeTypes,",",false);
-            while (tok.hasMoreTokens())
-            {
-                _mimeTypes.add(tok.nextToken());
-            }
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Set the mime types.
-     */
-    public void setExcludeMimeTypes(boolean exclude)
-    {
-        _excludeMimeTypes=exclude;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Get the excluded user agents.
-     *
-     * @return excluded user agents
-     */
-    public Set<String> getExcluded()
-    {
-        return _excludedUA;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Set the excluded user agents.
-     *
-     * @param excluded
-     *            excluded user agents to set
-     */
-    public void setExcluded(Set<String> excluded)
-    {
-        _excludedUA = excluded;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Set the excluded user agents.
-     *
-     * @param excluded
-     *            excluded user agents to set
-     */
-    public void setExcluded(String excluded)
-    {
-        if (excluded != null)
-        {
-            _excludedUA = new HashSet<String>();
-            StringTokenizer tok = new StringTokenizer(excluded,",",false);
-            while (tok.hasMoreTokens())
-                _excludedUA.add(tok.nextToken());
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @return The value of the Vary header set if a response can be compressed.
-     */
-    public String getVary()
-    {
-        return _vary;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Set the value of the Vary header sent with responses that could be compressed.  
-     * <p>
-     * By default it is set to 'Accept-Encoding, User-Agent' since IE6 is excluded by 
-     * default from the excludedAgents. If user-agents are not to be excluded, then 
-     * this can be set to 'Accept-Encoding'.  Note also that shared caches may cache 
-     * many copies of a resource that is varied by User-Agent - one per variation of the 
-     * User-Agent, unless the cache does some normalization of the UA string.
-     * @param vary The value of the Vary header set if a response can be compressed.
-     */
-    public void setVary(String vary)
-    {
-        _vary = vary;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Get the buffer size.
-     *
-     * @return the buffer size
-     */
-    public int getBufferSize()
-    {
-        return _bufferSize;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Set the buffer size.
-     *
-     * @param bufferSize
-     *            buffer size to set
-     */
-    public void setBufferSize(int bufferSize)
-    {
-        _bufferSize = bufferSize;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Get the minimum reponse size.
-     *
-     * @return minimum reponse size
-     */
-    public int getMinGzipSize()
-    {
-        return _minGzipSize;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Set the minimum reponse size.
-     *
-     * @param minGzipSize
-     *            minimum reponse size
-     */
-    public void setMinGzipSize(int minGzipSize)
-    {
-        _minGzipSize = minGzipSize;
-    }
-    
-    /* ------------------------------------------------------------ */
-    @Override
-    protected void doStart() throws Exception
-    {
-        if (_mimeTypes.size()==0 && _excludeMimeTypes)
-        {
-            _excludeMimeTypes = true;
-            for (String type:MimeTypes.getKnownMimeTypes())
-            {
-                if (type.equals("image/svg+xml")) //always compressable (unless .svgz file)
-                    continue;
-                if (type.startsWith("image/")||
-                    type.startsWith("audio/")||
-                    type.startsWith("video/"))
-                    _mimeTypes.add(type);
-            }
-            _mimeTypes.add("application/compress");
-            _mimeTypes.add("application/zip");
-            _mimeTypes.add("application/gzip");
-        }
-        super.doStart();
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see org.eclipse.jetty.server.handler.HandlerWrapper#handle(java.lang.String, org.eclipse.jetty.server.Request, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
-     */
-    @Override
-    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-    {
-        if (_handler!=null && isStarted())
-        {
-            String ae = request.getHeader("accept-encoding");
-            if (ae != null && ae.indexOf("gzip")>=0 && !response.containsHeader("Content-Encoding")
-                    && !HttpMethod.HEAD.is(request.getMethod()))
-            {
-                if (_excludedUA!=null)
-                {
-                    String ua = request.getHeader("User-Agent");
-                    if (_excludedUA.contains(ua))
-                    {
-                        _handler.handle(target,baseRequest, request, response);
-                        return;
-                    }
-                }
-
-                final CompressedResponseWrapper wrappedResponse = newGzipResponseWrapper(request,response);
-
-                boolean exceptional=true;
-                try
-                {
-                    _handler.handle(target, baseRequest, request, wrappedResponse);
-                    exceptional=false;
-                }
-                finally
-                {
-                    if (request.isAsyncStarted())
-                    {
-                        request.getAsyncContext().addListener(new AsyncListener()
-                        {
-                            
-                            @Override
-                            public void onTimeout(AsyncEvent event) throws IOException
-                            {
-                            }
-                            
-                            @Override
-                            public void onStartAsync(AsyncEvent event) throws IOException
-                            {
-                            }
-                            
-                            @Override
-                            public void onError(AsyncEvent event) throws IOException
-                            {
-                            }
-                            
-                            @Override
-                            public void onComplete(AsyncEvent event) throws IOException
-                            {
-                                try
-                                {
-                                    wrappedResponse.finish();
-                                }
-                                catch(IOException e)
-                                {
-                                    LOG.warn(e);
-                                }
-                            }
-                        });
-                    }
-                    else if (exceptional && !response.isCommitted())
-                    {
-                        wrappedResponse.resetBuffer();
-                        wrappedResponse.noCompression();
-                    }
-                    else
-                        wrappedResponse.finish();
-                }
-            }
-            else
-            {
-                _handler.handle(target,baseRequest, request, response);
-            }
-        }
-    }
-
-    /**
-     * Allows derived implementations to replace ResponseWrapper implementation.
-     *
-     * @param request the request
-     * @param response the response
-     * @return the gzip response wrapper
-     */
-    protected CompressedResponseWrapper newGzipResponseWrapper(HttpServletRequest request, HttpServletResponse response)
-    {
-        return new CompressedResponseWrapper(request,response)
-        {
-            {
-                super.setMimeTypes(GzipHandler.this._mimeTypes,GzipHandler.this._excludeMimeTypes);
-                super.setBufferSize(GzipHandler.this._bufferSize);
-                super.setMinCompressSize(GzipHandler.this._minGzipSize);
-            }
-
-            @Override
-            protected AbstractCompressedStream newCompressedStream(HttpServletRequest request,HttpServletResponse response) throws IOException
-            {
-                return new AbstractCompressedStream("gzip",request,this,_vary)
-                {
-                    @Override
-                    protected DeflaterOutputStream createStream() throws IOException
-                    {
-                        return new GZIPOutputStream(_response.getOutputStream(),_bufferSize);
-                    }
-                };
-            }
-
-            @Override
-            protected PrintWriter newWriter(OutputStream out,String encoding) throws UnsupportedEncodingException
-            {
-                return GzipHandler.this.newWriter(out,encoding);
-            }
-        };
-    }
-
-    /**
-     * Allows derived implementations to replace PrintWriter implementation.
-     *
-     * @param out the out
-     * @param encoding the encoding
-     * @return the prints the writer
-     * @throws UnsupportedEncodingException
-     */
-    protected PrintWriter newWriter(OutputStream out,String encoding) throws UnsupportedEncodingException
-    {
-        return encoding==null?new PrintWriter(out):new PrintWriter(new OutputStreamWriter(out,encoding));
-    }
-}
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/GzipHttpOutput.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/GzipHttpOutput.java
deleted file mode 100644
index c7ffcd2..0000000
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/GzipHttpOutput.java
+++ /dev/null
@@ -1,405 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.nio.ByteBuffer;
-import java.nio.channels.WritePendingException;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.zip.CRC32;
-import java.util.zip.Deflater;
-
-import org.eclipse.jetty.http.HttpFields;
-import org.eclipse.jetty.http.HttpGenerator;
-import org.eclipse.jetty.http.HttpHeader;
-import org.eclipse.jetty.http.MimeTypes;
-import org.eclipse.jetty.server.HttpChannel;
-import org.eclipse.jetty.server.HttpOutput;
-import org.eclipse.jetty.server.Response;
-import org.eclipse.jetty.servlets.AsyncGzipFilter;
-import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.IteratingNestedCallback;
-import org.eclipse.jetty.util.StringUtil;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-public class GzipHttpOutput extends HttpOutput
-{
-    public static Logger LOG = Log.getLogger(GzipHttpOutput.class);
-    private final static HttpGenerator.CachedHttpField CONTENT_ENCODING_GZIP=new HttpGenerator.CachedHttpField(HttpHeader.CONTENT_ENCODING,"gzip");
-    private final static byte[] GZIP_HEADER = new byte[] { (byte)0x1f, (byte)0x8b, Deflater.DEFLATED, 0, 0, 0, 0, 0, 0, 0 };
-    
-    private enum GZState { NOT_COMPRESSING, MIGHT_COMPRESS, COMMITTING, COMPRESSING, FINISHED};
-    private final AtomicReference<GZState> _state = new AtomicReference<>(GZState.NOT_COMPRESSING);
-    private final CRC32 _crc = new CRC32();
-    
-    private Deflater _deflater;
-    private GzipFactory _factory;
-    private ByteBuffer _buffer;
-    
-    public GzipHttpOutput(HttpChannel<?> channel)
-    {
-        super(channel);
-    }
-
-    @Override
-    public void reset()
-    {
-        _state.set(GZState.NOT_COMPRESSING);
-        super.reset();
-    }
-
-    @Override
-    protected void write(ByteBuffer content, boolean complete, Callback callback)
-    {
-        switch (_state.get())
-        {
-            case NOT_COMPRESSING:
-                super.write(content,complete,callback);
-                return;
-
-            case MIGHT_COMPRESS:
-                commit(content,complete,callback);
-                break;
-                
-            case COMMITTING:
-                callback.failed(new WritePendingException());
-                break;
-
-            case COMPRESSING:
-                gzip(content,complete,callback);
-                break;
-
-            default:
-                callback.failed(new IllegalStateException("state="+_state.get()));
-                break;
-        }
-    }
-
-    private void superWrite(ByteBuffer content, boolean complete, Callback callback)
-    {
-        super.write(content,complete,callback);
-    }
-    
-    private void addTrailer()
-    {
-        int i=_buffer.limit();
-        _buffer.limit(i+8);
-        
-        int v=(int)_crc.getValue();
-        _buffer.put(i++,(byte)(v & 0xFF));
-        _buffer.put(i++,(byte)((v>>>8) & 0xFF));
-        _buffer.put(i++,(byte)((v>>>16) & 0xFF));
-        _buffer.put(i++,(byte)((v>>>24) & 0xFF));
-        
-        v=_deflater.getTotalIn();
-        _buffer.put(i++,(byte)(v & 0xFF));
-        _buffer.put(i++,(byte)((v>>>8) & 0xFF));
-        _buffer.put(i++,(byte)((v>>>16) & 0xFF));
-        _buffer.put(i++,(byte)((v>>>24) & 0xFF));
-    }
-    
-    
-    private void gzip(ByteBuffer content, boolean complete, final Callback callback)
-    {
-        if (content.hasRemaining() || complete)
-        {
-            if (content.hasArray())
-                new GzipArrayCB(content,complete,callback).iterate();
-            else
-                new GzipBufferCB(content,complete,callback).iterate();
-        }
-        else
-            callback.succeeded();
-    }
-
-    protected void commit(ByteBuffer content, boolean complete, Callback callback)
-    {
-        // Are we excluding because of status?
-        Response response=getHttpChannel().getResponse();
-        int sc = response.getStatus();
-        if (sc>0 && (sc<200 || sc==204 || sc==205 || sc>=300))
-        {
-            LOG.debug("{} exclude by status {}",this,sc);
-            noCompression();
-            super.write(content,complete,callback);
-            return;
-        }
-        
-        // Are we excluding because of mime-type?
-        String ct = getHttpChannel().getResponse().getContentType();
-        if (ct!=null)
-        {
-            ct=MimeTypes.getContentTypeWithoutCharset(ct);
-            if (_factory.isExcludedMimeType(StringUtil.asciiToLowerCase(ct)))
-            {
-                LOG.debug("{} exclude by mimeType {}",this,ct);
-                noCompression();
-                super.write(content,complete,callback);
-                return;
-            }
-        }
-        
-        // Has the Content-Encoding header already been set?
-        String ce=getHttpChannel().getResponse().getHeader("Content-Encoding");
-        if (ce != null)
-        {
-            LOG.debug("{} exclude by content-encoding {}",this,ce);
-            noCompression();
-            super.write(content,complete,callback);
-            return;
-        }
-        
-        // Are we the thread that commits?
-        if (_state.compareAndSet(GZState.MIGHT_COMPRESS,GZState.COMMITTING))
-        {
-            // We are varying the response due to accept encoding header.
-            HttpFields fields = response.getHttpFields();
-            fields.add(_factory.getVaryField());
-
-            long content_length = response.getContentLength();
-            if (content_length<0 && complete)
-                content_length=content.remaining();
-            
-            _deflater = _factory.getDeflater(getHttpChannel().getRequest(),content_length);
-            
-            if (_deflater==null)
-            {
-                LOG.debug("{} exclude no deflater",this);
-                _state.set(GZState.NOT_COMPRESSING);
-                super.write(content,complete,callback);
-                return;
-            }
-
-            fields.put(CONTENT_ENCODING_GZIP);
-            _crc.reset();
-            _buffer=getHttpChannel().getByteBufferPool().acquire(_factory.getBufferSize(),false);
-            BufferUtil.fill(_buffer,GZIP_HEADER,0,GZIP_HEADER.length);
-
-            // Adjust headers
-            response.setContentLength(-1);
-            String etag=fields.get(HttpHeader.ETAG);
-            if (etag!=null)
-                fields.put(HttpHeader.ETAG,etag.substring(0,etag.length()-1)+AsyncGzipFilter.ETAG_GZIP+ '"');
-
-            LOG.debug("{} compressing {}",this,_deflater);
-            _state.set(GZState.COMPRESSING);
-            
-            gzip(content,complete,callback);
-        }
-        else
-            callback.failed(new WritePendingException());
-    }
-
-    public void noCompression()
-    {
-        while (true)
-        {
-            switch (_state.get())
-            {
-                case NOT_COMPRESSING:
-                    return;
-
-                case MIGHT_COMPRESS:
-                    if (_state.compareAndSet(GZState.MIGHT_COMPRESS,GZState.NOT_COMPRESSING))
-                        return;
-                    break;
-
-                default:
-                    throw new IllegalStateException(_state.get().toString());
-            }
-        }
-    }
-
-    public void noCompressionIfPossible()
-    {
-        while (true)
-        {
-            switch (_state.get())
-            {
-                case COMPRESSING:
-                case NOT_COMPRESSING:
-                    return;
-
-                case MIGHT_COMPRESS:
-                    if (_state.compareAndSet(GZState.MIGHT_COMPRESS,GZState.NOT_COMPRESSING))
-                        return;
-                    break;
-
-                default:
-                    throw new IllegalStateException(_state.get().toString());
-            }
-        }
-    }
-
-    public boolean mightCompress()
-    {
-        return _state.get()==GZState.MIGHT_COMPRESS;
-    }
-
-    public void mightCompress(GzipFactory factory)
-    {
-        while (true)
-        {
-            switch (_state.get())
-            {
-                case NOT_COMPRESSING:
-                    _factory=factory;
-                    if (_state.compareAndSet(GZState.NOT_COMPRESSING,GZState.MIGHT_COMPRESS))
-                    {
-                        LOG.debug("{} might compress",this);
-                        return;
-                    }
-                    _factory=null;
-                    break;
-                    
-                default:
-                    throw new IllegalStateException(_state.get().toString());
-            }
-        }
-    }
-    
-    private class GzipArrayCB extends IteratingNestedCallback
-    {        
-        private final boolean _complete;
-        public GzipArrayCB(ByteBuffer content, boolean complete, Callback callback)
-        {
-            super(callback);
-            _complete=complete;
-
-             byte[] array=content.array();
-             int off=content.arrayOffset()+content.position();
-             int len=content.remaining();
-             _crc.update(array,off,len);
-             _deflater.setInput(array,off,len);
-             if (complete)
-                 _deflater.finish();
-             content.position(content.limit());
-        }
-
-        @Override
-        protected Action process() throws Exception
-        {
-            if (_deflater.needsInput())
-            {
-                if (_deflater.finished())
-                {
-                    _factory.recycle(_deflater);
-                    _deflater=null;
-                    getHttpChannel().getByteBufferPool().release(_buffer);
-                    _buffer=null;
-                    return Action.SUCCEEDED;
-                }
-
-                if (!_complete)
-                    return Action.SUCCEEDED;
-                
-                _deflater.finish();
-            }
-
-            BufferUtil.compact(_buffer);
-            int off=_buffer.arrayOffset()+_buffer.limit();
-            int len=_buffer.capacity()-_buffer.limit()- (_complete?8:0);
-            if (len>0)
-            {
-                int produced=_deflater.deflate(_buffer.array(),off,len,Deflater.NO_FLUSH);
-                _buffer.limit(_buffer.limit()+produced);
-            }
-            boolean complete=_deflater.finished();
-            if (complete)
-                addTrailer();
-            
-            superWrite(_buffer,complete,this);
-            return Action.SCHEDULED;
-        }
-    }
-    
-    private class GzipBufferCB extends IteratingNestedCallback
-    {        
-        private final ByteBuffer _input;
-        private final ByteBuffer _content;
-        private final boolean _last;
-        public GzipBufferCB(ByteBuffer content, boolean complete, Callback callback)
-        {
-            super(callback);
-            _input=getHttpChannel().getByteBufferPool().acquire(Math.min(_factory.getBufferSize(),content.remaining()),false);
-            _content=content;
-            _last=complete;
-        }
-
-        @Override
-        protected Action process() throws Exception
-        {
-            if (_deflater.needsInput())
-            {                
-                if (BufferUtil.isEmpty(_content))
-                {                    
-                    if (_deflater.finished())
-                    {
-                        _factory.recycle(_deflater);
-                        _deflater=null;
-                        getHttpChannel().getByteBufferPool().release(_buffer);
-                        _buffer=null;
-                        return Action.SUCCEEDED;
-                    }
-                    
-                    if (!_last)
-                    {
-                        return Action.SUCCEEDED;
-                    }
-                    
-                    _deflater.finish();
-                }
-                else
-                {
-                    BufferUtil.clearToFill(_input);
-                    int took=BufferUtil.put(_content,_input);
-                    BufferUtil.flipToFlush(_input,0);
-                    if (took==0)
-                        throw new IllegalStateException();
-                   
-                    byte[] array=_input.array();
-                    int off=_input.arrayOffset()+_input.position();
-                    int len=_input.remaining();
-
-                    _crc.update(array,off,len);
-                    _deflater.setInput(array,off,len);                
-                    if (_last && BufferUtil.isEmpty(_content))
-                        _deflater.finish();
-                }
-            }
-
-            BufferUtil.compact(_buffer);
-            int off=_buffer.arrayOffset()+_buffer.limit();
-            int len=_buffer.capacity()-_buffer.limit() - (_last?8:0);
-            if (len>0)
-            {
-                int produced=_deflater.deflate(_buffer.array(),off,len,Deflater.NO_FLUSH);
-                _buffer.limit(_buffer.limit()+produced);
-            }
-            boolean finished=_deflater.finished();
-            
-            if (finished)
-                addTrailer();
-                
-            superWrite(_buffer,finished,this);
-            return Action.SCHEDULED;
-        }
-    }
-}
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/GzipOutputStream.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/GzipOutputStream.java
deleted file mode 100644
index cb645a5..0000000
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/GzipOutputStream.java
+++ /dev/null
@@ -1,72 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.zip.CRC32;
-import java.util.zip.Deflater;
-
-/**
- * Reimplementation of {@link java.util.zip.GZIPOutputStream} that supports reusing a {@link Deflater} instance.
- */
-public class GzipOutputStream extends DeflatedOutputStream
-{
-
-    private final static byte[] GZIP_HEADER = new byte[]
-    { (byte)0x1f, (byte)0x8b, Deflater.DEFLATED, 0, 0, 0, 0, 0, 0, 0 };
-
-    private final CRC32 _crc = new CRC32();
-
-    public GzipOutputStream(OutputStream out, Deflater deflater, byte[] buffer) throws IOException
-    {
-        super(out,deflater,buffer);
-        out.write(GZIP_HEADER);
-    }
-
-    @Override
-    public synchronized void write(byte[] buf, int off, int len) throws IOException
-    {
-        super.write(buf,off,len);
-        _crc.update(buf,off,len);
-    }
-
-    @Override
-    public synchronized void finish() throws IOException
-    {
-        if (!_def.finished())
-        {
-            super.finish();
-            byte[] trailer = new byte[8];
-            writeInt((int)_crc.getValue(),trailer,0);
-            writeInt(_def.getTotalIn(),trailer,4);
-            out.write(trailer);
-        }
-    }
-
-    private void writeInt(int i, byte[] buf, int offset)
-    {
-        int o = offset;
-        buf[o++] = (byte)(i & 0xFF);
-        buf[o++] = (byte)((i >>> 8) & 0xFF);
-        buf[o++] = (byte)((i >>> 16) & 0xFF);
-        buf[o++] = (byte)((i >>> 24) & 0xFF);
-    }
-
-}
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/package-info.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/package-info.java
deleted file mode 100644
index 59c969a..0000000
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-/**
- * Jetty Servlets : GZIP Filter Classes
- */
-package org.eclipse.jetty.servlets.gzip;
-
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/AsyncManipFilter.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/AsyncManipFilter.java
new file mode 100644
index 0000000..c01bdec
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/AsyncManipFilter.java
@@ -0,0 +1,103 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.io.IOException;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.AsyncEvent;
+import javax.servlet.AsyncListener;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+/**
+ * Filter that merely manipulates the AsyncContext.
+ * <p>
+ * The pattern of manipulation is modeled after how DOSFilter behaves. The purpose of this filter is to test arbitrary filter chains that could see unintended
+ * side-effects of async context manipulation.
+ */
+public class AsyncManipFilter implements Filter, AsyncListener
+{
+    private static final Logger LOG = Log.getLogger(AsyncManipFilter.class);
+    private static final String MANIP_KEY = AsyncManipFilter.class.getName();
+
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException
+    {
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
+    {
+        LOG.debug("doFilter() - {}", chain);
+        AsyncContext ctx = (AsyncContext)request.getAttribute(MANIP_KEY);
+        if (ctx == null)
+        {
+            LOG.debug("Initial pass through: {}", chain);
+            ctx = request.startAsync();
+            ctx.addListener(this);
+            ctx.setTimeout(1000);
+            LOG.debug("AsyncContext: {}", ctx);
+            request.setAttribute(MANIP_KEY,ctx);
+            return;
+        }
+        else
+        {
+            LOG.debug("Second pass through: {}", chain);
+            chain.doFilter(request,response);
+        }
+    }
+
+    @Override
+    public void destroy()
+    {
+    }
+
+    @Override
+    public void onComplete(AsyncEvent event) throws IOException
+    {
+        LOG.debug("onComplete() {}",event);
+    }
+
+    @Override
+    public void onTimeout(AsyncEvent event) throws IOException
+    {
+        LOG.debug("onTimeout() {}",event.getAsyncContext());
+        event.getAsyncContext().dispatch();
+    }
+
+    @Override
+    public void onError(AsyncEvent event) throws IOException
+    {
+        LOG.debug("onError()",event.getThrowable());
+    }
+
+    @Override
+    public void onStartAsync(AsyncEvent event) throws IOException
+    {
+        LOG.debug("onTimeout() {}",event);
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/AsyncScheduledDispatchWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/AsyncScheduledDispatchWrite.java
new file mode 100644
index 0000000..01f74b1
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/AsyncScheduledDispatchWrite.java
@@ -0,0 +1,121 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.io.IOException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@SuppressWarnings("serial")
+public abstract class AsyncScheduledDispatchWrite extends TestDirContentServlet
+{
+    public static class Default extends AsyncScheduledDispatchWrite
+    {
+        public Default()
+        {
+            super(true);
+        }
+    }
+    
+    public static class Passed extends AsyncScheduledDispatchWrite
+    {
+        public Passed()
+        {
+            super(false);
+        }
+    }
+
+    private static class DispatchBack implements Runnable
+    {
+        private final AsyncContext ctx;
+
+        public DispatchBack(AsyncContext ctx)
+        {
+            this.ctx = ctx;
+        }
+
+        @Override
+        public void run()
+        {
+            ctx.dispatch();
+        }
+    }
+
+    private final boolean originalReqResp;
+    private ScheduledExecutorService scheduler;
+
+    public AsyncScheduledDispatchWrite(boolean originalReqResp)
+    {
+        this.originalReqResp = originalReqResp;
+    }
+
+    public void init(ServletConfig config) throws ServletException
+    {
+        super.init(config);
+        scheduler = Executors.newScheduledThreadPool(3);
+    }
+
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    {
+        Boolean suspended = (Boolean)request.getAttribute("SUSPENDED");
+        if (suspended == null || !suspended)
+        {
+            request.setAttribute("SUSPENDED",Boolean.TRUE);
+            AsyncContext ctx;
+            if (originalReqResp)
+            {
+                // Use Original Request & Response
+                ctx = request.startAsync();
+            }
+            else
+            {
+                // Pass Request & Response
+                ctx = request.startAsync(request,response);
+            }
+            ctx.setTimeout(0);
+            scheduler.schedule(new DispatchBack(ctx),500,TimeUnit.MILLISECONDS);
+        }
+        else
+        {
+            String fileName = request.getServletPath();
+            byte[] dataBytes = loadContentFileBytes(fileName);
+
+            response.setContentLength(dataBytes.length);
+
+            ServletOutputStream out = response.getOutputStream();
+
+            if (fileName.endsWith("txt"))
+                response.setContentType("text/plain");
+            else if (fileName.endsWith("mp3"))
+                response.setContentType("audio/mpeg");
+            response.setHeader("ETag","W/etag-" + fileName);
+
+            out.write(dataBytes);
+        }
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/AsyncTimeoutCompleteWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/AsyncTimeoutCompleteWrite.java
new file mode 100644
index 0000000..ab6ca7f
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/AsyncTimeoutCompleteWrite.java
@@ -0,0 +1,137 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import static org.hamcrest.Matchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+import java.io.IOException;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.AsyncEvent;
+import javax.servlet.AsyncListener;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Respond with requested content, but via AsyncContext manipulation.
+ * <p>
+ * 
+ * <pre>
+ *   1) startAsync
+ *   2) AsyncContext.setTimeout()
+ *   3) onTimeout()
+ *   4) send-response
+ *   5) AsyncContext.complete()
+ * </pre>
+ */
+@SuppressWarnings("serial")
+public abstract class AsyncTimeoutCompleteWrite extends TestDirContentServlet implements AsyncListener
+{
+    public static class Default extends AsyncTimeoutCompleteWrite
+    {
+        public Default()
+        {
+            super(true);
+        }
+    }
+    
+    public static class Passed extends AsyncTimeoutCompleteWrite
+    {
+        public Passed()
+        {
+            super(false);
+        }
+    }
+
+    private final boolean originalReqResp;
+
+    public AsyncTimeoutCompleteWrite(boolean originalReqResp)
+    {
+        this.originalReqResp = originalReqResp;
+    }
+
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    {
+        assertThat("'filename' request attribute shouldn't be declared",request.getAttribute("filename"),nullValue());
+
+        AsyncContext ctx = (AsyncContext)request.getAttribute(this.getClass().getName());
+        assertThat("AsyncContext (shouldn't be in request attribute)", ctx, nullValue());
+        
+        if (originalReqResp)
+        {
+            // Use Original Request & Response
+            ctx = request.startAsync();
+        }
+        else
+        {
+            // Pass Request & Response
+            ctx = request.startAsync(request,response);
+        }
+        String fileName = request.getServletPath();
+        request.setAttribute("filename",fileName);
+        ctx.addListener(this);
+        ctx.setTimeout(20);
+        
+        // Setup indication of a redispatch (which this scenario shouldn't do)
+        request.setAttribute(this.getClass().getName(),ctx);
+    }
+
+    @Override
+    public void onComplete(AsyncEvent event) throws IOException
+    {
+    }
+
+    @Override
+    public void onTimeout(AsyncEvent event) throws IOException
+    {
+        HttpServletRequest request = (HttpServletRequest)event.getSuppliedRequest();
+        HttpServletResponse response = (HttpServletResponse)event.getSuppliedResponse();
+
+        String fileName = (String)request.getAttribute("filename");
+        byte[] dataBytes = loadContentFileBytes(fileName);
+
+        response.setContentLength(dataBytes.length);
+
+        ServletOutputStream out = response.getOutputStream();
+
+        if (fileName.endsWith("txt"))
+            response.setContentType("text/plain");
+        else if (fileName.endsWith("mp3"))
+            response.setContentType("audio/mpeg");
+        response.setHeader("ETag","W/etag-" + fileName);
+
+        out.write(dataBytes);
+
+        event.getAsyncContext().complete();
+    }
+
+    @Override
+    public void onError(AsyncEvent event) throws IOException
+    {
+    }
+
+    @Override
+    public void onStartAsync(AsyncEvent event) throws IOException
+    {
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/AsyncTimeoutDispatchWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/AsyncTimeoutDispatchWrite.java
new file mode 100644
index 0000000..5f3ed00
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/AsyncTimeoutDispatchWrite.java
@@ -0,0 +1,121 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.io.IOException;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.AsyncEvent;
+import javax.servlet.AsyncListener;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@SuppressWarnings("serial")
+public class AsyncTimeoutDispatchWrite extends TestDirContentServlet implements AsyncListener
+{
+    public static class Default extends AsyncTimeoutDispatchWrite
+    {
+        public Default()
+        {
+            super(true);
+        }
+    }
+    
+    public static class Passed extends AsyncTimeoutDispatchWrite
+    {
+        public Passed()
+        {
+            super(false);
+        }
+    }
+
+    private final boolean originalReqResp;
+
+    public AsyncTimeoutDispatchWrite(boolean originalReqResp)
+    {
+        this.originalReqResp = originalReqResp;
+    }
+
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    {
+        AsyncContext ctx = (AsyncContext)request.getAttribute(AsyncContext.class.getName());
+        if (ctx == null)
+        {
+            // First pass through
+            if (originalReqResp)
+            {
+                // Use Original Request & Response
+                ctx = request.startAsync();
+            }
+            else
+            {
+                // Pass Request & Response
+                ctx = request.startAsync(request,response);
+            }
+            ctx.addListener(this);
+            ctx.setTimeout(200);
+            request.setAttribute(AsyncContext.class.getName(),ctx);
+        }
+        else
+        {
+            // second pass through, as result of timeout -> dispatch
+            String fileName = request.getServletPath();
+            byte[] dataBytes = loadContentFileBytes(fileName);
+
+            response.setContentLength(dataBytes.length);
+
+            ServletOutputStream out = response.getOutputStream();
+
+            if (fileName.endsWith("txt"))
+                response.setContentType("text/plain");
+            else if (fileName.endsWith("mp3"))
+                response.setContentType("audio/mpeg");
+            response.setHeader("ETag","W/etag-" + fileName);
+
+            out.write(dataBytes);
+            // no need to call AsyncContext.complete() from here
+            // in fact, it will cause an IllegalStateException if we do
+            // ctx.complete();
+        }
+    }
+
+    @Override
+    public void onComplete(AsyncEvent event) throws IOException
+    {
+    }
+
+    @Override
+    public void onTimeout(AsyncEvent event) throws IOException
+    {
+        event.getAsyncContext().dispatch();
+    }
+
+    @Override
+    public void onError(AsyncEvent event) throws IOException
+    {
+    }
+
+    @Override
+    public void onStartAsync(AsyncEvent event) throws IOException
+    {
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/GzipContentLengthTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/GzipContentLengthTest.java
new file mode 100644
index 0000000..a2b95d9
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/GzipContentLengthTest.java
@@ -0,0 +1,329 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.junit.Assert.assertThat;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.http.HttpTester;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.handler.gzip.GzipTester.ContentMetadata;
+import org.eclipse.jetty.toolchain.test.TestTracker;
+import org.eclipse.jetty.toolchain.test.TestingDir;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+/**
+ * Test the GzipHandler support for Content-Length setting variations.
+ *
+ * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
+ */
+@RunWith(Parameterized.class)
+public class GzipContentLengthTest
+{
+    @Rule
+    public final TestTracker tracker = new TestTracker();
+
+    @Rule
+    public TestingDir testingdir = new TestingDir();
+    
+    private static final HttpConfiguration defaultHttp = new HttpConfiguration();
+    private static final int LARGE = defaultHttp.getOutputBufferSize() * 8;
+    private static final int MEDIUM = defaultHttp.getOutputBufferSize();
+    private static final int SMALL = defaultHttp.getOutputBufferSize() / 4;
+    private static final int TINY = GzipHandler.DEFAULT_MIN_GZIP_SIZE / 2;
+    private static final boolean EXPECT_COMPRESSED = true;
+
+    @Parameters(name = "{0} bytes - {1} - compressed({2})")
+    public static List<Object[]> data()
+    {
+        List<Object[]> ret = new ArrayList<Object[]>();
+
+        ret.add(new Object[] { 0, "empty.txt", !EXPECT_COMPRESSED});
+        ret.add(new Object[] { TINY, "file-tiny.txt", !EXPECT_COMPRESSED});
+        ret.add(new Object[] { SMALL, "file-small.txt", EXPECT_COMPRESSED});
+        ret.add(new Object[] { SMALL, "file-small.mp3", !EXPECT_COMPRESSED});
+        ret.add(new Object[] { MEDIUM, "file-med.txt", EXPECT_COMPRESSED});
+        ret.add(new Object[] { MEDIUM, "file-medium.mp3", !EXPECT_COMPRESSED});
+        ret.add(new Object[] { LARGE, "file-large.txt", EXPECT_COMPRESSED});
+        ret.add(new Object[] { LARGE, "file-large.mp3", !EXPECT_COMPRESSED});
+
+        return ret;
+    }
+
+    @Parameter(0)
+    public int fileSize;
+    @Parameter(1)
+    public String fileName;
+    @Parameter(2)
+    public boolean expectCompressed;
+    
+    private void testWithGzip(Class<? extends TestDirContentServlet> contentServlet) throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir, GzipHandler.GZIP);
+        
+        // Add AsyncGzip Configuration
+        tester.getGzipHandler().setIncludedMimeTypes("text/plain");
+        tester.getGzipHandler().setIncludedPaths("*.txt","*.mp3");
+
+        // Add content servlet
+        tester.setContentServlet(contentServlet);
+        
+        try
+        {
+            String testFilename = String.format("%s-%s", contentServlet.getSimpleName(), fileName);
+            File testFile = tester.prepareServerFile(testFilename,fileSize);
+            
+            tester.start();
+            
+            HttpTester.Response response = tester.executeRequest("GET","/context/" + testFile.getName(),5,TimeUnit.SECONDS);
+            
+            if (response.getStatus()!=200)
+                System.err.println("DANG!!!! "+response);
+            
+            assertThat("Response status", response.getStatus(), is(HttpStatus.OK_200));
+            
+            if (expectCompressed)
+            {
+                // Must be gzip compressed
+                assertThat("Content-Encoding",response.get("Content-Encoding"),containsString(GzipHandler.GZIP));
+            } else
+            {
+                assertThat("Content-Encoding",response.get("Content-Encoding"),not(containsString(GzipHandler.GZIP)));
+            }
+            
+            // Uncompressed content Size
+            ContentMetadata content = tester.getResponseMetadata(response);
+            assertThat("(Uncompressed) Content Length", content.size, is((long)fileSize));
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    /**
+     * Test with content servlet that does:  
+     * AsyncContext create -> timeout -> onTimeout -> write-response -> complete
+     * @throws Exception on test failure
+     */
+    @Test
+    public void testAsyncTimeoutCompleteWrite_Default() throws Exception
+    {
+        testWithGzip(AsyncTimeoutCompleteWrite.Default.class);
+    }
+    
+    /**
+     * Test with content servlet that does:  
+     * AsyncContext create -> timeout -> onTimeout -> write-response -> complete
+     * @throws Exception on test failure
+     */
+    @Test
+    public void testAsyncTimeoutCompleteWrite_Passed() throws Exception
+    {
+        testWithGzip(AsyncTimeoutCompleteWrite.Passed.class);
+    }
+    
+    /**
+     * Test with content servlet that does:  
+     * AsyncContext create -> timeout -> onTimeout -> dispatch -> write-response
+     * @throws Exception on test failure
+     */
+    @Test
+    public void testAsyncTimeoutDispatchWrite_Default() throws Exception
+    {
+        testWithGzip(AsyncTimeoutDispatchWrite.Default.class);
+    }
+    
+    /**
+     * Test with content servlet that does:  
+     * AsyncContext create -> timeout -> onTimeout -> dispatch -> write-response
+     * @throws Exception on test failure
+     */
+    @Test
+    public void testAsyncTimeoutDispatchWrite_Passed() throws Exception
+    {
+        testWithGzip(AsyncTimeoutDispatchWrite.Passed.class);
+    }
+
+    /**
+     * Test with content servlet that does:  
+     * AsyncContext create -> no-timeout -> scheduler.schedule -> dispatch -> write-response
+     * @throws Exception on test failure
+     */
+    @Test
+    public void testAsyncScheduledDispatchWrite_Default() throws Exception
+    {
+        testWithGzip(AsyncScheduledDispatchWrite.Default.class);
+    }
+    
+    /**
+     * Test with content servlet that does:  
+     * AsyncContext create -> no-timeout -> scheduler.schedule -> dispatch -> write-response
+     * @throws Exception on test failure
+     */
+    @Test
+    public void testAsyncScheduledDispatchWrite_Passed() throws Exception
+    {
+        testWithGzip(AsyncScheduledDispatchWrite.Passed.class);
+    }
+
+    /**
+     * Test with content servlet that does:  
+     * 1) setHeader(content-length)
+     * 2) getOutputStream()
+     * 3) setHeader(content-type)
+     * 4) outputStream.write()
+     * 
+     * @throws Exception on test failure
+     * @see <a href="http://bugs.eclipse.org/354014">Eclipse Bug 354014</a>
+     */
+    @Test
+    public void testServletLengthStreamTypeWrite() throws Exception
+    {
+        testWithGzip(TestServletLengthStreamTypeWrite.class);
+    }
+
+    /**
+     * Test with content servlet that does:  
+     * 1) setHeader(content-length)
+     * 2) setHeader(content-type)
+     * 3) getOutputStream()
+     * 4) outputStream.write()
+     * 
+     * @throws Exception on test failure
+     * @see <a href="http://bugs.eclipse.org/354014">Eclipse Bug 354014</a>
+     */
+    @Test
+    public void testServletLengthTypeStreamWrite() throws Exception
+    {
+        testWithGzip(TestServletLengthTypeStreamWrite.class);
+    }
+
+    /**
+     * Test with content servlet that does:  
+     * 1) getOutputStream()
+     * 2) setHeader(content-length)
+     * 3) setHeader(content-type)
+     * 4) outputStream.write()
+     * 
+     * @throws Exception on test failure
+     * @see <a href="http://bugs.eclipse.org/354014">Eclipse Bug 354014</a>
+     */
+    @Test
+    public void testServletStreamLengthTypeWrite() throws Exception
+    {
+        testWithGzip(TestServletStreamLengthTypeWrite.class);
+    }
+
+    /**
+     * Test with content servlet that does:  
+     * 1) getOutputStream()
+     * 2) setHeader(content-length)
+     * 3) setHeader(content-type)
+     * 4) outputStream.write() (with frequent response flush)
+     * 
+     * @throws Exception on test failure
+     * @see <a href="http://bugs.eclipse.org/354014">Eclipse Bug 354014</a>
+     */
+    @Test
+    public void testServletStreamLengthTypeWriteWithFlush() throws Exception
+    {
+        testWithGzip(TestServletStreamLengthTypeWriteWithFlush.class);
+    }
+
+    /**
+     * Test with content servlet that does:  
+     * 1) getOutputStream()
+     * 2) setHeader(content-type)
+     * 3) setHeader(content-length)
+     * 4) outputStream.write()
+     * 
+     * @throws Exception on test failure
+     * @see <a href="http://bugs.eclipse.org/354014">Eclipse Bug 354014</a>
+     */
+    @Test
+    public void testServletStreamTypeLengthWrite() throws Exception
+    {
+        testWithGzip(TestServletStreamTypeLengthWrite.class);
+    }
+
+    /**
+     * Test with content servlet that does:  
+     * 1) setHeader(content-type)
+     * 2) setHeader(content-length)
+     * 3) getOutputStream()
+     * 4) outputStream.write()
+     * 
+     * @throws Exception on test failure
+     * @see <a href="http://bugs.eclipse.org/354014">Eclipse Bug 354014</a>
+     */
+    @Test
+    public void testServletTypeLengthStreamWrite() throws Exception
+    {
+        testWithGzip(TestServletTypeLengthStreamWrite.class);
+    }
+
+    /**
+     * Test with content servlet that does:  
+     * 1) setHeader(content-type)
+     * 2) getOutputStream()
+     * 3) setHeader(content-length)
+     * 4) outputStream.write()
+     * 
+     * @throws Exception on test failure
+     * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
+     */
+    @Test
+    public void testServletTypeStreamLengthWrite() throws Exception
+    {
+        testWithGzip(TestServletTypeStreamLengthWrite.class);
+    }
+
+    /**
+     * Test with content servlet that does:  
+     * 2) getOutputStream()
+     * 1) setHeader(content-type)
+     * 3) setHeader(content-length)
+     * 4) (unwrapped) HttpOutput.write(ByteBuffer)
+     * 
+     * This is done to demonstrate a bug with using HttpOutput.write()
+     * while also using GzipFilter
+     * 
+     * @throws Exception on test failure
+     * @see <a href="http://bugs.eclipse.org/450873">Eclipse Bug 450873</a>
+     */
+    @Test
+    public void testHttpOutputWrite() throws Exception
+    {
+        testWithGzip(TestServletBufferTypeLengthWrite.class);
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/GzipDefaultNoRecompressTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/GzipDefaultNoRecompressTest.java
new file mode 100644
index 0000000..4b45831
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/GzipDefaultNoRecompressTest.java
@@ -0,0 +1,111 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.jetty.servlet.DefaultServlet;
+import org.eclipse.jetty.toolchain.test.IO;
+import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+import org.eclipse.jetty.toolchain.test.TestingDir;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/**
+ * Tests {@link GzipHandler} in combination with {@link DefaultServlet} for ability to configure {@link GzipHandler} to
+ * ignore recompress situations from upstream.
+ */
+@RunWith(Parameterized.class)
+public class GzipDefaultNoRecompressTest
+{
+    @Parameters
+    public static List<Object[]> data()
+    {
+        return Arrays.asList(new Object[][]
+        {
+            // Some already compressed files
+                { "test_quotes.gz", "application/gzip"  , GzipHandler.GZIP },
+                { "test_quotes.bz2", "application/bzip2", GzipHandler.GZIP },
+                { "test_quotes.zip", "application/zip"  , GzipHandler.GZIP },
+                { "test_quotes.rar", "application/x-rar-compressed", GzipHandler.GZIP },
+            // Some images (common first)
+                { "jetty_logo.png", "image/png", GzipHandler.GZIP},
+                { "jetty_logo.gif", "image/gif", GzipHandler.GZIP},
+                { "jetty_logo.jpeg", "image/jpeg", GzipHandler.GZIP},
+                { "jetty_logo.jpg", "image/jpeg", GzipHandler.GZIP},
+            // Lesser encountered images (usually found being requested from non-browser clients)
+                { "jetty_logo.bmp", "image/bmp", GzipHandler.GZIP },
+                { "jetty_logo.tif", "image/tiff", GzipHandler.GZIP },
+                { "jetty_logo.tiff", "image/tiff", GzipHandler.GZIP },
+                { "jetty_logo.xcf", "image/xcf", GzipHandler.GZIP },
+                { "jetty_logo.jp2", "image/jpeg2000", GzipHandler.GZIP },
+            //qvalue disables compression
+                { "test_quotes.txt", "text/plain", GzipHandler.GZIP+";q=0"},
+                { "test_quotes.txt", "text/plain", GzipHandler.GZIP+"; q =    0 "},
+                
+        });
+    }
+
+    @Rule
+    public TestingDir testingdir = new TestingDir();
+
+    private String alreadyCompressedFilename;
+    private String expectedContentType;
+    private String compressionType;
+
+    public GzipDefaultNoRecompressTest(String testFilename, String expectedContentType, String compressionType)
+    {
+        this.alreadyCompressedFilename = testFilename;
+        this.expectedContentType = expectedContentType;
+        this.compressionType = compressionType;
+    }
+
+    @Test
+    public void testNotGzipHandlered_Default_AlreadyCompressed() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir, compressionType);
+
+        copyTestFileToServer(alreadyCompressedFilename);
+
+        tester.setContentServlet(TestStaticMimeTypeServlet.class);
+
+        try
+        {
+            tester.start();
+            tester.assertIsResponseNotGziped(alreadyCompressedFilename,alreadyCompressedFilename + ".sha1",expectedContentType);
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    private void copyTestFileToServer(String testFilename) throws IOException
+    {
+        File testFile = MavenTestingUtils.getTestResourceFile(testFilename);
+        File outFile = testingdir.getFile(testFilename);
+        IO.copy(testFile,outFile);
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/GzipDefaultTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/GzipDefaultTest.java
new file mode 100644
index 0000000..78d5483
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/GzipDefaultTest.java
@@ -0,0 +1,768 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.isEmptyOrNullString;
+import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.startsWith;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.GzipHttpContent;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.http.HttpTester;
+import org.eclipse.jetty.servlet.DefaultServlet;
+import org.eclipse.jetty.toolchain.test.IO;
+import org.eclipse.jetty.toolchain.test.TestingDir;
+import org.eclipse.jetty.util.StringUtil;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+
+/**
+ * Test the GzipHandler support built into the {@link DefaultServlet}
+ */
+public class GzipDefaultTest
+{
+    private String compressionType;
+
+    public GzipDefaultTest()
+    {
+        this.compressionType = GzipHandler.GZIP;
+    }
+
+    @SuppressWarnings("serial")
+    public static class HttpStatusServlet extends HttpServlet
+    {
+        private int _status = 204;
+
+        public HttpStatusServlet()
+        {
+            super();
+        }
+
+        @Override
+        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+        {
+            resp.setStatus(_status);
+            resp.setHeader("ETag","W/\"204\"");
+        }
+
+    }
+
+    @SuppressWarnings("serial")
+    public static class HttpErrorServlet extends HttpServlet
+    {
+        private int _status = 400;
+
+        public HttpErrorServlet()
+        {
+            super();
+        }
+
+        @Override
+        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+        {
+            resp.getOutputStream().write("error message".getBytes());
+            resp.setStatus(_status);
+        }
+    }
+
+    @SuppressWarnings("serial")
+    public static class HttpContentTypeWithEncoding extends HttpServlet
+    {
+        public static final String COMPRESSED_CONTENT = "<html><head></head><body><h1>COMPRESSABLE CONTENT</h1>"
+                + "This content must be longer than the default min gzip length, which is 256 bytes. "
+                + "The moon is blue to a fish in love. How now brown cow. The quick brown fox jumped over the lazy dog. A woman needs a man like a fish needs a bicycle!"
+                + "</body></html>";
+
+        @Override
+        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+        {
+            resp.setContentType("text/plain;charset=UTF8");
+            resp.setStatus(200);
+            ServletOutputStream out = resp.getOutputStream();
+            out.print(COMPRESSED_CONTENT);
+        }
+
+    }
+
+    @Rule
+    public TestingDir testingdir = new TestingDir();
+
+    @Test
+    public void testIsGzipByMethod() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+
+        // Configure Gzip Handler
+        tester.getGzipHandler().setIncludedMethods("POST","WIBBLE", "HEAD");
+
+        // Prepare Server File
+        int filesize = tester.getOutputBufferSize() * 2;
+        tester.prepareServerFile("file.txt",filesize);
+
+        // Content Servlet
+        tester.setContentServlet(GetServlet.class);
+
+        try
+        {
+            tester.start();
+            HttpTester.Response response;
+
+            //These methods have content bodies of the compressed response
+            tester.assertIsResponseGzipCompressed("POST","file.txt");
+            tester.assertIsResponseGzipCompressed("WIBBLE","file.txt");
+            
+            //A HEAD request should have similar headers, but no body
+            response = tester.executeRequest("HEAD","/context/file.txt",5,TimeUnit.SECONDS);
+            assertThat("Response status",response.getStatus(),is(HttpStatus.OK_200));
+            assertThat("ETag", response.get("ETag"), containsString(GzipHttpContent.ETAG_GZIP));
+            assertThat("Content encoding", response.get("Content-Encoding"), containsString("gzip"));
+            assertNull("Content length", response.get("Content-Length"));
+   
+            response = tester.executeRequest("GET","/context/file.txt",5,TimeUnit.SECONDS);
+
+            assertThat("Response status",response.getStatus(),is(HttpStatus.OK_200));
+            assertThat("Content-Encoding",response.get("Content-Encoding"),not(containsString(compressionType)));
+
+            String content = tester.readResponse(response);
+            assertThat("Response content size",content.length(),is(filesize));
+            String expectedContent = IO.readToString(testingdir.getFile("file.txt"));
+            assertThat("Response content",content,is(expectedContent));
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    @SuppressWarnings("serial")
+    public static class GetServlet extends DefaultServlet
+    {
+        public GetServlet()
+        {
+            super();
+        }
+
+        @Override
+        public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException
+        {
+            String uri = req.getRequestURI();
+            if (uri.endsWith(".deferred"))
+            {
+                // System.err.println("type for "+uri.substring(0,uri.length()-9)+" is "+getServletContext().getMimeType(uri.substring(0,uri.length()-9)));
+                resp.setContentType(getServletContext().getMimeType(uri.substring(0,uri.length() - 9)));
+            }
+
+            doGet(req,resp);
+        }
+    }
+
+    @Test
+    public void testIsGzipCompressedEmpty() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+
+        // Configure Gzip Handler
+        tester.getGzipHandler().addIncludedMimeTypes("text/plain");
+
+        // Prepare server file
+        tester.prepareServerFile("empty.txt",0);
+
+        // Set content servlet
+        tester.setContentServlet(DefaultServlet.class);
+
+        try
+        {
+            tester.start();
+
+            HttpTester.Response response;
+
+            response = tester.executeRequest("GET","/context/empty.txt",5,TimeUnit.SECONDS);
+
+            assertThat("Response status",response.getStatus(),is(HttpStatus.OK_200));
+            assertThat("Content-Encoding",response.get("Content-Encoding"),not(containsString(compressionType)));
+
+            String content = tester.readResponse(response);
+            assertThat("Response content size",content.length(),is(0));
+            String expectedContent = IO.readToString(testingdir.getFile("empty.txt"));
+            assertThat("Response content",content,is(expectedContent));
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    @Test
+    public void testIsGzipCompressedTiny() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+
+        int filesize = tester.getOutputBufferSize() / 4;
+        tester.prepareServerFile("file.txt",filesize);
+
+        tester.setContentServlet(org.eclipse.jetty.servlet.DefaultServlet.class);
+
+        try
+        {
+            tester.start();
+            HttpTester.Response http = tester.assertIsResponseGzipCompressed("GET","file.txt");
+            Assert.assertEquals("Accept-Encoding, User-Agent",http.get("Vary"));
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    @Test
+    public void testIsGzipCompressedLarge() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+
+        int filesize = tester.getOutputBufferSize() * 4;
+        tester.prepareServerFile("file.txt",filesize);
+
+        tester.setContentServlet(org.eclipse.jetty.servlet.DefaultServlet.class);
+        tester.getGzipHandler().setExcludedAgentPatterns();
+
+        try
+        {
+            tester.start();
+            HttpTester.Response http = tester.assertIsResponseGzipCompressed("GET","file.txt");
+            Assert.assertEquals("Accept-Encoding",http.get("Vary"));
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    @Test
+    public void testGzipedIfModified() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+
+        int filesize = tester.getOutputBufferSize() * 4;
+        tester.prepareServerFile("file.txt",filesize);
+
+        tester.setContentServlet(org.eclipse.jetty.servlet.DefaultServlet.class);
+
+        try
+        {
+            tester.start();
+            HttpTester.Response http = tester.assertIsResponseGzipCompressed("GET","file.txt",System.currentTimeMillis() - 4000);
+            Assert.assertEquals("Accept-Encoding, User-Agent",http.get("Vary"));
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    @Test
+    public void testGzippedIfSVG() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+        tester.copyTestServerFile("test.svg");
+        tester.setContentServlet(org.eclipse.jetty.servlet.DefaultServlet.class);
+
+        tester.getGzipHandler().addIncludedMimeTypes("image/svg+xml");
+
+        try
+        {
+            tester.start();
+            HttpTester.Response http = tester.assertIsResponseGzipCompressed("GET","test.svg",System.currentTimeMillis() - 4000);
+            Assert.assertEquals("Accept-Encoding, User-Agent",http.get("Vary"));
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    @Test
+    public void testNotGzipedIfNotModified() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+
+        int filesize = tester.getOutputBufferSize() * 4;
+        tester.prepareServerFile("file.txt",filesize);
+
+        tester.setContentServlet(org.eclipse.jetty.servlet.DefaultServlet.class);
+
+        try
+        {
+            tester.start();
+            tester.assertIsResponseNotModified("GET","file.txt",System.currentTimeMillis() + 4000);
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    @Test
+    public void testIsNotGzipCompressedWithZeroQ() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType + "; q=0");
+
+        // Configure Gzip Handler
+        tester.getGzipHandler().addIncludedMimeTypes("text/plain");
+
+        // Prepare server file
+        int filesize = tester.getOutputBufferSize() / 4;
+        tester.prepareServerFile("file.txt",filesize);
+
+        // Add content servlet
+        tester.setContentServlet(DefaultServlet.class);
+
+        try
+        {
+            tester.start();
+            HttpTester.Response http = assertIsResponseNotGzipCompressed(tester,"GET","file.txt",filesize,HttpStatus.OK_200);
+            assertThat("Response[Vary]",http.get("Vary"),containsString("Accept-Encoding"));
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    @Test
+    public void testIsGzipCompressedWithQ() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType,"something;q=0.1," + compressionType + ";q=0.5");
+
+        int filesize = tester.getOutputBufferSize() / 4;
+        tester.prepareServerFile("file.txt",filesize);
+
+        tester.setContentServlet(org.eclipse.jetty.servlet.DefaultServlet.class);
+        tester.getGzipHandler().setExcludedAgentPatterns();
+
+        try
+        {
+            tester.start();
+            HttpTester.Response http = tester.assertIsResponseGzipCompressed("GET","file.txt");
+            Assert.assertEquals("Accept-Encoding",http.get("Vary"));
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    @Test
+    public void testIsNotGzipCompressedByContentType() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+
+        // Prepare server file
+        int filesize = tester.getOutputBufferSize() * 4;
+        tester.prepareServerFile("file.mp3",filesize);
+
+        // Add content servlet
+        tester.setContentServlet(DefaultServlet.class);
+
+        try
+        {
+            tester.start();
+            HttpTester.Response http = assertIsResponseNotGzipCompressed(tester,"GET","file.mp3",filesize,HttpStatus.OK_200);
+            Assert.assertNull(http.get("Vary"));
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    @Test
+    public void testIsNotGzipCompressedByExcludedContentType() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+
+        // Configure Gzip Handler
+        tester.getGzipHandler().addExcludedMimeTypes("text/plain");
+
+        // Prepare server file
+        int filesize = tester.getOutputBufferSize() * 4;
+        tester.prepareServerFile("test_quotes.txt",filesize);
+
+        // Add content servlet
+        tester.setContentServlet(DefaultServlet.class);
+
+        try
+        {
+            tester.start();
+            HttpTester.Response http = assertIsResponseNotGzipCompressed(tester,"GET","test_quotes.txt",filesize,HttpStatus.OK_200);
+            Assert.assertNull(http.get("Vary"));
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    @Test
+    public void testIsNotGzipCompressedByExcludedContentTypeWithCharset() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+
+        // Configure Gzip Handler
+        tester.getGzipHandler().addExcludedMimeTypes("text/plain");
+
+        // Prepare server file
+        int filesize = tester.getOutputBufferSize() * 4;
+        tester.prepareServerFile("test_quotes.txt",filesize);
+        tester.addMimeType("txt","text/plain;charset=UTF-8");
+
+        // Add content servlet
+        tester.setContentServlet(DefaultServlet.class);
+
+        try
+        {
+            tester.start();
+            HttpTester.Response http = assertIsResponseNotGzipCompressed(tester,"GET","test_quotes.txt",filesize,HttpStatus.OK_200);
+            Assert.assertNull(http.get("Vary"));
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    @Test
+    public void testGzipCompressedByContentTypeWithEncoding() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+        tester.setContentServlet(HttpContentTypeWithEncoding.class);
+        tester.getGzipHandler().addIncludedMimeTypes("text/plain");
+        tester.getGzipHandler().setExcludedAgentPatterns();
+        try
+        {
+            tester.start();
+            HttpTester.Response http = tester.assertNonStaticContentIsResponseGzipCompressed("GET","xxx",HttpContentTypeWithEncoding.COMPRESSED_CONTENT);
+            Assert.assertEquals("Accept-Encoding",http.get("Vary"));
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    @Test
+    public void testIsNotGzipCompressedByDeferredContentType() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+
+        // Configure Gzip Handler
+        tester.getGzipHandler().addIncludedMimeTypes("text/plain");
+
+        // Prepare server file
+        int filesize = tester.getOutputBufferSize() * 4;
+        tester.prepareServerFile("file.mp3.deferred",filesize);
+
+        // Add content servlet
+        tester.setContentServlet(GetServlet.class);
+
+        try
+        {
+            tester.start();
+            HttpTester.Response response = assertIsResponseNotGzipCompressed(tester,"GET","file.mp3.deferred",filesize,HttpStatus.OK_200);
+            assertThat("Response[Vary]", response.get("Vary"), isEmptyOrNullString());
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    @Test
+    public void testIsNotGzipCompressedHttpStatus() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+
+        // Configure Gzip Handler
+        tester.getGzipHandler().addIncludedMimeTypes("text/plain");
+
+        // Test error code 204
+        tester.setContentServlet(HttpStatusServlet.class);
+
+        try
+        {
+            tester.start();
+
+            HttpTester.Response response = tester.executeRequest("GET","/context/",5,TimeUnit.SECONDS);
+
+            assertThat("Response status",response.getStatus(),is(HttpStatus.NO_CONTENT_204));
+            assertThat("Content-Encoding",response.get("Content-Encoding"),not(containsString(compressionType)));
+        }
+        finally
+        {
+            tester.stop();
+        }
+
+    }
+
+    @Test
+    public void testIsNotGzipCompressedHttpBadRequestStatus() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+
+        // Configure Gzip Handler
+        tester.getGzipHandler().addIncludedMimeTypes("text/plain");
+
+        // Test error code 400
+        tester.setContentServlet(HttpErrorServlet.class);
+
+        try
+        {
+            tester.start();
+
+            HttpTester.Response response = tester.executeRequest("GET","/context/",5,TimeUnit.SECONDS);
+
+            assertThat("Response status",response.getStatus(),is(HttpStatus.BAD_REQUEST_400));
+            assertThat("Content-Encoding",response.get("Content-Encoding"),not(containsString(compressionType)));
+
+            String content = tester.readResponse(response);
+            assertThat("Response content",content,is("error message"));
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    @Test
+    public void testUserAgentExclusion() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+        tester.setUserAgent("foo");
+
+        // Configure Gzip Handler
+        tester.getGzipHandler().addIncludedMimeTypes("text/plain");
+        tester.getGzipHandler().setExcludedAgentPatterns("bar","foo");
+        
+        // Prepare server file
+        int filesize = tester.getOutputBufferSize() * 4;
+        tester.prepareServerFile("file.txt",filesize);
+
+        // Add content servlet
+        tester.setContentServlet(DefaultServlet.class);
+
+        try
+        {
+            tester.start();
+            assertIsResponseNotGzipCompressed(tester,"GET","file.txt",filesize,HttpStatus.OK_200);
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+    
+    @Test
+    public void testUserAgentExclusionDefault() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+        tester.setContentServlet(DefaultServlet.class);
+        tester.setUserAgent("Some MSIE 6.0 user-agent");
+
+        int filesize = tester.getOutputBufferSize() * 4;
+        tester.prepareServerFile("file.txt",filesize);
+
+        try
+        {
+            tester.start();
+            HttpTester.Response http = assertIsResponseNotGzipCompressed(tester,"GET","file.txt",filesize,HttpStatus.OK_200);
+            Assert.assertEquals("Accept-Encoding, User-Agent",http.get("Vary"));
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    @Test
+    public void testUserAgentExclusionByExcludedAgentPatterns() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+        tester.setUserAgent("foo");
+
+        // Configure Gzip Handler
+        tester.getGzipHandler().setExcludedAgentPatterns("bar","fo.*");
+
+        // Prepare server file
+        int filesize = tester.getOutputBufferSize() * 4;
+        tester.prepareServerFile("file.txt",filesize);
+
+        // Set content servlet
+        tester.setContentServlet(DefaultServlet.class);
+
+        try
+        {
+            tester.start();
+            assertIsResponseNotGzipCompressed(tester,"GET","file.txt",filesize,HttpStatus.OK_200);
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    @Test
+    public void testExcludePaths() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+
+        // Configure Gzip Handler
+        tester.getGzipHandler().setExcludedPaths("*.txt");
+
+        // Prepare server file
+        int filesize = tester.getOutputBufferSize() * 4;
+        tester.prepareServerFile("file.txt",filesize);
+
+        // Set content servlet
+        tester.setContentServlet(DefaultServlet.class);
+
+        try
+        {
+            tester.start();
+            assertIsResponseNotGzipCompressed(tester,"GET","file.txt",filesize,HttpStatus.OK_200);
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    @Test
+    public void testIncludedPaths() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+
+        // Configure Gzip Handler
+        tester.getGzipHandler().setExcludedPaths("/bad.txt");
+        tester.getGzipHandler().setIncludedPaths("*.txt");
+
+        // Prepare server file
+        int filesize = tester.getOutputBufferSize() * 4;
+        tester.prepareServerFile("file.txt",filesize);
+        tester.prepareServerFile("bad.txt",filesize);
+
+        // Set content servlet
+        tester.setContentServlet(DefaultServlet.class);
+
+        try
+        {
+            tester.start();
+            tester.assertIsResponseGzipCompressed("GET","file.txt");
+        }
+        finally
+        {
+            tester.stop();
+        }
+        
+        try
+        {
+            tester.start();
+            assertIsResponseNotGzipCompressed(tester,"GET","bad.txt",filesize,HttpStatus.OK_200);
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+
+    public HttpTester.Response assertIsResponseNotGzipCompressed(GzipTester tester, String method, String filename, int expectedFilesize, int status)
+            throws Exception
+    {
+        HttpTester.Response response = tester.executeRequest(method,"/context/" + filename,5,TimeUnit.SECONDS);
+
+        assertThat("Response status",response.getStatus(),is(status));
+        assertThat("Content-Encoding",response.get("Content-Encoding"),not(containsString(compressionType)));
+
+        assertResponseContent(tester,response,status,filename,expectedFilesize);
+
+        return response;
+    }
+
+    private void assertResponseContent(GzipTester tester, HttpTester.Response response, int status, String filename, int expectedFilesize) throws IOException,
+            UnsupportedEncodingException
+    {
+        if (expectedFilesize >= 0)
+        {
+            assertThat("filename",filename,notNullValue());
+            assertThat("Response contentBytes.length",response.getContentBytes().length,is(expectedFilesize));
+            String contentLength = response.get("Content-Length");
+            if (StringUtil.isNotBlank(contentLength))
+            {
+                assertThat("Content-Length",response.get("Content-Length"),is(Integer.toString(expectedFilesize)));
+            }
+
+            if (status >= 200 && status < 300)
+            {
+                assertThat("ETag",response.get("ETAG"),startsWith("W/"));
+            }
+
+            File serverFile = testingdir.getFile(filename);
+            String expectedResponse = IO.readToString(serverFile);
+
+            String actual = tester.readResponse(response);
+            Assert.assertEquals("Expected response equals actual response",expectedResponse,actual);
+        }
+    }
+
+    
+    @Test
+    public void testIsNotGzipCompressedSVGZ() throws Exception
+    {
+        GzipTester tester = new GzipTester(testingdir,compressionType);
+
+        tester.setContentServlet(DefaultServlet.class);
+        tester.copyTestServerFile("test.svgz");
+        
+        try
+        {
+            tester.start();
+            tester.assertIsResponseNotGzipFiltered("test.svgz","test.svgz.sha1","image/svg+xml","gzip");
+        }
+        finally
+        {
+            tester.stop();
+        }
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/GzipTester.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/GzipTester.java
new file mode 100644
index 0000000..c3ec023
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/GzipTester.java
@@ -0,0 +1,656 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.isEmptyOrNullString;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.security.DigestOutputStream;
+import java.security.MessageDigest;
+import java.util.EnumSet;
+import java.util.Enumeration;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.Inflater;
+import java.util.zip.InflaterInputStream;
+
+import javax.servlet.DispatcherType;
+import javax.servlet.Servlet;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.DateGenerator;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpTester;
+import org.eclipse.jetty.http.HttpTester.Response;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.servlet.FilterHolder;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.servlet.ServletTester;
+import org.eclipse.jetty.toolchain.test.IO;
+import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+import org.eclipse.jetty.toolchain.test.TestingDir;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+
+public class GzipTester
+{
+    private static final Logger LOG = Log.getLogger(GzipTester.class);
+
+    public static class ContentMetadata
+    {
+        public final long size;
+        public final String sha1;
+
+        public ContentMetadata(long size, String sha1checksum)
+        {
+            this.size = size;
+            this.sha1 = sha1checksum;
+        }
+    }
+
+    private String encoding = "ISO8859_1";
+    private String userAgent = null;
+    private final ServletTester tester = new ServletTester("/context",ServletContextHandler.GZIP);
+    private TestingDir testdir;
+    private String accept;
+    private String compressionType;
+    
+
+    public GzipTester(TestingDir testingdir, String compressionType, String accept)
+    {
+        this.testdir = testingdir;
+        this.compressionType = compressionType;
+        this.accept = accept;
+        
+    }
+
+    public GzipTester(TestingDir testingdir, String compressionType)
+    {
+        this.testdir = testingdir;
+        this.compressionType = compressionType;
+        this.accept = compressionType;
+    }
+    
+    public GzipHandler getGzipHandler()
+    {
+        return tester.getContext().getGzipHandler();
+    }
+
+    public int getOutputBufferSize()
+    {
+        return tester.getConnector().getConnectionFactory(HttpConnectionFactory.class).getHttpConfiguration().getOutputBufferSize();
+    }
+    
+    public ContentMetadata getResponseMetadata(Response response) throws Exception
+    {
+        long size = response.getContentBytes().length;
+
+        String contentEncoding = response.get("Content-Encoding");
+
+        ByteArrayInputStream bais = null;
+        InputStream in = null;
+        DigestOutputStream digester = null;
+        ByteArrayOutputStream uncompressedStream = null;
+        try
+        {
+            MessageDigest digest = MessageDigest.getInstance("SHA1");
+            bais = new ByteArrayInputStream(response.getContentBytes());
+
+            if (contentEncoding == null)
+            {
+                LOG.debug("No response content-encoding");
+                in = new PassThruInputStream(bais);
+            }
+            else if (contentEncoding.contains(GzipHandler.GZIP))
+            {
+                in = new GZIPInputStream(bais);
+            }
+            else if (contentEncoding.contains(GzipHandler.DEFLATE))
+            {
+                in = new InflaterInputStream(bais,new Inflater(true));
+            }
+            else
+            {
+                assertThat("Unexpected response content-encoding", contentEncoding, isEmptyOrNullString());
+            }
+            
+            uncompressedStream = new ByteArrayOutputStream((int)size); 
+
+            digester = new DigestOutputStream(uncompressedStream,digest);
+            IO.copy(in,digester);
+            
+            byte output[] = uncompressedStream.toByteArray();
+            String actualSha1Sum = Hex.asHex(digest.digest());
+            return new ContentMetadata(output.length,actualSha1Sum);
+        }
+        finally
+        {
+            IO.close(digester);
+            IO.close(in);
+            IO.close(bais);
+            IO.close(uncompressedStream);
+        }
+    }
+
+    public HttpTester.Response assertIsResponseGzipCompressed(String method, String filename) throws Exception
+    {
+        return assertIsResponseGzipCompressed(method,filename,filename,-1);
+    }
+
+    public HttpTester.Response assertIsResponseGzipCompressed(String method, String filename, long ifmodifiedsince) throws Exception
+    {
+        return assertIsResponseGzipCompressed(method,filename,filename,ifmodifiedsince);
+    }
+
+    public HttpTester.Response assertIsResponseGzipCompressed(String method, String requestedFilename, String serverFilename) throws Exception
+    {
+        return assertIsResponseGzipCompressed(method,requestedFilename,serverFilename,-1);
+    }
+
+    public HttpTester.Response assertNonStaticContentIsResponseGzipCompressed(String method, String path, String expected) throws Exception
+    {
+        HttpTester.Request request = HttpTester.newRequest();
+        HttpTester.Response response;
+
+        request.setMethod(method);
+        request.setVersion("HTTP/1.0");
+        request.setHeader("Host","tester");
+        request.setHeader("Accept-Encoding",accept);
+
+        if (this.userAgent != null)
+            request.setHeader("User-Agent",this.userAgent);
+        request.setURI("/context/" + path);
+
+        // Issue the request
+        response = HttpTester.parseResponse(tester.getResponses(request.generate()));
+
+        int qindex = compressionType.indexOf(";");
+        if (qindex < 0)
+            Assert.assertThat("Response.header[Content-Encoding]",response.get("Content-Encoding"),containsString(compressionType));
+        else
+            Assert.assertThat("Response.header[Content-Encoding]",response.get("Content-Encoding"),containsString(compressionType.substring(0,qindex)));
+
+        ByteArrayInputStream bais = null;
+        InputStream in = null;
+        ByteArrayOutputStream out = null;
+        String actual = null;
+
+        try
+        {
+            bais = new ByteArrayInputStream(response.getContentBytes());
+            if (compressionType.startsWith(GzipHandler.GZIP))
+            {
+                in = new GZIPInputStream(bais);
+            }
+            else if (compressionType.startsWith(GzipHandler.DEFLATE))
+            {
+                in = new InflaterInputStream(bais,new Inflater(true));
+            }
+            out = new ByteArrayOutputStream();
+            IO.copy(in,out);
+
+            actual = out.toString(encoding);
+            assertThat("Uncompressed contents",actual,equalTo(expected));
+        }
+        finally
+        {
+            IO.close(out);
+            IO.close(in);
+            IO.close(bais);
+        }
+
+        return response;
+    }
+
+    public HttpTester.Response assertIsResponseGzipCompressed(String method, String requestedFilename, String serverFilename, long ifmodifiedsince)
+            throws Exception
+    {
+        HttpTester.Request request = HttpTester.newRequest();
+        HttpTester.Response response;
+
+        request.setMethod(method);
+        request.setVersion("HTTP/1.0");
+        request.setHeader("Host","tester");
+        request.setHeader("Accept-Encoding",compressionType);
+        if (ifmodifiedsince > 0)
+            request.setHeader(HttpHeader.IF_MODIFIED_SINCE.asString(),DateGenerator.formatDate(ifmodifiedsince));
+        if (this.userAgent != null)
+            request.setHeader("User-Agent",this.userAgent);
+        request.setURI("/context/" + requestedFilename);
+
+        // Issue the request
+        response = HttpTester.parseResponse(tester.getResponses(request.generate()));
+
+        // Assert the response headers
+        // Assert.assertThat("Response.status",response.getStatus(),is(HttpServletResponse.SC_OK));
+
+        // Response headers should have either a Transfer-Encoding indicating chunked OR a Content-Length
+        /*
+         * TODO need to check for the 3rd option of EOF content. To do this properly you might need to look at both HTTP/1.1 and HTTP/1.0 requests String
+         * contentLength = response.get("Content-Length"); String transferEncoding = response.get("Transfer-Encoding");
+         * 
+         * boolean chunked = (transferEncoding != null) && (transferEncoding.indexOf("chunk") >= 0); if(!chunked) {
+         * Assert.assertThat("Response.header[Content-Length]",contentLength,notNullValue()); } else {
+         * Assert.assertThat("Response.header[Transfer-Encoding]",transferEncoding,notNullValue()); }
+         */
+
+        int qindex = compressionType.indexOf(";");
+        if (qindex < 0)
+            Assert.assertThat("Response.header[Content-Encoding]",response.get("Content-Encoding"),containsString(compressionType));
+        else
+            Assert.assertThat("Response.header[Content-Encoding]",response.get("Content-Encoding"),containsString(compressionType.substring(0,qindex)));
+
+        Assert.assertThat(response.get("ETag"),Matchers.startsWith("W/"));
+
+        // Assert that the decompressed contents are what we expect.
+        File serverFile = testdir.getFile(serverFilename);
+        String expected = IO.readToString(serverFile);
+        String actual = null;
+
+        ByteArrayInputStream bais = null;
+        InputStream in = null;
+        ByteArrayOutputStream out = null;
+        try
+        {
+            bais = new ByteArrayInputStream(response.getContentBytes());
+            if (compressionType.startsWith(GzipHandler.GZIP))
+            {
+                in = new GZIPInputStream(bais);
+            }
+            else if (compressionType.startsWith(GzipHandler.DEFLATE))
+            {
+                in = new InflaterInputStream(bais,new Inflater(true));
+            }
+            out = new ByteArrayOutputStream();
+            IO.copy(in,out);
+
+            actual = out.toString(encoding);
+            assertThat("Uncompressed contents",actual,equalTo(expected));
+        }
+        finally
+        {
+            IO.close(out);
+            IO.close(in);
+            IO.close(bais);
+        }
+
+        return response;
+    }
+
+    public HttpTester.Response assertIsResponseNotModified(String method, String requestedFilename, long ifmodifiedsince) throws Exception
+    {
+        HttpTester.Request request = HttpTester.newRequest();
+        HttpTester.Response response;
+
+        request.setMethod(method);
+        request.setVersion("HTTP/1.0");
+        request.setHeader("Host","tester");
+        request.setHeader("Accept-Encoding",compressionType);
+        if (ifmodifiedsince > 0)
+            request.setHeader(HttpHeader.IF_MODIFIED_SINCE.asString(),DateGenerator.formatDate(ifmodifiedsince));
+        if (this.userAgent != null)
+            request.setHeader("User-Agent",this.userAgent);
+        request.setURI("/context/" + requestedFilename);
+
+        // Issue the request
+        response = HttpTester.parseResponse(tester.getResponses(request.generate()));
+
+        Assert.assertThat(response.getStatus(),Matchers.equalTo(304));
+        Assert.assertThat(response.get("ETag"),Matchers.startsWith("W/"));
+
+        return response;
+    }
+
+    /**
+     * Makes sure that the response contains an unfiltered file contents.
+     * <p>
+     * This is used to test exclusions and passthroughs in the GzipHandler.
+     * <p>
+     * An example is to test that it is possible to configure GzipFilter to not recompress content that shouldn't be compressed by the GzipFilter.
+     *
+     * @param requestedFilename
+     *            the filename used to on the GET request,.
+     * @param testResourceSha1Sum
+     *            the sha1sum file that contains the SHA1SUM checksum that will be used to verify that the response contents are what is intended.
+     * @param expectedContentType the expected content type
+     * @throws Exception on test failure
+     */
+    public void assertIsResponseNotGziped(String requestedFilename, String testResourceSha1Sum, String expectedContentType) throws Exception
+    {
+        assertIsResponseNotGzipFiltered(requestedFilename,testResourceSha1Sum,expectedContentType,null);
+    }
+
+    /**
+     * Makes sure that the response contains an unfiltered file contents.
+     * <p>
+     * This is used to test exclusions and passthroughs in the GzipHandler.
+     * <p>
+     * An example is to test that it is possible to configure GzipFilter to not recompress content that shouldn't be compressed by the GzipFilter.
+     *
+     * @param requestedFilename
+     *            the filename used to on the GET request,.
+     * @param testResourceSha1Sum
+     *            the sha1sum file that contains the SHA1SUM checksum that will be used to verify that the response contents are what is intended.
+     * @param expectedContentType the expected content type
+     * @param expectedContentEncoding
+     *            can be non-null in some circumstances, eg when dealing with pre-gzipped .svgz files
+     * @throws Exception on test failure
+     */
+    public void assertIsResponseNotGzipFiltered(String requestedFilename, String testResourceSha1Sum, String expectedContentType, String expectedContentEncoding)
+            throws Exception
+    {
+        HttpTester.Request request = HttpTester.newRequest();
+        HttpTester.Response response;
+
+        request.setMethod("GET");
+        request.setVersion("HTTP/1.0");
+        request.setHeader("Host","tester");
+        request.setHeader("Accept-Encoding",compressionType);
+        if (this.userAgent != null)
+            request.setHeader("User-Agent",this.userAgent);
+        request.setURI("/context/" + requestedFilename);
+
+        // Issue the request
+        response = HttpTester.parseResponse(tester.getResponses(request.generate()));
+
+        dumpHeaders(requestedFilename + " / Response Headers",response);
+
+        // Assert the response headers
+        String prefix = requestedFilename + " / Response";
+        Assert.assertThat(prefix + ".status",response.getStatus(),is(HttpServletResponse.SC_OK));
+        Assert.assertThat(prefix + ".header[Content-Length]",response.get("Content-Length"),notNullValue());
+        Assert.assertThat(prefix + ".header[Content-Encoding] (should not be recompressed by GzipHandler)",response.get("Content-Encoding"),
+                expectedContentEncoding == null?nullValue():notNullValue());
+        if (expectedContentEncoding != null)
+            Assert.assertThat(prefix + ".header[Content-Encoding]",response.get("Content-Encoding"),is(expectedContentEncoding));
+        Assert.assertThat(prefix + ".header[Content-Type] (should have a Content-Type associated with it)",response.get("Content-Type"),notNullValue());
+        Assert.assertThat(prefix + ".header[Content-Type]",response.get("Content-Type"),is(expectedContentType));
+
+        Assert.assertThat(response.get("ETAG"),Matchers.startsWith("W/"));
+
+        ByteArrayInputStream bais = null;
+        DigestOutputStream digester = null;
+        try
+        {
+            MessageDigest digest = MessageDigest.getInstance("SHA1");
+            bais = new ByteArrayInputStream(response.getContentBytes());
+            digester = new DigestOutputStream(new NoOpOutputStream(),digest);
+            IO.copy(bais,digester);
+
+            String actualSha1Sum = Hex.asHex(digest.digest());
+            String expectedSha1Sum = loadExpectedSha1Sum(testResourceSha1Sum);
+            Assert.assertEquals(requestedFilename + " / SHA1Sum of content",expectedSha1Sum,actualSha1Sum);
+        }
+        finally
+        {
+            IO.close(digester);
+            IO.close(bais);
+        }
+    }
+
+    private void dumpHeaders(String prefix, HttpTester.Message message)
+    {
+        LOG.debug("dumpHeaders: {}",prefix);
+        Enumeration<String> names = message.getFieldNames();
+        while (names.hasMoreElements())
+        {
+            String name = names.nextElement();
+            String value = message.get(name);
+            LOG.debug("dumpHeaders:   {} = {}",name,value);
+        }
+    }
+
+    private String loadExpectedSha1Sum(String testResourceSha1Sum) throws IOException
+    {
+        File sha1File = MavenTestingUtils.getTestResourceFile(testResourceSha1Sum);
+        String contents = IO.readToString(sha1File);
+        Pattern pat = Pattern.compile("^[0-9A-Fa-f]*");
+        Matcher mat = pat.matcher(contents);
+        Assert.assertTrue("Should have found HEX code in SHA1 file: " + sha1File,mat.find());
+        return mat.group();
+    }
+
+    public HttpTester.Response executeRequest(String method, String path, int idleFor, TimeUnit idleUnit) throws Exception
+    {
+        HttpTester.Request request = HttpTester.newRequest();
+
+        request.setMethod(method);
+        request.setVersion("HTTP/1.1");
+        request.setHeader("Host","tester");
+        request.setHeader("Accept-Encoding",accept);
+        request.setHeader("Connection","close");
+
+        if (this.userAgent != null)
+        {
+            request.setHeader("User-Agent",this.userAgent);
+        }
+        
+        request.setURI(path);
+
+        // Issue the request
+        return HttpTester.parseResponse(tester.getResponses(request.generate(),idleFor,idleUnit));
+    }
+
+    public String readResponse(HttpTester.Response response) throws IOException, UnsupportedEncodingException
+    {
+        String actual = null;
+        InputStream in = null;
+        ByteArrayOutputStream out = null;
+        try
+        {
+            byte[] content = response.getContentBytes();
+            if (content != null)
+                actual = new String(response.getContentBytes(),encoding);
+            else
+                actual = "";
+        }
+        finally
+        {
+            IO.close(out);
+            IO.close(in);
+        }
+        return actual;
+    }
+
+    /**
+     * Generate string content of arbitrary length.
+     *
+     * @param length
+     *            the length of the string to generate.
+     * @return the string content.
+     */
+    public String generateContent(int length)
+    {
+        StringBuilder builder = new StringBuilder();
+        do
+        {
+            builder.append("Lorem ipsum dolor sit amet, consectetur adipiscing elit. In quis felis nunc.\n");
+            builder.append("Quisque suscipit mauris et ante auctor ornare rhoncus lacus aliquet. Pellentesque\n");
+            builder.append("habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.\n");
+            builder.append("Vestibulum sit amet felis augue, vel convallis dolor. Cras accumsan vehicula diam\n");
+            builder.append("at faucibus. Etiam in urna turpis, sed congue mi. Morbi et lorem eros. Donec vulputate\n");
+            builder.append("velit in risus suscipit lobortis. Aliquam id urna orci, nec sollicitudin ipsum.\n");
+            builder.append("Cras a orci turpis. Donec suscipit vulputate cursus. Mauris nunc tellus, fermentum\n");
+            builder.append("eu auctor ut, mollis at diam. Quisque porttitor ultrices metus, vitae tincidunt massa\n");
+            builder.append("sollicitudin a. Vivamus porttitor libero eget purus hendrerit cursus. Integer aliquam\n");
+            builder.append("consequat mauris quis luctus. Cras enim nibh, dignissim eu faucibus ac, mollis nec neque.\n");
+            builder.append("Aliquam purus mauris, consectetur nec convallis lacinia, porta sed ante. Suspendisse\n");
+            builder.append("et cursus magna. Donec orci enim, molestie a lobortis eu, imperdiet vitae neque.\n");
+        }
+        while (builder.length() < length);
+
+        // Make sure we are exactly at requested length. (truncate the extra)
+        if (builder.length() > length)
+        {
+            builder.setLength(length);
+        }
+
+        return builder.toString();
+    }
+
+    public String getEncoding()
+    {
+        return encoding;
+    }
+
+    /**
+     * Create a file on the server resource path of a specified filename and size.
+     *
+     * @param filename
+     *            the filename to create
+     * @param filesize
+     *            the file size to create (Note: this isn't suitable for creating large multi-megabyte files)
+     * @return the prepared file
+     * @throws IOException if unable to create file
+     */
+    public File prepareServerFile(String filename, int filesize) throws IOException
+    {
+        File dir = testdir.getDir();
+        File testFile = new File(dir,filename);
+        // Make sure we have a uniq filename (to work around windows File.delete bug)
+        int i = 0;
+        while (testFile.exists())
+        {
+            testFile = new File(dir,(i++) + "-" + filename);
+        }
+
+        FileOutputStream fos = null;
+        ByteArrayInputStream in = null;
+        try
+        {
+            fos = new FileOutputStream(testFile,false);
+            in = new ByteArrayInputStream(generateContent(filesize).getBytes(encoding));
+            IO.copy(in,fos);
+            return testFile;
+        }
+        finally
+        {
+            IO.close(in);
+            IO.close(fos);
+        }
+    }
+
+    /**
+     * Copy a src/test/resource file into the server tree for eventual serving.
+     *
+     * @param filename
+     *            the filename to look for in src/test/resources
+     * @throws IOException if unable to copy file
+     */
+    public void copyTestServerFile(String filename) throws IOException
+    {
+        File srcFile = MavenTestingUtils.getTestResourceFile(filename);
+        File testFile = testdir.getFile(filename);
+
+        IO.copy(srcFile,testFile);
+    }
+
+    /**
+     * Set the servlet that provides content for the GzipHandler in being tested.
+     *
+     * @param servletClass
+     *            the servlet that will provide content.
+     * @throws IOException if unable to set content servlet
+     */
+    public void setContentServlet(Class<? extends Servlet> servletClass) throws IOException
+    {
+        tester.setContextPath("/context");
+        tester.setResourceBase(testdir.getDir().getCanonicalPath());
+        ServletHolder servletHolder = tester.addServlet(servletClass,"/");
+        servletHolder.setInitParameter("baseDir",testdir.getDir().getAbsolutePath());
+        servletHolder.setInitParameter("etags","true");
+    }
+
+    public void setEncoding(String encoding)
+    {
+        this.encoding = encoding;
+    }
+
+    public void setUserAgent(String ua)
+    {
+        this.userAgent = ua;
+    }
+
+    public void addMimeType(String extension, String mimetype)
+    {
+        this.tester.getContext().getMimeTypes().addMimeMapping(extension,mimetype);
+    }
+
+    /**
+     * Add an arbitrary filter to the test case.
+     * 
+     * @param holder
+     *            the filter to add
+     * @param pathSpec
+     *            the path spec for this filter
+     * @param dispatches
+     *            the set of {@link DispatcherType} to associate with this filter
+     * @throws IOException if unable to add filter
+     */
+    public void addFilter(FilterHolder holder, String pathSpec, EnumSet<DispatcherType> dispatches) throws IOException
+    {
+        tester.addFilter(holder,pathSpec,dispatches);
+    }
+
+    public void start() throws Exception
+    {
+        Assert.assertThat("No servlet defined yet.  Did you use #setContentServlet()?",tester,notNullValue());
+        
+        if (LOG.isDebugEnabled())
+        {
+            tester.dumpStdErr();
+        }
+        tester.start();
+    }
+
+    public void stop()
+    {
+        // NOTE: Do not cleanup the testdir. Failures can't be diagnosed if you do that.
+        // IO.delete(testdir.getDir()):
+        try
+        {
+            tester.stop();
+        }
+        catch (Exception e)
+        {
+            // Don't toss this out into Junit as this would be the last exception
+            // that junit will report as being the cause of the test failure.
+            // when in reality, the earlier setup issue is the real cause.
+            e.printStackTrace(System.err);
+        }
+    }
+
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/Hex.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/Hex.java
new file mode 100644
index 0000000..b3e5fd6
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/Hex.java
@@ -0,0 +1,76 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+public final class Hex
+{
+    private static final char[] hexcodes = "0123456789abcdef".toCharArray();
+
+    public static byte[] asByteArray(String id, int size)
+    {
+        if ((id.length() < 0) || (id.length() > (size * 2)))
+        {
+            throw new IllegalArgumentException(String.format("Invalid ID length of <%d> expected range of <0> to <%d>",id.length(),(size * 2)));
+        }
+
+        byte buf[] = new byte[size];
+        byte hex;
+        int len = id.length();
+
+        int idx = (int)Math.floor(((size * 2) - (double)len) / 2);
+        int i = 0;
+        if ((len % 2) != 0)
+        { // deal with odd numbered chars
+            i -= 1;
+        }
+
+        for (; i < len; i++)
+        {
+            hex = 0;
+            if (i >= 0)
+            {
+                hex = (byte)(Character.digit(id.charAt(i),16) << 4);
+            }
+            i++;
+            hex += (byte)(Character.digit(id.charAt(i),16));
+
+            buf[idx] = hex;
+            idx++;
+        }
+
+        return buf;
+    }
+
+    public static String asHex(byte buf[])
+    {
+        int len = buf.length;
+        char out[] = new char[len * 2];
+        for (int i = 0; i < len; i++)
+        {
+            out[i * 2] = hexcodes[(buf[i] & 0xF0) >> 4];
+            out[(i * 2) + 1] = hexcodes[(buf[i] & 0x0F)];
+        }
+        return String.valueOf(out);
+    }
+
+    private Hex()
+    {
+        /* prevent instantiation */
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/IncludedGzipMinSizeTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/IncludedGzipMinSizeTest.java
new file mode 100644
index 0000000..12b8639
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/IncludedGzipMinSizeTest.java
@@ -0,0 +1,87 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import javax.servlet.Servlet;
+
+import org.eclipse.jetty.toolchain.test.TestingDir;
+import org.junit.Rule;
+import org.junit.Test;
+
+/**
+ * Perform specific tests on the IncludableGzipHandler's ability to manage
+ * minGzipSize initialization parameter.
+ *
+ * @see <a href="Eclipse Bug 366106">http://bugs.eclipse.org/366106</a>
+ */
+public class IncludedGzipMinSizeTest
+{
+    public IncludedGzipMinSizeTest()
+    {
+        this.compressionType = GzipHandler.GZIP;
+    }
+
+    @Rule
+    public TestingDir testdir = new TestingDir();
+
+    private String compressionType;
+    private Class<? extends Servlet> testServlet = TestMinGzipSizeServlet.class;
+
+    @Test
+    public void testUnderMinSize() throws Exception
+    {
+        GzipTester tester = new GzipTester(testdir, compressionType);
+
+        tester.setContentServlet(testServlet);
+        // A valid mime type that we will never use in this test.
+        // configured here to prevent mimeType==null logic
+        tester.getGzipHandler().addIncludedMimeTypes("application/soap+xml");
+        tester.getGzipHandler().setMinGzipSize(2048);
+
+        tester.copyTestServerFile("small_script.js");
+
+        try {
+            tester.start();
+            tester.assertIsResponseNotGziped("small_script.js",
+                    "small_script.js.sha1",
+                    "text/javascript; charset=utf-8");
+        } finally {
+            tester.stop();
+        }
+    }
+
+    @Test
+    public void testOverMinSize() throws Exception
+    {
+        GzipTester tester = new GzipTester(testdir, compressionType);
+
+        tester.setContentServlet(testServlet);
+        tester.getGzipHandler().addIncludedMimeTypes("application/soap+xml","text/javascript","application/javascript");
+        tester.getGzipHandler().setMinGzipSize(2048);
+
+        tester.copyTestServerFile("big_script.js");
+
+        try {
+            tester.start();
+            tester.assertIsResponseGzipCompressed("GET","big_script.js");
+        } finally {
+            tester.stop();
+        }
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/IncludedGzipTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/IncludedGzipTest.java
new file mode 100644
index 0000000..837beef
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/IncludedGzipTest.java
@@ -0,0 +1,136 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.Inflater;
+import java.util.zip.InflaterInputStream;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.HttpTester;
+import org.eclipse.jetty.servlet.ServletTester;
+import org.eclipse.jetty.toolchain.test.TestingDir;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.IO;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class IncludedGzipTest
+{
+
+    @Rule
+    public TestingDir testdir = new TestingDir();
+
+    private static String __content =
+        "Lorem ipsum dolor sit amet, consectetur adipiscing elit. In quis felis nunc. "+
+        "Quisque suscipit mauris et ante auctor ornare rhoncus lacus aliquet. Pellentesque "+
+        "habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. "+
+        "Vestibulum sit amet felis augue, vel convallis dolor. Cras accumsan vehicula diam "+
+        "at faucibus. Etiam in urna turpis, sed congue mi. Morbi et lorem eros. Donec vulputate "+
+        "velit in risus suscipit lobortis. Aliquam id urna orci, nec sollicitudin ipsum. "+
+        "Cras a orci turpis. Donec suscipit vulputate cursus. Mauris nunc tellus, fermentum "+
+        "eu auctor ut, mollis at diam. Quisque porttitor ultrices metus, vitae tincidunt massa "+
+        "sollicitudin a. Vivamus porttitor libero eget purus hendrerit cursus. Integer aliquam "+
+        "consequat mauris quis luctus. Cras enim nibh, dignissim eu faucibus ac, mollis nec neque. "+
+        "Aliquam purus mauris, consectetur nec convallis lacinia, porta sed ante. Suspendisse "+
+        "et cursus magna. Donec orci enim, molestie a lobortis eu, imperdiet vitae neque.";
+
+    private ServletTester tester;
+    private String compressionType;
+
+    public IncludedGzipTest()
+    {
+        this.compressionType = GzipHandler.GZIP;
+    }
+
+    @Before
+    public void setUp() throws Exception
+    {
+        testdir.ensureEmpty();
+
+        File testFile = testdir.getFile("file.txt");
+        try (OutputStream testOut = new BufferedOutputStream(new FileOutputStream(testFile)))
+        {
+            ByteArrayInputStream testIn = new ByteArrayInputStream(__content.getBytes("ISO8859_1"));
+            IO.copy(testIn,testOut);
+        }
+
+        tester=new ServletTester("/context");
+        tester.getContext().setResourceBase(testdir.getDir().getCanonicalPath());
+        tester.getContext().addServlet(org.eclipse.jetty.servlet.DefaultServlet.class, "/");
+        
+        GzipHandler gzipHandler = new GzipHandler();
+        gzipHandler.setHandler(tester.getContext().getHandler());
+        tester.getContext().setHandler(gzipHandler);
+        tester.start();
+    }
+
+    @After
+    public void tearDown() throws Exception
+    {
+        tester.stop();
+        IO.delete(testdir.getDir());
+    }
+
+    @Test
+    public void testGzip() throws Exception
+    {
+        // generated and parsed test
+
+        ByteBuffer request=BufferUtil.toBuffer(
+            "GET /context/file.txt HTTP/1.0\r\n"+
+            "Host: tester\r\n"+
+            "Accept-Encoding: "+compressionType+"\r\n"+
+            "\r\n");
+
+
+        HttpTester.Response response=HttpTester.parseResponse(tester.getResponses(request));
+
+        assertEquals(HttpServletResponse.SC_OK,response.getStatus());
+        assertEquals(compressionType,response.get("Content-Encoding"));
+
+        InputStream testIn = null;
+        ByteArrayInputStream compressedResponseStream = new ByteArrayInputStream(response.getContentBytes());
+        if (compressionType.equals(GzipHandler.GZIP))
+        {
+            testIn = new GZIPInputStream(compressedResponseStream);
+        }
+        else if (compressionType.equals(GzipHandler.DEFLATE))
+        {
+            testIn = new InflaterInputStream(compressedResponseStream, new Inflater(true));
+        }
+        ByteArrayOutputStream testOut = new ByteArrayOutputStream();
+        IO.copy(testIn,testOut);
+
+        assertEquals(__content, testOut.toString("ISO8859_1"));
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/NoOpOutputStream.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/NoOpOutputStream.java
new file mode 100644
index 0000000..17a631a
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/NoOpOutputStream.java
@@ -0,0 +1,58 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * Stream that does nothing. (Used by SHA1SUM routines)
+ */
+public class NoOpOutputStream extends OutputStream
+{
+    @Override
+    public void close() throws IOException
+    {
+        /* noop */
+    }
+    
+    @Override
+    public void flush() throws IOException
+    {
+        /* noop */
+    }
+    
+    @Override
+    public void write(byte[] b) throws IOException
+    {
+        /* noop */
+    }
+    
+    @Override
+    public void write(byte[] b, int off, int len) throws IOException
+    {
+        /* noop */
+    }
+    
+    @Override
+    public void write(int b) throws IOException
+    {
+        /* noop */
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/PassThruInputStream.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/PassThruInputStream.java
new file mode 100644
index 0000000..12418fa
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/PassThruInputStream.java
@@ -0,0 +1,36 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.io.FilterInputStream;
+import java.io.InputStream;
+
+/**
+ * A simple pass-through input stream.
+ * <p>
+ * Used in some test cases where a proper resource open/close is needed for
+ * some potentially optional layers of the input stream.
+ */
+public class PassThruInputStream extends FilterInputStream
+{
+    public PassThruInputStream(InputStream in)
+    {
+        super(in);
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestDirContentServlet.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestDirContentServlet.java
new file mode 100644
index 0000000..cfbc4a1
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestDirContentServlet.java
@@ -0,0 +1,74 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+
+import org.eclipse.jetty.toolchain.test.PathAssert;
+import org.eclipse.jetty.util.IO;
+
+@SuppressWarnings("serial")
+public class TestDirContentServlet extends HttpServlet
+{
+    private File basedir;
+
+    @Override
+    public void init(ServletConfig config) throws ServletException
+    {
+        basedir = new File(config.getInitParameter("baseDir"));
+    }
+
+    public File getTestFile(String filename)
+    {
+        File testfile = new File(basedir,filename);
+        PathAssert.assertFileExists("Content File should exist",testfile);
+        return testfile;
+    }
+
+    protected byte[] loadContentFileBytes(final String fileName) throws IOException
+    {
+        String relPath = fileName;
+        relPath = relPath.replaceFirst("^/context/","");
+        relPath = relPath.replaceFirst("^/","");
+
+        File contentFile =  getTestFile(relPath);
+
+        FileInputStream in = null;
+        ByteArrayOutputStream out = null;
+        try
+        {
+            in = new FileInputStream(contentFile);
+            out = new ByteArrayOutputStream();
+            IO.copy(in,out);
+            return out.toByteArray();
+        }
+        finally
+        {
+            IO.close(out);
+            IO.close(in);
+        }
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestMinGzipSizeServlet.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestMinGzipSizeServlet.java
new file mode 100644
index 0000000..11fc487
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestMinGzipSizeServlet.java
@@ -0,0 +1,68 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.io.IOException;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.MimeTypes;
+
+/**
+ * Test servlet for testing against unusual minGzip configurable.
+ */
+@SuppressWarnings("serial")
+public class TestMinGzipSizeServlet extends TestDirContentServlet
+{
+    private MimeTypes mimeTypes;
+
+    @Override
+    public void init(ServletConfig config) throws ServletException
+    {
+        super.init(config);
+        mimeTypes = new MimeTypes();
+    }
+
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    {
+        String fileName = request.getServletPath();
+        byte[] dataBytes = loadContentFileBytes(fileName);
+
+        response.setContentLength(dataBytes.length);
+        response.setHeader("ETag","W/etag-"+fileName);
+        if (fileName.endsWith(".js"))
+        {
+            // intentionally long-form content type to test ";" splitting in code
+            response.setContentType("text/javascript; charset=utf-8");
+        }
+        else
+        {
+            String mime = mimeTypes.getMimeByExtension(fileName);
+            if (mime != null)
+                response.setContentType(mime);
+        }
+        ServletOutputStream out = response.getOutputStream();
+        out.write(dataBytes);
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletBufferTypeLengthWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletBufferTypeLengthWrite.java
new file mode 100644
index 0000000..0e9fbda
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletBufferTypeLengthWrite.java
@@ -0,0 +1,67 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.server.HttpOutput;
+
+/**
+ * A sample servlet to serve static content, using a order of construction that has caused problems for
+ * {@link GzipHandler} in the past.
+ *
+ * Using a real-world pattern of:
+ *
+ * <pre>
+ *  1) get stream
+ *  2) set content type
+ *  2) set content length
+ *  4) write
+ * </pre>
+ *
+ * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
+ */
+@SuppressWarnings("serial")
+public class TestServletBufferTypeLengthWrite extends TestDirContentServlet
+{
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    {
+        String fileName = request.getServletPath();
+        byte[] dataBytes = loadContentFileBytes(fileName);
+
+        ServletOutputStream out = response.getOutputStream();
+
+        if (fileName.endsWith("txt"))
+            response.setContentType("text/plain");
+        else if (fileName.endsWith("mp3"))
+            response.setContentType("audio/mpeg");
+        response.setHeader("ETag","W/etag-"+fileName);
+
+        response.setContentLength(dataBytes.length);
+        
+        ((HttpOutput)out).write(ByteBuffer.wrap(dataBytes).asReadOnlyBuffer());
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletLengthStreamTypeWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletLengthStreamTypeWrite.java
new file mode 100644
index 0000000..4e77c55
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletLengthStreamTypeWrite.java
@@ -0,0 +1,64 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * A sample servlet to serve static content, using a order of construction that has caused problems for
+ * {@link GzipHandler} in the past.
+ *
+ * Using a real-world pattern of:
+ *
+ * <pre>
+ *  1) set content length
+ *  2) get stream
+ *  3) set content type
+ *  4) write
+ * </pre>
+ *
+ * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
+ */
+@SuppressWarnings("serial")
+public class TestServletLengthStreamTypeWrite extends TestDirContentServlet
+{
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    {
+        String fileName = request.getServletPath();
+        byte[] dataBytes = loadContentFileBytes(fileName);
+
+        response.setContentLength(dataBytes.length);
+
+        ServletOutputStream out = response.getOutputStream();
+
+        if (fileName.endsWith("txt"))
+            response.setContentType("text/plain");
+        else if (fileName.endsWith("mp3"))
+            response.setContentType("audio/mpeg");
+        response.setHeader("ETag","W/etag-"+fileName);
+
+        out.write(dataBytes);
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletLengthTypeStreamWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletLengthTypeStreamWrite.java
new file mode 100644
index 0000000..7423ec6
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletLengthTypeStreamWrite.java
@@ -0,0 +1,63 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * A sample servlet to serve static content, using a order of construction that has caused problems for
+ * {@link GzipHandler} in the past.
+ *
+ * Using a real-world pattern of:
+ *
+ * <pre>
+ *  1) set content length
+ *  2) set content type
+ *  3) get stream
+ *  4) write
+ * </pre>
+ *
+ * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
+ */
+@SuppressWarnings("serial")
+public class TestServletLengthTypeStreamWrite extends TestDirContentServlet
+{
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    {
+        String fileName = request.getServletPath();
+        byte[] dataBytes = loadContentFileBytes(fileName);
+
+        response.setContentLength(dataBytes.length);
+
+        if (fileName.endsWith("txt"))
+            response.setContentType("text/plain");
+        else if (fileName.endsWith("mp3"))
+            response.setContentType("audio/mpeg");
+        response.setHeader("ETag","W/etag-"+fileName);
+
+        ServletOutputStream out = response.getOutputStream();
+        out.write(dataBytes);
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletStreamLengthTypeWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletStreamLengthTypeWrite.java
new file mode 100644
index 0000000..26d9071
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletStreamLengthTypeWrite.java
@@ -0,0 +1,64 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * A sample servlet to serve static content, using a order of construction that has caused problems for
+ * {@link GzipHandler} in the past.
+ *
+ * Using a real-world pattern of:
+ *
+ * <pre>
+ *  1) get stream
+ *  2) set content length
+ *  3) set content type
+ *  4) write
+ * </pre>
+ *
+ * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
+ */
+@SuppressWarnings("serial")
+public class TestServletStreamLengthTypeWrite extends TestDirContentServlet
+{
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    {
+        String fileName = request.getServletPath();
+        byte[] dataBytes = loadContentFileBytes(fileName);
+
+        ServletOutputStream out = response.getOutputStream();
+
+        response.setContentLength(dataBytes.length);
+
+        if (fileName.endsWith("txt"))
+            response.setContentType("text/plain");
+        else if (fileName.endsWith("mp3"))
+            response.setContentType("audio/mpeg");
+        response.setHeader("ETag","W/etag-"+fileName);
+
+        out.write(dataBytes);
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletStreamLengthTypeWriteWithFlush.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletStreamLengthTypeWriteWithFlush.java
new file mode 100644
index 0000000..08dfb3c
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletStreamLengthTypeWriteWithFlush.java
@@ -0,0 +1,70 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * A sample servlet to serve static content, using a order of construction that has caused problems for
+ * {@link GzipHandler} in the past.
+ * 
+ * Using a real-world pattern of:
+ * 
+ * <pre>
+ *  1) get stream
+ *  2) set content length
+ *  3) set content type
+ *  4) write and flush
+ * </pre>
+ * 
+ * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
+ */
+@SuppressWarnings("serial")
+public class TestServletStreamLengthTypeWriteWithFlush extends TestDirContentServlet
+{
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    {
+        String fileName = request.getServletPath();
+        byte[] dataBytes = loadContentFileBytes(fileName);
+
+        ServletOutputStream out = response.getOutputStream();
+
+        // set content-length of uncompressed content (GzipHandler should handle this)
+        response.setContentLength(dataBytes.length);
+        
+        if (fileName.endsWith("txt"))
+            response.setContentType("text/plain");
+        else if (fileName.endsWith("mp3"))
+            response.setContentType("audio/mpeg");
+        response.setHeader("ETag","W/etag-"+fileName);
+
+        for ( int i = 0 ; i < dataBytes.length ; i++)
+        {
+            out.write(dataBytes[i]);
+            // flush using response object (not the stream itself)
+            response.flushBuffer();
+        }
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletStreamTypeLengthWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletStreamTypeLengthWrite.java
new file mode 100644
index 0000000..4eac93a
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletStreamTypeLengthWrite.java
@@ -0,0 +1,64 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * A sample servlet to serve static content, using a order of construction that has caused problems for
+ * {@link GzipHandler} in the past.
+ *
+ * Using a real-world pattern of:
+ *
+ * <pre>
+ *  1) get stream
+ *  2) set content type
+ *  2) set content length
+ *  4) write
+ * </pre>
+ *
+ * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
+ */
+@SuppressWarnings("serial")
+public class TestServletStreamTypeLengthWrite extends TestDirContentServlet
+{
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    {
+        String fileName = request.getServletPath();
+        byte[] dataBytes = loadContentFileBytes(fileName);
+
+        ServletOutputStream out = response.getOutputStream();
+
+        if (fileName.endsWith("txt"))
+            response.setContentType("text/plain");
+        else if (fileName.endsWith("mp3"))
+            response.setContentType("audio/mpeg");
+        response.setHeader("ETag","W/etag-"+fileName);
+
+        response.setContentLength(dataBytes.length);
+
+        out.write(dataBytes);
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletTypeLengthStreamWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletTypeLengthStreamWrite.java
new file mode 100644
index 0000000..f5acbd1
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletTypeLengthStreamWrite.java
@@ -0,0 +1,63 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * A sample servlet to serve static content, using a order of construction that has caused problems for
+ * {@link GzipHandler} in the past.
+ *
+ * Using a real-world pattern of:
+ *
+ * <pre>
+ *  1) set content type
+ *  2) set content length
+ *  3) get stream
+ *  4) write
+ * </pre>
+ *
+ * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
+ */
+@SuppressWarnings("serial")
+public class TestServletTypeLengthStreamWrite extends TestDirContentServlet
+{
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    {
+        String fileName = request.getServletPath();
+        byte[] dataBytes = loadContentFileBytes(fileName);
+
+        if (fileName.endsWith("txt"))
+            response.setContentType("text/plain");
+        else if (fileName.endsWith("mp3"))
+            response.setContentType("audio/mpeg");
+        response.setHeader("ETag","W/etag-"+fileName);
+
+        response.setContentLength(dataBytes.length);
+
+        ServletOutputStream out = response.getOutputStream();
+        out.write(dataBytes);
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletTypeStreamLengthWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletTypeStreamLengthWrite.java
new file mode 100644
index 0000000..cf412a8
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestServletTypeStreamLengthWrite.java
@@ -0,0 +1,64 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * A sample servlet to serve static content, using a order of construction that has caused problems for
+ * {@link GzipHandler} in the past.
+ *
+ * Using a real-world pattern of:
+ *
+ * <pre>
+ *  1) set content type
+ *  2) get stream
+ *  3) set content length
+ *  4) write
+ * </pre>
+ *
+ * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
+ */
+@SuppressWarnings("serial")
+public class TestServletTypeStreamLengthWrite extends TestDirContentServlet
+{
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    {
+        String fileName = request.getServletPath();
+        byte[] dataBytes = loadContentFileBytes(fileName);
+
+        if (fileName.endsWith("txt"))
+            response.setContentType("text/plain");
+        else if (fileName.endsWith("mp3"))
+            response.setContentType("audio/mpeg");
+        response.setHeader("ETag","W/etag-"+fileName);
+
+        ServletOutputStream out = response.getOutputStream();
+
+        response.setContentLength(dataBytes.length);
+
+        out.write(dataBytes);
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestStaticMimeTypeServlet.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestStaticMimeTypeServlet.java
new file mode 100644
index 0000000..365e40d
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/TestStaticMimeTypeServlet.java
@@ -0,0 +1,81 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.io.IOException;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.MimeTypes;
+
+/**
+ * Test servlet for testing against unusual MimeTypes and Content-Types.
+ */
+@SuppressWarnings("serial")
+public class TestStaticMimeTypeServlet extends TestDirContentServlet
+{
+    private MimeTypes mimeTypes;
+
+    @Override
+    public void init(ServletConfig config) throws ServletException
+    {
+        super.init(config);
+        mimeTypes = new MimeTypes();
+        // Some real world, yet not terribly common, mime type mappings.
+        mimeTypes.addMimeMapping("bz2","application/bzip2");
+        mimeTypes.addMimeMapping("bmp","image/bmp");
+        mimeTypes.addMimeMapping("tga","application/tga");
+        mimeTypes.addMimeMapping("xcf","image/xcf");
+        mimeTypes.addMimeMapping("jp2","image/jpeg2000");
+
+        // Some of the other gzip mime-types seen in the wild.
+        // NOTE: Using oddball extensions just so that the calling request can specify
+        //       which strange mime type to use.
+        mimeTypes.addMimeMapping("x-gzip","application/x-gzip");
+        mimeTypes.addMimeMapping("x-gunzip","application/x-gunzip");
+        mimeTypes.addMimeMapping("gzipped","application/gzippped");
+        mimeTypes.addMimeMapping("gzip-compressed","application/gzip-compressed");
+        mimeTypes.addMimeMapping("x-compressed","application/x-compressed");
+        mimeTypes.addMimeMapping("x-compress","application/x-compress");
+        mimeTypes.addMimeMapping("gzipdoc","gzip/document");
+    }
+
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    {
+        String fileName = request.getServletPath();
+        byte[] dataBytes = loadContentFileBytes(fileName);
+
+        response.setContentLength(dataBytes.length);
+        response.setHeader("ETag","W/etag-"+fileName);
+
+        String mime = mimeTypes.getMimeByExtension(fileName);
+        if (mime == null)
+            response.setContentType("application/octet-stream");
+        else
+            response.setContentType(mime);
+
+        ServletOutputStream out = response.getOutputStream();
+        out.write(dataBytes);
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/AbstractDoSFilterTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/AbstractDoSFilterTest.java
index 421970f..96fcd8a 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/AbstractDoSFilterTest.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/AbstractDoSFilterTest.java
@@ -260,7 +260,7 @@
         // System.err.println("RESPONSES: \n"+responses);
 
         assertEquals(4,count(responses,"HTTP/1.1 200 OK"));
-        assertEquals(1,count(responses,"HTTP/1.1 503"));
+        assertEquals(1,count(responses,"HTTP/1.1 429"));
         assertEquals(1,count(responses,"DoSFilter: delayed"));
         assertEquals(1,count(responses,"DoSFilter: throttled"));
         assertEquals(1,count(responses,"DoSFilter: unavailable"));
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/CrossOriginFilterTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/CrossOriginFilterTest.java
index f607a98..85e45b3 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/CrossOriginFilterTest.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/CrossOriginFilterTest.java
@@ -173,7 +173,7 @@
     }
 
     @Test
-    public void testSimpleRequestWithMatchingOrigin() throws Exception
+    public void testSimpleRequestWithMatchingOriginAndWithoutTimingOrigin() throws Exception
     {
         FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
         String origin = "http://localhost";
@@ -193,11 +193,67 @@
         Assert.assertTrue(response.contains("HTTP/1.1 200"));
         Assert.assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER));
         Assert.assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER));
+        Assert.assertFalse(response.contains(CrossOriginFilter.TIMING_ALLOW_ORIGIN_HEADER));
         Assert.assertTrue(response.contains("Vary"));
         Assert.assertTrue(latch.await(1, TimeUnit.SECONDS));
     }
 
     @Test
+    public void testSimpleRequestWithMatchingOriginAndNonMatchingTimingOrigin() throws Exception
+    {
+    	FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
+    	String origin = "http://localhost";
+    	String timingOrigin = "http://127.0.0.1";
+    	filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, origin);
+    	filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_TIMING_ORIGINS_PARAM, timingOrigin);
+    	tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
+    	
+    	CountDownLatch latch = new CountDownLatch(1);
+    	tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
+    	
+    	String request = "" +
+    			"GET / HTTP/1.1\r\n" +
+    			"Host: localhost\r\n" +
+    			"Connection: close\r\n" +
+    			"Origin: " + origin + "\r\n" +
+    			"\r\n";
+    	String response = tester.getResponses(request);
+    	Assert.assertTrue(response.contains("HTTP/1.1 200"));
+    	Assert.assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER));
+    	Assert.assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER));
+        Assert.assertFalse(response.contains(CrossOriginFilter.TIMING_ALLOW_ORIGIN_HEADER));
+    	Assert.assertTrue(response.contains("Vary"));
+    	Assert.assertTrue(latch.await(1, TimeUnit.SECONDS));
+    }
+    
+    @Test
+    public void testSimpleRequestWithMatchingOriginAndMatchingTimingOrigin() throws Exception
+    {
+    	FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
+    	String origin = "http://localhost";
+    	filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, origin);
+    	filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_TIMING_ORIGINS_PARAM, origin);
+    	tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
+    	
+    	CountDownLatch latch = new CountDownLatch(1);
+    	tester.getContext().addServlet(new ServletHolder(new ResourceServlet(latch)), "/*");
+    	
+    	String request = "" +
+    			"GET / HTTP/1.1\r\n" +
+    			"Host: localhost\r\n" +
+    			"Connection: close\r\n" +
+    			"Origin: " + origin + "\r\n" +
+    			"\r\n";
+    	String response = tester.getResponses(request);
+    	Assert.assertTrue(response.contains("HTTP/1.1 200"));
+    	Assert.assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER));
+    	Assert.assertTrue(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER));
+    	Assert.assertTrue(response.contains(CrossOriginFilter.TIMING_ALLOW_ORIGIN_HEADER));
+    	Assert.assertTrue(response.contains("Vary"));
+    	Assert.assertTrue(latch.await(1, TimeUnit.SECONDS));
+    }
+    
+    @Test
     public void testSimpleRequestWithMatchingMultipleOrigins() throws Exception
     {
         FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
@@ -455,7 +511,7 @@
                 "Upgrade: WebSocket\r\n" +
                 "Origin: http://localhost\r\n" +
                 "\r\n";
-        String response = tester.getResponses(request);
+        String response = tester.getResponses(request,1,TimeUnit.SECONDS);
         Assert.assertTrue(response.contains("HTTP/1.1 200"));
         Assert.assertFalse(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER));
         Assert.assertFalse(response.contains(CrossOriginFilter.ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER));
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/DataRateLimitedServletTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/DataRateLimitedServletTest.java
index 052b879..b1db055 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/DataRateLimitedServletTest.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/DataRateLimitedServletTest.java
@@ -25,6 +25,8 @@
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
 import java.util.Arrays;
 
 import org.eclipse.jetty.server.HttpConfiguration;
@@ -63,7 +65,12 @@
  
         context.setContextPath("/context");
         context.setWelcomeFiles(new String[]{"index.html", "index.jsp", "index.htm"});
-        context.setBaseResource(Resource.newResource(testdir.getEmptyDir()));
+        
+        File baseResourceDir = testdir.getEmptyDir();
+        // Use resolved real path for Windows and OSX
+        Path baseResourcePath = baseResourceDir.toPath().toRealPath();
+        
+        context.setBaseResource(Resource.newResource(baseResourcePath.toFile()));
         
         ServletHolder holder =context.addServlet(DataRateLimitedServlet.class,"/stream/*");
         holder.setInitParameter("buffersize",""+BUFFER);
@@ -85,15 +92,19 @@
     public void testStream() throws Exception
     {
         File content = testdir.getFile("content.txt");
+        String[] results=new String[10];
         try(OutputStream out = new FileOutputStream(content);)
         {
             byte[] b= new byte[1024];
             
             for (int i=1024;i-->0;)
             {
-                Arrays.fill(b,(byte)('0'+(i%10)));
+                int index=i%10;
+                Arrays.fill(b,(byte)('0'+(index)));
                 out.write(b);
                 out.write('\n');
+                if (results[index]==null)
+                    results[index]=new String(b,StandardCharsets.US_ASCII);
             }
         }
         
@@ -101,9 +112,11 @@
         String response = connector.getResponses("GET /context/stream/content.txt HTTP/1.0\r\n\r\n");
         long duration=System.currentTimeMillis()-start;
         
-        assertThat(response.length(),greaterThan(1024*1024));
-        assertThat(response,containsString("200 OK"));
-        assertThat(duration,greaterThan(PAUSE*1024L*1024/BUFFER));
+        assertThat("Response",response,containsString("200 OK"));
+        assertThat("Response Length",response.length(),greaterThan(1024*1024));
+        assertThat("Duration",duration,greaterThan(PAUSE*1024L*1024/BUFFER));
         
+        for (int i=0;i<10;i++)
+            assertThat(response,containsString(results[i]));
     }
 }
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/DoSFilterTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/DoSFilterTest.java
index 35001a2..9e2f4d5 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/DoSFilterTest.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/DoSFilterTest.java
@@ -18,8 +18,12 @@
 
 package org.eclipse.jetty.servlets;
 
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
 import java.util.ArrayList;
 import java.util.List;
+
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -30,9 +34,6 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
 public class DoSFilterTest extends AbstractDoSFilterTest
 {
     private static final Logger LOG = Log.getLogger(DoSFilterTest.class);
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterContentLengthTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterContentLengthTest.java
deleted file mode 100644
index d546617f..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterContentLengthTest.java
+++ /dev/null
@@ -1,352 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets;
-
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import javax.servlet.DispatcherType;
-
-import org.eclipse.jetty.http.HttpStatus;
-import org.eclipse.jetty.http.HttpTester;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.servlet.FilterHolder;
-import org.eclipse.jetty.servlets.gzip.AsyncScheduledDispatchWrite;
-import org.eclipse.jetty.servlets.gzip.AsyncTimeoutDispatchWrite;
-import org.eclipse.jetty.servlets.gzip.AsyncTimeoutCompleteWrite;
-import org.eclipse.jetty.servlets.gzip.GzipTester;
-import org.eclipse.jetty.servlets.gzip.GzipTester.ContentMetadata;
-import org.eclipse.jetty.servlets.gzip.TestDirContentServlet;
-import org.eclipse.jetty.servlets.gzip.TestServletBufferTypeLengthWrite;
-import org.eclipse.jetty.servlets.gzip.TestServletLengthStreamTypeWrite;
-import org.eclipse.jetty.servlets.gzip.TestServletLengthTypeStreamWrite;
-import org.eclipse.jetty.servlets.gzip.TestServletStreamLengthTypeWrite;
-import org.eclipse.jetty.servlets.gzip.TestServletStreamLengthTypeWriteWithFlush;
-import org.eclipse.jetty.servlets.gzip.TestServletStreamTypeLengthWrite;
-import org.eclipse.jetty.servlets.gzip.TestServletTypeLengthStreamWrite;
-import org.eclipse.jetty.servlets.gzip.TestServletTypeStreamLengthWrite;
-import org.eclipse.jetty.toolchain.test.TestTracker;
-import org.eclipse.jetty.toolchain.test.TestingDir;
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameter;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * Test the GzipFilter support for Content-Length setting variations.
- *
- * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
- */
-@RunWith(Parameterized.class)
-public class GzipFilterContentLengthTest
-{
-    @Rule
-    public final TestTracker tracker = new TestTracker();
-
-    @Rule
-    public TestingDir testingdir = new TestingDir();
-    
-    private static final HttpConfiguration defaultHttp = new HttpConfiguration();
-    private static final int LARGE = defaultHttp.getOutputBufferSize() * 8;
-    private static final int MEDIUM = defaultHttp.getOutputBufferSize();
-    private static final int SMALL = defaultHttp.getOutputBufferSize() / 4;
-    private static final int TINY = AsyncGzipFilter.DEFAULT_MIN_GZIP_SIZE / 2;
-    private static final boolean EXPECT_COMPRESSED = true;
-
-    @Parameters(name = "{0} bytes - {1} - compressed({2}) - type({3}) - filter({4})")
-    public static List<Object[]> data()
-    {
-        List<Object[]> ret = new ArrayList<Object[]>();
-        
-        String compressionTypes[] = new String[] { GzipFilter.GZIP, GzipFilter.DEFLATE };
-        Class<?> gzipFilters[] = new Class<?>[] { GzipFilter.class, AsyncGzipFilter.class };
-        
-        for(String compressionType: compressionTypes)
-        {
-            for(Class<?> gzipFilter: gzipFilters)
-            {
-                ret.add(new Object[] { 0, "empty.txt", !EXPECT_COMPRESSED, compressionType, gzipFilter });
-                ret.add(new Object[] { TINY, "file-tiny.txt", !EXPECT_COMPRESSED, compressionType, gzipFilter });
-                ret.add(new Object[] { SMALL, "file-small.txt", EXPECT_COMPRESSED, compressionType, gzipFilter });
-                ret.add(new Object[] { SMALL, "file-small.mp3", !EXPECT_COMPRESSED, compressionType, gzipFilter });
-                ret.add(new Object[] { MEDIUM, "file-med.txt", EXPECT_COMPRESSED, compressionType, gzipFilter });
-                ret.add(new Object[] { MEDIUM, "file-medium.mp3", !EXPECT_COMPRESSED, compressionType, gzipFilter });
-                ret.add(new Object[] { LARGE, "file-large.txt", EXPECT_COMPRESSED, compressionType, gzipFilter });
-                ret.add(new Object[] { LARGE, "file-large.mp3", !EXPECT_COMPRESSED, compressionType, gzipFilter });
-            }
-        }
-
-        return ret;
-    }
-
-    @Parameter(0)
-    public int fileSize;
-    @Parameter(1)
-    public String fileName;
-    @Parameter(2)
-    public boolean expectCompressed;
-    @Parameter(3)
-    public String compressionType;
-    @Parameter(4)
-    public Class<? extends GzipFilter> gzipFilterClass;
-    
-    private void testWithGzip(Class<? extends TestDirContentServlet> contentServlet) throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir, GzipFilter.GZIP);
-        
-        // Add AsyncGzip Filter
-        FilterHolder gzipHolder = new FilterHolder(gzipFilterClass);
-        gzipHolder.setAsyncSupported(true);
-        tester.addFilter(gzipHolder,"*.txt",EnumSet.of(DispatcherType.REQUEST,DispatcherType.ASYNC));
-        tester.addFilter(gzipHolder,"*.mp3",EnumSet.of(DispatcherType.REQUEST,DispatcherType.ASYNC));
-        gzipHolder.setInitParameter("mimeTypes","text/plain");
-
-        // Add content servlet
-        tester.setContentServlet(contentServlet);
-        
-        try
-        {
-            String testFilename = String.format("%s-%s-%s", gzipFilterClass.getSimpleName(), contentServlet.getSimpleName(), fileName);
-            File testFile = tester.prepareServerFile(testFilename,fileSize);
-            
-            tester.start();
-            
-            HttpTester.Response response = tester.executeRequest("GET","/context/" + testFile.getName(),5,TimeUnit.SECONDS);
-            
-            if (response.getStatus()!=200)
-                System.err.println("DANG!!!! "+response);
-            
-            assertThat("Response status", response.getStatus(), is(HttpStatus.OK_200));
-            
-            if (expectCompressed)
-            {
-                // Must be gzip compressed
-                assertThat("Content-Encoding",response.get("Content-Encoding"),containsString(GzipFilter.GZIP));
-            } else
-            {
-                assertThat("Content-Encoding",response.get("Content-Encoding"),not(containsString(GzipFilter.GZIP)));
-            }
-            
-            // Uncompressed content Size
-            ContentMetadata content = tester.getResponseMetadata(response);
-            assertThat("(Uncompressed) Content Length", content.size, is((long)fileSize));
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    /**
-     * Test with content servlet that does:  
-     * AsyncContext create -> timeout -> onTimeout -> write-response -> complete
-     */
-    @Test
-    public void testAsyncTimeoutCompleteWrite_Default() throws Exception
-    {
-        if (expectCompressed && gzipFilterClass==GzipFilter.class)
-            return; // Default startAsync will never work with GzipFilter, which needs wrapping
-        testWithGzip(AsyncTimeoutCompleteWrite.Default.class);
-    }
-    
-    /**
-     * Test with content servlet that does:  
-     * AsyncContext create -> timeout -> onTimeout -> write-response -> complete
-     */
-    @Test
-    public void testAsyncTimeoutCompleteWrite_Passed() throws Exception
-    {
-        testWithGzip(AsyncTimeoutCompleteWrite.Passed.class);
-    }
-    
-    /**
-     * Test with content servlet that does:  
-     * AsyncContext create -> timeout -> onTimeout -> dispatch -> write-response
-     */
-    @Test
-    public void testAsyncTimeoutDispatchWrite_Default() throws Exception
-    {
-        testWithGzip(AsyncTimeoutDispatchWrite.Default.class);
-    }
-    
-    /**
-     * Test with content servlet that does:  
-     * AsyncContext create -> timeout -> onTimeout -> dispatch -> write-response
-     */
-    @Test
-    public void testAsyncTimeoutDispatchWrite_Passed() throws Exception
-    {
-        testWithGzip(AsyncTimeoutDispatchWrite.Passed.class);
-    }
-
-    /**
-     * Test with content servlet that does:  
-     * AsyncContext create -> no-timeout -> scheduler.schedule -> dispatch -> write-response
-     */
-    @Test
-    public void testAsyncScheduledDispatchWrite_Default() throws Exception
-    {
-        testWithGzip(AsyncScheduledDispatchWrite.Default.class);
-    }
-    
-    /**
-     * Test with content servlet that does:  
-     * AsyncContext create -> no-timeout -> scheduler.schedule -> dispatch -> write-response
-     */
-    @Test
-    public void testAsyncScheduledDispatchWrite_Passed() throws Exception
-    {
-        testWithGzip(AsyncScheduledDispatchWrite.Passed.class);
-    }
-
-    /**
-     * Test with content servlet that does:  
-     * 1) setHeader(content-length)
-     * 2) getOutputStream()
-     * 3) setHeader(content-type)
-     * 4) outputStream.write()
-     * 
-     * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
-     */
-    @Test
-    public void testServletLengthStreamTypeWrite() throws Exception
-    {
-        testWithGzip(TestServletLengthStreamTypeWrite.class);
-    }
-
-    /**
-     * Test with content servlet that does:  
-     * 1) setHeader(content-length)
-     * 2) setHeader(content-type)
-     * 3) getOutputStream()
-     * 4) outputStream.write()
-     * 
-     * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
-     */
-    @Test
-    public void testServletLengthTypeStreamWrite() throws Exception
-    {
-        testWithGzip(TestServletLengthTypeStreamWrite.class);
-    }
-
-    /**
-     * Test with content servlet that does:  
-     * 1) getOutputStream()
-     * 2) setHeader(content-length)
-     * 3) setHeader(content-type)
-     * 4) outputStream.write()
-     * 
-     * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
-     */
-    @Test
-    public void testServletStreamLengthTypeWrite() throws Exception
-    {
-        testWithGzip(TestServletStreamLengthTypeWrite.class);
-    }
-
-    /**
-     * Test with content servlet that does:  
-     * 1) getOutputStream()
-     * 2) setHeader(content-length)
-     * 3) setHeader(content-type)
-     * 4) outputStream.write() (with frequent response flush)
-     * 
-     * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
-     */
-    @Test
-    public void testServletStreamLengthTypeWriteWithFlush() throws Exception
-    {
-        testWithGzip(TestServletStreamLengthTypeWriteWithFlush.class);
-    }
-
-    /**
-     * Test with content servlet that does:  
-     * 1) getOutputStream()
-     * 2) setHeader(content-type)
-     * 3) setHeader(content-length)
-     * 4) outputStream.write()
-     * 
-     * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
-     */
-    @Test
-    public void testServletStreamTypeLengthWrite() throws Exception
-    {
-        testWithGzip(TestServletStreamTypeLengthWrite.class);
-    }
-
-    /**
-     * Test with content servlet that does:  
-     * 1) setHeader(content-type)
-     * 2) setHeader(content-length)
-     * 3) getOutputStream()
-     * 4) outputStream.write()
-     * 
-     * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
-     */
-    @Test
-    public void testServletTypeLengthStreamWrite() throws Exception
-    {
-        testWithGzip(TestServletTypeLengthStreamWrite.class);
-    }
-
-    /**
-     * Test with content servlet that does:  
-     * 1) setHeader(content-type)
-     * 2) getOutputStream()
-     * 3) setHeader(content-length)
-     * 4) outputStream.write()
-     * 
-     * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
-     */
-    @Test
-    public void testServletTypeStreamLengthWrite() throws Exception
-    {
-        testWithGzip(TestServletTypeStreamLengthWrite.class);
-    }
-
-    /**
-     * Test with content servlet that does:  
-     * 2) getOutputStream()
-     * 1) setHeader(content-type)
-     * 3) setHeader(content-length)
-     * 4) (unwrapped) HttpOutput.write(ByteBuffer)
-     * 
-     * This is done to demonstrate a bug with using HttpOutput.write()
-     * while also using GzipFilter
-     * 
-     * @see <a href="Eclipse Bug 450873">http://bugs.eclipse.org/450873</a>
-     */
-    @Test
-    public void testHttpOutputWrite() throws Exception
-    {
-        if (gzipFilterClass == GzipFilter.class)
-            return;  // Can't downcaste output stream when wrapper is used
-        testWithGzip(TestServletBufferTypeLengthWrite.class);
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterDefaultNoRecompressTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterDefaultNoRecompressTest.java
deleted file mode 100644
index fb3ad8e..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterDefaultNoRecompressTest.java
+++ /dev/null
@@ -1,143 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.servlet.Filter;
-
-import org.eclipse.jetty.servlet.FilterHolder;
-import org.eclipse.jetty.servlets.gzip.GzipTester;
-import org.eclipse.jetty.servlets.gzip.TestStaticMimeTypeServlet;
-import org.eclipse.jetty.toolchain.test.IO;
-import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
-import org.eclipse.jetty.toolchain.test.TestingDir;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * Tests {@link GzipFilter} in combination with {@link DefaultServlet} for ability to configure {@link GzipFilter} to
- * ignore recompress situations from upstream.
- */
-@RunWith(Parameterized.class)
-public class GzipFilterDefaultNoRecompressTest
-{
-    @Parameters
-    public static List<Object[]> data()
-    {
-        return Arrays.asList(new Object[][]
-        {
-                // Some already compressed files
-                { GzipFilter.class, "test_quotes.gz", "application/gzip", GzipFilter.GZIP },
-                { GzipFilter.class, "test_quotes.bz2", "application/bzip2", GzipFilter.GZIP },
-                { GzipFilter.class, "test_quotes.zip", "application/zip", GzipFilter.GZIP },
-                { GzipFilter.class, "test_quotes.rar", "application/octet-stream", GzipFilter.GZIP },
-                // Some images (common first)
-                { GzipFilter.class, "jetty_logo.png", "image/png", GzipFilter.GZIP },
-                { GzipFilter.class, "jetty_logo.gif", "image/gif", GzipFilter.GZIP },
-                { GzipFilter.class, "jetty_logo.jpeg", "image/jpeg", GzipFilter.GZIP },
-                { GzipFilter.class, "jetty_logo.jpg", "image/jpeg", GzipFilter.GZIP },
-                // Lesser encountered images (usually found being requested from non-browser clients)
-                { GzipFilter.class, "jetty_logo.bmp", "image/bmp", GzipFilter.GZIP },
-                { GzipFilter.class, "jetty_logo.tga", "application/tga", GzipFilter.GZIP },
-                { GzipFilter.class, "jetty_logo.tif", "image/tiff", GzipFilter.GZIP },
-                { GzipFilter.class, "jetty_logo.tiff", "image/tiff", GzipFilter.GZIP },
-                { GzipFilter.class, "jetty_logo.xcf", "image/xcf", GzipFilter.GZIP },
-                { GzipFilter.class, "jetty_logo.jp2", "image/jpeg2000", GzipFilter.GZIP },
-                //qvalue disables compression
-                { GzipFilter.class, "test_quotes.txt", "text/plain", GzipFilter.GZIP+";q=0"},
-                { GzipFilter.class, "test_quotes.txt", "text/plain", GzipFilter.GZIP+"; q =    0 "},
-                
-                
-                // Some already compressed files
-                { AsyncGzipFilter.class, "test_quotes.gz", "application/gzip", GzipFilter.GZIP },
-                { AsyncGzipFilter.class, "test_quotes.bz2", "application/bzip2", GzipFilter.GZIP },
-                { AsyncGzipFilter.class, "test_quotes.zip", "application/zip", GzipFilter.GZIP },
-                { AsyncGzipFilter.class, "test_quotes.rar", "application/octet-stream", GzipFilter.GZIP },
-                // Some images (common first)
-                { AsyncGzipFilter.class, "jetty_logo.png", "image/png", GzipFilter.GZIP },
-                { AsyncGzipFilter.class, "jetty_logo.gif", "image/gif", GzipFilter.GZIP },
-                { AsyncGzipFilter.class, "jetty_logo.jpeg", "image/jpeg", GzipFilter.GZIP },
-                { AsyncGzipFilter.class, "jetty_logo.jpg", "image/jpeg", GzipFilter.GZIP },
-                // Lesser encountered images (usually found being requested from non-browser clients)
-                { AsyncGzipFilter.class, "jetty_logo.bmp", "image/bmp", GzipFilter.GZIP },
-                { AsyncGzipFilter.class, "jetty_logo.tga", "application/tga", GzipFilter.GZIP },
-                { AsyncGzipFilter.class, "jetty_logo.tif", "image/tiff", GzipFilter.GZIP },
-                { AsyncGzipFilter.class, "jetty_logo.tiff", "image/tiff", GzipFilter.GZIP },
-                { AsyncGzipFilter.class, "jetty_logo.xcf", "image/xcf", GzipFilter.GZIP },
-                { AsyncGzipFilter.class, "jetty_logo.jp2", "image/jpeg2000", GzipFilter.GZIP },
-                //qvalue disables compression
-                { AsyncGzipFilter.class, "test_quotes.txt", "text/plain", GzipFilter.GZIP+";q=0"},
-                { AsyncGzipFilter.class, "test_quotes.txt", "text/plain", GzipFilter.GZIP+"; q =    0 "}
-        });
-    }
-
-    @Rule
-    public TestingDir testingdir = new TestingDir();
-
-    private Class<? extends Filter> testFilter;
-    private String alreadyCompressedFilename;
-    private String expectedContentType;
-    private String compressionType;
-
-    public GzipFilterDefaultNoRecompressTest(Class<? extends Filter> testFilter,String testFilename, String expectedContentType, String compressionType)
-    {
-        this.testFilter = testFilter;
-        this.alreadyCompressedFilename = testFilename;
-        this.expectedContentType = expectedContentType;
-        this.compressionType = compressionType;
-    }
-
-    @Test
-    public void testNotGzipFiltered_Default_AlreadyCompressed() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir, compressionType);
-        tester.setGzipFilterClass(testFilter);
-
-        copyTestFileToServer(alreadyCompressedFilename);
-
-        FilterHolder holder = tester.setContentServlet(TestStaticMimeTypeServlet.class);
-        StringBuilder mimeTypes = new StringBuilder();
-        mimeTypes.append("text/plain");
-        holder.setInitParameter("mimeTypes",mimeTypes.toString());
-
-        try
-        {
-            tester.start();
-            tester.assertIsResponseNotGzipFiltered(alreadyCompressedFilename,alreadyCompressedFilename + ".sha1",expectedContentType);
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    private void copyTestFileToServer(String testFilename) throws IOException
-    {
-        File testFile = MavenTestingUtils.getTestResourceFile(testFilename);
-        File outFile = testingdir.getFile(testFilename);
-        IO.copy(testFile,outFile);
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterDefaultTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterDefaultTest.java
deleted file mode 100644
index 2b2e0c2..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterDefaultTest.java
+++ /dev/null
@@ -1,794 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets;
-
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import javax.servlet.DispatcherType;
-import javax.servlet.Filter;
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.http.HttpStatus;
-import org.eclipse.jetty.http.HttpTester;
-import org.eclipse.jetty.servlet.DefaultServlet;
-import org.eclipse.jetty.servlet.FilterHolder;
-import org.eclipse.jetty.servlets.gzip.GzipTester;
-import org.eclipse.jetty.toolchain.test.IO;
-import org.eclipse.jetty.toolchain.test.TestingDir;
-import org.eclipse.jetty.util.StringUtil;
-import org.junit.Assert;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * Test the GzipFilter support built into the {@link DefaultServlet}
- */
-@RunWith(Parameterized.class)
-public class GzipFilterDefaultTest
-{
-    @Parameters(name="{1} - {0}")
-    public static List<Object[]> data()
-    {
-        return Arrays.asList(new Object[][]
-        { 
-            { AsyncGzipFilter.class, GzipFilter.GZIP },
-            { GzipFilter.class, GzipFilter.GZIP },
-            { GzipFilter.class, GzipFilter.DEFLATE },
-        });
-    }
-
-    private Class<? extends Filter> testFilter;
-    private String compressionType;
-
-    public GzipFilterDefaultTest(Class<? extends Filter> testFilter, String compressionType)
-    {
-        this.testFilter = testFilter;
-        this.compressionType = compressionType;
-    }
-
-    @SuppressWarnings("serial")
-    public static class HttpStatusServlet extends HttpServlet
-    {
-        private int _status = 204;
-
-        public HttpStatusServlet()
-        {
-            super();
-        }
-
-        @Override
-        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
-        {
-            resp.setStatus(_status);
-            resp.setHeader("ETag","W/\"204\"");
-        }
-
-    }
-
-    @SuppressWarnings("serial")
-    public static class HttpErrorServlet extends HttpServlet
-    {
-        private int _status = 400;
-
-        public HttpErrorServlet()
-        {
-            super();
-        }
-
-        @Override
-        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
-        {
-            resp.getOutputStream().write("error message".getBytes());
-            resp.setStatus(_status);
-        }
-    }
-
-    @SuppressWarnings("serial")
-    public static class HttpContentTypeWithEncoding extends HttpServlet
-    {
-        public static final String COMPRESSED_CONTENT = "<html><head></head><body><h1>COMPRESSABLE CONTENT</h1>"
-                + "This content must be longer than the default min gzip length, which is 256 bytes. "
-                + "The moon is blue to a fish in love. How now brown cow. The quick brown fox jumped over the lazy dog. A woman needs a man like a fish needs a bicycle!"
-                + "</body></html>";
-
-        @Override
-        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
-        {
-            resp.setContentType("text/plain;charset=UTF8");
-            resp.setStatus(200);
-            ServletOutputStream out = resp.getOutputStream();
-            out.print(COMPRESSED_CONTENT);
-        }
-
-    }
-
-    @Rule
-    public TestingDir testingdir = new TestingDir();
-
-    @Test
-    public void testIsGzipByMethod() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-
-        // Add Gzip Filter first
-        FilterHolder gzipHolder = new FilterHolder(testFilter);
-        gzipHolder.setAsyncSupported(true);
-        tester.addFilter(gzipHolder,"/*",EnumSet.of(DispatcherType.REQUEST,DispatcherType.ASYNC));
-        gzipHolder.setInitParameter("mimeTypes","text/plain");
-        gzipHolder.setInitParameter("methods","POST, WIBBLE");
-
-        // Prepare Server File
-        int filesize = tester.getOutputBufferSize() * 2;
-        tester.prepareServerFile("file.txt",filesize);
-
-        // Content Servlet
-        tester.setContentServlet(GetServlet.class);
-
-        try
-        {
-            tester.start();
-            HttpTester.Response response;
-
-            tester.assertIsResponseGzipCompressed("POST","file.txt");
-            tester.assertIsResponseGzipCompressed("WIBBLE","file.txt");
-
-            response = tester.executeRequest("GET","/context/file.txt",5,TimeUnit.SECONDS);
-
-            assertThat("Response status",response.getStatus(),is(HttpStatus.OK_200));
-            assertThat("Content-Encoding",response.get("Content-Encoding"),not(containsString(compressionType)));
-
-            String content = tester.readResponse(response);
-            assertThat("Response content size",content.length(),is(filesize));
-            String expectedContent = IO.readToString(testingdir.getFile("file.txt"));
-            assertThat("Response content",content,is(expectedContent));
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    @SuppressWarnings("serial")
-    public static class GetServlet extends DefaultServlet
-    {
-        public GetServlet()
-        {
-            super();
-        }
-
-        @Override
-        public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException
-        {
-            String uri = req.getRequestURI();
-            if (uri.endsWith(".deferred"))
-            {
-                // System.err.println("type for "+uri.substring(0,uri.length()-9)+" is "+getServletContext().getMimeType(uri.substring(0,uri.length()-9)));
-                resp.setContentType(getServletContext().getMimeType(uri.substring(0,uri.length() - 9)));
-            }
-
-            doGet(req,resp);
-        }
-    }
-
-    @Test
-    public void testIsGzipCompressedEmpty() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-
-        // Add Gzip Filter first
-        FilterHolder gzipHolder = new FilterHolder(testFilter);
-        gzipHolder.setAsyncSupported(true);
-        tester.addFilter(gzipHolder,"/*",EnumSet.of(DispatcherType.REQUEST,DispatcherType.ASYNC));
-        gzipHolder.setInitParameter("mimeTypes","text/plain");
-
-        // Prepare server file
-        tester.prepareServerFile("empty.txt",0);
-
-        // Set content servlet
-        tester.setContentServlet(DefaultServlet.class);
-
-        try
-        {
-            tester.start();
-
-            HttpTester.Response response;
-
-            response = tester.executeRequest("GET","/context/empty.txt",5,TimeUnit.SECONDS);
-
-            assertThat("Response status",response.getStatus(),is(HttpStatus.OK_200));
-            assertThat("Content-Encoding",response.get("Content-Encoding"),not(containsString(compressionType)));
-
-            String content = tester.readResponse(response);
-            assertThat("Response content size",content.length(),is(0));
-            String expectedContent = IO.readToString(testingdir.getFile("empty.txt"));
-            assertThat("Response content",content,is(expectedContent));
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    @Test
-    public void testIsGzipCompressedTiny() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-        tester.setGzipFilterClass(testFilter);
-
-        int filesize = tester.getOutputBufferSize() / 4;
-        tester.prepareServerFile("file.txt",filesize);
-
-        FilterHolder holder = tester.setContentServlet(org.eclipse.jetty.servlet.DefaultServlet.class);
-        holder.setInitParameter("mimeTypes","text/plain");
-
-        try
-        {
-            tester.start();
-            HttpTester.Response http = tester.assertIsResponseGzipCompressed("GET","file.txt");
-            Assert.assertEquals("Accept-Encoding",http.get("Vary"));
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    @Test
-    public void testIsGzipCompressedLarge() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-        tester.setGzipFilterClass(testFilter);
-
-        int filesize = tester.getOutputBufferSize() * 4;
-        tester.prepareServerFile("file.txt",filesize);
-
-        FilterHolder holder = tester.setContentServlet(org.eclipse.jetty.servlet.DefaultServlet.class);
-        holder.setInitParameter("mimeTypes","text/plain");
-
-        try
-        {
-            tester.start();
-            HttpTester.Response http = tester.assertIsResponseGzipCompressed("GET","file.txt");
-            Assert.assertEquals("Accept-Encoding",http.get("Vary"));
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    @Test
-    public void testGzipedIfModified() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-        tester.setGzipFilterClass(testFilter);
-
-        int filesize = tester.getOutputBufferSize() * 4;
-        tester.prepareServerFile("file.txt",filesize);
-
-        FilterHolder holder = tester.setContentServlet(org.eclipse.jetty.servlet.DefaultServlet.class);
-        holder.setInitParameter("mimeTypes","text/plain");
-
-        try
-        {
-            tester.start();
-            HttpTester.Response http = tester.assertIsResponseGzipCompressed("GET","file.txt",System.currentTimeMillis() - 4000);
-            Assert.assertEquals("Accept-Encoding",http.get("Vary"));
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    @Test
-    public void testGzippedIfSVG() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-        tester.setGzipFilterClass(testFilter);
-        tester.copyTestServerFile("test.svg");
-        @SuppressWarnings("unused")
-        FilterHolder holder = tester.setContentServlet(org.eclipse.jetty.servlet.DefaultServlet.class);
-        try
-        {
-            tester.start();
-            HttpTester.Response http = tester.assertIsResponseGzipCompressed("GET","test.svg",System.currentTimeMillis() - 4000);
-            Assert.assertEquals("Accept-Encoding",http.get("Vary"));
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    @Test
-    public void testNotGzipedIfNotModified() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-        tester.setGzipFilterClass(testFilter);
-
-        int filesize = tester.getOutputBufferSize() * 4;
-        tester.prepareServerFile("file.txt",filesize);
-
-        FilterHolder holder = tester.setContentServlet(org.eclipse.jetty.servlet.DefaultServlet.class);
-        holder.setInitParameter("mimeTypes","text/plain");
-        holder.setInitParameter("etags","true");
-
-        try
-        {
-            tester.start();
-            tester.assertIsResponseNotModified("GET","file.txt",System.currentTimeMillis() + 4000);
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    @Test
-    public void testIsNotGzipCompressedWithZeroQ() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType + "; q=0");
-
-        // Add Gzip Filter first
-        FilterHolder gzipHolder = new FilterHolder(testFilter);
-        gzipHolder.setAsyncSupported(true);
-        tester.addFilter(gzipHolder,"/*",EnumSet.of(DispatcherType.REQUEST,DispatcherType.ASYNC));
-        gzipHolder.setInitParameter("mimeTypes","text/plain");
-
-        // Prepare server file
-        int filesize = tester.getOutputBufferSize() / 4;
-        tester.prepareServerFile("file.txt",filesize);
-
-        // Add content servlet
-        tester.setContentServlet(DefaultServlet.class);
-
-        try
-        {
-            tester.start();
-            HttpTester.Response http = assertIsResponseNotGzipCompressed(tester,"GET","file.txt",filesize,HttpStatus.OK_200);
-            assertThat("Response[Vary]",http.get("Vary"),containsString("Accept-Encoding"));
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    @Test
-    public void testIsGzipCompressedWithQ() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType,"something;q=0.1," + compressionType + ";q=0.5");
-        tester.setGzipFilterClass(testFilter);
-
-        int filesize = tester.getOutputBufferSize() / 4;
-        tester.prepareServerFile("file.txt",filesize);
-
-        FilterHolder holder = tester.setContentServlet(org.eclipse.jetty.servlet.DefaultServlet.class);
-        holder.setInitParameter("mimeTypes","text/plain");
-
-        try
-        {
-            tester.start();
-            HttpTester.Response http = tester.assertIsResponseGzipCompressed("GET","file.txt");
-            Assert.assertEquals("Accept-Encoding",http.get("Vary"));
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    @Test
-    public void testIsNotGzipCompressedByContentType() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-
-        // Add Gzip Filter first
-        FilterHolder gzipHolder = new FilterHolder(testFilter);
-        gzipHolder.setAsyncSupported(true);
-        tester.addFilter(gzipHolder,"/*",EnumSet.of(DispatcherType.REQUEST,DispatcherType.ASYNC));
-        gzipHolder.setInitParameter("mimeTypes","text/plain");
-
-        // Prepare server file
-        int filesize = tester.getOutputBufferSize() * 4;
-        tester.prepareServerFile("file.mp3",filesize);
-
-        // Add content servlet
-        tester.setContentServlet(DefaultServlet.class);
-
-        try
-        {
-            tester.start();
-            HttpTester.Response http = assertIsResponseNotGzipCompressed(tester,"GET","file.mp3",filesize,HttpStatus.OK_200);
-            Assert.assertNull(http.get("Vary"));
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    @Test
-    public void testIsNotGzipCompressedByExcludedContentType() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-
-        // Add Gzip Filter first
-        FilterHolder gzipHolder = new FilterHolder(testFilter);
-        gzipHolder.setAsyncSupported(true);
-        tester.addFilter(gzipHolder,"/*",EnumSet.of(DispatcherType.REQUEST,DispatcherType.ASYNC));
-        gzipHolder.setInitParameter("excludedMimeTypes","text/plain");
-
-        // Prepare server file
-        int filesize = tester.getOutputBufferSize() * 4;
-        tester.prepareServerFile("test_quotes.txt",filesize);
-
-        // Add content servlet
-        tester.setContentServlet(DefaultServlet.class);
-
-        try
-        {
-            tester.start();
-            HttpTester.Response http = assertIsResponseNotGzipCompressed(tester,"GET","test_quotes.txt",filesize,HttpStatus.OK_200);
-            Assert.assertNull(http.get("Vary"));
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    @Test
-    public void testIsNotGzipCompressedByExcludedContentTypeWithCharset() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-
-        // Add Gzip Filter first
-        FilterHolder gzipHolder = new FilterHolder(testFilter);
-        gzipHolder.setAsyncSupported(true);
-        tester.addFilter(gzipHolder,"/*",EnumSet.of(DispatcherType.REQUEST,DispatcherType.ASYNC));
-        gzipHolder.setInitParameter("excludedMimeTypes","text/plain");
-
-        // Prepare server file
-        int filesize = tester.getOutputBufferSize() * 4;
-        tester.prepareServerFile("test_quotes.txt",filesize);
-        tester.addMimeType("txt","text/plain;charset=UTF-8");
-
-        // Add content servlet
-        tester.setContentServlet(DefaultServlet.class);
-
-        try
-        {
-            tester.start();
-            HttpTester.Response http = assertIsResponseNotGzipCompressed(tester,"GET","test_quotes.txt",filesize,HttpStatus.OK_200);
-            Assert.assertNull(http.get("Vary"));
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    @Test
-    public void testGzipCompressedByContentTypeWithEncoding() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-        tester.setGzipFilterClass(testFilter);
-        FilterHolder holder = tester.setContentServlet(HttpContentTypeWithEncoding.class);
-        holder.setInitParameter("mimeTypes","text/plain");
-        try
-        {
-            tester.start();
-            HttpTester.Response http = tester.assertNonStaticContentIsResponseGzipCompressed("GET","xxx",HttpContentTypeWithEncoding.COMPRESSED_CONTENT);
-            Assert.assertEquals("Accept-Encoding",http.get("Vary"));
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    @Test
-    public void testIsNotGzipCompressedByDeferredContentType() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-
-        // Add Gzip Filter first
-        FilterHolder gzipHolder = new FilterHolder(testFilter);
-        gzipHolder.setAsyncSupported(true);
-        tester.addFilter(gzipHolder,"/*",EnumSet.of(DispatcherType.REQUEST,DispatcherType.ASYNC));
-        gzipHolder.setInitParameter("mimeTypes","text/plain");
-
-        // Prepare server file
-        int filesize = tester.getOutputBufferSize() * 4;
-        tester.prepareServerFile("file.mp3.deferred",filesize);
-
-        // Add content servlet
-        tester.setContentServlet(GetServlet.class);
-
-        try
-        {
-            tester.start();
-            HttpTester.Response response = assertIsResponseNotGzipCompressed(tester,"GET","file.mp3.deferred",filesize,HttpStatus.OK_200);
-            assertThat("Response[Vary]", response.get("Vary"), isEmptyOrNullString());
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    @Test
-    public void testIsNotGzipCompressedHttpStatus() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-
-        // Add Gzip Filter first
-        FilterHolder gzipHolder = new FilterHolder(testFilter);
-        gzipHolder.setAsyncSupported(true);
-        tester.addFilter(gzipHolder,"/*",EnumSet.of(DispatcherType.REQUEST,DispatcherType.ASYNC));
-        gzipHolder.setInitParameter("mimeTypes","text/plain");
-
-        // Test error code 204
-        tester.setContentServlet(HttpStatusServlet.class);
-
-        try
-        {
-            tester.start();
-
-            HttpTester.Response response = tester.executeRequest("GET","/context/",5,TimeUnit.SECONDS);
-
-            assertThat("Response status",response.getStatus(),is(HttpStatus.NO_CONTENT_204));
-            assertThat("Content-Encoding",response.get("Content-Encoding"),not(containsString(compressionType)));
-        }
-        finally
-        {
-            tester.stop();
-        }
-
-    }
-
-    @Test
-    public void testIsNotGzipCompressedHttpBadRequestStatus() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-
-        // Add Gzip Filter first
-        FilterHolder gzipHolder = new FilterHolder(testFilter);
-        gzipHolder.setAsyncSupported(true);
-        gzipHolder.setInitParameter("mimeTypes","text/plain");
-        tester.addFilter(gzipHolder,"/*",EnumSet.of(DispatcherType.REQUEST,DispatcherType.ASYNC));
-
-        // Test error code 400
-        tester.setContentServlet(HttpErrorServlet.class);
-
-        try
-        {
-            tester.start();
-
-            HttpTester.Response response = tester.executeRequest("GET","/context/",5,TimeUnit.SECONDS);
-
-            assertThat("Response status",response.getStatus(),is(HttpStatus.BAD_REQUEST_400));
-            assertThat("Content-Encoding",response.get("Content-Encoding"),not(containsString(compressionType)));
-
-            String content = tester.readResponse(response);
-            assertThat("Response content",content,is("error message"));
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    @Test
-    public void testUserAgentExclusion() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-        tester.setUserAgent("foo");
-
-        // Add Gzip Filter first
-        FilterHolder gzipHolder = new FilterHolder(testFilter);
-        gzipHolder.setAsyncSupported(true);
-        gzipHolder.setInitParameter("mimeTypes","text/plain");
-        gzipHolder.setInitParameter("excludedAgents","bar, foo");
-        tester.addFilter(gzipHolder,"/*",EnumSet.of(DispatcherType.REQUEST,DispatcherType.ASYNC));
-
-        // Prepare server file
-        int filesize = tester.getOutputBufferSize() * 4;
-        tester.prepareServerFile("file.txt",filesize);
-
-        // Add content servlet
-        tester.setContentServlet(DefaultServlet.class);
-
-        try
-        {
-            tester.start();
-            assertIsResponseNotGzipCompressed(tester,"GET","file.txt",filesize,HttpStatus.OK_200);
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    @Test
-    public void testUserAgentExclusionByExcludedAgentPatterns() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-        tester.setUserAgent("foo");
-
-        // Add Gzip Filter first
-        FilterHolder gzipHolder = new FilterHolder(testFilter);
-        gzipHolder.setAsyncSupported(true);
-        gzipHolder.setInitParameter("excludedAgents","bar");
-        gzipHolder.setInitParameter("excludeAgentPatterns","fo.*");
-        tester.addFilter(gzipHolder,"/*",EnumSet.of(DispatcherType.REQUEST,DispatcherType.ASYNC));
-
-        // Prepare server file
-        int filesize = tester.getOutputBufferSize() * 4;
-        tester.prepareServerFile("file.txt",filesize);
-
-        // Set content servlet
-        tester.setContentServlet(DefaultServlet.class);
-
-        try
-        {
-            tester.start();
-            assertIsResponseNotGzipCompressed(tester,"GET","file.txt",filesize,HttpStatus.OK_200);
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    @Test
-    public void testExcludePaths() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-
-        // Add Gzip Filter first
-        FilterHolder gzipHolder = new FilterHolder(testFilter);
-        gzipHolder.setAsyncSupported(true);
-        gzipHolder.setInitParameter("excludePaths","/bar/, /context/");
-        tester.addFilter(gzipHolder,"/*",EnumSet.of(DispatcherType.REQUEST,DispatcherType.ASYNC));
-
-        // Prepare server file
-        int filesize = tester.getOutputBufferSize() * 4;
-        tester.prepareServerFile("file.txt",filesize);
-
-        // Set content servlet
-        tester.setContentServlet(DefaultServlet.class);
-
-        try
-        {
-            tester.start();
-            assertIsResponseNotGzipCompressed(tester,"GET","file.txt",filesize,HttpStatus.OK_200);
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    @Test
-    public void testExcludePathPatterns() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-
-        // Add Gzip Filter first
-        FilterHolder gzipHolder = new FilterHolder(testFilter);
-        gzipHolder.setAsyncSupported(true);
-        gzipHolder.setInitParameter("excludePathPatterns","/cont.*");
-        tester.addFilter(gzipHolder,"/*",EnumSet.of(DispatcherType.REQUEST,DispatcherType.ASYNC));
-
-        // Prepare server file
-        int filesize = tester.getOutputBufferSize() * 4;
-        tester.prepareServerFile("file.txt",filesize);
-
-        // Set content servlet
-        tester.setContentServlet(DefaultServlet.class);
-
-        try
-        {
-            tester.start();
-            assertIsResponseNotGzipCompressed(tester,"GET","file.txt",filesize,HttpStatus.OK_200);
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-
-    public HttpTester.Response assertIsResponseNotGzipCompressed(GzipTester tester, String method, String filename, int expectedFilesize, int status)
-            throws Exception
-    {
-        HttpTester.Response response = tester.executeRequest(method,"/context/" + filename,5,TimeUnit.SECONDS);
-
-        assertThat("Response status",response.getStatus(),is(status));
-        assertThat("Content-Encoding",response.get("Content-Encoding"),not(containsString(compressionType)));
-
-        assertResponseContent(tester,response,status,filename,expectedFilesize);
-
-        return response;
-    }
-
-    private void assertResponseContent(GzipTester tester, HttpTester.Response response, int status, String filename, int expectedFilesize) throws IOException,
-            UnsupportedEncodingException
-    {
-        if (expectedFilesize >= 0)
-        {
-            assertThat("filename",filename,notNullValue());
-            assertThat("Response contentBytes.length",response.getContentBytes().length,is(expectedFilesize));
-            String contentLength = response.get("Content-Length");
-            if (StringUtil.isNotBlank(contentLength))
-            {
-                assertThat("Content-Length",response.get("Content-Length"),is(Integer.toString(expectedFilesize)));
-            }
-
-            if (status >= 200 && status < 300)
-            {
-                assertThat("ETag",response.get("ETAG"),startsWith("W/"));
-            }
-
-            File serverFile = testingdir.getFile(filename);
-            String expectedResponse = IO.readToString(serverFile);
-
-            String actual = tester.readResponse(response);
-            Assert.assertEquals("Expected response equals actual response",expectedResponse,actual);
-        }
-    }
-
-    @Test
-    public void testIsNotGzipCompressedSVGZ() throws Exception
-    {
-        GzipTester tester = new GzipTester(testingdir,compressionType);
-        tester.setGzipFilterClass(testFilter);
-
-        @SuppressWarnings("unused")
-        FilterHolder holder = tester.setContentServlet(DefaultServlet.class);
-        tester.copyTestServerFile("test.svgz");
-        try
-        {
-            tester.start();
-            tester.assertIsResponseNotGzipFiltered("test.svgz","test.svgz.sha1","image/svg+xml","gzip");
-        }
-        finally
-        {
-            tester.stop();
-        }
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterLayeredTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterLayeredTest.java
index 85c4236..4eeadef 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterLayeredTest.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipFilterLayeredTest.java
@@ -18,8 +18,10 @@
 
 package org.eclipse.jetty.servlets;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.junit.Assert.assertThat;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -32,15 +34,16 @@
 import org.eclipse.jetty.http.HttpStatus;
 import org.eclipse.jetty.http.HttpTester;
 import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.handler.gzip.AsyncManipFilter;
+import org.eclipse.jetty.server.handler.gzip.AsyncScheduledDispatchWrite;
+import org.eclipse.jetty.server.handler.gzip.AsyncTimeoutCompleteWrite;
+import org.eclipse.jetty.server.handler.gzip.AsyncTimeoutDispatchWrite;
+import org.eclipse.jetty.server.handler.gzip.GzipHandler;
+import org.eclipse.jetty.server.handler.gzip.GzipTester;
+import org.eclipse.jetty.server.handler.gzip.GzipTester.ContentMetadata;
+import org.eclipse.jetty.server.handler.gzip.TestDirContentServlet;
+import org.eclipse.jetty.server.handler.gzip.TestServletLengthStreamTypeWrite;
 import org.eclipse.jetty.servlet.FilterHolder;
-import org.eclipse.jetty.servlets.gzip.AsyncManipFilter;
-import org.eclipse.jetty.servlets.gzip.AsyncScheduledDispatchWrite;
-import org.eclipse.jetty.servlets.gzip.AsyncTimeoutCompleteWrite;
-import org.eclipse.jetty.servlets.gzip.AsyncTimeoutDispatchWrite;
-import org.eclipse.jetty.servlets.gzip.GzipTester;
-import org.eclipse.jetty.servlets.gzip.GzipTester.ContentMetadata;
-import org.eclipse.jetty.servlets.gzip.TestDirContentServlet;
-import org.eclipse.jetty.servlets.gzip.TestServletLengthStreamTypeWrite;
 import org.eclipse.jetty.toolchain.test.TestTracker;
 import org.eclipse.jetty.toolchain.test.TestingDir;
 import org.junit.Ignore;
@@ -64,7 +67,7 @@
     private static final HttpConfiguration defaultHttp = new HttpConfiguration();
     private static final int LARGE = defaultHttp.getOutputBufferSize() * 8;
     private static final int SMALL = defaultHttp.getOutputBufferSize() / 4;
-    private static final int TINY = AsyncGzipFilter.DEFAULT_MIN_GZIP_SIZE / 2;
+    private static final int TINY = GzipHandler.DEFAULT_MIN_GZIP_SIZE / 2;
     private static final boolean EXPECT_COMPRESSED = true;
 
     @Parameters(name = "{0} bytes - {1} - compressed({2}) - filter({3}) - servlet({4}")
@@ -115,7 +118,7 @@
     @Test
     public void testGzipDos() throws Exception
     {
-        GzipTester tester = new GzipTester(testingdir, GzipFilter.GZIP);
+        GzipTester tester = new GzipTester(testingdir, GzipHandler.GZIP);
         
         // Add Gzip Filter first
         FilterHolder gzipHolder = new FilterHolder(gzipFilterClass);
@@ -146,7 +149,7 @@
             if (expectCompressed)
             {
                 // Must be gzip compressed
-                assertThat("Content-Encoding",response.get("Content-Encoding"),containsString(GzipFilter.GZIP));
+                assertThat("Content-Encoding",response.get("Content-Encoding"),containsString(GzipHandler.GZIP));
             }
             
             // Uncompressed content Size
@@ -162,7 +165,7 @@
     @Test
     public void testDosGzip() throws Exception
     {
-        GzipTester tester = new GzipTester(testingdir, GzipFilter.GZIP);
+        GzipTester tester = new GzipTester(testingdir, GzipHandler.GZIP);
         
         // Add (DoSFilter-like) manip filter
         FilterHolder manipHolder = new FilterHolder(AsyncManipFilter.class);
@@ -193,10 +196,10 @@
             if (expectCompressed)
             {
                 // Must be gzip compressed
-                assertThat("Content-Encoding",response.get("Content-Encoding"),containsString(GzipFilter.GZIP));
+                assertThat("Content-Encoding",response.get("Content-Encoding"),containsString(GzipHandler.GZIP));
             } else
             {
-                assertThat("Content-Encoding",response.get("Content-Encoding"),not(containsString(GzipFilter.GZIP)));
+                assertThat("Content-Encoding",response.get("Content-Encoding"),not(containsString(GzipHandler.GZIP)));
             }
             
             // Uncompressed content Size
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/IncludableGzipFilterMinSizeTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/IncludableGzipFilterMinSizeTest.java
deleted file mode 100644
index 4f6bd83..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/IncludableGzipFilterMinSizeTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets;
-
-import java.util.Arrays;
-import java.util.Collection;
-
-import javax.servlet.Servlet;
-
-import org.eclipse.jetty.servlet.FilterHolder;
-import org.eclipse.jetty.servlets.gzip.GzipTester;
-import org.eclipse.jetty.servlets.gzip.TestMinGzipSizeServlet;
-import org.eclipse.jetty.toolchain.test.TestingDir;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * Perform specific tests on the IncludableGzipFilter's ability to manage
- * minGzipSize initialization parameter.
- *
- * @see <a href="Eclipse Bug 366106">http://bugs.eclipse.org/366106</a>
- */
-@RunWith(Parameterized.class)
-public class IncludableGzipFilterMinSizeTest
-{
-    @Parameters
-    public static Collection<String[]> data()
-    {
-        String[][] data = new String[][]
-                {
-                { GzipFilter.GZIP },
-                { GzipFilter.DEFLATE }
-                };
-
-        return Arrays.asList(data);
-    }
-
-    public IncludableGzipFilterMinSizeTest(String compressionType)
-    {
-        this.compressionType = compressionType;
-    }
-
-    @Rule
-    public TestingDir testdir = new TestingDir();
-
-    private String compressionType;
-    private Class<? extends Servlet> testServlet = TestMinGzipSizeServlet.class;
-
-    @Test
-    public void testUnderMinSize() throws Exception
-    {
-        GzipTester tester = new GzipTester(testdir, compressionType);
-        // Use IncludableGzipFilter
-        tester.setGzipFilterClass(IncludableGzipFilter.class);
-
-        FilterHolder holder = tester.setContentServlet(testServlet);
-        // A valid mime type that we will never use in this test.
-        // configured here to prevent mimeType==null logic
-        holder.setInitParameter("mimeTypes","application/soap+xml");
-        holder.setInitParameter("minGzipSize", "2048");
-        holder.setInitParameter("uncheckedPrintWriter","true");
-
-        tester.copyTestServerFile("small_script.js");
-
-        try {
-            tester.start();
-            tester.assertIsResponseNotGzipFiltered("small_script.js",
-                    "small_script.js.sha1",
-                    "text/javascript; charset=utf-8");
-        } finally {
-            tester.stop();
-        }
-    }
-
-    @Test
-    public void testOverMinSize() throws Exception
-    {
-        GzipTester tester = new GzipTester(testdir, compressionType);
-        // Use IncludableGzipFilter
-        tester.setGzipFilterClass(IncludableGzipFilter.class);
-
-        FilterHolder holder = tester.setContentServlet(testServlet);
-        holder.setInitParameter("mimeTypes","application/soap+xml,text/javascript,application/javascript");
-        holder.setInitParameter("minGzipSize", "2048");
-        holder.setInitParameter("uncheckedPrintWriter","true");
-
-        tester.copyTestServerFile("big_script.js");
-
-        try {
-            tester.start();
-            tester.assertIsResponseGzipCompressed("GET","big_script.js");
-        } finally {
-            tester.stop();
-        }
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/IncludableGzipFilterTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/IncludableGzipFilterTest.java
deleted file mode 100644
index 17b941d..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/IncludableGzipFilterTest.java
+++ /dev/null
@@ -1,152 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.BufferedOutputStream;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.zip.GZIPInputStream;
-import java.util.zip.Inflater;
-import java.util.zip.InflaterInputStream;
-
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.http.HttpTester;
-import org.eclipse.jetty.servlet.FilterHolder;
-import org.eclipse.jetty.servlet.ServletTester;
-import org.eclipse.jetty.toolchain.test.TestingDir;
-import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.IO;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class IncludableGzipFilterTest
-{
-    @Parameters
-    public static Collection<String[]> data()
-    {
-        String[][] data = new String[][]
-                {
-                { GzipFilter.GZIP },
-                { GzipFilter.DEFLATE }
-                };
-
-        return Arrays.asList(data);
-    }
-
-    @Rule
-    public TestingDir testdir = new TestingDir();
-
-    private static String __content =
-        "Lorem ipsum dolor sit amet, consectetur adipiscing elit. In quis felis nunc. "+
-        "Quisque suscipit mauris et ante auctor ornare rhoncus lacus aliquet. Pellentesque "+
-        "habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. "+
-        "Vestibulum sit amet felis augue, vel convallis dolor. Cras accumsan vehicula diam "+
-        "at faucibus. Etiam in urna turpis, sed congue mi. Morbi et lorem eros. Donec vulputate "+
-        "velit in risus suscipit lobortis. Aliquam id urna orci, nec sollicitudin ipsum. "+
-        "Cras a orci turpis. Donec suscipit vulputate cursus. Mauris nunc tellus, fermentum "+
-        "eu auctor ut, mollis at diam. Quisque porttitor ultrices metus, vitae tincidunt massa "+
-        "sollicitudin a. Vivamus porttitor libero eget purus hendrerit cursus. Integer aliquam "+
-        "consequat mauris quis luctus. Cras enim nibh, dignissim eu faucibus ac, mollis nec neque. "+
-        "Aliquam purus mauris, consectetur nec convallis lacinia, porta sed ante. Suspendisse "+
-        "et cursus magna. Donec orci enim, molestie a lobortis eu, imperdiet vitae neque.";
-
-    private ServletTester tester;
-    private String compressionType;
-
-    public IncludableGzipFilterTest(String compressionType)
-    {
-        this.compressionType = compressionType;
-    }
-
-    @Before
-    public void setUp() throws Exception
-    {
-        testdir.ensureEmpty();
-
-        File testFile = testdir.getFile("file.txt");
-        try (OutputStream testOut = new BufferedOutputStream(new FileOutputStream(testFile)))
-        {
-            ByteArrayInputStream testIn = new ByteArrayInputStream(__content.getBytes("ISO8859_1"));
-            IO.copy(testIn,testOut);
-        }
-
-        tester=new ServletTester("/context");
-        tester.getContext().setResourceBase(testdir.getDir().getCanonicalPath());
-        tester.getContext().addServlet(org.eclipse.jetty.servlet.DefaultServlet.class, "/");
-        FilterHolder holder = tester.getContext().addFilter(IncludableGzipFilter.class,"/*",null);
-        holder.setInitParameter("mimeTypes","text/plain");
-        tester.start();
-    }
-
-    @After
-    public void tearDown() throws Exception
-    {
-        tester.stop();
-        IO.delete(testdir.getDir());
-    }
-
-    @Test
-    public void testGzipFilter() throws Exception
-    {
-        // generated and parsed test
-
-        ByteBuffer request=BufferUtil.toBuffer(
-            "GET /context/file.txt HTTP/1.0\r\n"+
-            "Host: tester\r\n"+
-            "Accept-Encoding: "+compressionType+"\r\n"+
-            "\r\n");
-
-
-        HttpTester.Response response=HttpTester.parseResponse(tester.getResponses(request));
-
-        assertEquals(HttpServletResponse.SC_OK,response.getStatus());
-        assertEquals(compressionType,response.get("Content-Encoding"));
-
-        InputStream testIn = null;
-        ByteArrayInputStream compressedResponseStream = new ByteArrayInputStream(response.getContentBytes());
-        if (compressionType.equals(GzipFilter.GZIP))
-        {
-            testIn = new GZIPInputStream(compressedResponseStream);
-        }
-        else if (compressionType.equals(GzipFilter.DEFLATE))
-        {
-            testIn = new InflaterInputStream(compressedResponseStream, new Inflater(true));
-        }
-        ByteArrayOutputStream testOut = new ByteArrayOutputStream();
-        IO.copy(testIn,testOut);
-
-        assertEquals(__content, testOut.toString("ISO8859_1"));
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/MultipartFilterTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/MultipartFilterTest.java
index 91426fc..906bad0 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/MultipartFilterTest.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/MultipartFilterTest.java
@@ -780,10 +780,6 @@
         assertEquals(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, response.getStatus());
     }
 
-    /*
-     * see the testParameterMap test
-     *
-     */
     public static class TestServletParameterMap extends DumpServlet
     {
         @Override
@@ -798,7 +794,7 @@
     /**
      * Validate that the getParameterMap() call is correctly unencoding the parameters in the
      * map that it returns.
-     * @throws Exception
+     * @throws Exception on test failure
      */
     @Test
     public void testParameterMap() throws Exception
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/PutFilterTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/PutFilterTest.java
index dbce361..d656eaf 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/PutFilterTest.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/PutFilterTest.java
@@ -41,6 +41,7 @@
 import org.eclipse.jetty.servlet.ServletTester;
 import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.StringUtil;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -266,8 +267,8 @@
         assertEquals(HttpServletResponse.SC_OK,response.getStatus());
 
         Set<String> options = new HashSet<String>();
-        options.addAll(Arrays.asList(response.get("Allow").split(" *, *")));
-
+        String allow=response.get("Allow");
+        options.addAll(StringUtil.csvSplit(null,allow,0,allow.length()));
         assertTrue(options.contains("GET"));
         assertTrue(options.contains("POST"));
         assertTrue(options.contains("PUT"));
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/QoSFilterTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/QoSFilterTest.java
index 34cd517..df40efb 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/QoSFilterTest.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/QoSFilterTest.java
@@ -23,6 +23,7 @@
 import java.util.EnumSet;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+
 import javax.servlet.DispatcherType;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/ThreadStarvationTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/ThreadStarvationTest.java
new file mode 100644
index 0000000..9243ca7
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/ThreadStarvationTest.java
@@ -0,0 +1,419 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.servlets;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.nio.ByteBuffer;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.SocketChannel;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.BrokenBarrierException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.Exchanger;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.io.ManagedSelector;
+import org.eclipse.jetty.io.SelectChannelEndPoint;
+import org.eclipse.jetty.server.HttpChannel;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.eclipse.jetty.servlet.DefaultServlet;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+import org.eclipse.jetty.toolchain.test.TestTracker;
+import org.eclipse.jetty.toolchain.test.annotation.Slow;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.StdErrLog;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class ThreadStarvationTest
+{
+    @Rule
+    public TestTracker tracker = new TestTracker();
+    private Server _server;
+
+    @After
+    public void dispose() throws Exception
+    {
+        if (_server != null)
+            _server.stop();
+    }
+
+    @Test
+    @Slow
+    public void testDefaultServletSuccess() throws Exception
+    {
+        int maxThreads = 10;
+        QueuedThreadPool threadPool = new QueuedThreadPool(maxThreads, maxThreads);
+        threadPool.setDetailedDump(true);
+        _server = new Server(threadPool);
+
+        // Prepare a big file to download.
+        File directory = MavenTestingUtils.getTargetTestingDir();
+        Files.createDirectories(directory.toPath());
+        String resourceName = "resource.bin";
+        Path resourcePath = Paths.get(directory.getPath(), resourceName);
+        try (OutputStream output = Files.newOutputStream(resourcePath, StandardOpenOption.CREATE, StandardOpenOption.WRITE))
+        {
+            byte[] chunk = new byte[1024];
+            Arrays.fill(chunk,(byte)'X');
+            chunk[chunk.length-2]='\r';
+            chunk[chunk.length-1]='\n';
+            for (int i = 0; i < 256 * 1024; ++i)
+                output.write(chunk);
+        }
+
+        final CountDownLatch writePending = new CountDownLatch(1);
+        ServerConnector connector = new ServerConnector(_server, 0, 1)
+        {
+            @Override
+            protected SelectChannelEndPoint newEndPoint(SocketChannel channel, ManagedSelector selectSet, SelectionKey key) throws IOException
+            {
+                return new SelectChannelEndPoint(channel, selectSet, key, getScheduler(), getIdleTimeout())
+                {
+                    @Override
+                    protected void onIncompleteFlush()
+                    {
+                        super.onIncompleteFlush();
+                        writePending.countDown();
+                    }
+                };
+            }
+        };
+        connector.setIdleTimeout(Long.MAX_VALUE);
+        _server.addConnector(connector);
+
+        ServletContextHandler context = new ServletContextHandler(_server, "/");
+        context.setResourceBase(directory.toURI().toString());
+        context.addServlet(DefaultServlet.class, "/*").setAsyncSupported(false);
+        _server.setHandler(context);
+
+        _server.start();
+
+        List<Socket> sockets = new ArrayList<>();
+        for (int i = 0; i < maxThreads*2; ++i)
+        {
+            Socket socket = new Socket("localhost", connector.getLocalPort());
+            sockets.add(socket);
+            OutputStream output = socket.getOutputStream();
+            String request = "" +
+                    "GET /" + resourceName + " HTTP/1.1\r\n" +
+                    "Host: localhost\r\n" +
+                    "\r\n";
+            output.write(request.getBytes(StandardCharsets.UTF_8));
+            output.flush();
+            Thread.sleep(100);
+        }
+
+        // Wait for a the servlet to block.
+        Assert.assertTrue(writePending.await(5, TimeUnit.SECONDS));
+
+        long expected = Files.size(resourcePath);
+        byte[] buffer = new byte[48 * 1024];
+        List<Exchanger<Long>> totals = new ArrayList<>();
+        for (Socket socket : sockets)
+        {
+            final Exchanger<Long> x = new Exchanger<>();
+            totals.add(x);
+            final InputStream input = socket.getInputStream();
+
+            new Thread()
+            {
+                @Override
+                public void run()
+                {
+                    long total=0;
+                    try
+                    {
+                        // look for CRLFCRLF
+                        StringBuilder header = new StringBuilder();
+                        int state=0;
+                        while (state<4 && header.length()<2048)
+                        {
+                            int ch=input.read();
+                            if (ch<0)
+                                break;
+                            header.append((char)ch);
+                            switch(state)
+                            {
+                                case 0:
+                                    if (ch=='\r')
+                                        state=1;
+                                    break;
+                                case 1:
+                                    if (ch=='\n')
+                                        state=2;
+                                    else
+                                        state=0;
+                                    break;
+                                case 2:
+                                    if (ch=='\r')
+                                        state=3;
+                                    else
+                                        state=0;
+                                    break;
+                                case 3:
+                                    if (ch=='\n')
+                                        state=4;
+                                    else
+                                        state=0;
+                                    break;
+                            }
+                        }
+
+                        while (total<expected)
+                        {
+                            int read=input.read(buffer);
+                            if (read<0)
+                                break;
+                            total+=read;
+                        }
+                    }
+                    catch (IOException e)
+                    {
+                        e.printStackTrace();
+                    }
+                    finally
+                    {
+                        try
+                        {
+                            x.exchange(total);
+                        }
+                        catch (InterruptedException e)
+                        {
+                            e.printStackTrace();
+                        }
+                    }
+                }
+            }.start();
+        }
+
+        for (Exchanger<Long> x : totals)
+        {
+            Long total = x.exchange(-1L,10000,TimeUnit.SECONDS);
+            Assert.assertEquals(expected,total.longValue());
+        }
+        
+        // We could read everything, good.
+        for (Socket socket : sockets)
+            socket.close();
+    }
+    
+    @Test
+    public void testFailureStarvation() throws Exception
+    {
+        try
+        {
+            ((StdErrLog)Log.getLogger(HttpChannel.class)).setHideStacks(true);
+
+            int acceptors = 0;
+            int selectors = 1;
+            int maxThreads = 10;
+            final int barried=maxThreads-acceptors-selectors;
+            final CyclicBarrier barrier = new CyclicBarrier(barried);
+
+
+            QueuedThreadPool threadPool = new QueuedThreadPool(maxThreads, maxThreads);
+            threadPool.setDetailedDump(true);
+            _server = new Server(threadPool);
+
+
+            ServerConnector connector = new ServerConnector(_server, acceptors, selectors)
+            {
+                @Override
+                protected SelectChannelEndPoint newEndPoint(SocketChannel channel, ManagedSelector selectSet, SelectionKey key) throws IOException
+                {
+                    return new SelectChannelEndPoint(channel, selectSet, key, getScheduler(), getIdleTimeout())
+                    {
+
+                        @Override
+                        public boolean flush(ByteBuffer... buffers) throws IOException
+                        {
+                            super.flush(buffers[0]);
+                            throw new IOException("TEST FAILURE");
+                        }
+
+                    };
+                }
+            };
+            connector.setIdleTimeout(Long.MAX_VALUE);
+            _server.addConnector(connector);
+
+            final AtomicInteger count = new AtomicInteger(0);
+            _server.setHandler(new AbstractHandler()
+            {
+                @Override
+                public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+                {
+                    int c=count.getAndIncrement();
+                    try
+                    {
+                        if (c<barried)
+                        {
+                            barrier.await(10,TimeUnit.SECONDS);
+                        }
+                    }
+                    catch (InterruptedException | BrokenBarrierException | TimeoutException e)
+                    {
+                        throw new ServletException(e);
+                    }
+                    baseRequest.setHandled(true);
+                    response.setStatus(200);
+                    response.setContentLength(13);
+                    response.getWriter().print("Hello World!\n");
+                    response.getWriter().flush();
+                }
+            });
+
+            _server.start();
+
+            List<Socket> sockets = new ArrayList<>();
+            for (int i = 0; i < maxThreads*2; ++i)
+            {
+                Socket socket = new Socket("localhost", connector.getLocalPort());
+                sockets.add(socket);
+                OutputStream output = socket.getOutputStream();
+                String request = "" +
+                        "GET / HTTP/1.1\r\n" +
+                        "Host: localhost\r\n" +
+                        //                    "Connection: close\r\n" +
+                        "\r\n";
+                output.write(request.getBytes(StandardCharsets.UTF_8));
+                output.flush();
+            }
+
+
+            byte[] buffer = new byte[48 * 1024];
+            List<Exchanger<Integer>> totals = new ArrayList<>();
+            for (Socket socket : sockets)
+            {
+                final Exchanger<Integer> x = new Exchanger<>();
+                totals.add(x);
+                final InputStream input = socket.getInputStream();
+
+                new Thread()
+                {
+                    @Override
+                    public void run()
+                    {
+                        int read=0;
+                        try
+                        {
+                            // look for CRLFCRLF
+                            StringBuilder header = new StringBuilder();
+                            int state=0;
+                            while (state<4 && header.length()<2048)
+                            {
+                                int ch=input.read();
+                                if (ch<0)
+                                    break;
+                                header.append((char)ch);
+                                switch(state)
+                                {
+                                    case 0:
+                                        if (ch=='\r')
+                                            state=1;
+                                        break;
+                                    case 1:
+                                        if (ch=='\n')
+                                            state=2;
+                                        else
+                                            state=0;
+                                        break;
+                                    case 2:
+                                        if (ch=='\r')
+                                            state=3;
+                                        else
+                                            state=0;
+                                        break;
+                                    case 3:
+                                        if (ch=='\n')
+                                            state=4;
+                                        else
+                                            state=0;
+                                        break;
+                                }
+                            }
+
+                            read=input.read(buffer);
+                        }
+                        catch (IOException e)
+                        {
+                            // e.printStackTrace();
+                        }
+                        finally
+                        {
+                            try
+                            {
+                                x.exchange(read);
+                            }
+                            catch (InterruptedException e)
+                            {
+                                e.printStackTrace();
+                            }
+                        }
+                    }
+                }.start();
+            }
+
+            for (Exchanger<Integer> x : totals)
+            {
+                Integer read = x.exchange(-1,10,TimeUnit.SECONDS);
+                Assert.assertEquals(-1,read.intValue());
+            }
+
+            // We could read everything, good.
+            for (Socket socket : sockets)
+                socket.close();
+            
+            _server.stop();
+        }
+        finally
+        {
+            ((StdErrLog)Log.getLogger(HttpChannel.class)).setHideStacks(false);
+        }
+    }
+}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/AsyncManipFilter.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/AsyncManipFilter.java
deleted file mode 100644
index 4935d67..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/AsyncManipFilter.java
+++ /dev/null
@@ -1,103 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.IOException;
-
-import javax.servlet.AsyncContext;
-import javax.servlet.AsyncEvent;
-import javax.servlet.AsyncListener;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/**
- * Filter that merely manipulates the AsyncContext.
- * <p>
- * The pattern of manipulation is modeled after how DOSFilter behaves. The purpose of this filter is to test arbitrary filter chains that could see unintended
- * side-effects of async context manipulation.
- */
-public class AsyncManipFilter implements Filter, AsyncListener
-{
-    private static final Logger LOG = Log.getLogger(AsyncManipFilter.class);
-    private static final String MANIP_KEY = AsyncManipFilter.class.getName();
-
-    @Override
-    public void init(FilterConfig filterConfig) throws ServletException
-    {
-    }
-
-    @Override
-    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
-    {
-        LOG.debug("doFilter() - {}", chain);
-        AsyncContext ctx = (AsyncContext)request.getAttribute(MANIP_KEY);
-        if (ctx == null)
-        {
-            LOG.debug("Initial pass through: {}", chain);
-            ctx = request.startAsync();
-            ctx.addListener(this);
-            ctx.setTimeout(1000);
-            LOG.debug("AsyncContext: {}", ctx);
-            request.setAttribute(MANIP_KEY,ctx);
-            return;
-        }
-        else
-        {
-            LOG.debug("Second pass through: {}", chain);
-            chain.doFilter(request,response);
-        }
-    }
-
-    @Override
-    public void destroy()
-    {
-    }
-
-    @Override
-    public void onComplete(AsyncEvent event) throws IOException
-    {
-        LOG.debug("onComplete() {}",event);
-    }
-
-    @Override
-    public void onTimeout(AsyncEvent event) throws IOException
-    {
-        LOG.debug("onTimeout() {}",event.getAsyncContext());
-        event.getAsyncContext().dispatch();
-    }
-
-    @Override
-    public void onError(AsyncEvent event) throws IOException
-    {
-        LOG.debug("onError()",event.getThrowable());
-    }
-
-    @Override
-    public void onStartAsync(AsyncEvent event) throws IOException
-    {
-        LOG.debug("onTimeout() {}",event);
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/AsyncScheduledDispatchWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/AsyncScheduledDispatchWrite.java
deleted file mode 100644
index 84f1b90..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/AsyncScheduledDispatchWrite.java
+++ /dev/null
@@ -1,121 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.IOException;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-import javax.servlet.AsyncContext;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-@SuppressWarnings("serial")
-public abstract class AsyncScheduledDispatchWrite extends TestDirContentServlet
-{
-    public static class Default extends AsyncScheduledDispatchWrite
-    {
-        public Default()
-        {
-            super(true);
-        }
-    }
-    
-    public static class Passed extends AsyncScheduledDispatchWrite
-    {
-        public Passed()
-        {
-            super(false);
-        }
-    }
-
-    private static class DispatchBack implements Runnable
-    {
-        private final AsyncContext ctx;
-
-        public DispatchBack(AsyncContext ctx)
-        {
-            this.ctx = ctx;
-        }
-
-        @Override
-        public void run()
-        {
-            ctx.dispatch();
-        }
-    }
-
-    private final boolean originalReqResp;
-    private ScheduledExecutorService scheduler;
-
-    public AsyncScheduledDispatchWrite(boolean originalReqResp)
-    {
-        this.originalReqResp = originalReqResp;
-    }
-
-    public void init(ServletConfig config) throws ServletException
-    {
-        super.init(config);
-        scheduler = Executors.newScheduledThreadPool(3);
-    }
-
-    @Override
-    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
-    {
-        Boolean suspended = (Boolean)request.getAttribute("SUSPENDED");
-        if (suspended == null || !suspended)
-        {
-            request.setAttribute("SUSPENDED",Boolean.TRUE);
-            AsyncContext ctx;
-            if (originalReqResp)
-            {
-                // Use Original Request & Response
-                ctx = request.startAsync();
-            }
-            else
-            {
-                // Pass Request & Response
-                ctx = request.startAsync(request,response);
-            }
-            ctx.setTimeout(0);
-            scheduler.schedule(new DispatchBack(ctx),500,TimeUnit.MILLISECONDS);
-        }
-        else
-        {
-            String fileName = request.getServletPath();
-            byte[] dataBytes = loadContentFileBytes(fileName);
-
-            response.setContentLength(dataBytes.length);
-
-            ServletOutputStream out = response.getOutputStream();
-
-            if (fileName.endsWith("txt"))
-                response.setContentType("text/plain");
-            else if (fileName.endsWith("mp3"))
-                response.setContentType("audio/mpeg");
-            response.setHeader("ETag","W/etag-" + fileName);
-
-            out.write(dataBytes);
-        }
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/AsyncTimeoutCompleteWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/AsyncTimeoutCompleteWrite.java
deleted file mode 100644
index 98465e6..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/AsyncTimeoutCompleteWrite.java
+++ /dev/null
@@ -1,137 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-
-import javax.servlet.AsyncContext;
-import javax.servlet.AsyncEvent;
-import javax.servlet.AsyncListener;
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Respond with requested content, but via AsyncContext manipulation.
- * <p>
- * 
- * <pre>
- *   1) startAsync
- *   2) AsyncContext.setTimeout()
- *   3) onTimeout()
- *   4) send-response
- *   5) AsyncContext.complete()
- * </pre>
- */
-@SuppressWarnings("serial")
-public abstract class AsyncTimeoutCompleteWrite extends TestDirContentServlet implements AsyncListener
-{
-    public static class Default extends AsyncTimeoutCompleteWrite
-    {
-        public Default()
-        {
-            super(true);
-        }
-    }
-    
-    public static class Passed extends AsyncTimeoutCompleteWrite
-    {
-        public Passed()
-        {
-            super(false);
-        }
-    }
-
-    private final boolean originalReqResp;
-
-    public AsyncTimeoutCompleteWrite(boolean originalReqResp)
-    {
-        this.originalReqResp = originalReqResp;
-    }
-
-    @Override
-    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
-    {
-        assertThat("'filename' request attribute shouldn't be declared",request.getAttribute("filename"),nullValue());
-
-        AsyncContext ctx = (AsyncContext)request.getAttribute(this.getClass().getName());
-        assertThat("AsyncContext (shouldn't be in request attribute)", ctx, nullValue());
-        
-        if (originalReqResp)
-        {
-            // Use Original Request & Response
-            ctx = request.startAsync();
-        }
-        else
-        {
-            // Pass Request & Response
-            ctx = request.startAsync(request,response);
-        }
-        String fileName = request.getServletPath();
-        request.setAttribute("filename",fileName);
-        ctx.addListener(this);
-        ctx.setTimeout(20);
-        
-        // Setup indication of a redispatch (which this scenario shouldn't do)
-        request.setAttribute(this.getClass().getName(),ctx);
-    }
-
-    @Override
-    public void onComplete(AsyncEvent event) throws IOException
-    {
-    }
-
-    @Override
-    public void onTimeout(AsyncEvent event) throws IOException
-    {
-        HttpServletRequest request = (HttpServletRequest)event.getSuppliedRequest();
-        HttpServletResponse response = (HttpServletResponse)event.getSuppliedResponse();
-
-        String fileName = (String)request.getAttribute("filename");
-        byte[] dataBytes = loadContentFileBytes(fileName);
-
-        response.setContentLength(dataBytes.length);
-
-        ServletOutputStream out = response.getOutputStream();
-
-        if (fileName.endsWith("txt"))
-            response.setContentType("text/plain");
-        else if (fileName.endsWith("mp3"))
-            response.setContentType("audio/mpeg");
-        response.setHeader("ETag","W/etag-" + fileName);
-
-        out.write(dataBytes);
-
-        event.getAsyncContext().complete();
-    }
-
-    @Override
-    public void onError(AsyncEvent event) throws IOException
-    {
-    }
-
-    @Override
-    public void onStartAsync(AsyncEvent event) throws IOException
-    {
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/AsyncTimeoutDispatchWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/AsyncTimeoutDispatchWrite.java
deleted file mode 100644
index 80e36fc..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/AsyncTimeoutDispatchWrite.java
+++ /dev/null
@@ -1,121 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.IOException;
-
-import javax.servlet.AsyncContext;
-import javax.servlet.AsyncEvent;
-import javax.servlet.AsyncListener;
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-@SuppressWarnings("serial")
-public class AsyncTimeoutDispatchWrite extends TestDirContentServlet implements AsyncListener
-{
-    public static class Default extends AsyncTimeoutDispatchWrite
-    {
-        public Default()
-        {
-            super(true);
-        }
-    }
-    
-    public static class Passed extends AsyncTimeoutDispatchWrite
-    {
-        public Passed()
-        {
-            super(false);
-        }
-    }
-
-    private final boolean originalReqResp;
-
-    public AsyncTimeoutDispatchWrite(boolean originalReqResp)
-    {
-        this.originalReqResp = originalReqResp;
-    }
-
-    @Override
-    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
-    {
-        AsyncContext ctx = (AsyncContext)request.getAttribute(AsyncContext.class.getName());
-        if (ctx == null)
-        {
-            // First pass through
-            if (originalReqResp)
-            {
-                // Use Original Request & Response
-                ctx = request.startAsync();
-            }
-            else
-            {
-                // Pass Request & Response
-                ctx = request.startAsync(request,response);
-            }
-            ctx.addListener(this);
-            ctx.setTimeout(200);
-            request.setAttribute(AsyncContext.class.getName(),ctx);
-        }
-        else
-        {
-            // second pass through, as result of timeout -> dispatch
-            String fileName = request.getServletPath();
-            byte[] dataBytes = loadContentFileBytes(fileName);
-
-            response.setContentLength(dataBytes.length);
-
-            ServletOutputStream out = response.getOutputStream();
-
-            if (fileName.endsWith("txt"))
-                response.setContentType("text/plain");
-            else if (fileName.endsWith("mp3"))
-                response.setContentType("audio/mpeg");
-            response.setHeader("ETag","W/etag-" + fileName);
-
-            out.write(dataBytes);
-            // no need to call AsyncContext.complete() from here
-            // in fact, it will cause an IllegalStateException if we do
-            // ctx.complete();
-        }
-    }
-
-    @Override
-    public void onComplete(AsyncEvent event) throws IOException
-    {
-    }
-
-    @Override
-    public void onTimeout(AsyncEvent event) throws IOException
-    {
-        event.getAsyncContext().dispatch();
-    }
-
-    @Override
-    public void onError(AsyncEvent event) throws IOException
-    {
-    }
-
-    @Override
-    public void onStartAsync(AsyncEvent event) throws IOException
-    {
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/GzipTester.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/GzipTester.java
deleted file mode 100644
index 6121221..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/GzipTester.java
+++ /dev/null
@@ -1,662 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.security.DigestOutputStream;
-import java.security.MessageDigest;
-import java.util.EnumSet;
-import java.util.Enumeration;
-import java.util.concurrent.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.zip.GZIPInputStream;
-import java.util.zip.Inflater;
-import java.util.zip.InflaterInputStream;
-
-import javax.servlet.DispatcherType;
-import javax.servlet.Filter;
-import javax.servlet.Servlet;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.http.DateGenerator;
-import org.eclipse.jetty.http.HttpHeader;
-import org.eclipse.jetty.http.HttpTester;
-import org.eclipse.jetty.http.HttpTester.Response;
-import org.eclipse.jetty.server.HttpConnectionFactory;
-import org.eclipse.jetty.servlet.FilterHolder;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.servlet.ServletTester;
-import org.eclipse.jetty.servlets.GzipFilter;
-import org.eclipse.jetty.toolchain.test.IO;
-import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
-import org.eclipse.jetty.toolchain.test.TestingDir;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-import org.hamcrest.Matchers;
-import org.junit.Assert;
-
-public class GzipTester
-{
-    private static final Logger LOG = Log.getLogger(GzipTester.class);
-
-    public static class ContentMetadata
-    {
-        public final long size;
-        public final String sha1;
-
-        public ContentMetadata(long size, String sha1checksum)
-        {
-            this.size = size;
-            this.sha1 = sha1checksum;
-        }
-    }
-
-    private Class<? extends Filter> gzipFilterClass = null;
-    private String encoding = "ISO8859_1";
-    private String userAgent = null;
-    private final ServletTester tester = new ServletTester();;
-    private TestingDir testdir;
-    private String accept;
-    private String compressionType;
-
-    public GzipTester(TestingDir testingdir, String compressionType, String accept)
-    {
-        this.testdir = testingdir;
-        this.compressionType = compressionType;
-        this.accept = accept;
-    }
-
-    public GzipTester(TestingDir testingdir, String compressionType)
-    {
-        this.testdir = testingdir;
-        this.compressionType = compressionType;
-        this.accept = compressionType;
-    }
-
-    public int getOutputBufferSize()
-    {
-        return tester.getConnector().getConnectionFactory(HttpConnectionFactory.class).getHttpConfiguration().getOutputBufferSize();
-    }
-    
-    public ContentMetadata getResponseMetadata(Response response) throws Exception
-    {
-        long size = response.getContentBytes().length;
-
-        String contentEncoding = response.get("Content-Encoding");
-
-        ByteArrayInputStream bais = null;
-        InputStream in = null;
-        DigestOutputStream digester = null;
-        ByteArrayOutputStream uncompressedStream = null;
-        try
-        {
-            MessageDigest digest = MessageDigest.getInstance("SHA1");
-            bais = new ByteArrayInputStream(response.getContentBytes());
-
-            if (contentEncoding == null)
-            {
-                LOG.debug("No response content-encoding");
-                in = new PassThruInputStream(bais);
-            }
-            else if (contentEncoding.contains(GzipFilter.GZIP))
-            {
-                in = new GZIPInputStream(bais);
-            }
-            else if (contentEncoding.contains(GzipFilter.DEFLATE))
-            {
-                in = new InflaterInputStream(bais,new Inflater(true));
-            }
-            else
-            {
-                assertThat("Unexpected response content-encoding", contentEncoding, isEmptyOrNullString());
-            }
-            
-            uncompressedStream = new ByteArrayOutputStream((int)size); 
-
-            digester = new DigestOutputStream(uncompressedStream,digest);
-            IO.copy(in,digester);
-            
-            byte output[] = uncompressedStream.toByteArray();
-            String actualSha1Sum = Hex.asHex(digest.digest());
-            return new ContentMetadata(output.length,actualSha1Sum);
-        }
-        finally
-        {
-            IO.close(digester);
-            IO.close(in);
-            IO.close(bais);
-            IO.close(uncompressedStream);
-        }
-    }
-
-    public HttpTester.Response assertIsResponseGzipCompressed(String method, String filename) throws Exception
-    {
-        return assertIsResponseGzipCompressed(method,filename,filename,-1);
-    }
-
-    public HttpTester.Response assertIsResponseGzipCompressed(String method, String filename, long ifmodifiedsince) throws Exception
-    {
-        return assertIsResponseGzipCompressed(method,filename,filename,ifmodifiedsince);
-    }
-
-    public HttpTester.Response assertIsResponseGzipCompressed(String method, String requestedFilename, String serverFilename) throws Exception
-    {
-        return assertIsResponseGzipCompressed(method,requestedFilename,serverFilename,-1);
-    }
-
-    public HttpTester.Response assertNonStaticContentIsResponseGzipCompressed(String method, String path, String expected) throws Exception
-    {
-        HttpTester.Request request = HttpTester.newRequest();
-        HttpTester.Response response;
-
-        request.setMethod(method);
-        request.setVersion("HTTP/1.0");
-        request.setHeader("Host","tester");
-        request.setHeader("Accept-Encoding",accept);
-
-        if (this.userAgent != null)
-            request.setHeader("User-Agent",this.userAgent);
-        request.setURI("/context/" + path);
-
-        // Issue the request
-        response = HttpTester.parseResponse(tester.getResponses(request.generate()));
-
-        int qindex = compressionType.indexOf(";");
-        if (qindex < 0)
-            Assert.assertThat("Response.header[Content-Encoding]",response.get("Content-Encoding"),containsString(compressionType));
-        else
-            Assert.assertThat("Response.header[Content-Encoding]",response.get("Content-Encoding"),containsString(compressionType.substring(0,qindex)));
-
-        ByteArrayInputStream bais = null;
-        InputStream in = null;
-        ByteArrayOutputStream out = null;
-        String actual = null;
-
-        try
-        {
-            bais = new ByteArrayInputStream(response.getContentBytes());
-            if (compressionType.startsWith(GzipFilter.GZIP))
-            {
-                in = new GZIPInputStream(bais);
-            }
-            else if (compressionType.startsWith(GzipFilter.DEFLATE))
-            {
-                in = new InflaterInputStream(bais,new Inflater(true));
-            }
-            out = new ByteArrayOutputStream();
-            IO.copy(in,out);
-
-            actual = out.toString(encoding);
-            assertThat("Uncompressed contents",actual,equalTo(expected));
-        }
-        finally
-        {
-            IO.close(out);
-            IO.close(in);
-            IO.close(bais);
-        }
-
-        return response;
-    }
-
-    public HttpTester.Response assertIsResponseGzipCompressed(String method, String requestedFilename, String serverFilename, long ifmodifiedsince)
-            throws Exception
-    {
-        HttpTester.Request request = HttpTester.newRequest();
-        HttpTester.Response response;
-
-        request.setMethod(method);
-        request.setVersion("HTTP/1.0");
-        request.setHeader("Host","tester");
-        request.setHeader("Accept-Encoding",compressionType);
-        if (ifmodifiedsince > 0)
-            request.setHeader(HttpHeader.IF_MODIFIED_SINCE.asString(),DateGenerator.formatDate(ifmodifiedsince));
-        if (this.userAgent != null)
-            request.setHeader("User-Agent",this.userAgent);
-        request.setURI("/context/" + requestedFilename);
-
-        // Issue the request
-        response = HttpTester.parseResponse(tester.getResponses(request.generate()));
-
-        // Assert the response headers
-        // Assert.assertThat("Response.status",response.getStatus(),is(HttpServletResponse.SC_OK));
-
-        // Response headers should have either a Transfer-Encoding indicating chunked OR a Content-Length
-        /*
-         * TODO need to check for the 3rd option of EOF content. To do this properly you might need to look at both HTTP/1.1 and HTTP/1.0 requests String
-         * contentLength = response.get("Content-Length"); String transferEncoding = response.get("Transfer-Encoding");
-         * 
-         * boolean chunked = (transferEncoding != null) && (transferEncoding.indexOf("chunk") >= 0); if(!chunked) {
-         * Assert.assertThat("Response.header[Content-Length]",contentLength,notNullValue()); } else {
-         * Assert.assertThat("Response.header[Transfer-Encoding]",transferEncoding,notNullValue()); }
-         */
-
-        int qindex = compressionType.indexOf(";");
-        if (qindex < 0)
-            Assert.assertThat("Response.header[Content-Encoding]",response.get("Content-Encoding"),containsString(compressionType));
-        else
-            Assert.assertThat("Response.header[Content-Encoding]",response.get("Content-Encoding"),containsString(compressionType.substring(0,qindex)));
-
-        Assert.assertThat(response.get("ETag"),Matchers.startsWith("W/"));
-
-        // Assert that the decompressed contents are what we expect.
-        File serverFile = testdir.getFile(serverFilename);
-        String expected = IO.readToString(serverFile);
-        String actual = null;
-
-        ByteArrayInputStream bais = null;
-        InputStream in = null;
-        ByteArrayOutputStream out = null;
-        try
-        {
-            bais = new ByteArrayInputStream(response.getContentBytes());
-            if (compressionType.startsWith(GzipFilter.GZIP))
-            {
-                in = new GZIPInputStream(bais);
-            }
-            else if (compressionType.startsWith(GzipFilter.DEFLATE))
-            {
-                in = new InflaterInputStream(bais,new Inflater(true));
-            }
-            out = new ByteArrayOutputStream();
-            IO.copy(in,out);
-
-            actual = out.toString(encoding);
-            assertThat("Uncompressed contents",actual,equalTo(expected));
-        }
-        finally
-        {
-            IO.close(out);
-            IO.close(in);
-            IO.close(bais);
-        }
-
-        return response;
-    }
-
-    public HttpTester.Response assertIsResponseNotModified(String method, String requestedFilename, long ifmodifiedsince) throws Exception
-    {
-        HttpTester.Request request = HttpTester.newRequest();
-        HttpTester.Response response;
-
-        request.setMethod(method);
-        request.setVersion("HTTP/1.0");
-        request.setHeader("Host","tester");
-        request.setHeader("Accept-Encoding",compressionType);
-        if (ifmodifiedsince > 0)
-            request.setHeader(HttpHeader.IF_MODIFIED_SINCE.asString(),DateGenerator.formatDate(ifmodifiedsince));
-        if (this.userAgent != null)
-            request.setHeader("User-Agent",this.userAgent);
-        request.setURI("/context/" + requestedFilename);
-
-        // Issue the request
-        response = HttpTester.parseResponse(tester.getResponses(request.generate()));
-
-        Assert.assertThat(response.getStatus(),Matchers.equalTo(304));
-        Assert.assertThat(response.get("ETag"),Matchers.startsWith("W/"));
-
-        return response;
-    }
-
-    /**
-     * Makes sure that the response contains an unfiltered file contents.
-     * <p>
-     * This is used to test exclusions and passthroughs in the GzipFilter.
-     * <p>
-     * An example is to test that it is possible to configure GzipFilter to not recompress content that shouldn't be compressed by the GzipFilter.
-     *
-     * @param requestedFilename
-     *            the filename used to on the GET request,.
-     * @param testResourceSha1Sum
-     *            the sha1sum file that contains the SHA1SUM checksum that will be used to verify that the response contents are what is intended.
-     * @param expectedContentType
-     */
-    public void assertIsResponseNotGzipFiltered(String requestedFilename, String testResourceSha1Sum, String expectedContentType) throws Exception
-    {
-        assertIsResponseNotGzipFiltered(requestedFilename,testResourceSha1Sum,expectedContentType,null);
-    }
-
-    /**
-     * Makes sure that the response contains an unfiltered file contents.
-     * <p>
-     * This is used to test exclusions and passthroughs in the GzipFilter.
-     * <p>
-     * An example is to test that it is possible to configure GzipFilter to not recompress content that shouldn't be compressed by the GzipFilter.
-     *
-     * @param requestedFilename
-     *            the filename used to on the GET request,.
-     * @param testResourceSha1Sum
-     *            the sha1sum file that contains the SHA1SUM checksum that will be used to verify that the response contents are what is intended.
-     * @param expectedContentType
-     * @param expectedContentEncoding
-     *            can be non-null in some circumstances, eg when dealing with pre-gzipped .svgz files
-     */
-    public void assertIsResponseNotGzipFiltered(String requestedFilename, String testResourceSha1Sum, String expectedContentType, String expectedContentEncoding)
-            throws Exception
-    {
-        HttpTester.Request request = HttpTester.newRequest();
-        HttpTester.Response response;
-
-        request.setMethod("GET");
-        request.setVersion("HTTP/1.0");
-        request.setHeader("Host","tester");
-        request.setHeader("Accept-Encoding",compressionType);
-        if (this.userAgent != null)
-            request.setHeader("User-Agent",this.userAgent);
-        request.setURI("/context/" + requestedFilename);
-
-        // Issue the request
-        response = HttpTester.parseResponse(tester.getResponses(request.generate()));
-
-        dumpHeaders(requestedFilename + " / Response Headers",response);
-
-        // Assert the response headers
-        String prefix = requestedFilename + " / Response";
-        Assert.assertThat(prefix + ".status",response.getStatus(),is(HttpServletResponse.SC_OK));
-        Assert.assertThat(prefix + ".header[Content-Length]",response.get("Content-Length"),notNullValue());
-        Assert.assertThat(prefix + ".header[Content-Encoding] (should not be recompressed by GzipFilter)",response.get("Content-Encoding"),
-                expectedContentEncoding == null?nullValue():notNullValue());
-        if (expectedContentEncoding != null)
-            Assert.assertThat(prefix + ".header[Content-Encoding]",response.get("Content-Encoding"),is(expectedContentEncoding));
-        Assert.assertThat(prefix + ".header[Content-Type] (should have a Content-Type associated with it)",response.get("Content-Type"),notNullValue());
-        Assert.assertThat(prefix + ".header[Content-Type]",response.get("Content-Type"),is(expectedContentType));
-
-        Assert.assertThat(response.get("ETAG"),Matchers.startsWith("W/"));
-
-        ByteArrayInputStream bais = null;
-        DigestOutputStream digester = null;
-        try
-        {
-            MessageDigest digest = MessageDigest.getInstance("SHA1");
-            bais = new ByteArrayInputStream(response.getContentBytes());
-            digester = new DigestOutputStream(new NoOpOutputStream(),digest);
-            IO.copy(bais,digester);
-
-            String actualSha1Sum = Hex.asHex(digest.digest());
-            String expectedSha1Sum = loadExpectedSha1Sum(testResourceSha1Sum);
-            Assert.assertEquals(requestedFilename + " / SHA1Sum of content",expectedSha1Sum,actualSha1Sum);
-        }
-        finally
-        {
-            IO.close(digester);
-            IO.close(bais);
-        }
-    }
-
-    private void dumpHeaders(String prefix, HttpTester.Message message)
-    {
-        LOG.debug("dumpHeaders: {}",prefix);
-        Enumeration<String> names = message.getFieldNames();
-        while (names.hasMoreElements())
-        {
-            String name = names.nextElement();
-            String value = message.get(name);
-            LOG.debug("dumpHeaders:   {} = {}",name,value);
-        }
-    }
-
-    private String loadExpectedSha1Sum(String testResourceSha1Sum) throws IOException
-    {
-        File sha1File = MavenTestingUtils.getTestResourceFile(testResourceSha1Sum);
-        String contents = IO.readToString(sha1File);
-        Pattern pat = Pattern.compile("^[0-9A-Fa-f]*");
-        Matcher mat = pat.matcher(contents);
-        Assert.assertTrue("Should have found HEX code in SHA1 file: " + sha1File,mat.find());
-        return mat.group();
-    }
-
-    public HttpTester.Response executeRequest(String method, String path, int idleFor, TimeUnit idleUnit) throws Exception
-    {
-        HttpTester.Request request = HttpTester.newRequest();
-
-        request.setMethod(method);
-        request.setVersion("HTTP/1.1");
-        request.setHeader("Host","tester");
-        request.setHeader("Accept-Encoding",accept);
-        request.setHeader("Connection","close");
-
-        if (this.userAgent != null)
-        {
-            request.setHeader("User-Agent",this.userAgent);
-        }
-        
-        request.setURI(path);
-
-        // Issue the request
-        return HttpTester.parseResponse(tester.getResponses(request.generate(),idleFor,idleUnit));
-    }
-
-    public String readResponse(HttpTester.Response response) throws IOException, UnsupportedEncodingException
-    {
-        String actual = null;
-        InputStream in = null;
-        ByteArrayOutputStream out = null;
-        try
-        {
-            byte[] content = response.getContentBytes();
-            if (content != null)
-                actual = new String(response.getContentBytes(),encoding);
-            else
-                actual = "";
-        }
-        finally
-        {
-            IO.close(out);
-            IO.close(in);
-        }
-        return actual;
-    }
-
-    /**
-     * Generate string content of arbitrary length.
-     *
-     * @param length
-     *            the length of the string to generate.
-     * @return the string content.
-     */
-    public String generateContent(int length)
-    {
-        StringBuilder builder = new StringBuilder();
-        do
-        {
-            builder.append("Lorem ipsum dolor sit amet, consectetur adipiscing elit. In quis felis nunc.\n");
-            builder.append("Quisque suscipit mauris et ante auctor ornare rhoncus lacus aliquet. Pellentesque\n");
-            builder.append("habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.\n");
-            builder.append("Vestibulum sit amet felis augue, vel convallis dolor. Cras accumsan vehicula diam\n");
-            builder.append("at faucibus. Etiam in urna turpis, sed congue mi. Morbi et lorem eros. Donec vulputate\n");
-            builder.append("velit in risus suscipit lobortis. Aliquam id urna orci, nec sollicitudin ipsum.\n");
-            builder.append("Cras a orci turpis. Donec suscipit vulputate cursus. Mauris nunc tellus, fermentum\n");
-            builder.append("eu auctor ut, mollis at diam. Quisque porttitor ultrices metus, vitae tincidunt massa\n");
-            builder.append("sollicitudin a. Vivamus porttitor libero eget purus hendrerit cursus. Integer aliquam\n");
-            builder.append("consequat mauris quis luctus. Cras enim nibh, dignissim eu faucibus ac, mollis nec neque.\n");
-            builder.append("Aliquam purus mauris, consectetur nec convallis lacinia, porta sed ante. Suspendisse\n");
-            builder.append("et cursus magna. Donec orci enim, molestie a lobortis eu, imperdiet vitae neque.\n");
-        }
-        while (builder.length() < length);
-
-        // Make sure we are exactly at requested length. (truncate the extra)
-        if (builder.length() > length)
-        {
-            builder.setLength(length);
-        }
-
-        return builder.toString();
-    }
-
-    public String getEncoding()
-    {
-        return encoding;
-    }
-
-    /**
-     * Create a file on the server resource path of a specified filename and size.
-     *
-     * @param filename
-     *            the filename to create
-     * @param filesize
-     *            the file size to create (Note: this isn't suitable for creating large multi-megabyte files)
-     */
-    public File prepareServerFile(String filename, int filesize) throws IOException
-    {
-        File dir = testdir.getDir();
-        File testFile = new File(dir,filename);
-        // Make sure we have a uniq filename (to work around windows File.delete bug)
-        int i = 0;
-        while (testFile.exists())
-        {
-            testFile = new File(dir,(i++) + "-" + filename);
-        }
-
-        FileOutputStream fos = null;
-        ByteArrayInputStream in = null;
-        try
-        {
-            fos = new FileOutputStream(testFile,false);
-            in = new ByteArrayInputStream(generateContent(filesize).getBytes(encoding));
-            IO.copy(in,fos);
-            return testFile;
-        }
-        finally
-        {
-            IO.close(in);
-            IO.close(fos);
-        }
-    }
-
-    /**
-     * Copy a src/test/resource file into the server tree for eventual serving.
-     *
-     * @param filename
-     *            the filename to look for in src/test/resources
-     */
-    public void copyTestServerFile(String filename) throws IOException
-    {
-        File srcFile = MavenTestingUtils.getTestResourceFile(filename);
-        File testFile = testdir.getFile(filename);
-
-        IO.copy(srcFile,testFile);
-    }
-
-    /**
-     * Set the servlet that provides content for the GzipFilter in being tested.
-     *
-     * @param servletClass
-     *            the servlet that will provide content.
-     * @return the FilterHolder for configuring the GzipFilter's initParameters with
-     */
-    public FilterHolder setContentServlet(Class<? extends Servlet> servletClass) throws IOException
-    {
-        tester.setContextPath("/context");
-        tester.setResourceBase(testdir.getDir().getCanonicalPath());
-        ServletHolder servletHolder = tester.addServlet(servletClass,"/");
-        servletHolder.setInitParameter("baseDir",testdir.getDir().getAbsolutePath());
-        servletHolder.setInitParameter("etags","true");
-
-        if (gzipFilterClass != null)
-        {
-            FilterHolder holder = tester.addFilter(gzipFilterClass,"/*",EnumSet.of(DispatcherType.REQUEST));
-            holder.setInitParameter("vary","Accept-Encoding");
-            return holder;
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    public Class<? extends Filter> getGzipFilterClass()
-    {
-        return gzipFilterClass;
-    }
-    
-    @Deprecated
-    public void setGzipFilterClass(Class<? extends Filter> gzipFilterClass)
-    {
-        this.gzipFilterClass = gzipFilterClass;
-    }
-
-    public void setEncoding(String encoding)
-    {
-        this.encoding = encoding;
-    }
-
-    public void setUserAgent(String ua)
-    {
-        this.userAgent = ua;
-    }
-
-    public void addMimeType(String extension, String mimetype)
-    {
-        this.tester.getContext().getMimeTypes().addMimeMapping(extension,mimetype);
-    }
-
-    /**
-     * Add an arbitrary filter to the test case.
-     * 
-     * @param holder
-     *            the filter to add
-     * @param pathSpec
-     *            the path spec for this filter
-     * @param dispatches
-     *            the set of {@link DispatcherType} to associate with this filter
-     */
-    public void addFilter(FilterHolder holder, String pathSpec, EnumSet<DispatcherType> dispatches) throws IOException
-    {
-        tester.addFilter(holder,pathSpec,dispatches);
-    }
-
-    public void start() throws Exception
-    {
-        Assert.assertThat("No servlet defined yet.  Did you use #setContentServlet()?",tester,notNullValue());
-        
-        if (LOG.isDebugEnabled())
-        {
-            tester.dumpStdErr();
-        }
-        tester.start();
-    }
-
-    public void stop()
-    {
-        // NOTE: Do not cleanup the testdir. Failures can't be diagnosed if you do that.
-        // IO.delete(testdir.getDir()):
-        try
-        {
-            tester.stop();
-        }
-        catch (Exception e)
-        {
-            // Don't toss this out into Junit as this would be the last exception
-            // that junit will report as being the cause of the test failure.
-            // when in reality, the earlier setup issue is the real cause.
-            e.printStackTrace(System.err);
-        }
-    }
-
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/Hex.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/Hex.java
deleted file mode 100644
index bc431cf..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/Hex.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-public final class Hex
-{
-    private static final char[] hexcodes = "0123456789abcdef".toCharArray();
-
-    public static byte[] asByteArray(String id, int size)
-    {
-        if ((id.length() < 0) || (id.length() > (size * 2)))
-        {
-            throw new IllegalArgumentException(String.format("Invalid ID length of <%d> expected range of <0> to <%d>",id.length(),(size * 2)));
-        }
-
-        byte buf[] = new byte[size];
-        byte hex;
-        int len = id.length();
-
-        int idx = (int)Math.floor(((size * 2) - (double)len) / 2);
-        int i = 0;
-        if ((len % 2) != 0)
-        { // deal with odd numbered chars
-            i -= 1;
-        }
-
-        for (; i < len; i++)
-        {
-            hex = 0;
-            if (i >= 0)
-            {
-                hex = (byte)(Character.digit(id.charAt(i),16) << 4);
-            }
-            i++;
-            hex += (byte)(Character.digit(id.charAt(i),16));
-
-            buf[idx] = hex;
-            idx++;
-        }
-
-        return buf;
-    }
-
-    public static String asHex(byte buf[])
-    {
-        int len = buf.length;
-        char out[] = new char[len * 2];
-        for (int i = 0; i < len; i++)
-        {
-            out[i * 2] = hexcodes[(buf[i] & 0xF0) >> 4];
-            out[(i * 2) + 1] = hexcodes[(buf[i] & 0x0F)];
-        }
-        return String.valueOf(out);
-    }
-
-    private Hex()
-    {
-        /* prevent instantiation */
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/NoOpOutputStream.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/NoOpOutputStream.java
deleted file mode 100644
index adcd705..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/NoOpOutputStream.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * Stream that does nothing. (Used by SHA1SUM routines)
- */
-public class NoOpOutputStream extends OutputStream
-{
-    @Override
-    public void close() throws IOException
-    {
-        /* noop */
-    }
-    
-    @Override
-    public void flush() throws IOException
-    {
-        /* noop */
-    }
-    
-    @Override
-    public void write(byte[] b) throws IOException
-    {
-        /* noop */
-    }
-    
-    @Override
-    public void write(byte[] b, int off, int len) throws IOException
-    {
-        /* noop */
-    }
-    
-    @Override
-    public void write(int b) throws IOException
-    {
-        /* noop */
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/PassThruInputStream.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/PassThruInputStream.java
deleted file mode 100644
index 31444cb..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/PassThruInputStream.java
+++ /dev/null
@@ -1,36 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.FilterInputStream;
-import java.io.InputStream;
-
-/**
- * A simple pass-through input stream.
- * <p>
- * Used in some test cases where a proper resource open/close is needed for
- * some potentially optional layers of the input stream.
- */
-public class PassThruInputStream extends FilterInputStream
-{
-    public PassThruInputStream(InputStream in)
-    {
-        super(in);
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestDirContentServlet.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestDirContentServlet.java
deleted file mode 100644
index 03b4dce..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestDirContentServlet.java
+++ /dev/null
@@ -1,74 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-
-import org.eclipse.jetty.toolchain.test.PathAssert;
-import org.eclipse.jetty.util.IO;
-
-@SuppressWarnings("serial")
-public class TestDirContentServlet extends HttpServlet
-{
-    private File basedir;
-
-    @Override
-    public void init(ServletConfig config) throws ServletException
-    {
-        basedir = new File(config.getInitParameter("baseDir"));
-    }
-
-    public File getTestFile(String filename)
-    {
-        File testfile = new File(basedir,filename);
-        PathAssert.assertFileExists("Content File should exist",testfile);
-        return testfile;
-    }
-
-    protected byte[] loadContentFileBytes(final String fileName) throws IOException
-    {
-        String relPath = fileName;
-        relPath = relPath.replaceFirst("^/context/","");
-        relPath = relPath.replaceFirst("^/","");
-
-        File contentFile =  getTestFile(relPath);
-
-        FileInputStream in = null;
-        ByteArrayOutputStream out = null;
-        try
-        {
-            in = new FileInputStream(contentFile);
-            out = new ByteArrayOutputStream();
-            IO.copy(in,out);
-            return out.toByteArray();
-        }
-        finally
-        {
-            IO.close(out);
-            IO.close(in);
-        }
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestMinGzipSizeServlet.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestMinGzipSizeServlet.java
deleted file mode 100644
index 0295115..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestMinGzipSizeServlet.java
+++ /dev/null
@@ -1,68 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.IOException;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.http.MimeTypes;
-
-/**
- * Test servlet for testing against unusual minGzip configurable.
- */
-@SuppressWarnings("serial")
-public class TestMinGzipSizeServlet extends TestDirContentServlet
-{
-    private MimeTypes mimeTypes;
-
-    @Override
-    public void init(ServletConfig config) throws ServletException
-    {
-        super.init(config);
-        mimeTypes = new MimeTypes();
-    }
-
-    @Override
-    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
-    {
-        String fileName = request.getServletPath();
-        byte[] dataBytes = loadContentFileBytes(fileName);
-
-        response.setContentLength(dataBytes.length);
-        response.setHeader("ETag","W/etag-"+fileName);
-        if (fileName.endsWith(".js"))
-        {
-            // intentionally long-form content type to test ";" splitting in code
-            response.setContentType("text/javascript; charset=utf-8");
-        }
-        else
-        {
-            String mime = mimeTypes.getMimeByExtension(fileName);
-            if (mime != null)
-                response.setContentType(mime);
-        }
-        ServletOutputStream out = response.getOutputStream();
-        out.write(dataBytes);
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletBufferTypeLengthWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletBufferTypeLengthWrite.java
deleted file mode 100644
index a503e79..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletBufferTypeLengthWrite.java
+++ /dev/null
@@ -1,67 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.server.HttpOutput;
-
-/**
- * A sample servlet to serve static content, using a order of construction that has caused problems for
- * {@link GzipFilter} in the past.
- *
- * Using a real-world pattern of:
- *
- * <pre>
- *  1) get stream
- *  2) set content type
- *  2) set content length
- *  4) write
- * </pre>
- *
- * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
- */
-@SuppressWarnings("serial")
-public class TestServletBufferTypeLengthWrite extends TestDirContentServlet
-{
-    @Override
-    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
-    {
-        String fileName = request.getServletPath();
-        byte[] dataBytes = loadContentFileBytes(fileName);
-
-        ServletOutputStream out = response.getOutputStream();
-
-        if (fileName.endsWith("txt"))
-            response.setContentType("text/plain");
-        else if (fileName.endsWith("mp3"))
-            response.setContentType("audio/mpeg");
-        response.setHeader("ETag","W/etag-"+fileName);
-
-        response.setContentLength(dataBytes.length);
-        
-        ((HttpOutput)out).write(ByteBuffer.wrap(dataBytes).asReadOnlyBuffer());
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletLengthStreamTypeWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletLengthStreamTypeWrite.java
deleted file mode 100644
index b769d54..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletLengthStreamTypeWrite.java
+++ /dev/null
@@ -1,64 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * A sample servlet to serve static content, using a order of construction that has caused problems for
- * {@link GzipFilter} in the past.
- *
- * Using a real-world pattern of:
- *
- * <pre>
- *  1) set content length
- *  2) get stream
- *  3) set content type
- *  4) write
- * </pre>
- *
- * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
- */
-@SuppressWarnings("serial")
-public class TestServletLengthStreamTypeWrite extends TestDirContentServlet
-{
-    @Override
-    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
-    {
-        String fileName = request.getServletPath();
-        byte[] dataBytes = loadContentFileBytes(fileName);
-
-        response.setContentLength(dataBytes.length);
-
-        ServletOutputStream out = response.getOutputStream();
-
-        if (fileName.endsWith("txt"))
-            response.setContentType("text/plain");
-        else if (fileName.endsWith("mp3"))
-            response.setContentType("audio/mpeg");
-        response.setHeader("ETag","W/etag-"+fileName);
-
-        out.write(dataBytes);
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletLengthTypeStreamWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletLengthTypeStreamWrite.java
deleted file mode 100644
index da2e43b..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletLengthTypeStreamWrite.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * A sample servlet to serve static content, using a order of construction that has caused problems for
- * {@link GzipFilter} in the past.
- *
- * Using a real-world pattern of:
- *
- * <pre>
- *  1) set content length
- *  2) set content type
- *  3) get stream
- *  4) write
- * </pre>
- *
- * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
- */
-@SuppressWarnings("serial")
-public class TestServletLengthTypeStreamWrite extends TestDirContentServlet
-{
-    @Override
-    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
-    {
-        String fileName = request.getServletPath();
-        byte[] dataBytes = loadContentFileBytes(fileName);
-
-        response.setContentLength(dataBytes.length);
-
-        if (fileName.endsWith("txt"))
-            response.setContentType("text/plain");
-        else if (fileName.endsWith("mp3"))
-            response.setContentType("audio/mpeg");
-        response.setHeader("ETag","W/etag-"+fileName);
-
-        ServletOutputStream out = response.getOutputStream();
-        out.write(dataBytes);
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletStreamLengthTypeWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletStreamLengthTypeWrite.java
deleted file mode 100644
index 3442e4f..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletStreamLengthTypeWrite.java
+++ /dev/null
@@ -1,64 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * A sample servlet to serve static content, using a order of construction that has caused problems for
- * {@link GzipFilter} in the past.
- *
- * Using a real-world pattern of:
- *
- * <pre>
- *  1) get stream
- *  2) set content length
- *  3) set content type
- *  4) write
- * </pre>
- *
- * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
- */
-@SuppressWarnings("serial")
-public class TestServletStreamLengthTypeWrite extends TestDirContentServlet
-{
-    @Override
-    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
-    {
-        String fileName = request.getServletPath();
-        byte[] dataBytes = loadContentFileBytes(fileName);
-
-        ServletOutputStream out = response.getOutputStream();
-
-        response.setContentLength(dataBytes.length);
-
-        if (fileName.endsWith("txt"))
-            response.setContentType("text/plain");
-        else if (fileName.endsWith("mp3"))
-            response.setContentType("audio/mpeg");
-        response.setHeader("ETag","W/etag-"+fileName);
-
-        out.write(dataBytes);
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletStreamLengthTypeWriteWithFlush.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletStreamLengthTypeWriteWithFlush.java
deleted file mode 100644
index b49761c..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletStreamLengthTypeWriteWithFlush.java
+++ /dev/null
@@ -1,70 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * A sample servlet to serve static content, using a order of construction that has caused problems for
- * {@link GzipFilter} in the past.
- * 
- * Using a real-world pattern of:
- * 
- * <pre>
- *  1) get stream
- *  2) set content length
- *  3) set content type
- *  4) write and flush
- * </pre>
- * 
- * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
- */
-@SuppressWarnings("serial")
-public class TestServletStreamLengthTypeWriteWithFlush extends TestDirContentServlet
-{
-    @Override
-    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
-    {
-        String fileName = request.getServletPath();
-        byte[] dataBytes = loadContentFileBytes(fileName);
-
-        ServletOutputStream out = response.getOutputStream();
-
-        // set content-length of uncompressed content (GzipFilter should handle this)
-        response.setContentLength(dataBytes.length);
-        
-        if (fileName.endsWith("txt"))
-            response.setContentType("text/plain");
-        else if (fileName.endsWith("mp3"))
-            response.setContentType("audio/mpeg");
-        response.setHeader("ETag","W/etag-"+fileName);
-
-        for ( int i = 0 ; i < dataBytes.length ; i++)
-        {
-            out.write(dataBytes[i]);
-            // flush using response object (not the stream itself)
-            response.flushBuffer();
-        }
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletStreamTypeLengthWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletStreamTypeLengthWrite.java
deleted file mode 100644
index 26b3fab..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletStreamTypeLengthWrite.java
+++ /dev/null
@@ -1,64 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * A sample servlet to serve static content, using a order of construction that has caused problems for
- * {@link GzipFilter} in the past.
- *
- * Using a real-world pattern of:
- *
- * <pre>
- *  1) get stream
- *  2) set content type
- *  2) set content length
- *  4) write
- * </pre>
- *
- * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
- */
-@SuppressWarnings("serial")
-public class TestServletStreamTypeLengthWrite extends TestDirContentServlet
-{
-    @Override
-    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
-    {
-        String fileName = request.getServletPath();
-        byte[] dataBytes = loadContentFileBytes(fileName);
-
-        ServletOutputStream out = response.getOutputStream();
-
-        if (fileName.endsWith("txt"))
-            response.setContentType("text/plain");
-        else if (fileName.endsWith("mp3"))
-            response.setContentType("audio/mpeg");
-        response.setHeader("ETag","W/etag-"+fileName);
-
-        response.setContentLength(dataBytes.length);
-
-        out.write(dataBytes);
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletTypeLengthStreamWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletTypeLengthStreamWrite.java
deleted file mode 100644
index c27d819..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletTypeLengthStreamWrite.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * A sample servlet to serve static content, using a order of construction that has caused problems for
- * {@link GzipFilter} in the past.
- *
- * Using a real-world pattern of:
- *
- * <pre>
- *  1) set content type
- *  2) set content length
- *  3) get stream
- *  4) write
- * </pre>
- *
- * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
- */
-@SuppressWarnings("serial")
-public class TestServletTypeLengthStreamWrite extends TestDirContentServlet
-{
-    @Override
-    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
-    {
-        String fileName = request.getServletPath();
-        byte[] dataBytes = loadContentFileBytes(fileName);
-
-        if (fileName.endsWith("txt"))
-            response.setContentType("text/plain");
-        else if (fileName.endsWith("mp3"))
-            response.setContentType("audio/mpeg");
-        response.setHeader("ETag","W/etag-"+fileName);
-
-        response.setContentLength(dataBytes.length);
-
-        ServletOutputStream out = response.getOutputStream();
-        out.write(dataBytes);
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletTypeStreamLengthWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletTypeStreamLengthWrite.java
deleted file mode 100644
index 4c0ae3f..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestServletTypeStreamLengthWrite.java
+++ /dev/null
@@ -1,64 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * A sample servlet to serve static content, using a order of construction that has caused problems for
- * {@link GzipFilter} in the past.
- *
- * Using a real-world pattern of:
- *
- * <pre>
- *  1) set content type
- *  2) get stream
- *  3) set content length
- *  4) write
- * </pre>
- *
- * @see <a href="Eclipse Bug 354014">http://bugs.eclipse.org/354014</a>
- */
-@SuppressWarnings("serial")
-public class TestServletTypeStreamLengthWrite extends TestDirContentServlet
-{
-    @Override
-    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
-    {
-        String fileName = request.getServletPath();
-        byte[] dataBytes = loadContentFileBytes(fileName);
-
-        if (fileName.endsWith("txt"))
-            response.setContentType("text/plain");
-        else if (fileName.endsWith("mp3"))
-            response.setContentType("audio/mpeg");
-        response.setHeader("ETag","W/etag-"+fileName);
-
-        ServletOutputStream out = response.getOutputStream();
-
-        response.setContentLength(dataBytes.length);
-
-        out.write(dataBytes);
-    }
-}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestStaticMimeTypeServlet.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestStaticMimeTypeServlet.java
deleted file mode 100644
index a246624..0000000
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/gzip/TestStaticMimeTypeServlet.java
+++ /dev/null
@@ -1,81 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.servlets.gzip;
-
-import java.io.IOException;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.http.MimeTypes;
-
-/**
- * Test servlet for testing against unusual MimeTypes and Content-Types.
- */
-@SuppressWarnings("serial")
-public class TestStaticMimeTypeServlet extends TestDirContentServlet
-{
-    private MimeTypes mimeTypes;
-
-    @Override
-    public void init(ServletConfig config) throws ServletException
-    {
-        super.init(config);
-        mimeTypes = new MimeTypes();
-        // Some real world, yet not terribly common, mime type mappings.
-        mimeTypes.addMimeMapping("bz2","application/bzip2");
-        mimeTypes.addMimeMapping("bmp","image/bmp");
-        mimeTypes.addMimeMapping("tga","application/tga");
-        mimeTypes.addMimeMapping("xcf","image/xcf");
-        mimeTypes.addMimeMapping("jp2","image/jpeg2000");
-
-        // Some of the other gzip mime-types seen in the wild.
-        // NOTE: Using oddball extensions just so that the calling request can specify
-        //       which strange mime type to use.
-        mimeTypes.addMimeMapping("x-gzip","application/x-gzip");
-        mimeTypes.addMimeMapping("x-gunzip","application/x-gunzip");
-        mimeTypes.addMimeMapping("gzipped","application/gzippped");
-        mimeTypes.addMimeMapping("gzip-compressed","application/gzip-compressed");
-        mimeTypes.addMimeMapping("x-compressed","application/x-compressed");
-        mimeTypes.addMimeMapping("x-compress","application/x-compress");
-        mimeTypes.addMimeMapping("gzipdoc","gzip/document");
-    }
-
-    @Override
-    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
-    {
-        String fileName = request.getServletPath();
-        byte[] dataBytes = loadContentFileBytes(fileName);
-
-        response.setContentLength(dataBytes.length);
-        response.setHeader("ETag","W/etag-"+fileName);
-
-        String mime = mimeTypes.getMimeByExtension(fileName);
-        if (mime == null)
-            response.setContentType("application/octet-stream");
-        else
-            response.setContentType(mime);
-
-        ServletOutputStream out = response.getOutputStream();
-        out.write(dataBytes);
-    }
-}
diff --git a/jetty-servlets/src/test/resources/jetty-logging.properties b/jetty-servlets/src/test/resources/jetty-logging.properties
index 6502639..3ceebb8 100644
--- a/jetty-servlets/src/test/resources/jetty-logging.properties
+++ b/jetty-servlets/src/test/resources/jetty-logging.properties
@@ -2,6 +2,5 @@
 #org.eclipse.jetty.LEVEL=DEBUG
 #org.eclipse.jetty.servlets.LEVEL=DEBUG
 #org.eclipse.jetty.servlet.ServletTester.LEVEL=DEBUG
-#org.eclipse.jetty.servlets.GzipFilter.LEVEL=DEBUG
 #org.eclipse.jetty.servlets.QoSFilter.LEVEL=DEBUG
 #org.eclipse.jetty.servlets.DoSFilter.LEVEL=DEBUG
diff --git a/jetty-spdy/pom.xml b/jetty-spdy/pom.xml
deleted file mode 100644
index 4d17d0a..0000000
--- a/jetty-spdy/pom.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.eclipse.jetty</groupId>
-        <artifactId>jetty-project</artifactId>
-        <version>9.2.14-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.eclipse.jetty.spdy</groupId>
-    <artifactId>spdy-parent</artifactId>
-    <packaging>pom</packaging>
-    <name>Jetty :: SPDY :: Parent</name>
-    <url>http://www.eclipse.org/jetty</url>
-
-    <modules>
-        <module>spdy-core</module>
-        <module>spdy-client</module>
-        <module>spdy-server</module>
-        <module>spdy-http-common</module>
-        <module>spdy-http-server</module>
-        <module>spdy-http-client-transport</module>
-        <module>spdy-example-webapp</module>
-        <module>spdy-alpn-tests</module>
-    </modules>
-
-    <profiles>
-      <profile>
-        <id>npn</id>
-        <activation>
-          <jdk>1.7</jdk>
-        </activation>
-        <modules>
-<!--
-          <module>spdy-npn-tests</module>
--->
-        </modules>
-      </profile>
-    </profiles>
-
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-pmd-plugin</artifactId>
-                <configuration>
-                    <skip>true</skip>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>manifest</goal>
-                        </goals>
-                        <configuration>
-                            <instructions>
-                                <Export-Package>org.eclipse.jetty.spdy.*;version="9.1"</Export-Package>
-                                <Import-Package>org.eclipse.jetty.*;version="[9.0,10.0)",*</Import-Package>
-                                <_nouses>true</_nouses>
-                            </instructions>
-                          </configuration>
-                       </execution>
-                  </executions>
-            </plugin>
-            <plugin>
-              <groupId>org.apache.maven.plugins</groupId>
-              <artifactId>maven-jar-plugin</artifactId>
-              <configuration>
-                  <archive>
-                      <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-                  </archive>
-              </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.eclipse.jetty.toolchain</groupId>
-            <artifactId>jetty-test-helper</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/jetty-spdy/spdy-alpn-tests/pom.xml b/jetty-spdy/spdy-alpn-tests/pom.xml
deleted file mode 100644
index 86469c9..0000000
--- a/jetty-spdy/spdy-alpn-tests/pom.xml
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.eclipse.jetty.spdy</groupId>
-        <artifactId>spdy-parent</artifactId>
-        <version>9.2.14-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>spdy-alpn-tests</artifactId>
-    <name>Jetty :: SPDY :: ALPN Tests</name>
-
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>copy</id>
-                        <phase>generate-resources</phase>
-                        <goals>
-                            <goal>copy</goal>
-                        </goals>
-                        <configuration>
-                            <artifactItems>
-                                <artifactItem>
-                                    <groupId>org.mortbay.jetty.alpn</groupId>
-                                    <artifactId>alpn-boot</artifactId>
-                                    <version>${alpn.version}</version>
-                                    <type>jar</type>
-                                    <overWrite>false</overWrite>
-                                    <outputDirectory>${project.build.directory}/alpn</outputDirectory>
-                                </artifactItem>
-                            </artifactItems>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <argLine>-Xbootclasspath/p:${project.build.directory}/alpn/alpn-boot-${alpn.version}.jar</argLine>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.eclipse.jetty.alpn</groupId>
-            <artifactId>alpn-api</artifactId>
-            <version>${alpn.api.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-alpn-server</artifactId>
-            <version>${project.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-server</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.spdy</groupId>
-            <artifactId>spdy-server</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.spdy</groupId>
-            <artifactId>spdy-http-server</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.spdy</groupId>
-            <artifactId>spdy-http-server</artifactId>
-            <version>${project.version}</version>
-            <classifier>tests</classifier>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-    
-</project>
diff --git a/jetty-spdy/spdy-alpn-tests/src/test/java/org/eclipse/jetty/spdy/server/ALPNNegotiationTest.java b/jetty-spdy/spdy-alpn-tests/src/test/java/org/eclipse/jetty/spdy/server/ALPNNegotiationTest.java
deleted file mode 100644
index d37d1fa..0000000
--- a/jetty-spdy/spdy-alpn-tests/src/test/java/org/eclipse/jetty/spdy/server/ALPNNegotiationTest.java
+++ /dev/null
@@ -1,198 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server;
-
-import java.io.BufferedReader;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.net.InetSocketAddress;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.List;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSocket;
-
-import org.eclipse.jetty.alpn.ALPN;
-import org.eclipse.jetty.server.HttpConnectionFactory;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class ALPNNegotiationTest extends AbstractALPNTest
-{
-    @Test
-    public void testClientAdvertisingHTTPServerSpeaksHTTP() throws Exception
-    {
-        InetSocketAddress address = prepare();
-        connector.addConnectionFactory(new HttpConnectionFactory());
-
-        SslContextFactory sslContextFactory = newSslContextFactory();
-        sslContextFactory.start();
-        SSLContext sslContext = sslContextFactory.getSslContext();
-
-        try (SSLSocket client = (SSLSocket)sslContext.getSocketFactory().createSocket(address.getAddress(), address.getPort()))
-        {
-            client.setUseClientMode(true);
-            client.setSoTimeout(5000);
-
-            ALPN.put(client, new ALPN.ClientProvider()
-            {
-                @Override
-                public void unsupported()
-                {
-                }
-
-                @Override
-                public List<String> protocols()
-                {
-                    return Arrays.asList("http/1.1");
-                }
-
-                @Override
-                public void selected(String protocol)
-                {
-                    Assert.assertEquals("http/1.1", protocol);
-                }
-            });
-
-            client.startHandshake();
-
-            // Verify that the server really speaks http/1.1
-
-            OutputStream output = client.getOutputStream();
-            output.write(("" +
-                    "GET / HTTP/1.1\r\n" +
-                    "Host: localhost:" + address.getPort() + "\r\n" +
-                    "\r\n" +
-                    "").getBytes(StandardCharsets.UTF_8));
-            output.flush();
-
-            InputStream input = client.getInputStream();
-            BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
-            String line = reader.readLine();
-            Assert.assertTrue(line.contains(" 404 "));
-        }
-    }
-
-    @Test
-    public void testClientAdvertisingMultipleProtocolsServerSpeaksHTTPWhenNegotiated() throws Exception
-    {
-        InetSocketAddress address = prepare();
-        connector.addConnectionFactory(new HttpConnectionFactory());
-
-        SslContextFactory sslContextFactory = newSslContextFactory();
-        sslContextFactory.start();
-        SSLContext sslContext = sslContextFactory.getSslContext();
-        try (SSLSocket client = (SSLSocket)sslContext.getSocketFactory().createSocket(address.getAddress(), address.getPort()))
-        {
-            client.setUseClientMode(true);
-            client.setSoTimeout(5000);
-
-            ALPN.put(client, new ALPN.ClientProvider()
-            {
-                @Override
-                public void unsupported()
-                {
-                }
-
-                @Override
-                public List<String> protocols()
-                {
-                    return Arrays.asList("unknown/1.0", "http/1.1");
-                }
-
-                @Override
-                public void selected(String protocol)
-                {
-                    Assert.assertEquals("http/1.1", protocol);
-                }
-            });
-
-            client.startHandshake();
-
-            // Verify that the server really speaks http/1.1
-
-            OutputStream output = client.getOutputStream();
-            output.write(("" +
-                    "GET / HTTP/1.1\r\n" +
-                    "Host: localhost:" + address.getPort() + "\r\n" +
-                    "\r\n" +
-                    "").getBytes(StandardCharsets.UTF_8));
-            output.flush();
-
-            InputStream input = client.getInputStream();
-            BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
-            String line = reader.readLine();
-            Assert.assertTrue(line.contains(" 404 "));
-        }
-    }
-
-    @Test
-    public void testClientNotSupportingALPNServerSpeaksDefaultProtocol() throws Exception
-    {
-        InetSocketAddress address = prepare();
-        connector.addConnectionFactory(new HttpConnectionFactory());
-
-        SslContextFactory sslContextFactory = newSslContextFactory();
-        sslContextFactory.start();
-        SSLContext sslContext = sslContextFactory.getSslContext();
-        try (SSLSocket client = (SSLSocket)sslContext.getSocketFactory().createSocket(address.getAddress(), address.getPort()))
-        {
-            client.setUseClientMode(true);
-            client.setSoTimeout(5000);
-
-            ALPN.put(client, new ALPN.ClientProvider()
-            {
-                @Override
-                public void unsupported()
-                {
-                }
-
-                @Override
-                public List<String> protocols()
-                {
-                    return null;
-                }
-
-                @Override
-                public void selected(String s)
-                {
-                }
-            });
-
-            client.startHandshake();
-
-            // Verify that the server really speaks http/1.1
-
-            OutputStream output = client.getOutputStream();
-            output.write(("" +
-                    "GET / HTTP/1.1\r\n" +
-                    "Host: localhost:" + address.getPort() + "\r\n" +
-                    "\r\n" +
-                    "").getBytes(StandardCharsets.UTF_8));
-            output.flush();
-
-            InputStream input = client.getInputStream();
-            BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
-            String line = reader.readLine();
-            Assert.assertTrue(line.contains(" 404 "));
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-alpn-tests/src/test/java/org/eclipse/jetty/spdy/server/ALPNSynReplyTest.java b/jetty-spdy/spdy-alpn-tests/src/test/java/org/eclipse/jetty/spdy/server/ALPNSynReplyTest.java
deleted file mode 100644
index f9ca24f..0000000
--- a/jetty-spdy/spdy-alpn-tests/src/test/java/org/eclipse/jetty/spdy/server/ALPNSynReplyTest.java
+++ /dev/null
@@ -1,149 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server;
-
-import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
-import java.nio.channels.SocketChannel;
-import java.util.Arrays;
-import java.util.List;
-import javax.net.ssl.SSLEngine;
-
-import org.eclipse.jetty.alpn.ALPN;
-import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class ALPNSynReplyTest extends AbstractALPNTest
-{
-    @Test
-    public void testGentleCloseDuringHandshake() throws Exception
-    {
-        InetSocketAddress address = prepare();
-        SslContextFactory sslContextFactory = newSslContextFactory();
-        sslContextFactory.start();
-        SSLEngine sslEngine = sslContextFactory.newSSLEngine(address);
-        sslEngine.setUseClientMode(true);
-        ALPN.put(sslEngine, new ALPN.ClientProvider()
-        {
-            @Override
-            public void unsupported()
-            {
-            }
-
-            @Override
-            public List<String> protocols()
-            {
-                return Arrays.asList("test");
-            }
-
-            @Override
-            public void selected(String protocol)
-            {
-            }
-        });
-        sslEngine.beginHandshake();
-
-        ByteBuffer encrypted = ByteBuffer.allocate(sslEngine.getSession().getPacketBufferSize());
-        sslEngine.wrap(BufferUtil.EMPTY_BUFFER, encrypted);
-        encrypted.flip();
-
-        try (SocketChannel channel = SocketChannel.open(address))
-        {
-            // Send ClientHello, immediately followed by TLS Close Alert and then by FIN
-            channel.write(encrypted);
-            sslEngine.closeOutbound();
-            encrypted.clear();
-            sslEngine.wrap(BufferUtil.EMPTY_BUFFER, encrypted);
-            encrypted.flip();
-            channel.write(encrypted);
-            channel.shutdownOutput();
-
-            // Read ServerHello from server
-            encrypted.clear();
-            int read = channel.read(encrypted);
-            encrypted.flip();
-            Assert.assertTrue(read > 0);
-            // Cannot decrypt, as the SSLEngine has been already closed
-
-            // Now if we read more, we should either read the TLS Close Alert, or directly -1
-            encrypted.clear();
-            read = channel.read(encrypted);
-            // Sending a TLS Close Alert during handshake results in an exception when
-            // unwrapping that the server react to by closing the connection abruptly.
-            Assert.assertTrue(read < 0);
-        }
-    }
-
-    @Test
-    public void testAbruptCloseDuringHandshake() throws Exception
-    {
-        InetSocketAddress address = prepare();
-        SslContextFactory sslContextFactory = newSslContextFactory();
-        sslContextFactory.start();
-        SSLEngine sslEngine = sslContextFactory.newSSLEngine(address);
-        sslEngine.setUseClientMode(true);
-        ALPN.put(sslEngine, new ALPN.ClientProvider()
-        {
-            @Override
-            public void unsupported()
-            {
-            }
-
-            @Override
-            public List<String> protocols()
-            {
-                return Arrays.asList("test");
-            }
-
-            @Override
-            public void selected(String s)
-            {
-            }
-        });
-        sslEngine.beginHandshake();
-
-        ByteBuffer encrypted = ByteBuffer.allocate(sslEngine.getSession().getPacketBufferSize());
-        sslEngine.wrap(BufferUtil.EMPTY_BUFFER, encrypted);
-        encrypted.flip();
-
-        try (SocketChannel channel = SocketChannel.open(address))
-        {
-            // Send ClientHello, immediately followed by FIN (no TLS Close Alert)
-            channel.write(encrypted);
-            channel.shutdownOutput();
-
-            // Read ServerHello from server
-            encrypted.clear();
-            int read = channel.read(encrypted);
-            encrypted.flip();
-            Assert.assertTrue(read > 0);
-            ByteBuffer decrypted = ByteBuffer.allocate(sslEngine.getSession().getApplicationBufferSize());
-            sslEngine.unwrap(encrypted, decrypted);
-
-            // Now if we read more, we should either read the TLS Close Alert, or directly -1
-            encrypted.clear();
-            read = channel.read(encrypted);
-            // Since we have close the connection abruptly, the server also does so
-            Assert.assertTrue(read < 0);
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-alpn-tests/src/test/java/org/eclipse/jetty/spdy/server/AbstractALPNTest.java b/jetty-spdy/spdy-alpn-tests/src/test/java/org/eclipse/jetty/spdy/server/AbstractALPNTest.java
deleted file mode 100644
index 48d046d..0000000
--- a/jetty-spdy/spdy-alpn-tests/src/test/java/org/eclipse/jetty/spdy/server/AbstractALPNTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server;
-
-import java.net.InetSocketAddress;
-
-import org.eclipse.jetty.alpn.ALPN;
-import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.spdy.client.SPDYClient;
-import org.eclipse.jetty.toolchain.test.TestTracker;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.junit.After;
-import org.junit.Rule;
-
-public class AbstractALPNTest
-{
-    @Rule
-    public final TestTracker tracker = new TestTracker();
-    protected Server server;
-    protected SPDYServerConnector connector;
-    protected SPDYClient.Factory clientFactory;
-
-    protected InetSocketAddress prepare() throws Exception
-    {
-        server = new Server();
-        connector = new SPDYServerConnector(server, newSslContextFactory(), null, new ALPNServerConnectionFactory("spdy/3", "spdy/2", "http/1.1"));
-        connector.setPort(0);
-        connector.setIdleTimeout(30000);
-        server.addConnector(connector);
-        server.start();
-
-        QueuedThreadPool threadPool = new QueuedThreadPool();
-        threadPool.setName(threadPool.getName() + "-client");
-        clientFactory = new SPDYClient.Factory(threadPool);
-        clientFactory.start();
-
-        ALPN.debug = true;
-
-        return new InetSocketAddress("localhost", connector.getLocalPort());
-    }
-
-    protected SslContextFactory newSslContextFactory()
-    {
-        SslContextFactory sslContextFactory = new SslContextFactory();
-        sslContextFactory.setKeyStorePath("src/test/resources/keystore.jks");
-        sslContextFactory.setKeyStorePassword("storepwd");
-        sslContextFactory.setTrustStorePath("src/test/resources/truststore.jks");
-        sslContextFactory.setTrustStorePassword("storepwd");
-        sslContextFactory.setProtocol("TLSv1");
-        sslContextFactory.setIncludeProtocols("TLSv1");
-        return sslContextFactory;
-    }
-
-    @After
-    public void dispose() throws Exception
-    {
-        clientFactory.stop();
-        server.stop();
-    }
-}
diff --git a/jetty-spdy/spdy-alpn-tests/src/test/resources/jetty-logging.properties b/jetty-spdy/spdy-alpn-tests/src/test/resources/jetty-logging.properties
deleted file mode 100644
index ead13ec..0000000
--- a/jetty-spdy/spdy-alpn-tests/src/test/resources/jetty-logging.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
-#org.eclipse.jetty.spdy.LEVEL=DEBUG
diff --git a/jetty-spdy/spdy-client/pom.xml b/jetty-spdy/spdy-client/pom.xml
deleted file mode 100644
index 406ea8e..0000000
--- a/jetty-spdy/spdy-client/pom.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.eclipse.jetty.spdy</groupId>
-        <artifactId>spdy-parent</artifactId>
-        <version>9.2.14-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>spdy-client</artifactId>
-    <name>Jetty :: SPDY :: Client Binding</name>
-
-    <properties>
-        <bundle-symbolic-name>${project.groupId}.client</bundle-symbolic-name>
-    </properties>
-
-    <url>http://www.eclipse.org/jetty</url>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>manifest</goal>
-                        </goals>
-                        <configuration>
-                            <instructions>
-                                <Export-Package>org.eclipse.jetty.spdy.client;version="9.1"</Export-Package>
-                                <Import-Package>!org.eclipse.jetty.npn,!org.eclipse.jetty.alpn,org.eclipse.jetty.*;version="[9.0,10.0)",*</Import-Package>
-                            </instructions>
-                          </configuration>
-                       </execution>
-                  </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.eclipse.jetty.spdy</groupId>
-            <artifactId>spdy-core</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-alpn-client</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.alpn</groupId>
-            <artifactId>alpn-api</artifactId>
-            <version>${alpn.api.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.npn</groupId>
-            <artifactId>npn-api</artifactId>
-            <version>${npn.api.version}</version>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/FlowControlStrategyFactory.java b/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/FlowControlStrategyFactory.java
deleted file mode 100644
index b5fbb5c..0000000
--- a/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/FlowControlStrategyFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.client;
-
-import org.eclipse.jetty.spdy.FlowControlStrategy;
-import org.eclipse.jetty.spdy.SPDYv3FlowControlStrategy;
-import org.eclipse.jetty.spdy.api.SPDY;
-
-public class FlowControlStrategyFactory
-{
-    private FlowControlStrategyFactory()
-    {
-    }
-
-    public static FlowControlStrategy newFlowControlStrategy(short version)
-    {
-        switch (version)
-        {
-            case SPDY.V2:
-                return new FlowControlStrategy.None();
-            case SPDY.V3:
-                return new SPDYv3FlowControlStrategy();
-            default:
-                throw new IllegalStateException();
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/NPNClientConnection.java b/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/NPNClientConnection.java
deleted file mode 100644
index c742248..0000000
--- a/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/NPNClientConnection.java
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.client;
-
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Executor;
-import javax.net.ssl.SSLEngine;
-
-import org.eclipse.jetty.io.ClientConnectionFactory;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.io.NegotiatingClientConnection;
-import org.eclipse.jetty.npn.NextProtoNego;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-public class NPNClientConnection extends NegotiatingClientConnection implements NextProtoNego.ClientProvider
-{
-    private static final Logger LOG = Log.getLogger(NPNClientConnection.class);
-
-    private final String protocol;
-
-    public NPNClientConnection(EndPoint endPoint, Executor executor, ClientConnectionFactory connectionFactory, SSLEngine sslEngine, Map<String, Object> context, String protocol)
-    {
-        super(endPoint, executor, sslEngine, connectionFactory, context);
-        this.protocol = protocol;
-        NextProtoNego.put(sslEngine, this);
-    }
-
-    @Override
-    public boolean supports()
-    {
-        return true;
-    }
-
-    @Override
-    public void unsupported()
-    {
-        NextProtoNego.remove(getSSLEngine());
-        completed();
-    }
-
-    @Override
-    public String selectProtocol(List<String> protocols)
-    {
-        if (protocols.contains(protocol))
-        {
-            NextProtoNego.remove(getSSLEngine());
-            completed();
-            return protocol;
-        }
-        else
-        {
-            LOG.info("Could not negotiate protocol: server {} - client {}", protocols, protocol);
-            close();
-            return null;
-        }
-    }
-
-    @Override
-    public void close()
-    {
-        NextProtoNego.remove(getSSLEngine());
-        super.close();
-    }
-}
diff --git a/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/NPNClientConnectionFactory.java b/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/NPNClientConnectionFactory.java
deleted file mode 100644
index 208002e..0000000
--- a/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/NPNClientConnectionFactory.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.client;
-
-import java.io.IOException;
-import java.util.Map;
-import java.util.concurrent.Executor;
-import javax.net.ssl.SSLEngine;
-
-import org.eclipse.jetty.io.ClientConnectionFactory;
-import org.eclipse.jetty.io.Connection;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.io.NegotiatingClientConnectionFactory;
-import org.eclipse.jetty.io.ssl.SslClientConnectionFactory;
-
-public class NPNClientConnectionFactory extends NegotiatingClientConnectionFactory
-{
-    private final Executor executor;
-    private final String protocol;
-
-    public NPNClientConnectionFactory(Executor executor, ClientConnectionFactory connectionFactory, String protocol)
-    {
-        super(connectionFactory);
-        this.executor = executor;
-        this.protocol = protocol;
-    }
-
-    @Override
-    public Connection newConnection(EndPoint endPoint, Map<String, Object> context) throws IOException
-    {
-        return new NPNClientConnection(endPoint, executor, getClientConnectionFactory(),
-                (SSLEngine)context.get(SslClientConnectionFactory.SSL_ENGINE_CONTEXT_KEY), context, protocol);
-    }
-}
diff --git a/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/SPDYClient.java b/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/SPDYClient.java
deleted file mode 100644
index aa21105..0000000
--- a/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/SPDYClient.java
+++ /dev/null
@@ -1,440 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.client;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
-import java.nio.channels.SelectionKey;
-import java.nio.channels.SocketChannel;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Queue;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executor;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.io.ClientConnectionFactory;
-import org.eclipse.jetty.io.Connection;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.io.NegotiatingClientConnectionFactory;
-import org.eclipse.jetty.io.SelectChannelEndPoint;
-import org.eclipse.jetty.io.SelectorManager;
-import org.eclipse.jetty.io.ssl.SslClientConnectionFactory;
-import org.eclipse.jetty.spdy.FlowControlStrategy;
-import org.eclipse.jetty.spdy.api.GoAwayInfo;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.FuturePromise;
-import org.eclipse.jetty.util.Promise;
-import org.eclipse.jetty.util.component.ContainerLifeCycle;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.eclipse.jetty.util.thread.ScheduledExecutorScheduler;
-import org.eclipse.jetty.util.thread.Scheduler;
-
-/**
- * A {@link SPDYClient} allows applications to connect to one or more SPDY servers,
- * obtaining {@link Session} objects that can be used to send/receive SPDY frames.
- * <p/>
- * {@link SPDYClient} instances are created through a {@link Factory}:
- * <pre>
- * SPDYClient.Factory factory = new SPDYClient.Factory();
- * SPDYClient client = factory.newSPDYClient(SPDY.V3);
- * </pre>
- * and then used to connect to the server:
- * <pre>
- * FuturePromise&lt;Session&gt; promise = new FuturePromise&lt;&gt;();
- * client.connect("server.com", null, promise);
- * Session session = promise.get();
- * </pre>
- */
-public class SPDYClient
-{
-    private final short version;
-    private final Factory factory;
-    private volatile SocketAddress bindAddress;
-    private volatile long idleTimeout = -1;
-    private volatile int initialWindowSize;
-    private volatile boolean dispatchIO;
-    private volatile ClientConnectionFactory connectionFactory;
-
-    protected SPDYClient(short version, Factory factory)
-    {
-        this.version = version;
-        this.factory = factory;
-        setInitialWindowSize(65536);
-        setDispatchIO(true);
-    }
-
-    public short getVersion()
-    {
-        return version;
-    }
-
-    public Factory getFactory()
-    {
-        return factory;
-    }
-
-    /**
-     * Equivalent to:
-     * <pre>
-     * Future&lt;Session&gt; promise = new FuturePromise&lt;&gt;();
-     * connect(address, listener, promise);
-     * </pre>
-     *
-     * @param address  the address to connect to
-     * @param listener the session listener that will be notified of session events
-     * @return a {@link Session} when connected
-     */
-    public Session connect(SocketAddress address, SessionFrameListener listener) throws ExecutionException, InterruptedException
-    {
-        FuturePromise<Session> promise = new FuturePromise<>();
-        connect(address, listener, promise);
-        return promise.get();
-    }
-
-    /**
-     * Equivalent to:
-     * <pre>
-     * connect(address, listener, promise, null);
-     * </pre>
-     *
-     * @param address  the address to connect to
-     * @param listener the session listener that will be notified of session events
-     * @param promise  the promise notified of connection success/failure
-     */
-    public void connect(SocketAddress address, SessionFrameListener listener, Promise<Session> promise)
-    {
-        connect(address, listener, promise, new HashMap<String, Object>());
-    }
-
-    /**
-     * Connects to the given {@code address}, binding the given {@code listener} to session events,
-     * and notified the given {@code promise} of the connect result.
-     * <p/>
-     * If the connect operation is successful, the {@code promise} will be invoked with the {@link Session}
-     * object that applications can use to perform SPDY requests.
-     *
-     * @param address  the address to connect to
-     * @param listener the session listener that will be notified of session events
-     * @param promise  the promise notified of connection success/failure
-     * @param context  a context object passed to the {@link #getClientConnectionFactory() ConnectionFactory}
-     *                 for the creation of the connection
-     */
-    public void connect(final SocketAddress address, final SessionFrameListener listener, final Promise<Session> promise, Map<String, Object> context)
-    {
-        if (!factory.isStarted())
-            throw new IllegalStateException(Factory.class.getSimpleName() + " is not started");
-
-        try
-        {
-            SocketChannel channel = SocketChannel.open();
-            if (bindAddress != null)
-                channel.bind(bindAddress);
-            configure(channel);
-            channel.configureBlocking(false);
-
-            context.put(SslClientConnectionFactory.SSL_PEER_HOST_CONTEXT_KEY, ((InetSocketAddress)address).getHostString());
-            context.put(SslClientConnectionFactory.SSL_PEER_PORT_CONTEXT_KEY, ((InetSocketAddress)address).getPort());
-            context.put(SPDYClientConnectionFactory.SPDY_CLIENT_CONTEXT_KEY, this);
-            context.put(SPDYClientConnectionFactory.SPDY_SESSION_LISTENER_CONTEXT_KEY, listener);
-            context.put(SPDYClientConnectionFactory.SPDY_SESSION_PROMISE_CONTEXT_KEY, promise);
-
-            if (channel.connect(address))
-                factory.selector.accept(channel, context);
-            else
-                factory.selector.connect(channel, context);
-        }
-        catch (IOException x)
-        {
-            promise.failed(x);
-        }
-    }
-
-    protected void configure(SocketChannel channel) throws IOException
-    {
-        channel.socket().setTcpNoDelay(true);
-    }
-
-    /**
-     * @return the address to bind the socket channel to
-     * @see #setBindAddress(SocketAddress)
-     */
-    public SocketAddress getBindAddress()
-    {
-        return bindAddress;
-    }
-
-    /**
-     * @param bindAddress the address to bind the socket channel to
-     * @see #getBindAddress()
-     */
-    public void setBindAddress(SocketAddress bindAddress)
-    {
-        this.bindAddress = bindAddress;
-    }
-
-    public long getIdleTimeout()
-    {
-        return idleTimeout;
-    }
-
-    public void setIdleTimeout(long idleTimeout)
-    {
-        this.idleTimeout = idleTimeout;
-    }
-
-    public int getInitialWindowSize()
-    {
-        return initialWindowSize;
-    }
-
-    public void setInitialWindowSize(int initialWindowSize)
-    {
-        this.initialWindowSize = initialWindowSize;
-    }
-
-    public boolean isDispatchIO()
-    {
-        return dispatchIO;
-    }
-
-    public void setDispatchIO(boolean dispatchIO)
-    {
-        this.dispatchIO = dispatchIO;
-    }
-
-    public ClientConnectionFactory getClientConnectionFactory()
-    {
-        return connectionFactory;
-    }
-
-    public void setClientConnectionFactory(ClientConnectionFactory connectionFactory)
-    {
-        this.connectionFactory = connectionFactory;
-    }
-
-    protected FlowControlStrategy newFlowControlStrategy()
-    {
-        return FlowControlStrategyFactory.newFlowControlStrategy(version);
-    }
-
-    public static class Factory extends ContainerLifeCycle
-    {
-        private final Queue<Session> sessions = new ConcurrentLinkedQueue<>();
-        private final Scheduler scheduler;
-        private final Executor executor;
-        private final ByteBufferPool bufferPool;
-        private final SslContextFactory sslContextFactory;
-        private final SelectorManager selector;
-        private final long idleTimeout;
-        private long connectTimeout;
-
-        public Factory()
-        {
-            this(null, null);
-        }
-
-        public Factory(SslContextFactory sslContextFactory)
-        {
-            this(null, null, sslContextFactory);
-        }
-
-        public Factory(Executor executor)
-        {
-            this(executor, null);
-        }
-
-        public Factory(Executor executor, Scheduler scheduler)
-        {
-            this(executor, scheduler, null);
-        }
-
-        public Factory(Executor executor, Scheduler scheduler, SslContextFactory sslContextFactory)
-        {
-            this(executor, scheduler, sslContextFactory, 30000);
-        }
-
-        public Factory(Executor executor, Scheduler scheduler, SslContextFactory sslContextFactory, long idleTimeout)
-        {
-            this(executor, scheduler, null, sslContextFactory, idleTimeout);
-        }
-
-        public Factory(Executor executor, Scheduler scheduler, ByteBufferPool bufferPool, SslContextFactory sslContextFactory, long idleTimeout)
-        {
-            this.idleTimeout = idleTimeout;
-            setConnectTimeout(15000);
-
-            if (executor == null)
-                executor = new QueuedThreadPool();
-            this.executor = executor;
-            addBean(executor);
-
-            if (scheduler == null)
-                scheduler = new ScheduledExecutorScheduler();
-            this.scheduler = scheduler;
-            addBean(scheduler);
-
-            if (bufferPool == null)
-                bufferPool = new MappedByteBufferPool();
-            this.bufferPool = bufferPool;
-            addBean(bufferPool);
-
-            this.sslContextFactory = sslContextFactory;
-            if (sslContextFactory != null)
-                addBean(sslContextFactory);
-
-            selector = new ClientSelectorManager(executor, scheduler);
-            selector.setConnectTimeout(getConnectTimeout());
-            addBean(selector);
-        }
-
-        public ByteBufferPool getByteBufferPool()
-        {
-            return bufferPool;
-        }
-
-        public Scheduler getScheduler()
-        {
-            return scheduler;
-        }
-
-        public Executor getExecutor()
-        {
-            return executor;
-        }
-
-        public SslContextFactory getSslContextFactory()
-        {
-            return sslContextFactory;
-        }
-
-        public long getConnectTimeout()
-        {
-            return connectTimeout;
-        }
-
-        public void setConnectTimeout(long connectTimeout)
-        {
-            this.connectTimeout = connectTimeout;
-        }
-
-        public SPDYClient newSPDYClient(short version)
-        {
-            return newSPDYClient(version, new NPNClientConnectionFactory(getExecutor(), new SPDYClientConnectionFactory(), "spdy/" + version));
-        }
-
-        public SPDYClient newSPDYClient(short version, NegotiatingClientConnectionFactory negotiatingFactory)
-        {
-            SPDYClient client = new SPDYClient(version, this);
-
-            ClientConnectionFactory connectionFactory = negotiatingFactory.getClientConnectionFactory();
-            if (sslContextFactory != null)
-                connectionFactory = new SslClientConnectionFactory(getSslContextFactory(), getByteBufferPool(), getExecutor(), negotiatingFactory);
-
-            client.setClientConnectionFactory(connectionFactory);
-            return client;
-        }
-
-        @Override
-        protected void doStop() throws Exception
-        {
-            closeConnections();
-            super.doStop();
-        }
-
-        boolean sessionOpened(Session session)
-        {
-            // Add sessions only if the factory is not stopping
-            return isRunning() && sessions.offer(session);
-        }
-
-        boolean sessionClosed(Session session)
-        {
-            // Remove sessions only if the factory is not stopping
-            // to avoid concurrent removes during iterations
-            return isRunning() && sessions.remove(session);
-        }
-
-        private void closeConnections()
-        {
-            for (Session session : sessions)
-                session.goAway(new GoAwayInfo(), Callback.Adapter.INSTANCE);
-            sessions.clear();
-        }
-
-        public Collection<Session> getSessions()
-        {
-            return Collections.unmodifiableCollection(sessions);
-        }
-
-        @Override
-        protected void dumpThis(Appendable out) throws IOException
-        {
-            super.dumpThis(out);
-            dump(out, "", sessions);
-        }
-
-        private class ClientSelectorManager extends SelectorManager
-        {
-            private ClientSelectorManager(Executor executor, Scheduler scheduler)
-            {
-                super(executor, scheduler);
-            }
-
-            @Override
-            protected EndPoint newEndPoint(SocketChannel channel, ManagedSelector selectSet, SelectionKey key) throws IOException
-            {
-                @SuppressWarnings("unchecked")
-                Map<String, Object> context = (Map<String, Object>)key.attachment();
-                SPDYClient client = (SPDYClient)context.get(SPDYClientConnectionFactory.SPDY_CLIENT_CONTEXT_KEY);
-                long clientIdleTimeout = client.getIdleTimeout();
-                if (clientIdleTimeout < 0)
-                    clientIdleTimeout = idleTimeout;
-                return new SelectChannelEndPoint(channel, selectSet, key, getScheduler(), clientIdleTimeout);
-            }
-
-            @Override
-            public Connection newConnection(SocketChannel channel, EndPoint endPoint, Object attachment) throws IOException
-            {
-                @SuppressWarnings("unchecked")
-                Map<String, Object> context = (Map<String, Object>)attachment;
-                try
-                {
-                    SPDYClient client = (SPDYClient)context.get(SPDYClientConnectionFactory.SPDY_CLIENT_CONTEXT_KEY);
-                    return client.getClientConnectionFactory().newConnection(endPoint, context);
-                }
-                catch (Throwable x)
-                {
-                    @SuppressWarnings("unchecked")
-                    Promise<Session> promise = (Promise<Session>)context.get(SPDYClientConnectionFactory.SPDY_SESSION_PROMISE_CONTEXT_KEY);
-                    promise.failed(x);
-                    throw x;
-                }
-            }
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/SPDYClientConnectionFactory.java b/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/SPDYClientConnectionFactory.java
deleted file mode 100644
index bf43362..0000000
--- a/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/SPDYClientConnectionFactory.java
+++ /dev/null
@@ -1,98 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.client;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.io.ClientConnectionFactory;
-import org.eclipse.jetty.io.Connection;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.spdy.CompressionFactory;
-import org.eclipse.jetty.spdy.FlowControlStrategy;
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.StandardSession;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.client.SPDYClient.Factory;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.spdy.parser.Parser;
-import org.eclipse.jetty.util.Promise;
-
-public class SPDYClientConnectionFactory implements ClientConnectionFactory
-{
-    public static final String SPDY_CLIENT_CONTEXT_KEY = "spdy.client";
-    public static final String SPDY_SESSION_LISTENER_CONTEXT_KEY = "spdy.session.listener";
-    public static final String SPDY_SESSION_PROMISE_CONTEXT_KEY = "spdy.session.promise";
-
-    @Override
-    public Connection newConnection(EndPoint endPoint, Map<String, Object> context) throws IOException
-    {
-        SPDYClient client = (SPDYClient)context.get(SPDY_CLIENT_CONTEXT_KEY);
-        SPDYClient.Factory factory = client.getFactory();
-        ByteBufferPool byteBufferPool = factory.getByteBufferPool();
-        CompressionFactory compressionFactory = new StandardCompressionFactory();
-        Parser parser = new Parser(compressionFactory.newDecompressor());
-        Generator generator = new Generator(byteBufferPool, compressionFactory.newCompressor());
-
-        SPDYConnection connection = new ClientSPDYConnection(endPoint, byteBufferPool, parser, factory, client.isDispatchIO());
-
-        FlowControlStrategy flowControlStrategy = client.newFlowControlStrategy();
-
-        SessionFrameListener listener = (SessionFrameListener)context.get(SPDY_SESSION_LISTENER_CONTEXT_KEY);
-        StandardSession session = new StandardSession(client.getVersion(), byteBufferPool,
-                factory.getScheduler(), connection, endPoint, connection, 1, listener, generator, flowControlStrategy);
-
-        session.setWindowSize(client.getInitialWindowSize());
-        parser.addListener(session);
-        connection.setSession(session);
-
-        @SuppressWarnings("unchecked")
-        Promise<Session> promise = (Promise<Session>)context.get(SPDY_SESSION_PROMISE_CONTEXT_KEY);
-        promise.succeeded(session);
-
-        return connection;
-    }
-
-    private class ClientSPDYConnection extends SPDYConnection
-    {
-        private final Factory factory;
-
-        public ClientSPDYConnection(EndPoint endPoint, ByteBufferPool bufferPool, Parser parser, Factory factory, boolean dispatchIO)
-        {
-            super(endPoint, bufferPool, parser, factory.getExecutor(), dispatchIO);
-            this.factory = factory;
-        }
-
-        @Override
-        public void onOpen()
-        {
-            super.onOpen();
-            factory.sessionOpened(getSession());
-        }
-
-        @Override
-        public void onClose()
-        {
-            super.onClose();
-            factory.sessionClosed(getSession());
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/SPDYConnection.java b/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/SPDYConnection.java
deleted file mode 100644
index 18264f2..0000000
--- a/jetty-spdy/spdy-client/src/main/java/org/eclipse/jetty/spdy/client/SPDYConnection.java
+++ /dev/null
@@ -1,191 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.client;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.concurrent.Executor;
-
-import org.eclipse.jetty.io.AbstractConnection;
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.io.RuntimeIOException;
-import org.eclipse.jetty.spdy.Controller;
-import org.eclipse.jetty.spdy.ISession;
-import org.eclipse.jetty.spdy.IdleListener;
-import org.eclipse.jetty.spdy.api.GoAwayInfo;
-import org.eclipse.jetty.spdy.parser.Parser;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-public class SPDYConnection extends AbstractConnection implements Controller, IdleListener
-{
-    private static final Logger LOG = Log.getLogger(SPDYConnection.class);
-    private final ByteBufferPool bufferPool;
-    private final Parser parser;
-    private final int bufferSize;
-    private volatile ISession session;
-    private volatile boolean idle = false;
-
-    public SPDYConnection(EndPoint endPoint, ByteBufferPool bufferPool, Parser parser, Executor executor, boolean dispatchIO)
-    {
-        this(endPoint, bufferPool, parser, executor, dispatchIO, 8192);
-    }
-
-    public SPDYConnection(EndPoint endPoint, ByteBufferPool bufferPool, Parser parser, Executor executor, boolean dispatchIO, int bufferSize)
-    {
-        // Since SPDY is multiplexed, onFillable() must never block while calling application code. In fact,
-        // the SPDY code always dispatches to a new thread when calling application code,
-        // so here we can safely pass false as last parameter, and avoid to dispatch to onFillable().
-        // The IO operation (read, parse, etc.) will not block and will be fast in almost all cases.
-        // Big uploads to a server, however, might occupy the Selector thread for a long time and
-        // therefore starve other connections, so by default dispatchIO is true.
-        super(endPoint, executor, dispatchIO);
-        this.bufferPool = bufferPool;
-        this.parser = parser;
-        onIdle(true);
-        this.bufferSize = bufferSize;
-    }
-
-    @Override
-    public void onOpen()
-    {
-        super.onOpen();
-        fillInterested();
-    }
-
-    @Override
-    public void onFillable()
-    {
-        ByteBuffer buffer = bufferPool.acquire(bufferSize, false);
-        boolean readMore = read(buffer) == 0;
-        bufferPool.release(buffer);
-        if (readMore)
-            fillInterested();
-    }
-
-    protected int read(ByteBuffer buffer)
-    {
-        EndPoint endPoint = getEndPoint();
-        while (true)
-        {
-            int filled = fill(endPoint, buffer);
-            if (LOG.isDebugEnabled()) // Avoid boxing of variable 'filled'
-                LOG.debug("Read {} bytes", filled);
-            if (filled == 0)
-            {
-                return 0;
-            }
-            else if (filled < 0)
-            {
-                shutdown(session);
-                return -1;
-            }
-            else
-            {
-                parser.parse(buffer);
-            }
-        }
-    }
-
-    private int fill(EndPoint endPoint, ByteBuffer buffer)
-    {
-        try
-        {
-            if (endPoint.isInputShutdown())
-                return -1;
-            return endPoint.fill(buffer);
-        }
-        catch (IOException x)
-        {
-            endPoint.close();
-            throw new RuntimeIOException(x);
-        }
-    }
-
-    @Override
-    public void write(final Callback callback, ByteBuffer... buffers)
-    {
-        EndPoint endPoint = getEndPoint();
-        endPoint.write(callback, buffers);
-    }
-
-    @Override
-    public void close()
-    {
-        goAway(session);
-    }
-
-    @Override
-    public void close(boolean onlyOutput)
-    {
-        EndPoint endPoint = getEndPoint();
-        // We need to gently close first, to allow
-        // SSL close alerts to be sent by Jetty
-        if (LOG.isDebugEnabled())
-            LOG.debug("Shutting down output {}", endPoint);
-        endPoint.shutdownOutput();
-        if (!onlyOutput)
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Closing {}", endPoint);
-            endPoint.close();
-        }
-    }
-
-    @Override
-    public void onIdle(boolean idle)
-    {
-        this.idle = idle;
-    }
-
-    @Override
-    protected boolean onReadTimeout()
-    {
-        boolean idle = this.idle;
-        if (LOG.isDebugEnabled())
-            LOG.debug("Idle timeout on {}, idle={}", this, idle);
-        if (idle)
-            goAway(session);
-        return false;
-    }
-
-    protected void goAway(ISession session)
-    {
-        if (session != null)
-            session.goAway(new GoAwayInfo(), Callback.Adapter.INSTANCE);
-    }
-
-    private void shutdown(ISession session)
-    {
-        if (session != null && !getEndPoint().isOutputShutdown())
-            session.shutdown();
-    }
-
-    protected ISession getSession()
-    {
-        return session;
-    }
-
-    public void setSession(ISession session)
-    {
-        this.session = session;
-    }
-}
diff --git a/jetty-spdy/spdy-core/pom.xml b/jetty-spdy/spdy-core/pom.xml
deleted file mode 100644
index 62f69d3..0000000
--- a/jetty-spdy/spdy-core/pom.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.eclipse.jetty.spdy</groupId>
-        <artifactId>spdy-parent</artifactId>
-        <version>9.2.14-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>spdy-core</artifactId>
-    <name>Jetty :: SPDY :: Core</name>
-
-    <properties>
-        <bundle-symbolic-name>${project.groupId}.core</bundle-symbolic-name>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-util</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-io</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-core</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/CompressionDictionary.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/CompressionDictionary.java
deleted file mode 100644
index b752d6f..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/CompressionDictionary.java
+++ /dev/null
@@ -1,87 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy;
-
-import org.eclipse.jetty.spdy.api.SPDY;
-
-public class CompressionDictionary
-{
-    private static final byte[] DICTIONARY_V2 = ("" +
-            "optionsgetheadpostputdeletetraceacceptaccept-charsetaccept-encodingaccept-" +
-            "languageauthorizationexpectfromhostif-modified-sinceif-matchif-none-matchi" +
-            "f-rangeif-unmodifiedsincemax-forwardsproxy-authorizationrangerefererteuser" +
-            "-agent10010120020120220320420520630030130230330430530630740040140240340440" +
-            "5406407408409410411412413414415416417500501502503504505accept-rangesageeta" +
-            "glocationproxy-authenticatepublicretry-afterservervarywarningwww-authentic" +
-            "ateallowcontent-basecontent-encodingcache-controlconnectiondatetrailertran" +
-            "sfer-encodingupgradeviawarningcontent-languagecontent-lengthcontent-locati" +
-            "oncontent-md5content-rangecontent-typeetagexpireslast-modifiedset-cookieMo" +
-            "ndayTuesdayWednesdayThursdayFridaySaturdaySundayJanFebMarAprMayJunJulAugSe" +
-            "pOctNovDecchunkedtext/htmlimage/pngimage/jpgimage/gifapplication/xmlapplic" +
-            "ation/xhtmltext/plainpublicmax-agecharset=iso-8859-1utf-8gzipdeflateHTTP/1" +
-            ".1statusversionurl" +
-            // Must be NUL terminated
-            "\u0000").getBytes();
-
-    private static final byte[] DICTIONARY_V3 = ("" +
-            "\u0000\u0000\u0000\u0007options\u0000\u0000\u0000\u0004head\u0000\u0000\u0000\u0004post" +
-            "\u0000\u0000\u0000\u0003put\u0000\u0000\u0000\u0006delete\u0000\u0000\u0000\u0005trace" +
-            "\u0000\u0000\u0000\u0006accept\u0000\u0000\u0000\u000Eaccept-charset" +
-            "\u0000\u0000\u0000\u000Faccept-encoding\u0000\u0000\u0000\u000Faccept-language" +
-            "\u0000\u0000\u0000\raccept-ranges\u0000\u0000\u0000\u0003age\u0000\u0000\u0000\u0005allow" +
-            "\u0000\u0000\u0000\rauthorization\u0000\u0000\u0000\rcache-control" +
-            "\u0000\u0000\u0000\nconnection\u0000\u0000\u0000\fcontent-base\u0000\u0000\u0000\u0010content-encoding" +
-            "\u0000\u0000\u0000\u0010content-language\u0000\u0000\u0000\u000Econtent-length" +
-            "\u0000\u0000\u0000\u0010content-location\u0000\u0000\u0000\u000Bcontent-md5" +
-            "\u0000\u0000\u0000\rcontent-range\u0000\u0000\u0000\fcontent-type\u0000\u0000\u0000\u0004date" +
-            "\u0000\u0000\u0000\u0004etag\u0000\u0000\u0000\u0006expect\u0000\u0000\u0000\u0007expires" +
-            "\u0000\u0000\u0000\u0004from\u0000\u0000\u0000\u0004host\u0000\u0000\u0000\bif-match" +
-            "\u0000\u0000\u0000\u0011if-modified-since\u0000\u0000\u0000\rif-none-match\u0000\u0000\u0000\bif-range" +
-            "\u0000\u0000\u0000\u0013if-unmodified-since\u0000\u0000\u0000\rlast-modified" +
-            "\u0000\u0000\u0000\blocation\u0000\u0000\u0000\fmax-forwards\u0000\u0000\u0000\u0006pragma" +
-            "\u0000\u0000\u0000\u0012proxy-authenticate\u0000\u0000\u0000\u0013proxy-authorization" +
-            "\u0000\u0000\u0000\u0005range\u0000\u0000\u0000\u0007referer\u0000\u0000\u0000\u000Bretry-after" +
-            "\u0000\u0000\u0000\u0006server\u0000\u0000\u0000\u0002te\u0000\u0000\u0000\u0007trailer" +
-            "\u0000\u0000\u0000\u0011transfer-encoding\u0000\u0000\u0000\u0007upgrade\u0000\u0000\u0000\nuser-agent" +
-            "\u0000\u0000\u0000\u0004vary\u0000\u0000\u0000\u0003via\u0000\u0000\u0000\u0007warning" +
-            "\u0000\u0000\u0000\u0010www-authenticate\u0000\u0000\u0000\u0006method\u0000\u0000\u0000\u0003get" +
-            "\u0000\u0000\u0000\u0006status\u0000\u0000\u0000\u0006200 OK\u0000\u0000\u0000\u0007version" +
-            "\u0000\u0000\u0000\bHTTP/1.1\u0000\u0000\u0000\u0003url\u0000\u0000\u0000\u0006public" +
-            "\u0000\u0000\u0000\nset-cookie\u0000\u0000\u0000\nkeep-alive\u0000\u0000\u0000\u0006origin" +
-            "100101201202205206300302303304305306307402405406407408409410411412413414415416417502504505" +
-            "203 Non-Authoritative Information204 No Content301 Moved Permanently400 Bad Request401 Unauthorized" +
-            "403 Forbidden404 Not Found500 Internal Server Error501 Not Implemented503 Service Unavailable" +
-            "Jan Feb Mar Apr May Jun Jul Aug Sept Oct Nov Dec 00:00:00 Mon, Tue, Wed, Thu, Fri, Sat, Sun, GMT" +
-            "chunked,text/html,image/png,image/jpg,image/gif,application/xml,application/xhtml+xml,text/plain," +
-            "text/javascript,publicprivatemax-age=gzip,deflate,sdchcharset=utf-8charset=iso-8859-1,utf-,*,enq=0.")
-            .getBytes();
-
-    public static byte[] get(short version)
-    {
-        switch (version)
-        {
-            case SPDY.V2:
-                return DICTIONARY_V2;
-            case SPDY.V3:
-                return DICTIONARY_V3;
-            default:
-                throw new IllegalStateException();
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/CompressionFactory.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/CompressionFactory.java
deleted file mode 100644
index 698e9c2..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/CompressionFactory.java
+++ /dev/null
@@ -1,46 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy;
-
-import java.util.zip.ZipException;
-
-public interface CompressionFactory
-{
-    public Compressor newCompressor();
-
-    public Decompressor newDecompressor();
-
-    public interface Compressor
-    {
-        public void setInput(byte[] input);
-
-        public void setDictionary(byte[] dictionary);
-
-        public int compress(byte[] output);
-    }
-
-    public interface Decompressor
-    {
-        public void setDictionary(byte[] dictionary);
-
-        public void setInput(byte[] input);
-
-        public int decompress(byte[] output) throws ZipException;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/Controller.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/Controller.java
deleted file mode 100644
index 32a5b8d..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/Controller.java
+++ /dev/null
@@ -1,30 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.util.Callback;
-
-public interface Controller
-{
-    public void write(Callback callback, ByteBuffer... buffers);
-
-    public void close(boolean onlyOutput);
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/FlowControlStrategy.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/FlowControlStrategy.java
deleted file mode 100644
index a2dcff0..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/FlowControlStrategy.java
+++ /dev/null
@@ -1,92 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy;
-
-import org.eclipse.jetty.spdy.api.DataInfo;
-
-// TODO: add methods that tell how much written and whether we're TCP congested ?
-public interface FlowControlStrategy
-{
-    public int getWindowSize(ISession session);
-
-    public void setWindowSize(ISession session, int windowSize);
-
-    public void onNewStream(ISession session, IStream stream);
-
-    public void onWindowUpdate(ISession session, IStream stream, int delta);
-
-    public void updateWindow(ISession session, IStream stream, int delta);
-
-    public void onDataReceived(ISession session, IStream stream, DataInfo dataInfo);
-
-    public void onDataConsumed(ISession session, IStream stream, DataInfo dataInfo, int delta);
-
-    public static class None implements FlowControlStrategy
-    {
-        private volatile int windowSize;
-
-        public None()
-        {
-            this(65536);
-        }
-
-        public None(int windowSize)
-        {
-            this.windowSize = windowSize;
-        }
-
-        @Override
-        public int getWindowSize(ISession session)
-        {
-            return windowSize;
-        }
-
-        @Override
-        public void setWindowSize(ISession session, int windowSize)
-        {
-            this.windowSize = windowSize;
-        }
-
-        @Override
-        public void onNewStream(ISession session, IStream stream)
-        {
-            stream.updateWindowSize(windowSize);
-        }
-
-        @Override
-        public void onWindowUpdate(ISession session, IStream stream, int delta)
-        {
-        }
-
-        @Override
-        public void updateWindow(ISession session, IStream stream, int delta)
-        {
-        }
-
-        @Override
-        public void onDataReceived(ISession session, IStream stream, DataInfo dataInfo)
-        {
-        }
-
-        @Override
-        public void onDataConsumed(ISession session, IStream stream, DataInfo dataInfo, int delta)
-        {
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/Flusher.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/Flusher.java
deleted file mode 100644
index f18f9d6..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/Flusher.java
+++ /dev/null
@@ -1,266 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.jetty.spdy.StandardSession.FrameBytes;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.util.ArrayQueue;
-import org.eclipse.jetty.util.IteratingCallback;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-public class Flusher
-{
-    private static final Logger LOG = Log.getLogger(Flusher.class);
-
-    private final IteratingCallback callback = new FlusherCallback();
-    private final Object lock = new Object();
-    private final ArrayQueue<StandardSession.FrameBytes> queue = new ArrayQueue<>(ArrayQueue.DEFAULT_CAPACITY, ArrayQueue.DEFAULT_GROWTH, lock);
-    private final Controller controller;
-    private final int maxGather;
-    private Throwable failure;
-
-    public Flusher(Controller controller)
-    {
-        this(controller, 8);
-    }
-
-    public Flusher(Controller controller, int maxGather)
-    {
-        this.controller = controller;
-        this.maxGather = maxGather;
-    }
-
-    public void removeFrameBytesFromQueue(Stream stream)
-    {
-        synchronized (lock)
-        {
-            for (StandardSession.FrameBytes frameBytes : queue)
-                if (frameBytes.getStream() == stream)
-                    queue.remove(frameBytes);
-        }
-    }
-
-    public Throwable prepend(StandardSession.FrameBytes frameBytes)
-    {
-        synchronized (lock)
-        {
-            Throwable failure = this.failure;
-            if (failure == null)
-            {
-                // Scan from the front of the queue looking to skip higher priority messages
-                int index = 0;
-                int size = queue.size();
-                while (index < size)
-                {
-                    StandardSession.FrameBytes element = queue.getUnsafe(index);
-                    if (element.compareTo(frameBytes) <= 0)
-                        break;
-                    ++index;
-                }
-                queue.add(index, frameBytes);
-            }
-            return failure;
-        }
-    }
-
-    public Throwable append(StandardSession.FrameBytes frameBytes)
-    {
-        synchronized (lock)
-        {
-            Throwable failure = this.failure;
-            if (failure == null)
-            {
-                // Non DataFrameBytes are inserted last
-                queue.add(frameBytes);
-            }
-            return failure;
-        }
-    }
-
-    public Throwable append(StandardSession.DataFrameBytes frameBytes)
-    {
-        synchronized (lock)
-        {
-            Throwable failure = this.failure;
-            if (failure == null)
-            {
-                // DataFrameBytes are inserted by priority
-                int index = queue.size();
-                while (index > 0)
-                {
-                    StandardSession.FrameBytes element = queue.getUnsafe(index - 1);
-                    if (element.compareTo(frameBytes) >= 0)
-                        break;
-                    --index;
-                }
-                queue.add(index, frameBytes);
-            }
-            return failure;
-        }
-    }
-
-    public void flush()
-    {
-        callback.iterate();
-    }
-
-    public int getQueueSize()
-    {
-        synchronized (lock)
-        {
-            return queue.size();
-        }
-    }
-
-    private class FlusherCallback extends IteratingCallback
-    {
-        private final List<StandardSession.FrameBytes> active = new ArrayList<>(maxGather);
-        private final List<StandardSession.FrameBytes> succeeded = new ArrayList<>(maxGather);
-        private final Set<IStream> stalled = new HashSet<>();
-
-        @Override
-        protected Action process() throws Exception
-        {
-            synchronized (lock)
-            {
-                // Scan queue for data to write from first non stalled stream.
-                int index = 0; // The index of the first non-stalled frame.
-                int size = queue.size();
-                while (index < size)
-                {
-                    FrameBytes frameBytes = queue.getUnsafe(index);
-                    IStream stream = frameBytes.getStream();
-
-                    if (stream != null)
-                    {
-                        // Is it a frame belonging to an already stalled stream ?
-                        if (stalled.size() > 0 && stalled.contains(stream))
-                        {
-                            ++index;
-                            continue;
-                        }
-
-                        // Has the stream consumed all its flow control window ?
-                        if (stream.getWindowSize() <= 0)
-                        {
-                            stalled.add(stream);
-                            ++index;
-                            continue;
-                        }
-                    }
-
-                    // We will be possibly writing this frame, so take the frame off the queue.
-                    queue.remove(index);
-                    --size;
-
-                    // Has the stream been reset for this data frame ?
-                    if (stream != null && stream.isReset() && frameBytes instanceof StandardSession.DataFrameBytes)
-                    {
-                        // TODO: notify from within sync block !
-                        frameBytes.failed(new StreamException(frameBytes.getStream().getId(),
-                                StreamStatus.INVALID_STREAM, "Stream: " + frameBytes.getStream() + " is reset!"));
-                        continue;
-                    }
-
-                    active.add(frameBytes);
-                }
-                stalled.clear();
-
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Flushing {} of {} frame(s) in queue", active.size(), queue.size());
-            }
-
-            if (active.isEmpty())
-                return Action.IDLE;
-
-            // Get the bytes to write
-            ByteBuffer[] buffers = new ByteBuffer[active.size()];
-            for (int i = 0; i < buffers.length; i++)
-                buffers[i] = active.get(i).getByteBuffer();
-
-            if (controller != null)
-                controller.write(this, buffers);
-
-            // TODO: optimization
-            // If the callback completely immediately, it means that
-            // the connection is not congested, and therefore we can
-            // write more data without blocking.
-            // Therefore we should check this condition and increase
-            // the write window, which means two things: autotune the
-            // maxGather parameter, and/or autotune the buffer returned
-            // by FrameBytes.getByteBuffer() (see also comment there).
-
-            return Action.SCHEDULED;
-        }
-
-        @Override
-        protected void onCompleteSuccess()
-        {
-            // will never be called as process always returns SCHEDULED or IDLE
-            throw new IllegalStateException();
-        }
-
-        @Override
-        public void succeeded()
-        {
-            synchronized (lock)
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Succeeded write of {}, q={}", active, queue.size());
-                succeeded.addAll(active);
-                active.clear();
-            }
-            // Notify outside the synchronized block.
-            for (FrameBytes frame : succeeded)
-                frame.succeeded();
-            succeeded.clear();
-            super.succeeded();
-        }
-
-        @Override
-        public void onCompleteFailure(Throwable x)
-        {
-            List<StandardSession.FrameBytes> failed = new ArrayList<>();
-            synchronized (lock)
-            {
-                failure = x;
-                if (LOG.isDebugEnabled())
-                {
-                    String logMessage = String.format("Failed write of %s, failing all %d frame(s) in queue", this, queue.size());
-                    LOG.debug(logMessage, x);
-                }
-                failed.addAll(active);
-                active.clear();
-                failed.addAll(queue);
-                queue.clear();
-            }
-            // Notify outside the synchronized block.
-            for (StandardSession.FrameBytes frame : failed)
-                frame.failed(x);
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/ISession.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/ISession.java
deleted file mode 100644
index d5f80cf..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/ISession.java
+++ /dev/null
@@ -1,39 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy;
-
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.util.Callback;
-
-public interface ISession extends Session
-{
-    public void control(IStream stream, ControlFrame frame, long timeout, TimeUnit unit, Callback callback);
-
-    public void data(IStream stream, DataInfo dataInfo, long timeout, TimeUnit unit, Callback callback);
-
-    /**
-     * <p>Gracefully shuts down this session.</p>
-     * <p>A special item is queued that will close the connection when it will be dequeued.</p>
-     */
-    public void shutdown();
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/IStream.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/IStream.java
deleted file mode 100644
index 8524ab2..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/IStream.java
+++ /dev/null
@@ -1,120 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy;
-
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.util.Callback;
-
-/**
- * <p>The internal interface that represents a stream.</p>
- * <p>{@link IStream} contains additional methods used by a SPDY
- * implementation (and not by an application).</p>
- */
-public interface IStream extends Stream, Callback
-{
-    /**
-     * <p>Senders of data frames need to know the current window size
-     * to determine whether they can send more data.</p>
-     *
-     * @return the current window size for this stream.
-     * @see #updateWindowSize(int)
-     */
-    public int getWindowSize();
-
-    /**
-     * <p>Updates the window size for this stream by the given amount,
-     * that can be positive or negative.</p>
-     * <p>Senders and recipients of data frames update the window size,
-     * respectively, with negative values and positive values.</p>
-     *
-     * @param delta the signed amount the window size needs to be updated
-     * @see #getWindowSize()
-     */
-    public void updateWindowSize(int delta);
-
-    /**
-     * @param listener the stream frame listener associated to this stream
-     * as returned by {@link SessionFrameListener#onSyn(Stream, SynInfo)}
-     */
-    public void setStreamFrameListener(StreamFrameListener listener);
-
-    /**
-     * @return the stream frame listener associated to this stream
-     */
-    public StreamFrameListener getStreamFrameListener();
-
-    /**
-     * <p>A stream can be open, {@link #isHalfClosed() half closed} or
-     * {@link #isClosed() closed} and this method updates the close state
-     * of this stream.</p>
-     * <p>If the stream is open, calling this method with a value of true
-     * puts the stream into half closed state.</p>
-     * <p>If the stream is half closed, calling this method with a value
-     * of true puts the stream into closed state.</p>
-     *
-     * @param close whether the close state should be updated
-     * @param local whether the close is local or remote
-     */
-    public void updateCloseState(boolean close, boolean local);
-
-    /**
-     * <p>Processes the given control frame,
-     * for example by updating the stream's state or by calling listeners.</p>
-     *
-     * @param frame the control frame to process
-     * @see #process(DataInfo)
-     */
-    public void process(ControlFrame frame);
-
-    /**
-     * <p>Processes the given {@code dataInfo},
-     * for example by updating the stream's state or by calling listeners.</p>
-     *
-     * @param dataInfo the DataInfo to process
-     * @see #process(ControlFrame)
-     */
-    public void process(DataInfo dataInfo);
-
-    /**
-     * <p>Associate the given {@link IStream} to this {@link IStream}.</p>
-     *
-     * @param stream the stream to associate with this stream
-     */
-    public void associate(IStream stream);
-
-    /**
-     * <p>remove the given associated {@link IStream} from this stream</p>
-     *
-     * @param stream the stream to be removed
-     */
-    public void disassociate(IStream stream);
-
-    /**
-     * <p>Overrides Stream.getAssociatedStream() to return an instance of IStream instead of Stream
-     *
-     * @see Stream#getAssociatedStream()
-     */
-    @Override
-    public IStream getAssociatedStream();
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/IdleListener.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/IdleListener.java
deleted file mode 100644
index f674ddd..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/IdleListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy;
-
-public interface IdleListener
-{
-    public void onIdle(boolean idle);
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/PushSynInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/PushSynInfo.java
deleted file mode 100644
index 0755515..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/PushSynInfo.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy;
-
-import org.eclipse.jetty.spdy.api.PushInfo;
-import org.eclipse.jetty.spdy.api.SynInfo;
-
-/* ------------------------------------------------------------ */
-/**
- * <p>A subclass container of {@link SynInfo} for unidirectional streams</p>
- */
-public class PushSynInfo extends SynInfo
-{
-    public static final byte FLAG_UNIDIRECTIONAL = 2;
-    
-    private int associatedStreamId;
-    
-    public PushSynInfo(int associatedStreamId, PushInfo pushInfo){
-        super(pushInfo.getTimeout(), pushInfo.getUnit(), pushInfo.getHeaders(), pushInfo.isClose(), (byte)0);
-        this.associatedStreamId = associatedStreamId;
-    }
-    
-    /**
-     * @return the close and unidirectional flags as integer
-     * @see #FLAG_CLOSE
-     * @see #FLAG_UNIDIRECTIONAL
-     */
-    @Override
-    public byte getFlags()
-    {
-        byte flags = super.getFlags();
-        flags += FLAG_UNIDIRECTIONAL;
-        return flags;
-    }
-    
-    /**
-     * @return the id of the associated stream
-     */
-    public int getAssociatedStreamId()
-    {
-        return associatedStreamId;
-    }
-
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/SPDYv3FlowControlStrategy.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/SPDYv3FlowControlStrategy.java
deleted file mode 100644
index a6205eb..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/SPDYv3FlowControlStrategy.java
+++ /dev/null
@@ -1,90 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy;
-
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.frames.WindowUpdateFrame;
-import org.eclipse.jetty.util.Callback;
-
-public class SPDYv3FlowControlStrategy implements FlowControlStrategy
-{
-    private volatile int windowSize;
-
-    @Override
-    public int getWindowSize(ISession session)
-    {
-        return windowSize;
-    }
-
-    @Override
-    public void setWindowSize(ISession session, int windowSize)
-    {
-        int prevWindowSize = this.windowSize;
-        this.windowSize = windowSize;
-        for (Stream stream : session.getStreams())
-            ((IStream)stream).updateWindowSize(windowSize - prevWindowSize);
-    }
-
-    @Override
-    public void onNewStream(ISession session, IStream stream)
-    {
-        stream.updateWindowSize(windowSize);
-    }
-
-    @Override
-    public void onWindowUpdate(ISession session, IStream stream, int delta)
-    {
-        if (stream != null)
-            stream.updateWindowSize(delta);
-    }
-
-    @Override
-    public void updateWindow(ISession session, IStream stream, int delta)
-    {
-        stream.updateWindowSize(delta);
-    }
-
-    @Override
-    public void onDataReceived(ISession session, IStream stream, DataInfo dataInfo)
-    {
-        // Do nothing
-    }
-
-    @Override
-    public void onDataConsumed(ISession session, IStream stream, DataInfo dataInfo, int delta)
-    {
-        // This is the algorithm for flow control.
-        // This method may be called multiple times with delta=1, but we only send a window
-        // update when the whole dataInfo has been consumed.
-        // Other policies may be to send window updates when consumed() is greater than
-        // a certain threshold, etc. but for now the policy is not pluggable for simplicity.
-        // Note that the frequency of window updates depends on the read buffer, that
-        // should not be too smaller than the window size to avoid frequent window updates.
-        // Therefore, a pluggable policy should be able to modify the read buffer capacity.
-        int length = dataInfo.length();
-        if (dataInfo.consumed() == length && !stream.isClosed() && length > 0)
-        {
-            WindowUpdateFrame windowUpdateFrame = new WindowUpdateFrame(session.getVersion(), stream.getId(), length);
-            session.control(stream, windowUpdateFrame, 0, TimeUnit.MILLISECONDS, Callback.Adapter.INSTANCE);
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/SessionException.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/SessionException.java
deleted file mode 100644
index 7e4ac31..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/SessionException.java
+++ /dev/null
@@ -1,48 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy;
-
-import org.eclipse.jetty.spdy.api.SessionStatus;
-
-public class SessionException extends RuntimeException
-{
-    private final SessionStatus sessionStatus;
-
-    public SessionException(SessionStatus sessionStatus)
-    {
-        this.sessionStatus = sessionStatus;
-    }
-
-    public SessionException(SessionStatus sessionStatus, String message)
-    {
-        super(message);
-        this.sessionStatus = sessionStatus;
-    }
-
-    public SessionException(SessionStatus sessionStatus, Throwable cause)
-    {
-        super(cause);
-        this.sessionStatus = sessionStatus;
-    }
-
-    public SessionStatus getSessionStatus()
-    {
-        return sessionStatus;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardCompressionFactory.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardCompressionFactory.java
deleted file mode 100644
index 1630f4a..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardCompressionFactory.java
+++ /dev/null
@@ -1,92 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy;
-
-import java.util.zip.DataFormatException;
-import java.util.zip.Deflater;
-import java.util.zip.Inflater;
-import java.util.zip.ZipException;
-
-public class StandardCompressionFactory implements CompressionFactory
-{
-    @Override
-    public Compressor newCompressor()
-    {
-        return new StandardCompressor();
-    }
-
-    @Override
-    public Decompressor newDecompressor()
-    {
-        return new StandardDecompressor();
-    }
-
-    public static class StandardCompressor implements Compressor
-    {
-        private final Deflater deflater = new Deflater();
-
-        @Override
-        public void setInput(byte[] input)
-        {
-            deflater.setInput(input);
-        }
-
-        @Override
-        public void setDictionary(byte[] dictionary)
-        {
-            deflater.setDictionary(dictionary);
-        }
-
-        @Override
-        public int compress(byte[] output)
-        {
-            return deflater.deflate(output, 0, output.length, Deflater.SYNC_FLUSH);
-        }
-    }
-
-    public static class StandardDecompressor implements CompressionFactory.Decompressor
-    {
-        private final Inflater inflater = new Inflater();
-
-        @Override
-        public void setDictionary(byte[] dictionary)
-        {
-            inflater.setDictionary(dictionary);
-        }
-
-        @Override
-        public void setInput(byte[] input)
-        {
-            inflater.setInput(input);
-        }
-
-        @Override
-        public int decompress(byte[] output) throws ZipException
-        {
-            try
-            {
-                return inflater.inflate(output);
-            }
-            catch (DataFormatException x)
-            {
-                throw (ZipException)new ZipException().initCause(x);
-            }
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardSession.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardSession.java
deleted file mode 100644
index 0982271..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardSession.java
+++ /dev/null
@@ -1,1303 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
-import java.nio.channels.InterruptedByTimeoutException;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.spdy.api.ByteBufferDataInfo;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.GoAwayInfo;
-import org.eclipse.jetty.spdy.api.GoAwayResultInfo;
-import org.eclipse.jetty.spdy.api.PingInfo;
-import org.eclipse.jetty.spdy.api.PingResultInfo;
-import org.eclipse.jetty.spdy.api.PushInfo;
-import org.eclipse.jetty.spdy.api.RstInfo;
-import org.eclipse.jetty.spdy.api.SPDYException;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.api.SessionStatus;
-import org.eclipse.jetty.spdy.api.Settings;
-import org.eclipse.jetty.spdy.api.SettingsInfo;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.ControlFrameType;
-import org.eclipse.jetty.spdy.frames.CredentialFrame;
-import org.eclipse.jetty.spdy.frames.DataFrame;
-import org.eclipse.jetty.spdy.frames.GoAwayFrame;
-import org.eclipse.jetty.spdy.frames.HeadersFrame;
-import org.eclipse.jetty.spdy.frames.PingFrame;
-import org.eclipse.jetty.spdy.frames.RstStreamFrame;
-import org.eclipse.jetty.spdy.frames.SettingsFrame;
-import org.eclipse.jetty.spdy.frames.SynReplyFrame;
-import org.eclipse.jetty.spdy.frames.SynStreamFrame;
-import org.eclipse.jetty.spdy.frames.WindowUpdateFrame;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.spdy.parser.Parser;
-import org.eclipse.jetty.util.Atomics;
-import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.FutureCallback;
-import org.eclipse.jetty.util.FuturePromise;
-import org.eclipse.jetty.util.Promise;
-import org.eclipse.jetty.util.component.ContainerLifeCycle;
-import org.eclipse.jetty.util.component.Dumpable;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.util.thread.Scheduler;
-
-public class StandardSession implements ISession, Parser.Listener, Dumpable
-{
-    private static final Logger LOG = Log.getLogger(Session.class);
-
-    private final Flusher flusher;
-    private final Map<String, Object> attributes = new ConcurrentHashMap<>();
-    private final List<Listener> listeners = new CopyOnWriteArrayList<>();
-    private final ConcurrentMap<Integer, IStream> streams = new ConcurrentHashMap<>();
-    private final ByteBufferPool bufferPool;
-    private final Scheduler scheduler;
-    private final short version;
-    private final Controller controller;
-    private final EndPoint endPoint;
-    private final IdleListener idleListener;
-    private final AtomicInteger streamIds;
-    private final AtomicInteger pingIds;
-    private final SessionFrameListener listener;
-    private final Generator generator;
-    private final AtomicBoolean goAwaySent = new AtomicBoolean();
-    private final AtomicBoolean goAwayReceived = new AtomicBoolean();
-    private final AtomicInteger lastStreamId = new AtomicInteger();
-    private final AtomicInteger localStreamCount = new AtomicInteger(0);
-    private final FlowControlStrategy flowControlStrategy;
-    private volatile int maxConcurrentLocalStreams = -1;
-
-    public StandardSession(short version, ByteBufferPool bufferPool, Scheduler scheduler,
-                           Controller controller, EndPoint endPoint, IdleListener idleListener, int initialStreamId,
-                           SessionFrameListener listener, Generator generator, FlowControlStrategy flowControlStrategy)
-    {
-        // TODO this should probably be an aggregate lifecycle
-        this.version = version;
-        this.bufferPool = bufferPool;
-        this.scheduler = scheduler;
-        this.controller = controller;
-        this.endPoint = endPoint;
-        this.idleListener = idleListener;
-        this.streamIds = new AtomicInteger(initialStreamId);
-        this.pingIds = new AtomicInteger(initialStreamId);
-        this.listener = listener;
-        this.generator = generator;
-        this.flowControlStrategy = flowControlStrategy;
-        this.flusher = new Flusher(controller);
-    }
-
-    @Override
-    public short getVersion()
-    {
-        return version;
-    }
-
-    @Override
-    public void addListener(Listener listener)
-    {
-        listeners.add(listener);
-    }
-
-    @Override
-    public void removeListener(Listener listener)
-    {
-        listeners.remove(listener);
-    }
-
-    @Override
-    public Stream syn(SynInfo synInfo, StreamFrameListener listener) throws ExecutionException, InterruptedException, TimeoutException
-    {
-        FuturePromise<Stream> result = new FuturePromise<>();
-        syn(synInfo, listener, result);
-        if (synInfo.getTimeout() > 0)
-            return result.get(synInfo.getTimeout(), synInfo.getUnit());
-        else
-            return result.get();
-    }
-
-    @Override
-    public void syn(SynInfo synInfo, StreamFrameListener listener, Promise<Stream> promise)
-    {
-        // Synchronization is necessary.
-        // SPEC v3, 2.3.1 requires that the stream creation be monotonically crescent
-        // so we cannot allow thread1 to create stream1 and thread2 create stream3 and
-        // have stream3 hit the network before stream1, not only to comply with the spec
-        // but also because the compression context for the headers would be wrong, as the
-        // frame with a compression history will come before the first compressed frame.
-        int associatedStreamId = 0;
-        if (synInfo instanceof PushSynInfo)
-            associatedStreamId = ((PushSynInfo)synInfo).getAssociatedStreamId();
-
-        synchronized (this)
-        {
-            int streamId = streamIds.getAndAdd(2);
-            // TODO: for SPDYv3 we need to support the "slot" argument
-            SynStreamFrame synStream = new SynStreamFrame(version, synInfo.getFlags(), streamId, associatedStreamId, synInfo.getPriority(), (short)0, synInfo.getHeaders());
-            IStream stream = createStream(synStream, listener, true, promise);
-            if (stream == null)
-                return;
-            generateAndEnqueueControlFrame(stream, synStream, synInfo.getTimeout(), synInfo.getUnit(), stream);
-        }
-    }
-
-    @Override
-    public void rst(RstInfo rstInfo) throws InterruptedException, ExecutionException, TimeoutException
-    {
-        FutureCallback result = new FutureCallback();
-        rst(rstInfo, result);
-        if (rstInfo.getTimeout() > 0)
-            result.get(rstInfo.getTimeout(), rstInfo.getUnit());
-        else
-            result.get();
-    }
-
-    @Override
-    public void rst(RstInfo rstInfo, Callback callback)
-    {
-        // SPEC v3, 2.2.2
-        if (goAwaySent.get())
-        {
-            complete(callback);
-        }
-        else
-        {
-            int streamId = rstInfo.getStreamId();
-            IStream stream = streams.get(streamId);
-            RstStreamFrame frame = new RstStreamFrame(version, streamId, rstInfo.getStreamStatus().getCode(version));
-            control(stream, frame, rstInfo.getTimeout(), rstInfo.getUnit(), callback);
-            if (stream != null)
-            {
-                stream.process(frame);
-                flusher.removeFrameBytesFromQueue(stream);
-                removeStream(stream);
-            }
-        }
-    }
-
-    @Override
-    public void settings(SettingsInfo settingsInfo) throws ExecutionException, InterruptedException, TimeoutException
-    {
-        FutureCallback result = new FutureCallback();
-        settings(settingsInfo, result);
-        if (settingsInfo.getTimeout() > 0)
-            result.get(settingsInfo.getTimeout(), settingsInfo.getUnit());
-        else
-            result.get();
-    }
-
-    @Override
-    public void settings(SettingsInfo settingsInfo, Callback callback)
-    {
-        SettingsFrame frame = new SettingsFrame(version, settingsInfo.getFlags(), settingsInfo.getSettings());
-        control(null, frame, settingsInfo.getTimeout(), settingsInfo.getUnit(), callback);
-    }
-
-    @Override
-    public PingResultInfo ping(PingInfo pingInfo) throws ExecutionException, InterruptedException, TimeoutException
-    {
-        FuturePromise<PingResultInfo> result = new FuturePromise<>();
-        ping(pingInfo, result);
-        if (pingInfo.getTimeout() > 0)
-            return result.get(pingInfo.getTimeout(), pingInfo.getUnit());
-        else
-            return result.get();
-    }
-
-    @Override
-    public void ping(PingInfo pingInfo, Promise<PingResultInfo> promise)
-    {
-        int pingId = pingIds.getAndAdd(2);
-        PingInfoCallback pingInfoCallback = new PingInfoCallback(pingId, promise);
-        PingFrame frame = new PingFrame(version, pingId);
-        control(null, frame, pingInfo.getTimeout(), pingInfo.getUnit(), pingInfoCallback);
-    }
-
-    @Override
-    public void goAway(GoAwayInfo goAwayInfo) throws ExecutionException, InterruptedException, TimeoutException
-    {
-        goAway(goAwayInfo, SessionStatus.OK);
-    }
-
-    private void goAway(GoAwayInfo goAwayInfo, SessionStatus sessionStatus) throws ExecutionException, InterruptedException, TimeoutException
-    {
-        FutureCallback result = new FutureCallback();
-        goAway(sessionStatus, goAwayInfo.getTimeout(), goAwayInfo.getUnit(), result);
-        if (goAwayInfo.getTimeout() > 0)
-            result.get(goAwayInfo.getTimeout(), goAwayInfo.getUnit());
-        else
-            result.get();
-    }
-
-    @Override
-    public void goAway(GoAwayInfo goAwayInfo, Callback callback)
-    {
-        goAway(SessionStatus.OK, goAwayInfo.getTimeout(), goAwayInfo.getUnit(), callback);
-    }
-
-    private void goAway(SessionStatus sessionStatus, long timeout, TimeUnit unit, Callback callback)
-    {
-        if (goAwaySent.compareAndSet(false, true))
-        {
-            if (!goAwayReceived.get())
-            {
-                GoAwayFrame frame = new GoAwayFrame(version, lastStreamId.get(), sessionStatus.getCode());
-                control(null, frame, timeout, unit, callback);
-                return;
-            }
-        }
-        complete(callback);
-    }
-
-    @Override
-    public Set<Stream> getStreams()
-    {
-        Set<Stream> result = new HashSet<>();
-        result.addAll(streams.values());
-        return result;
-    }
-
-    @Override
-    public IStream getStream(int streamId)
-    {
-        return streams.get(streamId);
-    }
-
-    @Override
-    public Object getAttribute(String key)
-    {
-        return attributes.get(key);
-    }
-
-    @Override
-    public void setAttribute(String key, Object value)
-    {
-        attributes.put(key, value);
-    }
-
-    @Override
-    public Object removeAttribute(String key)
-    {
-        return attributes.remove(key);
-    }
-
-    @Override
-    public InetSocketAddress getLocalAddress()
-    {
-        return endPoint.getLocalAddress();
-    }
-
-    @Override
-    public InetSocketAddress getRemoteAddress()
-    {
-        return endPoint.getRemoteAddress();
-    }
-
-    @Override
-    public void onControlFrame(ControlFrame frame)
-    {
-        notifyIdle(idleListener, false);
-        try
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Processing {}", frame);
-
-            if (goAwaySent.get())
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Skipped processing of {}", frame);
-                return;
-            }
-
-            switch (frame.getType())
-            {
-                case SYN_STREAM:
-                {
-                    onSyn((SynStreamFrame)frame);
-                    break;
-                }
-                case SYN_REPLY:
-                {
-                    onReply((SynReplyFrame)frame);
-                    break;
-                }
-                case RST_STREAM:
-                {
-                    onRst((RstStreamFrame)frame);
-                    break;
-                }
-                case SETTINGS:
-                {
-                    onSettings((SettingsFrame)frame);
-                    break;
-                }
-                case NOOP:
-                {
-                    // Just ignore it
-                    break;
-                }
-                case PING:
-                {
-                    onPing((PingFrame)frame);
-                    break;
-                }
-                case GO_AWAY:
-                {
-                    onGoAway((GoAwayFrame)frame);
-                    break;
-                }
-                case HEADERS:
-                {
-                    onHeaders((HeadersFrame)frame);
-                    break;
-                }
-                case WINDOW_UPDATE:
-                {
-                    onWindowUpdate((WindowUpdateFrame)frame);
-                    break;
-                }
-                case CREDENTIAL:
-                {
-                    onCredential((CredentialFrame)frame);
-                    break;
-                }
-                default:
-                {
-                    throw new IllegalStateException();
-                }
-            }
-        }
-        finally
-        {
-            notifyIdle(idleListener, true);
-        }
-    }
-
-    @Override
-    public void onDataFrame(DataFrame frame, ByteBuffer data)
-    {
-        notifyIdle(idleListener, false);
-        try
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Processing {}, {} data bytes", frame, data.remaining());
-
-            if (goAwaySent.get())
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Skipped processing of {}", frame);
-                return;
-            }
-
-            int streamId = frame.getStreamId();
-            IStream stream = streams.get(streamId);
-            if (stream == null)
-            {
-                RstInfo rstInfo = new RstInfo(streamId, StreamStatus.INVALID_STREAM);
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Unknown stream {}", rstInfo);
-                rst(rstInfo, Callback.Adapter.INSTANCE);
-            }
-            else
-            {
-                processData(stream, frame, data);
-            }
-        }
-        finally
-        {
-            notifyIdle(idleListener, true);
-        }
-    }
-
-    private void notifyIdle(IdleListener listener, boolean idle)
-    {
-        if (listener != null)
-            listener.onIdle(idle);
-    }
-
-    private void processData(final IStream stream, DataFrame frame, ByteBuffer data)
-    {
-        ByteBufferDataInfo dataInfo = new ByteBufferDataInfo(data, frame.isClose())
-        {
-            @Override
-            public void consume(int delta)
-            {
-                super.consume(delta);
-                flowControlStrategy.onDataConsumed(StandardSession.this, stream, this, delta);
-            }
-        };
-        flowControlStrategy.onDataReceived(this, stream, dataInfo);
-        stream.process(dataInfo);
-        if (stream.isClosed())
-            removeStream(stream);
-    }
-
-    @Override
-    public void onStreamException(StreamException x)
-    {
-        notifyOnFailure(listener, x); // TODO: notify StreamFrameListener if exists?
-        rst(new RstInfo(x.getStreamId(), x.getStreamStatus()), Callback.Adapter.INSTANCE);
-    }
-
-    @Override
-    public void onSessionException(SessionException x)
-    {
-        Throwable cause = x.getCause();
-        notifyOnFailure(listener, cause == null ? x : cause);
-        goAway(x.getSessionStatus(), 0, TimeUnit.SECONDS, Callback.Adapter.INSTANCE);
-    }
-
-    private void onSyn(final SynStreamFrame frame)
-    {
-        IStream stream = createStream(frame, null, false, new Promise.Adapter<Stream>()
-        {
-            @Override
-            public void failed(Throwable x)
-            {
-                LOG.debug("Received: {} but creating new Stream failed: {}", frame, x.getMessage());
-            }
-        });
-        if (stream != null)
-            processSyn(listener, stream, frame);
-    }
-
-    private void processSyn(SessionFrameListener listener, IStream stream, SynStreamFrame frame)
-    {
-        stream.process(frame);
-        // Update the last stream id before calling the application (which may send a GO_AWAY)
-        updateLastStreamId(stream);
-        StreamFrameListener streamListener;
-        if (stream.isUnidirectional())
-        {
-            PushInfo pushInfo = new PushInfo(frame.getHeaders(), frame.isClose());
-            streamListener = notifyOnPush(stream.getAssociatedStream().getStreamFrameListener(), stream, pushInfo);
-        }
-        else
-        {
-            SynInfo synInfo = new SynInfo(frame.getHeaders(), frame.isClose(), frame.getPriority());
-            streamListener = notifyOnSyn(listener, stream, synInfo);
-        }
-        stream.setStreamFrameListener(streamListener);
-        // The onSyn() listener may have sent a frame that closed the stream
-        if (stream.isClosed())
-            removeStream(stream);
-    }
-
-    private IStream createStream(SynStreamFrame frame, StreamFrameListener listener, boolean local, Promise<Stream> promise)
-    {
-        IStream associatedStream = streams.get(frame.getAssociatedStreamId());
-        IStream stream = new StandardStream(frame.getStreamId(), frame.getPriority(), this, associatedStream,
-                scheduler, promise);
-        stream.setIdleTimeout(endPoint.getIdleTimeout());
-        flowControlStrategy.onNewStream(this, stream);
-
-        stream.updateCloseState(frame.isClose(), local);
-        stream.setStreamFrameListener(listener);
-
-        if (stream.isUnidirectional())
-        {
-            // Unidirectional streams are implicitly half closed
-            stream.updateCloseState(true, !local);
-            if (!stream.isClosed())
-                stream.getAssociatedStream().associate(stream);
-        }
-
-        int streamId = stream.getId();
-
-        if (local)
-        {
-            while (true)
-            {
-                int oldStreamCountValue = localStreamCount.get();
-                int maxConcurrentStreams = maxConcurrentLocalStreams;
-                if (maxConcurrentStreams > -1 && oldStreamCountValue >= maxConcurrentStreams)
-                {
-                    String message = String.format("Max concurrent local streams (%d) exceeded.",
-                            maxConcurrentStreams);
-                    LOG.debug(message);
-                    promise.failed(new SPDYException(message));
-                    return null;
-                }
-                if (localStreamCount.compareAndSet(oldStreamCountValue, oldStreamCountValue + 1))
-                    break;
-            }
-        }
-
-        if (streams.putIfAbsent(streamId, stream) != null)
-        {
-            String message = "Duplicate stream id " + streamId;
-            IllegalStateException duplicateIdException = new IllegalStateException(message);
-            promise.failed(duplicateIdException);
-            if (local)
-            {
-                localStreamCount.decrementAndGet();
-                throw duplicateIdException;
-            }
-            RstInfo rstInfo = new RstInfo(streamId, StreamStatus.PROTOCOL_ERROR);
-            if (LOG.isDebugEnabled())
-                LOG.debug("Duplicate stream, {}", rstInfo);
-            rst(rstInfo, Callback.Adapter.INSTANCE); // We don't care (too much) if the reset fails.
-            return null;
-        }
-        else
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Created {}", stream);
-            notifyStreamCreated(stream);
-            return stream;
-        }
-    }
-
-    private void notifyStreamCreated(IStream stream)
-    {
-        for (Listener listener : listeners)
-        {
-            if (listener instanceof StreamListener)
-            {
-                try
-                {
-                    ((StreamListener)listener).onStreamCreated(stream);
-                }
-                catch (Exception x)
-                {
-                    LOG.info("Exception while notifying listener " + listener, x);
-                }
-                catch (Error x)
-                {
-                    LOG.info("Exception while notifying listener " + listener, x);
-                    throw x;
-                }
-            }
-        }
-    }
-
-    private void removeStream(IStream stream)
-    {
-        if (stream.isUnidirectional())
-            stream.getAssociatedStream().disassociate(stream);
-
-        IStream removed = streams.remove(stream.getId());
-        if (removed != null)
-        {
-            assert removed == stream;
-
-            if (streamIds.get() % 2 == stream.getId() % 2)
-                localStreamCount.decrementAndGet();
-
-            if (LOG.isDebugEnabled())
-                LOG.debug("Removed {}", stream);
-            notifyStreamClosed(stream);
-        }
-    }
-
-    private void notifyStreamClosed(IStream stream)
-    {
-        for (Listener listener : listeners)
-        {
-            if (listener instanceof StreamListener)
-            {
-                try
-                {
-                    ((StreamListener)listener).onStreamClosed(stream);
-                }
-                catch (Exception x)
-                {
-                    LOG.info("Exception while notifying listener " + listener, x);
-                }
-                catch (Error x)
-                {
-                    LOG.info("Exception while notifying listener " + listener, x);
-                    throw x;
-                }
-            }
-        }
-    }
-
-    private void onReply(SynReplyFrame frame)
-    {
-        int streamId = frame.getStreamId();
-        IStream stream = streams.get(streamId);
-        if (stream == null)
-        {
-            RstInfo rstInfo = new RstInfo(streamId, StreamStatus.INVALID_STREAM);
-            if (LOG.isDebugEnabled())
-                LOG.debug("Unknown stream {}", rstInfo);
-            rst(rstInfo, Callback.Adapter.INSTANCE);
-        }
-        else
-        {
-            processReply(stream, frame);
-        }
-    }
-
-    private void processReply(IStream stream, SynReplyFrame frame)
-    {
-        stream.process(frame);
-        if (stream.isClosed())
-            removeStream(stream);
-    }
-
-    private void onRst(RstStreamFrame frame)
-    {
-        IStream stream = streams.get(frame.getStreamId());
-
-        if (stream != null)
-            stream.process(frame);
-
-        RstInfo rstInfo = new RstInfo(frame.getStreamId(), StreamStatus.from(frame.getVersion(), frame.getStatusCode()));
-        notifyOnRst(listener, rstInfo);
-
-        if (stream != null)
-            removeStream(stream);
-    }
-
-    private void onSettings(SettingsFrame frame)
-    {
-        Settings.Setting windowSizeSetting = frame.getSettings().get(Settings.ID.INITIAL_WINDOW_SIZE);
-        if (windowSizeSetting != null)
-        {
-            int windowSize = windowSizeSetting.value();
-            setWindowSize(windowSize);
-            if (LOG.isDebugEnabled())
-                LOG.debug("Updated session window size to {}", windowSize);
-        }
-        Settings.Setting maxConcurrentStreamsSetting = frame.getSettings().get(Settings.ID.MAX_CONCURRENT_STREAMS);
-        if (maxConcurrentStreamsSetting != null)
-        {
-            int maxConcurrentStreamsValue = maxConcurrentStreamsSetting.value();
-            maxConcurrentLocalStreams = maxConcurrentStreamsValue;
-            if (LOG.isDebugEnabled())
-                LOG.debug("Updated session maxConcurrentLocalStreams to {}", maxConcurrentStreamsValue);
-        }
-        SettingsInfo settingsInfo = new SettingsInfo(frame.getSettings(), frame.isClearPersisted());
-        notifyOnSettings(listener, settingsInfo);
-    }
-
-    private void onPing(PingFrame frame)
-    {
-        int pingId = frame.getPingId();
-        if (pingId % 2 == pingIds.get() % 2)
-        {
-            PingResultInfo pingResultInfo = new PingResultInfo(frame.getPingId());
-            notifyOnPing(listener, pingResultInfo);
-        }
-        else
-        {
-            control(null, frame, 0, TimeUnit.MILLISECONDS, Callback.Adapter.INSTANCE);
-        }
-    }
-
-    private void onGoAway(GoAwayFrame frame)
-    {
-        if (goAwayReceived.compareAndSet(false, true))
-        {
-            GoAwayResultInfo goAwayResultInfo = new GoAwayResultInfo(frame.getLastStreamId(), SessionStatus.from(frame.getStatusCode()));
-            notifyOnGoAway(listener, goAwayResultInfo);
-            // SPDY does not require to send back a response to a GO_AWAY.
-            // We notified the application of the last good stream id and
-            // tried our best to flush remaining data.
-        }
-    }
-
-    private void onHeaders(HeadersFrame frame)
-    {
-        int streamId = frame.getStreamId();
-        IStream stream = streams.get(streamId);
-        if (stream == null)
-        {
-            RstInfo rstInfo = new RstInfo(streamId, StreamStatus.INVALID_STREAM);
-            if (LOG.isDebugEnabled())
-                LOG.debug("Unknown stream, {}", rstInfo);
-            rst(rstInfo, Callback.Adapter.INSTANCE);
-        }
-        else
-        {
-            processHeaders(stream, frame);
-        }
-    }
-
-    private void processHeaders(IStream stream, HeadersFrame frame)
-    {
-        stream.process(frame);
-        if (stream.isClosed())
-            removeStream(stream);
-    }
-
-    private void onWindowUpdate(WindowUpdateFrame frame)
-    {
-        int streamId = frame.getStreamId();
-        IStream stream = streams.get(streamId);
-        flowControlStrategy.onWindowUpdate(this, stream, frame.getWindowDelta());
-        flusher.flush();
-    }
-
-    private void onCredential(CredentialFrame frame)
-    {
-        LOG.warn("{} frame not yet supported", frame.getType());
-    }
-
-    protected void close()
-    {
-        // Check for null to support tests
-        if (controller != null)
-            controller.close(false);
-    }
-
-    private void notifyOnFailure(SessionFrameListener listener, Throwable x)
-    {
-        try
-        {
-            if (listener != null)
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Invoking callback with {} on listener {}", x, listener);
-                listener.onFailure(this, x);
-            }
-        }
-        catch (Exception xx)
-        {
-            LOG.info("Exception while notifying listener " + listener, xx);
-        }
-        catch (Error xx)
-        {
-            LOG.info("Exception while notifying listener " + listener, xx);
-            throw xx;
-        }
-    }
-
-    private StreamFrameListener notifyOnPush(StreamFrameListener listener, Stream stream, PushInfo pushInfo)
-    {
-        try
-        {
-            if (listener == null)
-                return null;
-            if (LOG.isDebugEnabled())
-                LOG.debug("Invoking callback with {} on listener {}", pushInfo, listener);
-            return listener.onPush(stream, pushInfo);
-        }
-        catch (Exception x)
-        {
-            LOG.info("Exception while notifying listener " + listener, x);
-            return null;
-        }
-        catch (Error x)
-        {
-            LOG.info("Exception while notifying listener " + listener, x);
-            throw x;
-        }
-    }
-
-    private StreamFrameListener notifyOnSyn(SessionFrameListener listener, Stream stream, SynInfo synInfo)
-    {
-        try
-        {
-            if (listener == null)
-                return null;
-            if (LOG.isDebugEnabled())
-                LOG.debug("Invoking callback with {} on listener {}", synInfo, listener);
-            return listener.onSyn(stream, synInfo);
-        }
-        catch (Exception x)
-        {
-            LOG.info("Exception while notifying listener " + listener, x);
-            return null;
-        }
-        catch (Error x)
-        {
-            LOG.info("Exception while notifying listener " + listener, x);
-            throw x;
-        }
-    }
-
-    private void notifyOnRst(SessionFrameListener listener, RstInfo rstInfo)
-    {
-        try
-        {
-            if (listener != null)
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Invoking callback with {} on listener {}", rstInfo, listener);
-                listener.onRst(this, rstInfo);
-            }
-        }
-        catch (Exception x)
-        {
-            LOG.info("Exception while notifying listener " + listener, x);
-        }
-        catch (Error x)
-        {
-            LOG.info("Exception while notifying listener " + listener, x);
-            throw x;
-        }
-    }
-
-    private void notifyOnSettings(SessionFrameListener listener, SettingsInfo settingsInfo)
-    {
-        try
-        {
-            if (listener != null)
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Invoking callback with {} on listener {}", settingsInfo, listener);
-                listener.onSettings(this, settingsInfo);
-            }
-        }
-        catch (Exception x)
-        {
-            LOG.info("Exception while notifying listener " + listener, x);
-        }
-        catch (Error x)
-        {
-            LOG.info("Exception while notifying listener " + listener, x);
-            throw x;
-        }
-    }
-
-    private void notifyOnPing(SessionFrameListener listener, PingResultInfo pingResultInfo)
-    {
-        try
-        {
-            if (listener != null)
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Invoking callback with {} on listener {}", pingResultInfo, listener);
-                listener.onPing(this, pingResultInfo);
-            }
-        }
-        catch (Exception x)
-        {
-            LOG.info("Exception while notifying listener " + listener, x);
-        }
-        catch (Error x)
-        {
-            LOG.info("Exception while notifying listener " + listener, x);
-            throw x;
-        }
-    }
-
-    private void notifyOnGoAway(SessionFrameListener listener, GoAwayResultInfo goAwayResultInfo)
-    {
-        try
-        {
-            if (listener != null)
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Invoking callback with {} on listener {}", goAwayResultInfo, listener);
-                listener.onGoAway(this, goAwayResultInfo);
-            }
-        }
-        catch (Exception x)
-        {
-            LOG.info("Exception while notifying listener " + listener, x);
-        }
-        catch (Error x)
-        {
-            LOG.info("Exception while notifying listener " + listener, x);
-            throw x;
-        }
-    }
-
-    @Override
-    public void control(IStream stream, ControlFrame frame, long timeout, TimeUnit unit, Callback callback)
-    {
-        generateAndEnqueueControlFrame(stream, frame, timeout, unit, callback);
-    }
-
-    private void generateAndEnqueueControlFrame(IStream stream, ControlFrame frame, long timeout, TimeUnit unit, Callback callback)
-    {
-        try
-        {
-            // Synchronization is necessary, since we may have concurrent replies
-            // and those needs to be generated and enqueued atomically in order
-            // to maintain a correct compression context
-            ControlFrameBytes frameBytes;
-            Throwable throwable;
-            synchronized (this)
-            {
-                ByteBuffer buffer = generator.control(frame);
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Queuing {} on {}", frame, stream);
-                frameBytes = new ControlFrameBytes(stream, callback, frame, buffer);
-                if (timeout > 0)
-                    frameBytes.task = scheduler.schedule(frameBytes, timeout, unit);
-
-                // Special handling for PING frames, they must be sent as soon as possible
-                if (ControlFrameType.PING == frame.getType())
-                    throwable = flusher.prepend(frameBytes);
-                else
-                    throwable = flusher.append(frameBytes);
-            }
-            // Flush MUST be done outside synchronized blocks
-            flush(frameBytes, throwable);
-        }
-        catch (Exception x)
-        {
-            notifyCallbackFailed(callback, x);
-        }
-    }
-
-    private void updateLastStreamId(IStream stream)
-    {
-        int streamId = stream.getId();
-        if (streamId % 2 != streamIds.get() % 2)
-            Atomics.updateMax(lastStreamId, streamId);
-    }
-
-    @Override
-    public void data(IStream stream, DataInfo dataInfo, long timeout, TimeUnit unit, Callback callback)
-    {
-        if (LOG.isDebugEnabled())
-            LOG.debug("Queuing {} on {}", dataInfo, stream);
-        DataFrameBytes frameBytes = new DataFrameBytes(stream, callback, dataInfo);
-        if (timeout > 0)
-            frameBytes.task = scheduler.schedule(frameBytes, timeout, unit);
-        flush(frameBytes, flusher.append(frameBytes));
-    }
-
-    @Override
-    public void shutdown()
-    {
-        CloseFrameBytes frameBytes = new CloseFrameBytes();
-        flush(frameBytes, flusher.append(frameBytes));
-    }
-
-    private void flush(FrameBytes frameBytes, Throwable throwable)
-    {
-        if (throwable != null)
-            frameBytes.failed(throwable);
-        else
-            flusher.flush();
-    }
-
-    private void complete(final Callback callback)
-    {
-        try
-        {
-            if (callback != null)
-                callback.succeeded();
-        }
-        catch (Throwable x)
-        {
-            LOG.info("Exception while notifying callback " + callback, x);
-        }
-    }
-
-    private void notifyCallbackFailed(Callback callback, Throwable failure)
-    {
-        try
-        {
-            if (callback != null)
-                callback.failed(failure);
-        }
-        catch (Throwable x)
-        {
-            LOG.info("Exception while notifying callback " + callback, x);
-        }
-    }
-
-    public int getWindowSize()
-    {
-        return flowControlStrategy.getWindowSize(this);
-    }
-
-    public void setWindowSize(int initialWindowSize)
-    {
-        flowControlStrategy.setWindowSize(this, initialWindowSize);
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("%s@%x{v%d,queueSize=%d,windowSize=%d,streams=%d}", getClass().getSimpleName(),
-                hashCode(), version, flusher.getQueueSize(), getWindowSize(), streams.size());
-    }
-
-    @Override
-    public String dump()
-    {
-        return ContainerLifeCycle.dump(this);
-    }
-
-    @Override
-    public void dump(Appendable out, String indent) throws IOException
-    {
-        ContainerLifeCycle.dumpObject(out, this);
-        ContainerLifeCycle.dump(out, indent, Collections.singletonList(controller), streams.values());
-    }
-
-    public interface FrameBytes extends Comparable<FrameBytes>, Callback
-    {
-        public IStream getStream();
-
-        public abstract ByteBuffer getByteBuffer();
-    }
-
-    abstract class AbstractFrameBytes implements FrameBytes, Runnable
-    {
-        private final IStream stream;
-        private final Callback callback;
-        protected volatile Scheduler.Task task;
-
-        protected AbstractFrameBytes(IStream stream, Callback callback)
-        {
-            this.stream = stream;
-            this.callback = Objects.requireNonNull(callback);
-        }
-
-        @Override
-        public IStream getStream()
-        {
-            return stream;
-        }
-
-        @Override
-        public int compareTo(FrameBytes that)
-        {
-            // FrameBytes may have or not have a related stream (for example, PING do not have a related stream)
-            // FrameBytes without related streams have higher priority
-            IStream thisStream = getStream();
-            IStream thatStream = that.getStream();
-            if (thisStream == null)
-                return thatStream == null ? 0 : -1;
-            if (thatStream == null)
-                return 1;
-            // If this.stream.priority > that.stream.priority => this.stream has less priority than that.stream
-            return thatStream.getPriority() - thisStream.getPriority();
-        }
-
-        private void cancelTask()
-        {
-            Scheduler.Task task = this.task;
-            if (task != null)
-                task.cancel();
-        }
-
-        @Override
-        public void run()
-        {
-            close();
-            failed(new InterruptedByTimeoutException());
-        }
-
-        @Override
-        public void succeeded()
-        {
-            cancelTask();
-            StandardSession.this.complete(callback);
-        }
-
-        @Override
-        public void failed(Throwable x)
-        {
-            cancelTask();
-            notifyCallbackFailed(callback, x);
-        }
-    }
-
-    protected class ControlFrameBytes extends AbstractFrameBytes
-    {
-        private final ControlFrame frame;
-        private final ByteBuffer buffer;
-
-        private ControlFrameBytes(IStream stream, Callback callback, ControlFrame frame, ByteBuffer buffer)
-        {
-            super(stream, callback);
-            this.frame = frame;
-            this.buffer = buffer;
-        }
-
-        @Override
-        public ByteBuffer getByteBuffer()
-        {
-            return buffer;
-        }
-
-        @Override
-        public void succeeded()
-        {
-            bufferPool.release(buffer);
-
-            super.succeeded();
-
-            if (frame.getType() == ControlFrameType.GO_AWAY)
-            {
-                // After sending a GO_AWAY we need to hard close the connection.
-                // Recipients will know the last good stream id and act accordingly.
-                close();
-            }
-            IStream stream = getStream();
-            if (stream != null && stream.isClosed())
-                removeStream(stream);
-        }
-
-        @Override
-        public String toString()
-        {
-            return frame.toString();
-        }
-    }
-
-    protected class DataFrameBytes extends AbstractFrameBytes
-    {
-        private final DataInfo dataInfo;
-        private int size;
-        private volatile ByteBuffer buffer;
-
-        private DataFrameBytes(IStream stream, Callback handler, DataInfo dataInfo)
-        {
-            super(stream, handler);
-            this.dataInfo = dataInfo;
-        }
-
-        @Override
-        public ByteBuffer getByteBuffer()
-        {
-            try
-            {
-                IStream stream = getStream();
-                int windowSize = stream.getWindowSize();
-
-                // TODO: optimization
-                // Right now, we use the windowSize to chunk big buffers.
-                // However, if the window size is large, we may congest the
-                // connection, or favor one stream that does a big download,
-                // starving the other streams.
-                // Also, SPDY DATA frames have a maximum of 16 MiB size, which
-                // is not enforced here.
-                // We should have a configurable "preferredDataFrameSize"
-                // (or even better autotuning) that will allow to send chunks
-                // that will not starve other streams and small enough to
-                // not congest the connection, while avoiding to send too many
-                // TCP packets.
-                // See also comment in class Flusher.
-
-                size = dataInfo.available();
-                if (size > windowSize)
-                    size = windowSize;
-
-                buffer = generator.data(stream.getId(), size, dataInfo);
-                return buffer;
-            }
-            catch (Throwable x)
-            {
-                failed(x);
-                return null;
-            }
-        }
-
-        @Override
-        public void succeeded()
-        {
-            bufferPool.release(buffer);
-            IStream stream = getStream();
-            dataInfo.consume(size);
-            flowControlStrategy.updateWindow(StandardSession.this, stream, -size);
-            if (dataInfo.available() > 0)
-            {
-                // We have written a frame out of this DataInfo, but there is more to write.
-                // We need to keep the correct ordering of frames, to avoid that another
-                // DataInfo for the same stream is written before this one is finished.
-                flush(this, flusher.prepend(this));
-            }
-            else
-            {
-                super.succeeded();
-                stream.updateCloseState(dataInfo.isClose(), true);
-                if (stream.isClosed())
-                    removeStream(stream);
-            }
-        }
-
-        @Override
-        public String toString()
-        {
-            return String.format("DATA bytes @%x available=%d consumed=%d on %s", dataInfo.hashCode(), dataInfo.available(), dataInfo.consumed(), getStream());
-        }
-    }
-
-    protected class CloseFrameBytes extends AbstractFrameBytes
-    {
-        private CloseFrameBytes()
-        {
-            super(null, Callback.Adapter.INSTANCE);
-        }
-
-        @Override
-        public ByteBuffer getByteBuffer()
-        {
-            return BufferUtil.EMPTY_BUFFER;
-        }
-
-        @Override
-        public void succeeded()
-        {
-            super.succeeded();
-            close();
-        }
-    }
-
-    private static class PingInfoCallback extends PingResultInfo implements Callback
-    {
-        private final Promise<PingResultInfo> promise;
-
-        public PingInfoCallback(int pingId, Promise<PingResultInfo> promise)
-        {
-            super(pingId);
-            this.promise = promise;
-        }
-
-        @Override
-        public void succeeded()
-        {
-            if (promise != null)
-                promise.succeeded(this);
-        }
-
-        @Override
-        public void failed(Throwable x)
-        {
-            if (promise != null)
-                promise.failed(x);
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardStream.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardStream.java
deleted file mode 100644
index 3467069..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardStream.java
+++ /dev/null
@@ -1,602 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy;
-
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.eclipse.jetty.io.IdleTimeout;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.HeadersInfo;
-import org.eclipse.jetty.spdy.api.PushInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.RstInfo;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.HeadersFrame;
-import org.eclipse.jetty.spdy.frames.SynReplyFrame;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.FutureCallback;
-import org.eclipse.jetty.util.FuturePromise;
-import org.eclipse.jetty.util.Promise;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.util.thread.Scheduler;
-
-public class StandardStream extends IdleTimeout implements IStream
-{
-    private static final Logger LOG = Log.getLogger(Stream.class);
-    private final Map<String, Object> attributes = new ConcurrentHashMap<>();
-    private final int id;
-    private final byte priority;
-    private final ISession session;
-    private final IStream associatedStream;
-    private final Promise<Stream> promise;
-    private final AtomicInteger windowSize = new AtomicInteger();
-    private final Set<Stream> pushedStreams = Collections.newSetFromMap(new ConcurrentHashMap<Stream, Boolean>());
-    private volatile StreamFrameListener listener;
-    private volatile OpenState openState = OpenState.SYN_SENT;
-    private volatile CloseState closeState = CloseState.OPENED;
-    private volatile boolean reset = false;
-
-    public StandardStream(int id, byte priority, ISession session, IStream associatedStream, Scheduler scheduler, Promise<Stream> promise)
-    {
-        super(scheduler);
-        this.id = id;
-        this.priority = priority;
-        this.session = session;
-        this.associatedStream = associatedStream;
-        this.promise = promise;
-    }
-
-    @Override
-    public int getId()
-    {
-        return id;
-    }
-
-    @Override
-    public IStream getAssociatedStream()
-    {
-        return associatedStream;
-    }
-
-    @Override
-    public Set<Stream> getPushedStreams()
-    {
-        return pushedStreams;
-    }
-
-    @Override
-    public void associate(IStream stream)
-    {
-        pushedStreams.add(stream);
-    }
-
-    @Override
-    public void disassociate(IStream stream)
-    {
-        pushedStreams.remove(stream);
-    }
-
-    @Override
-    public byte getPriority()
-    {
-        return priority;
-    }
-
-    @Override
-    protected void onIdleExpired(TimeoutException timeout)
-    {
-        StreamFrameListener listener = this.listener;
-        if (listener != null)
-            listener.onFailure(this, timeout);
-        // The stream is now gone, we must close it to
-        // avoid that its idle timeout is rescheduled.
-        close();
-    }
-
-    private void close()
-    {
-        closeState = CloseState.CLOSED;
-        onClose();
-    }
-
-    @Override
-    public boolean isOpen()
-    {
-        return !isClosed();
-    }
-
-    @Override
-    public int getWindowSize()
-    {
-        return windowSize.get();
-    }
-
-    @Override
-    public void updateWindowSize(int delta)
-    {
-        int size = windowSize.addAndGet(delta);
-        if (LOG.isDebugEnabled())
-            LOG.debug("Updated window size {} -> {} for {}", size - delta, size, this);
-    }
-
-    @Override
-    public ISession getSession()
-    {
-        return session;
-    }
-
-    @Override
-    public Object getAttribute(String key)
-    {
-        return attributes.get(key);
-    }
-
-    @Override
-    public void setAttribute(String key, Object value)
-    {
-        attributes.put(key, value);
-    }
-
-    @Override
-    public Object removeAttribute(String key)
-    {
-        return attributes.remove(key);
-    }
-
-    @Override
-    public void setStreamFrameListener(StreamFrameListener listener)
-    {
-        this.listener = listener;
-    }
-
-    @Override
-    public StreamFrameListener getStreamFrameListener()
-    {
-        return listener;
-    }
-
-    @Override
-    public void updateCloseState(boolean close, boolean local)
-    {
-        if (LOG.isDebugEnabled())
-            LOG.debug("{} close={} local={}", this, close, local);
-        if (close)
-        {
-            switch (closeState)
-            {
-                case OPENED:
-                {
-                    closeState = local ? CloseState.LOCALLY_CLOSED : CloseState.REMOTELY_CLOSED;
-                    break;
-                }
-                case LOCALLY_CLOSED:
-                {
-                    if (local)
-                        throw new IllegalStateException();
-                    else
-                        close();
-                    break;
-                }
-                case REMOTELY_CLOSED:
-                {
-                    if (local)
-                        close();
-                    else
-                        throw new IllegalStateException();
-                    break;
-                }
-                default:
-                {
-                    LOG.warn("Already CLOSED! {} local={}", this, local);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void process(ControlFrame frame)
-    {
-        notIdle();
-        switch (frame.getType())
-        {
-            case SYN_STREAM:
-            {
-                openState = OpenState.SYN_RECV;
-                break;
-            }
-            case SYN_REPLY:
-            {
-                openState = OpenState.REPLY_RECV;
-                SynReplyFrame synReply = (SynReplyFrame)frame;
-                updateCloseState(synReply.isClose(), false);
-                ReplyInfo replyInfo = new ReplyInfo(synReply.getHeaders(), synReply.isClose());
-                notifyOnReply(replyInfo);
-                break;
-            }
-            case HEADERS:
-            {
-                HeadersFrame headers = (HeadersFrame)frame;
-                updateCloseState(headers.isClose(), false);
-                HeadersInfo headersInfo = new HeadersInfo(headers.getHeaders(), headers.isClose(), headers.isResetCompression());
-                notifyOnHeaders(headersInfo);
-                break;
-            }
-            case RST_STREAM:
-            {
-                reset = true;
-                break;
-            }
-            default:
-            {
-                throw new IllegalStateException();
-            }
-        }
-    }
-
-    @Override
-    public void process(DataInfo dataInfo)
-    {
-        notIdle();
-        // TODO: in v3 we need to send a rst instead of just ignoring
-        // ignore data frame if this stream is remotelyClosed already
-        if (isRemotelyClosed())
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Stream is remotely closed, ignoring {}", dataInfo);
-            return;
-        }
-
-        if (!canReceive())
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Protocol error receiving {}, resetting", dataInfo);
-            session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR), Callback.Adapter.INSTANCE);
-            return;
-        }
-
-        updateCloseState(dataInfo.isClose(), false);
-        notifyOnData(dataInfo);
-    }
-
-    @Override
-    public void succeeded()
-    {
-        if (promise != null)
-            promise.succeeded(this);
-    }
-
-    @Override
-    public void failed(Throwable x)
-    {
-        if (promise != null)
-            promise.failed(x);
-    }
-
-    private void notifyOnReply(ReplyInfo replyInfo)
-    {
-        final StreamFrameListener listener = this.listener;
-        try
-        {
-            if (listener != null)
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Invoking reply callback with {} on listener {}", replyInfo, listener);
-                listener.onReply(this, replyInfo);
-            }
-        }
-        catch (Exception x)
-        {
-            LOG.info("Exception while notifying listener " + listener, x);
-        }
-        catch (Error x)
-        {
-            LOG.info("Exception while notifying listener " + listener, x);
-            throw x;
-        }
-    }
-
-    private void notifyOnHeaders(HeadersInfo headersInfo)
-    {
-        final StreamFrameListener listener = this.listener;
-        try
-        {
-            if (listener != null)
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Invoking headers callback with {} on listener {}", headersInfo, listener);
-                listener.onHeaders(this, headersInfo);
-            }
-        }
-        catch (Exception x)
-        {
-            LOG.info("Exception while notifying listener " + listener, x);
-        }
-        catch (Error x)
-        {
-            LOG.info("Exception while notifying listener " + listener, x);
-            throw x;
-        }
-    }
-
-    private void notifyOnData(DataInfo dataInfo)
-    {
-        final StreamFrameListener listener = this.listener;
-        try
-        {
-            if (listener != null)
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Invoking data callback with {} on listener {}", dataInfo, listener);
-                listener.onData(this, dataInfo);
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Invoked data callback with {} on listener {}", dataInfo, listener);
-            }
-        }
-        catch (Exception x)
-        {
-            LOG.info("Exception while notifying listener " + listener, x);
-        }
-        catch (Error x)
-        {
-            LOG.info("Exception while notifying listener " + listener, x);
-            throw x;
-        }
-    }
-
-    @Override
-    public Stream push(PushInfo pushInfo) throws InterruptedException, ExecutionException, TimeoutException
-    {
-        FuturePromise<Stream> result = new FuturePromise<>();
-        push(pushInfo, result);
-        if (pushInfo.getTimeout() > 0)
-            return result.get(pushInfo.getTimeout(), pushInfo.getUnit());
-        else
-            return result.get();
-    }
-
-    @Override
-    public void push(PushInfo pushInfo, Promise<Stream> promise)
-    {
-        notIdle();
-        if (isClosed() || isReset())
-        {
-            close();
-            promise.failed(new StreamException(getId(), StreamStatus.STREAM_ALREADY_CLOSED,
-                    "Stream: " + this + " already closed or reset!"));
-            return;
-        }
-        PushSynInfo pushSynInfo = new PushSynInfo(getId(), pushInfo);
-        session.syn(pushSynInfo, null, new StreamPromise(promise));
-    }
-
-    @Override
-    public void reply(ReplyInfo replyInfo) throws InterruptedException, ExecutionException, TimeoutException
-    {
-        FutureCallback result = new FutureCallback();
-        reply(replyInfo, result);
-        if (replyInfo.getTimeout() > 0)
-            result.get(replyInfo.getTimeout(), replyInfo.getUnit());
-        else
-            result.get();
-    }
-
-    @Override
-    public void reply(ReplyInfo replyInfo, Callback callback)
-    {
-        notIdle();
-        if (isUnidirectional())
-        {
-            close();
-            throw new IllegalStateException("Protocol violation: cannot send SYN_REPLY frames in unidirectional streams");
-        }
-        openState = OpenState.REPLY_SENT;
-        updateCloseState(replyInfo.isClose(), true);
-        SynReplyFrame frame = new SynReplyFrame(session.getVersion(), replyInfo.getFlags(), getId(), replyInfo.getHeaders());
-        session.control(this, frame, replyInfo.getTimeout(), replyInfo.getUnit(), new StreamCallback(callback));
-    }
-
-    @Override
-    public void data(DataInfo dataInfo) throws InterruptedException, ExecutionException, TimeoutException
-    {
-        FutureCallback result = new FutureCallback();
-        data(dataInfo, result);
-        if (dataInfo.getTimeout() > 0)
-            result.get(dataInfo.getTimeout(), dataInfo.getUnit());
-        else
-            result.get();
-    }
-
-    @Override
-    public void data(DataInfo dataInfo, Callback callback)
-    {
-        notIdle();
-        if (!canSend())
-        {
-            session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR), new StreamCallback());
-            throw new IllegalStateException("Protocol violation: cannot send a DATA frame before a SYN_REPLY frame");
-        }
-        if (isLocallyClosed())
-        {
-            session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR), new StreamCallback());
-            throw new IllegalStateException("Protocol violation: cannot send a DATA frame on a locally closed stream");
-        }
-
-        // Cannot update the close state here, because the data that we send may
-        // be flow controlled, so we need the stream to update the window size.
-        session.data(this, dataInfo, dataInfo.getTimeout(), dataInfo.getUnit(), new StreamCallback(callback));
-    }
-
-    @Override
-    public void headers(HeadersInfo headersInfo) throws InterruptedException, ExecutionException, TimeoutException
-    {
-        FutureCallback result = new FutureCallback();
-        headers(headersInfo, result);
-        if (headersInfo.getTimeout() > 0)
-            result.get(headersInfo.getTimeout(), headersInfo.getUnit());
-        else
-            result.get();
-    }
-
-    @Override
-    public void headers(HeadersInfo headersInfo, Callback callback)
-    {
-        notIdle();
-        if (!canSend())
-        {
-            session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR), new StreamCallback());
-            throw new IllegalStateException("Protocol violation: cannot send a HEADERS frame before a SYN_REPLY frame");
-        }
-        if (isLocallyClosed())
-        {
-            session.rst(new RstInfo(getId(), StreamStatus.PROTOCOL_ERROR), new StreamCallback());
-            throw new IllegalStateException("Protocol violation: cannot send a HEADERS frame on a closed stream");
-        }
-
-        updateCloseState(headersInfo.isClose(), true);
-        HeadersFrame frame = new HeadersFrame(session.getVersion(), headersInfo.getFlags(), getId(), headersInfo.getHeaders());
-        session.control(this, frame, headersInfo.getTimeout(), headersInfo.getUnit(), new StreamCallback(callback));
-    }
-
-    @Override
-    public boolean isUnidirectional()
-    {
-        return associatedStream != null;
-    }
-
-    @Override
-    public boolean isReset()
-    {
-        return reset;
-    }
-
-    @Override
-    public boolean isHalfClosed()
-    {
-        CloseState closeState = this.closeState;
-        return closeState == CloseState.LOCALLY_CLOSED || closeState == CloseState.REMOTELY_CLOSED || closeState == CloseState.CLOSED;
-    }
-
-    @Override
-    public boolean isClosed()
-    {
-        return closeState == CloseState.CLOSED;
-    }
-
-    private boolean isLocallyClosed()
-    {
-        CloseState closeState = this.closeState;
-        return closeState == CloseState.LOCALLY_CLOSED || closeState == CloseState.CLOSED;
-    }
-
-    private boolean isRemotelyClosed()
-    {
-        CloseState closeState = this.closeState;
-        return closeState == CloseState.REMOTELY_CLOSED || closeState == CloseState.CLOSED;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("stream=%d v%d windowSize=%d reset=%s prio=%d %s %s", getId(), session.getVersion(),
-                getWindowSize(), isReset(), priority, openState, closeState);
-    }
-
-    private boolean canSend()
-    {
-        OpenState openState = this.openState;
-        return openState == OpenState.SYN_SENT || openState == OpenState.REPLY_RECV || openState == OpenState.REPLY_SENT;
-    }
-
-    private boolean canReceive()
-    {
-        OpenState openState = this.openState;
-        return openState == OpenState.SYN_RECV || openState == OpenState.REPLY_RECV || openState == OpenState.REPLY_SENT;
-    }
-
-    private enum OpenState
-    {
-        SYN_SENT, SYN_RECV, REPLY_SENT, REPLY_RECV
-    }
-
-    private enum CloseState
-    {
-        OPENED, LOCALLY_CLOSED, REMOTELY_CLOSED, CLOSED
-    }
-
-    private class StreamCallback implements Callback
-    {
-        private final Callback callback;
-
-        private StreamCallback()
-        {
-            this(Callback.Adapter.INSTANCE);
-        }
-
-        private StreamCallback(Callback callback)
-        {
-            this.callback = callback;
-        }
-
-        @Override
-        public void succeeded()
-        {
-            callback.succeeded();
-        }
-
-        @Override
-        public void failed(Throwable x)
-        {
-            close();
-            callback.failed(x);
-        }
-    }
-
-    private class StreamPromise implements Promise<Stream>
-    {
-        private final Promise<Stream> promise;
-
-        public StreamPromise(Promise<Stream> promise)
-        {
-            this.promise = promise;
-        }
-
-        @Override
-        public void succeeded(Stream result)
-        {
-            promise.succeeded(result);
-        }
-
-        @Override
-        public void failed(Throwable x)
-        {
-            close();
-            promise.failed(x);
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StreamException.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StreamException.java
deleted file mode 100644
index 97aa70d..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StreamException.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy;
-
-import org.eclipse.jetty.spdy.api.StreamStatus;
-
-public class StreamException extends RuntimeException
-{
-    private final int streamId;
-    private final StreamStatus streamStatus;
-
-    public StreamException(int streamId, StreamStatus streamStatus)
-    {
-        this.streamId = streamId;
-        this.streamStatus = streamStatus;
-    }
-
-    public StreamException(int streamId, StreamStatus streamStatus, String message)
-    {
-        super(message);
-        this.streamId = streamId;
-        this.streamStatus = streamStatus;
-    }
-
-    public int getStreamId()
-    {
-        return streamId;
-    }
-
-    public StreamStatus getStreamStatus()
-    {
-        return streamStatus;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/ByteBufferDataInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/ByteBufferDataInfo.java
deleted file mode 100644
index 0ac1bd5..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/ByteBufferDataInfo.java
+++ /dev/null
@@ -1,90 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.nio.ByteBuffer;
-import java.util.concurrent.TimeUnit;
-
-/**
- * <p>Specialized {@link DataInfo} for {@link ByteBuffer} content.</p>
- */
-public class ByteBufferDataInfo extends DataInfo
-{
-    private final ByteBuffer buffer;
-    private final int length;
-
-    public ByteBufferDataInfo(ByteBuffer buffer, boolean close)
-    {
-        this(0, TimeUnit.SECONDS, buffer, close);
-    }
-
-    public ByteBufferDataInfo(long timeout, TimeUnit unit, ByteBuffer buffer, boolean close)
-    {
-        super(timeout, unit, close);
-        this.buffer = buffer;
-        this.length = buffer.remaining();
-    }
-
-    @Override
-    public int length()
-    {
-        return length;
-    }
-
-    @Override
-    public int available()
-    {
-        return buffer.remaining();
-    }
-
-    @Override
-    public int readInto(ByteBuffer output)
-    {
-        int space = output.remaining();
-        if (available() > space)
-        {
-            int limit = buffer.limit();
-            buffer.limit(buffer.position() + space);
-            output.put(buffer);
-            buffer.limit(limit);
-        }
-        else
-        {
-            space = buffer.remaining();
-            output.put(buffer);
-        }
-        return space;
-    }
-
-    @Override
-    public int readInto(byte[] bytes, int offset, int length)
-    {
-        int available = available();
-        if (available < length)
-            length = available;
-        buffer.get(bytes, offset, length);
-        return length;
-    }
-
-    @Override
-    protected ByteBuffer allocate(int size)
-    {
-        return buffer.isDirect() ? ByteBuffer.allocateDirect(size) : super.allocate(size);
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/BytesDataInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/BytesDataInfo.java
deleted file mode 100644
index ba67279..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/BytesDataInfo.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.nio.ByteBuffer;
-import java.util.concurrent.TimeUnit;
-
-/**
- * <p>Specialized {@link DataInfo} for byte array content.</p>
- */
-public class BytesDataInfo extends DataInfo
-{
-    private final byte[] bytes;
-    private final int offset;
-    private final int length;
-    private int index;
-
-    public BytesDataInfo(byte[] bytes, boolean close)
-    {
-        this(0, TimeUnit.SECONDS, bytes, close);
-    }
-
-    public BytesDataInfo(long timeout, TimeUnit unit, byte[] bytes, boolean close)
-    {
-        this(timeout, unit, bytes, 0, bytes.length, close);
-    }
-
-    public BytesDataInfo(long timeout, TimeUnit unit, byte[] bytes, int offset, int length, boolean close)
-    {
-        super(timeout, unit, close);
-        this.bytes = bytes;
-        this.offset = offset;
-        this.length = length;
-        this.index = offset;
-    }
-
-    @Override
-    public int length()
-    {
-        return length;
-    }
-
-    @Override
-    public int available()
-    {
-        return length - index + offset;
-    }
-
-    @Override
-    public int readInto(ByteBuffer output)
-    {
-        int space = output.remaining();
-        int chunk = Math.min(available(), space);
-        output.put(bytes, index, chunk);
-        index += chunk;
-        return chunk;
-    }
-
-    @Override
-    public int readInto(byte[] bytes, int offset, int length)
-    {
-        int chunk = Math.min(available(), length);
-        System.arraycopy(this.bytes, index, bytes, offset, chunk);
-        index += chunk;
-        return chunk;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/DataInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/DataInfo.java
deleted file mode 100644
index 067c9e7..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/DataInfo.java
+++ /dev/null
@@ -1,264 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * <p>A container for DATA frames metadata and content bytes.</p>
- * <p>Specialized subclasses (like {@link StringDataInfo}) may be used by applications
- * to send specific types of content.</p>
- * <p>Applications may send multiple instances of {@link DataInfo}, usually of the same
- * type, via {@link Stream#data(DataInfo)}. The last instance must have the
- * {@link #isClose() close flag} set, so that the client knows that no more content is
- * expected.</p>
- * <p>Receivers of {@link DataInfo} via {@link StreamFrameListener#onData(Stream, DataInfo)}
- * have two different APIs to read the data content bytes: a {@link #readInto(ByteBuffer) read}
- * API that does not interact with flow control, and a {@link #consumeInto(ByteBuffer) drain}
- * API that interacts with flow control.</p>
- * <p>Flow control is defined so that when the sender wants to sends a number of bytes larger
- * than the {@link Settings.ID#INITIAL_WINDOW_SIZE} value, it will stop sending as soon as it
- * has sent a number of bytes equal to the window size. The receiver has to <em>consume</em>
- * the data bytes that it received in order to tell the sender to send more bytes.</p>
- * <p>Consuming the data bytes can be done only via {@link #consumeInto(ByteBuffer)} or by a combination
- * of {@link #readInto(ByteBuffer)} and {@link #consume(int)} (possibly at different times).</p>
- */
-public abstract class DataInfo extends Info
-{
-    /**
-     * <p>Flag that indicates that this {@link DataInfo} is the last frame in the stream.</p>
-     *
-     * @see #isClose()
-     * @see #getFlags()
-     */
-    public final static byte FLAG_CLOSE = 1;
-
-    private final AtomicInteger consumed = new AtomicInteger();
-    private boolean close;
-
-    /**
-     * <p>Creates a new {@link DataInfo} with the given close flag and no compression flag.</p>
-     *
-     * @param close the value of the close flag
-     */
-    public DataInfo(boolean close)
-    {
-        setClose(close);
-    }
-
-    /**
-     * <p>Creates a new {@link DataInfo} with the given close flag and no compression flag.</p>
-     *
-     * @param timeout
-     * @param unit
-     * @param close the value of the close flag
-     */
-    protected DataInfo(long timeout, TimeUnit unit, boolean close)
-    {
-        super(timeout, unit);
-        this.close = close;
-    }
-
-    /**
-     * @return the value of the close flag
-     * @see #setClose(boolean)
-     */
-    public boolean isClose()
-    {
-        return close;
-    }
-
-    /**
-     * @param close the value of the close flag
-     * @see #isClose()
-     */
-    public void setClose(boolean close)
-    {
-        this.close = close;
-    }
-
-    /**
-     * @return the close and compress flags as integer
-     * @see #FLAG_CLOSE
-     */
-    public byte getFlags()
-    {
-        return isClose() ? FLAG_CLOSE : 0;
-    }
-
-    /**
-     * @return the total number of content bytes
-     * @see #available()
-     */
-    public abstract int length();
-
-    /**
-     * <p>Returns the available content bytes that can be read via {@link #readInto(ByteBuffer)}.</p>
-     * <p>Each invocation to {@link #readInto(ByteBuffer)} modifies the value returned by this method,
-     * until no more content bytes are available.</p>
-     *
-     * @return the available content bytes
-     * @see #readInto(ByteBuffer)
-     */
-    public abstract int available();
-
-    /**
-     * <p>Copies the content bytes of this {@link DataInfo} into the given {@link ByteBuffer}.</p>
-     * <p>If the given {@link ByteBuffer} cannot contain the whole content of this {@link DataInfo}
-     * then after the read {@link #available()} will return a positive value, and further content
-     * may be retrieved by invoking again this method with a new output buffer.</p>
-     *
-     * @param output the {@link ByteBuffer} to copy the bytes into
-     * @return the number of bytes copied
-     * @see #available()
-     * @see #consumeInto(ByteBuffer)
-     */
-    public abstract int readInto(ByteBuffer output);
-
-    /**
-     * <p>Copies the content bytes of this {@link DataInfo} into the given byte array.</p>
-     * <p>If the given byte array cannot contain the whole content of this {@link DataInfo}
-     * then after the read {@link #available()} will return a positive value, and further content
-     * may be retrieved by invoking again this method with a new byte array.</p>
-     *
-     * @param bytes the byte array to copy the bytes into
-     * @param offset the index of the byte array to start copying
-     * @param length the number of bytes to copy
-     * @return the number of bytes copied
-     */
-    public abstract int readInto(byte[] bytes, int offset, int length);
-
-    /**
-     * <p>Reads and consumes the content bytes of this {@link DataInfo} into the given {@link ByteBuffer}.</p>
-     *
-     * @param output the {@link ByteBuffer} to copy the bytes into
-     * @return the number of bytes copied
-     * @see #consume(int)
-     */
-    public int consumeInto(ByteBuffer output)
-    {
-        int read = readInto(output);
-        consume(read);
-        return read;
-    }
-
-    /**
-     * <p>Reads and consumes the content bytes of this {@link DataInfo} into the given byte array,
-     * starting from index {@code offset} for {@code length} bytes.</p>
-     *
-     * @param bytes the byte array to copy the bytes into
-     * @param offset the offset of the byte array to start copying
-     * @param length the number of bytes to copy
-     * @return the number of bytes copied
-     */
-    public int consumeInto(byte[] bytes, int offset, int length)
-    {
-        int read = readInto(bytes, offset, length);
-        consume(read);
-        return read;
-    }
-
-    /**
-     * <p>Consumes the given number of bytes from this {@link DataInfo}.</p>
-     *
-     * @param delta the number of bytes consumed
-     */
-    public void consume(int delta)
-    {
-        if (delta < 0)
-            throw new IllegalArgumentException();
-        int read = length() - available();
-        int newConsumed = consumed() + delta;
-//        if (newConsumed > read)
-//            throw new IllegalStateException("Consuming without reading: consumed " + newConsumed + " but only read " + read);
-        consumed.addAndGet(delta);
-    }
-
-    /**
-     * @return the number of bytes consumed
-     */
-    public int consumed()
-    {
-        return consumed.get();
-    }
-
-    /**
-     *
-     * @param charset the charset used to convert the bytes
-     * @param consume whether to consume the content
-     * @return a String with the content of this {@link DataInfo}
-     */
-    public String asString(String charset, boolean consume)
-    {
-        return asString(Charset.forName(charset), consume);
-    }
-
-    /**
-     *
-     * @param charset the charset used to convert the bytes
-     * @param consume whether to consume the content
-     * @return a String with the content of this {@link DataInfo}
-     */
-    public String asString(Charset charset, boolean consume)
-    {
-        ByteBuffer buffer = asByteBuffer(consume);
-        return charset.decode(buffer).toString();
-    }
-
-    /**
-     * @return a byte array with the content of this {@link DataInfo}
-     * @param consume whether to consume the content
-     */
-    public byte[] asBytes(boolean consume)
-    {
-        ByteBuffer buffer = asByteBuffer(consume);
-        byte[] result = new byte[buffer.remaining()];
-        buffer.get(result);
-        return result;
-    }
-
-    /**
-     * @return a {@link ByteBuffer} with the content of this {@link DataInfo}
-     * @param consume whether to consume the content
-     */
-    public ByteBuffer asByteBuffer(boolean consume)
-    {
-        ByteBuffer buffer = allocate(available());
-        if (consume)
-            consumeInto(buffer);
-        else
-            readInto(buffer);
-        buffer.flip();
-        return buffer;
-    }
-
-    protected ByteBuffer allocate(int size)
-    {
-        return ByteBuffer.allocate(size);
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("DATA @%x available=%d consumed=%d close=%b", hashCode(), available(), consumed(), isClose());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/GoAwayInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/GoAwayInfo.java
deleted file mode 100644
index 80df510..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/GoAwayInfo.java
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * A GoAwayInfo container. Currently adding nothing to it's base class, but serves to keep the api unchanged in
- * future versions when we need to pass more info to the methods having a {@link GoAwayInfo} parameter.
- */
-public class GoAwayInfo extends Info
-{
-    public GoAwayInfo(long timeout, TimeUnit unit)
-    {
-        super(timeout, unit);
-    }
-
-    public GoAwayInfo()
-    {
-        super();
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/GoAwayResultInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/GoAwayResultInfo.java
deleted file mode 100644
index e07dc8f..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/GoAwayResultInfo.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-/**
- * <p>A container for GOAWAY frames metadata: the last good stream id and
- * the session status.</p>
- */
-public class GoAwayResultInfo
-{
-    private final int lastStreamId;
-    private final SessionStatus sessionStatus;
-
-    /**
-     * <p>Creates a new {@link GoAwayResultInfo} with the given last good stream id and session status</p>
-     *
-     * @param lastStreamId  the last good stream id
-     * @param sessionStatus the session status
-     */
-    public GoAwayResultInfo(int lastStreamId, SessionStatus sessionStatus)
-    {
-        this.lastStreamId = lastStreamId;
-        this.sessionStatus = sessionStatus;
-    }
-
-    /**
-     * @return the last good stream id
-     */
-    public int getLastStreamId()
-    {
-        return lastStreamId;
-    }
-
-    /**
-     * @return the session status
-     */
-    public SessionStatus getSessionStatus()
-    {
-        return sessionStatus;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/HeadersInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/HeadersInfo.java
deleted file mode 100644
index 65c0ffb..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/HeadersInfo.java
+++ /dev/null
@@ -1,135 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.util.Fields;
-
-/**
- * <p>A container for HEADERS frame metadata and headers.</p>
- */
-public class HeadersInfo extends Info
-{
-    /**
-     * <p>Flag that indicates that this {@link HeadersInfo} is the last frame in the stream.</p>
-     *
-     * @see #isClose()
-     * @see #getFlags()
-     */
-    public static final byte FLAG_CLOSE = 1;
-    /**
-     * <p>Flag that indicates that the compression of the stream must be reset.</p>
-     *
-     * @see #isResetCompression()
-     * @see #getFlags()
-     */
-    public static final byte FLAG_RESET_COMPRESSION = 2;
-
-    private final boolean close;
-    private final boolean resetCompression;
-    private final Fields headers;
-
-    /**
-     * <p>Creates a new {@link HeadersInfo} instance with the given headers, the given close flag and no reset
-     * compression flag</p>
-     *
-     * @param headers the {@link Fields}
-     * @param close   the value of the close flag
-     */
-    public HeadersInfo(Fields headers, boolean close)
-    {
-        this(headers, close, false);
-    }
-
-    /**
-     * <p>Creates a new {@link HeadersInfo} instance with the given headers, the given close flag and the given reset
-     * compression flag</p>
-     *
-     * @param headers          the {@link Fields}
-     * @param close            the value of the close flag
-     * @param resetCompression the value of the reset compression flag
-     */
-    public HeadersInfo(Fields headers, boolean close, boolean resetCompression)
-    {
-        this.headers = headers;
-        this.close = close;
-        this.resetCompression = resetCompression;
-    }
-
-    /**
-     * <p>Creates a new {@link HeadersInfo} instance with the given headers, the given close flag and the given reset
-     * compression flag</p>
-     *
-     * @param timeout          the operation's timeout
-     * @param unit             the timeout's unit
-     * @param headers          the {@link Fields}
-     * @param close            the value of the close flag
-     * @param resetCompression the value of the reset compression flag
-     */
-    public HeadersInfo(long timeout, TimeUnit unit, boolean close, boolean resetCompression, Fields headers)
-    {
-        super(timeout, unit);
-        this.close = close;
-        this.resetCompression = resetCompression;
-        this.headers = headers;
-    }
-
-    /**
-     * @return the value of the close flag
-     */
-    public boolean isClose()
-    {
-        return close;
-    }
-
-    /**
-     * @return the value of the reset compression flag
-     */
-    public boolean isResetCompression()
-    {
-        return resetCompression;
-    }
-
-    /**
-     * @return the {@link Fields}
-     */
-    public Fields getHeaders()
-    {
-        return headers;
-    }
-
-    /**
-     * @return the close and reset compression flags as integer
-     * @see #FLAG_CLOSE
-     * @see #FLAG_RESET_COMPRESSION
-     */
-    public byte getFlags()
-    {
-        byte flags = isClose() ? FLAG_CLOSE : 0;
-        flags += isResetCompression() ? FLAG_RESET_COMPRESSION : 0;
-        return flags;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("HEADER close=%b %s", close, headers);
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Info.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Info.java
deleted file mode 100644
index 5eca93e..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Info.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * A base class for all *Info classes providing timeout and unit and api to access them
- */
-public class Info
-{
-    private final long timeout;
-    private final TimeUnit unit;
-
-    public Info(long timeout, TimeUnit unit)
-    {
-        this.timeout = timeout;
-        this.unit = unit;
-    }
-
-    public Info()
-    {
-        timeout = 0;
-        unit = TimeUnit.SECONDS;
-    }
-
-    public long getTimeout()
-    {
-        return timeout;
-    }
-
-    public TimeUnit getUnit()
-    {
-        return unit;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/PingInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/PingInfo.java
deleted file mode 100644
index 322d987..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/PingInfo.java
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * A PingInfo container. Currently adding nothing to it's base class, but serves to keep the api unchanged in
- * future versions when we need to pass more info to the methods having a {@link PingInfo} parameter.
- */
-public class PingInfo extends Info
-{
-    public PingInfo(long timeout, TimeUnit unit)
-    {
-        super(timeout, unit);
-    }
-
-    public PingInfo()
-    {
-        this(0, TimeUnit.SECONDS);
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/PingResultInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/PingResultInfo.java
deleted file mode 100644
index d4f2031..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/PingResultInfo.java
+++ /dev/null
@@ -1,44 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-/**
- * <p>A container for PING frames data.</p>
- */
-public class PingResultInfo
-{
-    private final int pingId;
-
-    /**
-     * <p>Creates a {@link PingResultInfo} with the given ping id</p>
-     * @param pingId the ping id
-     */
-    public PingResultInfo(int pingId)
-    {
-        this.pingId = pingId;
-    }
-
-    /**
-     * @return the ping id
-     */
-    public int getPingId()
-    {
-        return pingId;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/PushInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/PushInfo.java
deleted file mode 100644
index 4654475..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/PushInfo.java
+++ /dev/null
@@ -1,101 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.util.Fields;
-
-/**
- * <p>A container for PUSH_SYN_STREAM frames metadata and data.</p>
- */
-public class PushInfo extends Info
-{
-    /**
-     * <p>Flag that indicates that this {@link PushInfo} is the last frame in the stream.</p>
-     *
-     * @see #isClose()
-     * @see #getFlags()
-     */
-    public static final byte FLAG_CLOSE = 1;
-
-    private final boolean close;
-    private final Fields headers;
-
-    /**
-     * <p>Creates a {@link PushInfo} instance with the given headers and the given close flag,
-     * not unidirectional, without associated stream, and with default priority.</p>
-     *
-     * @param headers the {@link Fields}
-     * @param close the value of the close flag
-     */
-    public PushInfo(Fields headers, boolean close)
-    {
-        this(0, TimeUnit.SECONDS, headers, close);
-        // either builder or setters for timeout
-    }
-
-    /**
-     * <p>
-     * Creates a {@link PushInfo} instance with the given headers, the given close flag and with the given priority.
-     * </p>
-     * @param timeout the timeout value
-     * @param unit the TimeUnit of the timeout
-     * @param headers
- *            the {@link Fields}
-     * @param close
-     */
-    public PushInfo(long timeout, TimeUnit unit, Fields headers, boolean close)
-    {
-        super(timeout, unit);
-        this.close = close;
-        this.headers = headers;
-    }
-
-    /**
-     * @return the value of the close flag
-     */
-    public boolean isClose()
-    {
-        return close;
-    }
-
-    /**
-     * @return the {@link Fields}
-     */
-    public Fields getHeaders()
-    {
-        return headers;
-    }
-
-    /**
-     * @return the close flag as integer
-     * @see #FLAG_CLOSE
-     */
-    public byte getFlags()
-    {
-        return isClose() ? FLAG_CLOSE : 0;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("SYN push close=%b headers=%s", close, headers);
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/ReplyInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/ReplyInfo.java
deleted file mode 100644
index e316954..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/ReplyInfo.java
+++ /dev/null
@@ -1,107 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.util.Fields;
-
-/**
- * <p>A container for SYN_REPLY frames metadata and headers.</p>
- */
-public class ReplyInfo extends Info
-{
-    /**
-     * <p>Flag that indicates that this {@link ReplyInfo} is the last frame in the stream.</p>
-     *
-     * @see #isClose()
-     * @see #getFlags()
-     */
-    public static final byte FLAG_CLOSE = 1;
-
-    private final Fields headers;
-    private final boolean close;
-
-    /**
-     * <p>Creates a new {@link ReplyInfo} instance with empty headers and the given close flag.</p>
-     *
-     * @param close the value of the close flag
-     */
-    public ReplyInfo(boolean close)
-    {
-        this(new Fields(), close);
-    }
-
-    /**
-     * <p>Creates a {@link ReplyInfo} instance with the given headers and the given close flag.</p>
-     *
-     * @param headers the {@link Fields}
-     * @param close   the value of the close flag
-     */
-    public ReplyInfo(Fields headers, boolean close)
-    {
-        this(0, TimeUnit.SECONDS, headers, close);
-    }
-
-    /**
-     * <p>Creates a {@link ReplyInfo} instance with the given headers and the given close flag.</p>
-     *
-     * @param timeout the timeout
-     * @param unit    the time unit for the timeout
-     * @param headers the {@link Fields}
-     * @param close   the value of the close flag
-     */
-    public ReplyInfo(long timeout, TimeUnit unit, Fields headers, boolean close)
-    {
-        super(timeout, unit);
-        this.headers = headers;
-        this.close = close;
-    }
-
-    /**
-     * @return the {@link Fields}
-     */
-    public Fields getHeaders()
-    {
-        return headers;
-    }
-
-    /**
-     * @return the value of the close flag
-     */
-    public boolean isClose()
-    {
-        return close;
-    }
-
-    /**
-     * @return the close and reset compression flags as integer
-     * @see #FLAG_CLOSE
-     */
-    public byte getFlags()
-    {
-        return isClose() ? FLAG_CLOSE : 0;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("REPLY close=%b %s", close, headers);
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/RstInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/RstInfo.java
deleted file mode 100644
index 3b84cd1..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/RstInfo.java
+++ /dev/null
@@ -1,78 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * <p>A container for RST_STREAM frames data: the stream id and the stream status.</p>
- */
-public class RstInfo extends Info
-{
-    private final int streamId;
-    private final StreamStatus streamStatus;
-
-    /**
-     * <p>Creates a new {@link RstInfo} with the given stream id and stream status</p>
-     *
-     * @param timeout      the operation's timeout
-     * @param unit         the timeout's unit
-     * @param streamId     the stream id
-     * @param streamStatus the stream status
-     */
-    public RstInfo(long timeout, TimeUnit unit, int streamId, StreamStatus streamStatus)
-    {
-        super(timeout, unit);
-        this.streamId = streamId;
-        this.streamStatus = streamStatus;
-    }
-
-    /**
-     * <p>Creates a new {@link RstInfo} with the given stream id and stream status</p>
-     *
-     * @param streamId
-     * @param streamStatus
-     */
-    public RstInfo(int streamId, StreamStatus streamStatus)
-    {
-        this(0, TimeUnit.SECONDS, streamId, streamStatus);
-    }
-
-    /**
-     * @return the stream id
-     */
-    public int getStreamId()
-    {
-        return streamId;
-    }
-
-    /**
-     * @return the stream status
-     */
-    public StreamStatus getStreamStatus()
-    {
-        return streamStatus;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("RST stream=%d %s", streamId, streamStatus);
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SPDY.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SPDY.java
deleted file mode 100644
index c8d7af3..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SPDY.java
+++ /dev/null
@@ -1,39 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-/**
- * <p>Helper class that holds useful SPDY constants.</p>
- */
-public class SPDY
-{
-    /**
-     * <p>Constant that indicates the version 2 of the SPDY protocol</p>
-     */
-    public static final short V2 = 2;
-
-    /**
-     * <p>Constant that indicates the version 3 of the SPDY protocol</p>
-     */
-    public static final short V3 = 3;
-
-    private SPDY()
-    {
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SPDYException.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SPDYException.java
deleted file mode 100644
index 81000d7..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SPDYException.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-/**
- * <p>An unrecoverable exception that signals to the application that
- * something wrong happened.</p>
- */
-public class SPDYException extends RuntimeException
-{
-    public SPDYException()
-    {
-    }
-
-    public SPDYException(String message)
-    {
-        super(message);
-    }
-
-    public SPDYException(String message, Throwable cause)
-    {
-        super(message, cause);
-    }
-
-    public SPDYException(Throwable cause)
-    {
-        super(cause);
-    }
-
-    public SPDYException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)
-    {
-        super(message, cause, enableSuppression, writableStackTrace);
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Session.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Session.java
deleted file mode 100644
index 47da10a..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Session.java
+++ /dev/null
@@ -1,261 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.net.InetSocketAddress;
-import java.util.EventListener;
-import java.util.Set;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeoutException;
-
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Promise;
-
-/**
- * <p>A {@link Session} represents the client-side endpoint of a SPDY connection to a single origin server.</p>
- * <p>Once a {@link Session} has been obtained, it can be used to open SPDY streams:</p>
- * <pre>
- * Session session = ...;
- * SynInfo synInfo = new SynInfo(true);
- * session.push(synInfo, new Stream.FrameListener.Adapter()
- * {
- *     public void onReply(Stream stream, ReplyInfo replyInfo)
- *     {
- *         // Stream reply received
- *     }
- * });
- * </pre>
- * <p>A {@link Session} is the active part of the endpoint, and by calling its API applications can generate
- * events on the connection; conversely {@link SessionFrameListener} is the passive part of the endpoint, and
- * has callbacks that are invoked when events happen on the connection.</p>
- *
- * @see SessionFrameListener
- */
-public interface Session
-{
-    /**
-     * @return the SPDY protocol version used by this session
-     */
-    public short getVersion();
-
-    /**
-     * <p>Registers the given {@code listener} to be notified of session events.</p>
-     *
-     * @param listener the listener to register
-     * @see #removeListener(Listener)
-     */
-    public void addListener(Listener listener);
-
-    /**
-     * <p>Deregisters the give {@code listener} from being notified of session events.</p>
-     *
-     * @param listener the listener to deregister
-     * @see #addListener(Listener)
-     */
-    public void removeListener(Listener listener);
-
-    /**
-     * <p>Sends a SYN_FRAME to create a new {@link Stream SPDY stream}.</p>
-     * <p>Callers may use the returned Stream for example, to send data frames.</p>
-     *
-     * @param synInfo  the metadata to send on stream creation
-     * @param listener the listener to invoke when events happen on the stream just created
-     * @return the stream that will be created
-     * @see #syn(SynInfo, StreamFrameListener, Promise)
-     */
-    public Stream syn(SynInfo synInfo, StreamFrameListener listener) throws ExecutionException, InterruptedException, TimeoutException;
-
-    /**
-     * <p>Sends asynchronously a SYN_FRAME to create a new {@link Stream SPDY stream}.</p>
-     * <p>Callers may pass a non-null completion callback to be notified of when the
-     * stream has been created and use the stream, for example, to send data frames.</p>
-     *
-     *
-     * @param synInfo  the metadata to send on stream creation
-     * @param listener the listener to invoke when events happen on the stream just created
-     * @param promise  the completion callback that gets notified of stream creation
-     * @see #syn(SynInfo, StreamFrameListener)
-     */
-    public void syn(SynInfo synInfo, StreamFrameListener listener, Promise<Stream> promise);
-
-    /**
-     * <p>Sends synchronously a RST_STREAM to abort a stream.</p>
-     *
-     * @param rstInfo the metadata to reset the stream
-     * @see #rst(RstInfo, Callback)
-     */
-    public void rst(RstInfo rstInfo) throws InterruptedException, ExecutionException, TimeoutException;
-
-    /**
-     * <p>Sends asynchronously a RST_STREAM to abort a stream.</p>
-     * <p>Callers may pass a non-null completion callback to be notified of when the
-     * reset has been actually sent.</p>
-     *
-     * @param rstInfo the metadata to reset the stream
-     * @param callback the completion callback that gets notified of reset's send
-     * @see #rst(RstInfo)
-     */
-    public void rst(RstInfo rstInfo, Callback callback);
-
-    /**
-     * <p>Sends synchronously a SETTINGS to configure the SPDY connection.</p>
-     *
-     * @param settingsInfo the metadata to send
-     * @see #settings(SettingsInfo, Callback)
-     */
-    public void settings(SettingsInfo settingsInfo) throws ExecutionException, InterruptedException, TimeoutException;
-
-    /**
-     * <p>Sends asynchronously a SETTINGS to configure the SPDY connection.</p>
-     * <p>Callers may pass a non-null completion callback to be notified of when the
-     * settings has been actually sent.</p>
-     *
-     *
-     * @param settingsInfo the metadata to send
-     * @param callback      the completion callback that gets notified of settings' send
-     * @see #settings(SettingsInfo)
-     */
-    public void settings(SettingsInfo settingsInfo, Callback callback);
-
-    /**
-     * <p>Sends synchronously a PING, normally to measure round-trip time.</p>
-     *
-     * @see #ping(PingInfo, Promise)
-     * @param pingInfo
-     */
-    public PingResultInfo ping(PingInfo pingInfo) throws ExecutionException, InterruptedException, TimeoutException;
-
-    /**
-     * <p>Sends asynchronously a PING, normally to measure round-trip time.</p>
-     * <p>Callers may pass a non-null completion callback to be notified of when the
-     * ping has been actually sent.</p>
-     *
-     * @param pingInfo
-     * @param promise the completion callback that gets notified of ping's send
-     * @see #ping(PingInfo)
-     */
-    public void ping(PingInfo pingInfo, Promise<PingResultInfo> promise);
-
-    /**
-     * <p>Closes gracefully this session, sending a GO_AWAY frame and then closing the TCP connection.</p>
-     *
-     * @see #goAway(GoAwayInfo, Callback)
-     * @param goAwayInfo
-     */
-    public void goAway(GoAwayInfo goAwayInfo) throws ExecutionException, InterruptedException, TimeoutException;
-
-    /**
-     * <p>Closes gracefully this session, sending a GO_AWAY frame and then closing the TCP connection.</p>
-     * <p>Callers may pass a non-null completion callback to be notified of when the
-     * go away has been actually sent.</p>
-     *
-     * @param goAwayInfo
-     * @param callback the completion callback that gets notified of go away's send
-     * @see #goAway(GoAwayInfo)
-     */
-    public void goAway(GoAwayInfo goAwayInfo, Callback callback);
-
-    /**
-     * @return a snapshot of the streams currently active in this session
-     * @see #getStream(int)
-     */
-    public Set<Stream> getStreams();
-
-    /**
-     * @param streamId the id of the stream to retrieve
-     * @return the stream with the given stream id
-     * @see #getStreams()
-     */
-    public Stream getStream(int streamId);
-
-    /**
-     * @param key the attribute key
-     * @return an arbitrary object associated with the given key to this session
-     * @see #setAttribute(String, Object)
-     */
-    public Object getAttribute(String key);
-
-    /**
-     * @param key   the attribute key
-     * @param value an arbitrary object to associate with the given key to this session
-     * @see #getAttribute(String)
-     * @see #removeAttribute(String)
-     */
-    public void setAttribute(String key, Object value);
-
-    /**
-     * @param key the attribute key
-     * @return the arbitrary object associated with the given key to this session
-     * @see #setAttribute(String, Object)
-     */
-    public Object removeAttribute(String key);
-
-    /**
-     * @return the local address of the underlying endpoint
-     */
-    public InetSocketAddress getLocalAddress();
-
-    /**
-     * @return the remote address of the underlying endpoint
-     */
-    public InetSocketAddress getRemoteAddress();
-
-    /**
-     * <p>Super interface for listeners with callbacks that are invoked on specific session events.</p>
-     */
-    public interface Listener extends EventListener
-    {
-    }
-
-    /**
-     * <p>Specialized listener that is invoked upon creation and removal of streams.</p>
-     */
-    public interface StreamListener extends Listener
-    {
-        /**
-         * <p>Callback invoked when a new SPDY stream is created.</p>
-         *
-         * @param stream the stream just created
-         */
-        public void onStreamCreated(Stream stream);
-
-        /**
-         * <p>Callback invoked when a SPDY stream is closed.</p>
-         *
-         * @param stream the stream just closed.
-         */
-        public void onStreamClosed(Stream stream);
-
-        /**
-         * <p>Empty implementation of {@link StreamListener}.</p>
-         */
-        public static class Adapter implements StreamListener
-        {
-            @Override
-            public void onStreamCreated(Stream stream)
-            {
-            }
-
-            @Override
-            public void onStreamClosed(Stream stream)
-            {
-            }
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SessionFrameListener.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SessionFrameListener.java
deleted file mode 100644
index 02382f2..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SessionFrameListener.java
+++ /dev/null
@@ -1,163 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.util.EventListener;
-
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/**
- * <p>A {@link SessionFrameListener} is the passive counterpart of a {@link Session} and receives events happening
- * on a SPDY session.</p>
- *
- * @see Session
- */
-public interface SessionFrameListener extends EventListener
-{
-    /**
-     * <p>Callback invoked when a request to create a stream has been received.</p>
-     * <p>Application code should implement this method and reply to the stream creation, eventually
-     * sending data:</p>
-     * <pre>
-     * public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-     * {
-     *     // Do something with the metadata contained in synInfo
-     *
-     *     if (stream.isHalfClosed()) // The other peer will not send data
-     *     {
-     *         stream.reply(new ReplyInfo(false));
-     *         stream.data(new StringDataInfo("foo", true));
-     *         return null; // Not interested in further stream events
-     *     }
-     *
-     *     ...
-     * }
-     * </pre>
-     * <p>Alternatively, if the stream creation requires reading data sent from the other peer:</p>
-     * <pre>
-     * public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-     * {
-     *     // Do something with the metadata contained in synInfo
-     *
-     *     if (!stream.isHalfClosed()) // The other peer will send data
-     *     {
-     *         stream.reply(new ReplyInfo(true));
-     *         return new Stream.FrameListener.Adapter() // Interested in stream events
-     *         {
-     *             public void onData(Stream stream, DataInfo dataInfo)
-     *             {
-     *                 // Do something with the incoming data in dataInfo
-     *             }
-     *         };
-     *     }
-     *
-     *     ...
-     * }
-     * </pre>
-     *
-     * @param stream  the stream just created
-     * @param synInfo the metadata sent on stream creation
-     * @return a listener for stream events, or null if there is no interest in being notified of stream events
-     */
-    public StreamFrameListener onSyn(Stream stream, SynInfo synInfo);
-
-    /**
-     * <p>Callback invoked when a stream error happens.</p>
-     *
-     * @param session the session
-     * @param rstInfo the metadata of the stream error
-     */
-    public void onRst(Session session, RstInfo rstInfo);
-
-    /**
-     * <p>Callback invoked when a request to configure the SPDY connection has been received.</p>
-     *
-     * @param session the session
-     * @param settingsInfo the metadata sent to configure
-     */
-    public void onSettings(Session session, SettingsInfo settingsInfo);
-
-    /**
-     * <p>Callback invoked when a ping request has completed its round-trip.</p>
-     *
-     * @param session the session
-     * @param pingResultInfo the metadata received
-     */
-    public void onPing(Session session, PingResultInfo pingResultInfo);
-
-    /**
-     * <p>Callback invoked when the other peer signals that it is closing the connection.</p>
-     *
-     * @param session the session
-     * @param goAwayResultInfo the metadata sent
-     */
-    public void onGoAway(Session session, GoAwayResultInfo goAwayResultInfo);
-
-    /**
-     * <p>Callback invoked when an exception is thrown during the processing of an event on a
-     * SPDY session.</p>
-     * <p>Examples of such conditions are invalid frames received, corrupted headers compression state, etc.</p>
-     *
-     * @param session the session
-     * @param x the exception that caused the event processing failure
-     */
-    public void onFailure(Session session, Throwable x);
-
-
-    /**
-     * <p>Empty implementation of {@link SessionFrameListener}</p>
-     */
-    public static class Adapter implements SessionFrameListener
-    {
-        private static final Logger logger = Log.getLogger(Adapter.class);
-
-        @Override
-        public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-        {
-            return null;
-        }
-
-        @Override
-        public void onRst(Session session, RstInfo rstInfo)
-        {
-        }
-
-        @Override
-        public void onSettings(Session session, SettingsInfo settingsInfo)
-        {
-        }
-
-        @Override
-        public void onPing(Session session, PingResultInfo pingResultInfo)
-        {
-        }
-
-        @Override
-        public void onGoAway(Session session, GoAwayResultInfo goAwayResultInfo)
-        {
-        }
-
-        @Override
-        public void onFailure(Session session, Throwable x)
-        {
-            logger.info("", x);
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SessionStatus.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SessionStatus.java
deleted file mode 100644
index 36d9972..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SessionStatus.java
+++ /dev/null
@@ -1,68 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * <p>An enumeration of session statuses.</p>
- */
-public enum SessionStatus
-{
-    /**
-     * <p>The session status indicating no errors</p>
-     */
-    OK(0),
-    /**
-     * <p>The session status indicating a protocol error</p>
-     */
-    PROTOCOL_ERROR(1);
-
-    /**
-     * @param code the session status code
-     * @return a {@link SessionStatus} from the given code,
-     * or null if no status exists
-     */
-    public static SessionStatus from(int code)
-    {
-        return Codes.codes.get(code);
-    }
-
-    private final int code;
-
-    private SessionStatus(int code)
-    {
-        this.code = code;
-        Codes.codes.put(code, this);
-    }
-
-    /**
-     * @return the code of this {@link SessionStatus}
-     */
-    public int getCode()
-    {
-        return code;
-    }
-
-    private static class Codes
-    {
-        private static final Map<Integer, SessionStatus> codes = new HashMap<>();
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Settings.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Settings.java
deleted file mode 100644
index 591dbb7..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Settings.java
+++ /dev/null
@@ -1,228 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-public class Settings implements Iterable<Settings.Setting>
-{
-    private final Map<ID, Settings.Setting> settings;
-
-    public Settings()
-    {
-        settings = new HashMap<>();
-    }
-
-    public Settings(Settings original, boolean immutable)
-    {
-        Map<ID, Settings.Setting> copy = new HashMap<>(original.size());
-        copy.putAll(original.settings);
-        settings = immutable ? Collections.unmodifiableMap(copy) : copy;
-    }
-
-    public Setting get(ID id)
-    {
-        return settings.get(id);
-    }
-
-    public void put(Setting setting)
-    {
-        settings.put(setting.id(), setting);
-    }
-
-    public Setting remove(ID id)
-    {
-        return settings.remove(id);
-    }
-
-    public int size()
-    {
-        return settings.size();
-    }
-
-    public void clear()
-    {
-        settings.clear();
-    }
-
-    @Override
-    public boolean equals(Object obj)
-    {
-        if (this == obj)
-            return true;
-        if (obj == null || getClass() != obj.getClass())
-            return false;
-        Settings that = (Settings)obj;
-        return settings.equals(that.settings);
-    }
-
-    @Override
-    public int hashCode()
-    {
-        return settings.hashCode();
-    }
-
-    @Override
-    public Iterator<Setting> iterator()
-    {
-        return settings.values().iterator();
-    }
-
-    @Override
-    public String toString()
-    {
-        return settings.toString();
-    }
-
-    public static final class ID
-    {
-        public static final ID UPLOAD_BANDWIDTH = new ID(1);
-        public static final ID DOWNLOAD_BANDWIDTH = new ID(2);
-        public static final ID ROUND_TRIP_TIME = new ID(3);
-        public static final ID MAX_CONCURRENT_STREAMS = new ID(4);
-        public static final ID CURRENT_CONGESTION_WINDOW = new ID(5);
-        public static final ID DOWNLOAD_RETRANSMISSION_RATE = new ID(6);
-        public static final ID INITIAL_WINDOW_SIZE = new ID(7);
-
-        public synchronized static ID from(int code)
-        {
-            ID id = Codes.codes.get(code);
-            if (id == null)
-                id = new ID(code);
-            return id;
-        }
-
-        private final int code;
-
-        private ID(int code)
-        {
-            this.code = code;
-            Codes.codes.put(code, this);
-        }
-
-        public int code()
-        {
-            return code;
-        }
-
-        @Override
-        public String toString()
-        {
-            return String.valueOf(code);
-        }
-
-        private static class Codes
-        {
-            private static final Map<Integer, ID> codes = new HashMap<>();
-        }
-    }
-
-    public static enum Flag
-    {
-        NONE((byte)0),
-        PERSIST((byte)1),
-        PERSISTED((byte)2);
-
-        public static Flag from(byte code)
-        {
-            return Codes.codes.get(code);
-        }
-
-        private final byte code;
-
-        private Flag(byte code)
-        {
-            this.code = code;
-            Codes.codes.put(code, this);
-        }
-
-        public byte code()
-        {
-            return code;
-        }
-
-        private static class Codes
-        {
-            private static final Map<Byte, Flag> codes = new HashMap<>();
-        }
-    }
-
-    public static class Setting
-    {
-        private final ID id;
-        private final Flag flag;
-        private final int value;
-
-        public Setting(ID id, int value)
-        {
-            this(id, Flag.NONE, value);
-        }
-
-        public Setting(ID id, Flag flag, int value)
-        {
-            this.id = id;
-            this.flag = flag;
-            this.value = value;
-        }
-
-        public ID id()
-        {
-            return id;
-        }
-
-        public Flag flag()
-        {
-            return flag;
-        }
-
-        public int value()
-        {
-            return value;
-        }
-
-        @Override
-        public boolean equals(Object obj)
-        {
-            if (this == obj)
-                return true;
-            if (obj == null || getClass() != obj.getClass())
-                return false;
-            Setting that = (Setting)obj;
-            return value == that.value && flag == that.flag && id == that.id;
-        }
-
-        @Override
-        public int hashCode()
-        {
-            int result = id.hashCode();
-            result = 31 * result + flag.hashCode();
-            result = 31 * result + value;
-            return result;
-        }
-
-        @Override
-        public String toString()
-        {
-            return String.format("[id=%s,flags=%s:value=%d]", id(), flag(), value());
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SettingsInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SettingsInfo.java
deleted file mode 100644
index 43bc2a8..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SettingsInfo.java
+++ /dev/null
@@ -1,61 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.util.concurrent.TimeUnit;
-
-public class SettingsInfo extends Info
-{
-    public static final byte CLEAR_PERSISTED = 1;
-
-    private final Settings settings;
-    private final boolean clearPersisted;
-
-    public SettingsInfo(Settings settings)
-    {
-        this(0, TimeUnit.SECONDS, settings, false);
-    }
-
-    public SettingsInfo(long timeout, TimeUnit unit, Settings settings, boolean clearPersisted)
-    {
-        super(timeout, unit);
-        this.settings = settings;
-        this.clearPersisted = clearPersisted;
-    }
-
-    public SettingsInfo(Settings settings, boolean clearPersisted)
-    {
-        this(0, TimeUnit.SECONDS, settings, clearPersisted);
-    }
-
-    public boolean isClearPersisted()
-    {
-        return clearPersisted;
-    }
-
-    public byte getFlags()
-    {
-        return isClearPersisted() ? CLEAR_PERSISTED : 0;
-    }
-
-    public Settings getSettings()
-    {
-        return settings;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Stream.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Stream.java
deleted file mode 100644
index ced832e..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/Stream.java
+++ /dev/null
@@ -1,237 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.nio.channels.WritePendingException;
-import java.util.Set;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeoutException;
-
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Promise;
-
-/**
- * <p>A {@link Stream} represents a bidirectional exchange of data on top of a {@link Session}.</p> <p>Differently from
- * socket streams, where the input and output streams are permanently associated with the socket (and hence with the
- * connection that the socket represents), there can be multiple SPDY streams for a SPDY session.</p> <p>SPDY streams
- * may terminate without this implying that the SPDY session is terminated.</p> <p>If SPDY is used to transport the HTTP
- * protocol, then a SPDY stream maps to a HTTP request/response cycle, and after the request/response cycle is
- * completed, the stream is closed, and other streams may be opened. Differently from HTTP, though, multiple SPDY
- * streams may be opened concurrently on the same SPDY session.</p> <p>Like {@link Session}, {@link Stream} is the
- * active part and by calling its API applications can generate events on the stream; conversely, {@link
- * StreamFrameListener} is the passive part, and its callbacks are invoked when events happen on the stream.</p> <p>A
- * {@link Stream} can send multiple data frames one after the other but implementations use a flow control mechanism
- * that only sends the data frames if the other end has signalled that it can accept the frame.</p> <p>Data frames
- * should be sent sequentially only when the previous frame has been completely sent. The reason for this requirement is
- * to avoid potentially confusing code such as:</p>
- * <pre>
- * // WRONG CODE, DO NOT USE IT
- * final Stream stream = ...;
- * stream.data(StringDataInfo("chunk1", false), 5, TimeUnit.SECONDS, new Handler&lt;Void&gt;() { ... });
- * stream.data(StringDataInfo("chunk2", true), 1, TimeUnit.SECONDS, new Handler&lt;Void&gt;() { ... });
- * </pre>
- * <p>where the second call to {@link #data(DataInfo, Callback)} has a timeout smaller than the previous call.</p>
- * <p>The behavior of such style of invocations is unspecified (it may even throw an exception - similar to {@link
- * WritePendingException}).</p> <p>The correct sending of data frames is the following:</p>
- * <pre>
- * final Stream stream = ...;
- * ...
- * // Blocking version
- * stream.data(new StringDataInfo("chunk1", false)).get(1, TimeUnit.SECONDS);
- * stream.data(new StringDataInfo("chunk2", true)).get(1, TimeUnit.SECONDS);
- *
- * // Asynchronous version
- * stream.data(new StringDataInfo("chunk1", false), 1, TimeUnit.SECONDS, new Handler.Adapter&lt;Void&gt;()
- * {
- *     public void completed(Void context)
- *     {
- *         stream.data(new StringDataInfo("chunk2", true));
- *     }
- * });
- * </pre>
- *
- * @see StreamFrameListener
- */
-public interface Stream
-{
-    /**
-     * @return the id of this stream
-     */
-    public int getId();
-
-    /**
-     * @return the priority of this stream
-     */
-    public byte getPriority();
-
-    /**
-     * @return the session this stream is associated to
-     */
-    public Session getSession();
-
-    /**
-     * <p>Initiate a unidirectional spdy pushstream associated to this stream asynchronously<p> <p>Callers may use the
-     * returned future to get the pushstream once it got created</p>
-     *
-     * @param pushInfo the metadata to send on stream creation
-     * @return a future containing the stream once it got established
-     * @see #push(PushInfo, Promise)
-     */
-    public Stream push(PushInfo pushInfo) throws InterruptedException, ExecutionException, TimeoutException;
-
-    /**
-     * <p>Initiate a unidirectional spdy pushstream associated to this stream asynchronously<p> <p>Callers may pass a
-     * non-null completion promise to be notified of when the pushstream has been established.</p>
-     *
-     * @param pushInfo the metadata to send on stream creation
-     * @param promise the completion promise that gets notified once the pushstream is established
-     * @see #push(PushInfo)
-     */
-    public void push(PushInfo pushInfo, Promise<Stream> promise);
-
-    /**
-     * <p>Sends asynchronously a SYN_REPLY frame in response to a SYN_STREAM frame.</p> <p>Callers may use the returned
-     * future to wait for the reply to be actually sent.</p>
-     *
-     * @param replyInfo the metadata to send
-     * @see #reply(ReplyInfo, Callback)
-     * @see SessionFrameListener#onSyn(Stream, SynInfo)
-     */
-    public void reply(ReplyInfo replyInfo) throws InterruptedException, ExecutionException, TimeoutException;
-
-    /**
-     * <p>Sends asynchronously a SYN_REPLY frame in response to a SYN_STREAM frame.</p> <p>Callers may pass a non-null
-     * completion callback to be notified of when the reply has been actually sent.</p>
-     *
-     * @param replyInfo the metadata to send
-     * @param callback  the completion callback that gets notified of reply sent
-     * @see #reply(ReplyInfo)
-     */
-    public void reply(ReplyInfo replyInfo, Callback callback);
-
-    /**
-     * <p>Sends asynchronously a DATA frame on this stream.</p> <p>DATA frames should always be sent after a SYN_REPLY
-     * frame.</p> <p>Callers may use the returned future to wait for the data to be actually sent.</p>
-     *
-     * @param dataInfo the metadata to send
-     * @see #data(DataInfo, Callback)
-     * @see #reply(ReplyInfo)
-     */
-    public void data(DataInfo dataInfo) throws InterruptedException, ExecutionException, TimeoutException;
-
-    /**
-     * <p>Sends asynchronously a DATA frame on this stream.</p> <p>DATA frames should always be sent after a SYN_REPLY
-     * frame.</p> <p>Callers may pass a non-null completion callback to be notified of when the data has been actually
-     * sent.</p>
-     *
-     * @param dataInfo the metadata to send
-     * @param callback the completion callback that gets notified of data sent
-     * @see #data(DataInfo)
-     */
-    public void data(DataInfo dataInfo, Callback callback);
-
-    /**
-     * <p>Sends asynchronously a HEADER frame on this stream.</p> <p>HEADERS frames should always be sent after a
-     * SYN_REPLY frame.</p> <p>Callers may use the returned future to wait for the headers to be actually sent.</p>
-     *
-     * @param headersInfo the metadata to send
-     * @see #headers(HeadersInfo, Callback)
-     * @see #reply(ReplyInfo)
-     */
-    public void headers(HeadersInfo headersInfo) throws InterruptedException, ExecutionException, TimeoutException;
-
-    /**
-     * <p>Sends asynchronously a HEADER frame on this stream.</p> <p>HEADERS frames should always be sent after a
-     * SYN_REPLY frame.</p> <p>Callers may pass a non-null completion callback to be notified of when the headers have
-     * been actually sent.</p>
-     *
-     * @param headersInfo the metadata to send
-     * @param callback    the completion callback that gets notified of headers sent
-     * @see #headers(HeadersInfo)
-     */
-    public void headers(HeadersInfo headersInfo, Callback callback);
-
-    /**
-     * @return whether this stream is unidirectional or not
-     */
-    public boolean isUnidirectional();
-
-    /**
-     * @return whether this stream has been reset
-     */
-    public boolean isReset();
-
-    /**
-     * @return whether this stream has been closed by both parties
-     * @see #isHalfClosed()
-     */
-    public boolean isClosed();
-
-    /**
-     * @return whether this stream has been closed by one party only
-     * @see #isClosed()
-     */
-    public boolean isHalfClosed();
-
-    /**
-     * @param key the attribute key
-     * @return an arbitrary object associated with the given key to this stream or null if no object can be found for
-     *         the given key.
-     * @see #setAttribute(String, Object)
-     */
-    public Object getAttribute(String key);
-
-    /**
-     * @param key   the attribute key
-     * @param value an arbitrary object to associate with the given key to this stream
-     * @see #getAttribute(String)
-     * @see #removeAttribute(String)
-     */
-    public void setAttribute(String key, Object value);
-
-    /**
-     * @param key the attribute key
-     * @return the arbitrary object associated with the given key to this stream
-     * @see #setAttribute(String, Object)
-     */
-    public Object removeAttribute(String key);
-
-    /**
-     * @return the associated parent stream or null if this is not an associated stream
-     */
-    public Stream getAssociatedStream();
-
-    /**
-     * @return associated child streams or an empty set if no associated streams exist
-     */
-    public Set<Stream> getPushedStreams();
-
-    /**
-     * Get the idle timeout set for this particular stream
-     * @return the idle timeout
-     */
-    public long getIdleTimeout();
-
-    /**
-     * Set an idle timeout for this stream
-     * @param timeout
-     */
-    public void setIdleTimeout(long timeout);
-
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/StreamFrameListener.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/StreamFrameListener.java
deleted file mode 100644
index 534c26b..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/StreamFrameListener.java
+++ /dev/null
@@ -1,110 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.util.EventListener;
-
-/**
- * <p>A {@link StreamFrameListener} is the passive counterpart of a {@link Stream} and receives
- * events happening on a SPDY stream.</p>
- *
- * @see Stream
- */
-public interface StreamFrameListener extends EventListener
-{
-    /**
-     * <p>Callback invoked when a reply to a stream creation has been received.</p>
-     * <p>Application code may implement this method to send more data to the other end:</p>
-     * <pre>
-     * public void onReply(Stream stream, ReplyInfo replyInfo)
-     * {
-     *     stream.data(new StringDataInfo("content"), true);
-     * }
-     * </pre>
-     * @param stream the stream
-     * @param replyInfo the reply metadata
-     */
-    public void onReply(Stream stream, ReplyInfo replyInfo);
-
-    /**
-     * <p>Callback invoked when headers are received on a stream.</p>
-     *
-     * @param stream the stream
-     * @param headersInfo the headers metadata
-     */
-    public void onHeaders(Stream stream, HeadersInfo headersInfo);
-
-    /**
-     * <p>Callback invoked when a push syn has been received on a stream.</p>
-     *
-     * @param stream the push stream just created
-     * @param pushInfo the push metadata
-     * @return a listener for stream events or null if there is no interest in being notified of stream events
-     */
-    public StreamFrameListener onPush(Stream stream, PushInfo pushInfo);
-
-    /**
-     * <p>Callback invoked when data bytes are received on a stream.</p>
-     * <p>Implementers should be read or consume the content of the
-     * {@link DataInfo} before this method returns.</p>
-     *
-     * @param stream the stream
-     * @param dataInfo the data metadata
-     */
-    public void onData(Stream stream, DataInfo dataInfo);
-
-    /**
-     * <p>Callback invoked on errors.</p>
-     * @param stream the stream
-     * @param x the failure
-     */
-    public void onFailure(Stream stream, Throwable x);
-
-    /**
-     * <p>Empty implementation of {@link StreamFrameListener}</p>
-     */
-    public static class Adapter implements StreamFrameListener
-    {
-        @Override
-        public void onReply(Stream stream, ReplyInfo replyInfo)
-        {
-        }
-
-        @Override
-        public void onHeaders(Stream stream, HeadersInfo headersInfo)
-        {
-        }
-
-        @Override
-        public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-        {
-            return null;
-        }
-
-        @Override
-        public void onData(Stream stream, DataInfo dataInfo)
-        {
-        }
-
-        @Override
-        public void onFailure(Stream stream, Throwable x)
-        {
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/StreamStatus.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/StreamStatus.java
deleted file mode 100644
index 2e3be69..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/StreamStatus.java
+++ /dev/null
@@ -1,128 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * <p>An enumeration of stream statuses.</p>
- */
-public enum StreamStatus
-{
-    /**
-     * <p>The stream status indicating a protocol error</p>
-     */
-    PROTOCOL_ERROR(1, 1),
-    /**
-     * <p>The stream status indicating that the stream is not valid</p>
-     */
-    INVALID_STREAM(2, 2),
-    /**
-     * <p>The stream status indicating that the stream has been refused</p>
-     */
-    REFUSED_STREAM(3, 3),
-    /**
-     * <p>The stream status indicating that the implementation does not support the SPDY version of the stream</p>
-     */
-    UNSUPPORTED_VERSION(4, 4),
-    /**
-     * <p>The stream status indicating that the stream is no longer needed</p>
-     */
-    CANCEL_STREAM(5, 5),
-    /**
-     * <p>The stream status indicating an implementation error</p>
-     */
-    INTERNAL_ERROR(6, 6),
-    /**
-     * <p>The stream status indicating a flow control error</p>
-     */
-    FLOW_CONTROL_ERROR(7, 7),
-    /**
-     * <p>The stream status indicating a stream opened more than once</p>
-     */
-    STREAM_IN_USE(-1, 8),
-    /**
-     * <p>The stream status indicating data on a stream already closed</p>
-     */
-    STREAM_ALREADY_CLOSED(-1, 9),
-    /**
-     * <p>The stream status indicating credentials not valid</p>
-     */
-    INVALID_CREDENTIALS(-1, 10),
-    /**
-     * <p>The stream status indicating that the implementation could not support a frame too large</p>
-     */
-    FRAME_TOO_LARGE(-1, 11);
-
-    /**
-     * @param version the SPDY protocol version
-     * @param code the stream status code
-     * @return a {@link StreamStatus} from the given version and code,
-     * or null if no such status exists
-     */
-    public static StreamStatus from(short version, int code)
-    {
-        switch (version)
-        {
-            case SPDY.V2:
-                return Codes.v2Codes.get(code);
-            case SPDY.V3:
-                return Codes.v3Codes.get(code);
-            default:
-                throw new IllegalStateException();
-        }
-    }
-
-    private final int v2Code;
-    private final int v3Code;
-
-    private StreamStatus(int v2Code, int v3Code)
-    {
-        this.v2Code = v2Code;
-        if (v2Code >= 0)
-            Codes.v2Codes.put(v2Code, this);
-        this.v3Code = v3Code;
-        if (v3Code >= 0)
-            Codes.v3Codes.put(v3Code, this);
-    }
-
-    /**
-     * @param version the SPDY protocol version
-     * @return the stream status code
-     */
-    public int getCode(short version)
-    {
-        switch (version)
-        {
-            case SPDY.V2:
-                return v2Code;
-            case SPDY.V3:
-                return v3Code;
-            default:
-                throw new IllegalStateException();
-        }
-    }
-
-    private static class Codes
-    {
-        private static final Map<Integer, StreamStatus> v2Codes = new HashMap<>();
-        private static final Map<Integer, StreamStatus> v3Codes = new HashMap<>();
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/StringDataInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/StringDataInfo.java
deleted file mode 100644
index d9cb319..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/StringDataInfo.java
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.nio.charset.StandardCharsets;
-import java.util.concurrent.TimeUnit;
-
-/**
- * <p>Specialized {@link DataInfo} for {@link String} content.</p>
- */
-public class StringDataInfo extends BytesDataInfo
-{
-    public StringDataInfo(String string, boolean close)
-    {
-        super(string.getBytes(StandardCharsets.UTF_8), close);
-    }
-
-    public StringDataInfo(long timeout, TimeUnit unit, String string, boolean close)
-    {
-        super(timeout, unit, string.getBytes(StandardCharsets.UTF_8), close);
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SynInfo.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SynInfo.java
deleted file mode 100644
index 8713830..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/SynInfo.java
+++ /dev/null
@@ -1,128 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.util.Fields;
-
-/**
- * <p>A container for SYN_STREAM frames metadata and data.</p>
- */
-public class SynInfo extends Info
-{
-    /**
-     * <p>Flag that indicates that this {@link SynInfo} is the last frame in the stream.</p>
-     *
-     * @see #isClose()
-     * @see #getFlags()
-     */
-    public static final byte FLAG_CLOSE = 1;
-
-    private final boolean close;
-    private final byte priority;
-    private final Fields headers;
-
-    /**
-     * <p>Creates a {@link SynInfo} instance with the given headers and the given close flag,
-     * not unidirectional, without associated stream, and with default priority.</p>
-     *
-     * @param headers the {@link Fields}
-     * @param close the value of the close flag
-     */
-    public SynInfo(Fields headers, boolean close)
-    {
-        this(0, TimeUnit.SECONDS, headers, close, (byte)0);
-        // either builder or setters for timeout
-    }
-
-    /**
-     * <p>
-     * Creates a {@link SynInfo} instance with the given headers, the given close flag and with the given priority.
-     * </p>
-     * @param headers
-     *            the {@link Fields}
-     * @param close
-     *            the value of the close flag
-     * @param priority
-     */
-    public SynInfo(Fields headers, boolean close, byte priority)
-    {
-        this(0, TimeUnit.SECONDS, headers, close, priority);
-    }
-
-    /**
-     * <p>
-     * Creates a {@link SynInfo} instance with the given headers, the given close flag and with the given priority.
-     * </p>
-     * @param timeout the timeout value
-     * @param unit the TimeUnit of the timeout
-     * @param headers
-     *            the {@link Fields}
-     * @param close
-     *            the value of the close flag
-     * @param priority
-     */
-    public SynInfo(long timeout, TimeUnit unit, Fields headers, boolean close, byte priority)
-    {
-        super(timeout, unit);
-        this.close = close;
-        this.priority = priority;
-        this.headers = headers;
-    }
-
-    /**
-     * @return the value of the close flag
-     */
-    public boolean isClose()
-    {
-        return close;
-    }
-
-    /**
-     * @return the priority
-     */
-    public byte getPriority()
-    {
-        return priority;
-    }
-
-    /**
-     * @return the {@link Fields}
-     */
-    public Fields getHeaders()
-    {
-        return headers;
-    }
-
-    /**
-     * @return the close flag as integer
-     * @see #FLAG_CLOSE
-     */
-    public byte getFlags()
-    {
-        return isClose() ? FLAG_CLOSE : 0;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("SYN close=%b headers=%s", close, headers);
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/server/ServerSessionFrameListener.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/server/ServerSessionFrameListener.java
deleted file mode 100644
index 2b7e140..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/api/server/ServerSessionFrameListener.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api.server;
-
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-
-/**
- * <p>Specific, server-side, {@link SessionFrameListener}.</p>
- * <p>In addition to {@link SessionFrameListener}, this listener adds method
- * {@link #onConnect(Session)} that is called when a client first connects to the
- * server and may be used by a server-side application to send a SETTINGS frame
- * to configure the connection before the client can open any stream.</p>
- */
-public interface ServerSessionFrameListener extends SessionFrameListener
-{
-    /**
-     * <p>Callback invoked when a client opens a connection.</p>
-     *
-     * @param session the session
-     */
-    public void onConnect(Session session);
-
-    /**
-     * <p>Empty implementation of {@link ServerSessionFrameListener}</p>
-     */
-    public static class Adapter extends SessionFrameListener.Adapter implements ServerSessionFrameListener
-    {
-        @Override
-        public void onConnect(Session session)
-        {
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/ControlFrame.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/ControlFrame.java
deleted file mode 100644
index 5340db1..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/ControlFrame.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-public abstract class ControlFrame
-{
-    public static final int HEADER_LENGTH = 8;
-
-    private final short version;
-    private final ControlFrameType type;
-    private final byte flags;
-
-    public ControlFrame(short version, ControlFrameType type, byte flags)
-    {
-        this.version = version;
-        this.type = type;
-        this.flags = flags;
-    }
-
-    public short getVersion()
-    {
-        return version;
-    }
-
-    public ControlFrameType getType()
-    {
-        return type;
-    }
-
-    public byte getFlags()
-    {
-        return flags;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("%s frame v%s", getType(), getVersion());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/ControlFrameType.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/ControlFrameType.java
deleted file mode 100644
index bb614de..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/ControlFrameType.java
+++ /dev/null
@@ -1,59 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public enum ControlFrameType
-{
-    SYN_STREAM((short)1),
-    SYN_REPLY((short)2),
-    RST_STREAM((short)3),
-    SETTINGS((short)4),
-    NOOP((short)5),
-    PING((short)6),
-    GO_AWAY((short)7),
-    HEADERS((short)8),
-    WINDOW_UPDATE((short)9),
-    CREDENTIAL((short)10);
-
-    public static ControlFrameType from(short code)
-    {
-        return Codes.codes.get(code);
-    }
-
-    private final short code;
-
-    private ControlFrameType(short code)
-    {
-        this.code = code;
-        Codes.codes.put(code, this);
-    }
-
-    public short getCode()
-    {
-        return code;
-    }
-
-    private static class Codes
-    {
-        private static final Map<Short, ControlFrameType> codes = new HashMap<>();
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/CredentialFrame.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/CredentialFrame.java
deleted file mode 100644
index cf2af82..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/CredentialFrame.java
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import java.security.cert.Certificate;
-
-public class CredentialFrame extends ControlFrame
-{
-    private final short slot;
-    private final byte[] proof;
-    private final Certificate[] certificateChain;
-
-    public CredentialFrame(short version, short slot, byte[] proof, Certificate[] certificateChain)
-    {
-        super(version, ControlFrameType.CREDENTIAL, (byte)0);
-        this.slot = slot;
-        this.proof = proof;
-        this.certificateChain = certificateChain;
-    }
-
-    public short getSlot()
-    {
-        return slot;
-    }
-
-    public byte[] getProof()
-    {
-        return proof;
-    }
-
-    public Certificate[] getCertificateChain()
-    {
-        return certificateChain;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/DataFrame.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/DataFrame.java
deleted file mode 100644
index c58ef2c..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/DataFrame.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import org.eclipse.jetty.spdy.api.DataInfo;
-
-public class DataFrame
-{
-    public static final int HEADER_LENGTH = 8;
-
-    private final int streamId;
-    private final byte flags;
-    private final int length;
-
-    public DataFrame(int streamId, byte flags, int length)
-    {
-        this.streamId = streamId;
-        this.flags = flags;
-        this.length = length;
-    }
-
-    public int getStreamId()
-    {
-        return streamId;
-    }
-
-    public byte getFlags()
-    {
-        return flags;
-    }
-
-    public int getLength()
-    {
-        return length;
-    }
-
-    public boolean isClose()
-    {
-        return (flags & DataInfo.FLAG_CLOSE) == DataInfo.FLAG_CLOSE;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("DATA frame stream=%d length=%d close=%b", getStreamId(), getLength(), isClose());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/GoAwayFrame.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/GoAwayFrame.java
deleted file mode 100644
index b7975c7..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/GoAwayFrame.java
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import org.eclipse.jetty.spdy.api.SessionStatus;
-
-public class GoAwayFrame extends ControlFrame
-{
-    private final int lastStreamId;
-    private final int statusCode;
-
-    public GoAwayFrame(short version, int lastStreamId, int statusCode)
-    {
-        super(version, ControlFrameType.GO_AWAY, (byte)0);
-        this.lastStreamId = lastStreamId;
-        this.statusCode = statusCode;
-    }
-
-    public int getLastStreamId()
-    {
-        return lastStreamId;
-    }
-
-    public int getStatusCode()
-    {
-        return statusCode;
-    }
-
-    @Override
-    public String toString()
-    {
-        SessionStatus sessionStatus = SessionStatus.from(getStatusCode());
-        return String.format("%s last_stream=%d status=%s", super.toString(), getLastStreamId(), sessionStatus == null ? getStatusCode() : sessionStatus);
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/HeadersFrame.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/HeadersFrame.java
deleted file mode 100644
index 82e13eb..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/HeadersFrame.java
+++ /dev/null
@@ -1,61 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import org.eclipse.jetty.spdy.api.HeadersInfo;
-import org.eclipse.jetty.util.Fields;
-
-public class HeadersFrame extends ControlFrame
-{
-    private final int streamId;
-    private final Fields headers;
-
-    public HeadersFrame(short version, byte flags, int streamId, Fields headers)
-    {
-        super(version, ControlFrameType.HEADERS, flags);
-        this.streamId = streamId;
-        this.headers = headers;
-    }
-
-    public int getStreamId()
-    {
-        return streamId;
-    }
-
-    public Fields getHeaders()
-    {
-        return headers;
-    }
-
-    public boolean isClose()
-    {
-        return (getFlags() & HeadersInfo.FLAG_CLOSE) == HeadersInfo.FLAG_CLOSE;
-    }
-
-    public boolean isResetCompression()
-    {
-        return (getFlags() & HeadersInfo.FLAG_RESET_COMPRESSION) == HeadersInfo.FLAG_RESET_COMPRESSION;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("%s stream=%d close=%b reset_compression=%b", super.toString(), getStreamId(), isClose(), isResetCompression());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/NoOpFrame.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/NoOpFrame.java
deleted file mode 100644
index bb38170..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/NoOpFrame.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import org.eclipse.jetty.spdy.api.SPDY;
-
-public class NoOpFrame extends ControlFrame
-{
-    public NoOpFrame()
-    {
-        super(SPDY.V2, ControlFrameType.NOOP, (byte)0);
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/PingFrame.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/PingFrame.java
deleted file mode 100644
index 4258021..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/PingFrame.java
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-public class PingFrame extends ControlFrame
-{
-    private final int pingId;
-
-    public PingFrame(short version, int pingId)
-    {
-        super(version, ControlFrameType.PING, (byte)0);
-        this.pingId = pingId;
-    }
-
-    public int getPingId()
-    {
-        return pingId;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("%s ping=%d", super.toString(), getPingId());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/RstStreamFrame.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/RstStreamFrame.java
deleted file mode 100644
index d6b09ce..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/RstStreamFrame.java
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import org.eclipse.jetty.spdy.api.StreamStatus;
-
-public class RstStreamFrame extends ControlFrame
-{
-    private final int streamId;
-    private final int statusCode;
-
-    public RstStreamFrame(short version, int streamId, int statusCode)
-    {
-        super(version, ControlFrameType.RST_STREAM, (byte)0);
-        this.streamId = streamId;
-        this.statusCode = statusCode;
-    }
-    
-    public int getStreamId()
-    {
-        return streamId;
-    }
-    
-    public int getStatusCode()
-    {
-        return statusCode;
-    }
-    
-    @Override
-    public String toString()
-    {
-        StreamStatus streamStatus = StreamStatus.from(getVersion(), getStatusCode());
-        return String.format("%s stream=%d status=%s", super.toString(), getStreamId(), streamStatus == null ? getStatusCode() : streamStatus);
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/SettingsFrame.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/SettingsFrame.java
deleted file mode 100644
index 263936f..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/SettingsFrame.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import org.eclipse.jetty.spdy.api.Settings;
-import org.eclipse.jetty.spdy.api.SettingsInfo;
-
-public class SettingsFrame extends ControlFrame
-{
-    private final Settings settings;
-
-    public SettingsFrame(short version, byte flags, Settings settings)
-    {
-        super(version, ControlFrameType.SETTINGS, flags);
-        this.settings = settings;
-    }
-
-    public boolean isClearPersisted()
-    {
-        return (getFlags() & SettingsInfo.CLEAR_PERSISTED) == SettingsInfo.CLEAR_PERSISTED;
-    }
-
-    public Settings getSettings()
-    {
-        return settings;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("%s clear_persisted=%b settings=%s", super.toString(), isClearPersisted(), getSettings());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/SynReplyFrame.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/SynReplyFrame.java
deleted file mode 100644
index 372b8ea..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/SynReplyFrame.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.util.Fields;
-
-public class SynReplyFrame extends ControlFrame
-{
-    private final int streamId;
-    private final Fields headers;
-
-    public SynReplyFrame(short version, byte flags, int streamId, Fields headers)
-    {
-        super(version, ControlFrameType.SYN_REPLY, flags);
-        this.streamId = streamId;
-        this.headers = headers;
-    }
-
-    public int getStreamId()
-    {
-        return streamId;
-    }
-
-    public Fields getHeaders()
-    {
-        return headers;
-    }
-
-    public boolean isClose()
-    {
-        return (getFlags() & ReplyInfo.FLAG_CLOSE) == ReplyInfo.FLAG_CLOSE;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("%s stream=%d close=%b", super.toString(), getStreamId(), isClose());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/SynStreamFrame.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/SynStreamFrame.java
deleted file mode 100644
index c6e5757..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/SynStreamFrame.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import org.eclipse.jetty.spdy.PushSynInfo;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.util.Fields;
-
-public class SynStreamFrame extends ControlFrame
-{
-    private final int streamId;
-    private final int associatedStreamId;
-    private final byte priority;
-    private final short slot;
-    private final Fields headers;
-
-    public SynStreamFrame(short version, byte flags, int streamId, int associatedStreamId, byte priority, short slot, Fields headers)
-    {
-        super(version, ControlFrameType.SYN_STREAM, flags);
-        this.streamId = streamId;
-        this.associatedStreamId = associatedStreamId;
-        this.priority = priority;
-        this.slot = slot;
-        this.headers = headers;
-    }
-
-    public int getStreamId()
-    {
-        return streamId;
-    }
-
-    public int getAssociatedStreamId()
-    {
-        return associatedStreamId;
-    }
-
-    public byte getPriority()
-    {
-        return priority;
-    }
-
-    public short getSlot()
-    {
-        return slot;
-    }
-
-    public Fields getHeaders()
-    {
-        return headers;
-    }
-
-    public boolean isClose()
-    {
-        return (getFlags() & SynInfo.FLAG_CLOSE) == SynInfo.FLAG_CLOSE;
-    }
-
-    public boolean isUnidirectional()
-    {
-        return (getFlags() & PushSynInfo.FLAG_UNIDIRECTIONAL) == PushSynInfo.FLAG_UNIDIRECTIONAL;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("%s stream=%d close=%b", super.toString(), getStreamId(), isClose());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/WindowUpdateFrame.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/WindowUpdateFrame.java
deleted file mode 100644
index e39e25e..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/frames/WindowUpdateFrame.java
+++ /dev/null
@@ -1,48 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-public class WindowUpdateFrame extends ControlFrame
-{
-    private final int streamId;
-    private final int windowDelta;
-
-    public WindowUpdateFrame(short version, int streamId, int windowDelta)
-    {
-        super(version, ControlFrameType.WINDOW_UPDATE, (byte)0);
-        this.streamId = streamId;
-        this.windowDelta = windowDelta;
-    }
-
-    public int getStreamId()
-    {
-        return streamId;
-    }
-
-    public int getWindowDelta()
-    {
-        return windowDelta;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.format("%s stream=%d delta=%d", super.toString(), getStreamId(), getWindowDelta());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/ControlFrameGenerator.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/ControlFrameGenerator.java
deleted file mode 100644
index 9a68cae..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/ControlFrameGenerator.java
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.generator;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-
-public abstract class ControlFrameGenerator
-{
-    private final ByteBufferPool bufferPool;
-
-    protected ControlFrameGenerator(ByteBufferPool bufferPool)
-    {
-        this.bufferPool = bufferPool;
-    }
-
-    protected ByteBufferPool getByteBufferPool()
-    {
-        return bufferPool;
-    }
-
-    public abstract ByteBuffer generate(ControlFrame frame);
-
-    protected void generateControlFrameHeader(ControlFrame frame, int frameLength, ByteBuffer buffer)
-    {
-        buffer.putShort((short)(0x8000 + frame.getVersion()));
-        buffer.putShort(frame.getType().getCode());
-        int flagsAndLength = frame.getFlags();
-        flagsAndLength <<= 24;
-        flagsAndLength += frameLength;
-        buffer.putInt(flagsAndLength);
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/CredentialGenerator.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/CredentialGenerator.java
deleted file mode 100644
index 14e6cf1..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/CredentialGenerator.java
+++ /dev/null
@@ -1,87 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.generator;
-
-import java.nio.ByteBuffer;
-import java.security.cert.Certificate;
-import java.security.cert.CertificateEncodingException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.spdy.SessionException;
-import org.eclipse.jetty.spdy.api.SessionStatus;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.CredentialFrame;
-import org.eclipse.jetty.util.BufferUtil;
-
-public class CredentialGenerator extends ControlFrameGenerator
-{
-    public CredentialGenerator(ByteBufferPool bufferPool)
-    {
-        super(bufferPool);
-    }
-
-    @Override
-    public ByteBuffer generate(ControlFrame frame)
-    {
-        CredentialFrame credential = (CredentialFrame)frame;
-
-        byte[] proof = credential.getProof();
-
-        List<byte[]> certificates = serializeCertificates(credential.getCertificateChain());
-        int certificatesLength = 0;
-        for (byte[] certificate : certificates)
-            certificatesLength += certificate.length;
-
-        int frameBodyLength = 2 + 4 + proof.length + certificates.size() * 4 + certificatesLength;
-
-        int totalLength = ControlFrame.HEADER_LENGTH + frameBodyLength;
-        ByteBuffer buffer = getByteBufferPool().acquire(totalLength, Generator.useDirectBuffers);
-        BufferUtil.clearToFill(buffer);
-        generateControlFrameHeader(credential, frameBodyLength, buffer);
-
-        buffer.putShort(credential.getSlot());
-        buffer.putInt(proof.length);
-        buffer.put(proof);
-        for (byte[] certificate : certificates)
-        {
-            buffer.putInt(certificate.length);
-            buffer.put(certificate);
-        }
-
-        buffer.flip();
-        return buffer;
-    }
-
-    private List<byte[]> serializeCertificates(Certificate[] certificates)
-    {
-        try
-        {
-            List<byte[]> result = new ArrayList<>(certificates.length);
-            for (Certificate certificate : certificates)
-                result.add(certificate.getEncoded());
-            return result;
-        }
-        catch (CertificateEncodingException x)
-        {
-            throw new SessionException(SessionStatus.PROTOCOL_ERROR, x);
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/DataFrameGenerator.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/DataFrameGenerator.java
deleted file mode 100644
index 998acd5..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/DataFrameGenerator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.generator;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.frames.DataFrame;
-import org.eclipse.jetty.util.BufferUtil;
-
-public class DataFrameGenerator
-{
-    private final ByteBufferPool bufferPool;
-
-    public DataFrameGenerator(ByteBufferPool bufferPool)
-    {
-        this.bufferPool = bufferPool;
-    }
-
-    public ByteBuffer generate(int streamId, int length, DataInfo dataInfo)
-    {
-        ByteBuffer buffer = bufferPool.acquire(DataFrame.HEADER_LENGTH + length, Generator.useDirectBuffers);
-        BufferUtil.clearToFill(buffer);
-        buffer.limit(length + DataFrame.HEADER_LENGTH);
-        buffer.position(DataFrame.HEADER_LENGTH);
-        // Guaranteed to always be >= 0
-        int read = dataInfo.readInto(buffer);
-
-        buffer.putInt(0, streamId & 0x7F_FF_FF_FF);
-        buffer.putInt(4, read & 0x00_FF_FF_FF);
-
-        byte flags = dataInfo.getFlags();
-        if (dataInfo.available() > 0)
-            flags &= ~DataInfo.FLAG_CLOSE;
-        buffer.put(4, flags);
-
-        buffer.flip();
-        return buffer;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/Generator.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/Generator.java
deleted file mode 100644
index 46a35a0..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/Generator.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.generator;
-
-import java.nio.ByteBuffer;
-import java.util.EnumMap;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.spdy.CompressionFactory;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.ControlFrameType;
-
-public class Generator
-{
-    final static boolean useDirectBuffers=false;
-    private final EnumMap<ControlFrameType, ControlFrameGenerator> generators = new EnumMap<>(ControlFrameType.class);
-    private final DataFrameGenerator dataFrameGenerator;
-
-    public Generator(ByteBufferPool bufferPool, CompressionFactory.Compressor compressor)
-    {
-        HeadersBlockGenerator headersBlockGenerator = new HeadersBlockGenerator(compressor);
-        generators.put(ControlFrameType.SYN_STREAM, new SynStreamGenerator(bufferPool, headersBlockGenerator));
-        generators.put(ControlFrameType.SYN_REPLY, new SynReplyGenerator(bufferPool, headersBlockGenerator));
-        generators.put(ControlFrameType.RST_STREAM, new RstStreamGenerator(bufferPool));
-        generators.put(ControlFrameType.SETTINGS, new SettingsGenerator(bufferPool));
-        generators.put(ControlFrameType.NOOP, new NoOpGenerator(bufferPool));
-        generators.put(ControlFrameType.PING, new PingGenerator(bufferPool));
-        generators.put(ControlFrameType.GO_AWAY, new GoAwayGenerator(bufferPool));
-        generators.put(ControlFrameType.HEADERS, new HeadersGenerator(bufferPool, headersBlockGenerator));
-        generators.put(ControlFrameType.WINDOW_UPDATE, new WindowUpdateGenerator(bufferPool));
-        generators.put(ControlFrameType.CREDENTIAL, new CredentialGenerator(bufferPool));
-
-        dataFrameGenerator = new DataFrameGenerator(bufferPool);
-    }
-
-    public ByteBuffer control(ControlFrame frame)
-    {
-        ControlFrameGenerator generator = generators.get(frame.getType());
-        return generator.generate(frame);
-    }
-
-    public ByteBuffer data(int streamId, int length, DataInfo dataInfo)
-    {
-        return dataFrameGenerator.generate(streamId, length, dataInfo);
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/GoAwayGenerator.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/GoAwayGenerator.java
deleted file mode 100644
index 2a2e717..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/GoAwayGenerator.java
+++ /dev/null
@@ -1,67 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.generator;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.GoAwayFrame;
-import org.eclipse.jetty.util.BufferUtil;
-
-public class GoAwayGenerator extends ControlFrameGenerator
-{
-    public GoAwayGenerator(ByteBufferPool bufferPool)
-    {
-        super(bufferPool);
-    }
-
-    @Override
-    public ByteBuffer generate(ControlFrame frame)
-    {
-        GoAwayFrame goAway = (GoAwayFrame)frame;
-
-        int frameBodyLength = 8;
-        int totalLength = ControlFrame.HEADER_LENGTH + frameBodyLength;
-        ByteBuffer buffer = getByteBufferPool().acquire(totalLength, Generator.useDirectBuffers);
-        BufferUtil.clearToFill(buffer);
-        generateControlFrameHeader(goAway, frameBodyLength, buffer);
-
-        buffer.putInt(goAway.getLastStreamId() & 0x7F_FF_FF_FF);
-        writeStatusCode(goAway, buffer);
-
-        buffer.flip();
-        return buffer;
-    }
-
-    private void writeStatusCode(GoAwayFrame goAway, ByteBuffer buffer)
-    {
-        switch (goAway.getVersion())
-        {
-            case SPDY.V2:
-                break;
-            case SPDY.V3:
-                buffer.putInt(goAway.getStatusCode());
-                break;
-            default:
-                throw new IllegalStateException();
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/HeadersBlockGenerator.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/HeadersBlockGenerator.java
deleted file mode 100644
index 68e56bc..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/HeadersBlockGenerator.java
+++ /dev/null
@@ -1,150 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.generator;
-
-import java.io.ByteArrayOutputStream;
-import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Locale;
-
-import org.eclipse.jetty.spdy.CompressionDictionary;
-import org.eclipse.jetty.spdy.CompressionFactory;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.util.Fields;
-
-public class HeadersBlockGenerator
-{
-    private final CompressionFactory.Compressor compressor;
-    private boolean needsDictionary = true;
-
-    public HeadersBlockGenerator(CompressionFactory.Compressor compressor)
-    {
-        this.compressor = compressor;
-    }
-
-    public ByteBuffer generate(short version, Fields headers)
-    {
-        // TODO: ByteArrayOutputStream is quite inefficient, but grows on demand; optimize using ByteBuffer ?
-        final Charset iso1 = StandardCharsets.ISO_8859_1;
-        ByteArrayOutputStream buffer = new ByteArrayOutputStream(headers.getSize() * 64);
-        writeCount(version, buffer, headers.getSize());
-        for (Fields.Field header : headers)
-        {
-            String name = header.getName().toLowerCase(Locale.ENGLISH);
-            byte[] nameBytes = name.getBytes(iso1);
-            writeNameLength(version, buffer, nameBytes.length);
-            buffer.write(nameBytes, 0, nameBytes.length);
-
-            // Most common path first
-            String value = header.getValue();
-            byte[] valueBytes = value.getBytes(iso1);
-            if (header.hasMultipleValues())
-            {
-                List<String> values = header.getValues();
-                for (int i = 1; i < values.size(); ++i)
-                {
-                    byte[] moreValueBytes = values.get(i).getBytes(iso1);
-                    byte[] newValueBytes = Arrays.copyOf(valueBytes,valueBytes.length + 1 + moreValueBytes.length);
-                    newValueBytes[valueBytes.length] = 0;
-                    System.arraycopy(moreValueBytes, 0, newValueBytes, valueBytes.length + 1, moreValueBytes.length);
-                    valueBytes = newValueBytes;
-                }
-            }
-
-            writeValueLength(version, buffer, valueBytes.length);
-            buffer.write(valueBytes, 0, valueBytes.length);
-        }
-
-        return compress(version, buffer.toByteArray());
-    }
-
-    private ByteBuffer compress(short version, byte[] bytes)
-    {
-        ByteArrayOutputStream buffer = new ByteArrayOutputStream(bytes.length);
-
-        // The headers compression context is per-session, so we need to synchronize
-        synchronized (compressor)
-        {
-            if (needsDictionary)
-            {
-                compressor.setDictionary(CompressionDictionary.get(version));
-                needsDictionary = false;
-            }
-
-            compressor.setInput(bytes);
-
-            // Compressed bytes may be bigger than input bytes, so we need to loop and accumulate them
-            // Beware that the minimum amount of bytes generated by the compressor is few bytes, so we
-            // need to use an output buffer that is big enough to exit the compress loop
-            buffer.reset();
-            int compressed;
-            byte[] output = new byte[Math.max(256, bytes.length)];
-            while (true)
-            {
-                // SPDY uses the SYNC_FLUSH mode
-                compressed = compressor.compress(output);
-                buffer.write(output, 0, compressed);
-                if (compressed < output.length)
-                    break;
-            }
-        }
-
-        return ByteBuffer.wrap(buffer.toByteArray());
-    }
-
-    private void writeCount(short version, ByteArrayOutputStream buffer, int value)
-    {
-        switch (version)
-        {
-            case SPDY.V2:
-            {
-                buffer.write((value & 0xFF_00) >>> 8);
-                buffer.write(value & 0x00_FF);
-                break;
-            }
-            case SPDY.V3:
-            {
-                buffer.write((value & 0xFF_00_00_00) >>> 24);
-                buffer.write((value & 0x00_FF_00_00) >>> 16);
-                buffer.write((value & 0x00_00_FF_00) >>> 8);
-                buffer.write(value & 0x00_00_00_FF);
-                break;
-            }
-            default:
-            {
-                // Here the version is trusted to be correct; if it's not
-                // then it's a bug rather than an application error
-                throw new IllegalStateException();
-            }
-        }
-    }
-
-    private void writeNameLength(short version, ByteArrayOutputStream buffer, int length)
-    {
-        writeCount(version, buffer, length);
-    }
-
-    private void writeValueLength(short version, ByteArrayOutputStream buffer, int length)
-    {
-        writeCount(version, buffer, length);
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/HeadersGenerator.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/HeadersGenerator.java
deleted file mode 100644
index 23b75eb..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/HeadersGenerator.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.generator;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.spdy.SessionException;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.SessionStatus;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.HeadersFrame;
-import org.eclipse.jetty.util.BufferUtil;
-
-public class HeadersGenerator extends ControlFrameGenerator
-{
-    private final HeadersBlockGenerator headersBlockGenerator;
-
-    public HeadersGenerator(ByteBufferPool bufferPool, HeadersBlockGenerator headersBlockGenerator)
-    {
-        super(bufferPool);
-        this.headersBlockGenerator = headersBlockGenerator;
-    }
-
-    @Override
-    public ByteBuffer generate(ControlFrame frame)
-    {
-        HeadersFrame headers = (HeadersFrame)frame;
-        short version = headers.getVersion();
-
-        ByteBuffer headersBuffer = headersBlockGenerator.generate(version, headers.getHeaders());
-
-        int frameBodyLength = 4;
-        if (frame.getVersion() == SPDY.V2)
-            frameBodyLength += 2;
-
-        int frameLength = frameBodyLength + headersBuffer.remaining();
-        if (frameLength > 0xFF_FF_FF)
-        {
-            // Too many headers, but unfortunately we have already modified the compression
-            // context, so we have no other choice than tear down the connection.
-            throw new SessionException(SessionStatus.PROTOCOL_ERROR, "Too many headers");
-        }
-
-        int totalLength = ControlFrame.HEADER_LENGTH + frameLength;
-
-        ByteBuffer buffer = getByteBufferPool().acquire(totalLength, Generator.useDirectBuffers);
-        BufferUtil.clearToFill(buffer);
-        generateControlFrameHeader(headers, frameLength, buffer);
-
-        buffer.putInt(headers.getStreamId() & 0x7F_FF_FF_FF);
-        if (frame.getVersion() == SPDY.V2)
-            buffer.putShort((short)0);
-
-        buffer.put(headersBuffer);
-
-        buffer.flip();
-        return buffer;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/NoOpGenerator.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/NoOpGenerator.java
deleted file mode 100644
index 0c7c650..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/NoOpGenerator.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.generator;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.NoOpFrame;
-import org.eclipse.jetty.util.BufferUtil;
-
-public class NoOpGenerator extends ControlFrameGenerator
-{
-    public NoOpGenerator(ByteBufferPool bufferPool)
-    {
-        super(bufferPool);
-    }
-
-    @Override
-    public ByteBuffer generate(ControlFrame frame)
-    {
-        NoOpFrame noOp = (NoOpFrame)frame;
-
-        int frameBodyLength = 0;
-        int totalLength = ControlFrame.HEADER_LENGTH + frameBodyLength;
-        ByteBuffer buffer = getByteBufferPool().acquire(totalLength, Generator.useDirectBuffers);
-        BufferUtil.clearToFill(buffer);
-        generateControlFrameHeader(noOp, frameBodyLength, buffer);
-
-        buffer.flip();
-        return buffer;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/PingGenerator.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/PingGenerator.java
deleted file mode 100644
index 7237471..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/PingGenerator.java
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.generator;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.PingFrame;
-import org.eclipse.jetty.util.BufferUtil;
-
-public class PingGenerator extends ControlFrameGenerator
-{
-    public PingGenerator(ByteBufferPool bufferPool)
-    {
-        super(bufferPool);
-    }
-
-    @Override
-    public ByteBuffer generate(ControlFrame frame)
-    {
-        PingFrame ping = (PingFrame)frame;
-
-        int frameBodyLength = 4;
-        int totalLength = ControlFrame.HEADER_LENGTH + frameBodyLength;
-        ByteBuffer buffer = getByteBufferPool().acquire(totalLength, Generator.useDirectBuffers);
-        BufferUtil.clearToFill(buffer);
-        generateControlFrameHeader(ping, frameBodyLength, buffer);
-
-        buffer.putInt(ping.getPingId());
-
-        buffer.flip();
-        return buffer;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/RstStreamGenerator.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/RstStreamGenerator.java
deleted file mode 100644
index 47b123c..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/RstStreamGenerator.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.generator;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.RstStreamFrame;
-import org.eclipse.jetty.util.BufferUtil;
-
-public class RstStreamGenerator extends ControlFrameGenerator
-{
-    public RstStreamGenerator(ByteBufferPool bufferPool)
-    {
-        super(bufferPool);
-    }
-
-    @Override
-    public ByteBuffer generate(ControlFrame frame)
-    {
-        RstStreamFrame rstStream = (RstStreamFrame)frame;
-
-        int frameBodyLength = 8;
-        int totalLength = ControlFrame.HEADER_LENGTH + frameBodyLength;
-        ByteBuffer buffer = getByteBufferPool().acquire(totalLength, Generator.useDirectBuffers);
-        BufferUtil.clearToFill(buffer);
-        generateControlFrameHeader(rstStream, frameBodyLength, buffer);
-
-        buffer.putInt(rstStream.getStreamId() & 0x7F_FF_FF_FF);
-        buffer.putInt(rstStream.getStatusCode());
-
-        buffer.flip();
-        return buffer;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/SettingsGenerator.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/SettingsGenerator.java
deleted file mode 100644
index 0fcf2cf..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/SettingsGenerator.java
+++ /dev/null
@@ -1,91 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.generator;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Settings;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.SettingsFrame;
-import org.eclipse.jetty.util.BufferUtil;
-
-public class SettingsGenerator extends ControlFrameGenerator
-{
-    public SettingsGenerator(ByteBufferPool bufferPool)
-    {
-        super(bufferPool);
-    }
-
-    @Override
-    public ByteBuffer generate(ControlFrame frame)
-    {
-        SettingsFrame settingsFrame = (SettingsFrame)frame;
-
-        Settings settings = settingsFrame.getSettings();
-        int size = settings.size();
-        int frameBodyLength = 4 + 8 * size;
-        int totalLength = ControlFrame.HEADER_LENGTH + frameBodyLength;
-        ByteBuffer buffer = getByteBufferPool().acquire(totalLength, Generator.useDirectBuffers);
-        BufferUtil.clearToFill(buffer);
-        generateControlFrameHeader(settingsFrame, frameBodyLength, buffer);
-
-        buffer.putInt(size);
-
-        for (Settings.Setting setting : settings)
-        {
-            int id = setting.id().code();
-            byte flags = setting.flag().code();
-            int idAndFlags = convertIdAndFlags(frame.getVersion(), id, flags);
-            buffer.putInt(idAndFlags);
-            buffer.putInt(setting.value());
-        }
-
-        buffer.flip();
-        return buffer;
-    }
-
-    private int convertIdAndFlags(short version, int id, byte flags)
-    {
-        switch (version)
-        {
-            case SPDY.V2:
-            {
-                // In v2 the format is 24 bits of ID + 8 bits of flag
-                int idAndFlags = (id << 8) + (flags & 0xFF);
-                // A bug in the Chromium implementation forces v2 to have
-                // the 3 ID bytes little endian, so we swap first and third
-                int result = idAndFlags & 0x00_FF_00_FF;
-                result += (idAndFlags & 0xFF_00_00_00) >>> 16;
-                result += (idAndFlags & 0x00_00_FF_00) << 16;
-                return result;
-            }
-            case SPDY.V3:
-            {
-                // In v3 the format is 8 bits of flags + 24 bits of ID
-                return (flags << 24) + (id & 0xFF_FF_FF);
-            }
-            default:
-            {
-                throw new IllegalStateException();
-            }
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/SynReplyGenerator.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/SynReplyGenerator.java
deleted file mode 100644
index 26ba734..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/SynReplyGenerator.java
+++ /dev/null
@@ -1,104 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.generator;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.spdy.SessionException;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.SessionStatus;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.SynReplyFrame;
-import org.eclipse.jetty.util.BufferUtil;
-
-public class SynReplyGenerator extends ControlFrameGenerator
-{
-    private final HeadersBlockGenerator headersBlockGenerator;
-
-    public SynReplyGenerator(ByteBufferPool bufferPool, HeadersBlockGenerator headersBlockGenerator)
-    {
-        super(bufferPool);
-        this.headersBlockGenerator = headersBlockGenerator;
-    }
-
-    @Override
-    public ByteBuffer generate(ControlFrame frame)
-    {
-        SynReplyFrame synReply = (SynReplyFrame)frame;
-        short version = synReply.getVersion();
-
-        ByteBuffer headersBuffer = headersBlockGenerator.generate(version, synReply.getHeaders());
-
-        int frameBodyLength = getFrameDataLength(version);
-
-        int frameLength = frameBodyLength + headersBuffer.remaining();
-        if (frameLength > 0xFF_FF_FF)
-        {
-            // Too many headers, but unfortunately we have already modified the compression
-            // context, so we have no other choice than tear down the connection.
-            throw new SessionException(SessionStatus.PROTOCOL_ERROR, "Too many headers");
-        }
-
-        int totalLength = ControlFrame.HEADER_LENGTH + frameLength;
-
-        ByteBuffer buffer = getByteBufferPool().acquire(totalLength, Generator.useDirectBuffers);
-        BufferUtil.clearToFill(buffer);
-        generateControlFrameHeader(synReply, frameLength, buffer);
-
-        buffer.putInt(synReply.getStreamId() & 0x7F_FF_FF_FF);
-        writeAdditional(version, buffer);
-
-        buffer.put(headersBuffer);
-
-        buffer.flip();
-        return buffer;
-    }
-
-    private int getFrameDataLength(short version)
-    {
-        switch (version)
-        {
-            case SPDY.V2:
-                return 6;
-            case SPDY.V3:
-                return 4;
-            default:
-                // Here the version is trusted to be correct; if it's not
-                // then it's a bug rather than an application error
-                throw new IllegalStateException();
-        }
-    }
-
-    private void writeAdditional(short version, ByteBuffer buffer)
-    {
-        switch (version)
-        {
-            case SPDY.V2:
-                buffer.putShort((short)0);
-                break;
-            case SPDY.V3:
-                break;
-            default:
-                // Here the version is trusted to be correct; if it's not
-                // then it's a bug rather than an application error
-                throw new IllegalStateException();
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/SynStreamGenerator.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/SynStreamGenerator.java
deleted file mode 100644
index 2ad58fc..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/SynStreamGenerator.java
+++ /dev/null
@@ -1,94 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.generator;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.spdy.SessionException;
-import org.eclipse.jetty.spdy.StreamException;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.SessionStatus;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.SynStreamFrame;
-import org.eclipse.jetty.util.BufferUtil;
-
-public class SynStreamGenerator extends ControlFrameGenerator
-{
-    private final HeadersBlockGenerator headersBlockGenerator;
-
-    public SynStreamGenerator(ByteBufferPool bufferPool, HeadersBlockGenerator headersBlockGenerator)
-    {
-        super(bufferPool);
-        this.headersBlockGenerator = headersBlockGenerator;
-    }
-
-    @Override
-    public ByteBuffer generate(ControlFrame frame)
-    {
-        SynStreamFrame synStream = (SynStreamFrame)frame;
-        short version = synStream.getVersion();
-
-        ByteBuffer headersBuffer = headersBlockGenerator.generate(version, synStream.getHeaders());
-
-        int frameBodyLength = 10;
-
-        int frameLength = frameBodyLength + headersBuffer.remaining();
-        if (frameLength > 0xFF_FF_FF)
-        {
-            // Too many headers, but unfortunately we have already modified the compression
-            // context, so we have no other choice than tear down the connection.
-            throw new SessionException(SessionStatus.PROTOCOL_ERROR, "Too many headers");
-        }
-
-        int totalLength = ControlFrame.HEADER_LENGTH + frameLength;
-
-        ByteBuffer buffer = getByteBufferPool().acquire(totalLength, Generator.useDirectBuffers);
-        BufferUtil.clearToFill(buffer);
-        generateControlFrameHeader(synStream, frameLength, buffer);
-
-        int streamId = synStream.getStreamId();
-        buffer.putInt(streamId & 0x7F_FF_FF_FF);
-        buffer.putInt(synStream.getAssociatedStreamId() & 0x7F_FF_FF_FF);
-        writePriority(streamId, version, synStream.getPriority(), buffer);
-        buffer.put((byte)synStream.getSlot());
-
-        buffer.put(headersBuffer);
-
-        buffer.flip();
-        return buffer;
-    }
-
-    private void writePriority(int streamId, short version, byte priority, ByteBuffer buffer)
-    {
-        switch (version)
-        {
-            case SPDY.V2:
-                priority <<= 6;
-                break;
-            case SPDY.V3:
-                priority <<= 5;
-                break;
-            default:
-                throw new StreamException(streamId, StreamStatus.UNSUPPORTED_VERSION);
-        }
-        buffer.put(priority);
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/WindowUpdateGenerator.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/WindowUpdateGenerator.java
deleted file mode 100644
index 2ee745e..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/generator/WindowUpdateGenerator.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.generator;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.WindowUpdateFrame;
-import org.eclipse.jetty.util.BufferUtil;
-
-public class WindowUpdateGenerator extends ControlFrameGenerator
-{
-    public WindowUpdateGenerator(ByteBufferPool bufferPool)
-    {
-        super(bufferPool);
-    }
-
-    @Override
-    public ByteBuffer generate(ControlFrame frame)
-    {
-        WindowUpdateFrame windowUpdate = (WindowUpdateFrame)frame;
-
-        int frameBodyLength = 8;
-        int totalLength = ControlFrame.HEADER_LENGTH + frameBodyLength;
-        ByteBuffer buffer = getByteBufferPool().acquire(totalLength, Generator.useDirectBuffers);
-        BufferUtil.clearToFill(buffer);
-        generateControlFrameHeader(windowUpdate, frameBodyLength, buffer);
-
-        buffer.putInt(windowUpdate.getStreamId() & 0x7F_FF_FF_FF);
-        buffer.putInt(windowUpdate.getWindowDelta() & 0x7F_FF_FF_FF);
-
-        buffer.flip();
-        return buffer;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/ControlFrameBodyParser.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/ControlFrameBodyParser.java
deleted file mode 100644
index 435f887..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/ControlFrameBodyParser.java
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.nio.ByteBuffer;
-
-public abstract class ControlFrameBodyParser
-{
-    public abstract boolean parse(ByteBuffer buffer);
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/ControlFrameParser.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/ControlFrameParser.java
deleted file mode 100644
index e4162a7..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/ControlFrameParser.java
+++ /dev/null
@@ -1,213 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.nio.ByteBuffer;
-import java.util.EnumMap;
-
-import org.eclipse.jetty.spdy.CompressionFactory;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.ControlFrameType;
-
-public abstract class ControlFrameParser
-{
-    private final EnumMap<ControlFrameType, ControlFrameBodyParser> parsers = new EnumMap<>(ControlFrameType.class);
-    private final ControlFrameBodyParser unknownParser = new UnknownControlFrameBodyParser(this);
-    private State state = State.VERSION;
-    private int cursor;
-    private short version;
-    private short type;
-    private byte flags;
-    private int length;
-    private ControlFrameBodyParser bodyParser;
-    private int bytesToSkip = 0;
-
-    public ControlFrameParser(CompressionFactory.Decompressor decompressor)
-    {
-        parsers.put(ControlFrameType.SYN_STREAM, new SynStreamBodyParser(decompressor, this));
-        parsers.put(ControlFrameType.SYN_REPLY, new SynReplyBodyParser(decompressor, this));
-        parsers.put(ControlFrameType.RST_STREAM, new RstStreamBodyParser(this));
-        parsers.put(ControlFrameType.SETTINGS, new SettingsBodyParser(this));
-        parsers.put(ControlFrameType.NOOP, new NoOpBodyParser(this));
-        parsers.put(ControlFrameType.PING, new PingBodyParser(this));
-        parsers.put(ControlFrameType.GO_AWAY, new GoAwayBodyParser(this));
-        parsers.put(ControlFrameType.HEADERS, new HeadersBodyParser(decompressor, this));
-        parsers.put(ControlFrameType.WINDOW_UPDATE, new WindowUpdateBodyParser(this));
-        parsers.put(ControlFrameType.CREDENTIAL, new CredentialBodyParser(this));
-    }
-
-    public short getVersion()
-    {
-        return version;
-    }
-
-    public byte getFlags()
-    {
-        return flags;
-    }
-
-    public int getLength()
-    {
-        return length;
-    }
-
-    public void skip(int bytesToSkip)
-    {
-        state = State.SKIP;
-        this.bytesToSkip = bytesToSkip;
-    }
-
-    public boolean parse(ByteBuffer buffer)
-    {
-        while (buffer.hasRemaining())
-        {
-            switch (state)
-            {
-                case VERSION:
-                {
-                    if (buffer.remaining() >= 2)
-                    {
-                        version = (short)(buffer.getShort() & 0x7F_FF);
-                        state = State.TYPE;
-                    }
-                    else
-                    {
-                        state = State.VERSION_BYTES;
-                        cursor = 2;
-                    }
-                    break;
-                }
-                case VERSION_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    version += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                    {
-                        version &= 0x7F_FF;
-                        state = State.TYPE;
-                    }
-                    break;
-                }
-                case TYPE:
-                {
-                    if (buffer.remaining() >= 2)
-                    {
-                        type = buffer.getShort();
-                        state = State.FLAGS;
-                    }
-                    else
-                    {
-                        state = State.TYPE_BYTES;
-                        cursor = 2;
-                    }
-                    break;
-                }
-                case TYPE_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    type += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                        state = State.FLAGS;
-                    break;
-                }
-                case FLAGS:
-                {
-                    flags = buffer.get();
-                    cursor = 3;
-                    state = State.LENGTH;
-                    break;
-                }
-                case LENGTH:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    length += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor > 0)
-                        break;
-
-                    ControlFrameType controlFrameType = ControlFrameType.from(type);
-
-                    // SPEC v3, 2.2.1: unrecognized control frames must be ignored
-                    if (controlFrameType == null)
-                        bodyParser = unknownParser;
-                    else
-                        bodyParser = parsers.get(controlFrameType);
-
-                    state = State.BODY;
-
-                    // We have to let it fall through the next switch:
-                    // the NOOP frame has no body and we cannot break
-                    // because the buffer may be consumed and we will
-                    // never enter the BODY case.
-                }
-                case BODY:
-                {
-                    if (bodyParser.parse(buffer))
-                    {
-                        reset();
-                        return true;
-                    }
-                    break;
-                }
-                case SKIP:
-                {
-                    int remaining = buffer.remaining();
-                    if (remaining >= bytesToSkip)
-                    {
-                        buffer.position(buffer.position() + bytesToSkip);
-                        reset();
-                        return true;
-                    }
-                    else
-                    {
-                        buffer.position(buffer.limit());
-                        bytesToSkip = bytesToSkip - remaining;
-                        return false;
-                    }
-                }
-                default:
-                {
-                    throw new IllegalStateException();
-                }
-            }
-        }
-        return false;
-    }
-
-    void reset()
-    {
-        state = State.VERSION;
-        cursor = 0;
-        version = 0;
-        type = 0;
-        flags = 0;
-        length = 0;
-        bodyParser = null;
-        bytesToSkip = 0;
-    }
-
-    protected abstract void onControlFrame(ControlFrame frame);
-
-    private enum State
-    {
-        VERSION, VERSION_BYTES, TYPE, TYPE_BYTES, FLAGS, LENGTH, BODY, SKIP
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/CredentialBodyParser.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/CredentialBodyParser.java
deleted file mode 100644
index a0e38e5..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/CredentialBodyParser.java
+++ /dev/null
@@ -1,274 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.io.ByteArrayInputStream;
-import java.nio.ByteBuffer;
-import java.security.cert.Certificate;
-import java.security.cert.CertificateException;
-import java.security.cert.CertificateFactory;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.jetty.spdy.SessionException;
-import org.eclipse.jetty.spdy.api.SessionStatus;
-import org.eclipse.jetty.spdy.frames.ControlFrameType;
-import org.eclipse.jetty.spdy.frames.CredentialFrame;
-
-public class CredentialBodyParser extends ControlFrameBodyParser
-{
-    private final List<Certificate> certificates = new ArrayList<>();
-    private final ControlFrameParser controlFrameParser;
-    private State state = State.SLOT;
-    private int totalLength;
-    private int cursor;
-    private short slot;
-    private int proofLength;
-    private byte[] proof;
-    private int certificateLength;
-    private byte[] certificate;
-
-    public CredentialBodyParser(ControlFrameParser controlFrameParser)
-    {
-        this.controlFrameParser = controlFrameParser;
-    }
-
-    @Override
-    public boolean parse(ByteBuffer buffer)
-    {
-        while (buffer.hasRemaining())
-        {
-            switch (state)
-            {
-                case SLOT:
-                {
-                    if (buffer.remaining() >= 2)
-                    {
-                        slot = buffer.getShort();
-                        checkSlotValid();
-                        state = State.PROOF_LENGTH;
-                    }
-                    else
-                    {
-                        state = State.SLOT_BYTES;
-                        cursor = 2;
-                    }
-                    break;
-                }
-                case SLOT_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    slot += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                    {
-                        checkSlotValid();
-                        state = State.PROOF_LENGTH;
-                    }
-                    break;
-                }
-                case PROOF_LENGTH:
-                {
-                    if (buffer.remaining() >= 4)
-                    {
-                        proofLength = buffer.getInt() & 0x7F_FF_FF_FF;
-                        state = State.PROOF;
-                    }
-                    else
-                    {
-                        state = State.PROOF_LENGTH_BYTES;
-                        cursor = 4;
-                    }
-                    break;
-                }
-                case PROOF_LENGTH_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    proofLength += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                    {
-                        proofLength &= 0x7F_FF_FF_FF;
-                        state = State.PROOF;
-                    }
-                    break;
-                }
-                case PROOF:
-                {
-                    totalLength = controlFrameParser.getLength() - 2 - 4 - proofLength;
-                    proof = new byte[proofLength];
-                    if (buffer.remaining() >= proofLength)
-                    {
-                        buffer.get(proof);
-                        state = State.CERTIFICATE_LENGTH;
-                        if (totalLength == 0)
-                        {
-                            onCredential();
-                            return true;
-                        }
-                    }
-                    else
-                    {
-                        state = State.PROOF_BYTES;
-                        cursor = proofLength;
-                    }
-                    break;
-                }
-                case PROOF_BYTES:
-                {
-                    proof[proofLength - cursor] = buffer.get();
-                    --cursor;
-                    if (cursor == 0)
-                    {
-                        state = State.CERTIFICATE_LENGTH;
-                        if (totalLength == 0)
-                        {
-                            onCredential();
-                            return true;
-                        }
-                    }
-                    break;
-                }
-                case CERTIFICATE_LENGTH:
-                {
-                    if (buffer.remaining() >= 4)
-                    {
-                        certificateLength = buffer.getInt() & 0x7F_FF_FF_FF;
-                        state = State.CERTIFICATE;
-                    }
-                    else
-                    {
-                        state = State.CERTIFICATE_LENGTH_BYTES;
-                        cursor = 4;
-                    }
-                    break;
-                }
-                case CERTIFICATE_LENGTH_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    certificateLength += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                    {
-                        certificateLength &= 0x7F_FF_FF_FF;
-                        state = State.CERTIFICATE;
-                    }
-                    break;
-                }
-                case CERTIFICATE:
-                {
-                    totalLength -= 4 + certificateLength;
-                    certificate = new byte[certificateLength];
-                    if (buffer.remaining() >= certificateLength)
-                    {
-                        buffer.get(certificate);
-                        if (onCertificate())
-                            return true;
-                    }
-                    else
-                    {
-                        state = State.CERTIFICATE_BYTES;
-                        cursor = certificateLength;
-                    }
-                    break;
-                }
-                case CERTIFICATE_BYTES:
-                {
-                    certificate[certificateLength - cursor] = buffer.get();
-                    --cursor;
-                    if (cursor == 0)
-                    {
-                        if (onCertificate())
-                            return true;
-                    }
-                    break;
-                }
-                default:
-                {
-                    throw new IllegalStateException();
-                }
-            }
-        }
-        return false;
-    }
-
-    private void checkSlotValid()
-    {
-        if (slot <= 0)
-            throw new SessionException(SessionStatus.PROTOCOL_ERROR,
-                    "Invalid slot " + slot + " for " + ControlFrameType.CREDENTIAL + " frame");
-    }
-
-    private boolean onCertificate()
-    {
-        certificates.add(deserializeCertificate(certificate));
-        if (totalLength == 0)
-        {
-            onCredential();
-            return true;
-        }
-        else
-        {
-            certificateLength = 0;
-            state = State.CERTIFICATE_LENGTH;
-        }
-        return false;
-    }
-
-    private Certificate deserializeCertificate(byte[] bytes)
-    {
-        try
-        {
-            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
-            return certificateFactory.generateCertificate(new ByteArrayInputStream(bytes));
-        }
-        catch (CertificateException x)
-        {
-            throw new SessionException(SessionStatus.PROTOCOL_ERROR, x);
-        }
-    }
-
-    private void onCredential()
-    {
-        CredentialFrame frame = new CredentialFrame(controlFrameParser.getVersion(), slot,
-                Arrays.copyOf(proof, proof.length), certificates.toArray(new Certificate[certificates.size()]));
-        controlFrameParser.onControlFrame(frame);
-        reset();
-    }
-
-    private void reset()
-    {
-        state = State.SLOT;
-        totalLength = 0;
-        cursor = 0;
-        slot = 0;
-        proofLength = 0;
-        proof = null;
-        certificateLength = 0;
-        certificate = null;
-        certificates.clear();
-    }
-
-    public enum State
-    {
-        SLOT, SLOT_BYTES, PROOF_LENGTH, PROOF_LENGTH_BYTES, PROOF, PROOF_BYTES,
-        CERTIFICATE_LENGTH, CERTIFICATE_LENGTH_BYTES, CERTIFICATE, CERTIFICATE_BYTES
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/DataFrameParser.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/DataFrameParser.java
deleted file mode 100644
index 49f6c97..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/DataFrameParser.java
+++ /dev/null
@@ -1,155 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.frames.DataFrame;
-
-public abstract class DataFrameParser
-{
-    private State state = State.STREAM_ID;
-    private int cursor;
-    private int streamId;
-    private byte flags;
-    private int length;
-
-    /**
-     * <p>Parses the given {@link ByteBuffer} for a data frame.</p>
-     *
-     * @param buffer the {@link ByteBuffer} to parse
-     * @return true if the data frame has been fully parsed, false otherwise
-     */
-    public boolean parse(ByteBuffer buffer)
-    {
-        while (buffer.hasRemaining())
-        {
-            switch (state)
-            {
-                case STREAM_ID:
-                {
-                    if (buffer.remaining() >= 4)
-                    {
-                        streamId = buffer.getInt() & 0x7F_FF_FF_FF;
-                        state = State.FLAGS;
-                    }
-                    else
-                    {
-                        state = State.STREAM_ID_BYTES;
-                        cursor = 4;
-                    }
-                    break;
-                }
-                case STREAM_ID_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    streamId += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                        state = State.FLAGS;
-                    break;
-                }
-                case FLAGS:
-                {
-                    flags = buffer.get();
-                    cursor = 3;
-                    state = State.LENGTH;
-                    break;
-                }
-                case LENGTH:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    length += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor > 0)
-                        break;
-                    state = State.DATA;
-                    // Fall down if length == 0: we can't loop because the buffer
-                    // may be empty but we need to invoke the application anyway
-                    if (length > 0)
-                        break;
-                }
-                case DATA:
-                {
-                    // Length can only be at most 3 bytes, which is 16_777_215 i.e. 16 MiB.
-                    // However, compliant clients should implement flow control, so it's
-                    // unlikely that we will get that 16 MiB chunk.
-                    // However, TCP may further split the flow control window, so we may
-                    // only have part of the data at this point.
-
-                    int size = Math.min(length, buffer.remaining());
-                    int limit = buffer.limit();
-                    buffer.limit(buffer.position() + size);
-                    ByteBuffer bytes = buffer.slice();
-                    buffer.limit(limit);
-                    buffer.position(buffer.position() + size);
-                    length -= size;
-                    if (length == 0)
-                    {
-                        onDataFrame(bytes);
-                        return true;
-                    }
-                    else
-                    {
-                        // We got only part of the frame data bytes,
-                        // so we generate a synthetic data frame
-                        onDataFragment(bytes);
-                    }
-                    break;
-                }
-                default:
-                {
-                    throw new IllegalStateException();
-                }
-            }
-        }
-        return false;
-    }
-
-    private void onDataFrame(ByteBuffer bytes)
-    {
-        DataFrame frame = new DataFrame(streamId, flags, bytes.remaining());
-        onDataFrame(frame, bytes);
-        reset();
-    }
-
-    private void onDataFragment(ByteBuffer bytes)
-    {
-        DataFrame frame = new DataFrame(streamId, (byte)(flags & ~DataInfo.FLAG_CLOSE), bytes.remaining());
-        onDataFrame(frame, bytes);
-        // Do not reset, we're expecting more data
-    }
-
-    protected abstract void onDataFrame(DataFrame frame, ByteBuffer data);
-
-    private void reset()
-    {
-        state = State.STREAM_ID;
-        cursor = 0;
-        streamId = 0;
-        flags = 0;
-        length = 0;
-    }
-
-    private enum State
-    {
-        STREAM_ID, STREAM_ID_BYTES, FLAGS, LENGTH, DATA
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/GoAwayBodyParser.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/GoAwayBodyParser.java
deleted file mode 100644
index 9b536d0..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/GoAwayBodyParser.java
+++ /dev/null
@@ -1,159 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.frames.GoAwayFrame;
-
-public class GoAwayBodyParser extends ControlFrameBodyParser
-{
-    private final ControlFrameParser controlFrameParser;
-    private State state = State.LAST_GOOD_STREAM_ID;
-    private int cursor;
-    private int lastStreamId;
-    private int statusCode;
-
-    public GoAwayBodyParser(ControlFrameParser controlFrameParser)
-    {
-        this.controlFrameParser = controlFrameParser;
-    }
-
-    @Override
-    public boolean parse(ByteBuffer buffer)
-    {
-        while (buffer.hasRemaining())
-        {
-            switch (state)
-            {
-                case LAST_GOOD_STREAM_ID:
-                {
-                    if (buffer.remaining() >= 4)
-                    {
-                        lastStreamId = buffer.getInt() & 0x7F_FF_FF_FF;
-                        switch (controlFrameParser.getVersion())
-                        {
-                            case SPDY.V2:
-                            {
-                                onGoAway();
-                                return true;
-                            }
-                            case SPDY.V3:
-                            {
-                                state = State.STATUS_CODE;
-                                break;
-                            }
-                            default:
-                            {
-                                throw new IllegalStateException();
-                            }
-                        }
-                    }
-                    else
-                    {
-                        state = State.LAST_GOOD_STREAM_ID_BYTES;
-                        cursor = 4;
-                    }
-                    break;
-                }
-                case LAST_GOOD_STREAM_ID_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    lastStreamId += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                    {
-                        lastStreamId &= 0x7F_FF_FF_FF;
-                        switch (controlFrameParser.getVersion())
-                        {
-                            case SPDY.V2:
-                            {
-                                onGoAway();
-                                return true;
-                            }
-                            case SPDY.V3:
-                            {
-                                state = State.STATUS_CODE;
-                                break;
-                            }
-                            default:
-                            {
-                                throw new IllegalStateException();
-                            }
-                        }
-                    }
-                    break;
-                }
-                case STATUS_CODE:
-                {
-                    if (buffer.remaining() >= 4)
-                    {
-                        statusCode = buffer.getInt();
-                        onGoAway();
-                        return true;
-                    }
-                    else
-                    {
-                        state = State.STATUS_CODE_BYTES;
-                        cursor = 4;
-                    }
-                    break;
-                }
-                case STATUS_CODE_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    statusCode += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                    {
-                        onGoAway();
-                        return true;
-                    }
-                    break;
-                }
-                default:
-                {
-                    throw new IllegalStateException();
-                }
-            }
-        }
-        return false;
-    }
-
-    private void onGoAway()
-    {
-        GoAwayFrame frame = new GoAwayFrame(controlFrameParser.getVersion(), lastStreamId, statusCode);
-        controlFrameParser.onControlFrame(frame);
-        reset();
-    }
-
-    private void reset()
-    {
-        state = State.LAST_GOOD_STREAM_ID;
-        cursor = 0;
-        lastStreamId = 0;
-        statusCode = 0;
-    }
-
-    private enum State
-    {
-        LAST_GOOD_STREAM_ID, LAST_GOOD_STREAM_ID_BYTES, STATUS_CODE, STATUS_CODE_BYTES
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/HeadersBlockParser.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/HeadersBlockParser.java
deleted file mode 100644
index 8337d13..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/HeadersBlockParser.java
+++ /dev/null
@@ -1,230 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.zip.ZipException;
-
-import org.eclipse.jetty.spdy.CompressionDictionary;
-import org.eclipse.jetty.spdy.CompressionFactory;
-import org.eclipse.jetty.spdy.SessionException;
-import org.eclipse.jetty.spdy.StreamException;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.SessionStatus;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-
-public abstract class HeadersBlockParser
-{
-    private final CompressionFactory.Decompressor decompressor;
-    private byte[] data;
-    private boolean needsDictionary = true;
-
-    protected HeadersBlockParser(CompressionFactory.Decompressor decompressor)
-    {
-        this.decompressor = decompressor;
-    }
-
-    public boolean parse(int streamId, short version, int length, ByteBuffer buffer)
-    {
-        // Need to be sure that all the compressed data has arrived
-        // Because SPDY uses SYNC_FLUSH mode, and the Java API
-        // does not expose when decompression is finished with this mode
-        // (but only when using NO_FLUSH), then we need to
-        // accumulate the compressed bytes until we have all of them
-
-        boolean accumulated = accumulate(length, buffer);
-        if (!accumulated)
-            return false;
-
-        byte[] compressedHeaders = data;
-        data = null;
-        ByteBuffer decompressedHeaders = decompress(version, compressedHeaders);
-
-        Charset iso1 = StandardCharsets.ISO_8859_1;
-        // We know the decoded bytes contain the full headers,
-        // so optimize instead of looping byte by byte
-        int count = readCount(version, decompressedHeaders);
-        for (int i = 0; i < count; ++i)
-        {
-            int nameLength = readNameLength(version, decompressedHeaders);
-            if (nameLength == 0)
-                throw new StreamException(streamId, StreamStatus.PROTOCOL_ERROR, "Invalid header name length");
-            byte[] nameBytes = new byte[nameLength];
-            decompressedHeaders.get(nameBytes);
-            String name = new String(nameBytes, iso1);
-
-            int valueLength = readValueLength(version, decompressedHeaders);
-            if (valueLength == 0)
-                throw new StreamException(streamId, StreamStatus.PROTOCOL_ERROR, "Invalid header value length");
-            byte[] valueBytes = new byte[valueLength];
-            decompressedHeaders.get(valueBytes);
-            String value = new String(valueBytes, iso1);
-            // Multi valued headers are separate by NUL
-            String[] values = value.split("\u0000");
-            // Check if there are multiple NULs (section 2.6.9)
-            for (String v : values)
-                if (v.length() == 0)
-                    throw new StreamException(streamId, StreamStatus.PROTOCOL_ERROR, "Invalid multi valued header");
-
-            onHeader(name, values);
-        }
-
-        return true;
-    }
-
-    private boolean accumulate(int length, ByteBuffer buffer)
-    {
-        int remaining = buffer.remaining();
-        if (data == null)
-        {
-            if (remaining < length)
-            {
-                data = new byte[remaining];
-                buffer.get(data);
-                return false;
-            }
-            else
-            {
-                data = new byte[length];
-                buffer.get(data);
-                return true;
-            }
-        }
-        else
-        {
-            int accumulated = data.length;
-            int needed = length - accumulated;
-            if (remaining < needed)
-            {
-                byte[] local = Arrays.copyOf(data,accumulated + remaining);
-                buffer.get(local, accumulated, remaining);
-                data = local;
-                return false;
-            }
-            else
-            {
-                byte[] local = Arrays.copyOf(data,length);
-                buffer.get(local, accumulated, needed);
-                data = local;
-                return true;
-            }
-        }
-    }
-
-    private int readCount(int version, ByteBuffer buffer)
-    {
-        switch (version)
-        {
-            case SPDY.V2:
-                return buffer.getShort();
-            case SPDY.V3:
-                return buffer.getInt();
-            default:
-                throw new IllegalStateException();
-        }
-    }
-
-    private int readNameLength(int version, ByteBuffer buffer)
-    {
-        return readCount(version, buffer);
-    }
-
-    private int readValueLength(int version, ByteBuffer buffer)
-    {
-        return readCount(version, buffer);
-    }
-
-    protected abstract void onHeader(String name, String[] values);
-
-    private ByteBuffer decompress(short version, byte[] compressed)
-    {
-        // Differently from compression, decompression always happens
-        // non-concurrently because we read and parse with a single
-        // thread, and therefore there is no need for synchronization.
-
-        try
-        {
-            byte[] decompressed = null;
-            byte[] buffer = new byte[compressed.length * 2];
-            decompressor.setInput(compressed);
-
-            while (true)
-            {
-                int count = decompressor.decompress(buffer);
-                if (count == 0)
-                {
-                    if (decompressed != null)
-                    {
-                        return ByteBuffer.wrap(decompressed);
-                    }
-                    else if (needsDictionary)
-                    {
-                        decompressor.setDictionary(CompressionDictionary.get(version));
-                        needsDictionary = false;
-                    }
-                    else
-                    {
-                        throw new IllegalStateException();
-                    }
-                }
-                else
-                {
-                    if (count < buffer.length)
-                    {
-                        if (decompressed == null)
-                        {
-                            // Only one pass was needed to decompress
-                            return ByteBuffer.wrap(buffer, 0, count);
-                        }
-                        else
-                        {
-                            // Last pass needed to decompress, merge decompressed bytes
-                            byte[] result = Arrays.copyOf(decompressed,decompressed.length+count);
-                            System.arraycopy(buffer, 0, result, decompressed.length, count);
-                            return ByteBuffer.wrap(result);
-                        }
-                    }
-                    else
-                    {
-                        if (decompressed == null)
-                        {
-                            decompressed = buffer;
-                            buffer = new byte[buffer.length];
-                        }
-                        else
-                        {
-                            byte[] result = Arrays.copyOf(decompressed,decompressed.length+buffer.length);
-                            System.arraycopy(buffer, 0, result, decompressed.length, buffer.length);
-                            decompressed = result;
-                        }
-                    }
-                }
-            }
-        }
-        catch (ZipException x)
-        {
-            // We had a compression problem, and since the compression context
-            // is per-connection, we need to tear down the connection
-            throw new SessionException(SessionStatus.PROTOCOL_ERROR, x);
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/HeadersBodyParser.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/HeadersBodyParser.java
deleted file mode 100644
index 5484a11..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/HeadersBodyParser.java
+++ /dev/null
@@ -1,173 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.spdy.CompressionFactory;
-import org.eclipse.jetty.spdy.api.HeadersInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.frames.ControlFrameType;
-import org.eclipse.jetty.spdy.frames.HeadersFrame;
-import org.eclipse.jetty.util.Fields;
-
-public class HeadersBodyParser extends ControlFrameBodyParser
-{
-    private final Fields headers = new Fields();
-    private final ControlFrameParser controlFrameParser;
-    private final HeadersBlockParser headersBlockParser;
-    private State state = State.STREAM_ID;
-    private int cursor;
-    private int streamId;
-
-    public HeadersBodyParser(CompressionFactory.Decompressor decompressor, ControlFrameParser controlFrameParser)
-    {
-        this.controlFrameParser = controlFrameParser;
-        this.headersBlockParser = new HeadersHeadersBlockParser(decompressor);
-    }
-
-    @Override
-    public boolean parse(ByteBuffer buffer)
-    {
-        while (buffer.hasRemaining())
-        {
-            switch (state)
-            {
-                case STREAM_ID:
-                {
-                    if (buffer.remaining() >= 4)
-                    {
-                        streamId = buffer.getInt() & 0x7F_FF_FF_FF;
-                        state = State.ADDITIONAL;
-                    }
-                    else
-                    {
-                        state = State.STREAM_ID_BYTES;
-                        cursor = 4;
-                    }
-                    break;
-                }
-                case STREAM_ID_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    streamId += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                    {
-                        streamId &= 0x7F_FF_FF_FF;
-                        state = State.ADDITIONAL;
-                    }
-                    break;
-                }
-                case ADDITIONAL:
-                {
-                    switch (controlFrameParser.getVersion())
-                    {
-                        case SPDY.V2:
-                        {
-                            if (buffer.remaining() >= 2)
-                            {
-                                buffer.getShort();
-                                state = State.HEADERS;
-                            }
-                            else
-                            {
-                                state = State.ADDITIONAL_BYTES;
-                                cursor = 2;
-                            }
-                            break;
-                        }
-                        case SPDY.V3:
-                        {
-                            state = State.HEADERS;
-                            break;
-                        }
-                        default:
-                        {
-                            throw new IllegalStateException();
-                        }
-                    }
-                    break;
-                }
-                case ADDITIONAL_BYTES:
-                {
-                    assert controlFrameParser.getVersion() == SPDY.V2;
-                    buffer.get();
-                    --cursor;
-                    if (cursor == 0)
-                        state = State.HEADERS;
-                    break;
-                }
-                case HEADERS:
-                {
-                    short version = controlFrameParser.getVersion();
-                    int length = controlFrameParser.getLength() - 4;
-                    if (version == SPDY.V2)
-                        length -= 2;
-                    if (headersBlockParser.parse(streamId, version, length, buffer))
-                    {
-                        byte flags = controlFrameParser.getFlags();
-                        if (flags != 0 && flags != HeadersInfo.FLAG_CLOSE && flags != HeadersInfo.FLAG_RESET_COMPRESSION)
-                            throw new IllegalArgumentException("Invalid flag " + flags + " for frame " + ControlFrameType.HEADERS);
-
-                        HeadersFrame frame = new HeadersFrame(version, flags, streamId, new Fields(headers, true));
-                        controlFrameParser.onControlFrame(frame);
-
-                        reset();
-                        return true;
-                    }
-                    break;
-                }
-                default:
-                {
-                    throw new IllegalStateException();
-                }
-            }
-        }
-        return false;
-    }
-
-    private void reset()
-    {
-        headers.clear();
-        state = State.STREAM_ID;
-        cursor = 0;
-        streamId = 0;
-    }
-
-    private enum State
-    {
-        STREAM_ID, STREAM_ID_BYTES, ADDITIONAL, ADDITIONAL_BYTES, HEADERS
-    }
-
-    private class HeadersHeadersBlockParser extends HeadersBlockParser
-    {
-        public HeadersHeadersBlockParser(CompressionFactory.Decompressor decompressor)
-        {
-            super(decompressor);
-        }
-
-        @Override
-        protected void onHeader(String name, String[] values)
-        {
-            for (String value : values)
-                headers.add(name, value);
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/NoOpBodyParser.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/NoOpBodyParser.java
deleted file mode 100644
index 1855c59..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/NoOpBodyParser.java
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.spdy.frames.NoOpFrame;
-
-public class NoOpBodyParser extends ControlFrameBodyParser
-{
-    private final ControlFrameParser controlFrameParser;
-
-    public NoOpBodyParser(ControlFrameParser controlFrameParser)
-    {
-        this.controlFrameParser = controlFrameParser;
-    }
-
-    @Override
-    public boolean parse(ByteBuffer buffer)
-    {
-        NoOpFrame frame = new NoOpFrame();
-        controlFrameParser.onControlFrame(frame);
-        return true;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/Parser.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/Parser.java
deleted file mode 100644
index 97d1dd0..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/Parser.java
+++ /dev/null
@@ -1,240 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.nio.ByteBuffer;
-import java.util.EventListener;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import org.eclipse.jetty.spdy.CompressionFactory;
-import org.eclipse.jetty.spdy.SessionException;
-import org.eclipse.jetty.spdy.StreamException;
-import org.eclipse.jetty.spdy.api.SessionStatus;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.DataFrame;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-public class Parser
-{
-    private static final Logger logger = Log.getLogger(Parser.class);
-    private final List<Listener> listeners = new CopyOnWriteArrayList<>();
-    private final ControlFrameParser controlFrameParser;
-    private final DataFrameParser dataFrameParser;
-    private State state = State.CONTROL_BIT;
-
-    public Parser(CompressionFactory.Decompressor decompressor)
-    {
-        // It is important to allocate one decompression context per
-        // SPDY session for the control frames (to decompress the headers)
-        controlFrameParser = new ControlFrameParser(decompressor)
-        {
-            @Override
-            protected void onControlFrame(ControlFrame frame)
-            {
-                logger.debug("Parsed {}", frame);
-                notifyControlFrame(frame);
-            }
-        };
-        dataFrameParser = new DataFrameParser()
-        {
-            @Override
-            protected void onDataFrame(DataFrame frame, ByteBuffer data)
-            {
-                logger.debug("Parsed {}, {} data bytes", frame, data.remaining());
-                notifyDataFrame(frame, data);
-            }
-        };
-    }
-
-    public void addListener(Listener listener)
-    {
-        listeners.add(listener);
-    }
-
-    public void removeListener(Listener listener)
-    {
-        listeners.remove(listener);
-    }
-
-    protected void notifyControlFrame(ControlFrame frame)
-    {
-        for (Listener listener : listeners)
-        {
-            try
-            {
-                listener.onControlFrame(frame);
-            }
-            catch (Exception x)
-            {
-                logger.info("Exception while notifying listener " + listener, x);
-            }
-        }
-    }
-
-    protected void notifyDataFrame(DataFrame frame, ByteBuffer data)
-    {
-        for (Listener listener : listeners)
-        {
-            try
-            {
-                listener.onDataFrame(frame, data);
-            }
-            catch (Exception x)
-            {
-                logger.info("Exception while notifying listener " + listener, x);
-            }
-        }
-    }
-
-    protected void notifyStreamException(StreamException x)
-    {
-        for (Listener listener : listeners)
-        {
-            try
-            {
-                listener.onStreamException(x);
-            }
-            catch (Exception xx)
-            {
-                logger.debug("Could not notify listener " + listener, xx);
-            }
-        }
-    }
-
-    protected void notifySessionException(SessionException x)
-    {
-        logger.debug("SPDY session exception", x);
-        for (Listener listener : listeners)
-        {
-            try
-            {
-                listener.onSessionException(x);
-            }
-            catch (Exception xx)
-            {
-                logger.debug("Could not notify listener " + listener, xx);
-            }
-        }
-    }
-
-    public void parse(ByteBuffer buffer)
-    {
-        logger.debug("Parsing {} bytes", buffer.remaining());
-        try
-        {
-            while (buffer.hasRemaining())
-            {
-                try
-                {
-                    switch (state)
-                    {
-                        case CONTROL_BIT:
-                        {
-                            // We must only peek the first byte and not advance the buffer
-                            // because the 7 least significant bits may be relevant in data frames
-                            int currByte = buffer.get(buffer.position());
-                            boolean isControlFrame = (currByte & 0x80) == 0x80;
-                            state = isControlFrame ? State.CONTROL_FRAME : State.DATA_FRAME;
-                            break;
-                        }
-                        case CONTROL_FRAME:
-                        {
-                            if (controlFrameParser.parse(buffer))
-                                reset();
-                            break;
-                        }
-                        case DATA_FRAME:
-                        {
-                            if (dataFrameParser.parse(buffer))
-                                reset();
-                            break;
-                        }
-                        default:
-                        {
-                            throw new IllegalStateException();
-                        }
-                    }
-                }
-                catch (StreamException x)
-                {
-                    notifyStreamException(x);
-                }
-            }
-        }
-        catch (SessionException x)
-        {
-            notifySessionException(x);
-        }
-        catch (Throwable x)
-        {
-            notifySessionException(new SessionException(SessionStatus.PROTOCOL_ERROR, x));
-        }
-        finally
-        {
-            // Be sure to consume after exceptions
-            buffer.position(buffer.limit());
-        }
-    }
-
-    private void reset()
-    {
-        state = State.CONTROL_BIT;
-    }
-
-    public interface Listener extends EventListener
-    {
-        public void onControlFrame(ControlFrame frame);
-
-        public void onDataFrame(DataFrame frame, ByteBuffer data);
-
-        public void onStreamException(StreamException x);
-
-        public void onSessionException(SessionException x);
-
-        public static class Adapter implements Listener
-        {
-            @Override
-            public void onControlFrame(ControlFrame frame)
-            {
-            }
-
-            @Override
-            public void onDataFrame(DataFrame frame, ByteBuffer data)
-            {
-            }
-
-            @Override
-            public void onStreamException(StreamException x)
-            {
-            }
-
-            @Override
-            public void onSessionException(SessionException x)
-            {
-            }
-        }
-    }
-
-    private enum State
-    {
-        CONTROL_BIT, CONTROL_FRAME, DATA_FRAME
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/PingBodyParser.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/PingBodyParser.java
deleted file mode 100644
index 9d1b929..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/PingBodyParser.java
+++ /dev/null
@@ -1,98 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.spdy.frames.PingFrame;
-
-public class PingBodyParser extends ControlFrameBodyParser
-{
-    private final ControlFrameParser controlFrameParser;
-    private State state = State.PING_ID;
-    private int cursor;
-    private int pingId;
-
-    public PingBodyParser(ControlFrameParser controlFrameParser)
-    {
-        this.controlFrameParser = controlFrameParser;
-    }
-
-    @Override
-    public boolean parse(ByteBuffer buffer)
-    {
-        while (buffer.hasRemaining())
-        {
-            switch (state)
-            {
-                case PING_ID:
-                {
-                    if (buffer.remaining() >= 4)
-                    {
-                        pingId = buffer.getInt() & 0x7F_FF_FF_FF;
-                        onPing();
-                        return true;
-                    }
-                    else
-                    {
-                        state = State.PING_ID_BYTES;
-                        cursor = 4;
-                    }
-                    break;
-                }
-                case PING_ID_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    pingId += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                    {
-                        onPing();
-                        return true;
-                    }
-                    break;
-                }
-                default:
-                {
-                    throw new IllegalStateException();
-                }
-            }
-        }
-        return false;
-    }
-
-    private void onPing()
-    {
-        PingFrame frame = new PingFrame(controlFrameParser.getVersion(), pingId);
-        controlFrameParser.onControlFrame(frame);
-        reset();
-    }
-
-    private void reset()
-    {
-        state = State.PING_ID;
-        cursor = 0;
-        pingId = 0;
-    }
-
-    private enum State
-    {
-        PING_ID, PING_ID_BYTES
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/RstStreamBodyParser.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/RstStreamBodyParser.java
deleted file mode 100644
index bb0d3fc..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/RstStreamBodyParser.java
+++ /dev/null
@@ -1,127 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.spdy.frames.RstStreamFrame;
-
-public class RstStreamBodyParser extends ControlFrameBodyParser
-{
-    private final ControlFrameParser controlFrameParser;
-    private State state = State.STREAM_ID;
-    private int cursor;
-    private int streamId;
-    private int statusCode;
-
-    public RstStreamBodyParser(ControlFrameParser controlFrameParser)
-    {
-        this.controlFrameParser = controlFrameParser;
-    }
-
-    @Override
-    public boolean parse(ByteBuffer buffer)
-    {
-        while (buffer.hasRemaining())
-        {
-            switch (state)
-            {
-                case STREAM_ID:
-                {
-                    if (buffer.remaining() >= 4)
-                    {
-                        streamId = buffer.getInt() & 0x7F_FF_FF_FF;
-                        state = State.STATUS_CODE;
-                    }
-                    else
-                    {
-                        state = State.STREAM_ID_BYTES;
-                        cursor = 4;
-                    }
-                    break;
-                }
-                case STREAM_ID_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    streamId += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                    {
-                        streamId &= 0x7F_FF_FF_FF;
-                        state = State.STATUS_CODE;
-                    }
-                    break;
-                }
-                case STATUS_CODE:
-                {
-                    if (buffer.remaining() >= 4)
-                    {
-                        statusCode = buffer.getInt();
-                        onRstStream();
-                        return true;
-                    }
-                    else
-                    {
-                        state = State.STATUS_CODE_BYTES;
-                        cursor = 4;
-                    }
-                    break;
-                }
-                case STATUS_CODE_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    statusCode += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                    {
-                        onRstStream();
-                        return true;
-                    }
-                    break;
-                }
-                default:
-                {
-                    throw new IllegalStateException();
-                }
-            }
-        }
-        return false;
-    }
-
-    private void onRstStream()
-    {
-        // TODO: check that statusCode is not 0
-        RstStreamFrame frame = new RstStreamFrame(controlFrameParser.getVersion(), streamId, statusCode);
-        controlFrameParser.onControlFrame(frame);
-        reset();
-    }
-
-    private void reset()
-    {
-        state = State.STREAM_ID;
-        cursor = 0;
-        streamId = 0;
-        statusCode = 0;
-    }
-
-    private enum State
-    {
-        STREAM_ID, STREAM_ID_BYTES, STATUS_CODE, STATUS_CODE_BYTES
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/SettingsBodyParser.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/SettingsBodyParser.java
deleted file mode 100644
index 0abe915..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/SettingsBodyParser.java
+++ /dev/null
@@ -1,200 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Settings;
-import org.eclipse.jetty.spdy.frames.SettingsFrame;
-
-public class SettingsBodyParser extends ControlFrameBodyParser
-{
-    private final Settings settings = new Settings();
-    private final ControlFrameParser controlFrameParser;
-    private State state = State.COUNT;
-    private int cursor;
-    private int count;
-    private int idAndFlags;
-    private int value;
-
-    public SettingsBodyParser(ControlFrameParser controlFrameParser)
-    {
-        this.controlFrameParser = controlFrameParser;
-    }
-
-    @Override
-    public boolean parse(ByteBuffer buffer)
-    {
-        while (buffer.hasRemaining())
-        {
-            switch (state)
-            {
-                case COUNT:
-                {
-                    if (buffer.remaining() >= 4)
-                    {
-                        count = buffer.getInt();
-                        state = State.ID_FLAGS;
-                    }
-                    else
-                    {
-                        state = State.COUNT_BYTES;
-                        cursor = 4;
-                    }
-                    break;
-                }
-                case COUNT_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    count += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                        state = State.ID_FLAGS;
-                    break;
-                }
-                case ID_FLAGS:
-                {
-                    if (buffer.remaining() >= 4)
-                    {
-                        idAndFlags = convertIdAndFlags(controlFrameParser.getVersion(), buffer.getInt());
-                        state = State.VALUE;
-                    }
-                    else
-                    {
-                        state = State.ID_FLAGS_BYTES;
-                        cursor = 4;
-                    }
-                    break;
-                }
-                case ID_FLAGS_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    value += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                    {
-                        idAndFlags = convertIdAndFlags(controlFrameParser.getVersion(), value);
-                        state = State.VALUE;
-                    }
-                    break;
-                }
-                case VALUE:
-                {
-                    if (buffer.remaining() >= 4)
-                    {
-                        value = buffer.getInt();
-                        if (onPair())
-                            return true;
-                    }
-                    else
-                    {
-                        state = State.VALUE_BYTES;
-                        cursor = 4;
-                        value = 0;
-                    }
-                    break;
-                }
-                case VALUE_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    value += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                    {
-                        if (onPair())
-                            return true;
-                    }
-                    break;
-                }
-                default:
-                {
-                    throw new IllegalStateException();
-                }
-            }
-        }
-        return false;
-    }
-
-    private int convertIdAndFlags(short version, int idAndFlags)
-    {
-        switch (version)
-        {
-            case SPDY.V2:
-            {
-                // A bug in the Chromium implementation forces v2 to have
-                // 3 ID bytes little endian + 1 byte of flags
-                // Here we normalize this to conform with v3, which is
-                // 1 bytes of flag + 3 ID bytes big endian
-                int result = (idAndFlags & 0x00_00_00_FF) << 24;
-                result += (idAndFlags & 0x00_00_FF_00) << 8;
-                result += (idAndFlags & 0x00_FF_00_00) >>> 8;
-                result += (idAndFlags & 0xFF_00_00_00) >>> 24;
-                return result;
-            }
-            case SPDY.V3:
-            {
-                return idAndFlags;
-            }
-            default:
-            {
-                throw new IllegalStateException();
-            }
-        }
-    }
-
-    private boolean onPair()
-    {
-        int id = idAndFlags & 0x00_FF_FF_FF;
-        byte flags = (byte)((idAndFlags & 0xFF_00_00_00) >>> 24);
-        settings.put(new Settings.Setting(Settings.ID.from(id), Settings.Flag.from(flags), value));
-        state = State.ID_FLAGS;
-        idAndFlags = 0;
-        value = 0;
-        --count;
-        if (count == 0)
-        {
-            onSettings();
-            return true;
-        }
-        return false;
-    }
-
-    private void onSettings()
-    {
-        SettingsFrame frame = new SettingsFrame(controlFrameParser.getVersion(), controlFrameParser.getFlags(), new Settings(settings, true));
-        controlFrameParser.onControlFrame(frame);
-        reset();
-    }
-
-    private void reset()
-    {
-        settings.clear();
-        state = State.COUNT;
-        cursor = 0;
-        count = 0;
-        idAndFlags = 0;
-        value = 0;
-    }
-
-    private enum State
-    {
-        COUNT, COUNT_BYTES, ID_FLAGS, ID_FLAGS_BYTES, VALUE, VALUE_BYTES
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/SynReplyBodyParser.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/SynReplyBodyParser.java
deleted file mode 100644
index 0fc56c4..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/SynReplyBodyParser.java
+++ /dev/null
@@ -1,184 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.spdy.CompressionFactory;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.frames.ControlFrameType;
-import org.eclipse.jetty.spdy.frames.SynReplyFrame;
-import org.eclipse.jetty.util.Fields;
-
-public class SynReplyBodyParser extends ControlFrameBodyParser
-{
-    private final Fields headers = new Fields();
-    private final ControlFrameParser controlFrameParser;
-    private final HeadersBlockParser headersBlockParser;
-    private State state = State.STREAM_ID;
-    private int cursor;
-    private int streamId;
-
-    public SynReplyBodyParser(CompressionFactory.Decompressor decompressor, ControlFrameParser controlFrameParser)
-    {
-        this.controlFrameParser = controlFrameParser;
-        this.headersBlockParser = new SynReplyHeadersBlockParser(decompressor);
-    }
-
-    @Override
-    public boolean parse(ByteBuffer buffer)
-    {
-        while (buffer.hasRemaining())
-        {
-            switch (state)
-            {
-                case STREAM_ID:
-                {
-                    if (buffer.remaining() >= 4)
-                    {
-                        streamId = buffer.getInt() & 0x7F_FF_FF_FF;
-                        state = State.ADDITIONAL;
-                    }
-                    else
-                    {
-                        state = State.STREAM_ID_BYTES;
-                        cursor = 4;
-                    }
-                    break;
-                }
-                case STREAM_ID_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    streamId += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                    {
-                        streamId &= 0x7F_FF_FF_FF;
-                        state = State.ADDITIONAL;
-                    }
-                    break;
-                }
-                case ADDITIONAL:
-                {
-                    switch (controlFrameParser.getVersion())
-                    {
-                        case SPDY.V2:
-                        {
-                            if (buffer.remaining() >= 2)
-                            {
-                                buffer.getShort();
-                                state = State.HEADERS;
-                            }
-                            else
-                            {
-                                state = State.ADDITIONAL_BYTES;
-                                cursor = 2;
-                            }
-                            break;
-                        }
-                        case SPDY.V3:
-                        {
-                            state = State.HEADERS;
-                            break;
-                        }
-                        default:
-                        {
-                            throw new IllegalStateException();
-                        }
-                    }
-                    break;
-                }
-                case ADDITIONAL_BYTES:
-                {
-                    assert controlFrameParser.getVersion() == SPDY.V2;
-                    buffer.get();
-                    --cursor;
-                    if (cursor == 0)
-                        state = State.HEADERS;
-                    break;
-                }
-                case HEADERS:
-                {
-                    short version = controlFrameParser.getVersion();
-                    int length = controlFrameParser.getLength() - getSynReplyDataLength(version);
-                    if (headersBlockParser.parse(streamId, version, length, buffer))
-                    {
-                        byte flags = controlFrameParser.getFlags();
-                        if (flags != 0 && flags != ReplyInfo.FLAG_CLOSE)
-                            throw new IllegalArgumentException("Invalid flag " + flags + " for frame " + ControlFrameType.SYN_REPLY);
-
-                        SynReplyFrame frame = new SynReplyFrame(version, flags, streamId, new Fields(headers, true));
-                        controlFrameParser.onControlFrame(frame);
-
-                        reset();
-                        return true;
-                    }
-                    break;
-                }
-                default:
-                {
-                    throw new IllegalStateException();
-                }
-            }
-        }
-        return false;
-    }
-
-    private int getSynReplyDataLength(short version)
-    {
-        switch (version)
-        {
-            case 2:
-                return 6;
-            case 3:
-                return 4;
-            default:
-                throw new IllegalStateException();
-        }
-    }
-
-    private void reset()
-    {
-        headers.clear();
-        state = State.STREAM_ID;
-        cursor = 0;
-        streamId = 0;
-    }
-
-    private enum State
-    {
-        STREAM_ID, STREAM_ID_BYTES, ADDITIONAL, ADDITIONAL_BYTES, HEADERS
-    }
-
-    private class SynReplyHeadersBlockParser extends HeadersBlockParser
-    {
-        public SynReplyHeadersBlockParser(CompressionFactory.Decompressor decompressor)
-        {
-            super(decompressor);
-        }
-
-        @Override
-        protected void onHeader(String name, String[] values)
-        {
-            for (String value : values)
-                headers.add(name, value);
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/SynStreamBodyParser.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/SynStreamBodyParser.java
deleted file mode 100644
index bfbc84b..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/SynStreamBodyParser.java
+++ /dev/null
@@ -1,236 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.spdy.CompressionFactory;
-import org.eclipse.jetty.spdy.PushSynInfo;
-import org.eclipse.jetty.spdy.StreamException;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.frames.ControlFrameType;
-import org.eclipse.jetty.spdy.frames.SynStreamFrame;
-import org.eclipse.jetty.util.Fields;
-
-public class SynStreamBodyParser extends ControlFrameBodyParser
-{
-    private final Fields headers = new Fields();
-    private final ControlFrameParser controlFrameParser;
-    private final HeadersBlockParser headersBlockParser;
-    private State state = State.STREAM_ID;
-    private int cursor;
-    private int streamId;
-    private int associatedStreamId;
-    private byte priority;
-    private short slot;
-
-    public SynStreamBodyParser(CompressionFactory.Decompressor decompressor, ControlFrameParser controlFrameParser)
-    {
-        this.controlFrameParser = controlFrameParser;
-        this.headersBlockParser = new SynStreamHeadersBlockParser(decompressor);
-    }
-
-    @Override
-    public boolean parse(ByteBuffer buffer)
-    {
-        while (buffer.hasRemaining())
-        {
-            switch (state)
-            {
-                case STREAM_ID:
-                {
-                    if (buffer.remaining() >= 4)
-                    {
-                        streamId = buffer.getInt() & 0x7F_FF_FF_FF;
-                        state = State.ASSOCIATED_STREAM_ID;
-                    }
-                    else
-                    {
-                        state = State.STREAM_ID_BYTES;
-                        cursor = 4;
-                    }
-                    break;
-                }
-                case STREAM_ID_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    streamId += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                    {
-                        streamId &= 0x7F_FF_FF_FF;
-                        state = State.ASSOCIATED_STREAM_ID;
-                    }
-                    break;
-                }
-                case ASSOCIATED_STREAM_ID:
-                {
-                    // Now we know the streamId, we can do the version check
-                    // and if it is wrong, issue a RST_STREAM
-                    try
-                    {
-                        checkVersion(controlFrameParser.getVersion(), streamId);
-                    }
-                    catch (StreamException e)
-                    {
-                        // We've already read 4 bytes of the streamId which are part of controlFrameParser.getLength
-                        // so we need to substract those from the bytesToSkip.
-                        int bytesToSkip = controlFrameParser.getLength() - 4;
-                        int remaining = buffer.remaining();
-                        if (remaining >= bytesToSkip)
-                        {
-                            buffer.position(buffer.position() + bytesToSkip);
-                            controlFrameParser.reset();
-                            reset();
-                        }
-                        else
-                        {
-                            int bytesToSkipInNextBuffer = bytesToSkip - remaining;
-                            buffer.position(buffer.limit());
-                            controlFrameParser.skip(bytesToSkipInNextBuffer);
-                            reset();
-                        }
-                        throw e;
-                    }
-                    if (buffer.remaining() >= 4)
-                    {
-                        associatedStreamId = buffer.getInt() & 0x7F_FF_FF_FF;
-                        state = State.PRIORITY;
-                    }
-                    else
-                    {
-                        state = State.ASSOCIATED_STREAM_ID_BYTES;
-                        cursor = 4;
-                    }
-                    break;
-                }
-                case ASSOCIATED_STREAM_ID_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    associatedStreamId += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                    {
-                        associatedStreamId &= 0x7F_FF_FF_FF;
-                        state = State.PRIORITY;
-                    }
-                    break;
-                }
-                case PRIORITY:
-                {
-                    byte currByte = buffer.get();
-                    ++cursor;
-                    if (cursor == 1)
-                    {
-                        priority = readPriority(controlFrameParser.getVersion(), currByte);
-                    }
-                    else
-                    {
-                        slot = (short)(currByte & 0xFF);
-                        cursor = 0;
-                        state = State.HEADERS;
-                    }
-                    break;
-                }
-                case HEADERS:
-                {
-                    short version = controlFrameParser.getVersion();
-                    int length = controlFrameParser.getLength() - 10;
-                    if (headersBlockParser.parse(streamId, version, length, buffer))
-                    {
-                        byte flags = controlFrameParser.getFlags();
-                        if (flags > (SynInfo.FLAG_CLOSE | PushSynInfo.FLAG_UNIDIRECTIONAL))
-                            throw new IllegalArgumentException("Invalid flag " + flags + " for frame " +
-                                    ControlFrameType.SYN_STREAM);
-
-                        SynStreamFrame frame = new SynStreamFrame(version, flags, streamId, associatedStreamId,
-                                priority, slot, new Fields(headers, false));
-                        controlFrameParser.onControlFrame(frame);
-
-                        reset();
-                        return true;
-                    }
-                    break;
-                }
-                default:
-                {
-                    throw new IllegalStateException();
-                }
-            }
-        }
-        return false;
-    }
-
-    private void checkVersion(short version, int streamId)
-    {
-        if (version != SPDY.V2 && version != SPDY.V3)
-            throw new StreamException(streamId, StreamStatus.UNSUPPORTED_VERSION);
-    }
-
-    private byte readPriority(short version, byte currByte)
-    {
-        // Right shift retains the sign bit when operated on a byte,
-        // so we use an int to perform the shifts
-        switch (version)
-        {
-            case SPDY.V2:
-                int p2 = currByte & 0b1100_0000;
-                p2 >>>= 6;
-                return (byte)p2;
-            case SPDY.V3:
-                int p3 = currByte & 0b1110_0000;
-                p3 >>>= 5;
-                return (byte)p3;
-            default:
-                throw new IllegalStateException();
-        }
-    }
-
-    private void reset()
-    {
-        headers.clear();
-        state = State.STREAM_ID;
-        cursor = 0;
-        streamId = 0;
-        associatedStreamId = 0;
-        priority = 0;
-    }
-
-    private enum State
-    {
-        STREAM_ID, STREAM_ID_BYTES, ASSOCIATED_STREAM_ID, ASSOCIATED_STREAM_ID_BYTES, PRIORITY, HEADERS
-    }
-
-    private class SynStreamHeadersBlockParser extends HeadersBlockParser
-    {
-        public SynStreamHeadersBlockParser(CompressionFactory.Decompressor decompressor)
-        {
-            super(decompressor);
-        }
-
-        @Override
-        protected void onHeader(String name, String[] values)
-        {
-            for (String value : values)
-                headers.add(name, value);
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/UnknownControlFrameBodyParser.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/UnknownControlFrameBodyParser.java
deleted file mode 100644
index bdc59b6..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/UnknownControlFrameBodyParser.java
+++ /dev/null
@@ -1,72 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.nio.ByteBuffer;
-
-public class UnknownControlFrameBodyParser extends ControlFrameBodyParser
-{
-    private final ControlFrameParser controlFrameParser;
-    private State state = State.BODY;
-    private int remaining;
-
-    public UnknownControlFrameBodyParser(ControlFrameParser controlFrameParser)
-    {
-        this.controlFrameParser = controlFrameParser;
-    }
-
-    @Override
-    public boolean parse(ByteBuffer buffer)
-    {
-        switch (state)
-        {
-            case BODY:
-            {
-                remaining = controlFrameParser.getLength();
-                state = State.CONSUME;
-                // Fall down
-            }
-            case CONSUME:
-            {
-                int consume = Math.min(remaining, buffer.remaining());
-                buffer.position(buffer.position() + consume);
-                remaining -= consume;
-                if (remaining > 0)
-                    return false;
-                reset();
-                return true;
-            }
-            default:
-            {
-                throw new IllegalStateException();
-            }
-        }
-    }
-
-    private void reset()
-    {
-        state = State.BODY;
-        remaining = 0;
-    }
-
-    private enum State
-    {
-        BODY, CONSUME
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/WindowUpdateBodyParser.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/WindowUpdateBodyParser.java
deleted file mode 100644
index 2e9b978..0000000
--- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/parser/WindowUpdateBodyParser.java
+++ /dev/null
@@ -1,127 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.spdy.frames.WindowUpdateFrame;
-
-public class WindowUpdateBodyParser extends ControlFrameBodyParser
-{
-    private final ControlFrameParser controlFrameParser;
-    private State state = State.STREAM_ID;
-    private int cursor;
-    private int streamId;
-    private int windowDelta;
-
-    public WindowUpdateBodyParser(ControlFrameParser controlFrameParser)
-    {
-        this.controlFrameParser = controlFrameParser;
-    }
-
-    @Override
-    public boolean parse(ByteBuffer buffer)
-    {
-        while (buffer.hasRemaining())
-        {
-            switch (state)
-            {
-                case STREAM_ID:
-                {
-                    if (buffer.remaining() >= 4)
-                    {
-                        streamId = buffer.getInt() & 0x7F_FF_FF_FF;
-                        state = State.WINDOW_DELTA;
-                    }
-                    else
-                    {
-                        state = State.STREAM_ID_BYTES;
-                        cursor = 4;
-                    }
-                    break;
-                }
-                case STREAM_ID_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    streamId += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                    {
-                        streamId &= 0x7F_FF_FF_FF;
-                        state = State.WINDOW_DELTA;
-                    }
-                    break;
-                }
-                case WINDOW_DELTA:
-                {
-                    if (buffer.remaining() >= 4)
-                    {
-                        windowDelta = buffer.getInt() & 0x7F_FF_FF_FF;
-                        onWindowUpdate();
-                        return true;
-                    }
-                    else
-                    {
-                        state = State.WINDOW_DELTA_BYTES;
-                        cursor = 4;
-                    }
-                    break;
-                }
-                case WINDOW_DELTA_BYTES:
-                {
-                    byte currByte = buffer.get();
-                    --cursor;
-                    windowDelta += (currByte & 0xFF) << 8 * cursor;
-                    if (cursor == 0)
-                    {
-                        windowDelta &= 0x7F_FF_FF_FF;
-                        onWindowUpdate();
-                        return true;
-                    }
-                    break;
-                }
-                default:
-                {
-                    throw new IllegalStateException();
-                }
-            }
-        }
-        return false;
-    }
-
-    private void onWindowUpdate()
-    {
-        WindowUpdateFrame frame = new WindowUpdateFrame(controlFrameParser.getVersion(), streamId, windowDelta);
-        controlFrameParser.onControlFrame(frame);
-        reset();
-    }
-
-    private void reset()
-    {
-        state = State.STREAM_ID;
-        cursor = 0;
-        streamId = 0;
-        windowDelta = 0;
-    }
-
-    private enum State
-    {
-        STREAM_ID, STREAM_ID_BYTES, WINDOW_DELTA, WINDOW_DELTA_BYTES;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/AsyncTimeoutTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/AsyncTimeoutTest.java
deleted file mode 100644
index ed64a55..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/AsyncTimeoutTest.java
+++ /dev/null
@@ -1,159 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy;
-
-import java.nio.ByteBuffer;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.io.ByteArrayEndPoint;
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.SPDYException;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StringDataInfo;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.toolchain.test.AdvancedRunner;
-import org.eclipse.jetty.toolchain.test.annotation.Slow;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.Promise;
-import org.eclipse.jetty.util.thread.Scheduler;
-import org.eclipse.jetty.util.thread.TimerScheduler;
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AdvancedRunner.class)
-//TODO: Uncomment comment lines and reimplement tests to fit new design
-@Ignore("Doesn't work with new Flusher class, needs to be rewritten")
-public class AsyncTimeoutTest
-{
-    EndPoint endPoint = new ByteArrayEndPoint();
-
-    @Slow
-    @Test
-    public void testAsyncTimeoutInControlFrames() throws Exception
-    {
-        final long timeout = 1000;
-        final TimeUnit unit = TimeUnit.MILLISECONDS;
-
-        ByteBufferPool bufferPool = new MappedByteBufferPool();
-        Executor threadPool = Executors.newCachedThreadPool();
-        Scheduler scheduler = new TimerScheduler();
-        scheduler.start(); // TODO need to use jetty lifecycles better here
-        Generator generator = new Generator(bufferPool, new StandardCompressionFactory.StandardCompressor());
-        Session session = new StandardSession(SPDY.V2, bufferPool, scheduler, new TestController(),
-                endPoint, null, 1, null, generator, new FlowControlStrategy.None())
-        {
-//            @Override
-            public void flush()
-            {
-                try
-                {
-                    unit.sleep(2 * timeout);
-//                    super.flush();
-                }
-                catch (InterruptedException x)
-                {
-                    throw new SPDYException(x);
-                }
-            }
-        };
-
-        final CountDownLatch failedLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(timeout, unit, new Fields(), true, (byte)0), null, new Promise.Adapter<Stream>()
-        {
-            @Override
-            public void failed(Throwable x)
-            {
-                failedLatch.countDown();
-            }
-        });
-
-        Assert.assertTrue(failedLatch.await(2 * timeout, unit));
-    }
-
-    @Slow
-    @Test
-    public void testAsyncTimeoutInDataFrames() throws Exception
-    {
-        final long timeout = 1000;
-        final TimeUnit unit = TimeUnit.MILLISECONDS;
-
-        ByteBufferPool bufferPool = new MappedByteBufferPool();
-        Executor threadPool = Executors.newCachedThreadPool();
-        Scheduler scheduler = new TimerScheduler();
-        scheduler.start();
-        Generator generator = new Generator(bufferPool, new StandardCompressionFactory.StandardCompressor());
-        Session session = new StandardSession(SPDY.V2, bufferPool, scheduler, new TestController(),
-                endPoint, null, 1, null, generator, new FlowControlStrategy.None())
-        {
-//            @Override
-            protected void write(ByteBuffer buffer, Callback callback)
-            {
-                try
-                {
-                    // Wait if we're writing the data frame (control frame's first byte is 0x80)
-                    if (buffer.get(0) == 0)
-                        unit.sleep(2 * timeout);
-//                    super.write(buffer, callback);
-                }
-                catch (InterruptedException x)
-                {
-                    throw new SPDYException(x);
-                }
-            }
-        };
-
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), null);
-        final CountDownLatch failedLatch = new CountDownLatch(1);
-        stream.data(new StringDataInfo(timeout, unit, "data", true), new Callback.Adapter()
-        {
-            @Override
-            public void failed(Throwable x)
-            {
-                failedLatch.countDown();
-            }
-        });
-
-        Assert.assertTrue(failedLatch.await(2 * timeout, unit));
-    }
-
-    private static class TestController implements Controller
-    {
-        @Override
-        public void write(Callback callback, ByteBuffer... buffers)
-        {
-            callback.succeeded();
-        }
-
-        @Override
-        public void close(boolean onlyOutput)
-        {
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/StandardSessionTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/StandardSessionTest.java
deleted file mode 100644
index 069dab2..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/StandardSessionTest.java
+++ /dev/null
@@ -1,681 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy;
-
-import java.nio.ByteBuffer;
-import java.nio.channels.ClosedChannelException;
-import java.util.HashSet;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.api.ByteBufferDataInfo;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.HeadersInfo;
-import org.eclipse.jetty.spdy.api.PushInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.RstInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.Settings;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.spdy.api.StringDataInfo;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.frames.DataFrame;
-import org.eclipse.jetty.spdy.frames.SettingsFrame;
-import org.eclipse.jetty.spdy.frames.SynReplyFrame;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.FuturePromise;
-import org.eclipse.jetty.util.Promise;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.util.thread.ScheduledExecutorScheduler;
-import org.eclipse.jetty.util.thread.Scheduler;
-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.mockito.Mock;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.runners.MockitoJUnitRunner;
-import org.mockito.stubbing.Answer;
-
-import static org.hamcrest.Matchers.greaterThan;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.not;
-import static org.junit.Assert.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class StandardSessionTest
-{
-    private static final Logger LOG = Log.getLogger(StandardSessionTest.class);
-    private static final short VERSION = SPDY.V2;
-
-    @Mock
-    private Controller controller;
-
-    @Mock
-    private EndPoint endPoint;
-
-    private ExecutorService threadPool;
-    private StandardSession session;
-    private Scheduler scheduler;
-    private Fields headers;
-    private final ByteBufferPool bufferPool = new MappedByteBufferPool();
-    private final Generator generator = new Generator(bufferPool, new StandardCompressionFactory.StandardCompressor());
-
-    @Before
-    public void setUp() throws Exception
-    {
-        threadPool = Executors.newCachedThreadPool();
-        scheduler = new ScheduledExecutorScheduler();
-        scheduler.start();
-        session = new StandardSession(VERSION, bufferPool, scheduler, controller, endPoint, null, 1, null,
-                generator, new FlowControlStrategy.None());
-        when(endPoint.getIdleTimeout()).thenReturn(30000L);
-        headers = new Fields();
-    }
-
-    @After
-    public void after() throws Exception
-    {
-        scheduler.stop();
-        threadPool.shutdownNow();
-    }
-
-    @SuppressWarnings("unchecked")
-    private void setControllerWriteExpectation(final boolean fail)
-    {
-        doAnswer(new Answer()
-        {
-            public Object answer(InvocationOnMock invocation)
-            {
-                Object[] args = invocation.getArguments();
-                Callback callback = (Callback)args[0];
-                if (fail)
-                    callback.failed(new ClosedChannelException());
-                else
-                    callback.succeeded();
-                return null;
-            }
-        }).when(controller).write(any(Callback.class), any(ByteBuffer.class));
-    }
-
-    @Test
-    public void testStreamIsRemovedFromSessionWhenReset() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        setControllerWriteExpectation(false);
-
-        IStream stream = createStream();
-        assertThatStreamIsInSession(stream);
-        assertThat("stream is not reset", stream.isReset(), is(false));
-        session.rst(new RstInfo(stream.getId(), StreamStatus.STREAM_ALREADY_CLOSED));
-        assertThatStreamIsNotInSession(stream);
-        assertThatStreamIsReset(stream);
-    }
-
-    @Test
-    public void testStreamIsAddedAndRemovedFromSession() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        setControllerWriteExpectation(false);
-
-        IStream stream = createStream();
-        assertThatStreamIsInSession(stream);
-        stream.updateCloseState(true, true);
-        session.onControlFrame(new SynReplyFrame(VERSION, SynInfo.FLAG_CLOSE, stream.getId(), null));
-        assertThatStreamIsClosed(stream);
-        assertThatStreamIsNotInSession(stream);
-    }
-
-    @Test
-    public void testStreamIsRemovedWhenHeadersWithCloseFlagAreSent() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        setControllerWriteExpectation(false);
-
-        IStream stream = createStream();
-        assertThatStreamIsInSession(stream);
-        stream.updateCloseState(true, false);
-        stream.headers(new HeadersInfo(headers, true));
-        assertThatStreamIsClosed(stream);
-        assertThatStreamIsNotInSession(stream);
-    }
-
-    @Test
-    public void testStreamIsUnidirectional() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        setControllerWriteExpectation(false);
-
-        IStream stream = createStream();
-        assertThat("stream is not unidirectional", stream.isUnidirectional(), not(true));
-        Stream pushStream = createPushStream(stream);
-        assertThat("pushStream is unidirectional", pushStream.isUnidirectional(), is(true));
-    }
-
-    @Test
-    public void testPushStreamCreation() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        setControllerWriteExpectation(false);
-
-        Stream stream = createStream();
-        IStream pushStream = createPushStream(stream);
-        assertThat("Push stream must be associated to the first stream created", pushStream.getAssociatedStream().getId(), is(stream.getId()));
-        assertThat("streamIds need to be monotonic", pushStream.getId(), greaterThan(stream.getId()));
-    }
-
-    @Test
-    public void testPushStreamIsNotClosedWhenAssociatedStreamIsClosed() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        setControllerWriteExpectation(false);
-
-        IStream stream = createStream();
-        Stream pushStream = createPushStream(stream);
-        assertThatStreamIsNotHalfClosed(stream);
-        assertThatStreamIsNotClosed(stream);
-        assertThatPushStreamIsHalfClosed(pushStream);
-        assertThatPushStreamIsNotClosed(pushStream);
-
-        stream.updateCloseState(true, true);
-        assertThatStreamIsHalfClosed(stream);
-        assertThatStreamIsNotClosed(stream);
-        assertThatPushStreamIsHalfClosed(pushStream);
-        assertThatPushStreamIsNotClosed(pushStream);
-
-        session.onControlFrame(new SynReplyFrame(VERSION, SynInfo.FLAG_CLOSE, stream.getId(), null));
-        assertThatStreamIsClosed(stream);
-        assertThatPushStreamIsNotClosed(pushStream);
-    }
-
-    @Test
-    public void testCreatePushStreamOnClosedStream() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        setControllerWriteExpectation(false);
-
-        IStream stream = createStream();
-        stream.updateCloseState(true, true);
-        assertThatStreamIsHalfClosed(stream);
-        stream.updateCloseState(true, false);
-        assertThatStreamIsClosed(stream);
-        createPushStreamAndMakeSureItFails(stream);
-    }
-
-    private void createPushStreamAndMakeSureItFails(IStream stream) throws InterruptedException
-    {
-        final CountDownLatch failedLatch = new CountDownLatch(1);
-        PushInfo pushInfo = new PushInfo(5, TimeUnit.SECONDS, headers, false);
-        stream.push(pushInfo, new Promise.Adapter<Stream>()
-        {
-            @Override
-            public void failed(Throwable x)
-            {
-                failedLatch.countDown();
-            }
-        });
-        assertThat("pushStream creation failed", failedLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    @Test
-    public void testPushStreamIsAddedAndRemovedFromParentAndSessionWhenClosed() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        setControllerWriteExpectation(false);
-
-        IStream stream = createStream();
-        IStream pushStream = createPushStream(stream);
-        assertThatPushStreamIsHalfClosed(pushStream);
-        assertThatPushStreamIsInSession(pushStream);
-        assertThatStreamIsAssociatedWithPushStream(stream, pushStream);
-        session.data(pushStream, new StringDataInfo("close", true), 5, TimeUnit.SECONDS, new Callback.Adapter());
-        assertThatPushStreamIsClosed(pushStream);
-        assertThatPushStreamIsNotInSession(pushStream);
-        assertThatStreamIsNotAssociatedWithPushStream(stream, pushStream);
-    }
-
-    @Test
-    public void testPushStreamIsRemovedWhenReset() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        setControllerWriteExpectation(false);
-
-        IStream stream = createStream();
-        IStream pushStream = (IStream)stream.push(new PushInfo(new Fields(), false));
-        assertThatPushStreamIsInSession(pushStream);
-        session.rst(new RstInfo(pushStream.getId(), StreamStatus.INVALID_STREAM));
-        assertThatPushStreamIsNotInSession(pushStream);
-        assertThatStreamIsNotAssociatedWithPushStream(stream, pushStream);
-        assertThatStreamIsReset(pushStream);
-    }
-
-    @Test
-    public void testPushStreamWithSynInfoClosedTrue() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        setControllerWriteExpectation(false);
-
-        IStream stream = createStream();
-        PushInfo pushInfo = new PushInfo(5, TimeUnit.SECONDS, headers, true);
-        IStream pushStream = (IStream)stream.push(pushInfo);
-        assertThatPushStreamIsHalfClosed(pushStream);
-        assertThatPushStreamIsClosed(pushStream);
-        assertThatStreamIsNotAssociatedWithPushStream(stream, pushStream);
-        assertThatStreamIsNotInSession(pushStream);
-    }
-
-    @Test
-    public void testPushStreamSendHeadersWithCloseFlagIsRemovedFromSessionAndDisassociateFromParent() throws InterruptedException, ExecutionException,
-            TimeoutException
-    {
-        setControllerWriteExpectation(false);
-
-        IStream stream = createStream();
-        PushInfo pushInfo = new PushInfo(5, TimeUnit.SECONDS, headers, false);
-        IStream pushStream = (IStream)stream.push(pushInfo);
-        assertThatStreamIsAssociatedWithPushStream(stream, pushStream);
-        assertThatPushStreamIsInSession(pushStream);
-        pushStream.headers(new HeadersInfo(headers, true));
-        assertThatPushStreamIsNotInSession(pushStream);
-        assertThatPushStreamIsHalfClosed(pushStream);
-        assertThatPushStreamIsClosed(pushStream);
-        assertThatStreamIsNotAssociatedWithPushStream(stream, pushStream);
-    }
-
-    @Test
-    public void testCreatedAndClosedListenersAreCalledForNewStream() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        setControllerWriteExpectation(false);
-
-        final CountDownLatch createdListenerCalledLatch = new CountDownLatch(1);
-        final CountDownLatch closedListenerCalledLatch = new CountDownLatch(1);
-        session.addListener(new TestStreamListener(createdListenerCalledLatch, closedListenerCalledLatch));
-        IStream stream = createStream();
-        session.onControlFrame(new SynReplyFrame(VERSION, (byte)0, stream.getId(), new Fields()));
-        session.onDataFrame(new DataFrame(stream.getId(), SynInfo.FLAG_CLOSE, 128), ByteBuffer.allocate(128));
-        stream.data(new StringDataInfo("close", true));
-        assertThat("onStreamCreated listener has been called", createdListenerCalledLatch.await(5, TimeUnit.SECONDS), is(true));
-        assertThatOnStreamClosedListenerHasBeenCalled(closedListenerCalledLatch);
-    }
-
-    @Test
-    public void testListenerIsCalledForResetStream() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        setControllerWriteExpectation(false);
-
-        final CountDownLatch closedListenerCalledLatch = new CountDownLatch(1);
-        session.addListener(new TestStreamListener(null, closedListenerCalledLatch));
-        IStream stream = createStream();
-        session.rst(new RstInfo(stream.getId(), StreamStatus.CANCEL_STREAM));
-        assertThatOnStreamClosedListenerHasBeenCalled(closedListenerCalledLatch);
-    }
-
-    @Test
-    public void testCreatedAndClosedListenersAreCalledForNewPushStream() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        setControllerWriteExpectation(false);
-
-        final CountDownLatch createdListenerCalledLatch = new CountDownLatch(2);
-        final CountDownLatch closedListenerCalledLatch = new CountDownLatch(1);
-        session.addListener(new TestStreamListener(createdListenerCalledLatch, closedListenerCalledLatch));
-        IStream stream = createStream();
-        IStream pushStream = createPushStream(stream);
-        session.data(pushStream, new StringDataInfo("close", true), 5, TimeUnit.SECONDS, new Callback.Adapter());
-        assertThat("onStreamCreated listener has been called twice. Once for the stream and once for the pushStream",
-                createdListenerCalledLatch.await(5, TimeUnit.SECONDS), is(true));
-        assertThatOnStreamClosedListenerHasBeenCalled(closedListenerCalledLatch);
-    }
-
-    @Test
-    public void testListenerIsCalledForResetPushStream() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        setControllerWriteExpectation(false);
-
-        final CountDownLatch closedListenerCalledLatch = new CountDownLatch(1);
-        session.addListener(new TestStreamListener(null, closedListenerCalledLatch));
-        IStream stream = createStream();
-        IStream pushStream = createPushStream(stream);
-        session.rst(new RstInfo(pushStream.getId(), StreamStatus.CANCEL_STREAM));
-        assertThatOnStreamClosedListenerHasBeenCalled(closedListenerCalledLatch);
-    }
-
-    private class TestStreamListener extends Session.StreamListener.Adapter
-    {
-        private CountDownLatch createdListenerCalledLatch;
-        private CountDownLatch closedListenerCalledLatch;
-
-        public TestStreamListener(CountDownLatch createdListenerCalledLatch, CountDownLatch closedListenerCalledLatch)
-        {
-            this.createdListenerCalledLatch = createdListenerCalledLatch;
-            this.closedListenerCalledLatch = closedListenerCalledLatch;
-        }
-
-        @Override
-        public void onStreamCreated(Stream stream)
-        {
-            if (createdListenerCalledLatch != null)
-                createdListenerCalledLatch.countDown();
-            super.onStreamCreated(stream);
-        }
-
-        @Override
-        public void onStreamClosed(Stream stream)
-        {
-            if (closedListenerCalledLatch != null)
-                closedListenerCalledLatch.countDown();
-            super.onStreamClosed(stream);
-        }
-    }
-
-    @Test
-    @Ignore("In V3 we need to rst the stream if we receive data on a remotely half closed stream.")
-    public void receiveDataOnRemotelyHalfClosedStreamResetsStreamInV3() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        setControllerWriteExpectation(false);
-
-        IStream stream = (IStream)session.syn(new SynInfo(new Fields(), false), new StreamFrameListener.Adapter());
-        stream.updateCloseState(true, false);
-        assertThat("stream is half closed from remote side", stream.isHalfClosed(), is(true));
-        stream.process(new ByteBufferDataInfo(ByteBuffer.allocate(256), true));
-    }
-
-    @Test
-    public void testReceiveDataOnRemotelyClosedStreamIsIgnored() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        setControllerWriteExpectation(false);
-
-        final CountDownLatch onDataCalledLatch = new CountDownLatch(1);
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0),
-                new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        onDataCalledLatch.countDown();
-                        super.onData(stream, dataInfo);
-                    }
-                });
-        session.onControlFrame(new SynReplyFrame(VERSION, SynInfo.FLAG_CLOSE, stream.getId(), headers));
-        session.onDataFrame(new DataFrame(stream.getId(), (byte)0, 0), ByteBuffer.allocate(128));
-        assertThat("onData is never called", onDataCalledLatch.await(1, TimeUnit.SECONDS), not(true));
-    }
-
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testControllerWriteFails() throws Exception
-    {
-        final AtomicInteger writes = new AtomicInteger();
-        final AtomicBoolean fail = new AtomicBoolean();
-        Controller controller = new Controller()
-        {
-            @Override
-            public void write(Callback callback, ByteBuffer... buffers)
-            {
-                writes.incrementAndGet();
-                if (fail.get())
-                    callback.failed(new ClosedChannelException());
-                else
-                    callback.succeeded();
-            }
-
-            @Override
-            public void close(boolean onlyOutput)
-            {
-
-            }
-        };
-        ISession session = new StandardSession(VERSION, bufferPool, scheduler, controller, endPoint, null, 1, null, generator, null);
-        IStream stream = new StandardStream(1, (byte)0, session, null, scheduler, null);
-        stream.updateWindowSize(8192);
-
-        // Send a reply to comply with the API usage
-        stream.reply(new ReplyInfo(false), new Callback.Adapter());
-
-        // Make the controller fail
-        fail.set(true);
-        final CountDownLatch failedCalledLatch = new CountDownLatch(1);
-        Callback.Adapter callback = new Callback.Adapter()
-        {
-            @Override
-            public void failed(Throwable x)
-            {
-                failedCalledLatch.countDown();
-            }
-        };
-        // Data frame should fail on controller.write()
-        stream.data(new StringDataInfo(5, TimeUnit.SECONDS, "data", false), callback);
-
-        Assert.assertEquals(2, writes.get());
-        Assert.assertTrue(failedCalledLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testControlFramesAreStillSentForResetStreams() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        setControllerWriteExpectation(false);
-
-        // This is necessary to keep the compression context of Headers valid
-        IStream stream = createStream();
-        session.rst(new RstInfo(stream.getId(), StreamStatus.INVALID_STREAM));
-        stream.headers(new HeadersInfo(headers, true));
-
-        verify(controller, times(3)).write(any(Callback.class), any(ByteBuffer.class));
-    }
-
-    @Test
-    public void testMaxConcurrentStreams() throws InterruptedException
-    {
-        final CountDownLatch failedBecauseMaxConcurrentStreamsExceeded = new CountDownLatch(1);
-
-        Settings settings = new Settings();
-        settings.put(new Settings.Setting(Settings.ID.MAX_CONCURRENT_STREAMS, 0));
-        SettingsFrame settingsFrame = new SettingsFrame(VERSION, (byte)0, settings);
-        session.onControlFrame(settingsFrame);
-
-        PushSynInfo pushSynInfo = new PushSynInfo(1, new PushInfo(new Fields(), false));
-        session.syn(pushSynInfo, null, new Promise.Adapter<Stream>()
-        {
-            @Override
-            public void failed(Throwable x)
-            {
-                failedBecauseMaxConcurrentStreamsExceeded.countDown();
-            }
-        });
-
-        assertThat("Opening push stream failed because maxConcurrentStream is exceeded",
-                failedBecauseMaxConcurrentStreamsExceeded.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    @Test
-    public void testHeaderFramesAreSentInTheOrderTheyAreCreated() throws ExecutionException,
-            TimeoutException, InterruptedException
-    {
-        testHeaderFramesAreSentInOrder((byte)0, (byte)0, (byte)0);
-    }
-
-    @Test
-    public void testHeaderFramesAreSentInTheOrderTheyAreCreatedWithPrioritization() throws ExecutionException,
-            TimeoutException, InterruptedException
-    {
-        testHeaderFramesAreSentInOrder((byte)0, (byte)1, (byte)2);
-    }
-
-    private void testHeaderFramesAreSentInOrder(final byte priority0, final byte priority1, final byte priority2) throws InterruptedException, ExecutionException
-    {
-        final StandardSession testLocalSession = new StandardSession(VERSION, bufferPool, scheduler,
-                new ControllerMock(), endPoint, null, 1, null, generator, new FlowControlStrategy.None());
-        HashSet<Future> tasks = new HashSet<>();
-
-        int numberOfTasksToRun = 128;
-        for (int i = 0; i < numberOfTasksToRun; i++)
-        {
-            tasks.add(threadPool.submit(new Runnable()
-            {
-
-                @Override
-                public void run()
-                {
-                    synStream(priority0);
-                    synStream(priority1);
-                    synStream(priority2);
-                }
-
-                private void synStream(byte priority)
-                {
-                    SynInfo synInfo = new SynInfo(headers, false, priority);
-                    testLocalSession.syn(synInfo, new StreamFrameListener.Adapter(), new FuturePromise<Stream>());
-                }
-            }));
-        }
-
-        for (Future task : tasks)
-        {
-            task.get();
-        }
-
-        threadPool.shutdown();
-        threadPool.awaitTermination(60, TimeUnit.SECONDS);
-    }
-
-    private class ControllerMock implements Controller
-    {
-        long lastStreamId = 0;
-
-        @Override
-        public void write(Callback callback, ByteBuffer... buffers)
-        {
-            StandardSession.FrameBytes frameBytes = (StandardSession.FrameBytes)callback;
-
-            int streamId = frameBytes.getStream().getId();
-            if (LOG.isDebugEnabled())
-                LOG.debug("last: {}, current: {}", lastStreamId, streamId);
-            if (lastStreamId < streamId)
-                lastStreamId = streamId;
-            else
-                throw new IllegalStateException("Last streamId: " + lastStreamId + " is not smaller than current StreamId: " +
-                        streamId);
-            frameBytes.succeeded();
-        }
-
-        @Override
-        public void close(boolean onlyOutput)
-        {
-        }
-    }
-
-    private IStream createStream() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        SynInfo synInfo = new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0);
-        return (IStream)session.syn(synInfo, new StreamFrameListener.Adapter());
-    }
-
-    private IStream createPushStream(Stream stream) throws InterruptedException, ExecutionException, TimeoutException
-    {
-        PushInfo pushInfo = new PushInfo(5, TimeUnit.SECONDS, headers, false);
-        return (IStream)stream.push(pushInfo);
-    }
-
-    private void assertThatStreamIsClosed(IStream stream)
-    {
-        assertThat("stream is closed", stream.isClosed(), is(true));
-    }
-
-    private void assertThatStreamIsReset(IStream stream)
-    {
-        assertThat("stream is reset", stream.isReset(), is(true));
-    }
-
-    private void assertThatStreamIsNotInSession(IStream stream)
-    {
-        assertThat("stream is not in session", session.getStreams().contains(stream), not(true));
-    }
-
-    private void assertThatStreamIsInSession(IStream stream)
-    {
-        assertThat("stream is in session", session.getStreams().contains(stream), is(true));
-    }
-
-    private void assertThatStreamIsNotClosed(IStream stream)
-    {
-        assertThat("stream is not closed", stream.isClosed(), not(true));
-    }
-
-    private void assertThatStreamIsNotHalfClosed(IStream stream)
-    {
-        assertThat("stream is not halfClosed", stream.isHalfClosed(), not(true));
-    }
-
-    private void assertThatPushStreamIsNotClosed(Stream pushStream)
-    {
-        assertThat("pushStream is not closed", pushStream.isClosed(), not(true));
-    }
-
-    private void assertThatStreamIsHalfClosed(IStream stream)
-    {
-        assertThat("stream is halfClosed", stream.isHalfClosed(), is(true));
-    }
-
-    private void assertThatStreamIsNotAssociatedWithPushStream(IStream stream, IStream pushStream)
-    {
-        assertThat("pushStream is removed from parent", stream.getPushedStreams().contains(pushStream), not(true));
-    }
-
-    private void assertThatPushStreamIsNotInSession(Stream pushStream)
-    {
-        assertThat("pushStream is not in session", session.getStreams().contains(pushStream), not(true));
-    }
-
-    private void assertThatPushStreamIsInSession(Stream pushStream)
-    {
-        assertThat("pushStream is in session", session.getStreams().contains(pushStream), is(true));
-    }
-
-    private void assertThatStreamIsAssociatedWithPushStream(IStream stream, Stream pushStream)
-    {
-        assertThat("stream is associated with pushStream", stream.getPushedStreams().contains(pushStream), is(true));
-    }
-
-    private void assertThatPushStreamIsClosed(Stream pushStream)
-    {
-        assertThat("pushStream is closed", pushStream.isClosed(), is(true));
-    }
-
-    private void assertThatPushStreamIsHalfClosed(Stream pushStream)
-    {
-        assertThat("pushStream is half closed ", pushStream.isHalfClosed(), is(true));
-    }
-
-    private void assertThatOnStreamClosedListenerHasBeenCalled(final CountDownLatch closedListenerCalledLatch) throws InterruptedException
-    {
-        assertThat("onStreamClosed listener has been called", closedListenerCalledLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/StandardStreamTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/StandardStreamTest.java
deleted file mode 100644
index 27b7c00..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/StandardStreamTest.java
+++ /dev/null
@@ -1,258 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy;
-
-import java.nio.channels.ClosedChannelException;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.PushInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StringDataInfo;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.SynStreamFrame;
-import org.eclipse.jetty.toolchain.test.annotation.Slow;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.Promise;
-import org.eclipse.jetty.util.thread.ScheduledExecutorScheduler;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatcher;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.instanceOf;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.argThat;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class StandardStreamTest
-{
-    private final ScheduledExecutorScheduler scheduler = new ScheduledExecutorScheduler();
-    @Mock
-    private ISession session;
-    @Mock
-    private SynStreamFrame synStreamFrame;
-
-    @Before
-    public void setUp() throws Exception
-    {
-        scheduler.start();
-    }
-
-    @After
-    public void tearDown() throws Exception
-    {
-        scheduler.stop();
-    }
-
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testSyn()
-    {
-        Stream stream = new StandardStream(synStreamFrame.getStreamId(), synStreamFrame.getPriority(), session, null, null, null);
-        Set<Stream> streams = new HashSet<>();
-        streams.add(stream);
-        when(synStreamFrame.isClose()).thenReturn(false);
-        PushInfo pushInfo = new PushInfo(new Fields(), false);
-        when(session.getStreams()).thenReturn(streams);
-        stream.push(pushInfo, new Promise.Adapter<Stream>());
-        verify(session).syn(argThat(new PushSynInfoMatcher(stream.getId(), pushInfo)),
-                any(StreamFrameListener.class), any(Promise.class));
-    }
-
-    private class PushSynInfoMatcher extends ArgumentMatcher<PushSynInfo>
-    {
-        private int associatedStreamId;
-        private PushInfo pushInfo;
-
-        public PushSynInfoMatcher(int associatedStreamId, PushInfo pushInfo)
-        {
-            this.associatedStreamId = associatedStreamId;
-            this.pushInfo = pushInfo;
-        }
-
-        @Override
-        public boolean matches(Object argument)
-        {
-            PushSynInfo pushSynInfo = (PushSynInfo)argument;
-            return pushSynInfo.getAssociatedStreamId() == associatedStreamId && pushSynInfo.isClose() == pushInfo.isClose();
-        }
-    }
-
-    @Test
-    public void testSynOnClosedStream()
-    {
-        IStream stream = new StandardStream(synStreamFrame.getStreamId(), synStreamFrame.getPriority(), session,
-                null, null , null);
-        stream.updateCloseState(true, true);
-        stream.updateCloseState(true, false);
-        assertThat("stream expected to be closed", stream.isClosed(), is(true));
-        final CountDownLatch failedLatch = new CountDownLatch(1);
-        stream.push(new PushInfo(1, TimeUnit.SECONDS, new Fields(), false), new Promise.Adapter<Stream>()
-        {
-            @Override
-            public void failed(Throwable x)
-            {
-                failedLatch.countDown();
-            }
-        });
-        assertThat("PushStream creation failed", failedLatch.getCount(), equalTo(0L));
-    }
-
-    @SuppressWarnings("unchecked")
-    @Test(expected = IllegalStateException.class)
-    public void testSendDataOnHalfClosedStream() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        SynStreamFrame synStreamFrame = new SynStreamFrame(SPDY.V2, SynInfo.FLAG_CLOSE, 1, 0, (byte)0, (short)0, null);
-        IStream stream = new StandardStream(synStreamFrame.getStreamId(), synStreamFrame.getPriority(), session,
-                null, scheduler, null);
-        stream.updateWindowSize(8192);
-        stream.updateCloseState(synStreamFrame.isClose(), true);
-        assertThat("stream is half closed", stream.isHalfClosed(), is(true));
-        stream.data(new StringDataInfo("data on half closed stream", true));
-        verify(session, never()).data(any(IStream.class), any(DataInfo.class), anyInt(), any(TimeUnit.class), any(Callback.class));
-    }
-
-    @Test
-    @Slow
-    public void testIdleTimeout() throws Exception
-    {
-        IStream stream = new StandardStream(1, (byte)0, session, null, scheduler, null);
-        long idleTimeout = 500;
-        stream.setIdleTimeout(idleTimeout);
-
-        final AtomicInteger failureCount = new AtomicInteger();
-        final CountDownLatch failureLatch = new CountDownLatch(1);
-        stream.setStreamFrameListener(new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onFailure(Stream stream, Throwable x)
-            {
-                assertThat("exception is a TimeoutException", x, is(instanceOf(TimeoutException.class)));
-                failureCount.incrementAndGet();
-                failureLatch.countDown();
-            }
-        });
-        stream.process(new StringDataInfo("string", false));
-
-        // Wait more than (2 * idleTimeout) to be sure to trigger a failureCount > 1
-        Thread.sleep(3 * idleTimeout);
-
-        assertThat("onFailure has been called", failureLatch.await(5, TimeUnit.SECONDS), is(true));
-        Assert.assertEquals(1, failureCount.get());
-    }
-
-    @Test
-    @Slow
-    public void testIdleTimeoutIsInterruptedWhenReceiving() throws Exception
-    {
-        final CountDownLatch failureLatch = new CountDownLatch(1);
-        IStream stream = new StandardStream(1, (byte)0, session, null, scheduler, null);
-        long idleTimeout = 1000;
-        stream.setIdleTimeout(idleTimeout);
-        stream.setStreamFrameListener(new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onFailure(Stream stream, Throwable x)
-            {
-                assertThat("exception is a TimeoutException", x, is(instanceOf(TimeoutException.class)));
-                failureLatch.countDown();
-            }
-        });
-        stream.process(new SynStreamFrame(SPDY.V3, (byte)0, 1, 0, (byte)0, (short)0, null));
-        stream.process(new StringDataInfo("string", false));
-        Thread.sleep(idleTimeout / 2);
-        stream.process(new StringDataInfo("string", false));
-        Thread.sleep(idleTimeout / 2);
-        stream.process(new StringDataInfo("string", false));
-        Thread.sleep(idleTimeout / 2);
-        stream.process(new StringDataInfo("string", true));
-        stream.reply(new ReplyInfo(true), new Callback.Adapter());
-        Thread.sleep(idleTimeout);
-        assertThat("onFailure has not been called", failureLatch.await(idleTimeout, TimeUnit.MILLISECONDS), is(false));
-    }
-
-    @Test
-    @Slow
-    public void testReplyFailureClosesStream() throws Exception
-    {
-        ISession session = new StandardSession(SPDY.V3, null, null, null, null, null, 1, null, null, null)
-        {
-            @Override
-            public void control(IStream stream, ControlFrame frame, long timeout, TimeUnit unit, Callback callback)
-            {
-                callback.failed(new ClosedChannelException());
-            }
-        };
-        IStream stream = new StandardStream(1, (byte)0, session, null, scheduler, null);
-        final AtomicInteger failureCount = new AtomicInteger();
-        stream.setStreamFrameListener(new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onFailure(Stream stream, Throwable x)
-            {
-                failureCount.incrementAndGet();
-            }
-        });
-        long idleTimeout = 500;
-        stream.setIdleTimeout(idleTimeout);
-
-        stream.process(new SynStreamFrame(SPDY.V3, (byte)0, 1, 0, (byte)0, (short)0, null));
-
-        final CountDownLatch failureLatch = new CountDownLatch(1);
-        stream.reply(new ReplyInfo(false), new Callback.Adapter()
-        {
-            @Override
-            public void failed(Throwable x)
-            {
-                failureLatch.countDown();
-            }
-        });
-
-        Assert.assertTrue(failureLatch.await(5, TimeUnit.SECONDS));
-
-        // Make sure that the idle timeout never fires, since the failure above should have closed the stream
-        Thread.sleep(3 * idleTimeout);
-
-        Assert.assertEquals(0, failureCount.get());
-        Assert.assertTrue(stream.isClosed());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/api/ClientUsageTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/api/ClientUsageTest.java
deleted file mode 100644
index 6a9042c..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/api/ClientUsageTest.java
+++ /dev/null
@@ -1,260 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import java.nio.charset.StandardCharsets;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-import org.eclipse.jetty.spdy.StandardSession;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.Promise;
-import org.junit.Ignore;
-import org.junit.Test;
-
-@Ignore
-public class ClientUsageTest
-{
-    @Test
-    public void testClientRequestResponseNoBody() throws Exception
-    {
-        Session session = new StandardSession(SPDY.V2, null, null, null, null, null, 1, null, null, null);
-
-        session.syn(new SynInfo(new Fields(), true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                // Do something with the response
-                replyInfo.getHeaders().get("host");
-
-                // Then issue another similar request
-                try
-                {
-                    stream.getSession().syn(new SynInfo(new Fields(), true), this);
-                }
-                catch (ExecutionException | InterruptedException | TimeoutException e)
-                {
-                    throw new IllegalStateException(e);
-                }
-            }
-        });
-    }
-
-    @Test
-    public void testClientReceivesPush1() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        Session session = new StandardSession(SPDY.V2, null, null, null, null, null, 1, null, null, null);
-
-        session.syn(new SynInfo(new Fields(), true), new StreamFrameListener.Adapter()
-        {
-            public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-            {
-                return new Adapter()
-                {
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                    }
-                };
-            };
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                // Do something with the response
-                replyInfo.getHeaders().get("host");
-
-                // Then issue another similar request
-                try
-                {
-                    stream.getSession().syn(new SynInfo(new Fields(), true), this);
-                }
-                catch (ExecutionException | InterruptedException | TimeoutException e)
-                {
-                    throw new IllegalStateException(e);
-                }
-            }
-        });
-    }
-
-    @Test
-    public void testClientReceivesPush2() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        Session session = new StandardSession(SPDY.V2, null, null, null, null, null, 1, new SessionFrameListener.Adapter()
-        {
-            public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-            {
-                return new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                    }
-                };
-            }
-        }, null, null);
-
-        session.syn(new SynInfo(new Fields(), true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                // Do something with the response
-                replyInfo.getHeaders().get("host");
-
-                // Then issue another similar request
-                try
-                {
-                    stream.getSession().syn(new SynInfo(new Fields(), true), this);
-                }
-                catch (ExecutionException | InterruptedException | TimeoutException e)
-                {
-                    throw new IllegalStateException(e);
-                }
-            }
-        });
-    }
-
-    @Test
-    public void testClientRequestWithBodyResponseNoBody() throws Exception
-    {
-        Session session = new StandardSession(SPDY.V2, null, null, null, null, null, 1, null, null, null);
-
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0),
-                new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onReply(Stream stream, ReplyInfo replyInfo)
-                    {
-                        // Do something with the response
-                        replyInfo.getHeaders().get("host");
-
-                        // Then issue another similar request
-                        try
-                        {
-                            stream.getSession().syn(new SynInfo(new Fields(), true), this);
-                        }
-                        catch (ExecutionException | InterruptedException | TimeoutException e)
-                        {
-                            throw new IllegalStateException(e);
-                        }
-                    }
-                });
-        // Send-and-forget the data
-        stream.data(new StringDataInfo("data", true));
-    }
-
-    @Test
-    public void testAsyncClientRequestWithBodyResponseNoBody() throws Exception
-    {
-        Session session = new StandardSession(SPDY.V2, null, null, null, null, null, 1, null, null, null);
-
-        final String context = "context";
-        session.syn(new SynInfo(new Fields(), false), new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onReply(Stream stream, ReplyInfo replyInfo)
-                    {
-                        // Do something with the response
-                        replyInfo.getHeaders().get("host");
-
-                        // Then issue another similar request
-                        try
-                        {
-                            stream.getSession().syn(new SynInfo(new Fields(), true), this);
-                        }
-                        catch (ExecutionException | InterruptedException | TimeoutException e)
-                        {
-                            throw new IllegalStateException(e);
-                        }
-                    }
-                }, new Promise.Adapter<Stream>()
-                {
-                    @Override
-                    public void succeeded(Stream stream)
-                    {
-                        // Differently from JDK 7 AIO, there is no need to
-                        // have an explicit parameter for the context since
-                        // that is captured while the handler is created anyway,
-                        // and it is used only by the handler as parameter
-
-                        // The style below is fire-and-forget, since
-                        // we do not pass the handler nor we call get()
-                        // to wait for the data to be sent
-                        stream.data(new StringDataInfo(context, true), new Callback.Adapter());
-                    }
-                }
-        );
-    }
-
-    @Test
-    public void testAsyncClientRequestWithBodyAndResponseWithBody() throws Exception
-    {
-        Session session = new StandardSession(SPDY.V2, null, null, null, null, null, 1, null, null, null);
-
-        session.syn(new SynInfo(new Fields(), false), new StreamFrameListener.Adapter()
-                {
-                    // The good of passing the listener to push() is that applications can safely
-                    // accumulate info from the reply headers to be used in the data callback,
-                    // e.g. content-type, charset, etc.
-
-                    @Override
-                    public void onReply(Stream stream, ReplyInfo replyInfo)
-                    {
-                        // Do something with the response
-                        Fields headers = replyInfo.getHeaders();
-                        int contentLength = headers.get("content-length").getValueAsInt();
-                        stream.setAttribute("content-length", contentLength);
-                        if (!replyInfo.isClose())
-                            stream.setAttribute("builder", new StringBuilder());
-
-                        // May issue another similar request while waiting for data
-                        try
-                        {
-                            stream.getSession().syn(new SynInfo(new Fields(), true), this);
-                        }
-                        catch (ExecutionException | InterruptedException | TimeoutException e)
-                        {
-                            throw new IllegalStateException(e);
-                        }
-                    }
-
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        StringBuilder builder = (StringBuilder)stream.getAttribute("builder");
-                        builder.append(dataInfo.asString(StandardCharsets.UTF_8, true));
-
-                    }
-                }, new Promise.Adapter<Stream>()
-                {
-                    @Override
-                    public void succeeded(Stream stream)
-                    {
-                        stream.data(new BytesDataInfo("wee".getBytes(StandardCharsets.UTF_8), false), new Callback.Adapter());
-                        stream.data(new StringDataInfo("foo", false), new Callback.Adapter());
-                        stream.data(new ByteBufferDataInfo(StandardCharsets.UTF_8.encode("bar"), true), new Callback.Adapter());
-                    }
-                }
-        );
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/api/ServerUsageTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/api/ServerUsageTest.java
deleted file mode 100644
index 8e57bc1..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/api/ServerUsageTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.api;
-
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.Promise;
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
-
-@Ignore
-public class ServerUsageTest
-{
-    @Test
-    public void testServerSynAndReplyWithData() throws Exception
-    {
-        ServerSessionFrameListener ssfl = new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo streamInfo)
-            {
-                Fields synHeaders = streamInfo.getHeaders();
-                // Do something with headers, for example extract them and
-                // perform an http request via Jetty's LocalConnector
-
-                // Get the http response, fill headers and data
-                Fields replyHeaders = new Fields();
-                replyHeaders.put(synHeaders.get("host"));
-                // Sends a reply
-                stream.reply(new ReplyInfo(replyHeaders, false), new Callback.Adapter());
-
-                // Sends data
-                StringDataInfo dataInfo = new StringDataInfo("foo", false);
-                stream.data(dataInfo, new Callback.Adapter());
-                // Stream is now closed
-                return null;
-            }
-        };
-        Assert.assertNotNull(ssfl);
-    }
-
-    @Test
-    public void testServerInitiatesStreamAndPushesData() throws Exception
-    {
-        ServerSessionFrameListener ssfl = new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public void onConnect(Session session)
-            {
-                // SPDY does not allow the server to initiate a stream without an existing stream
-                // being opened by the client already.
-                // Correct SPDY sequence will be:
-                // C ---       SYN_STREAM(id=1)       --> S
-                // C <--       SYN_REPLY(id=1)        --- S
-                // C <-- SYN_STREAM(id=2,uni,assId=1) --- S
-                //
-                // However, the API may allow to initiate the stream
-
-                session.syn(new SynInfo(new Fields(), false), null, new Promise.Adapter<Stream>()
-                {
-                    @Override
-                    public void succeeded(Stream stream)
-                    {
-                        // The point here is that we have no idea if the client accepted our stream
-                        // So we return a stream, we may be able to send the headers frame, but later
-                        // the client sends a rst frame.
-                        // We have to atomically set some flag on the stream to signal it's closed
-                        // and any operation on it will throw
-                        stream.headers(new HeadersInfo(new Fields(), true), new Callback.Adapter());
-                    }
-                });
-            }
-        };
-        Assert.assertNotNull(ssfl);
-    }
-
-    @Test
-    public void testServerPush() throws Exception
-    {
-        ServerSessionFrameListener ssfl = new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo streamInfo)
-            {
-                // Need to send the reply first
-                stream.reply(new ReplyInfo(false), new Callback.Adapter());
-
-                Session session = stream.getSession();
-                // Since it's unidirectional, no need to pass the listener
-                session.syn(new SynInfo(new Fields(), false, (byte)0), null, new Promise.Adapter<Stream>()
-                {
-                    @Override
-                    public void succeeded(Stream pushStream)
-                    {
-                        pushStream.data(new StringDataInfo("foo", false), new Callback.Adapter());
-                    }
-                });
-                return null;
-            }
-        };
-        Assert.assertNotNull(ssfl);
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/CredentialGenerateParseTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/CredentialGenerateParseTest.java
deleted file mode 100644
index 0e1026f..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/CredentialGenerateParseTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.security.KeyStore;
-import java.security.cert.Certificate;
-
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.spdy.parser.Parser;
-import org.eclipse.jetty.util.resource.Resource;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class CredentialGenerateParseTest
-{
-    @Test
-    public void testGenerateParse() throws Exception
-    {
-        short slot = 1;
-        byte[] proof = new byte[]{0, 1, 2};
-        Certificate[] temp = loadCertificates();
-        Certificate[] certificates = new Certificate[temp.length * 2];
-        System.arraycopy(temp, 0, certificates, 0, temp.length);
-        System.arraycopy(temp, 0, certificates, temp.length, temp.length);
-        CredentialFrame frame1 = new CredentialFrame(SPDY.V3, slot, proof, certificates);
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        parser.parse(buffer);
-        ControlFrame frame2 = listener.getControlFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(ControlFrameType.CREDENTIAL, frame2.getType());
-        CredentialFrame credential = (CredentialFrame)frame2;
-        Assert.assertEquals(SPDY.V3, credential.getVersion());
-        Assert.assertEquals(0, credential.getFlags());
-        Assert.assertEquals(slot, credential.getSlot());
-        Assert.assertArrayEquals(proof, credential.getProof());
-        Assert.assertArrayEquals(certificates, credential.getCertificateChain());
-    }
-
-    @Test
-    public void testGenerateParseOneByteAtATime() throws Exception
-    {
-        short slot = 1;
-        byte[] proof = new byte[]{0, 1, 2};
-        Certificate[] certificates = loadCertificates();
-        CredentialFrame frame1 = new CredentialFrame(SPDY.V3, slot, proof, certificates);
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        while (buffer.hasRemaining())
-            parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
-        ControlFrame frame2 = listener.getControlFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(ControlFrameType.CREDENTIAL, frame2.getType());
-        CredentialFrame credential = (CredentialFrame)frame2;
-        Assert.assertEquals(SPDY.V3, credential.getVersion());
-        Assert.assertEquals(0, credential.getFlags());
-        Assert.assertEquals(slot, credential.getSlot());
-        Assert.assertArrayEquals(proof, credential.getProof());
-        Assert.assertArrayEquals(certificates, credential.getCertificateChain());
-    }
-
-    private Certificate[] loadCertificates() throws Exception
-    {
-        KeyStore keyStore = KeyStore.getInstance("JKS");
-        InputStream keyStoreStream = Resource.newResource("src/test/resources/keystore.jks").getInputStream();
-        keyStore.load(keyStoreStream, "storepwd".toCharArray());
-        return keyStore.getCertificateChain("mykey");
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/DataGenerateParseTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/DataGenerateParseTest.java
deleted file mode 100644
index af122a5..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/DataGenerateParseTest.java
+++ /dev/null
@@ -1,144 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.StringDataInfo;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.spdy.parser.Parser;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class DataGenerateParseTest
-{
-    @Test
-    public void testGenerateParse() throws Exception
-    {
-        testGenerateParse("test1");
-    }
-
-    @Test
-    public void testGenerateParseZeroLength() throws Exception
-    {
-        testGenerateParse("");
-    }
-
-    private void testGenerateParse(String content) throws Exception
-    {
-        int length = content.length();
-        DataInfo data = new StringDataInfo(content, true);
-        int streamId = 13;
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.data(streamId, 2 * length, data);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        parser.parse(buffer);
-        DataFrame frame2 = listener.getDataFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(streamId, frame2.getStreamId());
-        Assert.assertEquals(DataInfo.FLAG_CLOSE, frame2.getFlags());
-        Assert.assertEquals(length, frame2.getLength());
-        Assert.assertEquals(length, listener.getData().remaining());
-    }
-
-    @Test
-    public void testGenerateParseOneByteAtATime() throws Exception
-    {
-        String content = "test2";
-        int length = content.length();
-        DataInfo data = new StringDataInfo(content, true);
-        int streamId = 13;
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.data(streamId, 2 * length, data);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        while (buffer.hasRemaining())
-        {
-            parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
-            if (buffer.remaining() < length)
-            {
-                DataFrame frame2 = listener.getDataFrame();
-                Assert.assertNotNull(frame2);
-                Assert.assertEquals(streamId, frame2.getStreamId());
-                Assert.assertEquals(buffer.hasRemaining() ? 0 : DataInfo.FLAG_CLOSE, frame2.getFlags());
-                Assert.assertEquals(1, frame2.getLength());
-                Assert.assertEquals(1, listener.getData().remaining());
-            }
-        }
-    }
-
-    @Test
-    public void testGenerateParseWithSyntheticFrames() throws Exception
-    {
-        String content = "0123456789ABCDEF";
-        int length = content.length();
-        DataInfo data = new StringDataInfo(content, true);
-        int streamId = 13;
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.data(streamId, 2 * length, data);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-
-        // Split the buffer to simulate a split boundary in receiving the bytes
-        int split = 3;
-        ByteBuffer buffer1 = ByteBuffer.allocate(buffer.remaining() - split);
-        buffer.limit(buffer.limit() - split);
-        buffer1.put(buffer);
-        buffer1.flip();
-        ByteBuffer buffer2 = ByteBuffer.allocate(split);
-        buffer.limit(buffer.limit() + split);
-        buffer2.put(buffer);
-        buffer2.flip();
-
-        parser.parse(buffer1);
-        DataFrame frame2 = listener.getDataFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(streamId, frame2.getStreamId());
-        Assert.assertEquals(0, frame2.getFlags());
-        Assert.assertEquals(length - split, frame2.getLength());
-        Assert.assertEquals(length - split, listener.getData().remaining());
-
-        parser.parse(buffer2);
-        DataFrame frame3 = listener.getDataFrame();
-
-        Assert.assertNotNull(frame3);
-        Assert.assertEquals(streamId, frame3.getStreamId());
-        Assert.assertEquals(DataInfo.FLAG_CLOSE, frame3.getFlags());
-        Assert.assertEquals(split, frame3.getLength());
-        Assert.assertEquals(split, listener.getData().remaining());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/GoAwayGenerateParseTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/GoAwayGenerateParseTest.java
deleted file mode 100644
index d1952d9..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/GoAwayGenerateParseTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.spdy.parser.Parser;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class GoAwayGenerateParseTest
-{
-    @Test
-    public void testGenerateParse() throws Exception
-    {
-        int lastStreamId = 13;
-        int statusCode = 1;
-        GoAwayFrame frame1 = new GoAwayFrame(SPDY.V3, lastStreamId, statusCode);
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        parser.parse(buffer);
-        ControlFrame frame2 = listener.getControlFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(ControlFrameType.GO_AWAY, frame2.getType());
-        GoAwayFrame goAway = (GoAwayFrame)frame2;
-        Assert.assertEquals(SPDY.V3, goAway.getVersion());
-        Assert.assertEquals(lastStreamId, goAway.getLastStreamId());
-        Assert.assertEquals(0, goAway.getFlags());
-        Assert.assertEquals(statusCode, goAway.getStatusCode());
-    }
-
-    @Test
-    public void testGenerateParseOneByteAtATime() throws Exception
-    {
-        int lastStreamId = 13;
-        int statusCode = 1;
-        GoAwayFrame frame1 = new GoAwayFrame(SPDY.V3, lastStreamId, statusCode);
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        while (buffer.hasRemaining())
-            parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
-        ControlFrame frame2 = listener.getControlFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(ControlFrameType.GO_AWAY, frame2.getType());
-        GoAwayFrame goAway = (GoAwayFrame)frame2;
-        Assert.assertEquals(SPDY.V3, goAway.getVersion());
-        Assert.assertEquals(lastStreamId, goAway.getLastStreamId());
-        Assert.assertEquals(0, goAway.getFlags());
-        Assert.assertEquals(statusCode, goAway.getStatusCode());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/HeadersGenerateParseTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/HeadersGenerateParseTest.java
deleted file mode 100644
index a458746..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/HeadersGenerateParseTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.junit.Assert.assertThat;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.api.HeadersInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.spdy.parser.Parser;
-import org.eclipse.jetty.util.Fields;
-import org.junit.Before;
-import org.junit.Test;
-
-public class HeadersGenerateParseTest
-{
-
-    private Fields headers = new Fields();
-    private int streamId = 13;
-    private byte flags = HeadersInfo.FLAG_RESET_COMPRESSION;
-    private final TestSPDYParserListener listener = new TestSPDYParserListener();
-    private final Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-    private ByteBuffer buffer;
-
-    @Before
-    public void setUp()
-    {
-        parser.addListener(listener);
-        headers.put("a", "b");
-        buffer = createHeadersFrameBuffer(headers);
-    }
-
-    private ByteBuffer createHeadersFrameBuffer(Fields headers)
-    {
-        HeadersFrame frame1 = new HeadersFrame(SPDY.V2, flags, streamId, headers);
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-        assertThat("Buffer is not null", buffer, notNullValue());
-        return buffer;
-    }
-
-    @Test
-    public void testGenerateParse() throws Exception
-    {
-        parser.parse(buffer);
-        assertExpectationsAreMet(headers);
-    }
-
-    @Test
-    public void testGenerateParseOneByteAtATime() throws Exception
-    {
-        while (buffer.hasRemaining())
-            parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
-
-        assertExpectationsAreMet(headers);
-    }
-
-    @Test
-    public void testHeadersAreTranslatedToLowerCase()
-    {
-        Fields headers = new Fields();
-        headers.put("Via","localhost");
-        parser.parse(createHeadersFrameBuffer(headers));
-        HeadersFrame parsedHeadersFrame = assertExpectationsAreMet(headers);
-        Fields.Field viaHeader = parsedHeadersFrame.getHeaders().get("via");
-        assertThat("Via Header name is lowercase", viaHeader.getName(), is("via"));
-    }
-
-    private HeadersFrame assertExpectationsAreMet(Fields headers)
-    {
-        ControlFrame parsedControlFrame = listener.getControlFrame();
-        assertThat("listener received controlFrame", parsedControlFrame, notNullValue());
-        assertThat("ControlFrame type is HEADERS", ControlFrameType.HEADERS, is(parsedControlFrame.getType()));
-        HeadersFrame headersFrame = (HeadersFrame)parsedControlFrame;
-        assertThat("Version matches", SPDY.V2, is(headersFrame.getVersion()));
-        assertThat("StreamId matches", streamId, is(headersFrame.getStreamId()));
-        assertThat("flags match", flags, is(headersFrame.getFlags()));
-        assertThat("headers match", headers, is(headersFrame.getHeaders()));
-        return headersFrame;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/NoOpGenerateParseTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/NoOpGenerateParseTest.java
deleted file mode 100644
index 151dd5e..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/NoOpGenerateParseTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.spdy.parser.Parser;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class NoOpGenerateParseTest
-{
-    @Test
-    public void testGenerateParse() throws Exception
-    {
-        NoOpFrame frame1 = new NoOpFrame();
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        parser.parse(buffer);
-        ControlFrame frame2 = listener.getControlFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(ControlFrameType.NOOP, frame2.getType());
-        NoOpFrame noOp = (NoOpFrame)frame2;
-        Assert.assertEquals(0, noOp.getFlags());
-    }
-
-    @Test
-    public void testGenerateParseOneByteAtATime() throws Exception
-    {
-        NoOpFrame frame1 = new NoOpFrame();
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        while (buffer.hasRemaining())
-            parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
-        ControlFrame frame2 = listener.getControlFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(ControlFrameType.NOOP, frame2.getType());
-        NoOpFrame noOp = (NoOpFrame)frame2;
-        Assert.assertEquals(0, noOp.getFlags());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/PingGenerateParseTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/PingGenerateParseTest.java
deleted file mode 100644
index b613901..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/PingGenerateParseTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.spdy.parser.Parser;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class PingGenerateParseTest
-{
-    @Test
-    public void testGenerateParse() throws Exception
-    {
-        int pingId = 13;
-        PingFrame frame1 = new PingFrame(SPDY.V2, pingId);
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        parser.parse(buffer);
-        ControlFrame frame2 = listener.getControlFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(ControlFrameType.PING, frame2.getType());
-        PingFrame ping = (PingFrame)frame2;
-        Assert.assertEquals(SPDY.V2, ping.getVersion());
-        Assert.assertEquals(pingId, ping.getPingId());
-        Assert.assertEquals(0, ping.getFlags());
-    }
-
-    @Test
-    public void testGenerateParseOneByteAtATime() throws Exception
-    {
-        int pingId = 13;
-        PingFrame frame1 = new PingFrame(SPDY.V2, pingId);
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        while (buffer.hasRemaining())
-            parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
-        ControlFrame frame2 = listener.getControlFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(ControlFrameType.PING, frame2.getType());
-        PingFrame ping = (PingFrame)frame2;
-        Assert.assertEquals(SPDY.V2, ping.getVersion());
-        Assert.assertEquals(pingId, ping.getPingId());
-        Assert.assertEquals(0, ping.getFlags());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/RstStreamGenerateParseTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/RstStreamGenerateParseTest.java
deleted file mode 100644
index 030a73f..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/RstStreamGenerateParseTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.not;
-import static org.hamcrest.Matchers.nullValue;
-import static org.junit.Assert.assertThat;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.spdy.parser.Parser;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class RstStreamGenerateParseTest
-{
-    @Test
-    public void testGenerateParse() throws Exception
-    {
-        int streamId = 13;
-        int streamStatus = StreamStatus.UNSUPPORTED_VERSION.getCode(SPDY.V2);
-        RstStreamFrame frame1 = new RstStreamFrame(SPDY.V2, streamId, streamStatus);
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-
-        assertThat("buffer is not null", buffer, not(nullValue()));
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        parser.parse(buffer);
-        ControlFrame frame2 = listener.getControlFrame();
-
-        assertThat("frame2 is not null", frame2, not(nullValue()));
-        assertThat("frame2 is type RST_STREAM",ControlFrameType.RST_STREAM, equalTo(frame2.getType()));
-        RstStreamFrame rstStream = (RstStreamFrame)frame2;
-        assertThat("rstStream version is SPDY.V2",SPDY.V2, equalTo(rstStream.getVersion()));
-        assertThat("rstStream id is equal to streamId",streamId, equalTo(rstStream.getStreamId()));
-        assertThat("rstStream flags are 0",(byte)0, equalTo(rstStream.getFlags()));
-        assertThat("stream status is equal to rstStream statuscode",streamStatus, is(rstStream.getStatusCode()));
-    }
-
-    @Test
-    public void testGenerateParseOneByteAtATime() throws Exception
-    {
-        int streamId = 13;
-        int streamStatus = StreamStatus.UNSUPPORTED_VERSION.getCode(SPDY.V2);
-        RstStreamFrame frame1 = new RstStreamFrame(SPDY.V2, streamId, streamStatus);
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        while (buffer.hasRemaining())
-            parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
-        ControlFrame frame2 = listener.getControlFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(ControlFrameType.RST_STREAM, frame2.getType());
-        RstStreamFrame rstStream = (RstStreamFrame)frame2;
-        Assert.assertEquals(SPDY.V2, rstStream.getVersion());
-        Assert.assertEquals(streamId, rstStream.getStreamId());
-        Assert.assertEquals(0, rstStream.getFlags());
-        Assert.assertEquals(streamStatus, rstStream.getStatusCode());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/SettingsGenerateParseTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/SettingsGenerateParseTest.java
deleted file mode 100644
index d27b5d7..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/SettingsGenerateParseTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Settings;
-import org.eclipse.jetty.spdy.api.SettingsInfo;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.spdy.parser.Parser;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class SettingsGenerateParseTest
-{
-    @Test
-    public void testGenerateParse() throws Exception
-    {
-        byte flags = SettingsInfo.CLEAR_PERSISTED;
-        Settings settings = new Settings();
-        settings.put(new Settings.Setting(Settings.ID.MAX_CONCURRENT_STREAMS, Settings.Flag.PERSIST, 100));
-        settings.put(new Settings.Setting(Settings.ID.ROUND_TRIP_TIME, Settings.Flag.PERSISTED, 500));
-        SettingsFrame frame1 = new SettingsFrame(SPDY.V2, flags, settings);
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        parser.parse(buffer);
-        ControlFrame frame2 = listener.getControlFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(ControlFrameType.SETTINGS, frame2.getType());
-        SettingsFrame settingsFrame = (SettingsFrame)frame2;
-        Assert.assertEquals(SPDY.V2, settingsFrame.getVersion());
-        Assert.assertEquals(flags, settingsFrame.getFlags());
-        Assert.assertEquals(settings, settingsFrame.getSettings());
-    }
-
-    @Test
-    public void testGenerateParseOneByteAtATime() throws Exception
-    {
-        byte flags = SettingsInfo.CLEAR_PERSISTED;
-        Settings settings = new Settings();
-        settings.put(new Settings.Setting(Settings.ID.DOWNLOAD_RETRANSMISSION_RATE, 100));
-        settings.put(new Settings.Setting(Settings.ID.ROUND_TRIP_TIME, 500));
-        SettingsFrame frame1 = new SettingsFrame(SPDY.V2, flags, settings);
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        while (buffer.hasRemaining())
-            parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
-        ControlFrame frame2 = listener.getControlFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(ControlFrameType.SETTINGS, frame2.getType());
-        SettingsFrame settingsFrame = (SettingsFrame)frame2;
-        Assert.assertEquals(SPDY.V2, settingsFrame.getVersion());
-        Assert.assertEquals(flags, settingsFrame.getFlags());
-        Assert.assertEquals(settings, settingsFrame.getSettings());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/SynReplyGenerateParseTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/SynReplyGenerateParseTest.java
deleted file mode 100644
index 9ef380b..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/SynReplyGenerateParseTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.spdy.parser.Parser;
-import org.eclipse.jetty.util.Fields;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class SynReplyGenerateParseTest
-{
-    @Test
-    public void testGenerateParse() throws Exception
-    {
-        byte flags = ReplyInfo.FLAG_CLOSE;
-        int streamId = 13;
-        Fields headers = new Fields();
-        headers.put("a", "b");
-        SynReplyFrame frame1 = new SynReplyFrame(SPDY.V2, flags, streamId, headers);
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        parser.parse(buffer);
-        ControlFrame frame2 = listener.getControlFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(ControlFrameType.SYN_REPLY, frame2.getType());
-        SynReplyFrame synReply = (SynReplyFrame)frame2;
-        Assert.assertEquals(SPDY.V2, synReply.getVersion());
-        Assert.assertEquals(flags, synReply.getFlags());
-        Assert.assertEquals(streamId, synReply.getStreamId());
-        Assert.assertEquals(headers, synReply.getHeaders());
-    }
-
-    @Test
-    public void testGenerateParseOneByteAtATime() throws Exception
-    {
-        byte flags = ReplyInfo.FLAG_CLOSE;
-        int streamId = 13;
-        Fields headers = new Fields();
-        headers.put("a", "b");
-        SynReplyFrame frame1 = new SynReplyFrame(SPDY.V2, flags, streamId, headers);
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        while (buffer.hasRemaining())
-            parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
-        ControlFrame frame2 = listener.getControlFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(ControlFrameType.SYN_REPLY, frame2.getType());
-        SynReplyFrame synReply = (SynReplyFrame)frame2;
-        Assert.assertEquals(SPDY.V2, synReply.getVersion());
-        Assert.assertEquals(flags, synReply.getFlags());
-        Assert.assertEquals(streamId, synReply.getStreamId());
-        Assert.assertEquals(headers, synReply.getHeaders());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/SynStreamGenerateParseTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/SynStreamGenerateParseTest.java
deleted file mode 100644
index 7651d04..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/SynStreamGenerateParseTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.spdy.parser.Parser;
-import org.eclipse.jetty.util.Fields;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class SynStreamGenerateParseTest
-{
-    @Test
-    public void testGenerateParse() throws Exception
-    {
-        byte flags = SynInfo.FLAG_CLOSE;
-        int streamId = 13;
-        int associatedStreamId = 11;
-        byte priority = 3;
-        short slot = 5;
-        Fields headers = new Fields();
-        headers.put("a", "b");
-        headers.put("c", "d");
-        SynStreamFrame frame1 = new SynStreamFrame(SPDY.V2, flags, streamId, associatedStreamId, priority, slot, headers);
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        parser.parse(buffer);
-        ControlFrame frame2 = listener.getControlFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(ControlFrameType.SYN_STREAM, frame2.getType());
-        SynStreamFrame synStream = (SynStreamFrame)frame2;
-        Assert.assertEquals(SPDY.V2, synStream.getVersion());
-        Assert.assertEquals(streamId, synStream.getStreamId());
-        Assert.assertEquals(associatedStreamId, synStream.getAssociatedStreamId());
-        Assert.assertEquals(flags, synStream.getFlags());
-        Assert.assertEquals(priority, synStream.getPriority());
-        Assert.assertEquals(slot, synStream.getSlot());
-        Assert.assertEquals(headers, synStream.getHeaders());
-    }
-
-    @Test
-    public void testGenerateParseOneByteAtATime() throws Exception
-    {
-        byte flags = SynInfo.FLAG_CLOSE;
-        int streamId = 13;
-        int associatedStreamId = 11;
-        byte priority = 3;
-        short slot = 5;
-        Fields headers = new Fields();
-        headers.put("a", "b");
-        headers.put("c", "d");
-        SynStreamFrame frame1 = new SynStreamFrame(SPDY.V2, flags, streamId, associatedStreamId, priority, slot, headers);
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        while (buffer.hasRemaining())
-            parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
-        ControlFrame frame2 = listener.getControlFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(ControlFrameType.SYN_STREAM, frame2.getType());
-        SynStreamFrame synStream = (SynStreamFrame)frame2;
-        Assert.assertEquals(SPDY.V2, synStream.getVersion());
-        Assert.assertEquals(streamId, synStream.getStreamId());
-        Assert.assertEquals(associatedStreamId, synStream.getAssociatedStreamId());
-        Assert.assertEquals(flags, synStream.getFlags());
-        Assert.assertEquals(priority, synStream.getPriority());
-        Assert.assertEquals(slot, synStream.getSlot());
-        Assert.assertEquals(headers, synStream.getHeaders());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/TestSPDYParserListener.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/TestSPDYParserListener.java
deleted file mode 100644
index bf7694f..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/TestSPDYParserListener.java
+++ /dev/null
@@ -1,70 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.spdy.SessionException;
-import org.eclipse.jetty.spdy.StreamException;
-import org.eclipse.jetty.spdy.parser.Parser;
-
-public class TestSPDYParserListener implements Parser.Listener
-{
-    private ControlFrame controlFrame;
-    private DataFrame dataFrame;
-    private ByteBuffer data;
-
-    @Override
-    public void onControlFrame(ControlFrame frame)
-    {
-        this.controlFrame = frame;
-    }
-
-    @Override
-    public void onDataFrame(DataFrame frame, ByteBuffer data)
-    {
-        this.dataFrame = frame;
-        this.data = data;
-    }
-
-    @Override
-    public void onStreamException(StreamException x)
-    {
-    }
-
-    @Override
-    public void onSessionException(SessionException x)
-    {
-    }
-
-    public ControlFrame getControlFrame()
-    {
-        return controlFrame;
-    }
-
-    public DataFrame getDataFrame()
-    {
-        return dataFrame;
-    }
-
-    public ByteBuffer getData()
-    {
-        return data;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/WindowUpdateGenerateParseTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/WindowUpdateGenerateParseTest.java
deleted file mode 100644
index 062e93b..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/frames/WindowUpdateGenerateParseTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.frames;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.spdy.parser.Parser;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class WindowUpdateGenerateParseTest
-{
-    @Test
-    public void testGenerateParse() throws Exception
-    {
-        int streamId = 13;
-        int windowDelta = 17;
-        WindowUpdateFrame frame1 = new WindowUpdateFrame(SPDY.V2, streamId, windowDelta);
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        parser.parse(buffer);
-        ControlFrame frame2 = listener.getControlFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(ControlFrameType.WINDOW_UPDATE, frame2.getType());
-        WindowUpdateFrame windowUpdate = (WindowUpdateFrame)frame2;
-        Assert.assertEquals(SPDY.V2, windowUpdate.getVersion());
-        Assert.assertEquals(streamId, windowUpdate.getStreamId());
-        Assert.assertEquals(0, windowUpdate.getFlags());
-        Assert.assertEquals(windowDelta, windowUpdate.getWindowDelta());
-    }
-
-    @Test
-    public void testGenerateParseOneByteAtATime() throws Exception
-    {
-        int streamId = 13;
-        int windowDelta = 17;
-        WindowUpdateFrame frame1 = new WindowUpdateFrame(SPDY.V2, streamId, windowDelta);
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        ByteBuffer buffer = generator.control(frame1);
-
-        Assert.assertNotNull(buffer);
-
-        TestSPDYParserListener listener = new TestSPDYParserListener();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(listener);
-        while (buffer.hasRemaining())
-            parser.parse(ByteBuffer.wrap(new byte[]{buffer.get()}));
-        ControlFrame frame2 = listener.getControlFrame();
-
-        Assert.assertNotNull(frame2);
-        Assert.assertEquals(ControlFrameType.WINDOW_UPDATE, frame2.getType());
-        WindowUpdateFrame windowUpdate = (WindowUpdateFrame)frame2;
-        Assert.assertEquals(SPDY.V2, windowUpdate.getVersion());
-        Assert.assertEquals(streamId, windowUpdate.getStreamId());
-        Assert.assertEquals(0, windowUpdate.getFlags());
-        Assert.assertEquals(windowDelta, windowUpdate.getWindowDelta());
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/generator/DataFrameGeneratorTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/generator/DataFrameGeneratorTest.java
deleted file mode 100644
index d9bf4d0..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/generator/DataFrameGeneratorTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.generator;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.nio.ByteBuffer;
-import java.util.concurrent.ThreadLocalRandom;
-
-import org.eclipse.jetty.io.ArrayByteBufferPool;
-import org.eclipse.jetty.spdy.api.ByteBufferDataInfo;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.frames.DataFrame;
-import org.eclipse.jetty.util.BufferUtil;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-public class DataFrameGeneratorTest
-{
-    private int increment = 1024;
-    private int streamId = 1;
-    private ArrayByteBufferPool bufferPool;
-    private DataFrameGenerator dataFrameGenerator;
-    private ByteBuffer headerBuffer = ByteBuffer.allocate(DataFrame.HEADER_LENGTH);
-
-    @Before
-    public void setUp()
-    {
-        bufferPool = new ArrayByteBufferPool(64, increment, 8192);
-        dataFrameGenerator = new DataFrameGenerator(bufferPool);
-        headerBuffer.putInt(0, streamId & 0x7F_FF_FF_FF);
-
-    }
-
-    @Test
-    public void testGenerateSmallFrame()
-    {
-        int bufferSize = 256;
-        generateFrame(bufferSize);
-    }
-
-    @Test
-    public void testGenerateFrameWithBufferThatEqualsBucketSize()
-    {
-        int bufferSize = increment;
-        generateFrame(bufferSize);
-    }
-
-    @Test
-    public void testGenerateFrameWithBufferThatEqualsBucketSizeMinusHeaderLength()
-    {
-        int bufferSize = increment - DataFrame.HEADER_LENGTH;
-        generateFrame(bufferSize);
-    }
-
-    private void generateFrame(int bufferSize)
-    {
-        ByteBuffer byteBuffer = createByteBuffer(bufferSize);
-        ByteBufferDataInfo dataInfo = new ByteBufferDataInfo(byteBuffer, true);
-        fillHeaderBuffer(bufferSize);
-        ByteBuffer dataFrameBuffer = dataFrameGenerator.generate(streamId, bufferSize, dataInfo);
-
-        assertThat("The content size in dataFrameBuffer matches the buffersize + header length",
-                dataFrameBuffer.limit(),
-                is(bufferSize + DataFrame.HEADER_LENGTH));
-
-        byte[] headerBytes = new byte[DataFrame.HEADER_LENGTH];
-        dataFrameBuffer.get(headerBytes, 0, DataFrame.HEADER_LENGTH);
-        
-        assertThat("Header bytes are prepended", headerBytes, is(headerBuffer.array()));
-    }
-
-    private ByteBuffer createByteBuffer(int bufferSize)
-    {
-        byte[] bytes = new byte[bufferSize];
-        ThreadLocalRandom.current().nextBytes(bytes);
-        ByteBuffer byteBuffer = bufferPool.acquire(bufferSize, false);
-        BufferUtil.flipToFill(byteBuffer);
-        byteBuffer.put(bytes);
-        BufferUtil.flipToFlush(byteBuffer, 0);
-        return byteBuffer;
-    }
-
-    private void fillHeaderBuffer(int bufferSize)
-    {
-        headerBuffer.putInt(4, bufferSize & 0x00_FF_FF_FF);
-        headerBuffer.put(4, DataInfo.FLAG_CLOSE);
-    }
-
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/parser/BrokenFrameTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/parser/BrokenFrameTest.java
deleted file mode 100644
index df8b2e9..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/parser/BrokenFrameTest.java
+++ /dev/null
@@ -1,287 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.io.ByteArrayOutputStream;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.zip.ZipException;
-
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.CompressionFactory;
-import org.eclipse.jetty.spdy.StreamException;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.SynStreamFrame;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.Fields;
-import org.junit.Test;
-
-public class BrokenFrameTest
-{
-
-    @Test
-    public void testInvalidHeaderNameLength() throws Exception
-    {
-        Fields headers = new Fields();
-        headers.add("broken", "header");
-        SynStreamFrame frame = new SynStreamFrame(SPDY.V2, SynInfo.FLAG_CLOSE, 1, 0, (byte)0, (short)0, headers);
-        Generator generator = new Generator(new MappedByteBufferPool(), new NoCompressionCompressionFactory.NoCompressionCompressor());
-
-        ByteBuffer bufferWithBrokenHeaderNameLength = generator.control(frame);
-        // Break the header name length to provoke the Parser to throw a StreamException
-        bufferWithBrokenHeaderNameLength.put(21, (byte)0);
-
-        ByteBuffer bufferWithValidSynStreamFrame = generator.control(frame);
-
-        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        outputStream.write(BufferUtil.toArray(bufferWithBrokenHeaderNameLength));
-        outputStream.write(BufferUtil.toArray(bufferWithValidSynStreamFrame));
-
-        byte concatenatedFramesByteArray[] = outputStream.toByteArray();
-        ByteBuffer concatenatedBuffer = BufferUtil.toBuffer(concatenatedFramesByteArray);
-
-        final CountDownLatch latch = new CountDownLatch(2);
-        Parser parser = new Parser(new NoCompressionCompressionFactory.NoCompressionDecompressor());
-        parser.addListener(new Parser.Listener.Adapter()
-        {
-            @Override
-            public void onControlFrame(ControlFrame frame)
-            {
-                latch.countDown();
-            }
-
-            @Override
-            public void onStreamException(StreamException x)
-            {
-                latch.countDown();
-            }
-        });
-        parser.parse(concatenatedBuffer);
-
-        assertThat(latch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    @Test
-    public void testInvalidVersion() throws Exception
-    {
-        Fields headers = new Fields();
-        headers.add("good", "header");
-        headers.add("another","header");
-        SynStreamFrame frame = new SynStreamFrame(SPDY.V2, SynInfo.FLAG_CLOSE, 1, 0, (byte)0, (short)0, headers);
-        Generator generator = new Generator(new MappedByteBufferPool(), new NoCompressionCompressionFactory.NoCompressionCompressor());
-
-        ByteBuffer bufferWithBrokenVersion = generator.control(frame);
-        // Break the header name length to provoke the Parser to throw a StreamException
-        bufferWithBrokenVersion.put(1, (byte)4);
-
-        ByteBuffer bufferWithValidSynStreamFrame = generator.control(frame);
-
-        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        outputStream.write(BufferUtil.toArray(bufferWithBrokenVersion));
-        outputStream.write(BufferUtil.toArray(bufferWithValidSynStreamFrame));
-
-        byte concatenatedFramesByteArray[] = outputStream.toByteArray();
-        ByteBuffer concatenatedBuffer = BufferUtil.toBuffer(concatenatedFramesByteArray);
-
-        final CountDownLatch latch = new CountDownLatch(2);
-        Parser parser = new Parser(new NoCompressionCompressionFactory.NoCompressionDecompressor());
-        parser.addListener(new Parser.Listener.Adapter()
-        {
-            @Override
-            public void onControlFrame(ControlFrame frame)
-            {
-                latch.countDown();
-            }
-
-            @Override
-            public void onStreamException(StreamException x)
-            {
-                latch.countDown();
-            }
-        });
-        parser.parse(concatenatedBuffer);
-
-        assertThat(latch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    @Test
-    public void testInvalidVersionWithSplitBuffer() throws Exception
-    {
-        Fields headers = new Fields();
-        headers.add("good", "header");
-        headers.add("another","header");
-        SynStreamFrame frame = new SynStreamFrame(SPDY.V2, SynInfo.FLAG_CLOSE, 1, 0, (byte)0, (short)0, headers);
-        Generator generator = new Generator(new MappedByteBufferPool(), new NoCompressionCompressionFactory.NoCompressionCompressor());
-
-        ByteBuffer bufferWithBrokenVersion = generator.control(frame);
-        // Break the header name length to provoke the Parser to throw a StreamException
-        bufferWithBrokenVersion.put(1, (byte)4);
-
-        ByteBuffer bufferWithValidSynStreamFrame = generator.control(frame);
-
-        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        outputStream.write(BufferUtil.toArray(bufferWithBrokenVersion));
-        outputStream.write(BufferUtil.toArray(bufferWithValidSynStreamFrame));
-
-        byte concatenatedFramesByteArray[] = outputStream.toByteArray();
-        ByteBuffer concatenatedBuffer1 = BufferUtil.toBuffer(Arrays.copyOfRange(concatenatedFramesByteArray,0,20));
-        ByteBuffer concatenatedBuffer2 = BufferUtil.toBuffer(Arrays.copyOfRange(concatenatedFramesByteArray,20,
-                concatenatedFramesByteArray.length));
-
-        final CountDownLatch latch = new CountDownLatch(2);
-        Parser parser = new Parser(new NoCompressionCompressionFactory.NoCompressionDecompressor());
-        parser.addListener(new Parser.Listener.Adapter()
-        {
-            @Override
-            public void onControlFrame(ControlFrame frame)
-            {
-                latch.countDown();
-            }
-
-            @Override
-            public void onStreamException(StreamException x)
-            {
-                latch.countDown();
-            }
-        });
-        parser.parse(concatenatedBuffer1);
-        parser.parse(concatenatedBuffer2);
-
-        assertThat(latch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    @Test
-    public void testInvalidVersionAndGoodFrameSplitInThreeBuffers() throws Exception
-    {
-        Fields headers = new Fields();
-        headers.add("good", "header");
-        headers.add("another","header");
-        SynStreamFrame frame = new SynStreamFrame(SPDY.V2, SynInfo.FLAG_CLOSE, 1, 0, (byte)0, (short)0, headers);
-        Generator generator = new Generator(new MappedByteBufferPool(), new NoCompressionCompressionFactory.NoCompressionCompressor());
-
-        ByteBuffer bufferWithBrokenVersion = generator.control(frame);
-        // Break the header name length to provoke the Parser to throw a StreamException
-        bufferWithBrokenVersion.put(1, (byte)4);
-
-        ByteBuffer bufferWithValidSynStreamFrame = generator.control(frame);
-
-        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        outputStream.write(BufferUtil.toArray(bufferWithBrokenVersion));
-        outputStream.write(BufferUtil.toArray(bufferWithValidSynStreamFrame));
-
-        byte concatenatedFramesByteArray[] = outputStream.toByteArray();
-        ByteBuffer concatenatedBuffer1 = BufferUtil.toBuffer(Arrays.copyOfRange(concatenatedFramesByteArray,0,20));
-        ByteBuffer concatenatedBuffer2 = BufferUtil.toBuffer(Arrays.copyOfRange(concatenatedFramesByteArray,20, 30));
-        ByteBuffer concatenatedBuffer3 = BufferUtil.toBuffer(Arrays.copyOfRange(concatenatedFramesByteArray,30,
-                concatenatedFramesByteArray.length));
-
-        final CountDownLatch latch = new CountDownLatch(2);
-        Parser parser = new Parser(new NoCompressionCompressionFactory.NoCompressionDecompressor());
-        parser.addListener(new Parser.Listener.Adapter()
-        {
-            @Override
-            public void onControlFrame(ControlFrame frame)
-            {
-                latch.countDown();
-            }
-
-            @Override
-            public void onStreamException(StreamException x)
-            {
-                latch.countDown();
-            }
-        });
-        parser.parse(concatenatedBuffer1);
-        parser.parse(concatenatedBuffer2);
-        parser.parse(concatenatedBuffer3);
-
-        assertThat(latch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    private static class NoCompressionCompressionFactory implements CompressionFactory
-    {
-
-        @Override
-        public Compressor newCompressor()
-        {
-            return null;
-        }
-
-        @Override
-        public Decompressor newDecompressor()
-        {
-            return null;
-        }
-
-        public static class NoCompressionCompressor implements Compressor
-        {
-
-            private byte[] input;
-
-            @Override
-            public void setInput(byte[] input)
-            {
-                this.input = input;
-            }
-
-            @Override
-            public void setDictionary(byte[] dictionary)
-            {
-            }
-
-            @Override
-            public int compress(byte[] output)
-            {
-                System.arraycopy(input, 0, output, 0, input.length);
-                return input.length;
-            }
-        }
-
-        public static class NoCompressionDecompressor implements Decompressor
-        {
-            private byte[] input;
-
-            @Override
-            public void setDictionary(byte[] dictionary)
-            {
-            }
-
-            @Override
-            public void setInput(byte[] input)
-            {
-                this.input = input;
-            }
-
-            @Override
-            public int decompress(byte[] output) throws ZipException
-            {
-                System.arraycopy(input, 0, output, 0, input.length);
-                return input.length;
-            }
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/parser/LiveChromiumRequestParserTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/parser/LiveChromiumRequestParserTest.java
deleted file mode 100644
index 441b862..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/parser/LiveChromiumRequestParserTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.nio.ByteBuffer;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.ControlFrameType;
-import org.eclipse.jetty.spdy.frames.SynStreamFrame;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class LiveChromiumRequestParserTest
-{
-    @Test
-    public void testSynStream() throws Exception
-    {
-        // Bytes taken with wireshark from a live chromium request
-        byte[] bytes1 = toBytes("" +
-                "800200010100011a0000000100000000000038eadfa251b262e0626083a41706" +
-                "7bb80b75302cd6ae4017cdcdb12eb435d0b3d4d1d2d702b32c18f850732c036f" +
-                "68889bae850e44da94811f2d0b3308821ca80375a14e714a72065c0d2cd619f8" +
-                "52f37443837552f3a076b080b234033f28de73404c2b43630b135306b65c6059" +
-                "929fc2c0ecee1ac2c0560c4c7eb9a940b52525050ccc206f32ea337021f22643" +
-                "bb6f7e55664e4ea2bea99e81824684a1a135400a3e9979a5150a151666f16626" +
-                "9a0a8e40afa686a726796796e89b1a9bea992b68787b84f8fae828e46466a72a" +
-                "b8a72667e76b2a842695e69594ea1b0203d640c1390358e06496e6ea1b9ae901" +
-                "c3c5d048cfdc1c22988a22149c98965894093195811d1a150c1cb01802000000" +
-                "ffff");
-        byte[] bytes2 = toBytes("" +
-                "800200010100002700000003000000008000428a106660d00ee640e5d14f4b2c" +
-                "cb0466313d203154c217000000ffff");
-
-        final AtomicReference<ControlFrame> frameRef = new AtomicReference<>();
-        Parser parser = new Parser(new StandardCompressionFactory().newDecompressor());
-        parser.addListener(new Parser.Listener.Adapter()
-        {
-            @Override
-            public void onControlFrame(ControlFrame frame)
-            {
-                frameRef.set(frame);
-            }
-        });
-        parser.parse(ByteBuffer.wrap(bytes1));
-
-        ControlFrame frame = frameRef.get();
-        Assert.assertNotNull(frame);
-        Assert.assertEquals(ControlFrameType.SYN_STREAM, frame.getType());
-        SynStreamFrame synStream = (SynStreamFrame)frame;
-        Assert.assertEquals(2, synStream.getVersion());
-        Assert.assertEquals(1, synStream.getStreamId());
-        Assert.assertEquals(0, synStream.getAssociatedStreamId());
-        Assert.assertEquals(0, synStream.getPriority());
-        Assert.assertNotNull(synStream.getHeaders());
-        Assert.assertFalse(synStream.getHeaders().isEmpty());
-
-        frameRef.set(null);
-        parser.parse(ByteBuffer.wrap(bytes2));
-
-        frame = frameRef.get();
-        Assert.assertNotNull(frame);
-        Assert.assertEquals(ControlFrameType.SYN_STREAM, frame.getType());
-        synStream = (SynStreamFrame)frame;
-        Assert.assertEquals(2, synStream.getVersion());
-        Assert.assertEquals(3, synStream.getStreamId());
-        Assert.assertEquals(0, synStream.getAssociatedStreamId());
-        Assert.assertEquals(2, synStream.getPriority());
-        Assert.assertNotNull(synStream.getHeaders());
-        Assert.assertFalse(synStream.getHeaders().isEmpty());
-    }
-
-    private byte[] toBytes(String hexs)
-    {
-        byte[] bytes = new byte[hexs.length() / 2];
-        for (int i = 0; i < hexs.length(); i += 2)
-        {
-            String hex = hexs.substring(i, i + 2);
-            bytes[i / 2] = (byte)Integer.parseInt(hex, 16);
-        }
-        return bytes;
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/parser/ParseVersusCacheBenchmarkTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/parser/ParseVersusCacheBenchmarkTest.java
deleted file mode 100644
index d656733..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/parser/ParseVersusCacheBenchmarkTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
-
-public class ParseVersusCacheBenchmarkTest
-{
-    @Ignore
-    @Test
-    public void testParseVersusCache() throws Exception
-    {
-        // The parser knows the header name and value lengths, so it creates strings
-        // out of the bytes; however, this involves creating a byte[] copy the bytes,
-        // and creating a new String.
-        // The alternative is to use a cache<ByteBuffer, String>. Is that faster ?
-        // See also: http://jeremymanson.blogspot.com/2008/04/immutability-in-java.html
-
-        String name = "Content-Type";
-        String value = "application/octect-stream";
-        ByteBuffer buffer = ByteBuffer.wrap((name + value).getBytes(StandardCharsets.ISO_8859_1));
-        int iterations = 100_000_000;
-
-        long begin = System.nanoTime();
-        for (int i = 0; i < iterations; ++i)
-        {
-            byte[] nameBytes = new byte[name.length()];
-            buffer.get(nameBytes);
-            String name2 = new String(nameBytes, StandardCharsets.ISO_8859_1);
-            Assert.assertEquals(name2, name);
-
-            byte[] valueBytes = new byte[value.length()];
-            buffer.get(valueBytes);
-            String value2 = new String(valueBytes, StandardCharsets.ISO_8859_1);
-            Assert.assertEquals(value2, value);
-
-            buffer.flip();
-        }
-        long end = System.nanoTime();
-        System.err.printf("parse time: %d%n", TimeUnit.NANOSECONDS.toMillis(end - begin));
-
-        Map<ByteBuffer, String> map = new HashMap<>();
-        map.put(ByteBuffer.wrap(name.getBytes(StandardCharsets.ISO_8859_1)), name);
-        map.put(ByteBuffer.wrap(value.getBytes(StandardCharsets.ISO_8859_1)), value);
-        final Map<ByteBuffer, String> cache = Collections.unmodifiableMap(map);
-
-        begin = System.nanoTime();
-        for (int i = 0; i < iterations; ++i)
-        {
-            buffer.limit(buffer.position() + name.length());
-            String name2 = cache.get(buffer);
-            Assert.assertEquals(name2, name);
-
-            buffer.position(buffer.limit());
-            buffer.limit(buffer.position() + value.length());
-            String value2 = cache.get(buffer);
-            Assert.assertEquals(value2, value);
-
-            buffer.position(buffer.limit());
-            buffer.flip();
-        }
-        end = System.nanoTime();
-        System.err.printf("cache time: %d%n", TimeUnit.NANOSECONDS.toMillis(end - begin));
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/parser/UnknownControlFrameTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/parser/UnknownControlFrameTest.java
deleted file mode 100644
index e46a527..0000000
--- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/parser/UnknownControlFrameTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.parser;
-
-import java.nio.ByteBuffer;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.SessionException;
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.StreamException;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.DataFrame;
-import org.eclipse.jetty.spdy.frames.SynStreamFrame;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.util.Fields;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class UnknownControlFrameTest
-{
-    @Test
-    public void testUnknownControlFrame() throws Exception
-    {
-        SynStreamFrame frame = new SynStreamFrame(SPDY.V2, SynInfo.FLAG_CLOSE, 1, 0, (byte)0, (short)0, new Fields());
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory.StandardCompressor());
-        ByteBuffer buffer = generator.control(frame);
-        // Change the frame type to unknown
-        buffer.putShort(2, (short)0);
-
-        final CountDownLatch latch = new CountDownLatch(1);
-        Parser parser = new Parser(new StandardCompressionFactory.StandardDecompressor());
-        parser.addListener(new Parser.Listener.Adapter()
-        {
-            @Override
-            public void onControlFrame(ControlFrame frame)
-            {
-                latch.countDown();
-            }
-
-            @Override
-            public void onDataFrame(DataFrame frame, ByteBuffer data)
-            {
-                latch.countDown();
-            }
-
-            @Override
-            public void onStreamException(StreamException x)
-            {
-                latch.countDown();
-            }
-
-            @Override
-            public void onSessionException(SessionException x)
-            {
-                latch.countDown();
-            }
-        });
-        parser.parse(buffer);
-
-        Assert.assertFalse(latch.await(1, TimeUnit.SECONDS));
-    }
-}
diff --git a/jetty-spdy/spdy-core/src/test/resources/jetty-logging.properties b/jetty-spdy/spdy-core/src/test/resources/jetty-logging.properties
deleted file mode 100644
index 5250a08..0000000
--- a/jetty-spdy/spdy-core/src/test/resources/jetty-logging.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
-org.eclipse.jetty.spdy.LEVEL=WARN
diff --git a/jetty-spdy/spdy-core/src/test/resources/keystore.jks b/jetty-spdy/spdy-core/src/test/resources/keystore.jks
deleted file mode 100644
index 428ba54..0000000
--- a/jetty-spdy/spdy-core/src/test/resources/keystore.jks
+++ /dev/null
Binary files differ
diff --git a/jetty-spdy/spdy-core/src/test/resources/truststore.jks b/jetty-spdy/spdy-core/src/test/resources/truststore.jks
deleted file mode 100644
index 839cb8c..0000000
--- a/jetty-spdy/spdy-core/src/test/resources/truststore.jks
+++ /dev/null
Binary files differ
diff --git a/jetty-spdy/spdy-example-webapp/pom.xml b/jetty-spdy/spdy-example-webapp/pom.xml
deleted file mode 100644
index ddd4791..0000000
--- a/jetty-spdy/spdy-example-webapp/pom.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.eclipse.jetty.spdy</groupId>
-        <artifactId>spdy-parent</artifactId>
-        <version>9.2.14-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>spdy-example-webapp</artifactId>
-    <packaging>war</packaging>
-    <name>Jetty :: SPDY :: HTTP Web Application</name>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-maven-plugin</artifactId>
-                <version>${project.version}</version>
-                <configuration>
-                    <stopPort>8888</stopPort>
-                    <stopKey>quit</stopKey>
-                    <jvmArgs>
-                        -Xbootclasspath/p:${settings.localRepository}/org/mortbay/jetty/npn/npn-boot/${npn.version}/npn-boot-${npn.version}.jar
-                    </jvmArgs>
-                    <jettyXml>${basedir}/src/main/config/example-jetty-spdy.xml</jettyXml>
-                    <contextPath>/</contextPath>
-                    <excludedGoals>
-                       <excludedGoal>run</excludedGoal>
-                       <excludedGoal>run-war</excludedGoal>
-                       <excludedGoal>deploy</excludedGoal>
-                       <excludedGoal>start</excludedGoal>
-                       <excludedGoal>stop</excludedGoal>
-                    </excludedGoals>
-                </configuration>
-                <dependencies>
-                    <dependency>
-                        <groupId>org.eclipse.jetty.spdy</groupId>
-                        <artifactId>spdy-http-server</artifactId>
-                        <version>${project.version}</version>
-                    </dependency>
-                </dependencies>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>proxy</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.eclipse.jetty</groupId>
-                        <artifactId>jetty-maven-plugin</artifactId>
-                        <version>${project.version}</version>
-                        <configuration>
-                            <stopPort>8888</stopPort>
-                            <stopKey>quit</stopKey>
-                            <jvmArgs>
-                                -Xbootclasspath/p:${settings.localRepository}/org/mortbay/jetty/npn/npn-boot/${npn.version}/npn-boot-${npn.version}.jar
-                            </jvmArgs>
-                            <jettyXml>${basedir}/src/main/config/example-jetty-spdy-proxy.xml</jettyXml>
-                            <contextPath>/</contextPath>
-                            <excludedGoals>
-                               <excludedGoal>run</excludedGoal>
-                               <excludedGoal>run-war</excludedGoal>
-                               <excludedGoal>deploy</excludedGoal>
-                               <excludedGoal>start</excludedGoal>
-                               <excludedGoal>stop</excludedGoal>
-                            </excludedGoals>
-                        </configuration>
-                        <dependencies>
-                            <dependency>
-                                <groupId>org.eclipse.jetty.spdy</groupId>
-                                <artifactId>spdy-http-server</artifactId>
-                                <version>${project.version}</version>
-                            </dependency>
-                        </dependencies>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/jetty-spdy/spdy-example-webapp/src/main/config/example-jetty-spdy-proxy.xml b/jetty-spdy/spdy-example-webapp/src/main/config/example-jetty-spdy-proxy.xml
deleted file mode 100644
index 7d3d360..0000000
--- a/jetty-spdy/spdy-example-webapp/src/main/config/example-jetty-spdy-proxy.xml
+++ /dev/null
@@ -1,147 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-    <New id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
-        <Set name="keyStorePath">src/main/resources/keystore.jks</Set>
-        <Set name="keyStorePassword">storepwd</Set>
-        <Set name="trustStorePath">src/main/resources/truststore.jks</Set>
-        <Set name="trustStorePassword">storepwd</Set>
-        <Set name="protocol">TLSv1</Set>
-    </New>
-
-    <!--
-    <Set class="org.eclipse.jetty.npn.NextProtoNego" name="debug" type="boolean">true</Set>
-    -->
-
-    <New id="tlsHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
-        <Arg>
-            <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
-                <Set name="secureScheme">https</Set>
-                <Set name="securePort">
-                    <Property name="jetty.tls.port" default="8443"/>
-                </Set>
-                <Set name="outputBufferSize">32768</Set>
-                <Set name="requestHeaderSize">8192</Set>
-                <Set name="responseHeaderSize">8192</Set>
-
-                <!-- Uncomment to enable handling of X-Forwarded- style headers
-                <Call name="addCustomizer">
-                    <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg>
-                </Call>
-                -->
-            </New>
-        </Arg>
-        <Call name="addCustomizer">
-            <Arg>
-                <New class="org.eclipse.jetty.server.SecureRequestCustomizer"/>
-            </Arg>
-        </Call>
-    </New>
-
-    <!--
-    This is the upstream server connector. It speaks non-SSL SPDY/3(HTTP) on port 9090.
-    -->
-    <Call name="addConnector">
-        <Arg>
-            <New class="org.eclipse.jetty.server.ServerConnector">
-                <Arg name="server">
-                    <Ref refid="Server"/>
-                </Arg>
-                <Arg name="factories">
-                    <Array type="org.eclipse.jetty.server.ConnectionFactory">
-                        <!-- SPDY/3 Connection factory -->
-                        <Item>
-                            <New class="org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnectionFactory">
-                                <Arg name="version" type="int">3</Arg>
-                                <Arg name="config">
-                                    <Ref refid="tlsHttpConfig"/>
-                                </Arg>
-                            </New>
-                        </Item>
-                    </Array>
-                </Arg>
-                <Set name="port">9090</Set>
-            </New>
-        </Arg>
-    </Call>
-
-    <!--
-    This ProxyEngine translates the incoming SPDY/x(HTTP) request to SPDY/2(HTTP)
-    -->
-    <New id="spdyProxyEngine" class="org.eclipse.jetty.spdy.server.proxy.SPDYProxyEngine">
-        <Arg>
-            <New class="org.eclipse.jetty.spdy.client.SPDYClient$Factory">
-                <Call name="start"/>
-            </New>
-        </Arg>
-    </New>
-
-    <!--
-    The ProxyEngineSelector receives SPDY/x(HTTP) requests from proxy connectors below
-    and is configured to process requests for host "localhost".
-    Such requests are converted from SPDY/x(HTTP) to SPDY/3(HTTP) by the configured ProxyEngine
-    and forwarded to 127.0.0.1:9090, where they are served by the upstream server above.
-    -->
-    <New id="proxyEngineSelector" class="org.eclipse.jetty.spdy.server.proxy.ProxyEngineSelector">
-        <Call name="putProxyEngine">
-            <Arg>spdy/3</Arg>
-            <Arg>
-                <Ref refid="spdyProxyEngine"/>
-            </Arg>
-        </Call>
-        <Set name="proxyServerInfos">
-            <Map>
-                <Entry>
-                    <Item>localhost</Item>
-                    <Item>
-                        <New class="org.eclipse.jetty.spdy.server.proxy.ProxyEngineSelector$ProxyServerInfo">
-                            <Arg type="String">spdy/3</Arg>
-                            <Arg>127.0.0.1</Arg>
-                            <Arg type="int">9090</Arg>
-                        </New>
-                    </Item>
-                </Entry>
-            </Map>
-        </Set>
-    </New>
-
-    <!--
-    These are the reverse proxy connectors accepting requests from clients.
-    They accept non-SSL (on port 8080) and SSL (on port 8443) HTTP,
-    SPDY/2(HTTP) and SPDY/3(HTTP).
-    Non-SPDY HTTP requests are converted to SPDY internally and passed to the
-    ProxyEngine above.
-    -->
-    <Call name="addConnector">
-        <Arg>
-            <New class="org.eclipse.jetty.spdy.server.proxy.HTTPSPDYProxyServerConnector">
-                <Arg>
-                    <Ref refid="Server"/>
-                </Arg>
-                <Arg>
-                    <Ref refid="proxyEngineSelector"/>
-                </Arg>
-                <Set name="Port">8080</Set>
-            </New>
-        </Arg>
-    </Call>
-    <Call name="addConnector">
-        <Arg>
-            <New class="org.eclipse.jetty.spdy.server.proxy.HTTPSPDYProxyServerConnector">
-                <Arg>
-                    <Ref refid="Server"/>
-                </Arg>
-                <Arg>
-                    <Ref refid="sslContextFactory"/>
-                </Arg>
-                <Arg>
-                    <Ref refid="proxyEngineSelector"/>
-                </Arg>
-                <Set name="Port">8443</Set>
-            </New>
-        </Arg>
-    </Call>
-
-</Configure>
diff --git a/jetty-spdy/spdy-example-webapp/src/main/config/example-jetty-spdy.xml b/jetty-spdy/spdy-example-webapp/src/main/config/example-jetty-spdy.xml
deleted file mode 100644
index 47f83be..0000000
--- a/jetty-spdy/spdy-example-webapp/src/main/config/example-jetty-spdy.xml
+++ /dev/null
@@ -1,138 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-    <New id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
-        <Set name="keyStorePath">src/main/resources/keystore.jks</Set>
-        <Set name="keyStorePassword">storepwd</Set>
-        <Set name="trustStorePath">src/main/resources/truststore.jks</Set>
-        <Set name="trustStorePassword">storepwd</Set>
-        <Set name="protocol">TLSv1</Set>
-    </New>
-
-    <New id="tlsHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
-        <Arg>
-            <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
-                <Set name="secureScheme">https</Set>
-                <Set name="securePort">
-                    <Property name="jetty.tls.port" default="8443"/>
-                </Set>
-                <Set name="outputBufferSize">32768</Set>
-                <Set name="requestHeaderSize">8192</Set>
-                <Set name="responseHeaderSize">8192</Set>
-
-                <!-- Uncomment to enable handling of X-Forwarded- style headers
-                <Call name="addCustomizer">
-                    <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg>
-                </Call>
-                -->
-            </New>
-        </Arg>
-        <Call name="addCustomizer">
-            <Arg>
-                <New class="org.eclipse.jetty.server.SecureRequestCustomizer"/>
-            </Arg>
-        </Call>
-    </New>
-
-    <New id="pushStrategy" class="org.eclipse.jetty.spdy.server.http.ReferrerPushStrategy">
-        <!-- Uncomment to blacklist browsers for this push strategy. If one of the blacklisted Strings occurs in the
-             user-agent header sent by the client, push will be disabled for this browser. This is case insensitive" -->
-        <!--
-        <Set name="UserAgentBlacklist">
-            <Array type="String">
-                <Item>.*(?i)firefox/14.*</Item>
-                <Item>.*(?i)firefox/15.*</Item>
-                <Item>.*(?i)firefox/16.*</Item>
-            </Array>
-        </Set>
-        -->
-
-        <!-- Uncomment to override default file extensions to push -->
-        <!--
-        <Set name="PushRegexps">
-            <Array type="String">
-               <Item>.*\.css</Item>
-               <Item>.*\.js</Item>
-               <Item>.*\.png</Item>
-               <Item>.*\.jpg</Item>
-               <Item>.*\.gif</Item>
-           </Array>
-        </Set>
-        -->
-        <Set name="referrerPushPeriod">5000</Set>
-        <Set name="maxAssociatedResources">32</Set>
-    </New>
-
-    <Call id="sslConnector" name="addConnector">
-        <Arg>
-            <New class="org.eclipse.jetty.server.ServerConnector">
-                <Arg name="server"><Ref refid="Server"/></Arg>
-                <Arg name="factories">
-                    <Array type="org.eclipse.jetty.server.ConnectionFactory">
-
-                        <!-- SSL Connection factory with NPN as next protocol -->
-                        <Item>
-                            <New class="org.eclipse.jetty.server.SslConnectionFactory">
-                                <Arg name="next">npn</Arg>
-                                <Arg name="sslContextFactory">
-                                    <Ref refid="sslContextFactory"/>
-                                </Arg>
-                            </New>
-                        </Item>
-
-                        <!-- NPN Connection factory with HTTP as default protocol -->
-                        <Item>
-                            <New class="org.eclipse.jetty.spdy.server.NPNServerConnectionFactory">
-                                <Arg name="protocols">
-                                    <Array type="String">
-                                        <Item>spdy/3</Item>
-                                        <Item>spdy/2</Item>
-                                        <Item>http/1.1</Item>
-                                    </Array>
-                                </Arg>
-                                <Set name="defaultProtocol">http/1.1</Set>
-                            </New>
-                        </Item>
-
-                        <!-- SPDY/3 Connection factory -->
-                        <Item>
-                            <New class="org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnectionFactory">
-                                <Arg name="version" type="int">3</Arg>
-                                <Arg name="config">
-                                    <Ref refid="tlsHttpConfig"/>
-                                </Arg>
-                                <Arg name="pushStrategy">
-                                    <Ref refid="pushStrategy"/>
-                                </Arg>
-                            </New>
-                        </Item>
-
-                        <!-- SPDY/2 Connection factory -->
-                        <Item>
-                            <New class="org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnectionFactory">
-                                <Arg name="version" type="int">2</Arg>
-                                <Arg name="config">
-                                    <Ref refid="tlsHttpConfig"/>
-                                </Arg>
-                            </New>
-                        </Item>
-
-                        <!-- HTTP Connection factory -->
-                        <Item>
-                            <New class="org.eclipse.jetty.server.HttpConnectionFactory">
-                                <Arg name="config">
-                                    <Ref refid="tlsHttpConfig"/>
-                                </Arg>
-                            </New>
-                        </Item>
-                    </Array>
-                </Arg>
-
-                <Set name="port">8443</Set>
-            </New>
-        </Arg>
-    </Call>
-
-</Configure>
diff --git a/jetty-spdy/spdy-example-webapp/src/main/resources/jetty-logging.properties b/jetty-spdy/spdy-example-webapp/src/main/resources/jetty-logging.properties
deleted file mode 100644
index 5250a08..0000000
--- a/jetty-spdy/spdy-example-webapp/src/main/resources/jetty-logging.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
-org.eclipse.jetty.spdy.LEVEL=WARN
diff --git a/jetty-spdy/spdy-example-webapp/src/main/resources/keystore.jks b/jetty-spdy/spdy-example-webapp/src/main/resources/keystore.jks
deleted file mode 100644
index 428ba54..0000000
--- a/jetty-spdy/spdy-example-webapp/src/main/resources/keystore.jks
+++ /dev/null
Binary files differ
diff --git a/jetty-spdy/spdy-example-webapp/src/main/resources/truststore.jks b/jetty-spdy/spdy-example-webapp/src/main/resources/truststore.jks
deleted file mode 100644
index 839cb8c..0000000
--- a/jetty-spdy/spdy-example-webapp/src/main/resources/truststore.jks
+++ /dev/null
Binary files differ
diff --git a/jetty-spdy/spdy-example-webapp/src/main/webapp/WEB-INF/web.xml b/jetty-spdy/spdy-example-webapp/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index eb49319..0000000
--- a/jetty-spdy/spdy-example-webapp/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<web-app xmlns="http://java.sun.com/xml/ns/javaee"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
-         version="3.0">
-</web-app>
diff --git a/jetty-spdy/spdy-example-webapp/src/main/webapp/form.jsp b/jetty-spdy/spdy-example-webapp/src/main/webapp/form.jsp
deleted file mode 100644
index 4e41a65..0000000
--- a/jetty-spdy/spdy-example-webapp/src/main/webapp/form.jsp
+++ /dev/null
@@ -1,3 +0,0 @@
-<div>
-    <p>This paragraph has been retrieved via an AJAX call</p>
-</div>
diff --git a/jetty-spdy/spdy-example-webapp/src/main/webapp/included.jsp b/jetty-spdy/spdy-example-webapp/src/main/webapp/included.jsp
deleted file mode 100644
index d69cd4a..0000000
--- a/jetty-spdy/spdy-example-webapp/src/main/webapp/included.jsp
+++ /dev/null
@@ -1,3 +0,0 @@
-<div>
-    <p>This paragraph is an included content via &lt;jsp:include&gt;</p>
-</div>
diff --git a/jetty-spdy/spdy-example-webapp/src/main/webapp/index.jsp b/jetty-spdy/spdy-example-webapp/src/main/webapp/index.jsp
deleted file mode 100644
index f190e57..0000000
--- a/jetty-spdy/spdy-example-webapp/src/main/webapp/index.jsp
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html>
-<head>
-    <title>SPDY TEST PAGE</title>
-    <link rel="stylesheet" href="stylesheet.css" />
-    <script type="text/javascript">
-        function submit()
-        {
-            var xhr = new XMLHttpRequest();
-            xhr.open("POST", "${pageContext.request.contextPath}/form.jsp", false);
-            xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
-            xhr.send("param=1");
-            window.document.getElementById("form").innerHTML = xhr.responseText;
-        }
-    </script>
-</head>
-<body>
-<h2>SPDY TEST PAGE</h2>
-<div>
-    <p><span id="css">This paragraph should have a colored background, meaning that the CSS has been loaded.</span></p>
-</div>
-<div id="image">
-    <p>Below there should be an image</p>
-    <img src="${pageContext.request.contextPath}/logo.jpg"  alt="logo" />
-</div>
-<div>
-    <jsp:include page="included.jsp" />
-</div>
-<div>
-    <p>Click on the button below to perform an AJAX call</p>
-    <button type="button" onclick="submit()">
-        PERFORM AJAX CALL
-    </button>
-    <p id="form"></p>
-</div>
-</body>
-</html>
diff --git a/jetty-spdy/spdy-example-webapp/src/main/webapp/logo.jpg b/jetty-spdy/spdy-example-webapp/src/main/webapp/logo.jpg
deleted file mode 100644
index e8eb8c5..0000000
--- a/jetty-spdy/spdy-example-webapp/src/main/webapp/logo.jpg
+++ /dev/null
Binary files differ
diff --git a/jetty-spdy/spdy-example-webapp/src/main/webapp/stylesheet.css b/jetty-spdy/spdy-example-webapp/src/main/webapp/stylesheet.css
deleted file mode 100644
index 169c339..0000000
--- a/jetty-spdy/spdy-example-webapp/src/main/webapp/stylesheet.css
+++ /dev/null
@@ -1,9 +0,0 @@
-body
-{
-    font-family: Verdana, sans-serif;
-}
-
-#css
-{
-    background: #0FF;
-}
diff --git a/jetty-spdy/spdy-http-client-transport/pom.xml b/jetty-spdy/spdy-http-client-transport/pom.xml
deleted file mode 100644
index 8f2192e..0000000
--- a/jetty-spdy/spdy-http-client-transport/pom.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.eclipse.jetty.spdy</groupId>
-        <artifactId>spdy-parent</artifactId>
-        <version>9.2.14-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>spdy-http-client-transport</artifactId>
-    <name>Jetty :: SPDY :: HTTP Client Transport</name>
-
-    <properties>
-        <bundle-symbolic-name>${project.groupId}.client.http</bundle-symbolic-name>
-    </properties>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>manifest</goal>
-                        </goals>
-                        <configuration>
-                            <instructions>
-                                <Export-Package>org.eclipse.jetty.spdy.client.http;version="9.1"</Export-Package>
-                                <Import-Package>!org.eclipse.jetty.npn,org.eclipse.jetty.*;version="[9.0,10.0)",*</Import-Package>
-                            </instructions>
-                          </configuration>
-                       </execution>
-                  </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-client</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.spdy</groupId>
-            <artifactId>spdy-client</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.spdy</groupId>
-            <artifactId>spdy-http-common</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-server</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.spdy</groupId>
-            <artifactId>spdy-http-server</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/jetty-spdy/spdy-http-client-transport/src/main/java/org/eclipse/jetty/spdy/client/http/HttpChannelOverSPDY.java b/jetty-spdy/spdy-http-client-transport/src/main/java/org/eclipse/jetty/spdy/client/http/HttpChannelOverSPDY.java
deleted file mode 100644
index 9fa4ac7..0000000
--- a/jetty-spdy/spdy-http-client-transport/src/main/java/org/eclipse/jetty/spdy/client/http/HttpChannelOverSPDY.java
+++ /dev/null
@@ -1,78 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.client.http;
-
-import org.eclipse.jetty.client.HttpChannel;
-import org.eclipse.jetty.client.HttpDestination;
-import org.eclipse.jetty.client.HttpExchange;
-import org.eclipse.jetty.client.api.Result;
-import org.eclipse.jetty.spdy.api.Session;
-
-public class HttpChannelOverSPDY extends HttpChannel
-{
-    private final HttpConnectionOverSPDY connection;
-    private final Session session;
-    private final HttpSenderOverSPDY sender;
-    private final HttpReceiverOverSPDY receiver;
-
-    public HttpChannelOverSPDY(HttpDestination destination, HttpConnectionOverSPDY connection, Session session)
-    {
-        super(destination);
-        this.connection = connection;
-        this.session = session;
-        this.sender = new HttpSenderOverSPDY(this);
-        this.receiver = new HttpReceiverOverSPDY(this);
-    }
-
-    public Session getSession()
-    {
-        return session;
-    }
-
-    public HttpSenderOverSPDY getHttpSender()
-    {
-        return sender;
-    }
-
-    public HttpReceiverOverSPDY getHttpReceiver()
-    {
-        return receiver;
-    }
-
-    @Override
-    public void send()
-    {
-        HttpExchange exchange = getHttpExchange();
-        if (exchange != null)
-            sender.send(exchange);
-    }
-
-    @Override
-    public void release()
-    {
-        connection.release(this);
-    }
-
-    @Override
-    public void exchangeTerminated(HttpExchange exchange, Result result)
-    {
-        super.exchangeTerminated(exchange, result);
-        release();
-    }
-}
diff --git a/jetty-spdy/spdy-http-client-transport/src/main/java/org/eclipse/jetty/spdy/client/http/HttpClientTransportOverSPDY.java b/jetty-spdy/spdy-http-client-transport/src/main/java/org/eclipse/jetty/spdy/client/http/HttpClientTransportOverSPDY.java
deleted file mode 100644
index f0734f1..0000000
--- a/jetty-spdy/spdy-http-client-transport/src/main/java/org/eclipse/jetty/spdy/client/http/HttpClientTransportOverSPDY.java
+++ /dev/null
@@ -1,107 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.client.http;
-
-import java.io.IOException;
-import java.net.SocketAddress;
-import java.util.Map;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.HttpClientTransport;
-import org.eclipse.jetty.client.HttpDestination;
-import org.eclipse.jetty.client.Origin;
-import org.eclipse.jetty.client.api.Connection;
-import org.eclipse.jetty.io.ClientConnectionFactory;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.client.SPDYClient;
-import org.eclipse.jetty.util.Promise;
-
-public class HttpClientTransportOverSPDY implements HttpClientTransport
-{
-    private final SPDYClient client;
-    private final ClientConnectionFactory connectionFactory;
-    private HttpClient httpClient;
-
-    public HttpClientTransportOverSPDY(SPDYClient client)
-    {
-        this.client = client;
-        this.connectionFactory = client.getClientConnectionFactory();
-        client.setClientConnectionFactory(new ClientConnectionFactory()
-        {
-            @Override
-            public org.eclipse.jetty.io.Connection newConnection(EndPoint endPoint, Map<String, Object> context) throws IOException
-            {
-                HttpDestination destination = (HttpDestination)context.get(HTTP_DESTINATION_CONTEXT_KEY);
-                return destination.getClientConnectionFactory().newConnection(endPoint, context);
-            }
-        });
-    }
-
-    @Override
-    public void setHttpClient(HttpClient client)
-    {
-        httpClient = client;
-    }
-
-    @Override
-    public HttpDestination newHttpDestination(Origin origin)
-    {
-        return new HttpDestinationOverSPDY(httpClient, origin);
-    }
-
-    @Override
-    public void connect(SocketAddress address, Map<String, Object> context)
-    {
-        final HttpDestination destination = (HttpDestination)context.get(HTTP_DESTINATION_CONTEXT_KEY);
-        @SuppressWarnings("unchecked")
-        final Promise<Connection> promise = (Promise<Connection>)context.get(HTTP_CONNECTION_PROMISE_CONTEXT_KEY);
-
-        SessionFrameListener.Adapter listener = new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onFailure(Session session, Throwable x)
-            {
-                destination.abort(x);
-            }
-        };
-
-        client.connect(address, listener, new Promise<Session>()
-        {
-            @Override
-            public void succeeded(Session session)
-            {
-                promise.succeeded(new HttpConnectionOverSPDY(destination, session));
-            }
-
-            @Override
-            public void failed(Throwable x)
-            {
-                promise.failed(x);
-            }
-        }, context);
-    }
-
-    @Override
-    public org.eclipse.jetty.io.Connection newConnection(EndPoint endPoint, Map<String, Object> context) throws IOException
-    {
-        return connectionFactory.newConnection(endPoint, context);
-    }
-}
diff --git a/jetty-spdy/spdy-http-client-transport/src/main/java/org/eclipse/jetty/spdy/client/http/HttpConnectionOverSPDY.java b/jetty-spdy/spdy-http-client-transport/src/main/java/org/eclipse/jetty/spdy/client/http/HttpConnectionOverSPDY.java
deleted file mode 100644
index a3902d3..0000000
--- a/jetty-spdy/spdy-http-client-transport/src/main/java/org/eclipse/jetty/spdy/client/http/HttpConnectionOverSPDY.java
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.client.http;
-
-import java.nio.channels.AsynchronousCloseException;
-import java.util.Set;
-
-import org.eclipse.jetty.client.HttpChannel;
-import org.eclipse.jetty.client.HttpConnection;
-import org.eclipse.jetty.client.HttpDestination;
-import org.eclipse.jetty.client.HttpExchange;
-import org.eclipse.jetty.spdy.api.GoAwayInfo;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.ConcurrentHashSet;
-
-public class HttpConnectionOverSPDY extends HttpConnection
-{
-    private final Set<HttpChannel> channels = new ConcurrentHashSet<>();
-    private final Session session;
-
-    public HttpConnectionOverSPDY(HttpDestination destination, Session session)
-    {
-        super(destination);
-        this.session = session;
-    }
-
-    @Override
-    protected void send(HttpExchange exchange)
-    {
-        normalizeRequest(exchange.getRequest());
-        // One connection maps to N channels, so for each exchange we create a new channel
-        HttpChannel channel = new HttpChannelOverSPDY(getHttpDestination(), this, session);
-        channels.add(channel);
-        if (channel.associate(exchange))
-            channel.send();
-        else
-            channel.release();
-    }
-
-    protected void release(HttpChannel channel)
-    {
-        channels.remove(channel);
-    }
-
-    @Override
-    public void close()
-    {
-        // First close then abort, to be sure that the connection cannot be reused
-        // from an onFailure() handler or by blocking code waiting for completion.
-        getHttpDestination().close(this);
-        session.goAway(new GoAwayInfo(), Callback.Adapter.INSTANCE);
-        abort(new AsynchronousCloseException());
-    }
-
-    private void abort(Throwable failure)
-    {
-        for (HttpChannel channel : channels)
-        {
-            HttpExchange exchange = channel.getHttpExchange();
-            if (exchange != null)
-                exchange.getRequest().abort(failure);
-        }
-        channels.clear();
-    }
-}
diff --git a/jetty-spdy/spdy-http-client-transport/src/main/java/org/eclipse/jetty/spdy/client/http/HttpDestinationOverSPDY.java b/jetty-spdy/spdy-http-client-transport/src/main/java/org/eclipse/jetty/spdy/client/http/HttpDestinationOverSPDY.java
deleted file mode 100644
index 6c44e59..0000000
--- a/jetty-spdy/spdy-http-client-transport/src/main/java/org/eclipse/jetty/spdy/client/http/HttpDestinationOverSPDY.java
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.client.http;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.HttpExchange;
-import org.eclipse.jetty.client.MultiplexHttpDestination;
-import org.eclipse.jetty.client.Origin;
-
-public class HttpDestinationOverSPDY extends MultiplexHttpDestination<HttpConnectionOverSPDY>
-{
-    public HttpDestinationOverSPDY(HttpClient client, Origin origin)
-    {
-        super(client, origin);
-    }
-
-    @Override
-    protected void send(HttpConnectionOverSPDY connection, HttpExchange exchange)
-    {
-        connection.send(exchange);
-    }
-}
diff --git a/jetty-spdy/spdy-http-client-transport/src/main/java/org/eclipse/jetty/spdy/client/http/HttpReceiverOverSPDY.java b/jetty-spdy/spdy-http-client-transport/src/main/java/org/eclipse/jetty/spdy/client/http/HttpReceiverOverSPDY.java
deleted file mode 100644
index c3aecaa..0000000
--- a/jetty-spdy/spdy-http-client-transport/src/main/java/org/eclipse/jetty/spdy/client/http/HttpReceiverOverSPDY.java
+++ /dev/null
@@ -1,152 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.client.http;
-
-import org.eclipse.jetty.client.HttpExchange;
-import org.eclipse.jetty.client.HttpReceiver;
-import org.eclipse.jetty.client.HttpResponse;
-import org.eclipse.jetty.http.HttpField;
-import org.eclipse.jetty.http.HttpStatus;
-import org.eclipse.jetty.http.HttpVersion;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.HeadersInfo;
-import org.eclipse.jetty.spdy.api.PushInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.RstInfo;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-
-public class HttpReceiverOverSPDY extends HttpReceiver implements StreamFrameListener
-{
-    public HttpReceiverOverSPDY(HttpChannelOverSPDY channel)
-    {
-        super(channel);
-    }
-
-    @Override
-    public HttpChannelOverSPDY getHttpChannel()
-    {
-        return (HttpChannelOverSPDY)super.getHttpChannel();
-    }
-
-    @Override
-    public void onReply(Stream stream, ReplyInfo replyInfo)
-    {
-        HttpExchange exchange = getHttpExchange();
-        if (exchange == null)
-            return;
-
-        try
-        {
-            HttpResponse response = exchange.getResponse();
-
-            Fields fields = replyInfo.getHeaders();
-            short spdy = stream.getSession().getVersion();
-            HttpVersion version = HttpVersion.fromString(fields.get(HTTPSPDYHeader.VERSION.name(spdy)).getValue());
-            response.version(version);
-            String[] status = fields.get(HTTPSPDYHeader.STATUS.name(spdy)).getValue().split(" ", 2);
-
-            Integer code = Integer.parseInt(status[0]);
-            response.status(code);
-            String reason = status.length < 2 ? HttpStatus.getMessage(code) : status[1];
-            response.reason(reason);
-
-            if (responseBegin(exchange))
-            {
-                for (Fields.Field field : fields)
-                {
-                    String name = field.getName();
-                    if (HTTPSPDYHeader.from(spdy, name) != null)
-                        continue;
-                    // TODO: handle multiple values properly
-                    HttpField httpField = new HttpField(name, field.getValue());
-                    responseHeader(exchange, httpField);
-                }
-
-                if (responseHeaders(exchange))
-                {
-                    if (replyInfo.isClose())
-                    {
-                        responseSuccess(exchange);
-                    }
-                }
-            }
-        }
-        catch (Exception x)
-        {
-            responseFailure(x);
-        }
-    }
-
-    @Override
-    public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-    {
-        // SPDY push not supported
-        getHttpChannel().getSession().rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM), Callback.Adapter.INSTANCE);
-        return null;
-    }
-
-    @Override
-    public void onHeaders(Stream stream, HeadersInfo headersInfo)
-    {
-        // TODO: see above handling of headers
-    }
-
-    @Override
-    public void onData(Stream stream, DataInfo dataInfo)
-    {
-        HttpExchange exchange = getHttpExchange();
-        if (exchange == null)
-            return;
-
-        try
-        {
-            int length = dataInfo.length();
-            // TODO: avoid data copy here
-            // TODO: handle callback properly
-            boolean process = responseContent(exchange, dataInfo.asByteBuffer(false), new Callback.Adapter());
-            dataInfo.consume(length);
-
-            if (process)
-            {
-                if (dataInfo.isClose())
-                {
-                    responseSuccess(exchange);
-                }
-            }
-        }
-        catch (Exception x)
-        {
-            responseFailure(x);
-        }
-    }
-
-    @Override
-    public void onFailure(Stream stream, Throwable x)
-    {
-        HttpExchange exchange = getHttpExchange();
-        if (exchange == null)
-            return;
-        exchange.getRequest().abort(x);
-    }
-}
diff --git a/jetty-spdy/spdy-http-client-transport/src/main/java/org/eclipse/jetty/spdy/client/http/HttpSenderOverSPDY.java b/jetty-spdy/spdy-http-client-transport/src/main/java/org/eclipse/jetty/spdy/client/http/HttpSenderOverSPDY.java
deleted file mode 100644
index fcddc5a..0000000
--- a/jetty-spdy/spdy-http-client-transport/src/main/java/org/eclipse/jetty/spdy/client/http/HttpSenderOverSPDY.java
+++ /dev/null
@@ -1,118 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.client.http;
-
-import org.eclipse.jetty.client.HttpContent;
-import org.eclipse.jetty.client.HttpExchange;
-import org.eclipse.jetty.client.HttpSender;
-import org.eclipse.jetty.client.api.Request;
-import org.eclipse.jetty.http.HttpField;
-import org.eclipse.jetty.spdy.api.ByteBufferDataInfo;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.Promise;
-
-public class HttpSenderOverSPDY extends HttpSender
-{
-    private volatile Stream stream;
-
-    public HttpSenderOverSPDY(HttpChannelOverSPDY channel)
-    {
-        super(channel);
-    }
-
-    @Override
-    public HttpChannelOverSPDY getHttpChannel()
-    {
-        return (HttpChannelOverSPDY)super.getHttpChannel();
-    }
-
-    @Override
-    protected void sendHeaders(HttpExchange exchange, final HttpContent content, final Callback callback)
-    {
-        final Request request = exchange.getRequest();
-        final long idleTimeout = request.getIdleTimeout();
-        short spdyVersion = getHttpChannel().getSession().getVersion();
-        Fields fields = new Fields();
-        HttpField hostHeader = null;
-        for (HttpField header : request.getHeaders())
-        {
-            String name = header.getName();
-            // The host header needs a special treatment
-            if (HTTPSPDYHeader.from(spdyVersion, name) != HTTPSPDYHeader.HOST)
-                fields.add(name, header.getValue());
-            else
-                hostHeader = header;
-        }
-
-        // Add special SPDY headers
-        fields.put(HTTPSPDYHeader.METHOD.name(spdyVersion), request.getMethod());
-        String path = request.getPath();
-        String query = request.getQuery();
-        if (query != null)
-            path += "?" + query;
-        fields.put(HTTPSPDYHeader.URI.name(spdyVersion), path);
-        fields.put(HTTPSPDYHeader.VERSION.name(spdyVersion), request.getVersion().asString());
-        if (hostHeader != null)
-            fields.put(HTTPSPDYHeader.HOST.name(spdyVersion), hostHeader.getValue());
-
-        SynInfo synInfo = new SynInfo(fields, !content.hasContent());
-        getHttpChannel().getSession().syn(synInfo, getHttpChannel().getHttpReceiver(), new Promise<Stream>()
-        {
-            @Override
-            public void succeeded(Stream stream)
-            {
-                stream.setIdleTimeout(idleTimeout);
-                if (content.hasContent())
-                    HttpSenderOverSPDY.this.stream = stream;
-                callback.succeeded();
-            }
-
-            @Override
-            public void failed(Throwable failure)
-            {
-                callback.failed(failure);
-            }
-        });
-    }
-
-    @Override
-    protected void sendContent(HttpExchange exchange, HttpContent content, Callback callback)
-    {
-        if (content.isConsumed())
-        {
-            callback.succeeded();
-        }
-        else
-        {
-            ByteBufferDataInfo dataInfo = new ByteBufferDataInfo(content.getByteBuffer(), content.isLast());
-            stream.data(dataInfo, callback);
-        }
-    }
-
-    @Override
-    protected void reset()
-    {
-        super.reset();
-        stream = null;
-    }
-}
diff --git a/jetty-spdy/spdy-http-client-transport/src/test/java/org/eclipse/jetty/spdy/client/http/AbstractHttpClientServerTest.java b/jetty-spdy/spdy-http-client-transport/src/test/java/org/eclipse/jetty/spdy/client/http/AbstractHttpClientServerTest.java
deleted file mode 100644
index 34a82eb..0000000
--- a/jetty-spdy/spdy-http-client-transport/src/test/java/org/eclipse/jetty/spdy/client/http/AbstractHttpClientServerTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.client.http;
-
-import java.util.Arrays;
-import java.util.Collection;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.http.HttpScheme;
-import org.eclipse.jetty.server.AbstractConnectionFactory;
-import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.client.SPDYClient;
-import org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnectionFactory;
-import org.eclipse.jetty.toolchain.test.TestTracker;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.junit.After;
-import org.junit.Rule;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-@RunWith(Parameterized.class)
-public abstract class AbstractHttpClientServerTest
-{
-    @Parameterized.Parameters
-    public static Collection<SslContextFactory[]> parameters()
-    {
-        return Arrays.asList(new SslContextFactory[]{null}, new SslContextFactory[]{new SslContextFactory()});
-    }
-
-    @Rule
-    public final TestTracker tracker = new TestTracker();
-
-    protected SslContextFactory sslContextFactory;
-    protected String scheme;
-    protected Server server;
-    protected ServerConnector connector;
-    protected SPDYClient.Factory factory;
-    protected HttpClient client;
-
-    public AbstractHttpClientServerTest(SslContextFactory sslContextFactory)
-    {
-        this.sslContextFactory = sslContextFactory;
-        this.scheme = (sslContextFactory == null ? HttpScheme.HTTP : HttpScheme.HTTPS).asString();
-    }
-
-    public void start(Handler handler) throws Exception
-    {
-        short version = SPDY.V3;
-
-        HTTPSPDYServerConnectionFactory httpSPDY = new HTTPSPDYServerConnectionFactory(version, new HttpConfiguration());
-        if (sslContextFactory != null)
-        {
-            sslContextFactory.setEndpointIdentificationAlgorithm("");
-            sslContextFactory.setKeyStorePath("src/test/resources/keystore.jks");
-            sslContextFactory.setKeyStorePassword("storepwd");
-            sslContextFactory.setTrustStorePath("src/test/resources/truststore.jks");
-            sslContextFactory.setTrustStorePassword("storepwd");
-        }
-
-        server = new Server();
-        connector = new ServerConnector(server, AbstractConnectionFactory.getFactories(sslContextFactory, httpSPDY));
-        server.addConnector(connector);
-        server.setHandler(handler);
-        server.start();
-
-        QueuedThreadPool executor = new QueuedThreadPool();
-        executor.setName(executor.getName() + "-client");
-
-        factory = new SPDYClient.Factory(executor);
-        factory.start();
-        client = new HttpClient(new HttpClientTransportOverSPDY(factory.newSPDYClient(version)), sslContextFactory);
-        client.setExecutor(executor);
-        client.start();
-    }
-
-    @After
-    public void dispose() throws Exception
-    {
-        if (client != null)
-            client.stop();
-        if (factory != null)
-            factory.stop();
-        if (server != null)
-            server.stop();
-    }
-}
diff --git a/jetty-spdy/spdy-http-client-transport/src/test/java/org/eclipse/jetty/spdy/client/http/EmptyServerHandler.java b/jetty-spdy/spdy-http-client-transport/src/test/java/org/eclipse/jetty/spdy/client/http/EmptyServerHandler.java
deleted file mode 100644
index 4544daa..0000000
--- a/jetty-spdy/spdy-http-client-transport/src/test/java/org/eclipse/jetty/spdy/client/http/EmptyServerHandler.java
+++ /dev/null
@@ -1,37 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.client.http;
-
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-
-public class EmptyServerHandler extends AbstractHandler
-{
-    @Override
-    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-    {
-        baseRequest.setHandled(true);
-    }
-}
diff --git a/jetty-spdy/spdy-http-client-transport/src/test/java/org/eclipse/jetty/spdy/client/http/HttpClientCustomProxyTest.java b/jetty-spdy/spdy-http-client-transport/src/test/java/org/eclipse/jetty/spdy/client/http/HttpClientCustomProxyTest.java
deleted file mode 100644
index fa28e96..0000000
--- a/jetty-spdy/spdy-http-client-transport/src/test/java/org/eclipse/jetty/spdy/client/http/HttpClientCustomProxyTest.java
+++ /dev/null
@@ -1,262 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.client.http;
-
-import java.io.IOException;
-import java.net.URI;
-import java.nio.ByteBuffer;
-import java.util.Map;
-import java.util.concurrent.Executor;
-import java.util.concurrent.TimeUnit;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.HttpClientTransport;
-import org.eclipse.jetty.client.HttpDestination;
-import org.eclipse.jetty.client.Origin;
-import org.eclipse.jetty.client.ProxyConfiguration;
-import org.eclipse.jetty.client.api.Connection;
-import org.eclipse.jetty.client.api.ContentResponse;
-import org.eclipse.jetty.http.HttpStatus;
-import org.eclipse.jetty.io.AbstractConnection;
-import org.eclipse.jetty.io.ClientConnectionFactory;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.server.AbstractConnectionFactory;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.client.SPDYClient;
-import org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnectionFactory;
-import org.eclipse.jetty.spdy.server.http.PushStrategy;
-import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Promise;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class HttpClientCustomProxyTest
-{
-    public static final byte[] CAFE_BABE = new byte[]{(byte)0xCA, (byte)0xFE, (byte)0xBA, (byte)0xBE};
-
-    private Server server;
-    private ServerConnector connector;
-    private SPDYClient.Factory factory;
-    private HttpClient httpClient;
-
-    public void prepare(Handler handler) throws Exception
-    {
-        server = new Server();
-        connector = new ServerConnector(server, new CAFEBABEServerConnectionFactory(new HTTPSPDYServerConnectionFactory(SPDY.V3, new HttpConfiguration(), new PushStrategy.None())));
-        server.addConnector(connector);
-        server.setHandler(handler);
-        server.start();
-
-        QueuedThreadPool executor = new QueuedThreadPool();
-        executor.setName(executor.getName() + "-client");
-
-        factory = new SPDYClient.Factory(executor);
-        factory.start();
-
-        httpClient = new HttpClient(new HttpClientTransportOverSPDY(factory.newSPDYClient(SPDY.V3)), null);
-        httpClient.setExecutor(executor);
-        httpClient.start();
-    }
-
-    @After
-    public void dispose() throws Exception
-    {
-        if (httpClient != null)
-            httpClient.stop();
-        if (factory != null)
-            factory.stop();
-        if (server != null)
-            server.stop();
-    }
-
-    @Test
-    public void testCustomProxy() throws Exception
-    {
-        final String serverHost = "server";
-        final int status = HttpStatus.NO_CONTENT_204;
-        prepare(new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                baseRequest.setHandled(true);
-                if (!URI.create(baseRequest.getUri().toString()).isAbsolute())
-                    response.setStatus(HttpServletResponse.SC_USE_PROXY);
-                else if (serverHost.equals(request.getServerName()))
-                    response.setStatus(status);
-                else
-                    response.setStatus(HttpServletResponse.SC_NOT_ACCEPTABLE);
-            }
-        });
-
-        // Setup the custom proxy
-        int proxyPort = connector.getLocalPort();
-        int serverPort = proxyPort + 1; // Any port will do for these tests - just not the same as the proxy
-        httpClient.getProxyConfiguration().getProxies().add(new CAFEBABEProxy(new Origin.Address("localhost", proxyPort), false));
-
-        ContentResponse response = httpClient.newRequest(serverHost, serverPort)
-                .timeout(5, TimeUnit.SECONDS)
-                .send();
-
-        Assert.assertEquals(status, response.getStatus());
-    }
-
-    private class CAFEBABEProxy extends ProxyConfiguration.Proxy
-    {
-        private CAFEBABEProxy(Origin.Address address, boolean secure)
-        {
-            super(address, secure);
-        }
-
-        @Override
-        public ClientConnectionFactory newClientConnectionFactory(ClientConnectionFactory connectionFactory)
-        {
-            return new CAFEBABEClientConnectionFactory(connectionFactory);
-        }
-    }
-
-    private static class CAFEBABEClientConnectionFactory implements ClientConnectionFactory
-    {
-        private final ClientConnectionFactory connectionFactory;
-
-        private CAFEBABEClientConnectionFactory(ClientConnectionFactory connectionFactory)
-        {
-            this.connectionFactory = connectionFactory;
-        }
-
-        @Override
-        public org.eclipse.jetty.io.Connection newConnection(EndPoint endPoint, Map<String, Object> context) throws IOException
-        {
-            HttpDestination destination = (HttpDestination)context.get(HttpClientTransport.HTTP_DESTINATION_CONTEXT_KEY);
-            Executor executor = destination.getHttpClient().getExecutor();
-            return new CAFEBABEConnection(endPoint, executor, connectionFactory, context);
-        }
-    }
-
-    private static class CAFEBABEConnection extends AbstractConnection
-    {
-        private final ClientConnectionFactory connectionFactory;
-        private final Map<String, Object> context;
-
-        public CAFEBABEConnection(EndPoint endPoint, Executor executor, ClientConnectionFactory connectionFactory, Map<String, Object> context)
-        {
-            super(endPoint, executor);
-            this.connectionFactory = connectionFactory;
-            this.context = context;
-        }
-
-        @Override
-        public void onOpen()
-        {
-            super.onOpen();
-            fillInterested();
-            getEndPoint().write(new Callback.Adapter(), ByteBuffer.wrap(CAFE_BABE));
-        }
-
-        @Override
-        public void onFillable()
-        {
-            try
-            {
-                ByteBuffer buffer = BufferUtil.allocate(4);
-                int filled = getEndPoint().fill(buffer);
-                Assert.assertEquals(4, filled);
-                Assert.assertArrayEquals(CAFE_BABE, buffer.array());
-
-                // We are good, upgrade the connection
-                ClientConnectionFactory.Helper.replaceConnection(this, connectionFactory.newConnection(getEndPoint(), context));
-            }
-            catch (Throwable x)
-            {
-                close();
-                @SuppressWarnings("unchecked")
-                Promise<Connection> promise = (Promise<Connection>)context.get(HttpClientTransport.HTTP_CONNECTION_PROMISE_CONTEXT_KEY);
-                promise.failed(x);
-            }
-        }
-    }
-
-    private class CAFEBABEServerConnectionFactory extends AbstractConnectionFactory
-    {
-        private final org.eclipse.jetty.server.ConnectionFactory connectionFactory;
-
-        private CAFEBABEServerConnectionFactory(org.eclipse.jetty.server.ConnectionFactory connectionFactory)
-        {
-            super("cafebabe");
-            this.connectionFactory = connectionFactory;
-        }
-
-        @Override
-        public org.eclipse.jetty.io.Connection newConnection(Connector connector, EndPoint endPoint)
-        {
-            return new CAFEBABEServerConnection(connector, endPoint, connectionFactory);
-        }
-    }
-
-    private class CAFEBABEServerConnection extends AbstractConnection
-    {
-        private final org.eclipse.jetty.server.ConnectionFactory connectionFactory;
-
-        public CAFEBABEServerConnection(Connector connector, EndPoint endPoint, org.eclipse.jetty.server.ConnectionFactory connectionFactory)
-        {
-            super(endPoint, connector.getExecutor());
-            this.connectionFactory = connectionFactory;
-        }
-
-        @Override
-        public void onOpen()
-        {
-            super.onOpen();
-            fillInterested();
-        }
-
-        @Override
-        public void onFillable()
-        {
-            try
-            {
-                ByteBuffer buffer = BufferUtil.allocate(4);
-                int filled = getEndPoint().fill(buffer);
-                Assert.assertEquals(4, filled);
-                Assert.assertArrayEquals(CAFE_BABE, buffer.array());
-                getEndPoint().write(new Callback.Adapter(), buffer);
-
-                // We are good, upgrade the connection
-                ClientConnectionFactory.Helper.replaceConnection(this, connectionFactory.newConnection(connector, getEndPoint()));
-            }
-            catch (Throwable x)
-            {
-                close();
-            }
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-http-client-transport/src/test/java/org/eclipse/jetty/spdy/client/http/HttpClientTest.java b/jetty-spdy/spdy-http-client-transport/src/test/java/org/eclipse/jetty/spdy/client/http/HttpClientTest.java
deleted file mode 100644
index 6af71f2..0000000
--- a/jetty-spdy/spdy-http-client-transport/src/test/java/org/eclipse/jetty/spdy/client/http/HttpClientTest.java
+++ /dev/null
@@ -1,467 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.client.http;
-
-import java.io.IOException;
-import java.net.URI;
-import java.net.URLEncoder;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.zip.GZIPOutputStream;
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.client.api.ContentResponse;
-import org.eclipse.jetty.client.api.Request;
-import org.eclipse.jetty.client.api.Response;
-import org.eclipse.jetty.client.api.Result;
-import org.eclipse.jetty.client.util.BytesContentProvider;
-import org.eclipse.jetty.http.HttpMethod;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-import org.eclipse.jetty.toolchain.test.annotation.Slow;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class HttpClientTest extends AbstractHttpClientServerTest
-{
-    public HttpClientTest(SslContextFactory sslContextFactory)
-    {
-        super(sslContextFactory);
-    }
-
-    @Test
-    public void test_GET_ResponseWithoutContent() throws Exception
-    {
-        start(new EmptyServerHandler());
-
-        Response response = client.GET(scheme + "://localhost:" + connector.getLocalPort());
-
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatus());
-    }
-
-    @Test
-    public void test_GET_ResponseWithContent() throws Exception
-    {
-        final byte[] data = new byte[]{0, 1, 2, 3, 4, 5, 6, 7};
-        start(new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                response.getOutputStream().write(data);
-                baseRequest.setHandled(true);
-            }
-        });
-
-        ContentResponse response = client.GET(scheme + "://localhost:" + connector.getLocalPort());
-
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatus());
-        byte[] content = response.getContent();
-        Assert.assertArrayEquals(data, content);
-    }
-
-    @Test
-    public void test_GET_WithParameters_ResponseWithContent() throws Exception
-    {
-        final String paramName1 = "a";
-        final String paramName2 = "b";
-        start(new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                response.setCharacterEncoding("UTF-8");
-                ServletOutputStream output = response.getOutputStream();
-                String paramValue1 = request.getParameter(paramName1);
-                output.write(paramValue1.getBytes("UTF-8"));
-                String paramValue2 = request.getParameter(paramName2);
-                Assert.assertEquals("", paramValue2);
-                output.write("empty".getBytes("UTF-8"));
-                baseRequest.setHandled(true);
-            }
-        });
-
-        String value1 = "\u20AC";
-        String paramValue1 = URLEncoder.encode(value1, "UTF-8");
-        String query = paramName1 + "=" + paramValue1 + "&" + paramName2;
-        ContentResponse response = client.GET(scheme + "://localhost:" + connector.getLocalPort() + "/?" + query);
-
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatus());
-        String content = new String(response.getContent(), "UTF-8");
-        Assert.assertEquals(value1 + "empty", content);
-    }
-
-    @Test
-    public void test_GET_WithParametersMultiValued_ResponseWithContent() throws Exception
-    {
-        final String paramName1 = "a";
-        final String paramName2 = "b";
-        start(new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                response.setCharacterEncoding("UTF-8");
-                ServletOutputStream output = response.getOutputStream();
-                String[] paramValues1 = request.getParameterValues(paramName1);
-                for (String paramValue : paramValues1)
-                    output.write(paramValue.getBytes("UTF-8"));
-                String paramValue2 = request.getParameter(paramName2);
-                output.write(paramValue2.getBytes("UTF-8"));
-                baseRequest.setHandled(true);
-            }
-        });
-
-        String value11 = "\u20AC";
-        String value12 = "\u20AA";
-        String value2 = "&";
-        String paramValue11 = URLEncoder.encode(value11, "UTF-8");
-        String paramValue12 = URLEncoder.encode(value12, "UTF-8");
-        String paramValue2 = URLEncoder.encode(value2, "UTF-8");
-        String query = paramName1 + "=" + paramValue11 + "&" + paramName1 + "=" + paramValue12 + "&" + paramName2 + "=" + paramValue2;
-        ContentResponse response = client.GET(scheme + "://localhost:" + connector.getLocalPort() + "/?" + query);
-
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatus());
-        String content = new String(response.getContent(), "UTF-8");
-        Assert.assertEquals(value11 + value12 + value2, content);
-    }
-
-    @Test
-    public void test_POST_WithParameters() throws Exception
-    {
-        final String paramName = "a";
-        final String paramValue = "\u20AC";
-        start(new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                baseRequest.setHandled(true);
-                String value = request.getParameter(paramName);
-                if (paramValue.equals(value))
-                {
-                    response.setCharacterEncoding("UTF-8");
-                    response.setContentType("text/plain");
-                    response.getOutputStream().print(value);
-                }
-            }
-        });
-
-        ContentResponse response = client.POST(scheme + "://localhost:" + connector.getLocalPort())
-                .param(paramName, paramValue)
-                .timeout(5, TimeUnit.SECONDS)
-                .send();
-
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatus());
-        Assert.assertEquals(paramValue, new String(response.getContent(), "UTF-8"));
-    }
-
-    @Test
-    public void test_PUT_WithParameters() throws Exception
-    {
-        final String paramName = "a";
-        final String paramValue = "\u20AC";
-        final String encodedParamValue = URLEncoder.encode(paramValue, "UTF-8");
-        start(new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                baseRequest.setHandled(true);
-                String value = request.getParameter(paramName);
-                if (paramValue.equals(value))
-                {
-                    response.setCharacterEncoding("UTF-8");
-                    response.setContentType("text/plain");
-                    response.getOutputStream().print(value);
-                }
-            }
-        });
-
-        URI uri = URI.create(scheme + "://localhost:" + connector.getLocalPort() + "/path?" + paramName + "=" + encodedParamValue);
-        ContentResponse response = client.newRequest(uri)
-                .method(HttpMethod.PUT)
-                .timeout(5, TimeUnit.SECONDS)
-                .send();
-
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatus());
-        Assert.assertEquals(paramValue, new String(response.getContent(), "UTF-8"));
-    }
-
-    @Test
-    public void test_POST_WithParameters_WithContent() throws Exception
-    {
-        final byte[] content = {0, 1, 2, 3};
-        final String paramName = "a";
-        final String paramValue = "\u20AC";
-        start(new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                baseRequest.setHandled(true);
-                String value = request.getParameter(paramName);
-                if (paramValue.equals(value))
-                {
-                    response.setCharacterEncoding("UTF-8");
-                    response.setContentType("application/octet-stream");
-                    response.getOutputStream().write(content);
-                }
-            }
-        });
-
-        ContentResponse response = client.POST(scheme + "://localhost:" + connector.getLocalPort() + "/?b=1")
-                .param(paramName, paramValue)
-                .content(new BytesContentProvider(content))
-                .timeout(5, TimeUnit.SECONDS)
-                .send();
-
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatus());
-        Assert.assertArrayEquals(content, response.getContent());
-    }
-
-    @Test
-    public void test_POST_WithContent_NotifiesRequestContentListener() throws Exception
-    {
-        final byte[] content = {0, 1, 2, 3};
-        start(new EmptyServerHandler());
-
-        ContentResponse response = client.POST(scheme + "://localhost:" + connector.getLocalPort())
-                .onRequestContent(new Request.ContentListener()
-                {
-                    @Override
-                    public void onContent(Request request, ByteBuffer buffer)
-                    {
-                        byte[] bytes = new byte[buffer.remaining()];
-                        buffer.get(bytes);
-                        if (!Arrays.equals(content, bytes))
-                            request.abort(new Exception());
-                    }
-                })
-                .content(new BytesContentProvider(content))
-                .timeout(5, TimeUnit.SECONDS)
-                .send();
-
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatus());
-    }
-
-    @Test
-    public void test_POST_WithContent_TracksProgress() throws Exception
-    {
-        start(new EmptyServerHandler());
-
-        final AtomicInteger progress = new AtomicInteger();
-        ContentResponse response = client.POST(scheme + "://localhost:" + connector.getLocalPort())
-                .onRequestContent(new Request.ContentListener()
-                {
-                    @Override
-                    public void onContent(Request request, ByteBuffer buffer)
-                    {
-                        byte[] bytes = new byte[buffer.remaining()];
-                        Assert.assertEquals(1, bytes.length);
-                        buffer.get(bytes);
-                        Assert.assertEquals(bytes[0], progress.getAndIncrement());
-                    }
-                })
-                .content(new BytesContentProvider(new byte[]{0}, new byte[]{1}, new byte[]{2}, new byte[]{3}, new byte[]{4}))
-                .timeout(5, TimeUnit.SECONDS)
-                .send();
-
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatus());
-        Assert.assertEquals(5, progress.get());
-    }
-
-    @Test
-    public void test_GZIP_ContentEncoding() throws Exception
-    {
-        final byte[] data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
-        start(new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                baseRequest.setHandled(true);
-                response.setHeader("Content-Encoding", "gzip");
-                GZIPOutputStream gzipOutput = new GZIPOutputStream(response.getOutputStream());
-                gzipOutput.write(data);
-                gzipOutput.finish();
-            }
-        });
-
-        ContentResponse response = client.newRequest("localhost", connector.getLocalPort())
-                .scheme(scheme)
-                .timeout(5, TimeUnit.SECONDS)
-                .send();
-
-        Assert.assertEquals(200, response.getStatus());
-        Assert.assertArrayEquals(data, response.getContent());
-    }
-
-    @Slow
-    @Test
-    public void test_Request_IdleTimeout() throws Exception
-    {
-        final long idleTimeout = 1000;
-        start(new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                try
-                {
-                    baseRequest.setHandled(true);
-                    TimeUnit.MILLISECONDS.sleep(2 * idleTimeout);
-                }
-                catch (InterruptedException x)
-                {
-                    throw new ServletException(x);
-                }
-            }
-        });
-
-        final String host = "localhost";
-        final int port = connector.getLocalPort();
-        try
-        {
-            client.newRequest(host, port)
-                    .scheme(scheme)
-                    .idleTimeout(idleTimeout, TimeUnit.MILLISECONDS)
-                    .timeout(3 * idleTimeout, TimeUnit.MILLISECONDS)
-                    .send();
-            Assert.fail();
-        }
-        catch (ExecutionException expected)
-        {
-            Assert.assertTrue(expected.getCause() instanceof TimeoutException);
-        }
-
-        // Make another request without specifying the idle timeout, should not fail
-        ContentResponse response = client.newRequest(host, port)
-                .scheme(scheme)
-                .timeout(3 * idleTimeout, TimeUnit.MILLISECONDS)
-                .send();
-
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatus());
-    }
-
-    @Test
-    public void testSendToIPv6Address() throws Exception
-    {
-        start(new EmptyServerHandler());
-
-        ContentResponse response = client.newRequest("[::1]", connector.getLocalPort())
-                .scheme(scheme)
-                .timeout(5, TimeUnit.SECONDS)
-                .send();
-
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatus());
-    }
-
-    @Test
-    public void test_HEAD_With_ResponseContentLength() throws Exception
-    {
-        final int length = 1024;
-        start(new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                baseRequest.setHandled(true);
-                response.getOutputStream().write(new byte[length]);
-            }
-        });
-
-        // HEAD requests receive a Content-Length header, but do not
-        // receive the content so they must handle this case properly
-        ContentResponse response = client.newRequest("localhost", connector.getLocalPort())
-                .scheme(scheme)
-                .method(HttpMethod.HEAD)
-                .timeout(5, TimeUnit.SECONDS)
-                .send();
-
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatus());
-        Assert.assertEquals(0, response.getContent().length);
-
-        // Perform a normal GET request to be sure the content is now read
-        response = client.newRequest("localhost", connector.getLocalPort())
-                .scheme(scheme)
-                .timeout(5, TimeUnit.SECONDS)
-                .send();
-
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatus());
-        Assert.assertEquals(length, response.getContent().length);
-    }
-
-    @Test
-    public void testLongPollIsAbortedWhenClientIsStopped() throws Exception
-    {
-        final CountDownLatch latch = new CountDownLatch(1);
-        start(new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                baseRequest.setHandled(true);
-                request.startAsync();
-                latch.countDown();
-            }
-        });
-
-        final CountDownLatch completeLatch = new CountDownLatch(1);
-        client.newRequest("localhost", connector.getLocalPort())
-                .scheme(scheme)
-                .send(new Response.CompleteListener()
-                {
-                    @Override
-                    public void onComplete(Result result)
-                    {
-                        if (result.isFailed())
-                            completeLatch.countDown();
-                    }
-                });
-
-        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
-
-        // Stop the client, the complete listener must be invoked.
-        client.stop();
-
-        Assert.assertTrue(completeLatch.await(5, TimeUnit.SECONDS));
-    }
-}
diff --git a/jetty-spdy/spdy-http-client-transport/src/test/resources/jetty-logging.properties b/jetty-spdy/spdy-http-client-transport/src/test/resources/jetty-logging.properties
deleted file mode 100644
index 8163013..0000000
--- a/jetty-spdy/spdy-http-client-transport/src/test/resources/jetty-logging.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
-#org.eclipse.jetty.LEVEL=DEBUG
-#org.eclipse.jetty.client.LEVEL=DEBUG
-#org.eclipse.jetty.spdy.LEVEL=DEBUG
diff --git a/jetty-spdy/spdy-http-common/pom.xml b/jetty-spdy/spdy-http-common/pom.xml
deleted file mode 100644
index 73030fa..0000000
--- a/jetty-spdy/spdy-http-common/pom.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.eclipse.jetty.spdy</groupId>
-        <artifactId>spdy-parent</artifactId>
-        <version>9.2.14-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>spdy-http-common</artifactId>
-    <name>Jetty :: SPDY :: HTTP Common</name>
-
-    <properties>
-        <bundle-symbolic-name>${project.groupId}.http.common</bundle-symbolic-name>
-    </properties>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>manifest</goal>
-                        </goals>
-                        <configuration>
-                            <instructions>
-                                <Export-Package>org.eclipse.jetty.spdy.http;version="9.1"</Export-Package>
-                                <Import-Package>!org.eclipse.jetty.npn,org.eclipse.jetty.*;version="[9.0,10.0)",*</Import-Package>
-                            </instructions>
-                          </configuration>
-                       </execution>
-                  </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.eclipse.jetty.spdy</groupId>
-            <artifactId>spdy-core</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/jetty-spdy/spdy-http-common/src/main/java/org/eclipse/jetty/spdy/http/HTTPSPDYHeader.java b/jetty-spdy/spdy-http-common/src/main/java/org/eclipse/jetty/spdy/http/HTTPSPDYHeader.java
deleted file mode 100644
index 845ee96..0000000
--- a/jetty-spdy/spdy-http-common/src/main/java/org/eclipse/jetty/spdy/http/HTTPSPDYHeader.java
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.http;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jetty.spdy.api.SPDY;
-
-/**
- * <p>{@link HTTPSPDYHeader} defines the SPDY headers that are not also HTTP headers,
- * such as <tt>method</tt>, <tt>version</tt>, etc. or that are treated differently
- * by the SPDY protocol, such as <tt>host</tt>.</p>
- */
-public enum HTTPSPDYHeader
-{
-    METHOD("method", ":method"),
-    URI("url", ":path"),
-    VERSION("version", ":version"),
-    SCHEME("scheme", ":scheme"),
-    HOST("host", ":host"),
-    STATUS("status", ":status");
-
-    public static HTTPSPDYHeader from(short version, String name)
-    {
-        switch (version)
-        {
-            case SPDY.V2:
-                return Names.v2Names.get(name);
-            case SPDY.V3:
-                return Names.v3Names.get(name);
-            default:
-                throw new IllegalStateException();
-        }
-    }
-
-    private final String v2Name;
-    private final String v3Name;
-
-    private HTTPSPDYHeader(String v2Name, String v3Name)
-    {
-        this.v2Name = v2Name;
-        Names.v2Names.put(v2Name, this);
-        this.v3Name = v3Name;
-        Names.v3Names.put(v3Name, this);
-    }
-
-    public String name(short version)
-    {
-        switch (version)
-        {
-            case SPDY.V2:
-                return v2Name;
-            case SPDY.V3:
-                return v3Name;
-            default:
-                throw new IllegalStateException();
-        }
-    }
-
-    private static class Names
-    {
-        private static final Map<String, HTTPSPDYHeader> v2Names = new HashMap<>();
-        private static final Map<String, HTTPSPDYHeader> v3Names = new HashMap<>();
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/pom.xml b/jetty-spdy/spdy-http-server/pom.xml
deleted file mode 100644
index a6ec456..0000000
--- a/jetty-spdy/spdy-http-server/pom.xml
+++ /dev/null
@@ -1,120 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.eclipse.jetty.spdy</groupId>
-        <artifactId>spdy-parent</artifactId>
-        <version>9.2.14-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>spdy-http-server</artifactId>
-    <name>Jetty :: SPDY :: HTTP Server</name>
-
-    <properties>
-        <bundle-symbolic-name>${project.groupId}.http.server</bundle-symbolic-name>
-    </properties>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>single</goal>
-                        </goals>
-                        <configuration>
-                            <descriptorRefs>
-                                <descriptorRef>config</descriptorRef>
-                            </descriptorRefs>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>artifact-jars</id>
-                        <goals>
-                            <goal>jar</goal>
-                            <goal>test-jar</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>manifest</goal>
-                        </goals>
-                        <configuration>
-                            <instructions>
-                                <Export-Package>org.eclipse.jetty.spdy.server.http;version="9.1",
-                                    org.eclipse.jetty.spdy.server.proxy;version="9.1"
-                                </Export-Package>
-                                <Import-Package>!org.eclipse.jetty.npn,org.eclipse.jetty.*;version="[9.0,10.0)",*
-                                </Import-Package>
-                                <_nouses>true</_nouses>
-                            </instructions>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.eclipse.jetty.spdy</groupId>
-            <artifactId>spdy-http-common</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.spdy</groupId>
-            <artifactId>spdy-server</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-client</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-servlet</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-servlets</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.npn</groupId>
-            <artifactId>npn-api</artifactId>
-            <version>${npn.api.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-continuation</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-core</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/jetty-spdy/spdy-http-server/src/main/config/etc/jetty-spdy-proxy.xml b/jetty-spdy/spdy-http-server/src/main/config/etc/jetty-spdy-proxy.xml
deleted file mode 100644
index c525bd1..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/etc/jetty-spdy-proxy.xml
+++ /dev/null
@@ -1,158 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
-<!-- ============================================================= -->
-<!-- Configure the Jetty Server instance with an ID "Server"       -->
-<!-- by adding a SPDY connector.                                   -->
-<!-- This configuration must be used in conjunction with jetty.xml -->
-<!-- It should not be used with jetty-https.xml as this connector  -->
-<!-- can provide both HTTPS and SPDY connections                   -->
-<!-- ============================================================= -->
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-  <!-- =========================================================== -->
-  <!-- Setup the SSL Context factory used to establish all TLS     -->
-  <!-- Connections and session.                                    -->
-  <!--                                                             -->
-  <!-- Consult the javadoc of o.e.j.util.ssl.SslContextFactory     -->
-  <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
-  <!-- that may be set here.                                       -->
-  <!-- =========================================================== -->
-  <New id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
-    <Set name="KeyStorePath"><Property name="jetty.home" default="." />/etc/keystore</Set>
-    <Set name="KeyStorePassword">OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4</Set>
-    <Set name="KeyManagerPassword">OBF:1u2u1wml1z7s1z7a1wnl1u2g</Set>
-    <Set name="TrustStorePath"><Property name="jetty.home" default="." />/etc/keystore</Set>
-    <Set name="TrustStorePassword">OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4</Set>
-  </New>
-
-  <!-- =========================================================== -->
-  <!-- Enables NPN debugging on System.err                         -->
-  <!-- ===========================================================
-  <Set class="org.eclipse.jetty.npn.NextProtoNego" name="debug" type="boolean">true</Set>
-  -->
-
-  <!-- =========================================================== -->
-  <!-- Create a TLS specific HttpConfiguration based on the        -->
-  <!-- common HttpConfiguration defined in jetty.xml               -->
-  <!-- Add a SecureRequestCustomizer to extract certificate and    -->
-  <!-- session information                                         -->
-  <!-- =========================================================== -->
-  <New id="tlsHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
-    <Arg><Ref refid="httpConfig"/></Arg>
-    <Call name="addCustomizer">
-      <Arg><New class="org.eclipse.jetty.server.SecureRequestCustomizer"/></Arg>
-    </Call>
-  </New>
-
-  <!-- =========================================================== -->
-  <!-- This is the upstream server connector.                      -->
-  <!-- It speaks non-SSL SPDY/3(HTTP) on port 9090.                -->
-  <!-- =========================================================== -->
-  <Call name="addConnector">
-    <Arg>
-      <New class="org.eclipse.jetty.server.ServerConnector">
-        <Arg name="server">
-          <Ref refid="Server"/>
-        </Arg>
-        <Arg name="factories">
-          <Array type="org.eclipse.jetty.server.ConnectionFactory">
-            <!-- SPDY/3 Connection factory -->
-            <Item>
-              <New class="org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnectionFactory">
-                <Arg name="version" type="int">3</Arg>
-                <Arg name="config">
-                  <Ref refid="tlsHttpConfig"/>
-                </Arg>
-              </New>
-            </Item>
-          </Array>
-        </Arg>
-        <Set name="port">9090</Set>
-      </New>
-    </Arg>
-  </Call>
-
-  <!-- =========================================================== -->
-  <!-- This ProxyEngine translates the incoming SPDY/x(HTTP)       -->
-  <!-- requests to SPDY/2(HTTP)                                    -->
-  <!-- =========================================================== -->
-  <New id="spdyProxyEngine" class="org.eclipse.jetty.spdy.server.proxy.SPDYProxyEngine">
-    <Arg>
-      <New class="org.eclipse.jetty.spdy.client.SPDYClient$Factory">
-        <Call name="start"/>
-      </New>
-    </Arg>
-  </New>
-
-  <!-- =========================================================== -->
-  <!-- The ProxyEngineSelector receives SPDY/x(HTTP) requests      -->
-  <!-- from proxy connectors below and is configured to process    -->
-  <!-- requests for host "localhost".                              -->
-  <!-- Such requests are converted from SPDY/x(HTTP) to            -->
-  <!-- SPDY/3(HTTP) by the configured ProxyEngine and forwarded    -->
-  <!-- to 127.0.0.1:9090, where they are served by the upstream    -->
-  <!-- server above.                                               -->
-  <!-- =========================================================== -->
-  <New id="proxyEngineSelector" class="org.eclipse.jetty.spdy.server.proxy.ProxyEngineSelector">
-    <Call name="putProxyEngine">
-      <Arg>spdy/3</Arg>
-      <Arg>
-        <Ref refid="spdyProxyEngine"/>
-      </Arg>
-    </Call>
-    <Set name="proxyServerInfos">
-      <Map>
-        <Entry>
-          <Item>localhost</Item>
-          <Item>
-            <New class="org.eclipse.jetty.spdy.server.proxy.ProxyEngineSelector$ProxyServerInfo">
-              <Arg type="String">spdy/3</Arg>
-              <Arg>127.0.0.1</Arg>
-              <Arg type="int">9090</Arg>
-            </New>
-          </Item>
-        </Entry>
-      </Map>
-    </Set>
-  </New>
-
-  <!-- =========================================================== -->
-  <!-- These are the reverse proxy connectors accepting requests   -->
-  <!-- from clients.                                               -->
-  <!-- They accept non-SSL (on port 8080) and SSL (on port 8443)   -->
-  <!-- HTTP, SPDY/2(HTTP) and SPDY/3(HTTP).                        -->
-  <!-- Non-SPDY HTTP requests are converted to SPDY internally     -->
-  <!-- and passed to the ProxyEngine above.                        -->
-  <!-- =========================================================== -->
-  <Call name="addConnector">
-    <Arg>
-      <New class="org.eclipse.jetty.spdy.server.proxy.HTTPSPDYProxyServerConnector">
-        <Arg>
-          <Ref refid="Server"/>
-        </Arg>
-        <Arg>
-          <Ref refid="proxyEngineSelector"/>
-        </Arg>
-        <Set name="Port">8080</Set>
-      </New>
-    </Arg>
-  </Call>
-  <Call name="addConnector">
-    <Arg>
-      <New class="org.eclipse.jetty.spdy.server.proxy.HTTPSPDYProxyServerConnector">
-        <Arg>
-          <Ref refid="Server"/>
-        </Arg>
-        <Arg>
-          <Ref refid="sslContextFactory"/>
-        </Arg>
-        <Arg>
-          <Ref refid="proxyEngineSelector"/>
-        </Arg>
-        <Set name="Port">8443</Set>
-      </New>
-    </Arg>
-  </Call>
-
-</Configure>
diff --git a/jetty-spdy/spdy-http-server/src/main/config/etc/jetty-spdy.xml b/jetty-spdy/spdy-http-server/src/main/config/etc/jetty-spdy.xml
deleted file mode 100644
index b094d7c..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/etc/jetty-spdy.xml
+++ /dev/null
@@ -1,139 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
-<!-- ============================================================= -->
-<!-- Configure a SPDY connector.                                   -->
-<!-- This configuration must be used in conjunction with jetty.xml -->
-<!-- and jetty-ssl.xml                                             -->
-<!-- ============================================================= -->
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-    <!-- =========================================================== -->
-    <!-- Create a push strategy which can be used by reference by    -->
-    <!-- individual connection factories below.                      -->
-    <!--                                                             -->
-    <!-- Consult the javadoc of o.e.j.spdy.server.http.ReferrerPushStrategy -->
-    <!-- for all configuration that may be set here.                 -->
-    <!-- =========================================================== -->
-    <New id="pushStrategy" class="org.eclipse.jetty.spdy.server.http.ReferrerPushStrategy">
-        <!-- Uncomment to blacklist browsers for this push strategy. If one of the blacklisted Strings occurs in the
-             user-agent header sent by the client, push will be disabled for this browser. This is case insensitive" -->
-        <!--
-        <Set name="UserAgentBlacklist">
-            <Array type="String">
-                <Item>.*(?i)firefox/14.*</Item>
-                <Item>.*(?i)firefox/15.*</Item>
-                <Item>.*(?i)firefox/16.*</Item>
-            </Array>
-        </Set>
-        -->
-
-        <!-- Uncomment to override default file extensions to push -->
-        <!--
-        <Set name="PushRegexps">
-            <Array type="String">
-               <Item>.*\.css</Item>
-               <Item>.*\.js</Item>
-               <Item>.*\.png</Item>
-               <Item>.*\.jpg</Item>
-               <Item>.*\.gif</Item>
-           </Array>
-        </Set>
-        -->
-        <Set name="referrerPushPeriod">5000</Set>
-        <Set name="maxAssociatedResources">32</Set>
-    </New>
-
-    <!-- =========================================================== -->
-    <!-- Add a SPDY/HTTPS Connector.                                 -->
-    <!-- Configure an o.e.j.server.ServerConnector with connection   -->
-    <!-- factories for TLS (aka SSL), ProtoNego, SPDY and HTTP to    -->
-    <!-- provide a connector that can accept HTTPS or SPDY           -->
-    <!-- connections.                                                -->
-    <!--                                                             -->
-    <!-- All accepted TLS connections are initially wired to a       -->
-    <!-- Protonego connection, which attempts to use a TLS extension -->
-    <!-- to negotiation the protocol.  If it is not supported by     -->
-    <!-- the client, then the connection is replaced by a HTTP       -->
-    <!-- connection.  If a specific protocol version (eg spdy/3) is  -->
-    <!-- negotiated, then the appropriate connection factory         -->
-    <!-- is used to create a connection to replace the connection    -->
-    <!--                                                             -->
-    <!-- The final result is a SPDY or HTTP connection wired behind  -->
-    <!-- a TLS (aka SSL) connection.                                 -->
-    <!--                                                             -->
-    <!-- Consult the javadoc of o.e.j.server.ServerConnector and the -->
-    <!-- specific connection factory types for all configuration     -->
-    <!-- that may be set here.                                       -->
-    <!-- =========================================================== -->
-    <Call id="spdyConnector" name="addConnector">
-        <Arg>
-            <New class="org.eclipse.jetty.server.ServerConnector">
-                <Arg name="server">
-                    <Ref refid="Server"/>
-                </Arg>
-                <Arg name="factories">
-                    <Array type="org.eclipse.jetty.server.ConnectionFactory">
-
-                        <!-- SSL Connection factory with Protonego as next protocol -->
-                        <Item>
-                            <New class="org.eclipse.jetty.server.SslConnectionFactory">
-                                <Arg name="next"><Property name="protonego"/></Arg>
-                                <Arg name="sslContextFactory">
-                                    <Ref refid="sslContextFactory"/>
-                                </Arg>
-                            </New>
-                        </Item>
-
-                        <!-- NPN Connection factory with HTTP as default protocol -->
-                        <Item>
-			    <Ref refid="protonego"/>
-                        </Item>
-
-                        <!-- SPDY/3 Connection factory -->
-                        <Item>
-                            <New class="org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnectionFactory">
-                                <Arg name="version" type="int">3</Arg>
-                                <Arg name="config">
-                                    <Ref refid="sslHttpConfig"/>
-                                </Arg>
-                                <!-- Set the initial window size for this SPDY connector. -->
-                                <!-- See: http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3#TOC-2.6.8-WINDOW_UPDATE -->
-                                <Set name="initialWindowSize"><Property name="spdy.initialWindowSize" default="65536"/></Set>
-                                <!-- Uncomment to enable ReferrerPushStrategy -->
-                                <!--<Arg name="pushStrategy"><Ref refid="pushStrategy"/></Arg>-->
-                            </New>
-                        </Item>
-
-                        <!-- SPDY/2 Connection factory -->
-                        <Item>
-                            <New class="org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnectionFactory">
-                                <Arg name="version" type="int">2</Arg>
-                                <Arg name="config">
-                                    <Ref refid="sslHttpConfig"/>
-                                </Arg>
-                                <!-- Set the initial window size for this SPDY connector. -->
-                                <!-- See: http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3#TOC-2.6.8-WINDOW_UPDATE -->
-                                <Set name="initialWindowSize"><Property name="spdy.initialWindowSize" default="65536"/></Set>
-                            </New>
-                        </Item>
-
-                        <!-- HTTP Connection factory -->
-                        <Item>
-                            <New class="org.eclipse.jetty.server.HttpConnectionFactory">
-                                <Arg name="config">
-                                    <Ref refid="sslHttpConfig"/>
-                                </Arg>
-                            </New>
-                        </Item>
-                    </Array>
-                </Arg>
-
-                <Set name="host"><Property name="jetty.host"/></Set>
-                <Set name="port"><Property name="spdy.port" default="443"/></Set>
-                <Set name="idleTimeout"><Property name="spdy.timeout" default="30000"/></Set>
-            </New>
-        </Arg>
-    </Call>
-
-</Configure>
diff --git a/jetty-spdy/spdy-http-server/src/main/config/etc/protonego-npn.xml b/jetty-spdy/spdy-http-server/src/main/config/etc/protonego-npn.xml
deleted file mode 100644
index 6e30f39..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/etc/protonego-npn.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
-<Configure id="protonego" class="org.eclipse.jetty.spdy.server.NPNServerConnectionFactory">
-    <Arg name="protocols">
-	<Array type="String">
-	    <Item>spdy/3</Item>
-	    <Item>spdy/2</Item>
-	    <Item>http/1.1</Item>
-	</Array>
-    </Arg>
-   
-    <Set name="defaultProtocol">http/1.1</Set>
-
-    <!-- =========================================================== -->
-    <!-- Enables NPN debugging on System.err                         -->
-    <!-- ===========================================================
-     <Set class="org.eclipse.jetty.npn.NextProtoNego" name="debug" type="boolean">true</Set>
-    -->
-
-</Configure>
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_04.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_04.mod
deleted file mode 100644
index 007570b..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_04.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.0.v20120525/npn-boot-1.1.0.v20120525.jar|lib/npn/npn-boot-1.1.0.v20120525.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.0.v20120525.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_05.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_05.mod
deleted file mode 100644
index 007570b..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_05.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.0.v20120525/npn-boot-1.1.0.v20120525.jar|lib/npn/npn-boot-1.1.0.v20120525.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.0.v20120525.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_06.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_06.mod
deleted file mode 100644
index 868a7a7..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_06.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.1.v20121030/npn-boot-1.1.1.v20121030.jar|lib/npn/npn-boot-1.1.1.v20121030.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.1.v20121030.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_07.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_07.mod
deleted file mode 100644
index 868a7a7..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_07.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.1.v20121030/npn-boot-1.1.1.v20121030.jar|lib/npn/npn-boot-1.1.1.v20121030.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.1.v20121030.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_09.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_09.mod
deleted file mode 100644
index 20c1db2..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_09.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.3.v20130313/npn-boot-1.1.3.v20130313.jar|lib/npn/npn-boot-1.1.3.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.3.v20130313.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_10.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_10.mod
deleted file mode 100644
index 20c1db2..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_10.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.3.v20130313/npn-boot-1.1.3.v20130313.jar|lib/npn/npn-boot-1.1.3.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.3.v20130313.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_11.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_11.mod
deleted file mode 100644
index 20c1db2..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_11.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.3.v20130313/npn-boot-1.1.3.v20130313.jar|lib/npn/npn-boot-1.1.3.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.3.v20130313.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_13.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_13.mod
deleted file mode 100644
index 1645a52..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_13.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.4.v20130313/npn-boot-1.1.4.v20130313.jar|lib/npn/npn-boot-1.1.4.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.4.v20130313.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_15.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_15.mod
deleted file mode 100644
index 73bc090..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_15.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.5.v20130313/npn-boot-1.1.5.v20130313.jar|lib/npn/npn-boot-1.1.5.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.5.v20130313.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_17.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_17.mod
deleted file mode 100644
index 73bc090..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_17.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.5.v20130313/npn-boot-1.1.5.v20130313.jar|lib/npn/npn-boot-1.1.5.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.5.v20130313.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_21.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_21.mod
deleted file mode 100644
index 73bc090..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_21.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.5.v20130313/npn-boot-1.1.5.v20130313.jar|lib/npn/npn-boot-1.1.5.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.5.v20130313.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_25.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_25.mod
deleted file mode 100644
index 73bc090..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_25.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.5.v20130313/npn-boot-1.1.5.v20130313.jar|lib/npn/npn-boot-1.1.5.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.5.v20130313.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_40.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_40.mod
deleted file mode 100644
index 465e6f0..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_40.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.6.v20130911/npn-boot-1.1.6.v20130911.jar|lib/npn/npn-boot-1.1.6.v20130911.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.6.v20130911.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_45.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_45.mod
deleted file mode 100644
index 465e6f0..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_45.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.6.v20130911/npn-boot-1.1.6.v20130911.jar|lib/npn/npn-boot-1.1.6.v20130911.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.6.v20130911.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_51.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_51.mod
deleted file mode 100644
index 465e6f0..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_51.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.6.v20130911/npn-boot-1.1.6.v20130911.jar|lib/npn/npn-boot-1.1.6.v20130911.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.6.v20130911.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_55.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_55.mod
deleted file mode 100644
index 5f8704d..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_55.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.8.v20141013/npn-boot-1.1.8.v20141013.jar|lib/npn/npn-boot-1.1.8.v20141013.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.8.v20141013.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_60.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_60.mod
deleted file mode 100644
index 5f8704d..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_60.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.8.v20141013/npn-boot-1.1.8.v20141013.jar|lib/npn/npn-boot-1.1.8.v20141013.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.8.v20141013.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_65.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_65.mod
deleted file mode 100644
index 5f8704d..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_65.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.8.v20141013/npn-boot-1.1.8.v20141013.jar|lib/npn/npn-boot-1.1.8.v20141013.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.8.v20141013.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_67.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_67.mod
deleted file mode 100644
index 5f8704d..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_67.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.8.v20141013/npn-boot-1.1.8.v20141013.jar|lib/npn/npn-boot-1.1.8.v20141013.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.8.v20141013.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_71.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_71.mod
deleted file mode 100644
index 851aca8..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_71.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.9.v20141016/npn-boot-1.1.9.v20141016.jar|lib/npn/npn-boot-1.1.9.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.9.v20141016.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_72.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_72.mod
deleted file mode 100644
index 851aca8..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_72.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.9.v20141016/npn-boot-1.1.9.v20141016.jar|lib/npn/npn-boot-1.1.9.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.9.v20141016.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_75.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_75.mod
deleted file mode 100644
index a5fac11..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_75.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.10.v20150130/npn-boot-1.1.10.v20150130.jar|lib/npn/npn-boot-1.1.10.v20150130.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.10.v20150130.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_76.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_76.mod
deleted file mode 100644
index a5fac11..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_76.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.10.v20150130/npn-boot-1.1.10.v20150130.jar|lib/npn/npn-boot-1.1.10.v20150130.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.10.v20150130.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_79.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_79.mod
deleted file mode 100644
index a5fac11..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_79.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.10.v20150130/npn-boot-1.1.10.v20150130.jar|lib/npn/npn-boot-1.1.10.v20150130.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.10.v20150130.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_80.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_80.mod
deleted file mode 100644
index 2cce5fa..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn-1.7.0_80.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.11.v20150415/npn-boot-1.1.11.v20150415.jar|lib/npn/npn-boot-1.1.11.v20150415.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.11.v20150415.jar
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn.mod
deleted file mode 100644
index 1a2c71d..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/protonego-impl/npn.mod
+++ /dev/null
@@ -1,37 +0,0 @@
-# NPN is provided via a -Xbootclasspath that modifies the secure connections
-# in java to support the NPN layer needed for SPDY.
-#
-# This modification has a tight dependency on specific updates of Java 1.7.
-# (No support for Java 8 exists for npn / npn-boot, use alpn instead)
-#
-# The npn module will use an appropriate npn-boot jar for your specific
-# version of Java.
-#
-# IMPORTANT: Versions of Java that exist after this module was created are
-#            not guaranteed to work with existing npn-boot jars, and might
-#            need a new npn-boot to be created / tested / deployed by the
-#            Jetty project in order to provide support for these future
-#            Java versions.
-#
-# All versions of npn-boot can be found at
-# http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/
-
-
-[name]
-protonego-impl
-
-[depend]
-protonego-impl/npn-${java.version}
-
-[xml]
-etc/protonego-npn.xml
-
-[files]
-lib/
-lib/npn/
-
-[license]
-NPN is a hosted at github under the GPL v2 with ClassPath Exception.
-NPN replaces/modifies OpenJDK classes in the java.sun.security.ssl package.
-http://github.com/jetty-project/jetty-npn
-http://openjdk.java.net/legal/gplv2+ce.html
diff --git a/jetty-spdy/spdy-http-server/src/main/config/modules/spdy.mod b/jetty-spdy/spdy-http-server/src/main/config/modules/spdy.mod
deleted file mode 100644
index cf79dfa..0000000
--- a/jetty-spdy/spdy-http-server/src/main/config/modules/spdy.mod
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# SPDY Support Module
-#
-
-[depend]
-ssl
-protonego
-
-[lib]
-lib/spdy/*.jar
-
-[xml]
-etc/jetty-ssl.xml
-etc/jetty-spdy.xml
-
-[ini-template]
-## SPDY Configuration
-
-# Port for SPDY connections
-spdy.port=8443
-
-# SPDY idle timeout in milliseconds
-spdy.timeout=30000
-
-# Initial Window Size for SPDY
-#spdy.initialWindowSize=65536
diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HTTPSPDYServerConnectionFactory.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HTTPSPDYServerConnectionFactory.java
deleted file mode 100644
index 9be4bcb..0000000
--- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HTTPSPDYServerConnectionFactory.java
+++ /dev/null
@@ -1,167 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server.http;
-
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.HeadersInfo;
-import org.eclipse.jetty.spdy.api.PushInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.spdy.server.SPDYServerConnectionFactory;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.annotation.Name;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-public class HTTPSPDYServerConnectionFactory extends SPDYServerConnectionFactory implements HttpConfiguration.ConnectionFactory
-{
-    private static final String CHANNEL_ATTRIBUTE = "org.eclipse.jetty.spdy.server.http.HTTPChannelOverSPDY";
-    private static final Logger LOG = Log.getLogger(HTTPSPDYServerConnectionFactory.class);
-
-    private final PushStrategy pushStrategy;
-    private final HttpConfiguration httpConfiguration;
-
-    public HTTPSPDYServerConnectionFactory(
-        @Name("version") int version,
-        @Name("config") HttpConfiguration config)
-    {
-        this(version,config,new PushStrategy.None());
-    }
-
-    public HTTPSPDYServerConnectionFactory(
-        @Name("version") int version,
-        @Name("config") HttpConfiguration config,
-        @Name("pushStrategy") PushStrategy pushStrategy)
-    {
-        super(version);
-        this.pushStrategy = pushStrategy;
-        httpConfiguration = config;
-        addBean(httpConfiguration);
-    }
-
-    @Override
-    public HttpConfiguration getHttpConfiguration()
-    {
-        return httpConfiguration;
-    }
-
-    @Override
-    protected ServerSessionFrameListener provideServerSessionFrameListener(Connector connector, EndPoint endPoint)
-    {
-        return new HTTPServerFrameListener(connector,endPoint);
-    }
-
-    private class HTTPServerFrameListener extends ServerSessionFrameListener.Adapter implements StreamFrameListener
-    {
-        private final Connector connector;
-        private final EndPoint endPoint;
-
-        public HTTPServerFrameListener(Connector connector,EndPoint endPoint)
-        {
-            this.endPoint = endPoint;
-            this.connector=connector;
-        }
-
-        @Override
-        public StreamFrameListener onSyn(final Stream stream, SynInfo synInfo)
-        {
-            // Every time we have a SYN, it maps to a HTTP request.
-            // We can have multiple concurrent SYNs on the same connection,
-            // and this is very different from HTTP, where only one request
-            // can arrive on the same connection, so we need to create an
-            // HttpChannel for each SYN in order to run concurrently.
-
-            if (LOG.isDebugEnabled())
-                LOG.debug("Received {} on {}", synInfo, stream);
-
-            Fields headers = synInfo.getHeaders();
-            // According to SPDY/3 spec section 3.2.1 user-agents MUST support gzip compression. Firefox omits the
-            // accept-encoding header as it is redundant to negotiate gzip compression support with the server,
-            // if clients have to accept it.
-            // So we inject the accept-encoding header here, even if not set by the client. This will enforce SPDY
-            // clients to follow the spec and enable gzip compression if GzipFilter or the like is enabled.
-            if (!(headers.get("accept-encoding") != null && headers.get("accept-encoding").getValue().contains
-                    ("gzip")))
-                headers.add("accept-encoding", "gzip");
-            HttpTransportOverSPDY transport = new HttpTransportOverSPDY(connector, httpConfiguration, endPoint,
-                    pushStrategy, stream, headers);
-            HttpInputOverSPDY input = new HttpInputOverSPDY();
-            HttpChannelOverSPDY channel = new HttpChannelOverSPDY(connector, httpConfiguration, endPoint, transport, input, stream);
-            stream.setAttribute(CHANNEL_ATTRIBUTE, channel);
-
-            channel.requestStart(headers, synInfo.isClose());
-
-            if (headers.isEmpty())
-            {
-                // If the SYN has no headers, they may come later in a HEADERS frame
-                return this;
-            }
-            else
-            {
-                if (synInfo.isClose())
-                    return null;
-                else
-                    return this;
-            }
-        }
-
-        @Override
-        public void onReply(Stream stream, ReplyInfo replyInfo)
-        {
-            // Do nothing, servers cannot get replies
-        }
-
-        @Override
-        public void onHeaders(Stream stream, HeadersInfo headersInfo)
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Received {} on {}", headersInfo, stream);
-            HttpChannelOverSPDY channel = (HttpChannelOverSPDY)stream.getAttribute(CHANNEL_ATTRIBUTE);
-            channel.requestHeaders(headersInfo.getHeaders(), headersInfo.isClose());
-        }
-
-        @Override
-        public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-        {
-            return null;
-        }
-
-        @Override
-        public void onData(Stream stream, final DataInfo dataInfo)
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Received {} on {}", dataInfo, stream);
-            HttpChannelOverSPDY channel = (HttpChannelOverSPDY)stream.getAttribute(CHANNEL_ATTRIBUTE);
-            channel.requestContent(dataInfo, dataInfo.isClose());
-        }
-
-        @Override
-        public void onFailure(Stream stream, Throwable x)
-        {
-            LOG.debug(x);
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HTTPSPDYServerConnector.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HTTPSPDYServerConnector.java
deleted file mode 100644
index fd2d302..0000000
--- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HTTPSPDYServerConnector.java
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.http;
-
-import java.util.Collections;
-import java.util.Map;
-
-import org.eclipse.jetty.server.AbstractConnectionFactory;
-import org.eclipse.jetty.server.ConnectionFactory;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.HttpConnectionFactory;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.server.NPNServerConnectionFactory;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-
-public class HTTPSPDYServerConnector extends ServerConnector
-{
-    public HTTPSPDYServerConnector(Server server)
-    {
-        this(server, Collections.<Short, PushStrategy>emptyMap());
-    }
-
-    public HTTPSPDYServerConnector(Server server, SslContextFactory sslContextFactory)
-    {
-        this(server, sslContextFactory, Collections.<Short, PushStrategy>emptyMap());
-    }
-
-    public HTTPSPDYServerConnector(Server server, Map<Short, PushStrategy> pushStrategies)
-    {
-        this(server, null, pushStrategies);
-    }
-
-    public HTTPSPDYServerConnector(Server server, SslContextFactory sslContextFactory, Map<Short, PushStrategy> pushStrategies)
-    {
-        this(server, new HttpConfiguration(), sslContextFactory, pushStrategies);
-    }
-
-    public HTTPSPDYServerConnector(Server server, short version, HttpConfiguration httpConfiguration, PushStrategy push)
-    {
-        super(server, new HTTPSPDYServerConnectionFactory(version, httpConfiguration, push));
-    }
-
-    public HTTPSPDYServerConnector(Server server, HttpConfiguration config, SslContextFactory sslContextFactory, Map<Short, PushStrategy> pushStrategies)
-    {
-        super(server, AbstractConnectionFactory.getFactories(sslContextFactory,
-                sslContextFactory == null
-                        ? new ConnectionFactory[]{new HttpConnectionFactory(config)}
-                        : new ConnectionFactory[]{new NPNServerConnectionFactory("spdy/3", "spdy/2", "http/1.1"),
-                        new HttpConnectionFactory(config),
-                        new HTTPSPDYServerConnectionFactory(SPDY.V3, config, getPushStrategy(SPDY.V3, pushStrategies)),
-                        new HTTPSPDYServerConnectionFactory(SPDY.V2, config, getPushStrategy(SPDY.V2, pushStrategies))}));
-        NPNServerConnectionFactory npnConnectionFactory = getConnectionFactory(NPNServerConnectionFactory.class);
-        if (npnConnectionFactory != null)
-            npnConnectionFactory.setDefaultProtocol("http/1.1");
-    }
-
-    private static PushStrategy getPushStrategy(short version, Map<Short, PushStrategy> pushStrategies)
-    {
-        PushStrategy pushStrategy = pushStrategies.get(version);
-        if (pushStrategy == null)
-            pushStrategy = new PushStrategy.None();
-        return pushStrategy;
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpChannelOverSPDY.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpChannelOverSPDY.java
deleted file mode 100644
index cf92578..0000000
--- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpChannelOverSPDY.java
+++ /dev/null
@@ -1,246 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.http;
-
-import java.nio.ByteBuffer;
-
-import org.eclipse.jetty.http.HttpField;
-import org.eclipse.jetty.http.HttpMethod;
-import org.eclipse.jetty.http.HttpVersion;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.HttpChannel;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.HttpTransport;
-import org.eclipse.jetty.spdy.api.ByteBufferDataInfo;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-public class HttpChannelOverSPDY extends HttpChannel<DataInfo>
-{
-    private static final Logger LOG = Log.getLogger(HttpChannelOverSPDY.class);
-
-    private final Stream stream;
-    private boolean dispatched; // Guarded by synchronization on tasks
-    private boolean redispatch; // Guarded by synchronization on tasks
-    private boolean headersComplete;
-
-    public HttpChannelOverSPDY(Connector connector, HttpConfiguration configuration, EndPoint endPoint, HttpTransport transport, HttpInputOverSPDY input, Stream stream)
-    {
-        super(connector, configuration, endPoint, transport, input);
-        this.stream = stream;
-    }
-
-    @Override
-    public long getIdleTimeout()
-    {
-        return stream.getIdleTimeout();
-    }
-    
-    @Override
-    public boolean headerComplete()
-    {
-        headersComplete = true;
-        return super.headerComplete();
-    }
-
-    private void dispatch()
-    {
-        synchronized (this)
-        {
-            if (dispatched)
-                redispatch=true;
-            else
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Dispatch {}", this);
-                dispatched=true;
-                execute(this);
-            }
-        }
-    }
-
-    @Override
-    public void run()
-    {
-        boolean execute=true;
-        
-        while(execute)
-        {
-            try
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Executing {}",this);
-                super.run();
-            }
-            finally
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Completing {}", this);
-                synchronized (this)
-                {
-                    dispatched = redispatch;
-                    redispatch=false;
-                    execute=dispatched;
-                }
-            }
-        }
-    }
-    
-
-    public void requestStart(final Fields headers, final boolean endRequest)
-    {
-        if (!headers.isEmpty())
-            requestHeaders(headers, endRequest);
-    }
-
-    public void requestHeaders(Fields headers, boolean endRequest)
-    {
-        boolean proceed = performBeginRequest(headers);
-        if (!proceed)
-            return;
-
-        performHeaders(headers);
-
-        if (endRequest)
-        {
-            boolean dispatch = headerComplete();
-            if (messageComplete())
-                dispatch=true;
-            if (dispatch)
-                dispatch();
-        }
-    }
-
-    public void requestContent(final DataInfo dataInfo, boolean endRequest)
-    {
-        boolean dispatch=false;
-        if (!headersComplete && headerComplete())
-            dispatch=true;
-
-        if (LOG.isDebugEnabled())
-            LOG.debug("HTTP > {} bytes of content", dataInfo.length());
-
-        // We need to copy the dataInfo since we do not know when its bytes
-        // will be consumed. When the copy is consumed, we consume also the
-        // original, so the implementation can send a window update.
-        ByteBuffer copyByteBuffer = dataInfo.asByteBuffer(false);
-        ByteBufferDataInfo copyDataInfo = new ByteBufferDataInfo(copyByteBuffer, dataInfo.isClose())
-        {
-            @Override
-            public void consume(int delta)
-            {
-                super.consume(delta);
-                dataInfo.consume(delta);
-            }
-        };
-        if (LOG.isDebugEnabled())
-            LOG.debug("Queuing last={} content {}", endRequest, copyDataInfo);
-
-        if (content(copyDataInfo))
-            dispatch=true;
-
-        if (endRequest && messageComplete())
-            dispatch=true;
-        
-        if (dispatch)
-            dispatch();
-    }
-    
-    @Override
-    public boolean messageComplete()
-    {
-        super.messageComplete();
-        return false;
-    }
-
-    private boolean performBeginRequest(Fields headers)
-    {
-        short version = stream.getSession().getVersion();
-        Fields.Field methodHeader = headers.get(HTTPSPDYHeader.METHOD.name(version));
-        Fields.Field uriHeader = headers.get(HTTPSPDYHeader.URI.name(version));
-        Fields.Field versionHeader = headers.get(HTTPSPDYHeader.VERSION.name(version));
-
-        if (methodHeader == null || uriHeader == null || versionHeader == null)
-        {
-            badMessage(400, "Missing required request line elements");
-            return false;
-        }
-
-        HttpMethod httpMethod = HttpMethod.fromString(methodHeader.getValue());
-        HttpVersion httpVersion = HttpVersion.fromString(versionHeader.getValue());
-
-        // TODO should handle URI as byte buffer as some bad clients send WRONG encodings in query string
-        // that  we have to deal with
-        ByteBuffer uri = BufferUtil.toBuffer(uriHeader.getValue());
-
-        if (LOG.isDebugEnabled())
-            LOG.debug("HTTP > {} {} {}", httpMethod, uriHeader.getValue(), httpVersion);
-        startRequest(httpMethod, httpMethod.asString(), uri, httpVersion);
-
-        Fields.Field schemeHeader = headers.get(HTTPSPDYHeader.SCHEME.name(version));
-        if (schemeHeader != null)
-            getRequest().setScheme(schemeHeader.getValue());
-        return true;
-    }
-
-    private void performHeaders(Fields headers)
-    {
-        for (Fields.Field header : headers)
-        {
-            String name = header.getName();
-
-            // Skip special SPDY headers, unless it's the "host" header
-            HTTPSPDYHeader specialHeader = HTTPSPDYHeader.from(stream.getSession().getVersion(), name);
-            if (specialHeader != null)
-            {
-                if (specialHeader == HTTPSPDYHeader.HOST)
-                    name = "host";
-                else
-                    continue;
-            }
-
-            switch (name)
-            {
-                case "connection":
-                case "keep-alive":
-                case "proxy-connection":
-                case "transfer-encoding":
-                {
-                    // Spec says to ignore these headers
-                    continue;
-                }
-                default:
-                {
-                    // Spec says headers must be single valued
-                    String value = header.getValue();
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("HTTP > {}: {}", name, value);
-                    parsedHeader(new HttpField(name,value));
-                    break;
-                }
-            }
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpInputOverSPDY.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpInputOverSPDY.java
deleted file mode 100644
index 3a4e178..0000000
--- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpInputOverSPDY.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.http;
-
-import org.eclipse.jetty.server.QueuedHttpInput;
-import org.eclipse.jetty.spdy.api.DataInfo;
-
-public class HttpInputOverSPDY extends QueuedHttpInput<DataInfo>
-{
-    @Override
-    protected int remaining(DataInfo item)
-    {
-        return item.available();
-    }
-
-    @Override
-    protected int get(DataInfo item, byte[] buffer, int offset, int length)
-    {
-        return item.readInto(buffer, offset, length);
-    }
-    
-    @Override
-    protected void consume(DataInfo item, int length)
-    {
-        item.consume(length);
-    }
-
-    @Override
-    protected void onContentConsumed(DataInfo dataInfo)
-    {
-        dataInfo.consume(dataInfo.length());
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDY.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDY.java
deleted file mode 100644
index 2fd03f8..0000000
--- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDY.java
+++ /dev/null
@@ -1,423 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.http;
-
-import java.nio.ByteBuffer;
-import java.util.Queue;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.eclipse.jetty.http.HttpField;
-import org.eclipse.jetty.http.HttpFields;
-import org.eclipse.jetty.http.HttpGenerator;
-import org.eclipse.jetty.http.HttpHeader;
-import org.eclipse.jetty.http.HttpMethod;
-import org.eclipse.jetty.http.HttpStatus;
-import org.eclipse.jetty.http.HttpVersion;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.io.EofException;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.HttpTransport;
-import org.eclipse.jetty.spdy.StreamException;
-import org.eclipse.jetty.spdy.api.ByteBufferDataInfo;
-import org.eclipse.jetty.spdy.api.HeadersInfo;
-import org.eclipse.jetty.spdy.api.PushInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.ConcurrentArrayQueue;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.Promise;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-public class HttpTransportOverSPDY implements HttpTransport
-{
-    private static final Logger LOG = Log.getLogger(HttpTransportOverSPDY.class);
-
-    private final Connector connector;
-    private final HttpConfiguration configuration;
-    private final EndPoint endPoint;
-    private final PushStrategy pushStrategy;
-    private final Stream stream;
-    private final short version;
-    private final Fields requestHeaders;
-    private final AtomicBoolean committed = new AtomicBoolean();
-
-    public HttpTransportOverSPDY(Connector connector, HttpConfiguration configuration, EndPoint endPoint, PushStrategy pushStrategy, Stream stream, Fields requestHeaders)
-    {
-        this.connector = connector;
-        this.configuration = configuration;
-        this.endPoint = endPoint;
-        this.pushStrategy = pushStrategy == null ? new PushStrategy.None() : pushStrategy;
-        this.stream = stream;
-        this.requestHeaders = requestHeaders;
-        Session session = stream.getSession();
-        this.version = session.getVersion();
-    }
-
-    protected Stream getStream()
-    {
-        return stream;
-    }
-
-    protected Fields getRequestHeaders()
-    {
-        return requestHeaders;
-    }
-
-
-    @Override
-    public void send(ByteBuffer responseBodyContent, boolean lastContent, Callback callback)
-    {
-        // TODO can this be more efficient?
-        send(null, responseBodyContent, lastContent, callback);
-    }
-
-    @Override
-    public void send(HttpGenerator.ResponseInfo info, ByteBuffer content, boolean lastContent, final Callback callback)
-    {
-        if (LOG.isDebugEnabled())
-            LOG.debug("Sending {} {} {} {} last={}", this, stream, info, BufferUtil.toDetailString(content), lastContent);
-
-        if (stream.isClosed() || stream.isReset())
-        {
-            EofException exception = new EofException("stream closed");
-            callback.failed(exception);
-            return;
-        }
-
-        // info==null content==null lastContent==false          should not happen
-        // info==null content==null lastContent==true           signals no more content - complete
-        // info==null content!=null lastContent==false          send data on committed response
-        // info==null content!=null lastContent==true           send last data on committed response - complete
-        // info!=null content==null lastContent==false          reply, commit
-        // info!=null content==null lastContent==true           reply, commit and complete
-        // info!=null content!=null lastContent==false          reply, commit with content
-        // info!=null content!=null lastContent==true           reply, commit with content and complete
-
-        boolean isHeadRequest = HttpMethod.HEAD.name().equalsIgnoreCase(requestHeaders.get(HTTPSPDYHeader.METHOD.name(version)).getValue());
-        boolean hasContent = BufferUtil.hasContent(content) && !isHeadRequest;
-        boolean close = !hasContent && lastContent;
-
-        if (info != null)
-        {
-            if (!committed.compareAndSet(false, true))
-            {
-                StreamException exception = new StreamException(stream.getId(), StreamStatus.PROTOCOL_ERROR,
-                        "Stream already committed!");
-                callback.failed(exception);
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Committed response twice.", exception);
-                return;
-            }
-            sendReply(info, !hasContent ? callback : new Callback.Adapter()
-            {
-                @Override
-                public void failed(Throwable x)
-                {
-                    callback.failed(x);
-                }
-            }, close);
-        }
-
-        // Do we have some content to send as well
-        if (hasContent)
-        {
-            // send the data and let it call the callback
-            if (LOG.isDebugEnabled())
-                LOG.debug("Send content: {} on stream: {} lastContent={}", BufferUtil.toDetailString(content), stream,
-                    lastContent);
-            stream.data(new ByteBufferDataInfo(endPoint.getIdleTimeout(), TimeUnit.MILLISECONDS, content, lastContent
-            ), callback);
-        }
-        // else do we need to close
-        else if (lastContent && info == null)
-        {
-            // send empty data to close and let the send call the callback
-            if (LOG.isDebugEnabled())
-                LOG.debug("No content and lastContent=true. Sending empty ByteBuffer to close stream: {}", stream);
-            stream.data(new ByteBufferDataInfo(endPoint.getIdleTimeout(), TimeUnit.MILLISECONDS,
-                    BufferUtil.EMPTY_BUFFER, lastContent), callback);
-        }
-        else if (!lastContent && !hasContent && info == null)
-            throw new IllegalStateException("not lastContent, no content and no responseInfo!");
-
-    }
-
-    private void sendReply(HttpGenerator.ResponseInfo info, Callback callback, boolean close)
-    {
-        Fields headers = new Fields();
-
-        HttpVersion httpVersion = HttpVersion.HTTP_1_1;
-        headers.put(HTTPSPDYHeader.VERSION.name(version), httpVersion.asString());
-
-        int status = info.getStatus();
-        StringBuilder httpStatus = new StringBuilder().append(status);
-        String reason = info.getReason();
-        if (reason == null)
-            reason = HttpStatus.getMessage(status);
-        if (reason != null)
-            httpStatus.append(" ").append(reason);
-        headers.put(HTTPSPDYHeader.STATUS.name(version), httpStatus.toString());
-        if (LOG.isDebugEnabled())
-            LOG.debug("HTTP < {} {}", httpVersion, httpStatus);
-
-        // TODO merge the two Field classes into one
-        HttpFields fields = info.getHttpFields();
-        if (fields != null)
-        {
-            for (int i = 0; i < fields.size(); ++i)
-            {
-                HttpField field = fields.getField(i);
-                String name = field.getName();
-                String value = field.getValue();
-                headers.add(name, value);
-                if (LOG.isDebugEnabled())
-                    LOG.debug("HTTP < {}: {}", name, value);
-            }
-        }
-
-        if (configuration.getSendServerVersion())
-            headers.add(HttpHeader.SERVER.asString(), HttpConfiguration.SERVER_VERSION);
-        if (configuration.getSendXPoweredBy())
-            headers.add(HttpHeader.X_POWERED_BY.asString(), HttpConfiguration.SERVER_VERSION);
-
-        ReplyInfo reply = new ReplyInfo(headers, close);
-        if (LOG.isDebugEnabled())
-            LOG.debug("Sending reply: {} on stream: {}", reply, stream);
-        reply(stream, reply, callback);
-    }
-
-    @Override
-    public void completed()
-    {
-        if (LOG.isDebugEnabled())
-            LOG.debug("Completed {}", this);
-    }
-
-    private void reply(Stream stream, ReplyInfo replyInfo, Callback callback)
-    {
-        if (!stream.isUnidirectional())
-            stream.reply(replyInfo, callback);
-        else
-            stream.headers(new HeadersInfo(replyInfo.getHeaders(), replyInfo.isClose()), callback);
-
-        Fields responseHeaders = replyInfo.getHeaders();
-        if (responseHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().startsWith("200") && !stream.isClosed())
-        {
-            Set<String> pushResources = pushStrategy.apply(stream, requestHeaders, responseHeaders);
-            if (pushResources.size() > 0)
-            {
-                PushResourceCoordinator pushResourceCoordinator = new PushResourceCoordinator(pushResources);
-                pushResourceCoordinator.coordinate();
-            }
-        }
-    }
-
-    private static class PushHttpTransportOverSPDY extends HttpTransportOverSPDY
-    {
-        private final PushResourceCoordinator coordinator;
-        private final short version;
-
-        private PushHttpTransportOverSPDY(Connector connector, HttpConfiguration configuration, EndPoint endPoint,
-                                          PushStrategy pushStrategy, Stream stream, Fields requestHeaders,
-                                          PushResourceCoordinator coordinator, short version)
-        {
-            super(connector, configuration, endPoint, pushStrategy, stream, requestHeaders);
-            this.coordinator = coordinator;
-            this.version = version;
-        }
-
-        @Override
-        public void completed()
-        {
-            Stream stream = getStream();
-            if (LOG.isDebugEnabled())
-                LOG.debug("Resource pushed for {} on {}",
-                    getRequestHeaders().get(HTTPSPDYHeader.URI.name(version)), stream);
-            coordinator.complete();
-        }
-    }
-
-    private class PushResourceCoordinator
-    {
-        private final Queue<PushResource> queue = new ConcurrentArrayQueue<>();
-        private final Set<String> resources;
-        private AtomicBoolean active = new AtomicBoolean(false);
-
-        private PushResourceCoordinator(Set<String> resources)
-        {
-            this.resources = resources;
-        }
-
-        private void coordinate()
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Pushing resources: {}", resources);
-            // Must send all push frames to the client at once before we
-            // return from this method and send the main resource data
-            for (String pushResource : resources)
-                pushResource(pushResource);
-        }
-
-        private void sendNextResourceData()
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("{} sendNextResourceData active: {}", hashCode(), active.get());
-            if (active.compareAndSet(false, true))
-            {
-                PushResource resource = queue.poll();
-                if (resource != null)
-                {
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("Opening new push channel for: {}", resource);
-                    HttpChannelOverSPDY pushChannel = newHttpChannelOverSPDY(resource.getPushStream(), resource.getPushRequestHeaders());
-                    pushChannel.requestStart(resource.getPushRequestHeaders(), true);
-                    return;
-                }
-
-                if (active.compareAndSet(true, false))
-                {
-                    if (queue.peek() != null)
-                        sendNextResourceData();
-                }
-                else
-                {
-                    throw new IllegalStateException("active must not be false here! Concurrency bug!");
-                }
-            }
-        }
-
-        private HttpChannelOverSPDY newHttpChannelOverSPDY(Stream pushStream, Fields pushRequestHeaders)
-        {
-            HttpTransport transport = new PushHttpTransportOverSPDY(connector, configuration, endPoint, pushStrategy,
-                    pushStream, pushRequestHeaders, this, version);
-            HttpInputOverSPDY input = new HttpInputOverSPDY();
-            return new HttpChannelOverSPDY(connector, configuration, endPoint, transport, input, pushStream);
-        }
-
-        private void pushResource(String pushResource)
-        {
-            Fields.Field scheme = requestHeaders.get(HTTPSPDYHeader.SCHEME.name(version));
-            Fields.Field host = requestHeaders.get(HTTPSPDYHeader.HOST.name(version));
-            Fields.Field uri = requestHeaders.get(HTTPSPDYHeader.URI.name(version));
-            final Fields pushHeaders = createPushHeaders(scheme, host, pushResource);
-            final Fields pushRequestHeaders = createRequestHeaders(scheme, host, uri, pushResource);
-
-            stream.push(new PushInfo(pushHeaders, false), new Promise<Stream>()
-            {
-                @Override
-                public void succeeded(Stream pushStream)
-                {
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("Headers pushed for {} on {}", pushHeaders.get(HTTPSPDYHeader.URI.name(version)), pushStream);
-                    queue.offer(new PushResource(pushStream, pushRequestHeaders));
-                    sendNextResourceData();
-                }
-
-                @Override
-                public void failed(Throwable x)
-                {
-                    LOG.debug("Creating push stream failed.", x);
-                    sendNextResourceData();
-                }
-            });
-        }
-
-        private void complete()
-        {
-            if (!active.compareAndSet(true, false))
-                throw new IllegalStateException();
-            sendNextResourceData();
-        }
-
-        private Fields createRequestHeaders(Fields.Field scheme, Fields.Field host, Fields.Field uri, String pushResourcePath)
-        {
-            final Fields newRequestHeaders = new Fields(requestHeaders, false);
-            newRequestHeaders.put(HTTPSPDYHeader.METHOD.name(version), "GET");
-            newRequestHeaders.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1");
-            newRequestHeaders.put(scheme);
-            newRequestHeaders.put(host);
-            newRequestHeaders.put(HTTPSPDYHeader.URI.name(version), pushResourcePath);
-            String referrer = scheme.getValue() + "://" + host.getValue() + uri.getValue();
-            newRequestHeaders.put("referer", referrer);
-            newRequestHeaders.put("x-spdy-push", "true");
-            return newRequestHeaders;
-        }
-
-        private Fields createPushHeaders(Fields.Field scheme, Fields.Field host, String pushResourcePath)
-        {
-            final Fields pushHeaders = new Fields();
-            if (version == SPDY.V2)
-                pushHeaders.put(HTTPSPDYHeader.URI.name(version), scheme.getValue() + "://" + host.getValue() + pushResourcePath);
-            else
-            {
-                pushHeaders.put(HTTPSPDYHeader.URI.name(version), pushResourcePath);
-                pushHeaders.put(scheme);
-                pushHeaders.put(host);
-            }
-            return pushHeaders;
-        }
-    }
-
-    private static class PushResource
-    {
-        private final Stream pushStream;
-        private final Fields pushRequestHeaders;
-
-        public PushResource(Stream pushStream, Fields pushRequestHeaders)
-        {
-            this.pushStream = pushStream;
-            this.pushRequestHeaders = pushRequestHeaders;
-        }
-
-        public Stream getPushStream()
-        {
-            return pushStream;
-        }
-
-        public Fields getPushRequestHeaders()
-        {
-            return pushRequestHeaders;
-        }
-
-        @Override
-        public String toString()
-        {
-            return "PushResource{" +
-                    "pushStream=" + pushStream +
-                    ", pushRequestHeaders=" + pushRequestHeaders +
-                    '}';
-        }
-    }
-
-    @Override
-    public void abort()
-    {
-        // TODO close the stream in a way to indicate an incomplete response?
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/PushStrategy.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/PushStrategy.java
deleted file mode 100644
index 061f2a3..0000000
--- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/PushStrategy.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server.http;
-
-import java.util.Collections;
-import java.util.Set;
-
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.util.Fields;
-
-/**
- * <p>{@link PushStrategy} encapsulates the decisions about performing
- * SPDY pushes of secondary resources associated with a primary resource.</p>
- */
-public interface PushStrategy
-{
-    /**
-     * <p>Applies the SPDY push logic for the primary resource.</p>
-     *
-     * @param stream the primary resource stream
-     * @param requestHeaders the primary resource request headers
-     * @param responseHeaders the primary resource response headers
-     * @return a list of secondary resource URIs to push
-     */
-    public Set<String> apply(Stream stream, Fields requestHeaders, Fields responseHeaders);
-
-    /**
-     * An implementation that returns an empty list of secondary resources
-     */
-    public static class None implements PushStrategy
-    {
-        @Override
-        public Set<String> apply(Stream stream, Fields requestHeaders, Fields responseHeaders)
-        {
-            return Collections.emptySet();
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/ReferrerPushStrategy.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/ReferrerPushStrategy.java
deleted file mode 100644
index c9e24d6..0000000
--- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/http/ReferrerPushStrategy.java
+++ /dev/null
@@ -1,342 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server.http;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.CopyOnWriteArraySet;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.regex.Pattern;
-
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/**
- * <p>A SPDY push strategy that auto-populates push metadata based on referrer URLs.<p>A typical request for a main
- * resource such as {@code index.html} is immediately followed by a number of requests for associated resources.
- * Associated resource requests will have a {@code Referer} HTTP header that points to {@code index.html}, which is used
- * to link the associated resource to the main resource.<p>However, also following a hyperlink generates a HTTP request
- * with a {@code Referer} HTTP header that points to {@code index.html}; therefore a proper value for {@link
- * #setReferrerPushPeriod(int)} has to be set. If the referrerPushPeriod for a main resource has elapsed, no more
- * associated resources will be added for that main resource.<p>This class distinguishes associated main resources by
- * their URL path suffix and content type. CSS stylesheets, images and JavaScript files have recognizable URL path
- * suffixes that are classified as associated resources. The suffix regexs can be configured by constructor argument</p>
- * <p>When CSS stylesheets refer to images, the CSS image request will have the CSS stylesheet as referrer. This
- * implementation will push also the CSS image.<p>The push metadata built by this implementation is limited by the
- * number of pages of the application itself, and by the {@link #setMaxAssociatedResources(int)} max associated
- * resources} parameter. This parameter limits the number of associated resources per each main resource, so that if a
- * main resource has hundreds of associated resources, only up to the number specified by this parameter will be
- * pushed.
- */
-public class ReferrerPushStrategy implements PushStrategy
-{
-    private static final Logger LOG = Log.getLogger(ReferrerPushStrategy.class);
-    private final ConcurrentMap<String, MainResource> mainResources = new ConcurrentHashMap<>();
-    private final Set<Pattern> pushRegexps = new HashSet<>();
-    private final Set<String> pushContentTypes = new HashSet<>();
-    private final Set<Pattern> allowedPushOrigins = new HashSet<>();
-    private final Set<Pattern> userAgentBlacklist = new HashSet<>();
-    private volatile int maxAssociatedResources = 32;
-    private volatile int referrerPushPeriod = 5000;
-
-    public ReferrerPushStrategy()
-    {
-        List<String> defaultPushRegexps = Arrays.asList(".*\\.css", ".*\\.js", ".*\\.png", ".*\\.jpeg", ".*\\.jpg",
-                ".*\\.gif", ".*\\.ico");
-        addPushRegexps(defaultPushRegexps);
-
-        List<String> defaultPushContentTypes = Arrays.asList(
-                "text/css",
-                "text/javascript", "application/javascript", "application/x-javascript",
-                "image/png", "image/x-png",
-                "image/jpeg",
-                "image/gif",
-                "image/x-icon", "image/vnd.microsoft.icon");
-        this.pushContentTypes.addAll(defaultPushContentTypes);
-    }
-
-    public void setPushRegexps(List<String> pushRegexps)
-    {
-        pushRegexps.clear();
-        addPushRegexps(pushRegexps);
-    }
-
-    private void addPushRegexps(List<String> pushRegexps)
-    {
-        for (String pushRegexp : pushRegexps)
-            this.pushRegexps.add(Pattern.compile(pushRegexp));
-    }
-
-    public void setPushContentTypes(List<String> pushContentTypes)
-    {
-        pushContentTypes.clear();
-        pushContentTypes.addAll(pushContentTypes);
-    }
-
-    public void setAllowedPushOrigins(List<String> allowedPushOrigins)
-    {
-        allowedPushOrigins.clear();
-        for (String allowedPushOrigin : allowedPushOrigins)
-            this.allowedPushOrigins.add(Pattern.compile(allowedPushOrigin.replace(".", "\\.").replace("*", ".*")));
-    }
-
-    public void setUserAgentBlacklist(List<String> userAgentPatterns)
-    {
-        userAgentBlacklist.clear();
-        for (String userAgentPattern : userAgentPatterns)
-            userAgentBlacklist.add(Pattern.compile(userAgentPattern));
-    }
-
-    public void setMaxAssociatedResources(int maxAssociatedResources)
-    {
-        this.maxAssociatedResources = maxAssociatedResources;
-    }
-
-    public void setReferrerPushPeriod(int referrerPushPeriod)
-    {
-        this.referrerPushPeriod = referrerPushPeriod;
-    }
-
-    public Set<Pattern> getPushRegexps()
-    {
-        return pushRegexps;
-    }
-
-    public Set<String> getPushContentTypes()
-    {
-        return pushContentTypes;
-    }
-
-    public Set<Pattern> getAllowedPushOrigins()
-    {
-        return allowedPushOrigins;
-    }
-
-    public Set<Pattern> getUserAgentBlacklist()
-    {
-        return userAgentBlacklist;
-    }
-
-    public int getMaxAssociatedResources()
-    {
-        return maxAssociatedResources;
-    }
-
-    public int getReferrerPushPeriod()
-    {
-        return referrerPushPeriod;
-    }
-
-    @Override
-    public Set<String> apply(Stream stream, Fields requestHeaders, Fields responseHeaders)
-    {
-        Set<String> result = Collections.<String>emptySet();
-        short version = stream.getSession().getVersion();
-        if (!isIfModifiedSinceHeaderPresent(requestHeaders) && isValidMethod(requestHeaders.get(HTTPSPDYHeader.METHOD
-                .name(version)).getValue()) && !isUserAgentBlacklisted(requestHeaders))
-        {
-            String scheme = requestHeaders.get(HTTPSPDYHeader.SCHEME.name(version)).getValue();
-            String host = requestHeaders.get(HTTPSPDYHeader.HOST.name(version)).getValue();
-            String origin = scheme + "://" + host;
-            String url = requestHeaders.get(HTTPSPDYHeader.URI.name(version)).getValue();
-            String absoluteURL = origin + url;
-            if (LOG.isDebugEnabled())
-                LOG.debug("Applying push strategy for {}", absoluteURL);
-            if (isMainResource(url, responseHeaders))
-            {
-                MainResource mainResource = getOrCreateMainResource(absoluteURL);
-                result = mainResource.getResources();
-            }
-            else if (isPushResource(url, responseHeaders))
-            {
-                Fields.Field referrerHeader = requestHeaders.get("referer");
-                if (referrerHeader != null)
-                {
-                    String referrer = referrerHeader.getValue();
-                    MainResource mainResource = mainResources.get(referrer);
-                    if (mainResource == null)
-                        mainResource = getOrCreateMainResource(referrer);
-
-                    Set<String> pushResources = mainResource.getResources();
-                    if (!pushResources.contains(url))
-                        mainResource.addResource(url, origin, referrer);
-                    else
-                        result = getPushResources(absoluteURL);
-                }
-            }
-            if (LOG.isDebugEnabled())
-                LOG.debug("Pushing {} resources for {}: {}", result.size(), absoluteURL, result);
-        }
-        return result;
-    }
-
-    private Set<String> getPushResources(String absoluteURL)
-    {
-        Set<String> result = Collections.emptySet();
-        if (mainResources.get(absoluteURL) != null)
-            result = mainResources.get(absoluteURL).getResources();
-        return result;
-    }
-
-    private MainResource getOrCreateMainResource(String absoluteURL)
-    {
-        MainResource mainResource = mainResources.get(absoluteURL);
-        if (mainResource == null)
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Creating new main resource for {}", absoluteURL);
-            MainResource value = new MainResource(absoluteURL);
-            mainResource = mainResources.putIfAbsent(absoluteURL, value);
-            if (mainResource == null)
-                mainResource = value;
-        }
-        return mainResource;
-    }
-
-    private boolean isIfModifiedSinceHeaderPresent(Fields headers)
-    {
-        return headers.get("if-modified-since") != null;
-    }
-
-    private boolean isValidMethod(String method)
-    {
-        return "GET".equalsIgnoreCase(method);
-    }
-
-    private boolean isMainResource(String url, Fields responseHeaders)
-    {
-        return !isPushResource(url, responseHeaders);
-    }
-
-    public boolean isUserAgentBlacklisted(Fields headers)
-    {
-        Fields.Field userAgentHeader = headers.get("user-agent");
-        if (userAgentHeader != null)
-            for (Pattern userAgentPattern : userAgentBlacklist)
-                if (userAgentPattern.matcher(userAgentHeader.getValue()).matches())
-                    return true;
-        return false;
-    }
-
-    private boolean isPushResource(String url, Fields responseHeaders)
-    {
-        for (Pattern pushRegexp : pushRegexps)
-        {
-            if (pushRegexp.matcher(url).matches())
-            {
-                Fields.Field header = responseHeaders.get("content-type");
-                if (header == null)
-                    return true;
-
-                String contentType = header.getValue().toLowerCase(Locale.ENGLISH);
-                for (String pushContentType : pushContentTypes)
-                    if (contentType.startsWith(pushContentType))
-                        return true;
-            }
-        }
-        return false;
-    }
-
-    private class MainResource
-    {
-        private final String name;
-        private final CopyOnWriteArraySet<String> resources = new CopyOnWriteArraySet<>();
-        private final AtomicLong firstResourceAdded = new AtomicLong(-1);
-
-        private MainResource(String name)
-        {
-            this.name = name;
-        }
-
-        public boolean addResource(String url, String origin, String referrer)
-        {
-            // We start the push period here and not when initializing the main resource, because a browser with a
-            // prefilled cache won't request the subresources. If the browser with warmed up cache now hits the main
-            // resource after a server restart, the push period shouldn't start until the first subresource is
-            // being requested.
-            firstResourceAdded.compareAndSet(-1, System.nanoTime());
-
-            long delay = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - firstResourceAdded.get());
-            if (!referrer.startsWith(origin) && !isPushOriginAllowed(origin))
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Skipped store of push metadata {} for {}: Origin: {} doesn't match or origin not allowed",
-                        url, name, origin);
-                return false;
-            }
-
-            // This check is not strictly concurrent-safe, but limiting
-            // the number of associated resources is achieved anyway
-            // although in rare cases few more resources will be stored
-            if (resources.size() >= maxAssociatedResources)
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Skipped store of push metadata {} for {}: max associated resources ({}) reached",
-                        url, name, maxAssociatedResources);
-                return false;
-            }
-            if (delay > referrerPushPeriod)
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Delay: {}ms longer than referrerPushPeriod ({}ms). Not adding resource: {} for: {}",
-                        delay, referrerPushPeriod, url, name);
-                return false;
-            }
-
-            if (LOG.isDebugEnabled())
-                LOG.debug("Adding: {} to: {} with delay: {}ms.", url, this, delay);
-            resources.add(url);
-            return true;
-        }
-
-        public Set<String> getResources()
-        {
-            return Collections.unmodifiableSet(resources);
-        }
-
-        public String toString()
-        {
-            return String.format("%s@%x{name=%s,resources=%s}",
-                    getClass().getSimpleName(),
-                    hashCode(),
-                    name,
-                    resources
-            );
-        }
-
-        private boolean isPushOriginAllowed(String origin)
-        {
-            for (Pattern allowedPushOrigin : allowedPushOrigins)
-                if (allowedPushOrigin.matcher(origin).matches())
-                    return true;
-            return false;
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/HTTPProxyEngine.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/HTTPProxyEngine.java
deleted file mode 100644
index 61ff1be..0000000
--- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/HTTPProxyEngine.java
+++ /dev/null
@@ -1,276 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server.proxy;
-
-import java.nio.ByteBuffer;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeoutException;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.Request;
-import org.eclipse.jetty.client.api.Response;
-import org.eclipse.jetty.client.util.DeferredContentProvider;
-import org.eclipse.jetty.http.HttpField;
-import org.eclipse.jetty.http.HttpMethod;
-import org.eclipse.jetty.http.HttpStatus;
-import org.eclipse.jetty.http.HttpVersion;
-import org.eclipse.jetty.spdy.api.ByteBufferDataInfo;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.HeadersInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.RstInfo;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.HttpCookieStore;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/**
- * <p>{@link HTTPProxyEngine} implements a SPDY to HTTP proxy, that is, converts SPDY events received by clients into
- * HTTP events for the servers.</p>
- */
-public class HTTPProxyEngine extends ProxyEngine
-{
-    private static final Logger LOG = Log.getLogger(HTTPProxyEngine.class);
-    private static final Callback LOGGING_CALLBACK = new LoggingCallback();
-
-    private final HttpClient httpClient;
-
-    public HTTPProxyEngine(HttpClient httpClient)
-    {
-        this.httpClient = httpClient;
-        configureHttpClient(httpClient);
-    }
-
-    private void configureHttpClient(HttpClient httpClient)
-    {
-        // Redirects must be proxied as is, not followed
-        httpClient.setFollowRedirects(false);
-        // Must not store cookies, otherwise cookies of different clients will mix
-        httpClient.setCookieStore(new HttpCookieStore.Empty());
-    }
-
-    public StreamFrameListener proxy(final Stream clientStream, SynInfo clientSynInfo, ProxyEngineSelector.ProxyServerInfo proxyServerInfo)
-    {
-        short version = clientStream.getSession().getVersion();
-        String method = clientSynInfo.getHeaders().get(HTTPSPDYHeader.METHOD.name(version)).getValue();
-        String path = clientSynInfo.getHeaders().get(HTTPSPDYHeader.URI.name(version)).getValue();
-
-        Fields headers = new Fields(clientSynInfo.getHeaders(), false);
-
-        removeHopHeaders(headers);
-        addRequestProxyHeaders(clientStream, headers);
-        customizeRequestHeaders(clientStream, headers);
-
-        String host = proxyServerInfo.getHost();
-        int port = proxyServerInfo.getAddress().getPort();
-
-        if (LOG.isDebugEnabled())
-            LOG.debug("Sending HTTP request to: {}", host + ":" + port);
-        final Request request = httpClient.newRequest(host, port)
-                .path(path)
-                .method(HttpMethod.fromString(method));
-        addNonSpdyHeadersToRequest(version, headers, request);
-
-        if (!clientSynInfo.isClose())
-        {
-            request.content(new DeferredContentProvider());
-        }
-
-        sendRequest(clientStream, request);
-
-        return new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                // We proxy to HTTP so we do not receive replies
-                throw new UnsupportedOperationException("Not Yet Implemented");
-            }
-
-            @Override
-            public void onHeaders(Stream stream, HeadersInfo headersInfo)
-            {
-                throw new UnsupportedOperationException("Not Yet Implemented");
-            }
-
-            @Override
-            public void onData(Stream clientStream, final DataInfo clientDataInfo)
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("received clientDataInfo: {} for stream: {}", clientDataInfo, clientStream);
-
-                DeferredContentProvider contentProvider = (DeferredContentProvider)request.getContent();
-                contentProvider.offer(clientDataInfo.asByteBuffer(true));
-
-                if (clientDataInfo.isClose())
-                    contentProvider.close();
-            }
-        };
-    }
-
-    private void sendRequest(final Stream clientStream, Request request)
-    {
-        request.send(new Response.Listener.Adapter()
-        {
-            private volatile boolean committed;
-
-            @Override
-            public void onHeaders(final Response response)
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("onHeaders called with response: {}. Sending replyInfo to client.", response);
-                Fields responseHeaders = createResponseHeaders(clientStream, response);
-                removeHopHeaders(responseHeaders);
-                ReplyInfo replyInfo = new ReplyInfo(responseHeaders, false);
-                clientStream.reply(replyInfo, new Callback.Adapter()
-                {
-                    @Override
-                    public void failed(Throwable x)
-                    {
-                        LOG.debug("failed: ", x);
-                        response.abort(x);
-                    }
-
-                    @Override
-                    public void succeeded()
-                    {
-                        committed = true;
-                    }
-                });
-            }
-
-            @Override
-            public void onContent(final Response response, ByteBuffer content)
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("onContent called with response: {} and content: {}. Sending response content to client.",
-                        response, content);
-                final ByteBuffer contentCopy = httpClient.getByteBufferPool().acquire(content.remaining(), true);
-                BufferUtil.flipPutFlip(content, contentCopy);
-                ByteBufferDataInfo dataInfo = new ByteBufferDataInfo(contentCopy, false);
-                clientStream.data(dataInfo, new Callback()
-                {
-                    @Override
-                    public void failed(Throwable x)
-                    {
-                        LOG.debug("failed: ", x);
-                        releaseBuffer();
-                        response.abort(x);
-                    }
-
-                    @Override
-                    public void succeeded()
-                    {
-                        releaseBuffer();
-                    }
-
-                    private void releaseBuffer()
-                    {
-                        httpClient.getByteBufferPool().release(contentCopy);
-                    }
-                });
-            }
-
-            @Override
-            public void onSuccess(Response response)
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("onSuccess called. Closing client stream.");
-                clientStream.data(new ByteBufferDataInfo(BufferUtil.EMPTY_BUFFER, true), LOGGING_CALLBACK);
-            }
-
-            @Override
-            public void onFailure(Response response, Throwable failure)
-            {
-                LOG.debug("onFailure called: ", failure);
-                if (committed)
-                {
-                    LOG.debug("clientStream already committed. Resetting stream.");
-                    try
-                    {
-                        clientStream.getSession().rst(new RstInfo(clientStream.getId(), StreamStatus.INTERNAL_ERROR));
-                    }
-                    catch (InterruptedException | ExecutionException | TimeoutException e)
-                    {
-                        LOG.debug(e);
-                    }
-                }
-                else
-                {
-                    if (clientStream.isClosed())
-                        return;
-                    Fields responseHeaders = createResponseHeaders(clientStream, response);
-                    if (failure instanceof TimeoutException)
-                        responseHeaders.add(HTTPSPDYHeader.STATUS.name(clientStream.getSession().getVersion()),
-                                String.valueOf(HttpStatus.GATEWAY_TIMEOUT_504));
-                    else
-                        responseHeaders.add(HTTPSPDYHeader.STATUS.name(clientStream.getSession().getVersion()),
-                                String.valueOf(HttpStatus.BAD_GATEWAY_502));
-                    ReplyInfo replyInfo = new ReplyInfo(responseHeaders, true);
-                    clientStream.reply(replyInfo, LOGGING_CALLBACK);
-                }
-            }
-        });
-    }
-
-    private Fields createResponseHeaders(Stream clientStream, Response response)
-    {
-        Fields responseHeaders = new Fields();
-        for (HttpField header : response.getHeaders())
-            responseHeaders.add(header.getName(), header.getValue());
-            short version = clientStream.getSession().getVersion();
-        if (response.getStatus() > 0)
-            responseHeaders.add(HTTPSPDYHeader.STATUS.name(version),
-                    String.valueOf(response.getStatus()));
-        responseHeaders.add(HTTPSPDYHeader.VERSION.name(version), HttpVersion.HTTP_1_1.asString());
-        addResponseProxyHeaders(clientStream, responseHeaders);
-        return responseHeaders;
-    }
-
-    private void addNonSpdyHeadersToRequest(short version, Fields headers, Request request)
-    {
-        for (Fields.Field header : headers)
-            if (HTTPSPDYHeader.from(version, header.getName()) == null)
-                request.header(header.getName(), header.getValue());
-    }
-
-    static class LoggingCallback extends Callback.Adapter
-    {
-        @Override
-        public void failed(Throwable x)
-        {
-            LOG.debug(x);
-        }
-
-        @Override
-        public void succeeded()
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("succeeded");
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/HTTPSPDYProxyServerConnector.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/HTTPSPDYProxyServerConnector.java
deleted file mode 100644
index d5cc889..0000000
--- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/HTTPSPDYProxyServerConnector.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server.proxy;
-
-import java.util.Objects;
-
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.NegotiatingServerConnectionFactory;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.server.NPNServerConnectionFactory;
-import org.eclipse.jetty.spdy.server.SPDYServerConnectionFactory;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-
-public class HTTPSPDYProxyServerConnector extends ServerConnector
-{
-    public HTTPSPDYProxyServerConnector(Server server, ProxyEngineSelector proxyEngineSelector)
-    {
-        this(server, new HttpConfiguration(), proxyEngineSelector);
-    }
-
-    public HTTPSPDYProxyServerConnector(Server server, HttpConfiguration config, ProxyEngineSelector proxyEngineSelector)
-    {
-        super(server, (SslContextFactory)null, new ProxyHTTPConnectionFactory(config, SPDY.V2, proxyEngineSelector));
-    }
-
-    public HTTPSPDYProxyServerConnector(Server server, SslContextFactory sslContextFactory, ProxyEngineSelector proxyEngineSelector)
-    {
-        this(server, sslContextFactory, new HttpConfiguration(), proxyEngineSelector);
-    }
-
-    public HTTPSPDYProxyServerConnector(Server server, SslContextFactory sslContextFactory, HttpConfiguration config, ProxyEngineSelector proxyEngineSelector)
-    {
-        this(server, sslContextFactory, config, proxyEngineSelector, new NPNServerConnectionFactory("spdy/3", "spdy/2", "http/1.1"));
-    }
-
-    public HTTPSPDYProxyServerConnector(Server server, SslContextFactory sslContextFactory, HttpConfiguration config, ProxyEngineSelector proxyEngineSelector, NegotiatingServerConnectionFactory negotiatingFactory)
-    {
-        super(server, Objects.requireNonNull(sslContextFactory), negotiatingFactory,
-                new SPDYServerConnectionFactory(SPDY.V3, proxyEngineSelector),
-                new SPDYServerConnectionFactory(SPDY.V2, proxyEngineSelector),
-                new ProxyHTTPConnectionFactory(config, SPDY.V2, proxyEngineSelector));
-        negotiatingFactory.setDefaultProtocol("http/1.1");
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyEngine.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyEngine.java
deleted file mode 100644
index eadaf6b..0000000
--- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyEngine.java
+++ /dev/null
@@ -1,129 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server.proxy;
-
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.UnknownHostException;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.util.Fields;
-
-/**
- * <p>{@link ProxyEngine} is the class for SPDY proxy functionalities that receives a SPDY request and converts it to
- * any protocol to its server side.</p>
- * <p>This class listens for SPDY events sent by clients; subclasses are responsible for translating
- * these SPDY client events into appropriate events to forward to the server, in the appropriate
- * protocol that is understood by the server.</p>
- */
-public abstract class ProxyEngine
-{
-    private static final Set<String> HOP_HEADERS = new HashSet<>();
-    static
-    {
-        HOP_HEADERS.add("proxy-connection");
-        HOP_HEADERS.add("connection");
-        HOP_HEADERS.add("keep-alive");
-        HOP_HEADERS.add("transfer-encoding");
-        HOP_HEADERS.add("te");
-        HOP_HEADERS.add("trailer");
-        HOP_HEADERS.add("proxy-authorization");
-        HOP_HEADERS.add("proxy-authenticate");
-        HOP_HEADERS.add("upgrade");
-    }
-
-    private final String name;
-
-    protected ProxyEngine()
-    {
-        this(name());
-    }
-
-    private static String name()
-    {
-        try
-        {
-            return InetAddress.getLocalHost().getHostName();
-        }
-        catch (UnknownHostException x)
-        {
-            return "localhost";
-        }
-    }
-
-    public abstract StreamFrameListener proxy(Stream clientStream, SynInfo clientSynInfo, ProxyEngineSelector.ProxyServerInfo proxyServerInfo);
-
-    protected ProxyEngine(String name)
-    {
-        this.name = name;
-    }
-
-    public String getName()
-    {
-        return name;
-    }
-
-    protected void removeHopHeaders(Fields headers)
-    {
-        // Header names are case-insensitive (RFC2616) and oej.util.Fields.add converts the names to lowercase. So we
-        // need to compare with the lowercase values only
-        for (String hopHeader : HOP_HEADERS)
-            headers.remove(hopHeader);
-    }
-
-    protected void addRequestProxyHeaders(Stream stream, Fields headers)
-    {
-        addViaHeader(headers);
-        Fields.Field schemeField = headers.get(HTTPSPDYHeader.SCHEME.name(stream.getSession().getVersion()));
-        if(schemeField != null)
-            headers.add("X-Forwarded-Proto", schemeField.getValue());
-        InetSocketAddress address = stream.getSession().getRemoteAddress();
-        if (address != null)
-        {
-            headers.add("X-Forwarded-Host", address.getHostName());
-            headers.add("X-Forwarded-For", address.toString());
-        }
-        headers.add("X-Forwarded-Server", name());
-    }
-
-    protected void addResponseProxyHeaders(Stream stream, Fields headers)
-    {
-        addViaHeader(headers);
-    }
-
-    private void addViaHeader(Fields headers)
-    {
-        headers.add("Via", "http/1.1 " + getName());
-    }
-
-    protected void customizeRequestHeaders(Stream stream, Fields headers)
-    {
-    }
-
-    protected void customizeResponseHeaders(Stream stream, Fields headers)
-    {
-    }
-
-}
diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyEngineSelector.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyEngineSelector.java
deleted file mode 100644
index 7b7be83..0000000
--- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyEngineSelector.java
+++ /dev/null
@@ -1,203 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.proxy;
-
-import java.net.InetSocketAddress;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.eclipse.jetty.spdy.api.GoAwayResultInfo;
-import org.eclipse.jetty.spdy.api.PingResultInfo;
-import org.eclipse.jetty.spdy.api.RstInfo;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/**
- * <p>{@link ProxyEngineSelector} is the main entry point for push stream events of a jetty SPDY proxy. It receives the
- * push stream frames from the clients, checks if there's an appropriate {@link ProxyServerInfo} for the given target
- * host and forwards the push to a {@link ProxyEngine} for the protocol defined in {@link ProxyServerInfo}.</p>
- *
- * <p>If no {@link ProxyServerInfo} can be found for the given target host or no {@link ProxyEngine} can be found for
- * the given protocol, it resets the client stream.</p>
- *
- * <p>This class also provides configuration for the proxy rules.</p>
- */
-public class ProxyEngineSelector extends ServerSessionFrameListener.Adapter
-{
-    protected final Logger LOG = Log.getLogger(getClass());
-    private final Map<String, ProxyServerInfo> proxyInfos = new ConcurrentHashMap<>();
-    private final Map<String, ProxyEngine> proxyEngines = new ConcurrentHashMap<>();
-
-    @Override
-    public final StreamFrameListener onSyn(final Stream clientStream, SynInfo clientSynInfo)
-    {
-        if (LOG.isDebugEnabled())
-            LOG.debug("C -> P {} on {}", clientSynInfo, clientStream);
-
-        final Session clientSession = clientStream.getSession();
-        short clientVersion = clientSession.getVersion();
-        Fields headers = new Fields(clientSynInfo.getHeaders(), false);
-
-        Fields.Field hostHeader = headers.get(HTTPSPDYHeader.HOST.name(clientVersion));
-        if (hostHeader == null)
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("No host header found: " + headers);
-            rst(clientStream);
-            return null;
-        }
-
-        String host = hostHeader.getValue();
-        int colon = host.indexOf(':');
-        if (colon >= 0)
-            host = host.substring(0, colon);
-
-        ProxyServerInfo proxyServerInfo = getProxyServerInfo(host);
-        if (proxyServerInfo == null)
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("No matching ProxyServerInfo found for: " + host);
-            rst(clientStream);
-            return null;
-        }
-
-        String protocol = proxyServerInfo.getProtocol();
-        ProxyEngine proxyEngine = proxyEngines.get(protocol);
-        if (proxyEngine == null)
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("No matching ProxyEngine found for: " + protocol);
-            rst(clientStream);
-            return null;
-        }
-        if (LOG.isDebugEnabled())
-            LOG.debug("Forwarding request: {} -> {}", clientSynInfo, proxyServerInfo);
-        return proxyEngine.proxy(clientStream, clientSynInfo, proxyServerInfo);
-    }
-
-    @Override
-    public void onPing(Session clientSession, PingResultInfo pingResultInfo)
-    {
-        // We do not know to which upstream server
-        // to send the PING so we just ignore it
-    }
-
-    @Override
-    public void onGoAway(Session session, GoAwayResultInfo goAwayResultInfo)
-    {
-        // TODO:
-    }
-
-    public Map<String, ProxyEngine> getProxyEngines()
-    {
-        return new HashMap<>(proxyEngines);
-    }
-
-    public void setProxyEngines(Map<String, ProxyEngine> proxyEngines)
-    {
-        this.proxyEngines.clear();
-        this.proxyEngines.putAll(proxyEngines);
-    }
-
-    public ProxyEngine getProxyEngine(String protocol)
-    {
-        return proxyEngines.get(protocol);
-    }
-
-    public void putProxyEngine(String protocol, ProxyEngine proxyEngine)
-    {
-        proxyEngines.put(protocol, proxyEngine);
-    }
-
-    public Map<String, ProxyServerInfo> getProxyServerInfos()
-    {
-        return new HashMap<>(proxyInfos);
-    }
-
-    protected ProxyServerInfo getProxyServerInfo(String host)
-    {
-        return proxyInfos.get(host);
-    }
-
-    public void setProxyServerInfos(Map<String, ProxyServerInfo> proxyServerInfos)
-    {
-        this.proxyInfos.clear();
-        this.proxyInfos.putAll(proxyServerInfos);
-    }
-
-    public void putProxyServerInfo(String host, ProxyServerInfo proxyServerInfo)
-    {
-        proxyInfos.put(host, proxyServerInfo);
-    }
-
-    private void rst(Stream stream)
-    {
-        RstInfo rstInfo = new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM);
-        stream.getSession().rst(rstInfo, Callback.Adapter.INSTANCE);
-    }
-
-    public static class ProxyServerInfo
-    {
-        private final String protocol;
-        private final String host;
-        private final InetSocketAddress address;
-
-        public ProxyServerInfo(String protocol, String host, int port)
-        {
-            this.protocol = protocol;
-            this.host = host;
-            this.address = new InetSocketAddress(host, port);
-        }
-
-        public String getProtocol()
-        {
-            return protocol;
-        }
-
-        public String getHost()
-        {
-            return host;
-        }
-
-        public InetSocketAddress getAddress()
-        {
-            return address;
-        }
-
-        @Override
-        public String toString()
-        {
-            return "ProxyServerInfo{" +
-                    "protocol='" + protocol + '\'' +
-                    ", host='" + host + '\'' +
-                    ", address=" + address +
-                    '}';
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyHTTPConnectionFactory.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyHTTPConnectionFactory.java
deleted file mode 100644
index b9a017a..0000000
--- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyHTTPConnectionFactory.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server.proxy;
-
-
-import org.eclipse.jetty.http.HttpVersion;
-import org.eclipse.jetty.io.Connection;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.server.AbstractConnectionFactory;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.HttpConfiguration;
-
-public class ProxyHTTPConnectionFactory extends AbstractConnectionFactory implements HttpConfiguration.ConnectionFactory
-{
-    private final short version;
-    private final ProxyEngineSelector proxyEngineSelector;
-    private final HttpConfiguration httpConfiguration;
-
-    public ProxyHTTPConnectionFactory(HttpConfiguration httpConfiguration,short version, ProxyEngineSelector proxyEngineSelector)
-    {
-        // replaces http/1.1
-        super(HttpVersion.HTTP_1_1.asString());
-        this.version = version;
-        this.proxyEngineSelector = proxyEngineSelector;
-        this.httpConfiguration=httpConfiguration;
-    }
-
-    @Override
-    public Connection newConnection(Connector connector, EndPoint endPoint)
-    {
-        return configure(new ProxyHTTPSPDYConnection(connector, httpConfiguration, endPoint, version, proxyEngineSelector),connector,endPoint);
-    }
-
-    @Override
-    public HttpConfiguration getHttpConfiguration()
-    {
-        return httpConfiguration;
-    }
-
-}
diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyHTTPSPDYConnection.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyHTTPSPDYConnection.java
deleted file mode 100644
index 02a0c09..0000000
--- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/ProxyHTTPSPDYConnection.java
+++ /dev/null
@@ -1,385 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.proxy;
-
-import java.nio.ByteBuffer;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.jetty.http.HttpField;
-import org.eclipse.jetty.http.HttpFields;
-import org.eclipse.jetty.http.HttpGenerator;
-import org.eclipse.jetty.http.HttpHeader;
-import org.eclipse.jetty.http.HttpHeaderValue;
-import org.eclipse.jetty.http.HttpMethod;
-import org.eclipse.jetty.http.HttpParser;
-import org.eclipse.jetty.http.HttpVersion;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.HttpConnection;
-import org.eclipse.jetty.server.SslConnectionFactory;
-import org.eclipse.jetty.spdy.ISession;
-import org.eclipse.jetty.spdy.IStream;
-import org.eclipse.jetty.spdy.StandardSession;
-import org.eclipse.jetty.spdy.StandardStream;
-import org.eclipse.jetty.spdy.api.ByteBufferDataInfo;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.GoAwayInfo;
-import org.eclipse.jetty.spdy.api.GoAwayResultInfo;
-import org.eclipse.jetty.spdy.api.HeadersInfo;
-import org.eclipse.jetty.spdy.api.PushInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.RstInfo;
-import org.eclipse.jetty.spdy.api.SessionStatus;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.Promise;
-
-public class ProxyHTTPSPDYConnection extends HttpConnection implements HttpParser.RequestHandler<ByteBuffer>
-{
-    private final short version;
-    private final Fields headers = new Fields();
-    private final ProxyEngineSelector proxyEngineSelector;
-    private final ISession session;
-    private HTTPStream stream;
-    private ByteBuffer content;
-
-    public ProxyHTTPSPDYConnection(Connector connector, HttpConfiguration config, EndPoint endPoint, short version, ProxyEngineSelector proxyEngineSelector)
-    {
-        super(config, connector, endPoint);
-        this.version = version;
-        this.proxyEngineSelector = proxyEngineSelector;
-        this.session = new HTTPSession(version, connector);
-    }
-
-    @Override
-    protected HttpParser.RequestHandler<ByteBuffer> newRequestHandler()
-    {
-        return this;
-    }
-
-    @Override
-    public boolean startRequest(HttpMethod method, String methodString, ByteBuffer uri, HttpVersion httpVersion)
-    {
-        Connector connector = getConnector();
-        String scheme = connector.getConnectionFactory(SslConnectionFactory.class) != null ? "https" : "http";
-        headers.put(HTTPSPDYHeader.SCHEME.name(version), scheme);
-        headers.put(HTTPSPDYHeader.METHOD.name(version), methodString);
-        headers.put(HTTPSPDYHeader.URI.name(version), BufferUtil.toUTF8String(uri)); // TODO handle bad encodings
-        headers.put(HTTPSPDYHeader.VERSION.name(version), httpVersion.asString());
-        return false;
-    }
-
-    @Override
-    public boolean parsedHeader(HttpField field)
-    {
-        if (field.getHeader() == HttpHeader.HOST)
-            headers.put(HTTPSPDYHeader.HOST.name(version), field.getValue());
-        else
-            headers.put(field.getName(), field.getValue());
-        return false;
-    }
-
-    @Override
-    public boolean parsedHostHeader(String host, int port)
-    {
-        return false;
-    }
-
-    @Override
-    public boolean headerComplete()
-    {
-        return false;
-    }
-
-    @Override
-    public boolean content(ByteBuffer item)
-    {
-        if (content == null)
-        {
-            stream = syn(false);
-            content = item;
-        }
-        else
-        {
-            stream.getStreamFrameListener().onData(stream, toDataInfo(item, false));
-        }
-        return false;
-    }
-
-    @Override
-    public boolean messageComplete()
-    {
-        if (stream == null)
-        {
-            assert content == null;
-            if (headers.isEmpty())
-                proxyEngineSelector.onGoAway(session, new GoAwayResultInfo(0, SessionStatus.OK));
-            else
-                syn(true);
-        }
-        else
-        {
-            stream.getStreamFrameListener().onData(stream, toDataInfo(content, true));
-        }
-        return false;
-    }
-
-    @Override
-    public void completed()
-    {
-        headers.clear();
-        stream = null;
-        content = null;
-        super.completed();
-    }
-
-    @Override
-    public int getHeaderCacheSize()
-    {
-        // TODO get from configuration
-        return 256;
-    }
-
-    @Override
-    public void earlyEOF()
-    {
-        // TODO
-    }
-
-    @Override
-    public void badMessage(int status, String reason)
-    {
-        // TODO
-    }
-
-    private HTTPStream syn(boolean close)
-    {
-        HTTPStream stream = new HTTPStream(1, (byte)0, session, null);
-        StreamFrameListener streamFrameListener = proxyEngineSelector.onSyn(stream, new SynInfo(headers, close));
-        stream.setStreamFrameListener(streamFrameListener);
-        return stream;
-    }
-
-    private DataInfo toDataInfo(ByteBuffer buffer, boolean close)
-    {
-        return new ByteBufferDataInfo(buffer, close);
-    }
-
-    private class HTTPSession extends StandardSession
-    {
-        private HTTPSession(short version, Connector connector)
-        {
-            super(version, connector.getByteBufferPool(), connector.getScheduler(), null,
-                    getEndPoint(), null, 1, proxyEngineSelector, null, null);
-        }
-
-        @Override
-        public void rst(RstInfo rstInfo, Callback handler)
-        {
-            HttpGenerator.ResponseInfo info = new HttpGenerator.ResponseInfo(HttpVersion.fromString(headers.get
-                    ("version").getValue()), null, 0, 502, "SPDY reset received from upstream server", false);
-            send(info, null, true, Callback.Adapter.INSTANCE);
-        }
-
-        @Override
-        public void goAway(GoAwayInfo goAwayInfo, Callback handler)
-        {
-            ProxyHTTPSPDYConnection.this.close();
-            handler.succeeded();
-        }
-    }
-
-    /**
-     * <p>This stream will convert the SPDY invocations performed by the proxy into HTTP to be sent to the client.</p>
-     */
-    private class HTTPStream extends StandardStream
-    {
-        private final Pattern statusRegexp = Pattern.compile("(\\d{3})\\s+(.*)");
-
-        private HTTPStream(int id, byte priority, ISession session, IStream associatedStream)
-        {
-            super(id, priority, session, associatedStream, getHttpChannel().getScheduler(), null);
-        }
-
-        @Override
-        public void push(PushInfo pushInfo, Promise<Stream> handler)
-        {
-            // HTTP does not support pushed streams
-            handler.succeeded(new HTTPPushStream(2, getPriority(), getSession(), this));
-        }
-
-        @Override
-        public void headers(HeadersInfo headersInfo, Callback handler)
-        {
-            // TODO
-            throw new UnsupportedOperationException("Not Yet Implemented");
-        }
-
-        @Override
-        public void reply(ReplyInfo replyInfo, final Callback handler)
-        {
-            Fields headers = new Fields(replyInfo.getHeaders(), false);
-
-                addPersistenceHeader(headers);
-
-            headers.remove(HTTPSPDYHeader.SCHEME.name(version));
-
-            String status = headers.remove(HTTPSPDYHeader.STATUS.name(version)).getValue();
-            Matcher matcher = statusRegexp.matcher(status);
-            matcher.matches();
-            int code = Integer.parseInt(matcher.group(1));
-            String reason = matcher.group(2).trim();
-
-            HttpVersion httpVersion = HttpVersion.fromString(headers.remove(HTTPSPDYHeader.VERSION.name(version)).getValue());
-
-            // Convert the Host header from a SPDY special header to a normal header
-            Fields.Field host = headers.remove(HTTPSPDYHeader.HOST.name(version));
-            if (host != null)
-                headers.put("host", host.getValue());
-
-            HttpFields fields = new HttpFields();
-            for (Fields.Field header : headers)
-            {
-                String name = camelize(header.getName());
-                fields.put(name, header.getValue());
-            }
-
-            // TODO: handle better the HEAD last parameter
-            long contentLength = fields.getLongField(HttpHeader.CONTENT_LENGTH.asString());
-            HttpGenerator.ResponseInfo info = new HttpGenerator.ResponseInfo(httpVersion, fields, contentLength, code,
-                    reason, false);
-
-            send(info, null, replyInfo.isClose(), new Adapter()
-            {
-                @Override
-                public void failed(Throwable x)
-                {
-                    handler.failed(x);
-                }
-            });
-
-            if (replyInfo.isClose())
-                completed();
-
-            handler.succeeded();
-        }
-
-        private String camelize(String name)
-        {
-            char[] chars = name.toCharArray();
-            chars[0] = Character.toUpperCase(chars[0]);
-
-            for (int i = 0; i < chars.length; ++i)
-            {
-                char c = chars[i];
-                int j = i + 1;
-                if (c == '-' && j < chars.length)
-                    chars[j] = Character.toUpperCase(chars[j]);
-            }
-            return new String(chars);
-        }
-
-        @Override
-        public void data(DataInfo dataInfo, final Callback handler)
-        {
-            // Data buffer must be copied, as the ByteBuffer is pooled
-            ByteBuffer byteBuffer = dataInfo.asByteBuffer(false);
-
-            send(null, byteBuffer, dataInfo.isClose(), new Adapter()
-            {
-                @Override
-                public void failed(Throwable x)
-                {
-                    handler.failed(x);
-                }
-            });
-
-            if (dataInfo.isClose())
-                completed();
-
-            handler.succeeded();
-        }
-    }
-
-    private void addPersistenceHeader(Fields headersToAddTo)
-    {
-        HttpVersion httpVersion = HttpVersion.fromString(headers.get("version").getValue());
-        boolean persistent = false;
-        switch (httpVersion)
-        {
-            case HTTP_1_0:
-            {
-                Fields.Field keepAliveHeader = headers.get(HttpHeader.KEEP_ALIVE.asString());
-                if(keepAliveHeader!=null)
-                    persistent = HttpHeaderValue.KEEP_ALIVE.asString().equals(keepAliveHeader.getValue());
-                if (!persistent)
-                    persistent = HttpMethod.CONNECT.is(headers.get("method").getValue());
-                if (persistent)
-                    headersToAddTo.add(HttpHeader.CONNECTION.asString(), HttpHeaderValue.KEEP_ALIVE.asString());
-                break;
-            }
-            case HTTP_1_1:
-            {
-                Fields.Field connectionHeader = headers.get(HttpHeader.CONNECTION.asString());
-                if(connectionHeader != null)
-                    persistent = !HttpHeaderValue.CLOSE.asString().equals(connectionHeader.getValue());
-                else
-                    persistent = true;
-                if (!persistent)
-                    persistent = HttpMethod.CONNECT.is(headers.get("method").getValue());
-                if (!persistent)
-                    headersToAddTo.add(HttpHeader.CONNECTION.asString(), HttpHeaderValue.CLOSE.asString());
-                break;
-            }
-            default:
-            {
-                throw new IllegalStateException();
-            }
-        }
-    }
-
-    private class HTTPPushStream extends StandardStream
-    {
-        private HTTPPushStream(int id, byte priority, ISession session, IStream associatedStream)
-        {
-            super(id, priority, session, associatedStream, getHttpChannel().getScheduler(), null);
-        }
-
-        @Override
-        public void headers(HeadersInfo headersInfo, Callback handler)
-        {
-            // Ignore pushed headers
-            handler.succeeded();
-        }
-
-        @Override
-        public void data(DataInfo dataInfo, Callback handler)
-        {
-            // Ignore pushed data
-            handler.succeeded();
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/SPDYProxyEngine.java b/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/SPDYProxyEngine.java
deleted file mode 100644
index b1897a6..0000000
--- a/jetty-spdy/spdy-http-server/src/main/java/org/eclipse/jetty/spdy/server/proxy/SPDYProxyEngine.java
+++ /dev/null
@@ -1,631 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server.proxy;
-
-import java.net.InetSocketAddress;
-import java.util.LinkedList;
-import java.util.Queue;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.spdy.api.ByteBufferDataInfo;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.GoAwayInfo;
-import org.eclipse.jetty.spdy.api.GoAwayResultInfo;
-import org.eclipse.jetty.spdy.api.HeadersInfo;
-import org.eclipse.jetty.spdy.api.Info;
-import org.eclipse.jetty.spdy.api.PushInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.RstInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.client.SPDYClient;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.Promise;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/**
- * <p>{@link SPDYProxyEngine} implements a SPDY to SPDY proxy, that is, converts SPDY events received by clients into
- * SPDY events for the servers.</p>
- */
-public class SPDYProxyEngine extends ProxyEngine implements StreamFrameListener
-{
-    private static final Logger LOG = Log.getLogger(SPDYProxyEngine.class);
-
-    private static final String STREAM_PROMISE_ATTRIBUTE = "org.eclipse.jetty.spdy.server.http.proxy.streamPromise";
-    private static final String CLIENT_STREAM_ATTRIBUTE = "org.eclipse.jetty.spdy.server.http.proxy.clientStream";
-
-    private final ConcurrentMap<String, Session> serverSessions = new ConcurrentHashMap<>();
-    private final SessionFrameListener sessionListener = new ProxySessionFrameListener();
-    private final SPDYClient.Factory factory;
-    private volatile long connectTimeout = 15000;
-    private volatile long timeout = 60000;
-
-    public SPDYProxyEngine(SPDYClient.Factory factory)
-    {
-        this.factory = factory;
-    }
-
-    public long getConnectTimeout()
-    {
-        return connectTimeout;
-    }
-
-    public void setConnectTimeout(long connectTimeout)
-    {
-        this.connectTimeout = connectTimeout;
-    }
-
-    public long getTimeout()
-    {
-        return timeout;
-    }
-
-    public void setTimeout(long timeout)
-    {
-        this.timeout = timeout;
-    }
-
-    public StreamFrameListener proxy(final Stream clientStream, SynInfo clientSynInfo, ProxyEngineSelector.ProxyServerInfo proxyServerInfo)
-    {
-        Fields headers = new Fields(clientSynInfo.getHeaders(), false);
-
-        short serverVersion = getVersion(proxyServerInfo.getProtocol());
-        InetSocketAddress address = proxyServerInfo.getAddress();
-        Session serverSession = produceSession(proxyServerInfo.getHost(), serverVersion, address);
-        if (serverSession == null)
-        {
-            rst(clientStream);
-            return null;
-        }
-
-        final Session clientSession = clientStream.getSession();
-
-        addRequestProxyHeaders(clientStream, headers);
-        customizeRequestHeaders(clientStream, headers);
-        convert(clientSession.getVersion(), serverVersion, headers);
-
-        SynInfo serverSynInfo = new SynInfo(headers, clientSynInfo.isClose());
-        StreamFrameListener listener = new ProxyStreamFrameListener(clientStream);
-        StreamPromise promise = new StreamPromise(clientStream, serverSynInfo);
-        clientStream.setAttribute(STREAM_PROMISE_ATTRIBUTE, promise);
-        serverSession.syn(serverSynInfo, listener, promise);
-        return this;
-    }
-
-    private static short getVersion(String protocol)
-    {
-        switch (protocol)
-        {
-            case "spdy/2":
-                return SPDY.V2;
-            case "spdy/3":
-                return SPDY.V3;
-            default:
-                throw new IllegalArgumentException("Procotol: " + protocol + " is not a known SPDY protocol");
-        }
-    }
-
-    @Override
-    public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-    {
-        throw new IllegalStateException("We shouldn't receive pushes from clients");
-    }
-
-    @Override
-    public void onReply(Stream stream, ReplyInfo replyInfo)
-    {
-        throw new IllegalStateException("Servers do not receive replies");
-    }
-
-    @Override
-    public void onHeaders(Stream stream, HeadersInfo headersInfo)
-    {
-        // TODO
-        throw new UnsupportedOperationException("Not Yet Implemented");
-    }
-
-    @Override
-    public void onData(Stream clientStream, final DataInfo clientDataInfo)
-    {
-        if (LOG.isDebugEnabled())
-            LOG.debug("C -> P {} on {}", clientDataInfo, clientStream);
-
-        ByteBufferDataInfo serverDataInfo = new ByteBufferDataInfo(clientDataInfo.asByteBuffer(false), clientDataInfo.isClose())
-        {
-            @Override
-            public void consume(int delta)
-            {
-                super.consume(delta);
-                clientDataInfo.consume(delta);
-            }
-        };
-
-        StreamPromise streamPromise = (StreamPromise)clientStream.getAttribute(STREAM_PROMISE_ATTRIBUTE);
-        streamPromise.data(serverDataInfo);
-    }
-
-    @Override
-    public void onFailure(Stream stream, Throwable x)
-    {
-        LOG.debug(x);
-    }
-
-    private Session produceSession(String host, short version, InetSocketAddress address)
-    {
-        try
-        {
-            Session session = serverSessions.get(host);
-            if (session == null)
-            {
-                SPDYClient client = factory.newSPDYClient(version);
-                session = client.connect(address, sessionListener);
-                if (LOG.isDebugEnabled())
-                    LOG.debug("Proxy session connected to {}", address);
-                Session existing = serverSessions.putIfAbsent(host, session);
-                if (existing != null)
-                {
-                    session.goAway(new GoAwayInfo(), Callback.Adapter.INSTANCE);
-                    session = existing;
-                }
-            }
-            return session;
-        }
-        catch (Exception x)
-        {
-            LOG.debug(x);
-            return null;
-        }
-    }
-
-    private void convert(short fromVersion, short toVersion, Fields headers)
-    {
-        if (fromVersion != toVersion)
-        {
-            for (HTTPSPDYHeader httpHeader : HTTPSPDYHeader.values())
-            {
-                Fields.Field header = headers.remove(httpHeader.name(fromVersion));
-                if (header != null)
-                {
-                    String toName = httpHeader.name(toVersion);
-                    for (String value : header.getValues())
-                        headers.add(toName, value);
-                }
-            }
-        }
-    }
-
-    private void rst(Stream stream)
-    {
-        RstInfo rstInfo = new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM);
-        stream.getSession().rst(rstInfo, Callback.Adapter.INSTANCE);
-    }
-
-    private class ProxyPushStreamFrameListener implements StreamFrameListener
-    {
-        private PushStreamPromise pushStreamPromise;
-
-        private ProxyPushStreamFrameListener(PushStreamPromise pushStreamPromise)
-        {
-            this.pushStreamPromise = pushStreamPromise;
-        }
-
-        @Override
-        public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("S -> P pushed {} on {}. Opening new PushStream P -> C now.", pushInfo, stream);
-            PushStreamPromise newPushStreamPromise = new PushStreamPromise(stream, pushInfo);
-            this.pushStreamPromise.push(newPushStreamPromise);
-            return new ProxyPushStreamFrameListener(newPushStreamPromise);
-        }
-
-        @Override
-        public void onReply(Stream stream, ReplyInfo replyInfo)
-        {
-            // Push streams never send a reply
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void onHeaders(Stream stream, HeadersInfo headersInfo)
-        {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void onData(Stream serverStream, final DataInfo serverDataInfo)
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("S -> P pushed {} on {}", serverDataInfo, serverStream);
-
-            ByteBufferDataInfo clientDataInfo = new ByteBufferDataInfo(serverDataInfo.asByteBuffer(false), serverDataInfo.isClose())
-            {
-                @Override
-                public void consume(int delta)
-                {
-                    super.consume(delta);
-                    serverDataInfo.consume(delta);
-                }
-            };
-
-            pushStreamPromise.data(clientDataInfo);
-        }
-
-        @Override
-        public void onFailure(Stream stream, Throwable x)
-        {
-            LOG.debug(x);
-        }
-    }
-
-    private class ProxyStreamFrameListener extends StreamFrameListener.Adapter
-    {
-        private final Stream receiverStream;
-
-        public ProxyStreamFrameListener(Stream receiverStream)
-        {
-            this.receiverStream = receiverStream;
-        }
-
-        @Override
-        public StreamFrameListener onPush(Stream senderStream, PushInfo pushInfo)
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("S -> P {} on {}");
-            PushInfo newPushInfo = convertPushInfo(pushInfo, senderStream, receiverStream);
-            PushStreamPromise pushStreamPromise = new PushStreamPromise(senderStream, newPushInfo);
-            receiverStream.push(newPushInfo, pushStreamPromise);
-            return new ProxyPushStreamFrameListener(pushStreamPromise);
-        }
-
-        @Override
-        public void onReply(final Stream stream, ReplyInfo replyInfo)
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("S -> P {} on {}", replyInfo, stream);
-            final ReplyInfo clientReplyInfo = new ReplyInfo(convertHeaders(stream, receiverStream, replyInfo.getHeaders()),
-                    replyInfo.isClose());
-            reply(stream, clientReplyInfo);
-        }
-
-        private void reply(final Stream stream, final ReplyInfo clientReplyInfo)
-        {
-            receiverStream.reply(clientReplyInfo, new Callback()
-            {
-                @Override
-                public void succeeded()
-                {
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("P -> C {} from {} to {}", clientReplyInfo, stream, receiverStream);
-                }
-
-                @Override
-                public void failed(Throwable x)
-                {
-                    LOG.debug(x);
-                    rst(receiverStream);
-                }
-            });
-        }
-
-        @Override
-        public void onHeaders(Stream stream, HeadersInfo headersInfo)
-        {
-            // TODO
-            throw new UnsupportedOperationException("Not Yet Implemented");
-        }
-
-        @Override
-        public void onData(final Stream stream, final DataInfo dataInfo)
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("S -> P {} on {}", dataInfo, stream);
-            data(stream, dataInfo);
-        }
-
-        private void data(final Stream stream, final DataInfo serverDataInfo)
-        {
-            final ByteBufferDataInfo clientDataInfo = new ByteBufferDataInfo(serverDataInfo.asByteBuffer(false), serverDataInfo.isClose())
-            {
-                @Override
-                public void consume(int delta)
-                {
-                    super.consume(delta);
-                    serverDataInfo.consume(delta);
-                }
-            };
-
-            receiverStream.data(clientDataInfo, new Callback() //TODO: timeout???
-            {
-                @Override
-                public void succeeded()
-                {
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("P -> C {} from {} to {}", clientDataInfo, stream, receiverStream);
-                }
-
-                @Override
-                public void failed(Throwable x)
-                {
-                    LOG.debug(x);
-                    rst(receiverStream);
-                }
-            });
-        }
-    }
-
-    /**
-     * <p>{@link StreamPromise} implements the forwarding of DATA frames from the client to the server and vice
-     * versa.</p> <p>Instances of this class buffer DATA frames sent by clients and send them to the server. The
-     * buffering happens between the send of the SYN_STREAM to the server (where DATA frames may arrive from the client
-     * before the SYN_STREAM has been fully sent), and between DATA frames, if the client is a fast producer and the
-     * server a slow consumer, or if the client is a SPDY v2 client (and hence without flow control) while the server is
-     * a SPDY v3 server (and hence with flow control).</p>
-     */
-    private class StreamPromise implements Promise<Stream>
-    {
-        private final Queue<DataInfoCallback> queue = new LinkedList<>();
-        private final Stream senderStream;
-        private final Info info;
-        private Stream receiverStream;
-
-        private StreamPromise(Stream senderStream, Info info)
-        {
-            this.senderStream = senderStream;
-            this.info = info;
-        }
-
-        @Override
-        public void succeeded(Stream stream)
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("P -> S {} from {} to {}", info, senderStream, stream);
-
-            stream.setAttribute(CLIENT_STREAM_ATTRIBUTE, senderStream);
-
-            DataInfoCallback dataInfoCallback;
-            synchronized (queue)
-            {
-                this.receiverStream = stream;
-                dataInfoCallback = queue.peek();
-                if (dataInfoCallback != null)
-                {
-                    if (dataInfoCallback.flushing)
-                    {
-                        if (LOG.isDebugEnabled())
-                            LOG.debug("SYN completed, flushing {}, queue size {}", dataInfoCallback.dataInfo, queue.size());
-                        dataInfoCallback = null;
-                    }
-                    else
-                    {
-                        dataInfoCallback.flushing = true;
-                        if (LOG.isDebugEnabled())
-                            LOG.debug("SYN completed, queue size {}", queue.size());
-                    }
-                }
-                else
-                {
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("SYN completed, queue empty");
-                }
-            }
-            if (dataInfoCallback != null)
-                flush(stream, dataInfoCallback);
-        }
-
-        @Override
-        public void failed(Throwable x)
-        {
-            LOG.debug(x);
-            rst(senderStream);
-        }
-
-        public void data(DataInfo dataInfo)
-        {
-            Stream receiverStream;
-            DataInfoCallback dataInfoCallbackToFlush = null;
-            DataInfoCallback dataInfoCallBackToQueue = new DataInfoCallback(dataInfo);
-            synchronized (queue)
-            {
-                queue.offer(dataInfoCallBackToQueue);
-                receiverStream = this.receiverStream;
-                if (receiverStream != null)
-                {
-                    dataInfoCallbackToFlush = queue.peek();
-                    if (dataInfoCallbackToFlush.flushing)
-                    {
-                        if (LOG.isDebugEnabled())
-                            LOG.debug("Queued {}, flushing {}, queue size {}", dataInfo, dataInfoCallbackToFlush.dataInfo, queue.size());
-                        receiverStream = null;
-                    }
-                    else
-                    {
-                        dataInfoCallbackToFlush.flushing = true;
-                        if (LOG.isDebugEnabled())
-                            LOG.debug("Queued {}, queue size {}", dataInfo, queue.size());
-                    }
-                }
-                else
-                {
-                    if (LOG.isDebugEnabled())
-                        LOG.debug("Queued {}, SYN incomplete, queue size {}", dataInfo, queue.size());
-                }
-            }
-            if (receiverStream != null)
-                flush(receiverStream, dataInfoCallbackToFlush);
-        }
-
-        private void flush(Stream receiverStream, DataInfoCallback dataInfoCallback)
-        {
-            if (LOG.isDebugEnabled())
-                LOG.debug("P -> S {} on {}", dataInfoCallback.dataInfo, receiverStream);
-            receiverStream.data(dataInfoCallback.dataInfo, dataInfoCallback); //TODO: timeout???
-        }
-
-        private class DataInfoCallback implements Callback
-        {
-            private final DataInfo dataInfo;
-            private boolean flushing;
-
-            private DataInfoCallback(DataInfo dataInfo)
-            {
-                this.dataInfo = dataInfo;
-            }
-
-            @Override
-            public void succeeded()
-            {
-                Stream serverStream;
-                DataInfoCallback dataInfoCallback;
-                synchronized (queue)
-                {
-                    serverStream = StreamPromise.this.receiverStream;
-                    assert serverStream != null;
-                    dataInfoCallback = queue.poll();
-                    assert dataInfoCallback == this;
-                    dataInfoCallback = queue.peek();
-                    if (dataInfoCallback != null)
-                    {
-                        assert !dataInfoCallback.flushing;
-                        dataInfoCallback.flushing = true;
-                        if (LOG.isDebugEnabled())
-                            LOG.debug("Completed {}, queue size {}", dataInfo, queue.size());
-                    }
-                    else
-                    {
-                        if (LOG.isDebugEnabled())
-                            LOG.debug("Completed {}, queue empty", dataInfo);
-                    }
-                }
-                if (dataInfoCallback != null)
-                    flush(serverStream, dataInfoCallback);
-            }
-
-            @Override
-            public void failed(Throwable x)
-            {
-                LOG.debug(x);
-                rst(senderStream);
-            }
-        }
-
-        public Stream getSenderStream()
-        {
-            return senderStream;
-        }
-
-        public Info getInfo()
-        {
-            return info;
-        }
-
-        public Stream getReceiverStream()
-        {
-            synchronized (queue)
-            {
-                return receiverStream;
-            }
-        }
-    }
-
-    private class PushStreamPromise extends StreamPromise
-    {
-        private volatile PushStreamPromise pushStreamPromise;
-
-        private PushStreamPromise(Stream senderStream, PushInfo pushInfo)
-        {
-            super(senderStream, pushInfo);
-        }
-
-        @Override
-        public void succeeded(Stream receiverStream)
-        {
-            super.succeeded(receiverStream);
-
-            if (LOG.isDebugEnabled())
-                LOG.debug("P -> C PushStreamPromise.succeeded() called with pushStreamPromise: {}", pushStreamPromise);
-
-            PushStreamPromise promise = pushStreamPromise;
-            if (promise != null)
-                receiverStream.push(convertPushInfo((PushInfo)getInfo(), getSenderStream(), receiverStream), pushStreamPromise);
-        }
-
-        public void push(PushStreamPromise pushStreamPromise)
-        {
-            Stream receiverStream = getReceiverStream();
-
-            if (receiverStream != null)
-                receiverStream.push(convertPushInfo((PushInfo)getInfo(), getSenderStream(), receiverStream), pushStreamPromise);
-            else
-                this.pushStreamPromise = pushStreamPromise;
-        }
-    }
-
-    private class ProxySessionFrameListener extends SessionFrameListener.Adapter
-    {
-        @Override
-        public void onRst(Session serverSession, RstInfo serverRstInfo)
-        {
-            Stream serverStream = serverSession.getStream(serverRstInfo.getStreamId());
-            if (serverStream != null)
-            {
-                Stream clientStream = (Stream)serverStream.getAttribute(CLIENT_STREAM_ATTRIBUTE);
-                if (clientStream != null)
-                {
-                    Session clientSession = clientStream.getSession();
-                    RstInfo clientRstInfo = new RstInfo(clientStream.getId(), serverRstInfo.getStreamStatus());
-                    clientSession.rst(clientRstInfo, Callback.Adapter.INSTANCE);
-                }
-            }
-        }
-
-        @Override
-        public void onGoAway(Session serverSession, GoAwayResultInfo goAwayResultInfo)
-        {
-            serverSessions.values().remove(serverSession);
-        }
-    }
-
-    private PushInfo convertPushInfo(PushInfo pushInfo, Stream from, Stream to)
-    {
-        Fields headersToConvert = pushInfo.getHeaders();
-        Fields headers = convertHeaders(from, to, headersToConvert);
-        return new PushInfo(getTimeout(), TimeUnit.MILLISECONDS, headers, pushInfo.isClose());
-    }
-
-    private Fields convertHeaders(Stream from, Stream to, Fields headersToConvert)
-    {
-        Fields headers = new Fields(headersToConvert, false);
-        addResponseProxyHeaders(from, headers);
-        customizeResponseHeaders(from, headers);
-        convert(from.getSession().getVersion(), to.getSession().getVersion(), headers);
-        return headers;
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/AbstractHTTPSPDYTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/AbstractHTTPSPDYTest.java
deleted file mode 100644
index 7812970..0000000
--- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/AbstractHTTPSPDYTest.java
+++ /dev/null
@@ -1,136 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.http;
-
-import java.net.InetSocketAddress;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.concurrent.Executor;
-
-import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.client.SPDYClient;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.StdErrLog;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.junit.After;
-import org.junit.Rule;
-import org.junit.rules.TestWatcher;
-import org.junit.runner.Description;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-@RunWith(Parameterized.class)
-public abstract class AbstractHTTPSPDYTest
-{
-    @Parameterized.Parameters
-    public static Collection<Short[]> parameters()
-    {
-        return Arrays.asList(new Short[]{SPDY.V2}, new Short[]{SPDY.V3});
-    }
-
-    @Rule
-    public final TestWatcher testName = new TestWatcher()
-    {
-
-        @Override
-        public void starting(Description description)
-        {
-            super.starting(description);
-            System.err.printf("Running %s.%s()%n",
-                    description.getClassName(),
-                    description.getMethodName());
-        }
-    };
-
-    protected final short version;
-    protected Server server;
-    protected SPDYClient.Factory clientFactory;
-    protected HTTPSPDYServerConnector connector;
-
-    protected AbstractHTTPSPDYTest(short version)
-    {
-        this.version = version;
-    }
-
-    protected InetSocketAddress startHTTPServer(short version, Handler handler, long idleTimeout) throws Exception
-    {
-        QueuedThreadPool threadPool = new QueuedThreadPool(256);
-        threadPool.setName("serverQTP");
-        server = new Server(threadPool);
-        connector = newHTTPSPDYServerConnector(version);
-        connector.setPort(0);
-        connector.setIdleTimeout(idleTimeout);
-        server.addConnector(connector);
-        server.setHandler(handler);
-        server.start();
-        return new InetSocketAddress("localhost", connector.getLocalPort());
-    }
-
-    protected Server getServer()
-    {
-        return server;
-    }
-
-    protected HTTPSPDYServerConnector newHTTPSPDYServerConnector(short version)
-    {
-        // For these tests, we need the connector to speak HTTP over SPDY even in non-SSL
-        HttpConfiguration httpConfiguration = new HttpConfiguration();
-        httpConfiguration.setSendServerVersion(true);
-        httpConfiguration.setSendXPoweredBy(true);
-        return new HTTPSPDYServerConnector(server, version, httpConfiguration, new PushStrategy.None());
-    }
-
-    protected Session startClient(short version, InetSocketAddress socketAddress, SessionFrameListener listener) throws Exception
-    {
-        if (clientFactory == null)
-        {
-            QueuedThreadPool threadPool = new QueuedThreadPool();
-            threadPool.setName(threadPool.getName() + "-client");
-            clientFactory = newSPDYClientFactory(threadPool);
-            clientFactory.start();
-        }
-        return clientFactory.newSPDYClient(version).connect(socketAddress, listener);
-    }
-
-    protected SPDYClient.Factory newSPDYClientFactory(Executor threadPool)
-    {
-        return new SPDYClient.Factory(threadPool, null, null, connector.getIdleTimeout());
-    }
-
-    @After
-    public void destroy() throws Exception
-    {
-        ((StdErrLog)Log.getLogger(HTTPSPDYServerConnector.class)).setHideStacks(true);
-        if (clientFactory != null)
-        {
-            clientFactory.stop();
-        }
-        if (server != null)
-        {
-            server.stop();
-            server.join();
-        }
-        ((StdErrLog)Log.getLogger(HTTPSPDYServerConnector.class)).setHideStacks(false);
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ConcurrentStreamsTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ConcurrentStreamsTest.java
deleted file mode 100644
index 2621713..0000000
--- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ConcurrentStreamsTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.http;
-
-import java.io.IOException;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.util.Fields;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class ConcurrentStreamsTest extends AbstractHTTPSPDYTest
-{
-    public ConcurrentStreamsTest(short version)
-    {
-        super(version);
-    }
-
-    @Test
-    public void testSlowStreamDoesNotBlockOtherStreams() throws Exception
-    {
-        final CountDownLatch slowServerLatch = new CountDownLatch(1);
-        final CountDownLatch fastServerLatch = new CountDownLatch(1);
-        final String fastPath = "/fast";
-        final String slowPath = "/slow";
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                try
-                {
-                    request.setHandled(true);
-                    switch (target)
-                    {
-                        case slowPath:
-                            Assert.assertTrue(fastServerLatch.await(10, TimeUnit.SECONDS));
-                            slowServerLatch.countDown();
-                            break;
-                        case fastPath:
-                            fastServerLatch.countDown();
-                            break;
-                        default:
-                            Assert.fail();
-                            break;
-                    }
-                }
-                catch (InterruptedException x)
-                {
-                    throw new ServletException(x);
-                }
-            }
-        }, 30000), null);
-
-        // Perform slow request. This will wait on server side until the fast request wakes it up
-        Fields headers = createHeaders(slowPath);
-        final CountDownLatch slowClientLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields replyHeaders = replyInfo.getHeaders();
-                Assert.assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                slowClientLatch.countDown();
-            }
-        });
-
-        // Perform the fast request. This will wake up the slow request
-        headers = createHeaders(fastPath);
-        final CountDownLatch fastClientLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields replyHeaders = replyInfo.getHeaders();
-                Assert.assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                fastClientLatch.countDown();
-            }
-        });
-
-        Assert.assertTrue(fastServerLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(slowServerLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(fastClientLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(slowClientLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    private Fields createHeaders(String path)
-    {
-        Fields headers = new Fields();
-        headers.put(HTTPSPDYHeader.METHOD.name(version), "GET");
-        headers.put(HTTPSPDYHeader.URI.name(version), path);
-        headers.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1");
-        headers.put(HTTPSPDYHeader.HOST.name(version), "localhost:" + connector.getLocalPort());
-        return headers;
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDYTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDYTest.java
deleted file mode 100644
index 6d12da6..0000000
--- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/HttpTransportOverSPDYTest.java
+++ /dev/null
@@ -1,288 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.http;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.Random;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.http.HttpGenerator;
-import org.eclipse.jetty.http.HttpStatus;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.spdy.api.ByteBufferDataInfo;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-@RunWith(MockitoJUnitRunner.class)
-public class HttpTransportOverSPDYTest
-{
-    @Mock
-    Connector connector;
-    @Mock
-    HttpConfiguration httpConfiguration;
-    @Mock
-    EndPoint endPoint;
-    @Mock
-    PushStrategy pushStrategy;
-    @Mock
-    Stream stream;
-    @Mock
-    Callback callback;
-    @Mock
-    Session session;
-    @Mock
-    HttpGenerator.ResponseInfo responseInfo;
-
-    Random random = new Random();
-    short version = SPDY.V3;
-
-    HttpTransportOverSPDY httpTransportOverSPDY;
-
-    @Before
-    public void setUp() throws Exception
-    {
-        Fields requestHeaders = new Fields();
-        requestHeaders.add(HTTPSPDYHeader.METHOD.name(version), "GET");
-        when(responseInfo.getStatus()).thenReturn(HttpStatus.OK_200);
-        when(stream.getSession()).thenReturn(session);
-        when(session.getVersion()).thenReturn(SPDY.V3);
-        when(stream.isClosed()).thenReturn(false);
-        httpTransportOverSPDY = new HttpTransportOverSPDY(connector, httpConfiguration, endPoint, pushStrategy,
-                stream, requestHeaders);
-    }
-
-    @Test
-    public void testSendWithResponseInfoNullAndContentNullAndLastContentTrue() throws Exception
-    {
-        ByteBuffer content = null;
-        boolean lastContent = true;
-
-        httpTransportOverSPDY.send(null, content, lastContent, callback);
-        ArgumentCaptor<ByteBufferDataInfo> dataInfoCaptor = ArgumentCaptor.forClass(ByteBufferDataInfo.class);
-        ArgumentCaptor<Callback> callbackCaptor = ArgumentCaptor.forClass(Callback.class);
-        verify(stream, times(1)).data(dataInfoCaptor.capture(), callbackCaptor.capture());
-        callbackCaptor.getValue().succeeded();
-        verify(callback, times(1)).succeeded();
-        assertThat("lastContent is true", dataInfoCaptor.getValue().isClose(), is(true));
-        assertThat("ByteBuffer is empty", dataInfoCaptor.getValue().length(), is(0));
-    }
-
-    @Test
-    public void testSendWithResponseInfoNullAndContentAndLastContentTrue() throws Exception
-    {
-        ByteBuffer content = createRandomByteBuffer();
-
-        boolean lastContent = true;
-
-        httpTransportOverSPDY.send(null, content, lastContent, callback);
-        ArgumentCaptor<ByteBufferDataInfo> dataInfoCaptor = ArgumentCaptor.forClass(ByteBufferDataInfo.class);
-        ArgumentCaptor<Callback> callbackCaptor = ArgumentCaptor.forClass(Callback.class);
-        verify(stream, times(1)).data(dataInfoCaptor.capture(), callbackCaptor.capture());
-        callbackCaptor.getValue().succeeded();
-        verify(callback, times(1)).succeeded();
-        assertThat("lastContent is true", dataInfoCaptor.getValue().isClose(), is(true));
-        assertThat("ByteBuffer length is 4096", dataInfoCaptor.getValue().length(), is(4096));
-    }
-
-    @Test
-    public void testSendWithResponseInfoNullAndEmptyContentAndLastContentTrue() throws Exception
-    {
-        ByteBuffer content = BufferUtil.EMPTY_BUFFER;
-        boolean lastContent = true;
-
-        httpTransportOverSPDY.send(null, content, lastContent, callback);
-        ArgumentCaptor<ByteBufferDataInfo> dataInfoCaptor = ArgumentCaptor.forClass(ByteBufferDataInfo.class);
-        ArgumentCaptor<Callback> callbackCaptor = ArgumentCaptor.forClass(Callback.class);
-        verify(stream, times(1)).data(dataInfoCaptor.capture(), callbackCaptor.capture());
-        callbackCaptor.getValue().succeeded();
-        verify(callback, times(1)).succeeded();
-        assertThat("lastContent is true", dataInfoCaptor.getValue().isClose(), is(true));
-        assertThat("ByteBuffer is empty", dataInfoCaptor.getValue().length(), is(0));
-    }
-
-    @Test
-    public void testSendWithResponseInfoNullAndContentAndLastContentFalse() throws Exception
-    {
-        ByteBuffer content = createRandomByteBuffer();
-        boolean lastContent = false;
-
-        httpTransportOverSPDY.send(null, content, lastContent, callback);
-        ArgumentCaptor<ByteBufferDataInfo> dataInfoCaptor = ArgumentCaptor.forClass(ByteBufferDataInfo.class);
-        ArgumentCaptor<Callback> callbackCaptor = ArgumentCaptor.forClass(Callback.class);
-        verify(stream, times(1)).data(dataInfoCaptor.capture(), callbackCaptor.capture());
-        callbackCaptor.getValue().succeeded();
-        verify(callback, times(1)).succeeded();
-        assertThat("lastContent is false", dataInfoCaptor.getValue().isClose(), is(false));
-        assertThat("ByteBuffer is empty", dataInfoCaptor.getValue().length(), is(4096));
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void testSendWithResponseInfoNullAndContentNullAndLastContentFalse() throws Exception
-    {
-        ByteBuffer content = null;
-        boolean lastContent = false;
-        httpTransportOverSPDY.send(null, content, lastContent, callback);
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void testSendWithResponseInfoNullAndEmptyContentAndLastContentFalse() throws Exception
-    {
-        ByteBuffer content = BufferUtil.EMPTY_BUFFER;
-        boolean lastContent = false;
-        httpTransportOverSPDY.send(null, content, lastContent, callback);
-    }
-
-    @Test
-    public void testSendWithResponseInfoAndContentNullAndLastContentFalse() throws Exception
-    {
-        ByteBuffer content = null;
-        boolean lastContent = false;
-
-        httpTransportOverSPDY.send(responseInfo, content, lastContent, callback);
-        ArgumentCaptor<ReplyInfo> replyInfoCaptor = ArgumentCaptor.forClass(ReplyInfo.class);
-        ArgumentCaptor<Callback> callbackCaptor = ArgumentCaptor.forClass(Callback.class);
-        verify(stream, times(1)).reply(replyInfoCaptor.capture(), callbackCaptor.capture());
-        callbackCaptor.getValue().succeeded();
-        assertThat("ReplyInfo close is true", replyInfoCaptor.getValue().isClose(), is(false));
-
-        verify(stream, times(0)).data(any(ByteBufferDataInfo.class), any(Callback.class));
-        verify(callback, times(1)).succeeded();
-    }
-
-    @Test
-    public void testSendWithResponseInfoAndContentNullAndLastContentTrue() throws Exception
-    {
-        ByteBuffer content = null;
-        boolean lastContent = true;
-
-        // when stream.isClosed() is called a 2nd time, the reply has closed the stream already
-        when(stream.isClosed()).thenReturn(false).thenReturn(true);
-
-        httpTransportOverSPDY.send(responseInfo, content, lastContent, callback);
-        ArgumentCaptor<ReplyInfo> replyInfoCaptor = ArgumentCaptor.forClass(ReplyInfo.class);
-        ArgumentCaptor<Callback> callbackCaptor = ArgumentCaptor.forClass(Callback.class);
-        verify(stream, times(1)).reply(replyInfoCaptor.capture(), callbackCaptor.capture());
-        callbackCaptor.getValue().succeeded();
-        assertThat("ReplyInfo close is true", replyInfoCaptor.getValue().isClose(), is(true));
-
-        verify(callback, times(1)).succeeded();
-    }
-
-    @Test
-    public void testSendWithResponseInfoAndContentAndLastContentTrue() throws Exception
-    {
-        ByteBuffer content = createRandomByteBuffer();
-        boolean lastContent = true;
-
-        httpTransportOverSPDY.send(responseInfo, content, lastContent, callback);
-        ArgumentCaptor<ReplyInfo> replyInfoCaptor = ArgumentCaptor.forClass(ReplyInfo.class);
-        ArgumentCaptor<Callback> callbackCaptor = ArgumentCaptor.forClass(Callback.class);
-        verify(stream, times(1)).reply(replyInfoCaptor.capture(), callbackCaptor.capture());
-        callbackCaptor.getValue().succeeded();
-        assertThat("ReplyInfo close is false", replyInfoCaptor.getValue().isClose(), is(false));
-        ArgumentCaptor<ByteBufferDataInfo> dataInfoCaptor = ArgumentCaptor.forClass(ByteBufferDataInfo.class);
-        verify(stream, times(1)).data(dataInfoCaptor.capture(), callbackCaptor.capture());
-        callbackCaptor.getValue().succeeded();
-        assertThat("lastContent is true", dataInfoCaptor.getValue().isClose(), is(true));
-        assertThat("ByteBuffer length is 4096", dataInfoCaptor.getValue().length(), is(4096));
-        verify(callback, times(1)).succeeded();
-    }
-
-    @Test
-    public void testSendWithResponseInfoAndContentAndLastContentFalse() throws Exception
-    {
-        ByteBuffer content = createRandomByteBuffer();
-        boolean lastContent = false;
-
-        httpTransportOverSPDY.send(responseInfo, content, lastContent, callback);
-        ArgumentCaptor<ReplyInfo> replyInfoCaptor = ArgumentCaptor.forClass(ReplyInfo.class);
-        ArgumentCaptor<Callback> callbackCaptor = ArgumentCaptor.forClass(Callback.class);
-        verify(stream, times(1)).reply(replyInfoCaptor.capture(), callbackCaptor.capture());
-        callbackCaptor.getValue().succeeded();
-        assertThat("ReplyInfo close is false", replyInfoCaptor.getValue().isClose(), is(false));
-
-        ArgumentCaptor<ByteBufferDataInfo> dataInfoCaptor = ArgumentCaptor.forClass(ByteBufferDataInfo.class);
-        verify(stream, times(1)).data(dataInfoCaptor.capture(), callbackCaptor.capture());
-        callbackCaptor.getValue().succeeded();
-        assertThat("lastContent is false", dataInfoCaptor.getValue().isClose(), is(false));
-        assertThat("ByteBuffer length is 4096", dataInfoCaptor.getValue().length(), is(4096));
-
-        verify(callback, times(1)).succeeded();
-    }
-
-    @Test
-    public void testVerifyThatAStreamIsNotCommittedTwice() throws IOException, InterruptedException
-    {
-        final CountDownLatch failedCalledLatch = new CountDownLatch(1);
-        ByteBuffer content = createRandomByteBuffer();
-        boolean lastContent = false;
-
-        httpTransportOverSPDY.send(responseInfo, content, lastContent, callback);
-        ArgumentCaptor<ReplyInfo> replyInfoCaptor = ArgumentCaptor.forClass(ReplyInfo.class);
-        verify(stream, times(1)).reply(replyInfoCaptor.capture(), any(Callback.class));
-        assertThat("ReplyInfo close is false", replyInfoCaptor.getValue().isClose(), is(false));
-
-        httpTransportOverSPDY.send(HttpGenerator.RESPONSE_500_INFO, null, true, new Callback.Adapter()
-        {
-            @Override
-            public void failed(Throwable x)
-            {
-                failedCalledLatch.countDown();
-            }
-        });
-
-        verify(stream, times(1)).data(any(DataInfo.class), any(Callback.class));
-
-        assertThat("callback.failed has been called", failedCalledLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    private ByteBuffer createRandomByteBuffer()
-    {
-        ByteBuffer content = BufferUtil.allocate(8192);
-        BufferUtil.flipToFill(content);
-        byte[] randomBytes = new byte[4096];
-        random.nextBytes(randomBytes);
-        content.put(randomBytes);
-        return content;
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/PushStrategyBenchmarkTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/PushStrategyBenchmarkTest.java
deleted file mode 100644
index ccaf632..0000000
--- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/PushStrategyBenchmarkTest.java
+++ /dev/null
@@ -1,397 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server.http;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.util.Collections;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.ContentResponse;
-import org.eclipse.jetty.client.api.Response;
-import org.eclipse.jetty.client.api.Result;
-import org.eclipse.jetty.http.HttpHeader;
-import org.eclipse.jetty.server.ConnectionFactory;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.HttpConnectionFactory;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.GoAwayInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.util.Fields;
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
-
-@Ignore("make this test pass") // TODO
-public class PushStrategyBenchmarkTest extends AbstractHTTPSPDYTest
-{
-    // Sample resources size from webtide.com home page
-    private final int[] htmlResources = new int[]
-            {8 * 1024};
-    private final int[] cssResources = new int[]
-            {12 * 1024, 2 * 1024};
-    private final int[] jsResources = new int[]
-            {75 * 1024, 24 * 1024, 36 * 1024};
-    private final int[] pngResources = new int[]
-            {1024, 45 * 1024, 6 * 1024, 2 * 1024, 2 * 1024, 2 * 1024, 3 * 1024, 512, 512, 19 * 1024, 512, 128, 32};
-    private final Set<String> pushedResources = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
-    private final AtomicReference<CountDownLatch> latch = new AtomicReference<>();
-    private final long roundtrip = 100;
-    private final int runs = 10;
-
-    public PushStrategyBenchmarkTest(short version)
-    {
-        super(version);
-    }
-
-    @Test
-    public void benchmarkPushStrategy() throws Exception
-    {
-        InetSocketAddress address = startHTTPServer(version, new PushStrategyBenchmarkHandler(), 30000);
-
-        // Plain HTTP
-        ConnectionFactory factory = new HttpConnectionFactory(new HttpConfiguration());
-        connector.setDefaultProtocol(factory.getProtocol());
-        HttpClient httpClient = new HttpClient();
-        // Simulate browsers, that open 6 connection per origin
-        httpClient.setMaxConnectionsPerDestination(6);
-        httpClient.start();
-        benchmarkHTTP(httpClient);
-        httpClient.stop();
-
-        // First push strategy
-        PushStrategy pushStrategy = new PushStrategy.None();
-        factory = new HTTPSPDYServerConnectionFactory(version, new HttpConfiguration(), pushStrategy);
-        connector.setDefaultProtocol(factory.getProtocol());
-        Session session = startClient(version, address, new ClientSessionFrameListener());
-        benchmarkSPDY(pushStrategy, session);
-        session.goAway(new GoAwayInfo(5, TimeUnit.SECONDS));
-
-        // Second push strategy
-        pushStrategy = new ReferrerPushStrategy();
-        factory = new HTTPSPDYServerConnectionFactory(version, new HttpConfiguration(), pushStrategy);
-        connector.setDefaultProtocol(factory.getProtocol());
-        session = startClient(version, address, new ClientSessionFrameListener());
-        benchmarkSPDY(pushStrategy, session);
-        session.goAway(new GoAwayInfo(5, TimeUnit.SECONDS));
-    }
-
-    private void benchmarkHTTP(HttpClient httpClient) throws Exception
-    {
-        // Warm up
-        performHTTPRequests(httpClient);
-        performHTTPRequests(httpClient);
-
-        long total = 0;
-        for (int i = 0; i < runs; ++i)
-        {
-            long begin = System.nanoTime();
-            int requests = performHTTPRequests(httpClient);
-            long elapsed = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - begin);
-            total += elapsed;
-            System.err.printf("HTTP: run %d, %d request(s), roundtrip delay %d ms, elapsed = %d%n",
-                    i, requests, roundtrip, elapsed);
-        }
-        System.err.printf("HTTP: roundtrip delay %d ms, average = %d%n%n",
-                roundtrip, total / runs);
-    }
-
-    private int performHTTPRequests(HttpClient httpClient) throws Exception
-    {
-        int result = 0;
-
-        for (int j = 0; j < htmlResources.length; ++j)
-        {
-            latch.set(new CountDownLatch(cssResources.length + jsResources.length + pngResources.length));
-
-            String primaryPath = "/" + j + ".html";
-            String referrer = "http://localhost:" + connector.getLocalPort() + primaryPath;
-            ++result;
-            ContentResponse response = httpClient.newRequest("localhost", connector.getLocalPort())
-                    .path(primaryPath)
-                    .timeout(5, TimeUnit.SECONDS)
-                    .send();
-            Assert.assertEquals(200, response.getStatus());
-
-            for (int i = 0; i < cssResources.length; ++i)
-            {
-                String path = "/" + i + ".css";
-                ++result;
-                httpClient.newRequest("localhost", connector.getLocalPort())
-                        .path(path)
-                        .header(HttpHeader.REFERER, referrer)
-                        .send(new TestListener());
-            }
-            for (int i = 0; i < jsResources.length; ++i)
-            {
-                String path = "/" + i + ".js";
-                ++result;
-                httpClient.newRequest("localhost", connector.getLocalPort())
-                        .path(path)
-                        .header(HttpHeader.REFERER, referrer)
-                        .send(new TestListener());
-            }
-            for (int i = 0; i < pngResources.length; ++i)
-            {
-                String path = "/" + i + ".png";
-                ++result;
-                httpClient.newRequest("localhost", connector.getLocalPort())
-                        .path(path)
-                        .header(HttpHeader.REFERER, referrer)
-                        .send(new TestListener());
-            }
-
-            Assert.assertTrue(latch.get().await(5, TimeUnit.SECONDS));
-        }
-
-        return result;
-    }
-
-    private void benchmarkSPDY(PushStrategy pushStrategy, Session session) throws Exception
-    {
-        // Warm up PushStrategy
-        performRequests(session);
-        performRequests(session);
-
-        long total = 0;
-        for (int i = 0; i < runs; ++i)
-        {
-            long begin = System.nanoTime();
-            int requests = performRequests(session);
-            long elapsed = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - begin);
-            total += elapsed;
-            System.err.printf("SPDY(%s): run %d, %d request(s), roundtrip delay %d ms, elapsed = %d%n",
-                    pushStrategy.getClass().getSimpleName(), i, requests, roundtrip, elapsed);
-        }
-        System.err.printf("SPDY(%s): roundtrip delay %d ms, average = %d%n%n",
-                pushStrategy.getClass().getSimpleName(), roundtrip, total / runs);
-    }
-
-    private int performRequests(Session session) throws Exception
-    {
-        int result = 0;
-
-        for (int j = 0; j < htmlResources.length; ++j)
-        {
-            latch.set(new CountDownLatch(cssResources.length + jsResources.length + pngResources.length));
-            pushedResources.clear();
-
-            String primaryPath = "/" + j + ".html";
-            String referrer = "http://localhost:" + connector.getLocalPort() + primaryPath;
-            Fields headers = new Fields();
-            headers.put(HTTPSPDYHeader.METHOD.name(version), "GET");
-            headers.put(HTTPSPDYHeader.URI.name(version), primaryPath);
-            headers.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1");
-            headers.put(HTTPSPDYHeader.SCHEME.name(version), "http");
-            headers.put(HTTPSPDYHeader.HOST.name(version), "localhost:" + connector.getLocalPort());
-            // Wait for the HTML to simulate browser's behavior
-            ++result;
-            final CountDownLatch htmlLatch = new CountDownLatch(1);
-            session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-            {
-                @Override
-                public void onData(Stream stream, DataInfo dataInfo)
-                {
-                    dataInfo.consume(dataInfo.length());
-                    if (dataInfo.isClose())
-                        htmlLatch.countDown();
-                }
-            });
-            Assert.assertTrue(htmlLatch.await(5, TimeUnit.SECONDS));
-
-            for (int i = 0; i < cssResources.length; ++i)
-            {
-                String path = "/" + i + ".css";
-                if (pushedResources.contains(path))
-                    continue;
-                headers = createRequestHeaders(referrer, path);
-                ++result;
-                session.syn(new SynInfo(headers, true), new DataListener());
-            }
-            for (int i = 0; i < jsResources.length; ++i)
-            {
-                String path = "/" + i + ".js";
-                if (pushedResources.contains(path))
-                    continue;
-                headers = createRequestHeaders(referrer, path);
-                ++result;
-                session.syn(new SynInfo(headers, true), new DataListener());
-            }
-            for (int i = 0; i < pngResources.length; ++i)
-            {
-                String path = "/" + i + ".png";
-                if (pushedResources.contains(path))
-                    continue;
-                headers = createRequestHeaders(referrer, path);
-                ++result;
-                session.syn(new SynInfo(headers, true), new DataListener());
-            }
-
-            Assert.assertTrue(latch.get().await(5, TimeUnit.SECONDS));
-        }
-
-        return result;
-    }
-
-    private Fields createRequestHeaders(String referrer, String path)
-    {
-        Fields headers;
-        headers = new Fields();
-        headers.put(HTTPSPDYHeader.METHOD.name(version), "GET");
-        headers.put(HTTPSPDYHeader.URI.name(version), path);
-        headers.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1");
-        headers.put(HTTPSPDYHeader.SCHEME.name(version), "http");
-        headers.put(HTTPSPDYHeader.HOST.name(version), "localhost:" + connector.getLocalPort());
-        headers.put("referer", referrer);
-        return headers;
-    }
-
-    private void sleep(long delay) throws ServletException
-    {
-        try
-        {
-            TimeUnit.MILLISECONDS.sleep(delay);
-        }
-        catch (InterruptedException x)
-        {
-            throw new ServletException(x);
-        }
-    }
-
-    private class PushStrategyBenchmarkHandler extends AbstractHandler
-    {
-        @Override
-        public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-        {
-            baseRequest.setHandled(true);
-
-            // Sleep half of the roundtrip time, to simulate the delay of responses, even for pushed resources
-            sleep(roundtrip / 2);
-            // If it's not a pushed resource, sleep half of the roundtrip time, to simulate the delay of requests
-            if (request.getHeader("x-spdy-push") == null)
-                sleep(roundtrip / 2);
-
-            String suffix = target.substring(target.indexOf('.') + 1);
-            int index = Integer.parseInt(target.substring(1, target.length() - suffix.length() - 1));
-
-            int contentLength;
-            String contentType;
-            switch (suffix)
-            {
-                case "html":
-                    contentLength = htmlResources[index];
-                    contentType = "text/html";
-                    break;
-                case "css":
-                    contentLength = cssResources[index];
-                    contentType = "text/css";
-                    break;
-                case "js":
-                    contentLength = jsResources[index];
-                    contentType = "text/javascript";
-                    break;
-                case "png":
-                    contentLength = pngResources[index];
-                    contentType = "image/png";
-                    break;
-                default:
-                    throw new ServletException();
-            }
-
-            response.setContentType(contentType);
-            response.setContentLength(contentLength);
-            response.getOutputStream().write(new byte[contentLength]);
-        }
-    }
-
-    private void addPushedResource(String pushedURI)
-    {
-        switch (version)
-        {
-            case SPDY.V2:
-            {
-                Matcher matcher = Pattern.compile("https?://[^:]+:\\d+(/.*)").matcher(pushedURI);
-                Assert.assertTrue(matcher.matches());
-                pushedResources.add(matcher.group(1));
-                break;
-            }
-            case SPDY.V3:
-            {
-                pushedResources.add(pushedURI);
-                break;
-            }
-            default:
-            {
-                throw new IllegalStateException();
-            }
-        }
-    }
-
-    private class ClientSessionFrameListener extends SessionFrameListener.Adapter
-    {
-        @Override
-        public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-        {
-            String path = synInfo.getHeaders().get(HTTPSPDYHeader.URI.name(version)).getValue();
-            addPushedResource(path);
-            return new DataListener();
-        }
-    }
-
-    private class DataListener extends StreamFrameListener.Adapter
-    {
-        @Override
-        public void onData(Stream stream, DataInfo dataInfo)
-        {
-            dataInfo.consume(dataInfo.length());
-            if (dataInfo.isClose())
-                latch.get().countDown();
-        }
-    }
-
-    private class TestListener extends Response.Listener.Adapter
-    {
-        @Override
-        public void onComplete(Result result)
-        {
-            if (!result.isFailed())
-                latch.get().countDown();
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ReferrerPushStrategyTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ReferrerPushStrategyTest.java
deleted file mode 100644
index f50982a..0000000
--- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ReferrerPushStrategyTest.java
+++ /dev/null
@@ -1,1138 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.http;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.assertThat;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.net.InetSocketAddress;
-import java.util.Arrays;
-import java.util.Random;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.server.ConnectionFactory;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-import org.eclipse.jetty.servlets.gzip.GzipHandler;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.HeadersInfo;
-import org.eclipse.jetty.spdy.api.PushInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.RstInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.api.Settings;
-import org.eclipse.jetty.spdy.api.SettingsInfo;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.spdy.server.NPNServerConnectionFactory;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.Promise;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.util.log.StdErrLog;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-public class ReferrerPushStrategyTest extends AbstractHTTPSPDYTest
-{
-    private static final Logger LOG = Log.getLogger(ReferrerPushStrategyTest.class);
-
-    private final int referrerPushPeriod = 1000;
-    private final String mainResource = "/index.html";
-    private final String cssResource = "/style.css";
-    private InetSocketAddress serverAddress;
-    private ReferrerPushStrategy pushStrategy;
-    private ConnectionFactory defaultFactory;
-    private Fields mainRequestHeaders;
-    private Fields associatedCSSRequestHeaders;
-    private Fields associatedJSRequestHeaders;
-
-    public ReferrerPushStrategyTest(short version)
-    {
-        super(version);
-    }
-
-    @Override
-    protected HTTPSPDYServerConnector newHTTPSPDYServerConnector(short version)
-    {
-        return new HTTPSPDYServerConnector(server, version, new HttpConfiguration(), new ReferrerPushStrategy());
-    }
-
-    @Before
-    public void setUp() throws Exception
-    {
-        serverAddress = createServer();
-        pushStrategy = new ReferrerPushStrategy();
-        pushStrategy.setReferrerPushPeriod(referrerPushPeriod);
-        defaultFactory = new HTTPSPDYServerConnectionFactory(version, new HttpConfiguration(), pushStrategy);
-        connector.addConnectionFactory(defaultFactory);
-        if (connector.getConnectionFactory(NPNServerConnectionFactory.class) != null)
-            connector.getConnectionFactory(NPNServerConnectionFactory.class).setDefaultProtocol(defaultFactory.getProtocol());
-        else
-            connector.setDefaultProtocol(defaultFactory.getProtocol());
-        mainRequestHeaders = createHeadersWithoutReferrer(mainResource);
-        associatedCSSRequestHeaders = createHeaders(cssResource);
-        associatedJSRequestHeaders = createHeaders("/application.js");
-    }
-
-    @Test
-    public void testPushHeadersAreValid() throws Exception
-    {
-        sendMainRequestAndCSSRequest(null, false);
-        run2ndClientRequests(true, true);
-    }
-
-    @Test
-    public void testClientResetsPushStreams() throws Exception
-    {
-        ((StdErrLog)Log.getLogger("org.eclipse.jetty.server.HttpChannel")).setHideStacks(true);
-        sendMainRequestAndCSSRequest(null, false);
-        final CountDownLatch pushDataLatch = new CountDownLatch(1);
-        final CountDownLatch pushSynHeadersValid = new CountDownLatch(1);
-        Session session = startClient(version, serverAddress, null);
-        // Send main request. That should initiate the push push's which get reset by the client
-        sendRequest(session, mainRequestHeaders, pushSynHeadersValid, pushDataLatch, true);
-
-        assertThat("No push data is received", pushDataLatch.await(1, TimeUnit.SECONDS), is(false));
-        assertThat("Push push headers valid", pushSynHeadersValid.await(5, TimeUnit.SECONDS), is(true));
-
-        sendRequest(session, associatedCSSRequestHeaders, pushSynHeadersValid, pushDataLatch, true);
-        ((StdErrLog)Log.getLogger("org.eclipse.jetty.server.HttpChannel")).setHideStacks(false);
-    }
-
-    @Test
-    public void testUserAgentBlackList() throws Exception
-    {
-        pushStrategy.setUserAgentBlacklist(Arrays.asList(".*(?i)firefox/16.*"));
-        sendMainRequestAndCSSRequest(null, false);
-        run2ndClientRequests(false, false);
-    }
-
-    @Test
-    public void testReferrerPushPeriod() throws Exception
-    {
-        Session session = sendMainRequestAndCSSRequest(null, false);
-
-        // Sleep for pushPeriod This should prevent application.js from being mapped as pushResource
-        Thread.sleep(referrerPushPeriod + 1);
-        sendRequest(session, associatedJSRequestHeaders, null, null, false);
-
-        run2ndClientRequests(false, true);
-    }
-
-    @Test
-    public void testMaxAssociatedResources() throws Exception
-    {
-        pushStrategy.setMaxAssociatedResources(1);
-        Session session = sendMainRequestAndCSSRequest(null, false);
-        sendRequest(session, associatedJSRequestHeaders, null, null, false);
-
-        final CountDownLatch mainStreamLatch = new CountDownLatch(2);
-        final CountDownLatch pushDataLatch = new CountDownLatch(2);
-        final CountDownLatch pushSynHeadersValid = new CountDownLatch(1);
-        final CountDownLatch pushResponseHeaders = new CountDownLatch(1);
-        Session session2 = startClient(version, serverAddress, null);
-        session2.syn(new SynInfo(mainRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-            {
-                validateHeaders(pushInfo.getHeaders(), pushSynHeadersValid);
-
-                assertThat("Stream is unidirectional", stream.isUnidirectional(), is(true));
-                assertThat("URI header ends with css", pushInfo.getHeaders().get(HTTPSPDYHeader.URI.name(version))
-                        .getValue().endsWith
-                                ("" +
-                                        ".css"),
-                        is(true));
-                return new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onHeaders(Stream stream, HeadersInfo headersInfo)
-                    {
-                        Fields headers = headersInfo.getHeaders();
-                        if (validateHeader(headers, HTTPSPDYHeader.STATUS.name(version), "200 OK")
-                                && validateHeader(headers, HTTPSPDYHeader.VERSION.name(version),
-                                "HTTP/1.1") && validateHeader(headers, "content-encoding", "gzip"))
-                            pushResponseHeaders.countDown();
-                    }
-
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        dataInfo.consume(dataInfo.length());
-                        if (dataInfo.isClose())
-                            pushDataLatch.countDown();
-                    }
-                };
-            }
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                assertThat("replyInfo.isClose() is false", replyInfo.isClose(), is(false));
-                mainStreamLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    mainStreamLatch.countDown();
-            }
-        });
-
-        assertThat("Main request reply and/or data received", mainStreamLatch.await(5, TimeUnit.SECONDS), is(true));
-        assertThat("Not more than one push is received", pushDataLatch.await(1, TimeUnit.SECONDS), is(false));
-        assertThat("Push push headers valid", pushSynHeadersValid.await(5, TimeUnit.SECONDS), is(true));
-        assertThat("Push response headers are valid", pushResponseHeaders.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    @Test
-    public void testMaxConcurrentStreamsToDisablePush() throws Exception
-    {
-        final CountDownLatch pushReceivedLatch = new CountDownLatch(1);
-
-        Session pushCacheBuildSession = startClient(version, serverAddress, null);
-
-        pushCacheBuildSession.syn(new SynInfo(mainRequestHeaders, true), new StreamFrameListener.Adapter());
-        pushCacheBuildSession.syn(new SynInfo(associatedCSSRequestHeaders, true), new StreamFrameListener.Adapter());
-
-        Session session = startClient(version, serverAddress, null);
-
-        Settings settings = new Settings();
-        settings.put(new Settings.Setting(Settings.ID.MAX_CONCURRENT_STREAMS, 0));
-        SettingsInfo settingsInfo = new SettingsInfo(settings);
-        session.settings(settingsInfo);
-
-        ((StdErrLog)Log.getLogger("org.eclipse.jetty.spdy.server.http" +
-                        ".HttpTransportOverSPDY$PushResourceCoordinator$1")).setHideStacks(true);
-        session.syn(new SynInfo(mainRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-            {
-                pushReceivedLatch.countDown();
-                return super.onPush(stream, pushInfo);
-            }
-        });
-
-        assertThat("No push stream is received", pushReceivedLatch.await(1, TimeUnit.SECONDS), is(false));
-        ((StdErrLog)Log.getLogger("org.eclipse.jetty.spdy.server.http" +
-                                ".HttpTransportOverSPDY$PushResourceCoordinator$1")).setHideStacks(false);
-    }
-
-    @Test
-    public void testPushResourceOrder() throws Exception
-    {
-        final CountDownLatch allExpectedPushesReceivedLatch = new CountDownLatch(4);
-        final CountDownLatch allPushDataReceivedLatch = new CountDownLatch(4);
-
-        Session pushCacheBuildSession = startClient(version, serverAddress, null);
-
-        sendRequest(pushCacheBuildSession, mainRequestHeaders, null, null, false);
-        sendRequest(pushCacheBuildSession, associatedCSSRequestHeaders, null, null, false);
-        sendRequest(pushCacheBuildSession, associatedJSRequestHeaders, null, null, false);
-        sendRequest(pushCacheBuildSession, createHeaders("/image1.jpg", mainResource), null, null, false);
-        sendRequest(pushCacheBuildSession, createHeaders("/image2.jpg", mainResource), null, null, false);
-
-        Session session = startClient(version, serverAddress, null);
-
-        session.syn(new SynInfo(mainRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-            {
-                LOG.info("onPush: stream: {}, pushInfo: {}", stream, pushInfo);
-                String uriHeader = pushInfo.getHeaders().get(HTTPSPDYHeader.URI.name(version)).getValue();
-                switch ((int)allExpectedPushesReceivedLatch.getCount())
-                {
-                    case 4:
-                        assertThat("1st pushed resource is the css", uriHeader.endsWith("css"), is(true));
-                        break;
-                    case 3:
-                        assertThat("2nd pushed resource is the js", uriHeader.endsWith("js"), is(true));
-                        break;
-                    case 2:
-                        assertThat("3rd pushed resource is image1", uriHeader.endsWith("image1.jpg"),
-                                is(true));
-                        break;
-                    case 1:
-                        assertThat("4th pushed resource is image2", uriHeader.endsWith("image2.jpg"),
-                                is(true));
-                        break;
-                }
-                allExpectedPushesReceivedLatch.countDown();
-                return new Adapter()
-                {
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        if(dataInfo.isClose())
-                            allPushDataReceivedLatch.countDown();
-                    }
-                };
-            }
-        });
-
-        assertThat("All expected push resources have been received", allExpectedPushesReceivedLatch.await(5,
-                TimeUnit.SECONDS), is(true));
-        assertThat("All push data has been fully received", allPushDataReceivedLatch.await(5, TimeUnit.SECONDS),
-                is(true));
-    }
-
-    @Test
-    public void testThatPushResourcesAreUnique() throws Exception
-    {
-        final CountDownLatch pushReceivedLatch = new CountDownLatch(2);
-        sendMainRequestAndCSSRequest(null, false);
-        sendMainRequestAndCSSRequest(null, false);
-
-        Session session = startClient(version, serverAddress, null);
-
-        session.syn(new SynInfo(mainRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-            {
-                pushReceivedLatch.countDown();
-                LOG.info("Push received: {}", pushInfo);
-                return null;
-            }
-        });
-
-        assertThat("style.css has been pushed only once", pushReceivedLatch.await(1, TimeUnit.SECONDS), is(false));
-    }
-
-    @Test
-    public void testPushResourceAreSentNonInterleaved() throws Exception
-    {
-        final CountDownLatch allExpectedPushesReceivedLatch = new CountDownLatch(4);
-        final CountDownLatch allPushDataReceivedLatch = new CountDownLatch(4);
-        final CopyOnWriteArrayList<Integer> dataReceivedOrder = new CopyOnWriteArrayList<>();
-
-        InetSocketAddress bigResponseServerAddress = startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                byte[] bytes = new byte[32768];
-                new Random().nextBytes(bytes);
-                ServletOutputStream outputStream = response.getOutputStream();
-                outputStream.write(bytes);
-                baseRequest.setHandled(true);
-            }
-        }, 30000);
-        Session pushCacheBuildSession = startClient(version, bigResponseServerAddress, null);
-
-        Fields mainResourceHeaders = createHeadersWithoutReferrer(mainResource);
-        sendRequest(pushCacheBuildSession, mainResourceHeaders, null, null, false);
-        sendRequest(pushCacheBuildSession, createHeaders("/style.css", mainResource), null, null, false);
-        sendRequest(pushCacheBuildSession, createHeaders("/javascript.js", mainResource), null, null, false);
-        sendRequest(pushCacheBuildSession, createHeaders("/image1.jpg", mainResource), null, null, false);
-        sendRequest(pushCacheBuildSession, createHeaders("/image2.jpg", mainResource), null, null, false);
-
-        Session session = startClient(version, bigResponseServerAddress, null);
-
-        session.syn(new SynInfo(mainResourceHeaders, true), new StreamFrameListener.Adapter()
-        {
-            AtomicInteger currentStreamId = new AtomicInteger(2);
-
-            @Override
-            public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-            {
-                LOG.info("Received push for stream: {} {}", stream.getId(), pushInfo);
-                String uriHeader = pushInfo.getHeaders().get(HTTPSPDYHeader.URI.name(version)).getValue();
-                switch ((int)allExpectedPushesReceivedLatch.getCount())
-                {
-                    case 4:
-                        assertThat("1st pushed resource is the css", uriHeader.endsWith("css"), is(true));
-                        break;
-                    case 3:
-                        assertThat("2nd pushed resource is the js", uriHeader.endsWith("js"), is(true));
-                        break;
-                    case 2:
-                        assertThat("3rd pushed resource is image1", uriHeader.endsWith("image1.jpg"),
-                                is(true));
-                        break;
-                    case 1:
-                        assertThat("4th pushed resource is image2", uriHeader.endsWith("image2.jpg"),
-                                is(true));
-                        break;
-                }
-                allExpectedPushesReceivedLatch.countDown();
-                return new Adapter()
-                {
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        if (stream.getId() != currentStreamId.get())
-                            throw new IllegalStateException("Streams interleaved. Expected StreamId: " +
-                                    currentStreamId + " but was: " + stream.getId());
-                        dataInfo.consume(dataInfo.available());
-                        if (dataInfo.isClose())
-                        {
-                            currentStreamId.compareAndSet(currentStreamId.get(), currentStreamId.get() + 2);
-                            dataReceivedOrder.add(stream.getId());
-                            allPushDataReceivedLatch.countDown();
-                        }
-                        LOG.info(stream.getId() + ":" + dataInfo);
-                    }
-                };
-            }
-        });
-
-        assertThat("All push resources received", allExpectedPushesReceivedLatch.await(5, TimeUnit.SECONDS), is(true));
-        assertThat("All pushData received", allPushDataReceivedLatch.await(5, TimeUnit.SECONDS), is(true));
-        assertThat("The data for different push streams has not been interleaved",
-                dataReceivedOrder.toString(), equalTo("[2, 4, 6, 8]"));
-        LOG.info(dataReceivedOrder.toString());
-    }
-
-    private InetSocketAddress createServer() throws Exception
-    {
-        GzipHandler gzipHandler = new GzipHandler();
-        gzipHandler.setHandler(new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                String url = request.getRequestURI();
-                PrintWriter output = response.getWriter();
-                if (url.endsWith(".html"))
-                    output.print("<html><head/><body>HELLO</body></html>");
-                else if (url.endsWith(".css"))
-                    output.print("body { background: #FFF; }");
-                else if (url.endsWith(".js"))
-                    output.print("function(){}();");
-                baseRequest.setHandled(true);
-            }
-        });
-        return startHTTPServer(version, gzipHandler, 30000);
-    }
-
-    private Session sendMainRequestAndCSSRequest(SessionFrameListener sessionFrameListener, boolean awaitPush) throws Exception
-    {
-        Session session = startClient(version, serverAddress, sessionFrameListener);
-
-        CountDownLatch pushDataLatch = new CountDownLatch(2);
-        sendRequest(session, mainRequestHeaders, null, pushDataLatch, false);
-        sendRequest(session, associatedCSSRequestHeaders, null, pushDataLatch, false);
-        if (awaitPush)
-            assertThat("pushes have been received", pushDataLatch.await(5, TimeUnit.SECONDS), is(true));
-
-        return session;
-    }
-
-    private void sendRequest(Session session, Fields requestHeaders, final CountDownLatch pushSynHeadersValid,
-                             final CountDownLatch pushDataLatch, final boolean resetPush) throws InterruptedException
-    {
-        LOG.info("sendRequest. headers={},resetPush={}", requestHeaders, resetPush);
-        final CountDownLatch dataReceivedLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(requestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-            {
-                if (pushSynHeadersValid != null)
-                    validateHeaders(pushInfo.getHeaders(), pushSynHeadersValid);
-
-                assertThat("Stream is unidirectional", stream.isUnidirectional(), is(true));
-                assertThat("URI header ends with css", pushInfo.getHeaders().get(HTTPSPDYHeader.URI.name(version))
-                        .getValue().endsWith
-                                ("" +
-                                        ".css"),
-                        is(true));
-                if (resetPush)
-                    stream.getSession().rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM), new Callback.Adapter());
-                return new StreamFrameListener.Adapter()
-                {
-
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        dataInfo.consume(dataInfo.length());
-                        pushDataLatch.countDown();
-                    }
-                };
-            }
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                assertThat(replyInfo.getHeaders().get(HTTPSPDYHeader.STATUS.name(version)).getValue(), is("200 OK"));
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    dataReceivedLatch.countDown();
-            }
-        }, new Promise.Adapter<Stream>());
-        assertThat(dataReceivedLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    private void run2ndClientRequests(final boolean validateHeaders,
-                                      boolean expectPushResource) throws Exception
-    {
-        final CountDownLatch mainStreamLatch = new CountDownLatch(2);
-        final CountDownLatch pushDataLatch = new CountDownLatch(1);
-        final CountDownLatch pushSynHeadersValid = new CountDownLatch(1);
-        final CountDownLatch pushResponseHeaders = new CountDownLatch(1);
-        Session session2 = startClient(version, serverAddress, null);
-        session2.syn(new SynInfo(mainRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-            {
-                if (validateHeaders)
-                    validateHeaders(pushInfo.getHeaders(), pushSynHeadersValid);
-
-                assertThat("Stream is unidirectional", stream.isUnidirectional(), is(true));
-                assertThat("URI header ends with css", pushInfo.getHeaders().get(HTTPSPDYHeader.URI.name(version))
-                        .getValue().endsWith
-                                ("" +
-                                        ".css"),
-                        is(true));
-                return new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onHeaders(Stream stream, HeadersInfo headersInfo)
-                    {
-                        Fields headers = headersInfo.getHeaders();
-                        if (validateHeader(headers, HTTPSPDYHeader.STATUS.name(version), "200 OK")
-                                && validateHeader(headers, HTTPSPDYHeader.VERSION.name(version),
-                                "HTTP/1.1") && validateHeader(headers, "content-encoding", "gzip"))
-                            pushResponseHeaders.countDown();
-                    }
-
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        dataInfo.consume(dataInfo.length());
-                        if (dataInfo.isClose())
-                            pushDataLatch.countDown();
-                    }
-                };
-            }
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                assertThat("replyInfo.isClose() is false", replyInfo.isClose(), is(false));
-                mainStreamLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    mainStreamLatch.countDown();
-            }
-        });
-
-        assertThat("Main request reply and/or data received", mainStreamLatch.await(5, TimeUnit.SECONDS), is(true));
-        if (expectPushResource)
-            assertThat("Pushed data received", pushDataLatch.await(5, TimeUnit.SECONDS), is(true));
-        else
-            assertThat("No push data is received", pushDataLatch.await(1, TimeUnit.SECONDS), is(false));
-        if (validateHeaders)
-        {
-            assertThat("Push push headers valid", pushSynHeadersValid.await(5, TimeUnit.SECONDS), is(true));
-            assertThat("Push response headers are valid", pushResponseHeaders.await(5, TimeUnit.SECONDS), is(true));
-        }
-    }
-
-    @Test
-    public void testAssociatedResourceIsPushed() throws Exception
-    {
-        InetSocketAddress address = startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                String url = request.getRequestURI();
-                PrintWriter output = response.getWriter();
-                if (url.endsWith(".html"))
-                    output.print("<html><head/><body>HELLO</body></html>");
-                else if (url.endsWith(".css"))
-                    output.print("body { background: #FFF; }");
-                baseRequest.setHandled(true);
-            }
-        }, 30000);
-        Session session1 = startClient(version, address, null);
-
-        final CountDownLatch mainResourceLatch = new CountDownLatch(1);
-        Fields mainRequestHeaders = createHeadersWithoutReferrer(mainResource);
-
-        session1.syn(new SynInfo(mainRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    mainResourceLatch.countDown();
-            }
-        });
-        Assert.assertTrue(mainResourceLatch.await(5, TimeUnit.SECONDS));
-
-        sendRequest(session1, createHeaders(cssResource), null, null, false);
-
-        // Create another client, and perform the same request for the main resource, we expect the css being pushed
-
-        final CountDownLatch mainStreamLatch = new CountDownLatch(2);
-        final CountDownLatch pushDataLatch = new CountDownLatch(1);
-        Session session2 = startClient(version, address, null);
-        session2.syn(new SynInfo(mainRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-            {
-                Assert.assertTrue(stream.isUnidirectional());
-                return new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        dataInfo.consume(dataInfo.length());
-                        if (dataInfo.isClose())
-                            pushDataLatch.countDown();
-                    }
-                };
-            }
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Assert.assertFalse(replyInfo.isClose());
-                mainStreamLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    mainStreamLatch.countDown();
-            }
-        });
-
-        Assert.assertTrue(mainStreamLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(pushDataLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testAssociatedResourceWithWrongContentTypeIsNotPushed() throws Exception
-    {
-        final String fakeResource = "/fake.png";
-        InetSocketAddress address = startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                String url = request.getRequestURI();
-                PrintWriter output = response.getWriter();
-                if (url.endsWith(".html"))
-                {
-                    response.setContentType("text/html");
-                    output.print("<html><head/><body>HELLO</body></html>");
-                }
-                else if (url.equals(fakeResource))
-                {
-                    response.setContentType("text/html");
-                    output.print("<html><head/><body>IMAGE</body></html>");
-                }
-                else if (url.endsWith(".css"))
-                {
-                    response.setContentType("text/css");
-                    output.print("body { background: #FFF; }");
-                }
-                baseRequest.setHandled(true);
-            }
-        }, 30000);
-        Session session1 = startClient(version, address, null);
-
-        final CountDownLatch mainResourceLatch = new CountDownLatch(1);
-        Fields mainRequestHeaders = createHeadersWithoutReferrer(mainResource);
-
-        session1.syn(new SynInfo(mainRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    mainResourceLatch.countDown();
-            }
-        });
-        Assert.assertTrue(mainResourceLatch.await(5, TimeUnit.SECONDS));
-
-        final CountDownLatch associatedResourceLatch = new CountDownLatch(1);
-        String cssResource = "/stylesheet.css";
-        Fields associatedRequestHeaders = createHeaders(cssResource);
-        session1.syn(new SynInfo(associatedRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    associatedResourceLatch.countDown();
-            }
-        });
-        Assert.assertTrue(associatedResourceLatch.await(5, TimeUnit.SECONDS));
-
-        final CountDownLatch fakeAssociatedResourceLatch = new CountDownLatch(1);
-        Fields fakeAssociatedRequestHeaders = createHeaders(fakeResource);
-        session1.syn(new SynInfo(fakeAssociatedRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    fakeAssociatedResourceLatch.countDown();
-            }
-        });
-        Assert.assertTrue(fakeAssociatedResourceLatch.await(5, TimeUnit.SECONDS));
-
-        // Create another client, and perform the same request for the main resource,
-        // we expect the css being pushed but not the fake PNG
-
-        final CountDownLatch mainStreamLatch = new CountDownLatch(2);
-        final CountDownLatch pushDataLatch = new CountDownLatch(1);
-        Session session2 = startClient(version, address, null);
-        session2.syn(new SynInfo(mainRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-            {
-                Assert.assertTrue(stream.isUnidirectional());
-                Assert.assertTrue(pushInfo.getHeaders().get(HTTPSPDYHeader.URI.name(version)).getValue().endsWith("" +
-                        ".css"));
-                return new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        dataInfo.consume(dataInfo.length());
-                        if (dataInfo.isClose())
-                            pushDataLatch.countDown();
-                    }
-                };
-            }
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Assert.assertFalse(replyInfo.isClose());
-                mainStreamLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    mainStreamLatch.countDown();
-            }
-        });
-
-        Assert.assertTrue(mainStreamLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(pushDataLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testNestedAssociatedResourceIsPushed() throws Exception
-    {
-        InetSocketAddress address = startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                String url = request.getRequestURI();
-                PrintWriter output = response.getWriter();
-                if (url.endsWith(".html"))
-                    output.print("<html><head/><body>HELLO</body></html>");
-                else if (url.endsWith(".css"))
-                    output.print("body { background: #FFF; }");
-                else if (url.endsWith(".gif"))
-                    output.print("\u0000");
-                baseRequest.setHandled(true);
-            }
-        }, 30000);
-        Session session1 = startClient(version, address, null);
-
-        final CountDownLatch mainResourceLatch = new CountDownLatch(1);
-        Fields mainRequestHeaders = createHeadersWithoutReferrer(mainResource);
-
-        session1.syn(new SynInfo(mainRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    mainResourceLatch.countDown();
-            }
-        });
-        Assert.assertTrue(mainResourceLatch.await(5, TimeUnit.SECONDS));
-
-        final CountDownLatch associatedResourceLatch = new CountDownLatch(1);
-        Fields associatedRequestHeaders = createHeaders(cssResource);
-        session1.syn(new SynInfo(associatedRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    associatedResourceLatch.countDown();
-            }
-        });
-        Assert.assertTrue(associatedResourceLatch.await(5, TimeUnit.SECONDS));
-
-        final CountDownLatch nestedResourceLatch = new CountDownLatch(1);
-        String imageUrl = "/image.gif";
-        Fields nestedRequestHeaders = createHeaders(imageUrl, cssResource);
-
-        session1.syn(new SynInfo(nestedRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    nestedResourceLatch.countDown();
-            }
-        });
-        Assert.assertTrue(nestedResourceLatch.await(5, TimeUnit.SECONDS));
-
-        // Create another client, and perform the same request for the main resource, we expect the css and the image being pushed
-
-        final CountDownLatch mainStreamLatch = new CountDownLatch(2);
-        final CountDownLatch pushDataLatch = new CountDownLatch(2);
-        Session session2 = startClient(version, address, null);
-        session2.syn(new SynInfo(mainRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-            {
-                Assert.assertTrue(stream.isUnidirectional());
-                return new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-                    {
-                        return new Adapter()
-                        {
-                            @Override
-                            public void onData(Stream stream, DataInfo dataInfo)
-                            {
-                                dataInfo.consume(dataInfo.length());
-                                if (dataInfo.isClose())
-                                    pushDataLatch.countDown();
-                            }
-                        };
-                    }
-
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        dataInfo.consume(dataInfo.length());
-                        if (dataInfo.isClose())
-                            pushDataLatch.countDown();
-                    }
-                };
-            }
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Assert.assertFalse(replyInfo.isClose());
-                mainStreamLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    mainStreamLatch.countDown();
-            }
-        });
-
-        Assert.assertTrue(mainStreamLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(pushDataLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testMainResourceWithReferrerIsNotPushed() throws Exception
-    {
-        InetSocketAddress address = startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                String url = request.getRequestURI();
-                PrintWriter output = response.getWriter();
-                if (url.endsWith(".html"))
-                    output.print("<html><head/><body>HELLO</body></html>");
-                baseRequest.setHandled(true);
-            }
-        }, 30000);
-        Session session1 = startClient(version, address, null);
-
-        final CountDownLatch mainResourceLatch = new CountDownLatch(1);
-        Fields mainRequestHeaders = createHeadersWithoutReferrer(mainResource);
-
-        session1.syn(new SynInfo(mainRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    mainResourceLatch.countDown();
-            }
-        });
-        Assert.assertTrue(mainResourceLatch.await(5, TimeUnit.SECONDS));
-
-        final CountDownLatch associatedResourceLatch = new CountDownLatch(1);
-        String associatedResource = "/home.html";
-        Fields associatedRequestHeaders = createHeaders(associatedResource);
-
-        session1.syn(new SynInfo(associatedRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    associatedResourceLatch.countDown();
-            }
-        });
-        Assert.assertTrue(associatedResourceLatch.await(5, TimeUnit.SECONDS));
-
-        // Create another client, and perform the same request for the main resource, we expect nothing being pushed
-
-        final CountDownLatch mainStreamLatch = new CountDownLatch(2);
-        final CountDownLatch pushLatch = new CountDownLatch(1);
-        Session session2 = startClient(version, address, new SessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                pushLatch.countDown();
-                return null;
-            }
-        });
-        session2.syn(new SynInfo(mainRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Assert.assertFalse(replyInfo.isClose());
-                mainStreamLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    mainStreamLatch.countDown();
-            }
-        });
-
-        Assert.assertTrue(mainStreamLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertFalse(pushLatch.await(1, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testRequestWithIfModifiedSinceHeaderPreventsPush() throws Exception
-    {
-        InetSocketAddress address = startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                String url = request.getRequestURI();
-                PrintWriter output = response.getWriter();
-                if (url.endsWith(".html"))
-                    output.print("<html><head/><body>HELLO</body></html>");
-                else if (url.endsWith(".css"))
-                    output.print("body { background: #FFF; }");
-                baseRequest.setHandled(true);
-            }
-        }, 30000);
-        Session session1 = startClient(version, address, null);
-
-        final CountDownLatch mainResourceLatch = new CountDownLatch(1);
-        Fields mainRequestHeaders = createHeaders(mainResource);
-        mainRequestHeaders.put("If-Modified-Since", "Tue, 27 Mar 2012 16:36:52 GMT");
-        session1.syn(new SynInfo(mainRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    mainResourceLatch.countDown();
-            }
-        });
-        Assert.assertTrue(mainResourceLatch.await(5, TimeUnit.SECONDS));
-
-        final CountDownLatch associatedResourceLatch = new CountDownLatch(1);
-        Fields associatedRequestHeaders = createHeaders(cssResource);
-        session1.syn(new SynInfo(associatedRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    associatedResourceLatch.countDown();
-            }
-        });
-        Assert.assertTrue(associatedResourceLatch.await(5, TimeUnit.SECONDS));
-
-        // Create another client, and perform the same request for the main resource, we expect the css NOT being pushed as the main request contains an
-        // if-modified-since header
-
-        final CountDownLatch mainStreamLatch = new CountDownLatch(2);
-        final CountDownLatch pushDataLatch = new CountDownLatch(1);
-        Session session2 = startClient(version, address, new SessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                Assert.assertTrue(stream.isUnidirectional());
-                return new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        dataInfo.consume(dataInfo.length());
-                        if (dataInfo.isClose())
-                            pushDataLatch.countDown();
-                    }
-                };
-            }
-        });
-        session2.syn(new SynInfo(mainRequestHeaders, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Assert.assertFalse(replyInfo.isClose());
-                mainStreamLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    mainStreamLatch.countDown();
-            }
-        });
-
-        Assert.assertTrue(mainStreamLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertFalse("We don't expect data to be pushed as the main request contained an if-modified-since header", pushDataLatch.await(1, TimeUnit.SECONDS));
-    }
-
-    private void validateHeaders(Fields headers, CountDownLatch pushSynHeadersValid)
-    {
-        if (validateUriHeader(headers))
-            pushSynHeadersValid.countDown();
-    }
-
-    private boolean validateHeader(Fields headers, String name, String expectedValue)
-    {
-        Fields.Field header = headers.get(name);
-        if (header != null && expectedValue.equals(header.getValue()))
-            return true;
-        System.out.println(name + " not valid! Expected: " + expectedValue + " headers received:" + headers);
-        return false;
-    }
-
-    private boolean validateUriHeader(Fields headers)
-    {
-        Fields.Field uriHeader = headers.get(HTTPSPDYHeader.URI.name(version));
-        if (uriHeader != null)
-            if (version == SPDY.V2 && uriHeader.getValue().startsWith("http://"))
-                return true;
-            else if (version == SPDY.V3 && uriHeader.getValue().startsWith("/")
-                    && headers.get(HTTPSPDYHeader.HOST.name(version)) != null && headers.get(HTTPSPDYHeader.SCHEME.name(version)) != null)
-                return true;
-        System.out.println(HTTPSPDYHeader.URI.name(version) + " not valid!");
-        return false;
-    }
-
-    private Fields createHeaders(String resource)
-    {
-        return createHeaders(resource, mainResource);
-    }
-
-    private Fields createHeaders(String resource, String referrer)
-    {
-        Fields associatedRequestHeaders = createHeadersWithoutReferrer(resource);
-        associatedRequestHeaders.put("referer", "http://localhost:" + connector.getLocalPort() + referrer);
-        return associatedRequestHeaders;
-    }
-
-    private Fields createHeadersWithoutReferrer(String resource)
-    {
-        Fields requestHeaders = new Fields();
-        requestHeaders.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:16.0) " +
-                "Gecko/20100101 Firefox/16.0");
-        requestHeaders.put("accept-encoding", "gzip");
-        requestHeaders.put(HTTPSPDYHeader.METHOD.name(version), "GET");
-        requestHeaders.put(HTTPSPDYHeader.URI.name(version), resource);
-        requestHeaders.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1");
-        requestHeaders.put(HTTPSPDYHeader.SCHEME.name(version), "http");
-        requestHeaders.put(HTTPSPDYHeader.HOST.name(version), "localhost:" + connector.getLocalPort());
-        return requestHeaders;
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ReferrerPushStrategyUnitTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ReferrerPushStrategyUnitTest.java
deleted file mode 100644
index a1001b5..0000000
--- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ReferrerPushStrategyUnitTest.java
+++ /dev/null
@@ -1,149 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.http;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-import static org.mockito.Mockito.when;
-
-import java.util.Arrays;
-import java.util.Set;
-
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.util.Fields;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-@RunWith(MockitoJUnitRunner.class)
-public class ReferrerPushStrategyUnitTest
-{
-    public static final short VERSION = SPDY.V3;
-    public static final String SCHEME = "http";
-    public static final String HOST = "localhost";
-    public static final String MAIN_URI = "/index.html";
-    public static final String METHOD = "GET";
-
-    // class under test
-    private ReferrerPushStrategy referrerPushStrategy = new ReferrerPushStrategy();
-
-    @Mock
-    Stream stream;
-    @Mock
-    Session session;
-
-
-    @Before
-    public void setup()
-    {
-        referrerPushStrategy.setUserAgentBlacklist(Arrays.asList(".*(?i)firefox/16.*"));
-    }
-
-    @Test
-    public void testReferrerCallsAfterTimeoutAreNotAddedAsPushResources() throws InterruptedException
-    {
-        Fields requestHeaders = getBaseHeaders(VERSION);
-        int referrerCallTimeout = 1000;
-        referrerPushStrategy.setReferrerPushPeriod(referrerCallTimeout);
-        setMockExpectations();
-
-        String referrerUrl = fillPushStrategyCache(requestHeaders);
-
-        // sleep to pretend that the user manually clicked on a linked resource instead the browser requesting sub
-        // resources immediately
-        Thread.sleep(referrerCallTimeout + 1);
-
-        requestHeaders.put(HTTPSPDYHeader.URI.name(VERSION), "image2.jpg");
-        requestHeaders.put("referer", referrerUrl);
-        Set<String> pushResources = referrerPushStrategy.apply(stream, requestHeaders, new Fields());
-        assertThat("pushResources is empty", pushResources.size(), is(0));
-
-        requestHeaders.put(HTTPSPDYHeader.URI.name(VERSION), MAIN_URI);
-        pushResources = referrerPushStrategy.apply(stream, requestHeaders, new Fields());
-        // as the image2.jpg request has been a link and not a sub resource, we expect that pushResources.size() is
-        // still 2
-        assertThat("pushResources contains two elements image.jpg and style.css", pushResources.size(), is(2));
-    }
-
-    @Test
-    public void testUserAgentFilter() throws InterruptedException
-    {
-        Fields requestHeaders = getBaseHeaders(VERSION);
-        setMockExpectations();
-
-        fillPushStrategyCache(requestHeaders);
-
-        Set<String> pushResources = referrerPushStrategy.apply(stream, requestHeaders, new Fields());
-        assertThat("pushResources contains two elements image.jpg and style.css as no user-agent header is present",
-                pushResources.size(), is(2));
-
-        requestHeaders.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4");
-        pushResources = referrerPushStrategy.apply(stream, requestHeaders, new Fields());
-        assertThat("pushResources contains two elements image.jpg and style.css as chrome is not blacklisted",
-                pushResources.size(), is(2));
-
-        requestHeaders.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:16.0) Gecko/20100101 Firefox/16.0");
-        pushResources = referrerPushStrategy.apply(stream, requestHeaders, new Fields());
-        assertThat("no resources are returned as we want to filter firefox", pushResources.size(), is(0));
-    }
-
-    private Fields getBaseHeaders(short version)
-    {
-        Fields requestHeaders = new Fields();
-        requestHeaders.put(HTTPSPDYHeader.SCHEME.name(version), SCHEME);
-        requestHeaders.put(HTTPSPDYHeader.HOST.name(version), HOST);
-        requestHeaders.put(HTTPSPDYHeader.URI.name(version), MAIN_URI);
-        requestHeaders.put(HTTPSPDYHeader.METHOD.name(version), METHOD);
-        return requestHeaders;
-    }
-
-    private void setMockExpectations()
-    {
-        when(stream.getSession()).thenReturn(session);
-        when(session.getVersion()).thenReturn(VERSION);
-    }
-
-    private String fillPushStrategyCache(Fields requestHeaders)
-    {
-        Set<String> pushResources = referrerPushStrategy.apply(stream, requestHeaders, new Fields());
-        assertThat("pushResources is empty", pushResources.size(), is(0));
-
-        String origin = SCHEME + "://" + HOST;
-        String referrerUrl = origin + MAIN_URI;
-
-        requestHeaders.put(HTTPSPDYHeader.URI.name(VERSION), "image.jpg");
-        requestHeaders.put("referer", referrerUrl);
-        pushResources = referrerPushStrategy.apply(stream, requestHeaders, new Fields());
-        assertThat("pushResources is empty", pushResources.size(), is(0));
-
-        requestHeaders.put(HTTPSPDYHeader.URI.name(VERSION), "style.css");
-        pushResources = referrerPushStrategy.apply(stream, requestHeaders, new Fields());
-        assertThat("pushResources is empty", pushResources.size(), is(0));
-
-        requestHeaders.put(HTTPSPDYHeader.URI.name(VERSION), MAIN_URI);
-        pushResources = referrerPushStrategy.apply(stream, requestHeaders, new Fields());
-        assertThat("pushResources contains two elements image.jpg and style.css", pushResources.size(), is(2));
-        return referrerUrl;
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/SPDYTestUtils.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/SPDYTestUtils.java
deleted file mode 100644
index f467bfa..0000000
--- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/SPDYTestUtils.java
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server.http;
-
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-
-public class SPDYTestUtils
-{
-    public static Fields createHeaders(String host, int port, short version, String httpMethod, String path)
-    {
-        Fields headers = new Fields();
-        headers.put(HTTPSPDYHeader.METHOD.name(version), httpMethod);
-        headers.put(HTTPSPDYHeader.URI.name(version), path);
-        headers.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1");
-        headers.put(HTTPSPDYHeader.SCHEME.name(version), "http");
-        headers.put(HTTPSPDYHeader.HOST.name(version), host + ":" + port);
-        return headers;
-    }
-
-    public static SslContextFactory newSslContextFactory()
-    {
-        SslContextFactory sslContextFactory = new SslContextFactory();
-        sslContextFactory.setEndpointIdentificationAlgorithm("");
-        sslContextFactory.setKeyStorePath("src/test/resources/keystore.jks");
-        sslContextFactory.setKeyStorePassword("storepwd");
-        sslContextFactory.setTrustStorePath("src/test/resources/truststore.jks");
-        sslContextFactory.setTrustStorePassword("storepwd");
-        sslContextFactory.setProtocol("TLSv1");
-        sslContextFactory.setIncludeProtocols("TLSv1");
-        return sslContextFactory;
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/SSLExternalServerTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/SSLExternalServerTest.java
deleted file mode 100644
index 89018f4..0000000
--- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/SSLExternalServerTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.http;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executor;
-import java.util.concurrent.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.client.SPDYClient;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.junit.Assert;
-import org.junit.Assume;
-import org.junit.Ignore;
-import org.junit.Test;
-
-public class SSLExternalServerTest extends AbstractHTTPSPDYTest
-{
-    public SSLExternalServerTest(short version)
-    {
-        // Google Servers do not support SPDY/2 anymore
-        super(SPDY.V3);
-    }
-
-    @Override
-    protected SPDYClient.Factory newSPDYClientFactory(Executor threadPool)
-    {
-        SslContextFactory sslContextFactory = new SslContextFactory();
-        // Force TLSv1
-        sslContextFactory.setIncludeProtocols("TLSv1");
-        sslContextFactory.setEndpointIdentificationAlgorithm("");
-        return new SPDYClient.Factory(threadPool, null, sslContextFactory, 30000);
-    }
-
-    @Test
-    @Ignore("Relies on an external server")
-    public void testExternalServer() throws Exception
-    {
-        String host = "encrypted.google.com";
-        int port = 443;
-        InetSocketAddress address = new InetSocketAddress(host, port);
-
-        try
-        {
-            // Test whether there is connectivity to avoid fail the test when offline
-            Socket socket = new Socket();
-            socket.connect(address, 5000);
-            socket.close();
-        }
-        catch (IOException x)
-        {
-            Assume.assumeNoException(x);
-        }
-
-        Session session = startClient(version, address, null);
-        Fields headers = new Fields();
-        headers.put(HTTPSPDYHeader.SCHEME.name(version), "https");
-        headers.put(HTTPSPDYHeader.HOST.name(version), host + ":" + port);
-        headers.put(HTTPSPDYHeader.METHOD.name(version), "GET");
-        headers.put(HTTPSPDYHeader.URI.name(version), "/");
-        headers.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1");
-        final CountDownLatch latch = new CountDownLatch(1);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields headers = replyInfo.getHeaders();
-                Fields.Field versionHeader = headers.get(HTTPSPDYHeader.STATUS.name(version));
-                if (versionHeader != null)
-                {
-                    Matcher matcher = Pattern.compile("(\\d{3}).*").matcher(versionHeader.getValue());
-                    if (matcher.matches() && Integer.parseInt(matcher.group(1)) < 400)
-                        latch.countDown();
-                }
-            }
-        });
-        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ServerHTTPSPDYTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ServerHTTPSPDYTest.java
deleted file mode 100644
index cbc577b..0000000
--- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ServerHTTPSPDYTest.java
+++ /dev/null
@@ -1,1625 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.http;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicInteger;
-import javax.servlet.AsyncContext;
-import javax.servlet.AsyncEvent;
-import javax.servlet.AsyncListener;
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.http.HttpHeader;
-import org.eclipse.jetty.server.HttpChannel;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-import org.eclipse.jetty.spdy.api.BytesDataInfo;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StringDataInfo;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.log.StdErrLog;
-import org.junit.Assert;
-import org.junit.Test;
-
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.hamcrest.core.IsInstanceOf.instanceOf;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest
-{
-    public static final String SUSPENDED_ATTRIBUTE = ServerHTTPSPDYTest.class.getName() + ".SUSPENDED";
-
-    public ServerHTTPSPDYTest(short version)
-    {
-        super(version);
-    }
-
-    @Test
-    public void testSimpleGET() throws Exception
-    {
-        final String path = "/foo";
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                assertEquals("GET", httpRequest.getMethod());
-                assertEquals(path, target);
-                assertEquals(path, httpRequest.getRequestURI());
-                assertThat("accept-encoding is set to gzip, even if client didn't set it",
-                        httpRequest.getHeader("accept-encoding"), containsString("gzip"));
-                assertThat(httpRequest.getHeader("host"), is("localhost:" + connector.getLocalPort()));
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getLocalPort(), version, "GET", path);
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                assertTrue(replyInfo.isClose());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertThat(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"), is(true));
-                assertThat(replyHeaders.get(HttpHeader.SERVER.asString()), is(notNullValue()));
-                assertThat(replyHeaders.get(HttpHeader.X_POWERED_BY.asString()), is(notNullValue()));
-                replyLatch.countDown();
-            }
-        });
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testGETWithQueryString() throws Exception
-    {
-        final String path = "/foo";
-        final String query = "p=1";
-        final String uri = path + "?" + query;
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                assertEquals("GET", httpRequest.getMethod());
-                assertEquals(path, target);
-                assertEquals(path, httpRequest.getRequestURI());
-                assertEquals(query, httpRequest.getQueryString());
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", uri);
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                assertTrue(replyInfo.isClose());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                replyLatch.countDown();
-            }
-        });
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testGETWithCookies() throws Exception
-    {
-        final String path = "/foo";
-        final String uri = path;
-        final String cookie1 = "cookie1";
-        final String cookie2 = "cookie2";
-        final String cookie1Value = "cookie 1 value";
-        final String cookie2Value = "cookie 2 value";
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                httpResponse.addCookie(new Cookie(cookie1, cookie1Value));
-                httpResponse.addCookie(new Cookie(cookie2, cookie2Value));
-                assertThat("method is GET", httpRequest.getMethod(), is("GET"));
-                assertThat("target is /foo", target, is(path));
-                assertThat("requestUri is /foo", httpRequest.getRequestURI(), is(path));
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", uri);
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                assertThat("isClose is true", replyInfo.isClose(), is(true));
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertThat("response code is 200 OK", replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue()
-                        .contains("200"), is(true));
-                assertThat(replyInfo.getHeaders().get("Set-Cookie").getValues().get(0), is(cookie1 + "=\"" + cookie1Value +
-                        "\";Version=1"));
-                assertThat(replyInfo.getHeaders().get("Set-Cookie").getValues().get(1), is(cookie2 + "=\"" + cookie2Value +
-                        "\";Version=1"));
-                replyLatch.countDown();
-            }
-        });
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testHEAD() throws Exception
-    {
-        final String path = "/foo";
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                assertEquals("HEAD", httpRequest.getMethod());
-                assertEquals(path, target);
-                assertEquals(path, httpRequest.getRequestURI());
-                httpResponse.getWriter().write("body that shouldn't be sent on a HEAD request");
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "HEAD", path);
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                assertTrue(replyInfo.isClose());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                fail("HEAD request shouldn't send any data");
-            }
-        });
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testPOSTWithDelayedContentBody() throws Exception
-    {
-        final String path = "/foo";
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                // don't read the request body, reply immediately
-                request.setHandled(true);
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", path);
-        headers.put("content-type", "application/x-www-form-urlencoded");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0),
-                new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onReply(Stream stream, ReplyInfo replyInfo)
-                    {
-                        assertTrue(replyInfo.isClose());
-                        Fields replyHeaders = replyInfo.getHeaders();
-                        assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                        replyLatch.countDown();
-                    }
-                });
-        stream.data(new StringDataInfo("a", false));
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        stream.data(new StringDataInfo("b", true));
-    }
-
-    @Test
-    public void testPOSTWithParameters() throws Exception
-    {
-        final String path = "/foo";
-        final String data = "a=1&b=2";
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                assertEquals("POST", httpRequest.getMethod());
-                assertEquals("1", httpRequest.getParameter("a"));
-                assertEquals("2", httpRequest.getParameter("b"));
-                assertNotNull(httpRequest.getRemoteHost());
-                assertNotNull(httpRequest.getRemotePort());
-                assertNotNull(httpRequest.getRemoteAddr());
-                assertNotNull(httpRequest.getLocalPort());
-                assertNotNull(httpRequest.getLocalName());
-                assertNotNull(httpRequest.getLocalAddr());
-                assertNotNull(httpRequest.getServerPort());
-                assertNotNull(httpRequest.getServerName());
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", path);
-        headers.put("content-type", "application/x-www-form-urlencoded");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0),
-                new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onReply(Stream stream, ReplyInfo replyInfo)
-                    {
-                        assertTrue(replyInfo.isClose());
-                        Fields replyHeaders = replyInfo.getHeaders();
-                        assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                        replyLatch.countDown();
-                    }
-                });
-        stream.data(new StringDataInfo(data, true));
-
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testPOSTWithParametersInTwoFramesTwoReads() throws Exception
-    {
-        final String path = "/foo";
-        final String data1 = "a=1&";
-        final String data2 = "b=2";
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                assertEquals("POST", httpRequest.getMethod());
-                assertEquals("1", httpRequest.getParameter("a"));
-                assertEquals("2", httpRequest.getParameter("b"));
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", path);
-        headers.put("content-type", "application/x-www-form-urlencoded");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0),
-                new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onReply(Stream stream, ReplyInfo replyInfo)
-                    {
-                        assertTrue(replyInfo.isClose());
-                        Fields replyHeaders = replyInfo.getHeaders();
-                        assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                        replyLatch.countDown();
-                    }
-                });
-        // Sleep between the data frames so that they will be read in 2 reads
-        stream.data(new StringDataInfo(data1, false));
-        Thread.sleep(1000);
-        stream.data(new StringDataInfo(data2, true));
-
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testPOSTWithParametersInTwoFramesOneRead() throws Exception
-    {
-        final String path = "/foo";
-        final String data1 = "a=1&";
-        final String data2 = "b=2";
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                assertEquals("POST", httpRequest.getMethod());
-                assertEquals("1", httpRequest.getParameter("a"));
-                assertEquals("2", httpRequest.getParameter("b"));
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", path);
-        headers.put("content-type", "application/x-www-form-urlencoded");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                assertTrue(replyInfo.isClose());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.toString(), replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                replyLatch.countDown();
-            }
-        });
-
-        // Send the data frames consecutively, so the server reads both frames in one read
-        stream.data(new StringDataInfo(data1, false));
-        stream.data(new StringDataInfo(data2, true));
-
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testGETWithSmallResponseContent() throws Exception
-    {
-        final String data = "0123456789ABCDEF";
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                httpResponse.setStatus(HttpServletResponse.SC_OK);
-                ServletOutputStream output = httpResponse.getOutputStream();
-                output.write(data.getBytes(StandardCharsets.UTF_8));
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Assert.assertFalse(replyInfo.isClose());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                assertTrue(dataInfo.isClose());
-                assertEquals(data, dataInfo.asString(StandardCharsets.UTF_8, true));
-                dataLatch.countDown();
-            }
-        });
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testGETWithOneByteResponseContent() throws Exception
-    {
-        final char data = 'x';
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                httpResponse.setStatus(HttpServletResponse.SC_OK);
-                ServletOutputStream output = httpResponse.getOutputStream();
-                output.write(data);
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Assert.assertFalse(replyInfo.isClose());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                assertTrue(dataInfo.isClose());
-                byte[] bytes = dataInfo.asBytes(true);
-                assertEquals(1, bytes.length);
-                assertEquals(data, bytes[0]);
-                dataLatch.countDown();
-            }
-        });
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testGETWithSmallResponseContentInTwoChunks() throws Exception
-    {
-        final String data1 = "0123456789ABCDEF";
-        final String data2 = "FEDCBA9876543210";
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                httpResponse.setStatus(HttpServletResponse.SC_OK);
-                ServletOutputStream output = httpResponse.getOutputStream();
-                output.write(data1.getBytes(StandardCharsets.UTF_8));
-                output.flush();
-                output.write(data2.getBytes(StandardCharsets.UTF_8));
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(2);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            private final AtomicInteger replyFrames = new AtomicInteger();
-            private final AtomicInteger dataFrames = new AtomicInteger();
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                assertEquals(1, replyFrames.incrementAndGet());
-                Assert.assertFalse(replyInfo.isClose());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                int data = dataFrames.incrementAndGet();
-                assertTrue(data >= 1 && data <= 2);
-                if (data == 1)
-                    assertEquals(data1, dataInfo.asString(StandardCharsets.UTF_8, true));
-                else
-                    assertEquals(data2, dataInfo.asString(StandardCharsets.UTF_8, true));
-                dataLatch.countDown();
-            }
-        });
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testGETWithBigResponseContentInOneWrite() throws Exception
-    {
-        final byte[] data = new byte[128 * 1024];
-        Arrays.fill(data, (byte)'x');
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                httpResponse.setStatus(HttpServletResponse.SC_OK);
-                ServletOutputStream output = httpResponse.getOutputStream();
-                output.write(data);
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            private final AtomicInteger contentBytes = new AtomicInteger();
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Assert.assertFalse(replyInfo.isClose());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                contentBytes.addAndGet(dataInfo.asByteBuffer(true).remaining());
-                if (dataInfo.isClose())
-                {
-                    assertEquals(data.length, contentBytes.get());
-                    dataLatch.countDown();
-                }
-            }
-        });
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testGETWithBigResponseContentInMultipleWrites() throws Exception
-    {
-        final byte[] data = new byte[4 * 1024];
-        Arrays.fill(data, (byte)'x');
-        final int writeTimes = 16;
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                httpResponse.setStatus(HttpServletResponse.SC_OK);
-                ServletOutputStream output = httpResponse.getOutputStream();
-                for (int i = 0; i < writeTimes; i++)
-                {
-                    output.write(data);
-                }
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            private final AtomicInteger contentBytes = new AtomicInteger();
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Assert.assertFalse(replyInfo.isClose());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                contentBytes.addAndGet(dataInfo.asByteBuffer(true).remaining());
-                if (dataInfo.isClose())
-                {
-                    assertEquals(data.length * writeTimes, contentBytes.get());
-                    dataLatch.countDown();
-                }
-            }
-        });
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testGETWithBigResponseContentInTwoWrites() throws Exception
-    {
-        final byte[] data = new byte[128 * 1024];
-        Arrays.fill(data, (byte)'y');
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                httpResponse.setStatus(HttpServletResponse.SC_OK);
-                ServletOutputStream output = httpResponse.getOutputStream();
-                output.write(data);
-                output.write(data);
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            private final AtomicInteger contentBytes = new AtomicInteger();
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Assert.assertFalse(replyInfo.isClose());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                contentBytes.addAndGet(dataInfo.asByteBuffer(true).remaining());
-                if (dataInfo.isClose())
-                {
-                    assertEquals(2 * data.length, contentBytes.get());
-                    dataLatch.countDown();
-                }
-            }
-        });
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testGETWithOutputStreamFlushedAndClosed() throws Exception
-    {
-        final String data = "0123456789ABCDEF";
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                httpResponse.setStatus(HttpServletResponse.SC_OK);
-                ServletOutputStream output = httpResponse.getOutputStream();
-                output.write(data.getBytes(StandardCharsets.UTF_8));
-                output.flush();
-                output.close();
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            private final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Assert.assertFalse(replyInfo.isClose());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                ByteBuffer byteBuffer = dataInfo.asByteBuffer(true);
-                while (byteBuffer.hasRemaining())
-                    buffer.write(byteBuffer.get());
-                if (dataInfo.isClose())
-                {
-                    assertEquals(data, new String(buffer.toByteArray(), StandardCharsets.UTF_8));
-                    dataLatch.countDown();
-                }
-            }
-        });
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testGETWithResponseResetBuffer() throws Exception
-    {
-        final String data1 = "0123456789ABCDEF";
-        final String data2 = "FEDCBA9876543210";
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                httpResponse.setStatus(HttpServletResponse.SC_OK);
-                ServletOutputStream output = httpResponse.getOutputStream();
-                // Write some
-                output.write(data1.getBytes(StandardCharsets.UTF_8));
-                // But then change your mind and reset the buffer
-                httpResponse.resetBuffer();
-                output.write(data2.getBytes(StandardCharsets.UTF_8));
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            private final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Assert.assertFalse(replyInfo.isClose());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                ByteBuffer byteBuffer = dataInfo.asByteBuffer(true);
-                while (byteBuffer.hasRemaining())
-                    buffer.write(byteBuffer.get());
-                if (dataInfo.isClose())
-                {
-                    assertEquals(data2, new String(buffer.toByteArray(), StandardCharsets.UTF_8));
-                    dataLatch.countDown();
-                }
-            }
-        });
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testGETWithRedirect() throws Exception
-    {
-        final String suffix = "/redirect";
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                String location = httpResponse.encodeRedirectURL(String.format("%s://%s:%d%s",
-                        request.getScheme(), request.getLocalAddr(), request.getLocalPort(), target + suffix));
-                httpResponse.sendRedirect(location);
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            private final AtomicInteger replies = new AtomicInteger();
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                assertEquals(1, replies.incrementAndGet());
-                assertTrue(replyInfo.isClose());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("302"));
-                assertTrue(replyHeaders.get("location").getValue().endsWith(suffix));
-                replyLatch.countDown();
-            }
-        });
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testGETWithSendError() throws Exception
-    {
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                httpResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            private final AtomicInteger replies = new AtomicInteger();
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                assertEquals(1, replies.incrementAndGet());
-                Assert.assertFalse(replyInfo.isClose());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("404"));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                if (dataInfo.isClose())
-                    dataLatch.countDown();
-            }
-        });
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testGETWithException() throws Exception
-    {
-        StdErrLog log = StdErrLog.getLogger(HttpChannel.class);
-        log.setHideStacks(true);
-
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                throw new NullPointerException("thrown_explicitly_by_the_test");
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch latch = new CountDownLatch(1);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            private final AtomicInteger replies = new AtomicInteger();
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                assertEquals(1, replies.incrementAndGet());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("500"));
-                replyLatch.countDown();
-                if (replyInfo.isClose())
-                    latch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                if (dataInfo.isClose())
-                    latch.countDown();
-            }
-        });
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(latch.await(5, TimeUnit.SECONDS));
-
-        log.setHideStacks(false);
-    }
-
-    @Test
-    public void testGETWithSmallResponseContentChunked() throws Exception
-    {
-        final String pangram1 = "the quick brown fox jumps over the lazy dog";
-        final String pangram2 = "qualche vago ione tipo zolfo, bromo, sodio";
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                httpResponse.setHeader("Transfer-Encoding", "chunked");
-                ServletOutputStream output = httpResponse.getOutputStream();
-                output.write(pangram1.getBytes(StandardCharsets.UTF_8));
-                httpResponse.setHeader("EXTRA", "X");
-                output.flush();
-                output.write(pangram2.getBytes(StandardCharsets.UTF_8));
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(2);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            private final AtomicInteger replyFrames = new AtomicInteger();
-            private final AtomicInteger dataFrames = new AtomicInteger();
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                assertEquals(1, replyFrames.incrementAndGet());
-                Assert.assertFalse(replyInfo.isClose());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                assertTrue(replyHeaders.get("extra").getValue().contains("X"));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                int count = dataFrames.incrementAndGet();
-                if (count == 1)
-                {
-                    Assert.assertFalse(dataInfo.isClose());
-                    assertEquals(pangram1, dataInfo.asString(StandardCharsets.UTF_8, true));
-                }
-                else if (count == 2)
-                {
-                    assertTrue(dataInfo.isClose());
-                    assertEquals(pangram2, dataInfo.asString(StandardCharsets.UTF_8, true));
-                }
-                dataLatch.countDown();
-            }
-        });
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testGETWithMediumContentAsBufferByPassed() throws Exception
-    {
-        final byte[] data = new byte[2048];
-
-        final CountDownLatch handlerLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                request.getResponse().getHttpOutput().sendContent(ByteBuffer.wrap(data));
-                handlerLatch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            private final AtomicInteger replyFrames = new AtomicInteger();
-            private final AtomicInteger contentLength = new AtomicInteger();
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                assertEquals(1, replyFrames.incrementAndGet());
-                Assert.assertFalse(replyInfo.isClose());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                contentLength.addAndGet(dataInfo.asBytes(true).length);
-                if (dataInfo.isClose())
-                {
-                    Assert.assertEquals(data.length, contentLength.get());
-                    dataLatch.countDown();
-                }
-            }
-        });
-        assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testGETWithMultipleMediumContentByPassed() throws Exception
-    {
-        final byte[] data = new byte[2048];
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                // The sequence of write/flush/write/write below triggers a condition where
-                // HttpGenerator._bypass is set to true on the second write(), and the
-                // third write causes an infinite spin loop on the third write().
-                request.setHandled(true);
-                OutputStream output = httpResponse.getOutputStream();
-                output.write(data);
-                output.flush();
-                output.write(data);
-                output.write(data);
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-        final AtomicInteger contentLength = new AtomicInteger();
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Assert.assertFalse(replyInfo.isClose());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.available());
-                contentLength.addAndGet(dataInfo.length());
-                if (dataInfo.isClose())
-                    dataLatch.countDown();
-            }
-        });
-        assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
-        assertEquals(3 * data.length, contentLength.get());
-    }
-
-    @Test
-    public void testPOSTThenSuspendRequestThenReadOneChunkThenComplete() throws Exception
-    {
-        final byte[] data = new byte[2000];
-        final CountDownLatch latch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, final Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                final AsyncContext asyncContext = request.startAsync();
-                new Thread()
-                {
-                    @Override
-                    public void run()
-                    {
-                        try
-                        {
-                            readRequestData(request, data.length);
-                            asyncContext.complete();
-                            latch.countDown();
-                        }
-                        catch (IOException x)
-                        {
-                            x.printStackTrace();
-                        }
-                    }
-                }.start();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", "/foo");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                replyLatch.countDown();
-            }
-        });
-        stream.data(new BytesDataInfo(data, true));
-
-        assertTrue(latch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testPOSTThenSuspendExpire() throws Exception
-    {
-        final CountDownLatch dispatchedAgainAfterExpire = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, final Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                if (request.getAttribute(SUSPENDED_ATTRIBUTE) == Boolean.TRUE)
-                {
-                    dispatchedAgainAfterExpire.countDown();
-                }
-                else
-                {
-                    AsyncContext asyncContext = request.startAsync();
-                    asyncContext.setTimeout(1000);
-                    asyncContext.addListener(new AsyncListenerAdapter());
-                    request.setAttribute(SUSPENDED_ATTRIBUTE, Boolean.TRUE);
-                }
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", "/foo");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, true, (byte)0), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                replyLatch.countDown();
-            }
-        });
-
-        assertTrue("Not dispatched again after expire", dispatchedAgainAfterExpire.await(5,
-                TimeUnit.SECONDS));
-        assertTrue("Reply not sent", replyLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testPOSTThenSuspendExpireWithRequestData() throws Exception
-    {
-        final byte[] data = new byte[2000];
-        final CountDownLatch dispatchedAgainAfterExpire = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, final Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                if (request.getAttribute(SUSPENDED_ATTRIBUTE) == Boolean.TRUE)
-                {
-                    dispatchedAgainAfterExpire.countDown();
-                }
-                else
-                {
-                    readRequestData(request, data.length);
-                    AsyncContext asyncContext = request.startAsync();
-                    asyncContext.setTimeout(1000);
-                    asyncContext.addListener(new AsyncListenerAdapter());
-                    request.setAttribute(SUSPENDED_ATTRIBUTE, Boolean.TRUE);
-                }
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", "/foo");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                replyLatch.countDown();
-            }
-        });
-        stream.data(new BytesDataInfo(data, true));
-
-        assertTrue("Not dispatched again after expire", dispatchedAgainAfterExpire.await(5,
-                TimeUnit.SECONDS));
-        assertTrue("Reply not sent", replyLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    private void readRequestData(Request request, int expectedDataLength) throws IOException
-    {
-        InputStream input = request.getInputStream();
-        byte[] buffer = new byte[512];
-        int read = 0;
-        while (read < expectedDataLength)
-            read += input.read(buffer);
-    }
-
-    @Test
-    public void testPOSTThenSuspendRequestThenReadTwoChunksThenComplete() throws Exception
-    {
-        final byte[] data = new byte[2000];
-        final CountDownLatch latch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, final Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                final AsyncContext asyncContext = request.startAsync();
-                new Thread()
-                {
-                    @Override
-                    public void run()
-                    {
-                        try
-                        {
-                            InputStream input = request.getInputStream();
-                            byte[] buffer = new byte[512];
-                            int read = 0;
-                            while (read < 2 * data.length)
-                                read += input.read(buffer);
-                            asyncContext.complete();
-                            latch.countDown();
-                        }
-                        catch (IOException x)
-                        {
-                            x.printStackTrace();
-                        }
-                    }
-                }.start();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", "/foo");
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                replyLatch.countDown();
-            }
-        });
-        stream.data(new BytesDataInfo(data, false));
-        stream.data(new BytesDataInfo(data, true));
-
-        assertTrue(latch.await(5, TimeUnit.SECONDS));
-        assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testPOSTThenSuspendRequestThenResumeThenRespond() throws Exception
-    {
-        final byte[] data = new byte[1000];
-        final CountDownLatch latch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, final Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                if (request.getAttribute(SUSPENDED_ATTRIBUTE) == Boolean.TRUE)
-                {
-                    OutputStream output = httpResponse.getOutputStream();
-                    output.write(data);
-                }
-                else
-                {
-                    final AsyncContext asyncContext = request.startAsync();
-                    request.setAttribute(SUSPENDED_ATTRIBUTE, Boolean.TRUE);
-                    InputStream input = request.getInputStream();
-                    byte[] buffer = new byte[256];
-                    int read = 0;
-                    while (read < data.length)
-                        read += input.read(buffer);
-                    new Thread()
-                    {
-                        @Override
-                        public void run()
-                        {
-                            try
-                            {
-                                TimeUnit.SECONDS.sleep(1);
-                                asyncContext.dispatch();
-                                latch.countDown();
-                            }
-                            catch (InterruptedException x)
-                            {
-                                x.printStackTrace();
-                            }
-                        }
-                    }.start();
-                }
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", "/foo");
-        final CountDownLatch responseLatch = new CountDownLatch(2);
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                responseLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                if (dataInfo.isClose())
-                    responseLatch.countDown();
-            }
-        });
-        stream.data(new BytesDataInfo(data, true));
-
-        assertTrue(latch.await(5, TimeUnit.SECONDS));
-        assertTrue(responseLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testPOSTThenResponseWithoutReadingContent() throws Exception
-    {
-        final byte[] data = new byte[1000];
-        final CountDownLatch latch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, final Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                latch.countDown();
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", "/foo");
-        final CountDownLatch responseLatch = new CountDownLatch(1);
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"));
-                responseLatch.countDown();
-            }
-        });
-        stream.data(new BytesDataInfo(data, false));
-        stream.data(new BytesDataInfo(5, TimeUnit.SECONDS, data, true));
-
-        assertTrue(latch.await(5, TimeUnit.SECONDS));
-        assertTrue(responseLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testIdleTimeout() throws Exception
-    {
-        final int idleTimeout = 500;
-        final CountDownLatch timeoutReceivedLatch = new CountDownLatch(1);
-
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, final Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                try
-                {
-                    Thread.sleep(2 * idleTimeout);
-                }
-                catch (InterruptedException e)
-                {
-                    throw new RuntimeException(e);
-                }
-                request.setHandled(true);
-            }
-        }, 30000), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/");
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, true, (byte)0),
-                new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onFailure(Stream stream, Throwable x)
-                    {
-                        assertThat("we got a TimeoutException", x, instanceOf(TimeoutException.class));
-                        timeoutReceivedLatch.countDown();
-                    }
-                });
-        stream.setIdleTimeout(idleTimeout);
-
-        assertThat("idle timeout hit", timeoutReceivedLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    @Test
-    public void testIdleTimeoutSetOnConnectionOnly() throws Exception
-    {
-        final int idleTimeout = 500;
-        final CountDownLatch timeoutReceivedLatch = new CountDownLatch(1);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, final Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                try
-                {
-                    Thread.sleep(2 * idleTimeout);
-                }
-                catch (InterruptedException e)
-                {
-                    throw new RuntimeException(e);
-                }
-                request.setHandled(true);
-            }
-        }, idleTimeout), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/");
-        session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, true, (byte)0),
-                new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onFailure(Stream stream, Throwable x)
-                    {
-                        assertThat("we got a TimeoutException", x, instanceOf(TimeoutException.class));
-                        timeoutReceivedLatch.countDown();
-                    }
-                });
-
-        assertThat("idle timeout hit", timeoutReceivedLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    @Test
-    public void testSingleStreamIdleTimeout() throws Exception
-    {
-        final int idleTimeout = 500;
-        final CountDownLatch timeoutReceivedLatch = new CountDownLatch(1);
-        final CountDownLatch replyReceivedLatch = new CountDownLatch(3);
-        Session session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, final Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                if ("true".equals(request.getHeader("slow")))
-                {
-                    try
-                    {
-                        Thread.sleep(2 * idleTimeout);
-                    }
-                    catch (InterruptedException e)
-                    {
-                        throw new RuntimeException(e);
-                    }
-                }
-                request.setHandled(true);
-            }
-        }, idleTimeout), null);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/");
-        Fields slowHeaders = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/");
-        slowHeaders.add("slow", "true");
-        sendSingleRequestThatIsNotExpectedToTimeout(replyReceivedLatch, session, headers);
-        session.syn(new SynInfo(5, TimeUnit.SECONDS, slowHeaders, true, (byte)0),
-                new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onFailure(Stream stream, Throwable x)
-                    {
-                        assertThat("we got a TimeoutException", x, instanceOf(TimeoutException.class));
-                        timeoutReceivedLatch.countDown();
-                    }
-                });
-        Thread.sleep(idleTimeout / 2);
-        sendSingleRequestThatIsNotExpectedToTimeout(replyReceivedLatch, session, headers);
-        Thread.sleep(idleTimeout / 2);
-        sendSingleRequestThatIsNotExpectedToTimeout(replyReceivedLatch, session, headers);
-        assertThat("idle timeout hit", timeoutReceivedLatch.await(5, TimeUnit.SECONDS), is(true));
-        assertThat("received replies on 3 non idle requests", replyReceivedLatch.await(5, TimeUnit.SECONDS),
-                is(true));
-    }
-
-    private void sendSingleRequestThatIsNotExpectedToTimeout(final CountDownLatch replyReceivedLatch, Session session, Fields headers) throws ExecutionException, InterruptedException, TimeoutException
-    {
-        session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, true, (byte)0),
-                new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onReply(Stream stream, ReplyInfo replyInfo)
-                    {
-                        replyReceivedLatch.countDown();
-                    }
-                });
-    }
-
-    private class AsyncListenerAdapter implements AsyncListener
-    {
-        @Override
-        public void onStartAsync(AsyncEvent event) throws IOException
-        {
-        }
-
-        @Override
-        public void onComplete(AsyncEvent event) throws IOException
-        {
-        }
-
-        @Override
-        public void onTimeout(AsyncEvent event) throws IOException
-        {
-            event.getAsyncContext().dispatch();
-        }
-
-        @Override
-        public void onError(AsyncEvent event) throws IOException
-        {
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/SimpleHTTPBenchmarkTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/SimpleHTTPBenchmarkTest.java
deleted file mode 100644
index 9f3a3c7..0000000
--- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/SimpleHTTPBenchmarkTest.java
+++ /dev/null
@@ -1,160 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.http;
-
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.util.Random;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.http.HttpHeader;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-import org.hamcrest.CoreMatchers;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-
-@Ignore("So far only used for testing performance tweaks. So no need to run it in a build")
-public class SimpleHTTPBenchmarkTest extends AbstractHTTPSPDYTest
-{
-    private static final Logger LOG = Log.getLogger(SimpleHTTPBenchmarkTest.class);
-    private final int dataSize = 4096 * 100;
-    private Session session;
-    private int requestCount = 100;
-
-    public SimpleHTTPBenchmarkTest(short version)
-    {
-        super(version);
-    }
-
-    @Before
-    public void setUp() throws Exception
-    {
-        final byte[] data = new byte[dataSize];
-        new Random().nextBytes(data);
-        session = startClient(version, startHTTPServer(version, new AbstractHandler()
-        {
-            @Override
-            public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
-                    throws IOException, ServletException
-            {
-                request.setHandled(true);
-                assertEquals("GET", httpRequest.getMethod());
-                assertThat("accept-encoding is set to gzip, even if client didn't set it",
-                        httpRequest.getHeader("accept-encoding"), containsString("gzip"));
-                assertThat(httpRequest.getHeader("host"), is("localhost:" + connector.getLocalPort()));
-                httpResponse.getOutputStream().write(data);
-            }
-        }, 0), null);
-    }
-
-    @Test
-    public void testRunBenchmark() throws Exception
-    {
-        long overallStart = System.nanoTime();
-        int iterations = 20;
-        for (int j = 0; j < iterations; j++)
-        {
-            long start = System.nanoTime();
-            for (int i = 0; i < requestCount; i++)
-                sendGetRequestWithData();
-            long timeElapsed = System.nanoTime() - start;
-            LOG.info("Requests with {}b response took: {}ms", dataSize, timeElapsed / 1000 / 1000);
-        }
-        long timeElapsedOverall = (System.nanoTime() - overallStart) / 1000 / 1000;
-        LOG.info("Time elapsed overall: {}ms avg: {}ms", timeElapsedOverall, timeElapsedOverall / iterations);
-    }
-
-    private void sendGetRequest() throws Exception
-    {
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final String path = "/foo";
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getLocalPort(), version, "GET", path);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                assertTrue(replyInfo.isClose());
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertThat(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"), CoreMatchers.is(true));
-                assertThat(replyHeaders.get(HttpHeader.SERVER.asString()), CoreMatchers.is(notNullValue()));
-                assertThat(replyHeaders.get(HttpHeader.X_POWERED_BY.asString()), CoreMatchers.is(notNullValue()));
-                replyLatch.countDown();
-            }
-        });
-
-        assertThat("reply has been received", replyLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    private void sendGetRequestWithData() throws Exception
-    {
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-        final String path = "/foo";
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getLocalPort(), version, "GET", path);
-        session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields replyHeaders = replyInfo.getHeaders();
-                assertThat(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"), CoreMatchers.is(true));
-                assertThat(replyHeaders.get(HttpHeader.SERVER.asString()), CoreMatchers.is(notNullValue()));
-                assertThat(replyHeaders.get(HttpHeader.X_POWERED_BY.asString()), CoreMatchers.is(notNullValue()));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.available());
-                if (dataInfo.isClose())
-                    dataLatch.countDown();
-            }
-        });
-
-        assertThat("reply has been received", replyLatch.await(5, TimeUnit.SECONDS), is(true));
-        assertThat("data has been received", dataLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxyHTTPToSPDYTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxyHTTPToSPDYTest.java
deleted file mode 100644
index cbf9202..0000000
--- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxyHTTPToSPDYTest.java
+++ /dev/null
@@ -1,408 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.proxy;
-
-import java.net.InetSocketAddress;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.ContentResponse;
-import org.eclipse.jetty.client.api.Request;
-import org.eclipse.jetty.client.util.StringContentProvider;
-import org.eclipse.jetty.http.HttpHeader;
-import org.eclipse.jetty.http.HttpMethod;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.spdy.api.BytesDataInfo;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.GoAwayResultInfo;
-import org.eclipse.jetty.spdy.api.PushInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.RstInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.spdy.client.SPDYClient;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.spdy.server.SPDYServerConnectionFactory;
-import org.eclipse.jetty.spdy.server.SPDYServerConnector;
-import org.eclipse.jetty.toolchain.test.TestTracker;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.Promise;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-@RunWith(Parameterized.class)
-public class ProxyHTTPToSPDYTest
-{
-    @Parameterized.Parameters
-    public static Collection<Short[]> parameters()
-    {
-        return Arrays.asList(new Short[]{SPDY.V2}, new Short[]{SPDY.V3});
-    }
-
-    @Rule
-    public final TestTracker tracker = new TestTracker();
-    private final short version;
-    private HttpClient httpClient;
-    private HttpClient httpClient2;
-    private SPDYClient.Factory factory;
-    private Server server;
-    private Server proxy;
-    private ServerConnector proxyConnector;
-
-    public ProxyHTTPToSPDYTest(short version)
-    {
-        this.version = version;
-    }
-
-    protected InetSocketAddress startServer(ServerSessionFrameListener listener) throws Exception
-    {
-        server = new Server();
-        SPDYServerConnector serverConnector = new SPDYServerConnector(server, listener);
-        serverConnector.addConnectionFactory(new SPDYServerConnectionFactory(version, listener));
-        serverConnector.setPort(0);
-        server.addConnector(serverConnector);
-        server.start();
-        return new InetSocketAddress("localhost", serverConnector.getLocalPort());
-    }
-
-    protected InetSocketAddress startProxy(InetSocketAddress address) throws Exception
-    {
-        proxy = new Server();
-        ProxyEngineSelector proxyEngineSelector = new ProxyEngineSelector();
-        SPDYProxyEngine spdyProxyEngine = new SPDYProxyEngine(factory);
-        proxyEngineSelector.putProxyEngine("spdy/" + version, spdyProxyEngine);
-        proxyEngineSelector.putProxyServerInfo("localhost", new ProxyEngineSelector.ProxyServerInfo("spdy/" + version, address.getHostName(), address.getPort()));
-        proxyConnector = new HTTPSPDYProxyServerConnector(proxy, proxyEngineSelector);
-        proxyConnector.setPort(9999);
-        proxy.addConnector(proxyConnector);
-        proxy.start();
-        return new InetSocketAddress("localhost", proxyConnector.getLocalPort());
-    }
-
-    @Before
-    public void init() throws Exception
-    {
-        factory = new SPDYClient.Factory();
-        factory.start();
-        httpClient = new HttpClient();
-        httpClient.start();
-        httpClient2 = new HttpClient();
-        httpClient2.start();
-    }
-
-    @After
-    public void destroy() throws Exception
-    {
-        httpClient.stop();
-        httpClient2.stop();
-        if (server != null)
-        {
-            server.stop();
-            server.join();
-        }
-        if (proxy != null)
-        {
-            proxy.stop();
-            proxy.join();
-        }
-        factory.stop();
-    }
-
-    @Test
-    public void testClosingClientDoesNotCloseServer() throws Exception
-    {
-        final CountDownLatch closeLatch = new CountDownLatch(1);
-        InetSocketAddress proxyAddress = startProxy(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                Fields responseHeaders = new Fields();
-                responseHeaders.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1");
-                responseHeaders.put(HTTPSPDYHeader.STATUS.name(version), "200 OK");
-                stream.reply(new ReplyInfo(responseHeaders, true), new Callback.Adapter());
-                return null;
-            }
-
-            @Override
-            public void onGoAway(Session session, GoAwayResultInfo goAwayInfo)
-            {
-                closeLatch.countDown();
-            }
-        }));
-
-        Request request = httpClient.newRequest("localhost", proxyAddress.getPort()).method("GET");
-        request.header("Connection", "close");
-        ContentResponse response = request.send();
-
-        assertThat("response status is 200 OK", response.getStatus(), is(200));
-
-        // Must not close, other clients may still be connected
-        Assert.assertFalse(closeLatch.await(1, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testGETThenNoContentFromTwoClients() throws Exception
-    {
-        InetSocketAddress proxyAddress = startProxy(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                Assert.assertTrue(synInfo.isClose());
-                Fields requestHeaders = synInfo.getHeaders();
-                Assert.assertNotNull(requestHeaders.get("via"));
-
-                Fields responseHeaders = new Fields();
-                responseHeaders.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1");
-                responseHeaders.put(HTTPSPDYHeader.STATUS.name(version), "200 OK");
-                ReplyInfo replyInfo = new ReplyInfo(responseHeaders, true);
-                stream.reply(replyInfo, new Callback.Adapter());
-                return null;
-            }
-        }));
-
-        ContentResponse response = httpClient.newRequest("localhost", proxyAddress.getPort()).method(HttpMethod.GET)
-                .send();
-        assertThat("response code is 200 OK", response.getStatus(), is(200));
-
-        // Perform another request with another client
-        ContentResponse response2 = httpClient2.newRequest("localhost", proxyAddress.getPort()).method(HttpMethod.GET)
-                .send();
-        assertThat("response2 code is 200 OK", response2.getStatus(), is(200));
-    }
-
-    @Test
-    public void testHEADRequest() throws Exception
-    {
-        InetSocketAddress proxyAddress = startProxy(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                Assert.assertTrue(synInfo.isClose());
-                Fields requestHeaders = synInfo.getHeaders();
-                Assert.assertNotNull(requestHeaders.get("via"));
-
-                Fields responseHeaders = new Fields();
-                responseHeaders.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1");
-                responseHeaders.put(HTTPSPDYHeader.STATUS.name(version), "200 OK");
-                ReplyInfo replyInfo = new ReplyInfo(responseHeaders, true);
-                stream.reply(replyInfo, new Callback.Adapter());
-
-                return null;
-            }
-        }));
-        ContentResponse response = httpClient.newRequest("localhost", proxyAddress.getPort()).method(HttpMethod.HEAD).send();
-        assertThat("response code is 200 OK", response.getStatus(), is(200));
-    }
-
-    @Test
-    public void testGETThenSmallResponseContent() throws Exception
-    {
-        final byte[] data = "0123456789ABCDEF".getBytes(StandardCharsets.UTF_8);
-        InetSocketAddress proxyAddress = startProxy(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                Assert.assertTrue(synInfo.isClose());
-                Fields requestHeaders = synInfo.getHeaders();
-                Assert.assertNotNull(requestHeaders.get("via"));
-
-                Fields responseHeaders = new Fields();
-                responseHeaders.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1");
-                responseHeaders.put(HTTPSPDYHeader.STATUS.name(version), "200 OK");
-                responseHeaders.put("content-length", String.valueOf(data.length));
-
-                ReplyInfo replyInfo = new ReplyInfo(responseHeaders, false);
-                stream.reply(replyInfo, new Callback.Adapter());
-                stream.data(new BytesDataInfo(data, true), new Callback.Adapter());
-
-                return null;
-            }
-        }));
-
-        ContentResponse response = httpClient.newRequest("localhost", proxyAddress.getPort()).method(HttpMethod.GET)
-                .send();
-        assertThat("response code is 200 OK", response.getStatus(), is(200));
-        assertThat(Arrays.equals(response.getContent(), data), is(true));
-
-        // Perform another request so that we are sure we reset the states of parsers and generators
-        ContentResponse response2 = httpClient.newRequest("localhost", proxyAddress.getPort()).method(HttpMethod.GET)
-                .send();
-        assertThat("response2 code is 200 OK", response2.getStatus(), is(200));
-        assertThat(Arrays.equals(response2.getContent(), data), is(true));
-    }
-
-    @Test
-    public void testPOSTWithSmallRequestContentThenRedirect() throws Exception
-    {
-        final String data = "0123456789ABCDEF";
-        InetSocketAddress proxyAddress = startProxy(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                return new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        dataInfo.consume(dataInfo.length());
-                        if (dataInfo.isClose())
-                        {
-                            Fields headers = new Fields();
-                            headers.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1");
-                            headers.put(HTTPSPDYHeader.STATUS.name(version), "303 See Other");
-                            headers.put(HttpHeader.LOCATION.asString(),"http://other.location");
-                            stream.reply(new ReplyInfo(headers, true), new Callback.Adapter());
-                        }
-                    }
-                };
-            }
-        }));
-
-        ContentResponse response = httpClient.newRequest("localhost", proxyAddress.getPort()).method(HttpMethod.POST).content(new
-                StringContentProvider(data)).followRedirects(false).send();
-        assertThat("response code is 303", response.getStatus(), is(303));
-
-        // Perform another request so that we are sure we reset the states of parsers and generators
-        ContentResponse response2 = httpClient.newRequest("localhost", proxyAddress.getPort()).method(HttpMethod
-                .POST).content(new StringContentProvider(data)).followRedirects(false).send();
-        assertThat("response2 code is 303", response2.getStatus(), is(303));
-    }
-
-    @Test
-    public void testPOSTWithSmallRequestContentThenSmallResponseContent() throws Exception
-    {
-        String dataString = "0123456789ABCDEF";
-        final byte[] data = dataString.getBytes(StandardCharsets.UTF_8);
-        InetSocketAddress proxyAddress = startProxy(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                return new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        dataInfo.consume(dataInfo.length());
-                        if (dataInfo.isClose())
-                        {
-                            Fields responseHeaders = new Fields();
-                            responseHeaders.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1");
-                            responseHeaders.put(HTTPSPDYHeader.STATUS.name(version), "200 OK");
-                            responseHeaders.put("content-length", String.valueOf(data.length));
-                            ReplyInfo replyInfo = new ReplyInfo(responseHeaders, false);
-                            stream.reply(replyInfo, new Callback.Adapter());
-                            stream.data(new BytesDataInfo(data, true), new Callback.Adapter());
-                        }
-                    }
-                };
-            }
-        }));
-
-        ContentResponse response = httpClient.POST("http://localhost:" + proxyAddress.getPort() + "/").content(new
-                StringContentProvider(dataString)).send();
-        assertThat("response status is 200 OK", response.getStatus(), is(200));
-        assertThat("response content matches expected dataString", response.getContentAsString(), is(dataString));
-
-        // Perform another request so that we are sure we reset the states of parsers and generators
-        response = httpClient.POST("http://localhost:" + proxyAddress.getPort() + "/").content(new
-                StringContentProvider(dataString)).send();
-        assertThat("response status is 200 OK", response.getStatus(), is(200));
-        assertThat("response content matches expected dataString", response.getContentAsString(), is(dataString));
-    }
-
-    @Test
-    public void testGETThenSPDYPushIsIgnored() throws Exception
-    {
-        final byte[] data = "0123456789ABCDEF".getBytes(StandardCharsets.UTF_8);
-        InetSocketAddress proxyAddress = startProxy(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                Fields responseHeaders = new Fields();
-                responseHeaders.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1");
-                responseHeaders.put(HTTPSPDYHeader.STATUS.name(version), "200 OK");
-
-                Fields pushHeaders = new Fields();
-                pushHeaders.put(HTTPSPDYHeader.URI.name(version), "/push");
-                stream.push(new PushInfo(5, TimeUnit.SECONDS, pushHeaders, false), new Promise.Adapter<Stream>()
-                {
-                    @Override
-                    public void succeeded(Stream pushStream)
-                    {
-                        pushStream.data(new BytesDataInfo(data, true), new Callback.Adapter());
-                    }
-                });
-
-                stream.reply(new ReplyInfo(responseHeaders, true), new Callback.Adapter());
-                return null;
-            }
-        }));
-
-        ContentResponse response = httpClient.newRequest("localhost", proxyAddress.getPort()).method(HttpMethod.GET).send();
-        assertThat("response code is 200 OK", response.getStatus(), is(200));
-    }
-
-    @Test
-    public void testGETThenReset() throws Exception
-    {
-        InetSocketAddress proxyAddress = startProxy(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                Assert.assertTrue(synInfo.isClose());
-                Fields requestHeaders = synInfo.getHeaders();
-                Assert.assertNotNull(requestHeaders.get("via"));
-
-                stream.getSession().rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM), new Callback.Adapter());
-
-                return null;
-            }
-        }));
-
-        ContentResponse response = httpClient.newRequest("localhost", proxyAddress.getPort()).method(HttpMethod.GET).send();
-        assertThat("response code is 502 Gateway Error", response.getStatus(), is(502));
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxySPDYToHTTPLoadTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxySPDYToHTTPLoadTest.java
deleted file mode 100644
index a883e63..0000000
--- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxySPDYToHTTPLoadTest.java
+++ /dev/null
@@ -1,319 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.proxy;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.NegotiatingServerConnectionFactory;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.server.handler.DefaultHandler;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StringDataInfo;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.client.SPDYClient;
-import org.eclipse.jetty.spdy.server.http.SPDYTestUtils;
-import org.eclipse.jetty.toolchain.test.TestTracker;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.IO;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-import static junit.framework.Assert.fail;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.junit.Assert.assertThat;
-
-@Ignore
-@RunWith(value = Parameterized.class)
-public abstract class ProxySPDYToHTTPLoadTest
-{
-    private static final Logger LOG = Log.getLogger(ProxySPDYToHTTPLoadTest.class);
-
-    @Parameterized.Parameters
-    public static Collection<Short[]> parameters()
-    {
-        return Arrays.asList(new Short[]{SPDY.V2}, new Short[]{SPDY.V3});
-    }
-
-    @Rule
-    public final TestTracker tracker = new TestTracker();
-    private final short version;
-    private final NegotiatingServerConnectionFactory negotiator;
-    private final String server1String = "server1";
-    private final String server2String = "server2";
-    private SPDYClient.Factory factory;
-    private Server server1;
-    private Server server2;
-    private Server proxy;
-    private ServerConnector proxyConnector;
-    private SslContextFactory sslContextFactory = SPDYTestUtils.newSslContextFactory();
-
-    public ProxySPDYToHTTPLoadTest(short version, NegotiatingServerConnectionFactory negotiator)
-    {
-        this.version = version;
-        this.negotiator = negotiator;
-    }
-
-    @Before
-    public void init() throws Exception
-    {
-        // change the ports if you want to trace the network traffic
-        server1 = startServer(new TestServerHandler(server1String, null), 0);
-        server2 = startServer(new TestServerHandler(server2String, null), 0);
-        factory = new SPDYClient.Factory(sslContextFactory);
-        factory.start();
-    }
-
-    @After
-    public void destroy() throws Exception
-    {
-        stopServer(server1);
-        stopServer(server2);
-        if (proxy != null)
-        {
-            proxy.stop();
-            proxy.join();
-        }
-        factory.stop();
-    }
-
-    private void stopServer(Server server) throws Exception
-    {
-        if (server != null)
-        {
-            server.stop();
-            server.join();
-        }
-    }
-
-    protected Server startServer(Handler handler, int port) throws Exception
-    {
-        QueuedThreadPool threadPool = new QueuedThreadPool(256);
-        threadPool.setName("upstreamServerQTP");
-        Server server = new Server(threadPool);
-        ServerConnector connector = new ServerConnector(server);
-        connector.setPort(port);
-        server.setHandler(handler);
-        server.addConnector(connector);
-        server.start();
-        return server;
-    }
-
-    private InetSocketAddress getServerAddress(Server server)
-    {
-        return new InetSocketAddress("localhost", ((ServerConnector)server.getConnectors()[0]).getLocalPort());
-    }
-
-    protected InetSocketAddress startProxy(InetSocketAddress server1, InetSocketAddress server2,
-                                           long proxyConnectorTimeout, long proxyEngineTimeout) throws Exception
-    {
-        QueuedThreadPool threadPool = new QueuedThreadPool(256);
-        threadPool.setName("proxyQTP");
-        proxy = new Server(threadPool);
-        ProxyEngineSelector proxyEngineSelector = new ProxyEngineSelector();
-        HttpClient httpClient = new HttpClient();
-        httpClient.start();
-        httpClient.setIdleTimeout(proxyEngineTimeout);
-        HTTPProxyEngine httpProxyEngine = new HTTPProxyEngine(httpClient);
-        proxyEngineSelector.putProxyEngine("http/1.1", httpProxyEngine);
-
-        proxyEngineSelector.putProxyServerInfo("localhost", new ProxyEngineSelector.ProxyServerInfo("http/1.1",
-                server1.getHostName(), server1.getPort()));
-        // server2 will be available at two different ProxyServerInfos with different hosts
-        proxyEngineSelector.putProxyServerInfo("127.0.0.1", new ProxyEngineSelector.ProxyServerInfo("http/1.1",
-                server2.getHostName(), server2.getPort()));
-        proxyEngineSelector.putProxyServerInfo("127.0.0.2", new ProxyEngineSelector.ProxyServerInfo("http/1.1",
-                server2.getHostName(), server2.getPort()));
-
-        proxyConnector = new HTTPSPDYProxyServerConnector(proxy, sslContextFactory, new HttpConfiguration(), proxyEngineSelector, negotiator);
-        proxyConnector.setPort(0);
-        proxyConnector.setIdleTimeout(proxyConnectorTimeout);
-        proxy.addConnector(proxyConnector);
-        proxy.start();
-        return new InetSocketAddress("localhost", proxyConnector.getLocalPort());
-    }
-
-    @Test
-    public void testSimpleLoadTest() throws Exception
-    {
-        final InetSocketAddress proxyAddress = startProxy(getServerAddress(server1), getServerAddress(server2), 30000,
-                30000);
-
-        final int requestsPerClient = 50;
-
-        ExecutorService executorService = Executors.newFixedThreadPool(3);
-
-        Runnable client1 = createClientRunnable(proxyAddress, requestsPerClient, server1String, "localhost");
-        Runnable client2 = createClientRunnable(proxyAddress, requestsPerClient, server2String, "127.0.0.1");
-        Runnable client3 = createClientRunnable(proxyAddress, requestsPerClient, server2String, "127.0.0.2");
-
-        List<Future> futures = new ArrayList<>();
-
-        futures.add(executorService.submit(client1));
-        futures.add(executorService.submit(client2));
-        futures.add(executorService.submit(client3));
-
-        for (Future future : futures)
-        {
-            future.get(60, TimeUnit.SECONDS);
-        }
-    }
-
-    private Runnable createClientRunnable(final InetSocketAddress proxyAddress, final int requestsPerClient,
-                                          final String serverIdentificationString, final String serverHost)
-    {
-        Runnable client = new Runnable()
-        {
-            @Override
-            public void run()
-            {
-                try
-                {
-                    Session client = factory.newSPDYClient(version).connect(proxyAddress, null);
-                    for (int i = 0; i < requestsPerClient; i++)
-                    {
-                        sendSingleClientRequest(proxyAddress, client, serverIdentificationString, serverHost);
-                    }
-                }
-                catch (InterruptedException | ExecutionException | TimeoutException e)
-                {
-                    e.printStackTrace();
-                    fail();
-                }
-            }
-        };
-        return client;
-    }
-
-    private void sendSingleClientRequest(InetSocketAddress proxyAddress, Session client, final String serverIdentificationString, String serverHost) throws ExecutionException, InterruptedException, TimeoutException
-    {
-        final String data = UUID.randomUUID().toString();
-
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-
-        Fields headers = SPDYTestUtils.createHeaders(serverHost, proxyAddress.getPort(), version, "POST", "/");
-
-        Stream stream = client.syn(new SynInfo(headers, false), new StreamFrameListener.Adapter()
-        {
-            private final ByteArrayOutputStream result = new ByteArrayOutputStream();
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                LOG.debug("Got reply: {}", replyInfo);
-                Fields headers = replyInfo.getHeaders();
-                assertThat("response comes from the given server", headers.get(serverIdentificationString),
-                        is(notNullValue()));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                result.write(dataInfo.asBytes(true), 0, dataInfo.length());
-                if (dataInfo.isClose())
-                {
-                    LOG.debug("Got last dataFrame: {}", dataInfo);
-                    assertThat("received data matches send data", result.toString(), is(data));
-                    dataLatch.countDown();
-                }
-            }
-        });
-
-        stream.data(new StringDataInfo(data, true), new Callback.Adapter());
-
-        assertThat("reply has been received", replyLatch.await(15, TimeUnit.SECONDS), is(true));
-        assertThat("data has been received", dataLatch.await(15, TimeUnit.SECONDS), is(true));
-        LOG.debug("Successfully received response");
-    }
-
-    private class TestServerHandler extends DefaultHandler
-    {
-        private final String responseHeader;
-        private final byte[] responseData;
-
-        private TestServerHandler(String responseHeader, byte[] responseData)
-        {
-            this.responseHeader = responseHeader;
-            this.responseData = responseData;
-        }
-
-        @Override
-        public void handle(String target, Request baseRequest, HttpServletRequest request,
-                           HttpServletResponse response) throws IOException, ServletException
-        {
-            assertThat("Via Header is set", baseRequest.getHeader("X-Forwarded-For"), is(notNullValue()));
-            assertThat("X-Forwarded-For Header is set", baseRequest.getHeader("X-Forwarded-For"),
-                    is(notNullValue()));
-            assertThat("X-Forwarded-Host Header is set", baseRequest.getHeader("X-Forwarded-Host"),
-                    is(notNullValue()));
-            assertThat("X-Forwarded-Proto Header is set", baseRequest.getHeader("X-Forwarded-Proto"),
-                    is(notNullValue()));
-            assertThat("X-Forwarded-Server Header is set", baseRequest.getHeader("X-Forwarded-Server"),
-                    is(notNullValue()));
-            baseRequest.setHandled(true);
-
-            IO.copy(request.getInputStream(), response.getOutputStream());
-
-            if (responseHeader != null)
-                response.addHeader(responseHeader, "bar");
-            if (responseData != null)
-                response.getOutputStream().write(responseData);
-        }
-    }
-
-}
diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxySPDYToHTTPTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxySPDYToHTTPTest.java
deleted file mode 100644
index 581ff28..0000000
--- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxySPDYToHTTPTest.java
+++ /dev/null
@@ -1,545 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.proxy;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.HttpChannel;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.server.handler.DefaultHandler;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.GoAwayResultInfo;
-import org.eclipse.jetty.spdy.api.PingInfo;
-import org.eclipse.jetty.spdy.api.PingResultInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.RstInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StringDataInfo;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.spdy.client.SPDYClient;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.spdy.server.http.SPDYTestUtils;
-import org.eclipse.jetty.toolchain.test.TestTracker;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.StdErrLog;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.hamcrest.Matchers.nullValue;
-import static org.junit.Assert.assertThat;
-
-@RunWith(value = Parameterized.class)
-public abstract class ProxySPDYToHTTPTest
-{
-    @Parameterized.Parameters
-    public static Collection<Short[]> parameters()
-    {
-        return Arrays.asList(new Short[]{SPDY.V2}, new Short[]{SPDY.V3});
-    }
-
-    @Rule
-    public final TestTracker tracker = new TestTracker();
-    private final short version;
-    private SPDYClient.Factory factory;
-    private Server server;
-    private Server proxy;
-    private ServerConnector proxyConnector;
-    private SslContextFactory sslContextFactory = SPDYTestUtils.newSslContextFactory();
-
-    public ProxySPDYToHTTPTest(short version)
-    {
-        this.version = version;
-    }
-
-    protected InetSocketAddress startServer(Handler handler) throws Exception
-    {
-        server = new Server();
-        ServerConnector connector = new ServerConnector(server);
-        server.setHandler(handler);
-        server.addConnector(connector);
-        server.start();
-        return new InetSocketAddress("localhost", connector.getLocalPort());
-    }
-
-    protected InetSocketAddress startProxy(InetSocketAddress address, long proxyConnectorTimeout, long proxyEngineTimeout) throws Exception
-    {
-        proxy = new Server();
-        ProxyEngineSelector proxyEngineSelector = new ProxyEngineSelector();
-        HttpClient httpClient = new HttpClient();
-        httpClient.start();
-        httpClient.setIdleTimeout(proxyEngineTimeout);
-        HTTPProxyEngine httpProxyEngine = new HTTPProxyEngine(httpClient);
-        proxyEngineSelector.putProxyEngine("http/1.1", httpProxyEngine);
-        proxyEngineSelector.putProxyServerInfo("localhost", new ProxyEngineSelector.ProxyServerInfo("http/1.1", address.getHostName(), address.getPort()));
-        proxyConnector = new HTTPSPDYProxyServerConnector(proxy, sslContextFactory, proxyEngineSelector);
-        proxyConnector.setPort(0);
-        proxyConnector.setIdleTimeout(proxyConnectorTimeout);
-        proxy.addConnector(proxyConnector);
-        proxy.start();
-        return new InetSocketAddress("localhost", proxyConnector.getLocalPort());
-    }
-
-    @Before
-    public void init() throws Exception
-    {
-        factory = new SPDYClient.Factory(sslContextFactory);
-        factory.start();
-    }
-
-    @After
-    public void destroy() throws Exception
-    {
-        if (server != null)
-        {
-            server.stop();
-            server.join();
-        }
-        if (proxy != null)
-        {
-            proxy.stop();
-            proxy.join();
-        }
-        factory.stop();
-        ((StdErrLog)Log.getLogger(HttpChannel.class)).setHideStacks(false);
-    }
-
-    @Test
-    public void testSYNThenREPLY() throws Exception
-    {
-        final String header = "foo";
-
-        InetSocketAddress proxyAddress = startProxy(startServer(new TestServerHandler(header, null)), 30000, 30000);
-
-        Session client = factory.newSPDYClient(version).connect(proxyAddress, null);
-
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", proxyAddress.getPort(), version, "GET", "/");
-        headers.put(header, "bar");
-        headers.put("connection", "close");
-
-        client.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields headers = replyInfo.getHeaders();
-                assertThat("Version header is set", headers.get(HTTPSPDYHeader.VERSION.name(version)), is(notNullValue()));
-                assertThat("Custom set header foo is set on response", headers.get(header), is(notNullValue()));
-                assertThat("HOP headers like connection are removed before forwarding",
-                        headers.get("connection"), is(nullValue()));
-                replyLatch.countDown();
-            }
-        });
-
-        assertThat("Reply is send to SPDY client", replyLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    @Test
-    public void testSYNThenREPLYAndDATA() throws Exception
-    {
-        final byte[] data = "0123456789ABCDEF".getBytes(StandardCharsets.UTF_8);
-        final String header = "foo";
-
-        InetSocketAddress proxyAddress = startProxy(startServer(new TestServerHandler(header, data)), 30000, 30000);
-
-        Session client = factory.newSPDYClient(version).connect(proxyAddress, null);
-
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", proxyAddress.getPort(), version, "GET", "/");
-        headers.put(header, "bar");
-        headers.put("connection", "close");
-
-        client.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            private final ByteArrayOutputStream result = new ByteArrayOutputStream();
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields headers = replyInfo.getHeaders();
-                assertThat("Trailer header has been filtered by proxy", headers.get("trailer"),
-                        is(nullValue()));
-                assertThat("custom header exists in response", headers.get(header), is(notNullValue()));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                result.write(dataInfo.asBytes(true), 0, dataInfo.length());
-                if (dataInfo.isClose())
-                {
-                    assertThat("received data matches send data", result.toByteArray(), is(data));
-                    dataLatch.countDown();
-                }
-            }
-        });
-
-        assertThat("reply has been received", replyLatch.await(5, TimeUnit.SECONDS), is(true));
-        assertThat("data has been received", dataLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    @Test
-    public void testHttpServerCommitsResponseTwice() throws Exception
-    {
-        final long timeout = 1000;
-
-        InetSocketAddress proxyAddress = startProxy(startServer(new DefaultHandler()
-        {
-            @Override
-            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                response.addHeader("some response", "header");
-                response.flushBuffer();
-                try
-                {
-                    Thread.sleep(timeout * 2);
-                }
-                catch (InterruptedException e)
-                {
-                    e.printStackTrace();
-                }
-
-            }
-        }), 30000, timeout);
-
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch resetLatch = new CountDownLatch(1);
-
-        Session client = factory.newSPDYClient(version).connect(proxyAddress, new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public void onRst(Session session, RstInfo rstInfo)
-            {
-                resetLatch.countDown();
-            }
-        });
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", proxyAddress.getPort(), version, "GET", "/");
-        headers.put("connection", "close");
-
-        client.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                replyLatch.countDown();
-            }
-        });
-
-        assertThat("reply has been received", replyLatch.await(5, TimeUnit.SECONDS), is(true));
-        assertThat("stream is reset", resetLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    @Test
-    public void testHttpServerSendsRedirect() throws Exception
-    {
-        InetSocketAddress proxyAddress = startProxy(startServer(new DefaultHandler()
-        {
-            @Override
-            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                baseRequest.setHandled(true);
-                response.setStatus(HttpServletResponse.SC_FOUND);
-                response.setHeader("Location", "http://doesnot.exist");
-            }
-        }), 30000, 30000);
-
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-
-        Session client = factory.newSPDYClient(version).connect(proxyAddress, null);
-        Fields headers = SPDYTestUtils.createHeaders("localhost", proxyAddress.getPort(), version, "GET", "/");
-
-        client.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                assertThat("Status code is 302", replyInfo.getHeaders().get(HTTPSPDYHeader.STATUS.name(version)).getValue(),
-                        is("302"));
-                assertThat("Location header has been received", replyInfo.getHeaders().get("Location"), is(notNullValue()));
-                replyLatch.countDown();
-            }
-        });
-
-        assertThat("reply has been received", replyLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    @Test
-    public void testSYNWithRequestContentThenREPLYAndDATA() throws Exception
-    {
-        final String data = "0123456789ABCDEF";
-        final String header = "foo";
-
-        InetSocketAddress proxyAddress = startProxy(startServer(new TestServerHandler(header, null)), 30000, 30000);
-
-        Session client = factory.newSPDYClient(version).connect(proxyAddress, null);
-
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", proxyAddress.getPort(), version, "POST", "/");
-        headers.put(header, "bar");
-        headers.put("connection", "close");
-
-        Stream stream = client.syn(new SynInfo(headers, false), new StreamFrameListener.Adapter()
-        {
-            private final ByteArrayOutputStream result = new ByteArrayOutputStream();
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields headers = replyInfo.getHeaders();
-                assertThat("custom header exists in response", headers.get(header), is(notNullValue()));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                result.write(dataInfo.asBytes(true), 0, dataInfo.length());
-                if (dataInfo.isClose())
-                {
-                    assertThat("received data matches send data", data, is(result.toString()));
-                    dataLatch.countDown();
-                }
-            }
-        });
-
-        stream.data(new StringDataInfo(data, true), new Callback.Adapter());
-
-        assertThat("reply has been received", replyLatch.await(5, TimeUnit.SECONDS), is(true));
-        assertThat("data has been received", dataLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    @Test
-    public void testSYNWithSplitRequestContentThenREPLYAndDATA() throws Exception
-    {
-        final String data = "0123456789ABCDEF";
-        final String data2 = "ABCDEF";
-        final String header = "foo";
-
-        InetSocketAddress proxyAddress = startProxy(startServer(new TestServerHandler(header, null)), 30000, 30000);
-
-        Session client = factory.newSPDYClient(version).connect(proxyAddress, null);
-
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", proxyAddress.getPort(), version, "POST", "/");
-        headers.put(header, "bar");
-        headers.put("connection", "close");
-
-        Stream stream = client.syn(new SynInfo(headers, false), new StreamFrameListener.Adapter()
-        {
-            private final ByteArrayOutputStream result = new ByteArrayOutputStream();
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields headers = replyInfo.getHeaders();
-                assertThat("custom header exists in response", headers.get(header), is(notNullValue()));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                result.write(dataInfo.asBytes(true), 0, dataInfo.length());
-                if (dataInfo.isClose())
-                {
-                    assertThat("received data matches send data", result.toString(), is(data + data2));
-                    dataLatch.countDown();
-                }
-            }
-        });
-
-        stream.data(new StringDataInfo(data, false), new Callback.Adapter());
-        stream.data(new StringDataInfo(data2, true), new Callback.Adapter());
-
-        assertThat("reply has been received", replyLatch.await(5, TimeUnit.SECONDS), is(true));
-        assertThat("data has been received", dataLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    @Test
-    public void testClientTimeout() throws Exception
-    {
-        long timeout = 1000;
-
-        InetSocketAddress proxyAddress = startProxy(startServer(new TestServerHandler(null, null)), timeout, 30000);
-
-        final CountDownLatch goAwayLatch = new CountDownLatch(1);
-
-        Session client = factory.newSPDYClient(version).connect(proxyAddress, new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onGoAway(Session session, GoAwayResultInfo goAwayReceivedInfo)
-            {
-                goAwayLatch.countDown();
-            }
-        });
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", proxyAddress.getPort(), version, "POST", "/");
-        ((StdErrLog)Log.getLogger(HttpChannel.class)).setHideStacks(true);
-        client.syn(new SynInfo(headers, false), null);
-        assertThat("goAway has been received by proxy", goAwayLatch.await(2 * timeout, TimeUnit.MILLISECONDS),
-                is(true));
-    }
-
-    @Test
-    public void testServerTimeout() throws Exception
-    {
-        final int timeout = 1000;
-        final String header = "foo";
-
-        InetSocketAddress proxyAddress = startProxy(startServer(new DefaultHandler()
-        {
-            @Override
-            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
-            {
-                try
-                {
-                    Thread.sleep(2 * timeout);
-                }
-                catch (InterruptedException e)
-                {
-                    e.printStackTrace();
-                }
-            }
-        }), 30000, timeout);
-
-        Session client = factory.newSPDYClient(version).connect(proxyAddress, null);
-
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", proxyAddress.getPort(), version, "POST", "/");
-        headers.put(header, "bar");
-        headers.put("connection", "close");
-
-        client.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields headers = replyInfo.getHeaders();
-                assertThat("status is 504", headers.get(HTTPSPDYHeader.STATUS.name(version)).getValue(), is("504"));
-                replyLatch.countDown();
-            }
-
-        });
-
-        assertThat("reply has been received", replyLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    @Test
-    public void testPING() throws Exception
-    {
-        // PING is per hop, and it does not carry the information to which server to ping to
-        // We just verify that it works
-
-        InetSocketAddress proxyAddress = startProxy(startServer(null), 30000, 30000);
-        proxyConnector.addConnectionFactory(proxyConnector.getConnectionFactory("spdy/" + version));
-
-        final CountDownLatch pingLatch = new CountDownLatch(1);
-        Session client = factory.newSPDYClient(version).connect(proxyAddress, new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onPing(Session session, PingResultInfo pingInfo)
-            {
-                pingLatch.countDown();
-            }
-        });
-
-        client.ping(new PingInfo(5, TimeUnit.SECONDS));
-
-        Assert.assertTrue(pingLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    private class TestServerHandler extends DefaultHandler
-    {
-        private final String responseHeader;
-        private final byte[] responseData;
-
-        private TestServerHandler(String responseHeader, byte[] responseData)
-        {
-            this.responseHeader = responseHeader;
-            this.responseData = responseData;
-        }
-
-        @Override
-        public void handle(String target, Request baseRequest, HttpServletRequest request,
-                           HttpServletResponse response) throws IOException, ServletException
-        {
-            assertThat("Via Header is set", baseRequest.getHeader("X-Forwarded-For"), is(notNullValue()));
-            assertThat("X-Forwarded-For Header is set", baseRequest.getHeader("X-Forwarded-For"),
-                    is(notNullValue()));
-            assertThat("X-Forwarded-Host Header is set", baseRequest.getHeader("X-Forwarded-Host"),
-                    is(notNullValue()));
-            assertThat("X-Forwarded-Proto Header is set", baseRequest.getHeader("X-Forwarded-Proto"),
-                    is(notNullValue()));
-            assertThat("X-Forwarded-Server Header is set", baseRequest.getHeader("X-Forwarded-Server"),
-                    is(notNullValue()));
-            baseRequest.setHandled(true);
-            BufferedReader bufferedReader = request.getReader();
-            int read;
-            while ((read = bufferedReader.read()) != -1)
-                response.getOutputStream().write(read);
-
-            // add some hop header to be removed on the proxy
-            response.addHeader("Trailer", "bla");
-            if (responseHeader != null)
-                response.addHeader(responseHeader, "bar");
-            if (responseData != null)
-                response.getOutputStream().write(responseData);
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxySPDYToSPDYLoadTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxySPDYToSPDYLoadTest.java
deleted file mode 100644
index ebeec4c..0000000
--- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxySPDYToSPDYLoadTest.java
+++ /dev/null
@@ -1,275 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.proxy;
-
-import java.io.ByteArrayOutputStream;
-import java.net.InetSocketAddress;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StringDataInfo;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.spdy.client.SPDYClient;
-import org.eclipse.jetty.spdy.server.SPDYServerConnectionFactory;
-import org.eclipse.jetty.spdy.server.SPDYServerConnector;
-import org.eclipse.jetty.spdy.server.http.SPDYTestUtils;
-import org.eclipse.jetty.toolchain.test.TestTracker;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-import static junit.framework.Assert.fail;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
-@RunWith(value = Parameterized.class)
-public abstract class ProxySPDYToSPDYLoadTest
-{
-    @Parameterized.Parameters
-    public static Collection<Short[]> parameters()
-    {
-        return Arrays.asList(new Short[]{SPDY.V2}, new Short[]{SPDY.V3});
-    }
-
-    @Rule
-    public final TestTracker tracker = new TestTracker();
-    private final short version;
-    private static final String UUID_HEADER_NAME = "uuidHeader";
-    private static final String SERVER_ID_HEADER = "serverId";
-    private SPDYClient.Factory factory;
-    private Server server;
-    private Server proxy;
-    private ServerConnector proxyConnector;
-    private SslContextFactory sslContextFactory = SPDYTestUtils.newSslContextFactory();
-
-    public ProxySPDYToSPDYLoadTest(short version)
-    {
-        this.version = version;
-    }
-
-    protected InetSocketAddress startServer(ServerSessionFrameListener listener) throws Exception
-    {
-        server = new Server();
-        SPDYServerConnector serverConnector = new SPDYServerConnector(server, sslContextFactory, listener);
-        serverConnector.addConnectionFactory(new SPDYServerConnectionFactory(version, listener));
-        serverConnector.setPort(0);
-        server.addConnector(serverConnector);
-        server.start();
-        return new InetSocketAddress("localhost", serverConnector.getLocalPort());
-    }
-
-    protected InetSocketAddress startProxy(InetSocketAddress server1, InetSocketAddress server2) throws Exception
-    {
-        proxy = new Server();
-        ProxyEngineSelector proxyEngineSelector = new ProxyEngineSelector();
-
-        SPDYProxyEngine spdyProxyEngine = new SPDYProxyEngine(factory);
-        proxyEngineSelector.putProxyEngine("spdy/" + version, spdyProxyEngine);
-
-        proxyEngineSelector.putProxyServerInfo("localhost", new ProxyEngineSelector.ProxyServerInfo("spdy/" + version,
-                "localhost", server1.getPort()));
-        // server2 will be available at two different ProxyServerInfos with different hosts
-        proxyEngineSelector.putProxyServerInfo("127.0.0.1", new ProxyEngineSelector.ProxyServerInfo("spdy/" + version,
-                "127.0.0.1", server2.getPort()));
-        // ProxyServerInfo is mapped to 127.0.0.2 in the proxyEngineSelector. However to be able to connect the
-        // ProxyServerInfo contains 127.0.0.1 as target host
-        proxyEngineSelector.putProxyServerInfo("127.0.0.2", new ProxyEngineSelector.ProxyServerInfo("spdy/" + version,
-                "127.0.0.1", server2.getPort()));
-
-        proxyConnector = new HTTPSPDYProxyServerConnector(proxy, sslContextFactory, proxyEngineSelector);
-        proxyConnector.setPort(0);
-        proxy.addConnector(proxyConnector);
-        proxy.start();
-        return new InetSocketAddress("localhost", proxyConnector.getLocalPort());
-    }
-
-    @Before
-    public void init() throws Exception
-    {
-        factory = new SPDYClient.Factory(sslContextFactory);
-        factory.start();
-    }
-
-    @After
-    public void destroy() throws Exception
-    {
-        server.stop();
-        server.join();
-        proxy.stop();
-        proxy.join();
-        factory.stop();
-    }
-
-    @Test
-    public void testSimpleLoadTest() throws Exception
-    {
-        String server1String = "server1";
-        String server2String = "server2";
-
-        InetSocketAddress server1 = startServer(new TestServerFrameListener(server1String));
-        InetSocketAddress server2 = startServer(new TestServerFrameListener(server2String));
-        final InetSocketAddress proxyAddress = startProxy(server1, server2);
-
-        final int requestsPerClient = 50;
-
-        ExecutorService executorService = Executors.newFixedThreadPool(3);
-
-        Runnable client1 = createClientRunnable(proxyAddress, requestsPerClient, server1String, "localhost");
-        Runnable client2 = createClientRunnable(proxyAddress, requestsPerClient, server2String, "127.0.0.1");
-        Runnable client3 = createClientRunnable(proxyAddress, requestsPerClient, server2String, "127.0.0.2");
-
-        List<Future> futures = new ArrayList<>();
-
-        futures.add(executorService.submit(client1));
-        futures.add(executorService.submit(client2));
-        futures.add(executorService.submit(client3));
-
-        for (Future future : futures)
-        {
-            future.get(60, TimeUnit.SECONDS);
-        }
-    }
-
-    private Runnable createClientRunnable(final InetSocketAddress proxyAddress, final int requestsPerClient,
-                                          final String serverIdentificationString, final String serverHost)
-    {
-        Runnable client = new Runnable()
-        {
-            @Override
-            public void run()
-            {
-                try
-                {
-                    Session client = factory.newSPDYClient(version).connect(proxyAddress, null);
-                    for (int i = 0; i < requestsPerClient; i++)
-                    {
-                        sendSingleClientRequest(proxyAddress, client, serverIdentificationString, serverHost);
-                    }
-                }
-                catch (InterruptedException | ExecutionException | TimeoutException e)
-                {
-                    fail();
-                    e.printStackTrace();
-                }
-            }
-        };
-        return client;
-    }
-
-    private void sendSingleClientRequest(InetSocketAddress proxyAddress, Session client, final String serverIdentificationString, String serverHost) throws ExecutionException, InterruptedException, TimeoutException
-    {
-        final String uuid = UUID.randomUUID().toString();
-
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-
-        Fields headers = SPDYTestUtils.createHeaders(serverHost, proxyAddress.getPort(), version, "POST", "/");
-        headers.add(UUID_HEADER_NAME, uuid);
-
-        Stream stream = client.syn(new SynInfo(headers, false), new StreamFrameListener.Adapter()
-        {
-            private final ByteArrayOutputStream result = new ByteArrayOutputStream();
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields headers = replyInfo.getHeaders();
-                assertThat("uuid matches expected uuid", headers.get(UUID_HEADER_NAME).getValue(), is(uuid));
-                assertThat("response comes from the given server", headers.get(SERVER_ID_HEADER).getValue(),
-                        is(serverIdentificationString));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                result.write(dataInfo.asBytes(true), 0, dataInfo.length());
-                if (dataInfo.isClose())
-                {
-                    assertThat("received data matches send data", uuid, is(result.toString()));
-                    dataLatch.countDown();
-                }
-            }
-        });
-
-        stream.data(new StringDataInfo(uuid, true), new Callback.Adapter());
-
-        assertThat("reply has been received", replyLatch.await(5, TimeUnit.SECONDS), is(true));
-        assertThat("data has been received", dataLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    private class TestServerFrameListener extends ServerSessionFrameListener.Adapter
-    {
-        private String serverId;
-
-        private TestServerFrameListener(String serverId)
-        {
-            this.serverId = serverId;
-        }
-
-        @Override
-        public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-        {
-            Fields requestHeaders = synInfo.getHeaders();
-            Assert.assertNotNull(requestHeaders.get("via"));
-            Fields.Field uuidHeader = requestHeaders.get(UUID_HEADER_NAME);
-            Assert.assertNotNull(uuidHeader);
-
-            Fields responseHeaders = new Fields();
-            responseHeaders.put(UUID_HEADER_NAME, uuidHeader.getValue());
-            responseHeaders.put(SERVER_ID_HEADER, serverId);
-            stream.reply(new ReplyInfo(responseHeaders, false), new Callback.Adapter());
-            return new StreamFrameListener.Adapter()
-            {
-                @Override
-                public void onData(Stream stream, DataInfo dataInfo)
-                {
-                    stream.data(dataInfo, new Callback.Adapter());
-                }
-            };
-        }
-    }
-
-}
diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxySPDYToSPDYTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxySPDYToSPDYTest.java
deleted file mode 100644
index 802d1c4..0000000
--- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/proxy/ProxySPDYToSPDYTest.java
+++ /dev/null
@@ -1,553 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.proxy;
-
-import java.io.ByteArrayOutputStream;
-import java.net.InetSocketAddress;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.spdy.api.BytesDataInfo;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.GoAwayInfo;
-import org.eclipse.jetty.spdy.api.PingInfo;
-import org.eclipse.jetty.spdy.api.PingResultInfo;
-import org.eclipse.jetty.spdy.api.PushInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.RstInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.spdy.client.SPDYClient;
-import org.eclipse.jetty.spdy.http.HTTPSPDYHeader;
-import org.eclipse.jetty.spdy.server.SPDYServerConnectionFactory;
-import org.eclipse.jetty.spdy.server.SPDYServerConnector;
-import org.eclipse.jetty.spdy.server.http.SPDYTestUtils;
-import org.eclipse.jetty.toolchain.test.TestTracker;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.Promise;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-import static org.hamcrest.core.Is.is;
-import static org.junit.Assert.assertThat;
-
-@RunWith(value = Parameterized.class)
-public abstract class ProxySPDYToSPDYTest
-{
-    @Parameterized.Parameters
-    public static Collection<Short[]> parameters()
-    {
-        return Arrays.asList(new Short[]{SPDY.V2}, new Short[]{SPDY.V3});
-    }
-
-    @Rule
-    public final TestTracker tracker = new TestTracker();
-    private final short version;
-    private SPDYClient.Factory factory;
-    private Server server;
-    private Server proxy;
-    private ServerConnector proxyConnector;
-    private SslContextFactory sslContextFactory = SPDYTestUtils.newSslContextFactory();
-
-    public ProxySPDYToSPDYTest(short version)
-    {
-        this.version = version;
-    }
-
-    protected InetSocketAddress startServer(ServerSessionFrameListener listener) throws Exception
-    {
-        server = new Server();
-        SPDYServerConnector serverConnector = new SPDYServerConnector(server, sslContextFactory, listener);
-        serverConnector.addConnectionFactory(new SPDYServerConnectionFactory(version, listener));
-        serverConnector.setPort(0);
-        server.addConnector(serverConnector);
-        server.start();
-        return new InetSocketAddress("localhost", serverConnector.getLocalPort());
-    }
-
-    protected InetSocketAddress startProxy(InetSocketAddress address) throws Exception
-    {
-        proxy = new Server();
-        ProxyEngineSelector proxyEngineSelector = new ProxyEngineSelector();
-        SPDYProxyEngine spdyProxyEngine = new SPDYProxyEngine(factory);
-        proxyEngineSelector.putProxyEngine("spdy/" + version, spdyProxyEngine);
-        proxyEngineSelector.putProxyServerInfo("localhost", new ProxyEngineSelector.ProxyServerInfo("spdy/" + version, address.getHostName(), address.getPort()));
-        proxyConnector = new HTTPSPDYProxyServerConnector(proxy, sslContextFactory, proxyEngineSelector);
-        proxyConnector.setPort(0);
-        proxy.addConnector(proxyConnector);
-        proxy.start();
-        return new InetSocketAddress("localhost", proxyConnector.getLocalPort());
-    }
-
-    @Before
-    public void init() throws Exception
-    {
-        factory = new SPDYClient.Factory(sslContextFactory);
-        factory.start();
-    }
-
-    @After
-    public void destroy() throws Exception
-    {
-        if (server != null)
-        {
-            server.stop();
-            server.join();
-        }
-        if (proxy != null)
-        {
-            proxy.stop();
-            proxy.join();
-        }
-        factory.stop();
-    }
-
-    @Test
-    public void testSYNThenREPLY() throws Exception
-    {
-        final String header = "foo";
-        InetSocketAddress proxyAddress = startProxy(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                Fields requestHeaders = synInfo.getHeaders();
-                Assert.assertNotNull(requestHeaders.get("via"));
-                Assert.assertNotNull(requestHeaders.get(header));
-
-                Fields responseHeaders = new Fields();
-                responseHeaders.put(header, "baz");
-                stream.reply(new ReplyInfo(responseHeaders, true), new Callback.Adapter());
-                return null;
-            }
-        }));
-        proxyConnector.addConnectionFactory(proxyConnector.getConnectionFactory("spdy/" + version));
-
-        Session client = factory.newSPDYClient(version).connect(proxyAddress, null);
-
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        Fields headers = SPDYTestUtils.createHeaders("localhost", proxyAddress.getPort(), version, "GET", "/");
-        headers.put(header, "bar");
-        client.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields headers = replyInfo.getHeaders();
-                Assert.assertNotNull(headers.get(header));
-                replyLatch.countDown();
-            }
-        });
-
-        Assert.assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-
-        client.goAway(new GoAwayInfo(5, TimeUnit.SECONDS));
-    }
-@Test
-    public void testSYNThenRSTFromUpstreamServer() throws Exception
-    {
-        final String header = "foo";
-        InetSocketAddress proxyAddress = startProxy(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                Fields requestHeaders = synInfo.getHeaders();
-                Assert.assertNotNull(requestHeaders.get("via"));
-                Assert.assertNotNull(requestHeaders.get(header));
-                stream.getSession().rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM), new Callback.Adapter());
-                return null;
-            }
-        }));
-        proxyConnector.addConnectionFactory(proxyConnector.getConnectionFactory("spdy/" + version));
-
-        final CountDownLatch resetLatch = new CountDownLatch(1);
-        Session client = factory.newSPDYClient(version).connect(proxyAddress, new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onRst(Session session, RstInfo rstInfo)
-            {
-                resetLatch.countDown();
-            }
-        });
-
-        Fields headers = SPDYTestUtils.createHeaders("localhost", proxyAddress.getPort(), version, "GET", "/");
-        headers.put(header, "bar");
-        client.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter());
-
-        assertThat("reset is received by client", resetLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    @Test
-    public void testSYNThenREPLYAndDATA() throws Exception
-    {
-        final byte[] data = "0123456789ABCDEF".getBytes(StandardCharsets.UTF_8);
-        final String header = "foo";
-        InetSocketAddress proxyAddress = startProxy(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                Fields requestHeaders = synInfo.getHeaders();
-                Assert.assertNotNull(requestHeaders.get("via"));
-                Assert.assertNotNull(requestHeaders.get(header));
-
-                Fields responseHeaders = new Fields();
-                responseHeaders.put(header, "baz");
-                stream.reply(new ReplyInfo(responseHeaders, false), new Callback.Adapter());
-                stream.data(new BytesDataInfo(data, true), new Callback.Adapter());
-                return null;
-            }
-        }));
-        proxyConnector.addConnectionFactory(proxyConnector.getConnectionFactory("spdy/" + version));
-
-        Session client = factory.newSPDYClient(version).connect(proxyAddress, null);
-
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-        Fields headers = new Fields();
-        headers.put(HTTPSPDYHeader.HOST.name(version), "localhost:" + proxyAddress.getPort());
-        headers.put(header, "bar");
-        client.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            private final ByteArrayOutputStream result = new ByteArrayOutputStream();
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields headers = replyInfo.getHeaders();
-                Assert.assertNotNull(headers.get(header));
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                result.write(dataInfo.asBytes(true), 0, dataInfo.length());
-                if (dataInfo.isClose())
-                {
-                    Assert.assertArrayEquals(data, result.toByteArray());
-                    dataLatch.countDown();
-                }
-            }
-        });
-
-        Assert.assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
-
-        client.goAway(new GoAwayInfo(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testSYNThenSPDYPushIsReceived() throws Exception
-    {
-        final byte[] data = "0123456789ABCDEF".getBytes(StandardCharsets.UTF_8);
-        InetSocketAddress proxyAddress = startProxy(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                Fields responseHeaders = new Fields();
-                responseHeaders.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1");
-                responseHeaders.put(HTTPSPDYHeader.STATUS.name(version), "200 OK");
-                stream.reply(new ReplyInfo(responseHeaders, false), new Callback.Adapter());
-
-                Fields pushHeaders = new Fields();
-                pushHeaders.put(HTTPSPDYHeader.URI.name(version), "/push");
-                stream.push(new PushInfo(5, TimeUnit.SECONDS, pushHeaders, false), new Promise.Adapter<Stream>()
-                {
-                    @Override
-                    public void succeeded(Stream pushStream)
-                    {
-                        pushStream.data(new BytesDataInfo(data, true), new Callback.Adapter());
-                    }
-                });
-
-                stream.data(new BytesDataInfo(data, true), new Callback.Adapter());
-
-                return null;
-            }
-        }));
-        proxyConnector.addConnectionFactory(proxyConnector.getConnectionFactory("spdy/" + version));
-
-        final CountDownLatch pushSynLatch = new CountDownLatch(1);
-        final CountDownLatch pushDataLatch = new CountDownLatch(1);
-        Session client = factory.newSPDYClient(version).connect(proxyAddress, null);
-
-        Fields headers = new Fields();
-        headers.put(HTTPSPDYHeader.HOST.name(version), "localhost:" + proxyAddress.getPort());
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-        client.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-            {
-                pushSynLatch.countDown();
-                return new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        dataInfo.consume(dataInfo.length());
-                        if (dataInfo.isClose())
-                            pushDataLatch.countDown();
-                    }
-                };
-            }
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    dataLatch.countDown();
-            }
-        });
-
-        Assert.assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(pushSynLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(pushDataLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
-
-        client.goAway(new GoAwayInfo(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testSYNThenSPDYNestedPushIsReceived() throws Exception
-    {
-        final byte[] data = "0123456789ABCDEF".getBytes(StandardCharsets.UTF_8);
-        InetSocketAddress proxyAddress = startProxy(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                Fields responseHeaders = new Fields();
-                responseHeaders.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1");
-                responseHeaders.put(HTTPSPDYHeader.STATUS.name(version), "200 OK");
-                stream.reply(new ReplyInfo(responseHeaders, false), new Callback.Adapter());
-
-                final Fields pushHeaders = new Fields();
-                pushHeaders.put(HTTPSPDYHeader.URI.name(version), "/push");
-                stream.push(new PushInfo(5, TimeUnit.SECONDS, pushHeaders, false), new Promise.Adapter<Stream>()
-                {
-                    @Override
-                    public void succeeded(Stream pushStream)
-                    {
-                        pushHeaders.put(HTTPSPDYHeader.URI.name(version), "/nestedpush");
-                        pushStream.push(new PushInfo(5, TimeUnit.SECONDS, pushHeaders, false), new Adapter<Stream>()
-                        {
-                            @Override
-                            public void succeeded(Stream pushStream)
-                            {
-                                pushHeaders.put(HTTPSPDYHeader.URI.name(version), "/anothernestedpush");
-                                pushStream.push(new PushInfo(5, TimeUnit.SECONDS, pushHeaders, false), new Adapter<Stream>()
-                                {
-                                    @Override
-                                    public void succeeded(Stream pushStream)
-                                    {
-                                        pushStream.data(new BytesDataInfo(data, true), new Callback.Adapter());
-                                    }
-                                });
-                                pushStream.data(new BytesDataInfo(data, true), new Callback.Adapter());
-                            }
-                        });
-                        pushStream.data(new BytesDataInfo(data, true), new Callback.Adapter());
-                    }
-                });
-
-                stream.data(new BytesDataInfo(data, true), new Callback.Adapter());
-
-                return null;
-            }
-        }));
-        proxyConnector.addConnectionFactory(proxyConnector.getConnectionFactory("spdy/" + version));
-
-        final CountDownLatch pushSynLatch = new CountDownLatch(3);
-        final CountDownLatch pushDataLatch = new CountDownLatch(3);
-        Session client = factory.newSPDYClient(version).connect(proxyAddress, null);
-
-        Fields headers = new Fields();
-        headers.put(HTTPSPDYHeader.HOST.name(version), "localhost:" + proxyAddress.getPort());
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-        client.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter()
-        {
-            // onPush for 1st push stream
-            @Override
-            public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-            {
-                pushSynLatch.countDown();
-                return new StreamFrameListener.Adapter()
-                {
-                    // onPush for 2nd nested push stream
-                    @Override
-                    public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-                    {
-                        pushSynLatch.countDown();
-                        return new Adapter()
-                        {
-                            // onPush for 3rd nested push stream
-                            @Override
-                            public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-                            {
-                                pushSynLatch.countDown();
-                                return new Adapter()
-                                {
-                                    @Override
-                                    public void onData(Stream stream, DataInfo dataInfo)
-                                    {
-                                        dataInfo.consume(dataInfo.length());
-                                        if (dataInfo.isClose())
-                                            pushDataLatch.countDown();
-                                    }
-                                };
-                            }
-
-                            @Override
-                            public void onData(Stream stream, DataInfo dataInfo)
-                            {
-                                dataInfo.consume(dataInfo.length());
-                                if (dataInfo.isClose())
-                                    pushDataLatch.countDown();
-                            }
-                        };
-                    }
-
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        dataInfo.consume(dataInfo.length());
-                        if (dataInfo.isClose())
-                            pushDataLatch.countDown();
-                    }
-                };
-            }
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    dataLatch.countDown();
-            }
-        });
-
-        Assert.assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(pushSynLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(pushDataLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
-
-        client.goAway(new GoAwayInfo(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testPING() throws Exception
-    {
-        // PING is per hop, and it does not carry the information to which server to ping to
-        // We just verify that it works
-
-        InetSocketAddress proxyAddress = startProxy(startServer(new ServerSessionFrameListener.Adapter()));
-        proxyConnector.addConnectionFactory(proxyConnector.getConnectionFactory("spdy/" + version));
-
-        final CountDownLatch pingLatch = new CountDownLatch(1);
-        Session client = factory.newSPDYClient(version).connect(proxyAddress, new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onPing(Session session, PingResultInfo pingInfo)
-            {
-                pingLatch.countDown();
-            }
-        });
-
-        client.ping(new PingInfo(5, TimeUnit.SECONDS));
-
-        Assert.assertTrue(pingLatch.await(5, TimeUnit.SECONDS));
-
-        client.goAway(new GoAwayInfo(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testSYNThenReset() throws Exception
-    {
-        InetSocketAddress proxyAddress = startProxy(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                Assert.assertTrue(synInfo.isClose());
-                Fields requestHeaders = synInfo.getHeaders();
-                Assert.assertNotNull(requestHeaders.get("via"));
-
-                stream.getSession().rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM), new Callback.Adapter());
-
-                return null;
-            }
-        }));
-        proxyConnector.addConnectionFactory(proxyConnector.getConnectionFactory("spdy/" + version));
-
-        final CountDownLatch resetLatch = new CountDownLatch(1);
-        Session client = factory.newSPDYClient(version).connect(proxyAddress, new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onRst(Session session, RstInfo rstInfo)
-            {
-                resetLatch.countDown();
-            }
-        });
-
-        Fields headers = new Fields();
-        headers.put(HTTPSPDYHeader.HOST.name(version), "localhost:" + proxyAddress.getPort());
-        client.syn(new SynInfo(headers, true), null);
-
-        Assert.assertTrue(resetLatch.await(5, TimeUnit.SECONDS));
-
-        client.goAway(new GoAwayInfo(5, TimeUnit.SECONDS));
-    }
-}
diff --git a/jetty-spdy/spdy-http-server/src/test/resources/big_script.js b/jetty-spdy/spdy-http-server/src/test/resources/big_script.js
deleted file mode 100644
index 37202fd..0000000
--- a/jetty-spdy/spdy-http-server/src/test/resources/big_script.js
+++ /dev/null
@@ -1,791 +0,0 @@
-//----------------------------------------------------------------------
-//
-// Silly / Pointless Javascript to test GZIP compression.
-//
-//----------------------------------------------------------------------
-
-var LOGO = {
-  dat: [
-    0x50, 0x89, 0x47, 0x4e, 0x0a, 0x0d, 0x0a, 0x1a, 0x00, 0x00, 0x0d, 0x00, 0x48, 0x49, 0x52, 0x44,
-    0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x78, 0x00, 0x06, 0x08, 0x00, 0x00, 0x2a, 0x00, 0x21, 0x96,
-    0x00, 0x0f, 0x00, 0x00, 0x73, 0x04, 0x49, 0x42, 0x08, 0x54, 0x08, 0x08, 0x7c, 0x08, 0x64, 0x08,
-    0x00, 0x88, 0x00, 0x00, 0x70, 0x09, 0x59, 0x48, 0x00, 0x73, 0x04, 0x00, 0x00, 0x27, 0x04, 0x00,
-    0x01, 0x27, 0x4f, 0xd9, 0x80, 0x1d, 0x00, 0x00, 0x19, 0x00, 0x45, 0x74, 0x74, 0x58, 0x6f, 0x53,
-    0x74, 0x66, 0x61, 0x77, 0x65, 0x72, 0x77, 0x00, 0x77, 0x77, 0x69, 0x2e, 0x6b, 0x6e, 0x63, 0x73,
-    0x70, 0x61, 0x2e, 0x65, 0x72, 0x6f, 0x9b, 0x67, 0x3c, 0xee, 0x00, 0x1a, 0x20, 0x00, 0x49, 0x00,
-    0x41, 0x44, 0x78, 0x54, 0xed, 0x9c, 0x79, 0x9d, 0x1c, 0xd8, 0x95, 0x55, 0x3f, 0xff, 0xfb, 0xa7,
-    0xb2, 0xdd, 0x24, 0xef, 0x24, 0x81, 0x81, 0x2c, 0x20, 0x40, 0xd5, 0x91, 0x8b, 0xb0, 0x3f, 0xbb,
-    0x1d, 0x04, 0x54, 0x1c, 0x46, 0x74, 0x17, 0x18, 0xd1, 0x98, 0x19, 0xd1, 0x05, 0x11, 0x37, 0xf4,
-    0xe2, 0x8f, 0xcc, 0xb8, 0x28, 0x8c, 0x82, 0x02, 0x22, 0x8c, 0xe0, 0xe8, 0xe2, 0x86, 0x02, 0x88,
-    0x8e, 0xa2, 0x08, 0xe8, 0x42, 0x42, 0x4b, 0x08, 0xc2, 0xc8, 0x12, 0x12, 0xf6, 0x42, 0x7d, 0x90,
-    0xf7, 0x7d, 0x3e, 0xee, 0x47, 0xf3, 0x77, 0x75, 0xeb, 0x6a, 0xdf, 0x7e, 0xee, 0xea, 0xab, 0x7b,
-    0xdc, 0x93, 0xf3, 0xcf, 0xd0, 0xf0, 0xa9, 0x55, 0x53, 0xae, 0x6f, 0x5d, 0x3d, 0xd5, 0x9e, 0xf7,
-    0xee, 0x7b, 0x8a, 0xf9, 0xe2, 0xaa, 0x38, 0x70, 0x0e, 0x1c, 0xc3, 0x87, 0x99, 0x2e, 0x2f, 0xb4,
-    0xe1, 0xc0, 0x38, 0x70, 0x8e, 0x1c, 0x11, 0x83, 0x80, 0xe7, 0x0e, 0x1d, 0xc3, 0x87, 0x48, 0xe1,
-    0xe7, 0x01, 0x1d, 0x80, 0x87, 0x0e, 0xe1, 0xc3, 0x01, 0x48, 0x80, 0xe7, 0x0e, 0x1d, 0xc3, 0x87,
-    0x48, 0xe1, 0xe7, 0x01, 0x1d, 0x80, 0x87, 0x0e, 0xe1, 0xc3, 0x01, 0x48, 0x80, 0xe7, 0x0e, 0x1d,
-    0xc3, 0x87, 0x48, 0xe1, 0xe7, 0x01, 0x1d, 0x80, 0x87, 0x0e, 0xe1, 0xc3, 0x01, 0x48, 0x80, 0xe7,
-    0x0e, 0x1d, 0xc3, 0x87, 0x48, 0xe1, 0xe7, 0x01, 0x1d, 0x80, 0x87, 0x0e, 0xe1, 0xc3, 0x01, 0x48,
-    0x80, 0xe7, 0x0e, 0x1d, 0xc3, 0x87, 0x48, 0xe1, 0xe7, 0x01, 0x1d, 0x80, 0x87, 0x0e, 0xe1, 0xc3,
-    0x01, 0x48, 0x80, 0xe7, 0x0e, 0x1d, 0xc3, 0x87, 0x48, 0xe1, 0x96, 0x81, 0x2f, 0xb4, 0x44, 0x40,
-    0x2c, 0x3a, 0xe9, 0x98, 0xa7, 0x55, 0xe1, 0x3a, 0x38, 0x70, 0x8e, 0x1c, 0x42, 0x26, 0xf0, 0xd2,
-    0x22, 0x4b, 0x16, 0x32, 0x0c, 0xb8, 0x02, 0xb8, 0xde, 0x38, 0xc9, 0x82, 0xe0, 0x4e, 0x80, 0xbf,
-    0xa9, 0x4f, 0xbf, 0x6a, 0x7b, 0x05, 0x88, 0xb1, 0x6c, 0xc8, 0xc3, 0xe0, 0xfb, 0xc0, 0xd1, 0x81,
-    0xcd, 0x86, 0x81, 0xe5, 0xc0, 0xe5, 0xab, 0xdf, 0x02, 0xea, 0xb6, 0xc3, 0x0e, 0x1c, 0xa3, 0x87,
-    0x44, 0x6e, 0x12, 0x64, 0x29, 0x70, 0x41, 0xf0, 0x7a, 0x60, 0xaf, 0xc2, 0x01, 0x77, 0x80, 0xf3,
-    0x55, 0x9b, 0x21, 0xf5, 0xf6, 0x0b, 0x81, 0xba, 0x81, 0xc7, 0x54, 0x5b, 0x77, 0xf5, 0xbf, 0x09,
-    0xd9, 0xeb, 0xed, 0xb7, 0x45, 0x80, 0x0b, 0x24, 0x04, 0x2c, 0x5b, 0x66, 0xec, 0x35, 0x28, 0xf1,
-    0xd7, 0xf0, 0xba, 0xaa, 0xb6, 0xd5, 0x11, 0x61, 0x23, 0x79, 0x27, 0xf0, 0x76, 0xdb, 0x5e, 0x81,
-    0x27, 0x3c, 0xc3, 0xfc, 0x6c, 0x14, 0x1c, 0x3b, 0xc7, 0x0e, 0x10, 0xa0, 0x23, 0x91, 0x67, 0x81,
-    0x91, 0x81, 0x9e, 0x75, 0x13, 0xaa, 0x4b, 0x38, 0x17, 0x55, 0xb2, 0x5b, 0x05, 0xd7, 0xa3, 0x9c,
-    0x0b, 0xaa, 0x7e, 0x93, 0x8d, 0x31, 0xe0, 0x39, 0x48, 0x2b, 0xf9, 0xc7, 0x9c, 0x02, 0xbc, 0x0b,
-    0xb6, 0xdb, 0x62, 0xd1, 0xe3, 0xa7, 0xdb, 0x66, 0x8b, 0x76, 0x03, 0xb4, 0xa5, 0x37, 0xdb, 0x64,
-    0x70, 0xe1, 0x06, 0x38, 0x2d, 0xcb, 0xef, 0xd4, 0x01, 0x0c, 0x01, 0x86, 0x8b, 0xf7, 0xab, 0x48,
-    0x7b, 0x25, 0x81, 0x43, 0x0d, 0x5f, 0x5e, 0xc2, 0x34, 0x84, 0x80, 0xe6, 0x50, 0x3f, 0x20, 0xfa,
-    0x98, 0x19, 0xfa, 0xfd, 0xd7, 0xc4, 0x0c, 0x9c, 0x96, 0x55, 0x92, 0x3c, 0x0b, 0x43, 0x3d, 0xe5,
-    0xcc, 0x33, 0x8c, 0x1a, 0x0e, 0x65, 0xab, 0x30, 0x31, 0xb4, 0x4d, 0xb9, 0xd6, 0x98, 0xb6, 0x6e,
-    0xf3, 0xef, 0x9f, 0x6a, 0xba, 0xb2, 0xfc, 0xb7, 0xc7, 0xa3, 0xc8, 0x88, 0x55, 0x04, 0x62, 0xdd,
-    0xa8, 0xd4, 0xe1, 0xc3, 0xd4, 0x70, 0x71, 0x40, 0xee, 0x7a, 0xd2, 0x82, 0xb0, 0xf6, 0x30, 0x8c,
-    0x58, 0x6b, 0x36, 0xb2, 0x55, 0x72, 0x81, 0x4f, 0xfd, 0x4d, 0x88, 0xe5, 0x34, 0xee, 0x69, 0xbc,
-    0x63, 0x38, 0xd6, 0xf6, 0x16, 0xf4, 0xd8, 0xd8, 0xb6, 0x57, 0x38, 0x77, 0xa8, 0x50, 0x78, 0x72,
-    0x56, 0x2c, 0xb0, 0x1d, 0xb4, 0x88, 0xa7, 0x03, 0xb6, 0x95, 0x1e, 0xa7, 0xe5, 0x97, 0x9f, 0x9a,
-    0x33, 0x0f, 0x73, 0x6a, 0xba, 0xdb, 0x9f, 0x02, 0x79, 0x3c, 0x7f, 0xb7, 0x34, 0xd7, 0x06, 0xa3,
-    0x39, 0xe3, 0xbf, 0xdb, 0xdd, 0x71, 0x76, 0x94, 0x9f, 0x2e, 0x66, 0xd8, 0xe0, 0xd4, 0xaf, 0x95,
-    0x70, 0xf4, 0xab, 0xeb, 0xfe, 0x7d, 0x87, 0x5d, 0xce, 0x03, 0x3b, 0x01, 0x8e, 0x1c, 0xe4, 0x66,
-    0xff, 0x5a, 0xa7, 0xc6, 0x6d, 0x0e, 0x8b, 0xe3, 0xdb, 0x53, 0xfd, 0x07, 0x02, 0xe5, 0xfc, 0x70,
-    0xbd, 0xc2, 0x07, 0x7e, 0x53, 0xbc, 0xab, 0x55, 0xc4, 0x39, 0xea, 0x6b, 0xa7, 0xb1, 0x89, 0xc0,
-    0xf6, 0x8b, 0x1d, 0xfa, 0xa7, 0x70, 0x56, 0xaa, 0xf8, 0x74, 0xb0, 0x95, 0x82, 0x1d, 0x15, 0x3e,
-    0x24, 0x2f, 0xc0, 0x0a, 0x73, 0x31, 0xfb, 0xcc, 0x65, 0xff, 0xe4, 0x4f, 0xbb, 0xc2, 0x1a, 0x96,
-    0x1a, 0x37, 0xe0, 0x25, 0xcf, 0x80, 0x69, 0x1a, 0x77, 0xfe, 0xdd, 0xcf, 0x78, 0x13, 0xf2, 0x16,
-    0x32, 0xc0, 0x46, 0xe3, 0x0e, 0x1d, 0x23, 0x87, 0x22, 0x21, 0x38, 0x72, 0x49, 0x70, 0x7b, 0x69,
-    0x46, 0x68, 0xc4, 0xf8, 0x64, 0xe4, 0x94, 0x03, 0xb7, 0x7b, 0xb3, 0xf5, 0x27, 0xa2, 0x6f, 0xe0,
-    0xb6, 0x2b, 0x45, 0x77, 0xef, 0x7b, 0xc7, 0xab, 0x83, 0xde, 0x72, 0x3b, 0xdf, 0x3c, 0xb0, 0x15,
-    0x3c, 0xb7, 0x09, 0xd1, 0xd8, 0x8a, 0xc0, 0x76, 0x47, 0x01, 0x63, 0x34, 0xd6, 0x4e, 0xc1, 0xb8,
-    0x16, 0x97, 0x3a, 0x44, 0x8f, 0x25, 0x37, 0x19, 0xe5, 0x1a, 0xd2, 0xac, 0xb1, 0x87, 0xc2, 0x2d,
-    0x21, 0xcc, 0x6f, 0x66, 0xde, 0xfb, 0xb2, 0xbc, 0x2b, 0xb8, 0xbb, 0xf0, 0xa8, 0x97, 0x1e, 0xea,
-    0x46, 0xa3, 0x0e, 0x1d, 0xa3, 0x87, 0x3e, 0x36, 0x2f, 0x8d, 0xfb, 0x1a, 0x43, 0xa1, 0x19, 0x5a,
-    0x22, 0xdf, 0x4e, 0x89, 0xfd, 0x70, 0xbe, 0xfa, 0xae, 0xf0, 0xcd, 0x1b, 0xeb, 0xda, 0xef, 0x0d,
-    0x66, 0xfa, 0x13, 0xa2, 0xb1, 0x14, 0x07, 0x3d, 0x74, 0x1c, 0xa7, 0xc0, 0x37, 0x9b, 0xd2, 0xff,
-    0xc0, 0xfc, 0x38, 0x08, 0xcc, 0x0f, 0x6e, 0x37, 0x87, 0xd4, 0x1c, 0x88, 0x1c, 0x03, 0xda, 0x52,
-    0x63, 0x3e, 0x96, 0x44, 0x7f, 0x64, 0xe4, 0xea, 0xd8, 0x2c, 0x27, 0x9b, 0x4c, 0x1f, 0x9f, 0x6e,
-    0xd8, 0x6b, 0x01, 0xe4, 0x88, 0x83, 0x0d, 0x1c, 0x0e, 0x5c, 0x07, 0x9c, 0xff, 0x46, 0x0a, 0x54,
-    0xc2, 0x6c, 0x32, 0x5b, 0x67, 0xf1, 0x46, 0x53, 0x64, 0x44, 0x5e, 0x08, 0xe1, 0xe2, 0x62, 0xdf,
-    0xe9, 0x7e, 0x37, 0x5b, 0x08, 0xf0, 0x15, 0xf0, 0x8d, 0x55, 0x9e, 0x84, 0x8e, 0x1c, 0x22, 0x30,
-    0x1e, 0x32, 0x48, 0xf8, 0xbb, 0x69, 0xe0, 0x45, 0x43, 0xaa, 0x8d, 0x93, 0xff, 0x46, 0x57, 0x77,
-    0x67, 0x8e, 0x03, 0x3a, 0x8e, 0x03, 0xc0, 0x15, 0x9b, 0x7f, 0x37, 0xb2, 0x4f, 0x77, 0x79, 0x9e,
-    0x08, 0xc1, 0x1a, 0xe3, 0xee, 0xe0, 0x27, 0x44, 0xd9, 0x29, 0xe5, 0xaf, 0x75, 0x4b, 0x1e, 0x50,
-    0x8e, 0x09, 0x98, 0x9e, 0xc2, 0x61, 0xb3, 0x34, 0xc1, 0x23, 0xdd, 0xae, 0xda, 0xca, 0x03, 0x17,
-    0x6a, 0x37, 0xaa, 0x91, 0x35, 0xee, 0x34, 0x6a, 0x30, 0x4a, 0x3c, 0xfc, 0xfc, 0xc2, 0x3f, 0xa8,
-    0x7e, 0x14, 0xe7, 0x06, 0x07, 0x80, 0x88, 0x85, 0x1b, 0xfc, 0x59, 0xf0, 0x3a, 0xcc, 0x30, 0xde,
-    0x88, 0x17, 0xa7, 0xc8, 0xf5, 0x55, 0x8d, 0x5b, 0xb1, 0x3e, 0xcc, 0x88, 0x8b, 0xc2, 0x8c, 0xf8,
-    0xf4, 0x6a, 0xab, 0xb9, 0x7a, 0xf0, 0xf5, 0xe0, 0xf2, 0x22, 0x55, 0x5e, 0x6c, 0xdd, 0xae, 0xd1,
-    0xff, 0x63, 0x9f, 0xe4, 0xb2, 0xf0, 0x01, 0x88, 0xef, 0x78, 0x56, 0xb8, 0x4f, 0x0e, 0xa0, 0x98,
-    0xb5, 0xfa, 0xe8, 0xe8, 0x1b, 0xf7, 0xe6, 0x55, 0xeb, 0x7f, 0x17, 0xb6, 0xfa, 0x37, 0xb5, 0xad,
-    0x69, 0xc3, 0x04, 0x2d, 0x22, 0x2d, 0x80, 0x33, 0xa5, 0x09, 0x1b, 0x6d, 0xe7, 0xe1, 0x4f, 0x15,
-    0xb2, 0x05, 0x21, 0x9f, 0x47, 0x1d, 0x70, 0x14, 0x67, 0xc0, 0x30, 0x8f, 0xe7, 0xdf, 0xe7, 0x99,
-    0x70, 0x1c, 0x44, 0x62, 0x38, 0xe4, 0x6a, 0xe0, 0x3a, 0xec, 0xf0, 0x5f, 0xc1, 0x3a, 0x8b, 0x37,
-    0x39, 0xc8, 0xce, 0x06, 0x13, 0x7d, 0x9d, 0x76, 0x89, 0x6f, 0x80, 0xf3, 0x52, 0xdb, 0xeb, 0xb0,
-    0x8f, 0xd8, 0x91, 0x10, 0xc0, 0x61, 0xfc, 0x27, 0xae, 0xfb, 0x6c, 0x39, 0x89, 0xf0, 0x00, 0x50,
-    0x74, 0xcf, 0xf9, 0xe6, 0xae, 0xd3, 0xef, 0x80, 0x04, 0xdb, 0x65, 0xdc, 0xde, 0xca, 0x5d, 0x73,
-    0x7e, 0x05, 0x23, 0xbb, 0x6f, 0x60, 0x70, 0x1b, 0xa2, 0x47, 0xf8, 0x93, 0x39, 0xb0, 0xb6, 0x02,
-    0x7e, 0x1f, 0xa2, 0x7e, 0xe6, 0x29, 0xcb, 0x7f, 0xbb, 0xbf, 0xe0, 0x55, 0xe1, 0xb4, 0x3b, 0x66,
-    0x05, 0x1e, 0x7e, 0x60, 0x01, 0xd0, 0x53, 0xaf, 0x35, 0xd5, 0x8d, 0x46, 0x18, 0x1e, 0x13, 0xfc,
-    0xf7, 0xbe, 0x3d, 0xa1, 0x3e, 0x63, 0xdc, 0xfe, 0xec, 0x1b, 0xce, 0x1c, 0x81, 0xa4, 0x67, 0xcf,
-    0x99, 0x71, 0x9b, 0xc5, 0xdb, 0x4a, 0xf1, 0x59, 0x3f, 0x9e, 0xf4, 0x93, 0x02, 0x15, 0x30, 0xeb,
-    0x9a, 0x66, 0xe6, 0xb5, 0x00, 0x38, 0x02, 0xb8, 0x5b, 0x18, 0x38, 0xda, 0x4c, 0x7f, 0xb3, 0x0b,
-    0x26, 0x86, 0x8d, 0x1d, 0x46, 0x46, 0x37, 0xbf, 0x6a, 0xa9, 0x85, 0x4f, 0x2f, 0xc3, 0xd7, 0xaf,
-    0xd7, 0xde, 0xf4, 0x37, 0x2a, 0x12, 0x75, 0x5d, 0xaa, 0xab, 0x26, 0x76, 0x89, 0x3a, 0xf4, 0x8f,
-    0x70, 0x1c, 0x19, 0x3a, 0x56, 0xd0, 0x82, 0x47, 0x32, 0x22, 0x38, 0x0e, 0xb4, 0xae, 0xca, 0x7d,
-    0x2c, 0xf0, 0xf3, 0x86, 0x58, 0xaf, 0x99, 0xd2, 0x4f, 0x67, 0x02, 0x70, 0x8d, 0xd8, 0x07, 0x7e,
-    0x79, 0x47, 0xda, 0x04, 0x81, 0x9e, 0xaf, 0xed, 0x89, 0x1d, 0xa5, 0xc9, 0x8b, 0xda, 0xf3, 0x3b,
-    0xb2, 0x9c, 0xf0, 0x38, 0x1e, 0xde, 0x60, 0xd3, 0x81, 0x13, 0xf5, 0x11, 0x87, 0xf5, 0xf0, 0x77,
-    0x84, 0xc9, 0x9e, 0x99, 0x79, 0x49, 0x73, 0xd3, 0x3c, 0x5d, 0xbb, 0xb2, 0xce, 0xfc, 0x17, 0x4d,
-    0x71, 0x11, 0xd8, 0x35, 0x71, 0x1d, 0x8b, 0x14, 0x5c, 0x56, 0xdf, 0xe5, 0xed, 0x77, 0xc9, 0xa1,
-    0xa3, 0x46, 0x7a, 0x2b, 0xdc, 0x0a, 0x2d, 0xbb, 0x59, 0x50, 0x37, 0x78, 0x9f, 0xf0, 0xec, 0x55,
-    0xba, 0x7d, 0x7b, 0x1e, 0x7a, 0x6b, 0xfc, 0x0b, 0x6b, 0x6c, 0x5e, 0xc0, 0x5e, 0x17, 0x8f, 0x31,
-    0xb1, 0x9a, 0x05, 0x99, 0x76, 0x5d, 0x6d, 0xc0, 0x84, 0x43, 0x67, 0xc3, 0x1d, 0x9b, 0xe6, 0x09,
-    0xe1, 0xfb, 0x67, 0xe5, 0x23, 0x02, 0x55, 0xc1, 0xba, 0xaa, 0xa8, 0xde, 0x28, 0xd1, 0xe2, 0x67,
-    0x48, 0x1b, 0x9d, 0x9d, 0xfc, 0xce, 0x3c, 0xef, 0x46, 0xe3, 0x73, 0xf7, 0x64, 0x44, 0xbe, 0x14,
-    0x29, 0x42, 0x0c, 0xa7, 0x1a, 0xcb, 0xbe, 0x75, 0xfb, 0x10, 0x6a, 0x77, 0xb3, 0xf4, 0x70, 0x19,
-    0xa6, 0xc0, 0xbd, 0x9f, 0xc2, 0x9c, 0x7b, 0x93, 0xbf, 0x03, 0xa3, 0x69, 0xbe, 0x73, 0x2a, 0x8e,
-    0x0d, 0xfc, 0xb5, 0x30, 0x71, 0xb4, 0x88, 0xc6, 0xe7, 0x2c, 0x4c, 0x8c, 0x8c, 0xf6, 0x73, 0x7e,
-    0x5f, 0x43, 0xf2, 0xb8, 0x77, 0xc5, 0x75, 0x55, 0x85, 0x57, 0xdf, 0xc3, 0xaf, 0x5f, 0x1b, 0xbd,
-    0xf6, 0x37, 0x0b, 0x91, 0xd1, 0x3e, 0xa8, 0x77, 0xb6, 0xea, 0x27, 0x44, 0x61, 0x09, 0x01, 0xc5,
-    0x47, 0x17, 0xc7, 0x82, 0xb6, 0x96, 0x9f, 0xa7, 0x25, 0x92, 0x78, 0x6b, 0xbc, 0x00, 0x49, 0x6a,
-    0xbe, 0x9e, 0xc0, 0xee, 0x4a, 0xdd, 0xfc, 0x23, 0x68, 0x1c, 0xcf, 0x04, 0xf3, 0x72, 0xcd, 0xbf,
-    0x59, 0xca, 0xde, 0xf8, 0x1b, 0x05, 0x25, 0x1d, 0x7f, 0x0b, 0xf2, 0xa7, 0x37, 0xb3, 0x23, 0x34,
-    0x34, 0x9c, 0xec, 0xcc, 0x7a, 0x6f, 0x33, 0xb6, 0x57, 0x4f, 0x45, 0xc1, 0x1c, 0x5e, 0x23, 0x03,
-    0x42, 0x22, 0x10, 0xa8, 0xb5, 0xc6, 0xe7, 0x09, 0x5f, 0x62, 0x57, 0xed, 0xda, 0xee, 0x08, 0x12,
-    0xf7, 0x3f, 0x61, 0x52, 0x51, 0xe9, 0xec, 0x23, 0xcb, 0x6d, 0x77, 0x29, 0x0a, 0x6e, 0x7e, 0x8c,
-    0xc0, 0x73, 0x89, 0x0d, 0x12, 0x4e, 0xad, 0x83, 0xf0, 0x11, 0xf8, 0x59, 0x82, 0x46, 0xc2, 0x36,
-    0x2f, 0xcf, 0x48, 0x2d, 0xfc, 0x37, 0x24, 0x5c, 0x76, 0x10, 0xd3, 0x3f, 0xc3, 0x7e, 0x89, 0xde,
-    0x6c, 0x57, 0x51, 0xdc, 0x50, 0x9d, 0xba, 0xa6, 0x8e, 0xf5, 0x17, 0x52, 0xfc, 0x0d, 0x89, 0x3b,
-    0x14, 0xc8, 0x15, 0x7c, 0x5e, 0xdf, 0x3c, 0x3b, 0xc2, 0x4b, 0x8e, 0x65, 0x71, 0x89, 0xf7, 0x99,
-    0x04, 0x8e, 0x03, 0xbc, 0x0a, 0x9f, 0xf1, 0xde, 0x32, 0x43, 0x38, 0x5c, 0xd9, 0x26, 0x77, 0x3b,
-    0xc6, 0xcb, 0x70, 0xbe, 0xc5, 0x0e, 0x54, 0x8f, 0x63, 0x75, 0xc3, 0x85, 0x04, 0x2f, 0xa8, 0x4e,
-    0xde, 0xc7, 0x37, 0xb7, 0x85, 0xf6, 0x98, 0x3b, 0x37, 0x77, 0xb7, 0x22, 0x96, 0xc6, 0x0e, 0x03,
-    0x60, 0x25, 0x28, 0x59, 0x11, 0xc0, 0xff, 0x9d, 0x3a, 0xb5, 0x16, 0x02, 0x36, 0x91, 0x65, 0x7c,
-    0x8f, 0x37, 0xc8, 0xee, 0xd1, 0x30, 0x16, 0x70, 0xba, 0xcc, 0x02, 0xbe, 0x82, 0x6b, 0xe5, 0x4f,
-    0xb5, 0x13, 0x47, 0x94, 0x08, 0x3b, 0x44, 0x09, 0x4c, 0x2a, 0x94, 0x77, 0x07, 0xd6, 0x74, 0xeb,
-    0xf7, 0x83, 0x6a, 0x77, 0xba, 0xe4, 0xab, 0x59, 0x67, 0xe1, 0x91, 0x70, 0x47, 0x17, 0x02, 0x22,
-    0x27, 0x65, 0x73, 0x3f, 0x7b, 0x58, 0x84, 0xa2, 0xdd, 0xc7, 0xe5, 0x79, 0xc1, 0x3b, 0xbb, 0x32,
-    0xe0, 0x05, 0xa6, 0xeb, 0x75, 0xec, 0x94, 0x16, 0x07, 0x6f, 0x29, 0xed, 0x7d, 0x70, 0x53, 0x82,
-    0xc4, 0x54, 0x03, 0x96, 0x27, 0x2e, 0x88, 0x98, 0x31, 0xc0, 0xd9, 0xa7, 0x80, 0xc8, 0xb4, 0x0e,
-    0x3b, 0x67, 0xe7, 0x81, 0x1b, 0x8c, 0x32, 0x0d, 0xe8, 0x0d, 0x6d, 0x28, 0x58, 0xd8, 0xeb, 0xff,
-    0xc1, 0x1a, 0x14, 0xe4, 0x33, 0x93, 0x94, 0xe6, 0x67, 0xb6, 0x64, 0x74, 0x60, 0x98, 0xa3, 0xb8,
-    0x6f, 0x34, 0xf1, 0x8f, 0x4c, 0xe8, 0xf4, 0xa8, 0x8d, 0xa9, 0x2f, 0x67, 0x9b, 0xf0, 0x93, 0x76,
-    0xc9, 0x4e, 0x47, 0x57, 0x53, 0x93, 0x6e, 0x5c, 0xae, 0x57, 0x31, 0x07, 0x2d, 0xb5, 0xfb, 0xc3,
-    0x27, 0xc7, 0xe4, 0x13, 0xee, 0xf9, 0x7e, 0xa6, 0x05, 0x76, 0x4d, 0x13, 0xa5, 0x7f, 0x2f, 0xaa,
-    0xb0, 0x55, 0x36, 0x77, 0xf7, 0xbe, 0x16, 0xa1, 0x77, 0x7b, 0xea, 0x6e, 0x5b, 0x67, 0xf2, 0x70,
-    0x41, 0xf7, 0x6d, 0x55, 0xf3, 0xc8, 0x2b, 0x6d, 0xba, 0x0b, 0x54, 0x3c, 0x0c, 0x97, 0xf1, 0x7c,
-    0xb3, 0x7c, 0x30, 0xb5, 0x05, 0x0a, 0xd7, 0x65, 0xc0, 0x96, 0x9b, 0x0d, 0x42, 0x97, 0xc8, 0x42,
-    0xbc, 0x5a, 0x59, 0x9e, 0xe0, 0x06, 0x3b, 0x0f, 0x9c, 0x73, 0xb8, 0xba, 0x6c, 0xe6, 0x41, 0xf5,
-    0xb9, 0xb1, 0xb2, 0x3f, 0x7c, 0xf6, 0x86, 0xc0, 0x58, 0xbd, 0x75, 0x17, 0xe9, 0x22, 0x53, 0x48,
-    0x16, 0x0e, 0xf6, 0x05, 0xad, 0xe0, 0xdb, 0xf1, 0xcb, 0x5e, 0x52, 0xdf, 0x0e, 0x44, 0x5e, 0x25,
-    0x63, 0x88, 0x30, 0x06, 0xb4, 0xa4, 0xc7, 0x61, 0x45, 0x59, 0x4a, 0x3a, 0x45, 0xbb, 0x8c, 0xe4,
-    0x9a, 0x06, 0x43, 0x78, 0x43, 0xe9, 0x38, 0x06, 0xf0, 0xc3, 0xb7, 0xd2, 0x82, 0x57, 0x30, 0xaa,
-    0x55, 0xe0, 0x9a, 0x22, 0x4d, 0xe3, 0xd5, 0xbd, 0x3f, 0x44, 0x52, 0xb0, 0x77, 0x55, 0x48, 0x88,
-    0x38, 0x06, 0x5f, 0x11, 0x79, 0x0d, 0xf4, 0x43, 0x2b, 0x00, 0x16, 0x92, 0x11, 0xea, 0xc3, 0x91,
-    0x25, 0xf0, 0x18, 0xf7, 0x7c, 0xa2, 0xaa, 0x3f, 0x47, 0x5c, 0x70, 0x2b, 0x60, 0x12, 0x01, 0xfa,
-    0x01, 0xee, 0xd7, 0x96, 0xf4, 0xb1, 0xb3, 0xe6, 0x8d, 0xfe, 0x0f, 0x2b, 0x4b, 0x6d, 0x3c, 0xb4,
-    0xb7, 0xae, 0xdf, 0x00, 0x18, 0xda, 0x84, 0x29, 0x35, 0xf1, 0xf6, 0x53, 0x15, 0xfa, 0xdc, 0x6e,
-    0x59, 0x10, 0x54, 0xea, 0x5e, 0xcd, 0x6c, 0x22, 0xe0, 0x39, 0x1f, 0xf2, 0x90, 0xab, 0x0d, 0x87,
-    0xad, 0xcb, 0x45, 0x47, 0x6b, 0xbf, 0x20, 0xdb, 0xdb, 0x5e, 0x03, 0xb7, 0x07, 0x18, 0xd2, 0x5e,
-    0xab, 0xc0, 0x56, 0xfd, 0xf7, 0x7f, 0x40, 0xcb, 0xc4, 0xa4, 0xb1, 0x61, 0xc4, 0xe0, 0xc0, 0x25,
-    0x78, 0x19, 0xf2, 0x21, 0x36, 0xf1, 0xaa, 0x2f, 0xf4, 0x01, 0xc8, 0x8b, 0xc0, 0xab, 0xe0, 0x02,
-    0xc0, 0xd7, 0x55, 0x03, 0x1f, 0x32, 0x91, 0x11, 0x00, 0xb7, 0x0c, 0xff, 0xcf, 0x9c, 0x1a, 0x20,
-    0x1b, 0x27, 0xbf, 0xf3, 0x77, 0x73, 0x9e, 0x47, 0x86, 0x83, 0xb3, 0x84, 0x98, 0xe2, 0x34, 0x39,
-    0x68, 0xc3, 0x13, 0xc3, 0xf3, 0xc0, 0xbf, 0xa2, 0x14, 0xe7, 0xf1, 0xe0, 0x4f, 0x3a, 0x2d, 0xdb,
-    0x77, 0x22, 0xef, 0x00, 0x53, 0xc4, 0xb2, 0xf2, 0x16, 0xc1, 0x79, 0x11, 0xaa, 0x8f, 0x32, 0x3e,
-    0x81, 0xd0, 0xf2, 0x22, 0xe0, 0x0e, 0xc0, 0xe3, 0xb0, 0x5b, 0x79, 0xd3, 0x16, 0xed, 0x2b, 0x91,
-    0xf5, 0x54, 0xa1, 0x27, 0x98, 0xeb, 0x5c, 0x02, 0x5c, 0x09, 0xaf, 0x86, 0x91, 0xd0, 0x36, 0x61,
-    0xc8, 0x89, 0x55, 0xbb, 0xd1, 0x35, 0x5e, 0xb4, 0x32, 0xb1, 0xdb, 0xdb, 0xdb, 0x4b, 0x5b, 0x63,
-    0xcb, 0x84, 0x26, 0x27, 0x8d, 0x1b, 0x68, 0xfe, 0x5f, 0x4b, 0xb3, 0xb8, 0x67, 0xf7, 0x7d, 0x55,
-    0x82, 0xb2, 0x13, 0xbd, 0x49, 0xf0, 0xd6, 0x0e, 0xef, 0x62, 0x5b, 0x67, 0x59, 0xfb, 0x17, 0xdb,
-    0xd8, 0x18, 0x4d, 0xcc, 0xbb, 0xfa, 0x61, 0xab, 0xb5, 0xbc, 0xf6, 0x29, 0xaf, 0x10, 0x6d, 0x34,
-    0x0a, 0xa7, 0x50, 0x7f, 0xfb, 0xd5, 0xb0, 0x53, 0x59, 0xfb, 0xce, 0x8a, 0x25, 0x37, 0xad, 0x3e,
-    0xe5, 0xaa, 0x9b, 0xae, 0x4c, 0x88, 0xbe, 0x04, 0x4f, 0x81, 0x79, 0x8f, 0xa5, 0x3f, 0x6f, 0x15,
-    0x31, 0xc4, 0xb8, 0x15, 0xe8, 0x18, 0x91, 0x13, 0x80, 0x07, 0x54, 0xeb, 0x30, 0x35, 0x20, 0xcd,
-    0x33, 0x22, 0x07, 0x81, 0xdf, 0x8b, 0x14, 0x19, 0xe7, 0xa6, 0x3b, 0x4b, 0xca, 0x0b, 0x2e, 0xa2,
-    0x1d, 0x7b, 0x73, 0xb1, 0x74, 0x6c, 0xa2, 0x28, 0xfa, 0x23, 0x30, 0x46, 0xaf, 0x04, 0x8a, 0x38,
-    0x26, 0x4d, 0x7f, 0x00, 0x91, 0x14, 0x86, 0x0f, 0x9d, 0x1d, 0x11, 0x1f, 0x15, 0x39, 0x0f, 0xb8,
-    0x55, 0xbb, 0x86, 0xd3, 0x3f, 0x00, 0x91, 0x16, 0xaa, 0xe9, 0x25, 0xfa, 0xfe, 0xdf, 0x00, 0x9f,
-    0xb3, 0xaf, 0x1d, 0x78, 0x45, 0xe0, 0xfe, 0xcc, 0x78, 0xb7, 0x7e, 0x9f, 0xe0, 0x9a, 0xd7, 0x7b,
-    0xbb, 0xe2, 0x1f, 0x67, 0xd4, 0x9f, 0xb0, 0xc6, 0xe0, 0xcc, 0x61, 0x6f, 0x6f, 0x01, 0x51, 0xe9,
-    0xff, 0x88, 0xf2, 0xa8, 0x6b, 0x95, 0xb1, 0xea, 0x78, 0xa7, 0x37, 0x85, 0x34, 0x42, 0xf4, 0x6c,
-    0x76, 0x0b, 0x6e, 0x7a, 0x01, 0x5f, 0x8a, 0xcc, 0x56, 0xfe, 0xfa, 0xc7, 0x57, 0xe8, 0x26, 0x44,
-    0x95, 0xe3, 0x4c, 0x35, 0x35, 0x8b, 0x7a, 0xaa, 0xf1, 0x5f, 0x32, 0x5a, 0xf2, 0x22, 0xc0, 0x8f,
-    0xec, 0x8b, 0xce, 0xff, 0x8e, 0x37, 0x3c, 0x36, 0xbc, 0x47, 0x44, 0x50, 0x26, 0xbe, 0x43, 0x22,
-    0xff, 0x7d, 0x4d, 0xf6, 0x38, 0x12, 0xf1, 0xdf, 0xc2, 0x2d, 0x86, 0xb1, 0xa5, 0x2b, 0xb1, 0x3c,
-    0x22, 0x27, 0x61, 0x94, 0x3b, 0x14, 0xc7, 0xb5, 0x28, 0x0f, 0x85, 0xdd, 0xe0, 0x16, 0x01, 0xd2,
-    0xb9, 0x8e, 0xfb, 0x01, 0x4b, 0x25, 0x7c, 0x4b, 0xf4, 0xb8, 0x44, 0x41, 0xc2, 0x2e, 0xf3, 0xbe,
-    0xd1, 0x2d, 0x27, 0x8a, 0x31, 0xf0, 0xe2, 0x28, 0x00, 0x24, 0x9e, 0x3f, 0x30, 0xb0, 0xaf, 0xcc,
-    0xf5, 0xb7, 0x52, 0xf3, 0x72, 0x50, 0xa1, 0x70, 0xfe, 0xaa, 0x82, 0xa1, 0x69, 0xbd, 0x6b, 0x78,
-    0x6b, 0x7f, 0x17, 0xb6, 0x39, 0x23, 0x1c, 0xf8, 0x9b, 0xf0, 0x27, 0x44, 0x00, 0x19, 0x21, 0x1b,
-    0x0b, 0xe8, 0x1f, 0x4b, 0x8f, 0x86, 0xde, 0x15, 0xb9, 0x7a, 0xa9, 0xd9, 0xae, 0x9c, 0xca, 0x5d,
-    0xbf, 0xef, 0xe8, 0x1b, 0xcc, 0xb5, 0x6a, 0x30, 0x9e, 0x30, 0xe1, 0xb7, 0x57, 0x9b, 0xcb, 0x7c,
-    0x16, 0xe8, 0x31, 0x4e, 0x0e, 0xbc, 0x4f, 0xf3, 0x72, 0xbb, 0xb5, 0x3c, 0x10, 0xaf, 0x54, 0xc2,
-    0xe9, 0x11, 0x53, 0xc0, 0xfa, 0x7f, 0xf0, 0x39, 0xb8, 0xae, 0x4c, 0xef, 0x13, 0x6e, 0x19, 0x4e,
-    0xe5, 0x96, 0x21, 0xb8, 0x5a, 0x19, 0x9f, 0x6a, 0x33, 0xaf, 0x02, 0x8e, 0x72, 0xbb, 0x86, 0xca,
-    0x02, 0xbe, 0xfa, 0x1b, 0x95, 0x95, 0x05, 0x3d, 0xe4, 0x76, 0x5e, 0x22, 0x15, 0xac, 0xc7, 0xaf,
-    0x57, 0xfb, 0x72, 0x22, 0xb0, 0x3e, 0x2f, 0x05, 0x08, 0x3c, 0x94, 0xc0, 0x0c, 0xb6, 0x3b, 0x7f,
-    0xba, 0xa1, 0x3e, 0x2f, 0xdd, 0xb2, 0x3d, 0xfc, 0xc8, 0xe8, 0xe2, 0x48, 0x88, 0x35, 0xf0, 0xf5,
-    0x51, 0xc6, 0x5f, 0x66, 0x02, 0xf1, 0xce, 0xf0, 0xad, 0x31, 0x38, 0x5c, 0x71, 0xa6, 0x0c, 0xe7,
-    0xcb, 0x3d, 0x7b, 0xbc, 0x2b, 0x5c, 0x3b, 0xd3, 0x76, 0xcc, 0x7e, 0x8c, 0xad, 0xb1, 0x95, 0x9f,
-    0x1a, 0xfb, 0x8a, 0xf7, 0x86, 0x6d, 0x8c, 0x88, 0xe7, 0xc1, 0x8e, 0xf4, 0xcf, 0x68, 0x49, 0x70,
-    0xa4, 0xc2, 0xa4, 0x9e, 0xbd, 0xc4, 0xc5, 0xdb, 0x8b, 0x72, 0xf9, 0x17, 0xfb, 0x8f, 0x21, 0xc8,
-    0x8c, 0xad, 0xb5, 0x6f, 0x9f, 0x7a, 0x4e, 0x8e, 0xd5, 0xf0, 0xf0, 0xab, 0x9b, 0xf9, 0xd7, 0x0f,
-    0x01, 0x22, 0x1d, 0x18, 0x56, 0xfd, 0xba, 0x9b, 0x0a, 0xb9, 0xe7, 0x5f, 0x16, 0xbb, 0x5f, 0x7b,
-    0x8a, 0x8b, 0x5c, 0x2e, 0xe8, 0xdf, 0x22, 0x5c, 0x6f, 0xa3, 0x31, 0x67, 0x58, 0x04, 0x63, 0x9e,
-    0xfe, 0x3c, 0x16, 0xec, 0xfa, 0xfe, 0x8e, 0xea, 0xdf, 0x2a, 0x9f, 0xa8, 0x1f, 0x67, 0x0f, 0xea,
-    0xe0, 0x3b, 0x36, 0x06, 0x83, 0x0d, 0x90, 0x26, 0xfa, 0x85, 0x0f, 0xff, 0xe7, 0x6b, 0xc3, 0x5c,
-    0x3d, 0xc9, 0xbc, 0xcf, 0x08, 0x10, 0x0a, 0x03, 0xcd, 0x5e, 0x2f, 0xd3, 0x72, 0x11, 0xad, 0xbe,
-    0x57, 0x02, 0xda, 0x1d, 0x27, 0xce, 0xb5, 0x26, 0xb9, 0x31, 0x79, 0xad, 0x6e, 0x9d, 0xf2, 0x35,
-    0x8f, 0x0a, 0xce, 0xec, 0xef, 0x71, 0x1c, 0xb6, 0x6f, 0x77, 0x64, 0x8d, 0x1e, 0x44, 0x3c, 0x0b,
-    0x17, 0x8a, 0x2a, 0x2a, 0xf4, 0xdf, 0xc6, 0x0b, 0xf0, 0xb4, 0x69, 0xd5, 0x1c, 0xf6, 0x25, 0x5f,
-    0x1a, 0xce, 0xb5, 0x91, 0x2a, 0x32, 0x45, 0xb5, 0xf8, 0x06, 0x83, 0x72, 0xeb, 0xef, 0xe0, 0xc2,
-    0xcc, 0xb3, 0x87, 0xf5, 0x33, 0xb7, 0x70, 0xcd, 0xb2, 0x69, 0x83, 0xbb, 0x06, 0x25, 0x4d, 0xab,
-    0x05, 0x1d, 0x1a, 0x6a, 0x34, 0x5c, 0xfc, 0xd6, 0x15, 0x73, 0xb7, 0x7a, 0x78, 0x33, 0xda, 0x6d,
-    0x7c, 0x46, 0x4c, 0xed, 0x06, 0x47, 0x39, 0x6e, 0x08, 0x6a, 0x5f, 0xa6, 0xd0, 0xe9, 0x1a, 0x7d,
-    0xdb, 0x54, 0x2c, 0x5a, 0x74, 0xc4, 0x69, 0x79, 0x45, 0xbb, 0x53, 0xe0, 0x25, 0x09, 0xff, 0x00,
-    0xea, 0x1c, 0x01, 0x94, 0x81, 0x2b, 0x98, 0x5f, 0x37, 0xb2, 0x4f, 0x77, 0xc7, 0x9e, 0x24, 0x1b,
-    0x58, 0x39, 0xd3, 0x0d, 0xe8, 0x21, 0x7a, 0xc0, 0x63, 0xc4, 0xb0, 0xcf, 0x80, 0x51, 0x32, 0x23,
-    0xb5, 0x1f, 0xb8, 0xc0, 0x28, 0xd1, 0x05, 0xd6, 0x9e, 0x18, 0x3e, 0x08, 0x1b, 0x2c, 0xf7, 0x81,
-    0xd3, 0xe2, 0x04, 0xbd, 0x6f, 0x38, 0x0b, 0x64, 0x9c, 0xcf, 0x9c, 0x38, 0x4e, 0xaf, 0xdf, 0x6b,
-    0x9d, 0x6f, 0x78, 0x2f, 0x02, 0xc2, 0x1c, 0x6f, 0xc2, 0xd5, 0x47, 0xad, 0xf0, 0x75, 0xc9, 0xc2,
-    0xb9, 0xc3, 0x42, 0x6c, 0x38, 0x6b, 0x78, 0x1e, 0x10, 0x18, 0xf7, 0x90, 0x90, 0x3b, 0xde, 0x9c,
-    0x4c, 0x81, 0x4c, 0x58, 0x4a, 0x64, 0xc6, 0x5b, 0xf3, 0xb8, 0x59, 0x8d, 0xff, 0x3f, 0x95, 0x54,
-    0xad, 0xc3, 0x8b, 0xca, 0xbc, 0xc6, 0x1b, 0xdb, 0x75, 0x54, 0x31, 0x63, 0xa3, 0xa7, 0x02, 0x3c,
-    0x75, 0x3d, 0xd6, 0x58, 0xf3, 0xb8, 0xb9, 0x8d, 0xb1, 0x4f, 0x4f, 0xc9, 0x04, 0x31, 0x00, 0x24,
-    0x19, 0x2f, 0x83, 0x5f, 0x60, 0x04, 0xf4, 0x74, 0x8d, 0xfb, 0x35, 0x2a, 0x3e, 0x0e, 0x6f, 0x81,
-    0xb3, 0xda, 0x7b, 0x16, 0xa3, 0x31, 0x6f, 0xdf, 0x6a, 0xaa, 0xdc, 0x7f, 0xf5, 0xb1, 0xd5, 0x60,
-    0xdb, 0x01, 0x40, 0x51, 0x5d, 0x4a, 0x61, 0x80, 0x3e, 0x2c, 0x86, 0x01, 0x87, 0x93, 0x17, 0x99,
-    0x58, 0x60, 0x99, 0xda, 0x77, 0x67, 0x14, 0x70, 0xc1, 0x98, 0xb8, 0x4b, 0x73, 0x2a, 0xc4, 0xc5,
-    0xfe, 0x36, 0xc2, 0x74, 0x66, 0x50, 0xbe, 0x9a, 0xcb, 0x18, 0xd2, 0x1c, 0x7c, 0x2a, 0xe8, 0xff,
-    0xfc, 0x21, 0xd8, 0xe2, 0x55, 0xa1, 0x37, 0xeb, 0x58, 0xdb, 0xe4, 0x5e, 0x9f, 0xa8, 0xba, 0xe7,
-    0xcf, 0x82, 0x13, 0x72, 0x9f, 0xae, 0x96, 0x0f, 0x1d, 0x97, 0xb6, 0x69, 0x8b, 0x4d, 0xb7, 0x79,
-    0xd7, 0x4b, 0x96, 0x76, 0xe7, 0x7f, 0x86, 0xd9, 0x03, 0xaf, 0xab, 0x6a, 0x10, 0x33, 0x01, 0x27,
-    0x75, 0x78, 0x11, 0x42, 0x67, 0x84, 0xf3, 0x3b, 0xb4, 0x3c, 0xd0, 0x33, 0x6f, 0xae, 0x7e, 0x06,
-    0xc1, 0x50, 0xd0, 0xde, 0xed, 0x7a, 0xd7, 0x3d, 0xe0, 0x55, 0x0d, 0x77, 0x1c, 0x94, 0x86, 0xac,
-    0x07, 0x35, 0x31, 0xdc, 0x38, 0x4c, 0x96, 0x7c, 0x01, 0x79, 0x95, 0x86, 0x83, 0x0b, 0x0a, 0x61,
-    0x7d, 0x55, 0xa8, 0xd5, 0x28, 0xd1, 0x10, 0x81, 0x4a, 0x55, 0x0c, 0x02, 0xf1, 0x13, 0x5f, 0x85,
-    0x3f, 0x5f, 0x85, 0xaa, 0x1d, 0x6f, 0x36, 0x69, 0x9f, 0xf4, 0x17, 0x36, 0x6d, 0x8d, 0xbe, 0xe1,
-    0x86, 0xe3, 0x96, 0xc6, 0x9c, 0x5c, 0x26, 0xdc, 0x69, 0x1c, 0x5d, 0x5a, 0xd1, 0xc1, 0xc2, 0x10,
-    0xb2, 0xcf, 0x75, 0x95, 0xd1, 0xd9, 0x54, 0x65, 0x8e, 0xb1, 0x58, 0xa5, 0xee, 0xdd, 0xa5, 0xb5,
-    0xa3, 0xed, 0x32, 0x3a, 0x32, 0x4c, 0xb4, 0x5c, 0x4a, 0xa5, 0x4f, 0x89, 0xd5, 0xeb, 0x62, 0xce,
-    0xcf, 0x96, 0x46, 0x0d, 0xe5, 0xe8, 0x7c, 0x72, 0xfd, 0x21, 0x49, 0x06, 0xde, 0x0e, 0x45, 0x5c,
-    0xf0, 0x72, 0xf8, 0x23, 0x3d, 0xa6, 0x41, 0x9b, 0xb0, 0x72, 0xc6, 0x1a, 0xa5, 0x5a, 0xe1, 0x62,
-    0xa3, 0x83, 0xdb, 0x4a, 0x9f, 0x47, 0x25, 0x96, 0xf8, 0x63, 0x59, 0x19, 0x38, 0xb5, 0x5f, 0x4f,
-    0xea, 0x4f, 0xe1, 0x05, 0xa8, 0x53, 0x54, 0x42, 0x19, 0x79, 0xd1, 0xc8, 0x19, 0x1d, 0x99, 0xee,
-    0xc4, 0x31, 0x16, 0xb8, 0x33, 0x6c, 0xe6, 0xf0, 0x2d, 0x51, 0x74, 0x7c, 0x74, 0x62, 0xe7, 0xae,
-    0x0b, 0x4c, 0x71, 0x4b, 0x8d, 0x1c, 0x34, 0x21, 0xc6, 0xef, 0x16, 0x39, 0xcb, 0x1c, 0x41, 0x63,
-    0x05, 0x9b, 0xaf, 0x2a, 0x3e, 0x61, 0x5f, 0x05, 0xbb, 0x75, 0x4b, 0x94, 0x96, 0x7c, 0x19, 0xdb,
-    0x4e, 0xc1, 0xf9, 0x9d, 0x67, 0x50, 0xc7, 0x20, 0xd3, 0x00, 0x8d, 0x7b, 0x1c, 0x90, 0xb9, 0x7c,
-    0xc0, 0xa7, 0xb7, 0x2f, 0x22, 0x07, 0x7b, 0xbf, 0xdb, 0x80, 0xd8, 0x2a, 0xa1, 0x6b, 0xc9, 0x4e,
-    0xd5, 0xc1, 0x24, 0x06, 0xab, 0x07, 0x72, 0x61, 0x90, 0x58, 0xfc, 0xc2, 0xf3, 0x6f, 0x30, 0x09,
-    0xa4, 0xa4, 0x54, 0x80, 0xc6, 0xe6, 0x3a, 0x23, 0x6b, 0x18, 0x12, 0xba, 0x13, 0x7f, 0xdd, 0x71,
-    0xf6, 0xd4, 0xb6, 0x48, 0x9b, 0xa3, 0xdd, 0xff, 0xf0, 0x7f, 0x46, 0x8f, 0x67, 0x87, 0xd9, 0x85,
-    0xcd, 0x43, 0xed, 0xfe, 0xe6, 0xf6, 0x25, 0x95, 0x75, 0xc1, 0x4b, 0xd9, 0x75, 0x54, 0x85, 0x77,
-    0xad, 0xc3, 0xff, 0xce, 0xbc, 0x42, 0x8a, 0xb8, 0x0c, 0x88, 0xeb, 0xc1, 0x00, 0x0c, 0xdc, 0x70,
-    0x8c, 0x90, 0x77, 0xf1, 0x4f, 0x7c, 0x3e, 0xf4, 0x54, 0x2d, 0xae, 0xd5, 0xbe, 0x01, 0x7e, 0xf6,
-    0xd5, 0x7c, 0x6a, 0xe7, 0x1c, 0x95, 0x2d, 0x0c, 0xbb, 0xdb, 0x55, 0x5d, 0x56, 0x77, 0xfc, 0x38,
-    0xf8, 0x7d, 0xb6, 0x8a, 0x62, 0xd4, 0x26, 0xef, 0x92, 0x03, 0xd5, 0x83, 0xe7, 0xb0, 0x6d, 0x80,
-    0xff, 0xcc, 0xec, 0xa6, 0xc3, 0x80, 0x2a, 0x21, 0x02, 0x5b, 0xa1, 0x0c, 0xfe, 0xc2, 0x26, 0x65,
-    0x0a, 0xb5, 0x1d, 0x6f, 0x70, 0x7d, 0xfe, 0x8d, 0xb4, 0xc6, 0xff, 0x08, 0xca, 0x1a, 0xb5, 0x4a,
-    0x52, 0x31, 0xd4, 0x71, 0xc6, 0xcf, 0xe5, 0x3e, 0xdf, 0x15, 0x7c, 0xb3, 0xf0, 0xfa, 0x59, 0x2c,
-    0x7d, 0xc3, 0x27, 0xc7, 0x46, 0xf6, 0x65, 0xd6, 0x7a, 0x0f, 0xf7, 0xfe, 0xc3, 0x6c, 0xeb, 0x9d,
-    0xa2, 0x2a, 0x73, 0x1d, 0x2d, 0xf0, 0xb1, 0xb1, 0xff, 0x31, 0xf0, 0x9b, 0x35, 0x3e, 0x02, 0x44,
-    0x53, 0x70, 0x72, 0x54, 0x8f, 0xb0, 0x92, 0x0a, 0x45, 0x83, 0xb2, 0xea, 0x35, 0xb7, 0x72, 0x5e,
-    0x9b, 0xf0, 0x4e, 0x89, 0x10, 0x92, 0x0e, 0x93, 0xdc, 0xf8, 0x87, 0xd2, 0x0b, 0x6c, 0x3f, 0x4c,
-    0x82, 0xd5, 0x52, 0x02, 0x03, 0x30, 0x0d, 0x3a, 0x86, 0x01, 0x88, 0x40, 0xa5, 0x2a, 0x92, 0x04,
-    0x7f, 0x32, 0xa1, 0x33, 0x78, 0xd5, 0xd6, 0x03, 0xbc, 0x8c, 0xec, 0x6b, 0x75, 0xbe, 0x43, 0x99,
-    0x18, 0x32, 0xc2, 0xd7, 0x34, 0x75, 0xb0, 0x86, 0x45, 0x48, 0xf9, 0x4a, 0xd5, 0x13, 0x4b, 0x1c,
-    0xf1, 0x39, 0x4c, 0x69, 0x30, 0x8b, 0xe1, 0x33, 0x62, 0xdc, 0x62, 0x52, 0x9c, 0x0a, 0xc2, 0x44,
-    0x60, 0xcf, 0x9d, 0xa9, 0xe4, 0x19, 0xb9, 0x3c, 0xba, 0x8f, 0x00, 0x25, 0xd9, 0x6f, 0x47, 0xd8,
-    0xee, 0xb0, 0x3f, 0x06, 0xd5, 0x56, 0x71, 0xf5, 0x8a, 0xc7, 0x05, 0xc8, 0xec, 0xc0, 0xec, 0x7a,
-    0x16, 0xdd, 0x1c, 0x95, 0x99, 0xfc, 0xae, 0xaa, 0x74, 0x4e, 0x84, 0x92, 0x79, 0x18, 0x44, 0x82,
-    0x24, 0x64, 0x9a, 0xf0, 0xf6, 0xd2, 0xb3, 0xe1, 0xb4, 0xb3, 0x35, 0x0f, 0x09, 0xeb, 0xad, 0x36,
-    0xb0, 0x2a, 0x73, 0x6b, 0xaf, 0xe0, 0x78, 0xf5, 0x02, 0x0a, 0xcd, 0x0c, 0x62, 0xf0, 0xb9, 0x94,
-    0x42, 0x6c, 0xb5, 0xb2, 0x07, 0x6f, 0x87, 0x0a, 0x0a, 0xb4, 0x8a, 0x63, 0xb9, 0x21, 0x86, 0xd3,
-    0x0f, 0x67, 0xf9, 0x8a, 0x03, 0xef, 0xf0, 0x81, 0x6f, 0xfc, 0x25, 0x93, 0x1d, 0x60, 0x1c, 0x03,
-    0xda, 0x52, 0x63, 0x3e, 0xd6, 0x44, 0x29, 0x78, 0x2a, 0xac, 0x66, 0xd7, 0x9d, 0xbd, 0x41, 0xa9,
-    0xb9, 0xef, 0x09, 0x2e, 0x3d, 0xc0, 0xe5, 0x79, 0x9b, 0x3b, 0x12, 0x22, 0x46, 0x80, 0x07, 0x25,
-    0x8d, 0x6f, 0x0e, 0x4a, 0xb4, 0x36, 0x64, 0xec, 0xa6, 0x1c, 0x17, 0x62, 0xe2, 0x67, 0xee, 0x73,
-    0xc2, 0x36, 0xcb, 0xcf, 0x5e, 0x53, 0x54, 0x7e, 0x94, 0x24, 0x95, 0x80, 0x1d, 0x5e, 0xe9, 0xde,
-    0x99, 0x1d, 0xd9, 0xc4, 0xf5, 0x7f, 0x6c, 0xf0, 0x9e, 0x67, 0x6d, 0xef, 0x67, 0xea, 0x4f, 0x45,
-    0x97, 0x81, 0x0a, 0x7b, 0x30, 0x28, 0x4d, 0xa5, 0xd6, 0x98, 0xe1, 0x9e, 0xa3, 0x6d, 0xf8, 0x5b,
-    0x00, 0xc0, 0xa8, 0x55, 0x4d, 0x1a, 0x4d, 0x69, 0xfc, 0xe4, 0x79, 0x3d, 0x3f, 0xc6, 0xa7, 0xb9,
-    0xb1, 0xea, 0x1e, 0x37, 0xc1, 0xd1, 0x86, 0xa5, 0xef, 0xaf, 0xcf, 0xcd, 0xf1, 0x77, 0xa7, 0x6c,
-    0x1a, 0x9d, 0xc7, 0xd0, 0xc9, 0x0e, 0x77, 0x30, 0xd9, 0x96, 0xaf, 0xea, 0xde, 0x3f, 0xcf, 0xd2,
-    0xab, 0x95, 0x25, 0x2a, 0xd6, 0xa2, 0xa7, 0x46, 0xc6, 0x2f, 0x15, 0x99, 0x04, 0x2f, 0x92, 0x6d,
-    0x7a, 0xbc, 0x55, 0xa1, 0xeb, 0x1f, 0x8c, 0xab, 0x82, 0x78, 0x8f, 0xcb, 0x3b, 0xec, 0x02, 0xbd,
-    0xbf, 0x30, 0xda, 0x18, 0x8f, 0x2d, 0x27, 0xc4, 0x0a, 0xb6, 0x1b, 0x47, 0x12, 0xae, 0x73, 0x16,
-    0x56, 0x9f, 0xea, 0xa9, 0x4a, 0xc6, 0x37, 0xc7, 0x02, 0x42, 0xf6, 0xf0, 0xfd, 0x4d, 0x0c, 0xec,
-    0xc6, 0x4e, 0x5a, 0xfe, 0x5f, 0x55, 0x60, 0xac, 0x4c, 0xef, 0x11, 0x7c, 0x5a, 0xd7, 0x07, 0x25,
-    0x07, 0xb7, 0xfd, 0xed, 0x51, 0xb6, 0x83, 0x92, 0x30, 0xd5, 0x21, 0xe5, 0xaf, 0xec, 0x6d, 0xff,
-    0x04, 0xb2, 0xb1, 0xac, 0x62, 0x2d, 0xcd, 0x7c, 0xde, 0xed, 0xb2, 0xbc, 0x42, 0xb8, 0xff, 0x61,
-    0x59, 0xd7, 0xf7, 0x5a, 0x5d, 0xda, 0x2f, 0x80, 0xed, 0xae, 0xa6, 0xe1, 0x91, 0x8d, 0x09, 0x64,
-    0xf7, 0x56, 0x8d, 0x7a, 0xdd, 0xc8, 0xfb, 0x5b, 0x7f, 0xb9, 0x8e, 0x47, 0xa7, 0x3b, 0x30, 0x77,
-    0x42, 0xc2, 0x7c, 0x4c, 0x5e, 0x4f, 0xd4, 0xd9, 0x5d, 0xef, 0xbf, 0x4c, 0x7e, 0x12, 0x23, 0x91,
-    0x6a, 0x9c, 0xa1, 0xb8, 0x2a, 0xef, 0x73, 0x28, 0xe7, 0x77, 0xb7, 0xe8, 0x8f, 0x14, 0x9d, 0x31,
-    0x04, 0xb8, 0x97, 0xf0, 0xb9, 0xdd, 0xef, 0x01, 0x3d, 0x6b, 0x1e, 0xcc, 0x35, 0x9a, 0xac, 0xfe,
-    0xe9, 0x2c, 0xb3, 0xca, 0xf8, 0x27, 0x56, 0xd0, 0xb9, 0x53, 0x74, 0x09, 0x4d, 0xae, 0x5c, 0x8b,
-    0xbc, 0xc4, 0x4b, 0xdb, 0x75, 0x55, 0x51, 0x57, 0x68, 0x51, 0x69, 0x74, 0x8d, 0xa7, 0xcf, 0x24,
-    0x5d, 0xc5, 0xf6, 0x79, 0xaf, 0xc6, 0xae, 0x45, 0x5d, 0x44, 0x80, 0x12, 0x0a, 0x7d, 0x27, 0x37,
-    0x1c, 0x93, 0x8c, 0x0c, 0x1b, 0x7e, 0x39, 0x24, 0x4d, 0x58, 0xa1, 0xe4, 0x98, 0x61, 0x10, 0xf2,
-    0xfa, 0xe7, 0x52, 0x37, 0x80, 0xa8, 0x60, 0x35, 0x7c, 0x8a, 0x49, 0xa3, 0x44, 0x23, 0x20, 0xb5,
-    0x18, 0x9a, 0xe6, 0x51, 0x16, 0x75, 0xdf, 0x46, 0x57, 0x00, 0xea, 0xaf, 0x86, 0xe1, 0xa6, 0x68,
-    0x84, 0x62, 0xb7, 0x7b, 0xf3, 0xf5, 0x3b, 0x3f, 0x14, 0xed, 0x5f, 0xed, 0x13, 0xd1, 0x94, 0x9f,
-    0xc7, 0x16, 0x0b, 0x18, 0xa5, 0x1d, 0xf7, 0x27, 0xad, 0xe6, 0x5f, 0x39, 0x2d, 0x48, 0xd9, 0x24,
-    0x9a, 0x50, 0xfe, 0x70, 0x6a, 0xd7, 0xbb, 0x75, 0x77, 0x98, 0x3e, 0x3b, 0x6c, 0xfc, 0xa3, 0xa1,
-    0xe4, 0x9d, 0x35, 0x3e, 0x02, 0x42, 0xc7, 0xf0, 0xfa, 0x5b, 0x10, 0xd9, 0x1c, 0x94, 0x44, 0x7c,
-    0x9f, 0x55, 0x60, 0xa8, 0x26, 0x6f, 0x64, 0x9e, 0xcd, 0x65, 0x62, 0xf6, 0x07, 0x24, 0x35, 0xe7,
-    0x72, 0x52, 0x1a, 0xb0, 0x6f, 0x0d, 0x8b, 0xa5, 0xbf, 0x6b, 0x94, 0xe6, 0x27, 0xb6, 0xcf, 0x4d,
-    0x72, 0x30, 0x59, 0xbc, 0xd4, 0x57, 0x4b, 0xb5, 0xbf, 0x59, 0x71, 0x2c, 0x7c, 0x8a, 0x69, 0xa3,
-    0x79, 0x86, 0x32, 0x99, 0x6b, 0xa6, 0x83, 0x4f, 0x48, 0xd7, 0xbe, 0xdc, 0xd2, 0x29, 0x04, 0x73,
-    0x72, 0xaf, 0x37, 0x4c, 0x09, 0x30, 0x33, 0xdf, 0x60, 0xb6, 0x9e, 0x6f, 0x8f, 0x77, 0x1f, 0x33,
-    0x5e, 0x8a, 0x75, 0x1e, 0x6b, 0xc0, 0xed, 0x81, 0xcf, 0xc5, 0xf0, 0xc3, 0xf0, 0x95, 0xd3, 0x3b,
-    0x47, 0x42, 0xe6, 0x29, 0xb4, 0xef, 0x6f, 0x12, 0x63, 0x3d, 0x98, 0xa3, 0x4f, 0x81, 0xc3, 0xfc,
-    0xb3, 0xf4, 0x35, 0xb7, 0x2c, 0xa7, 0x0e, 0xeb, 0xe3, 0xdc, 0xc0, 0xdd, 0x75, 0x2b, 0x76, 0x9e,
-    0xbe, 0x0a, 0x0d, 0x82, 0x54, 0xcd, 0xab, 0x01, 0x5b, 0x58, 0x6a, 0xd8, 0xbb, 0x75, 0x4e, 0x2a,
-    0xd0, 0x2f, 0x58, 0xce, 0x8b, 0x59, 0x2c, 0x9c, 0xab, 0x01, 0xc9, 0x6e, 0x1b, 0xc1, 0x12, 0xa2,
-    0xb6, 0x80, 0x07, 0x25, 0x8c, 0xad, 0xc1, 0x7e, 0x08, 0x4c, 0x54, 0xfa, 0x8d, 0x7c, 0x95, 0x81,
-    0x47, 0xe5, 0xe6, 0x4f, 0x04, 0xd0, 0xf2, 0x29, 0xb0, 0x86, 0xa2, 0x1a, 0xca, 0x82, 0xd0, 0x19,
-    0xda, 0xd3, 0x1c, 0x33, 0xb8, 0x61, 0x93, 0xf2, 0x1f, 0x02, 0xd9, 0x5d, 0xc8, 0x43, 0xdd, 0xd5,
-    0x7c, 0x07, 0x34, 0xac, 0x54, 0x3f, 0xcb, 0x2c, 0x5e, 0x59, 0xb7, 0x43, 0x73, 0xa8, 0x23, 0xf0,
-    0x7a, 0xd3, 0xde, 0x58, 0xb1, 0x1d, 0x89, 0xf3, 0x26, 0x92, 0x88, 0xb4, 0x10, 0x7c, 0x19, 0x5f,
-    0x94, 0xbb, 0xe5, 0x12, 0xae, 0xde, 0xcb, 0xaa, 0x71, 0x1a, 0xe2, 0xee, 0xe0, 0x9c, 0x8a, 0x36,
-    0xdc, 0xef, 0x16, 0x21, 0x04, 0xe6, 0xc9, 0xc3, 0xc0, 0x52, 0x55, 0xf7, 0x53, 0xf5, 0x9c, 0xf5,
-    0x44, 0x53, 0x8f, 0x7e, 0x22, 0xa7, 0xa4, 0x06, 0x80, 0x92, 0x17, 0xb5, 0x54, 0x58, 0x50, 0xe1,
-    0x4e, 0xfb, 0x10, 0x6f, 0xb0, 0x15, 0x64, 0x86, 0xce, 0xbc, 0xe5, 0x80, 0xd9, 0x6b, 0xc4, 0x0d,
-    0x8d, 0xce, 0x42, 0x36, 0xf0, 0x02, 0xed, 0xbe, 0xe1, 0xfd, 0xdd, 0xce, 0x55, 0x22, 0x7d, 0xfd,
-    0x7b, 0x05, 0xf0, 0x53, 0x22, 0x49, 0x48, 0x36, 0xf0, 0x72, 0x1a, 0x79, 0x39, 0x2c, 0x0d, 0x58,
-    0x5e, 0x13, 0x7e, 0xc2, 0xf9, 0xf8, 0x81, 0x89, 0x68, 0x7b, 0x1a, 0xc5, 0xef, 0xa1, 0xce, 0x01,
-    0xb9, 0x20, 0x67, 0x96, 0x58, 0x01, 0x7c, 0x07, 0x55, 0x5b, 0x55, 0x77, 0xa6, 0x38, 0x92, 0xfc,
-    0x59, 0xb6, 0x60, 0x12, 0x5f, 0x98, 0x01, 0xc1, 0x98, 0xdb, 0x7d, 0xff, 0x6f, 0x7a, 0xc5, 0x9e,
-    0xa4, 0xd1, 0x1e, 0xa2, 0x3a, 0xe0, 0x27, 0xd9, 0x18, 0x6d, 0x7f, 0xa8, 0xc1, 0x39, 0x3a, 0x52,
-    0x4c, 0x72, 0x7a, 0x08, 0xef, 0xb9, 0xa8, 0x73, 0x35, 0x31, 0x7c, 0xfb, 0x30, 0x2a, 0x98, 0x3f,
-    0xb2, 0xc0, 0x51, 0xa5, 0xb7, 0xce, 0xf1, 0xc8, 0x54, 0xf8, 0xec, 0x69, 0x28, 0x74, 0x53, 0x22,
-    0x75, 0x09, 0xeb, 0x85, 0x24, 0x44, 0x97, 0x83, 0x09, 0xb8, 0x49, 0x78, 0x53, 0x34, 0xcc, 0xdb,
-    0x22, 0x76, 0xf6, 0xd6, 0xc2, 0x15, 0xc7, 0x61, 0xaa, 0x27, 0xf7, 0x14, 0x1a, 0xb7, 0xad, 0xf6,
-    0xc0, 0x20, 0xaa, 0xb0, 0x33, 0xa8, 0x64, 0x7e, 0xe7, 0x69, 0x2d, 0x6b, 0xf8, 0x64, 0xee, 0xaf,
-    0xb0, 0x2d, 0x2f, 0xae, 0xba, 0xb2, 0x52, 0xa4, 0xba, 0x4f, 0xc9, 0x7e, 0x68, 0xc1, 0x49, 0xd9,
-    0x92, 0xdb, 0x5f, 0x83, 0xb9, 0xb3, 0xc6, 0x7a, 0xeb, 0x44, 0x3d, 0x63, 0x6b, 0x01, 0x00, 0xf9,
-    0x58, 0x09, 0x72, 0x22, 0x70, 0x15, 0x30, 0x1d, 0x4e, 0xb2, 0x97, 0x53, 0xc8, 0x89, 0x85, 0x5f,
-    0xd0, 0x1b, 0x00, 0x88, 0xf0, 0xc3, 0x86, 0x2c, 0x21, 0x07, 0xe9, 0x2c, 0x24, 0x8c, 0x94, 0x90,
-    0x31, 0xb1, 0x7b, 0xff, 0xf6, 0xdf, 0xf9, 0xd8, 0x4b, 0xdc, 0x7d, 0xaa, 0x18, 0xe7, 0x37, 0xd3,
-    0x48, 0xa5, 0x04, 0x28, 0xc0, 0x5d, 0xf9, 0x0b, 0xb0, 0x96, 0x97, 0x3a, 0x7c, 0xf7, 0x21, 0x57,
-    0xac, 0x9c, 0x98, 0x34, 0xb9, 0xfa, 0xb0, 0x49, 0x79, 0x5e, 0x86, 0xad, 0x29, 0x25, 0x31, 0x03,
-    0xdf, 0x1b, 0xd9, 0xbb, 0xcb, 0x4c, 0x8a, 0x8f, 0xbd, 0x58, 0x31, 0xc7, 0x0c, 0x02, 0x0e, 0xa5,
-    0xd5, 0x8e, 0x23, 0xce, 0x0e, 0x24, 0xd7, 0xd3, 0x01, 0x25, 0xf0, 0xf8, 0x1c, 0xae, 0x86, 0x4f,
-    0xad, 0xb2, 0xf4, 0xf1, 0xe3, 0xcc, 0x8d, 0xec, 0xae, 0x01, 0xc7, 0xa8, 0x8c, 0x5e, 0xe0, 0xe4,
-    0x0c, 0x5a, 0x0e, 0x48, 0xa3, 0x56, 0x2d, 0xa1, 0x31, 0x62, 0x56, 0x1c, 0x48, 0x7e, 0x4d, 0x46,
-    0x26, 0x10, 0x65, 0x1d, 0x45, 0x38, 0x1f, 0xbe, 0x7e, 0x5e, 0x70, 0x26, 0x5f, 0x13, 0xa7, 0xf1,
-    0x8b, 0xc8, 0x0c, 0xc8, 0x98, 0xbc, 0xbd, 0x7e, 0x17, 0xce, 0xad, 0x3c, 0x27, 0xd9, 0x35, 0x8a,
-    0xfd, 0x47, 0x83, 0x34, 0x43, 0x00, 0x1b, 0x19, 0xbf, 0xf3, 0xed, 0xf7, 0xae, 0x48, 0x65, 0xcc,
-    0x34, 0x3a, 0x62, 0x5a, 0x30, 0x45, 0xb5, 0x84, 0x55, 0x56, 0x21, 0x7b, 0xb9, 0xad, 0xc6, 0xbc,
-    0x16, 0x8e, 0xb0, 0x63, 0x94, 0x5a, 0xb7, 0xbf, 0x4f, 0x00, 0x23, 0x07, 0x2f, 0x1f, 0x40, 0x37,
-    0xc4, 0xf0, 0x88, 0x7a, 0xe6, 0x37, 0x89, 0xfd, 0xbb, 0xfd, 0x48, 0x88, 0x70, 0x3b, 0x69, 0x5a,
-    0x46, 0xdb, 0xbb, 0x75, 0x06, 0xc7, 0xff, 0x39, 0xd2, 0x9b, 0x79, 0x3c, 0x0e, 0xa5, 0xdd, 0x64,
-    0x80, 0x12, 0x25, 0x09, 0x3f, 0x07, 0x0c, 0x0e, 0xc7, 0xaf, 0x2d, 0x9e, 0xc1, 0xc9, 0x34, 0x6a,
-    0xf9, 0xba, 0x89, 0x99, 0x91, 0x2f, 0xc6, 0xc2, 0x77, 0xe8, 0x92, 0xd5, 0x05, 0x01, 0x3e, 0x18,
-    0x2f, 0x8b, 0xd1, 0x4c, 0x46, 0x00, 0x13, 0xe1, 0x28, 0x99, 0x34, 0xd2, 0x9f, 0xf5, 0xb7, 0x27,
-    0xf1, 0x89, 0xe6, 0x91, 0x9e, 0x8a, 0x78, 0x42, 0x64, 0xde, 0xd8, 0x50, 0xc0, 0x70, 0xfb, 0x9b,
-    0xad, 0x95, 0x11, 0xc1, 0x3f, 0xa7, 0x1c, 0xfc, 0x28, 0xe8, 0xad, 0x25, 0x5b, 0x13, 0xb5, 0x0b,
-    0xb8, 0x48, 0xa4, 0x25, 0xec, 0xfc, 0xc9, 0x0d, 0x29, 0xc0, 0x47, 0x86, 0xcf, 0xf4, 0xe6, 0x74,
-    0x55, 0x09, 0x6d, 0x3e, 0xef, 0xc4, 0xdb, 0x49, 0xe7, 0x01, 0xf9, 0x81, 0x0e, 0x15, 0x0d, 0x3d,
-    0xd7, 0x28, 0x4c, 0x34, 0x39, 0x39, 0x98, 0xec, 0x0e, 0xd2, 0x02, 0x5b, 0x8f, 0x0c, 0x8e, 0xed,
-    0xa7, 0xdc, 0x36, 0x48, 0x71, 0x72, 0xef, 0x7a, 0xfc, 0x9f, 0x92, 0xfb, 0x00, 0x4a, 0xea, 0x2e,
-    0xf3, 0xcc, 0xe0, 0x87, 0x89, 0x2a, 0xc0, 0x2d, 0xe3, 0xf7, 0x2d, 0x8e, 0xc2, 0xd6, 0xe7, 0xfe,
-    0xec, 0x7a, 0x48, 0xc5, 0x6e, 0x0e, 0xbe, 0x07, 0xe8, 0x97, 0x0d, 0x24, 0xd1, 0xa0, 0xa2, 0x9e,
-    0x05, 0x19, 0x5e, 0x18, 0xfa, 0x5f, 0xd6, 0xd0, 0x7c, 0x21, 0x8f, 0xf9, 0xc9, 0xc3, 0x5c, 0x24,
-    0xf8, 0x5f, 0x6f, 0xe4, 0xb8, 0xfa, 0xab, 0xe7, 0xa2, 0x81, 0x33, 0x03, 0x97, 0x80, 0xdb, 0x7c,
-    0xd0, 0xcd, 0x05, 0x33, 0x84, 0xec, 0x27, 0x9f, 0x0a, 0xb5, 0x9d, 0xcf, 0x7c, 0x34, 0x03, 0xe0,
-    0x1c, 0x43, 0xc1, 0x65, 0x3f, 0x01, 0x9d, 0x1a, 0x7c, 0x9f, 0xf7, 0xc6, 0xed, 0x39, 0x52, 0x8e,
-    0xf0, 0x0f, 0xa3, 0x74, 0x2d, 0xce, 0x93, 0x22, 0x75, 0xf0, 0x6d, 0x06, 0xfd, 0x54, 0xec, 0x1a,
-    0x31, 0xc8, 0xe5, 0x21, 0xcb, 0xbf, 0xac, 0x88, 0xcb, 0x30, 0x3a, 0xf0, 0x3d, 0xe6, 0x65, 0x79,
-    0x54, 0x69, 0xa1, 0x80, 0x56, 0x52, 0xda, 0x7a, 0x76, 0xef, 0xfb, 0x27, 0xc3, 0x92, 0x53, 0xca,
-    0x19, 0x29, 0x73, 0x81, 0x1a, 0x96, 0xc8, 0x51, 0x10, 0x0b, 0x10, 0x93, 0x37, 0xb5, 0xb0, 0xe6,
-    0xe4, 0x80, 0xdb, 0xe0, 0x91, 0x6b, 0x8c, 0x1c, 0x7e, 0x8e, 0x51, 0x6f, 0xee, 0xd5, 0x87, 0x0a,
-    0x18, 0x7f, 0x50, 0x98, 0x3d, 0x9f, 0x92, 0x7b, 0xd5, 0x83, 0xeb, 0x30, 0x6d, 0x80, 0x40, 0x64,
-    0xa9, 0x57, 0x15, 0x80, 0x5a, 0x4e, 0x7e, 0x98, 0x96, 0x4a, 0x8e, 0xc3, 0xfe, 0x4d, 0x6d, 0x02,
-    0x1f, 0x5b, 0x6b, 0x99, 0x2f, 0x2d, 0x8a, 0x71, 0x60, 0x13, 0xc4, 0x38, 0x00, 0x82, 0x9a, 0xc3,
-    0x02, 0x0a, 0x36, 0x0c, 0xb0, 0x12, 0x67, 0x86, 0x63, 0x85, 0x34, 0x87, 0x7d, 0x67, 0x47, 0xc7,
-    0x73, 0xa3, 0x8f, 0x7b, 0x3e, 0xf8, 0x6d, 0x5b, 0x37, 0x4c, 0x29, 0xf6, 0x83, 0x2b, 0xd1, 0xf3,
-    0xaa, 0x4f, 0xec, 0x6a, 0xad, 0xba, 0x49, 0x1a, 0x4e, 0x61, 0xb1, 0xb0, 0x6f, 0x05, 0xe4, 0x44,
-    0x7c, 0x30, 0x36, 0x0a, 0x28, 0x4d, 0x60, 0xc0, 0xba, 0xb5, 0xcc, 0x5d, 0x5d, 0xbb, 0x60, 0x12,
-    0x5f, 0x00, 0x3f, 0xa7, 0xf0, 0xaf, 0x34, 0x62, 0xdf, 0xdb, 0xff, 0x34, 0xde, 0x19, 0x27, 0x11,
-    0x78, 0x01, 0xc2, 0x4d, 0xe8, 0xd1, 0x9e, 0xca, 0xff, 0x02, 0x2d, 0xbd, 0xf9, 0x10, 0x0b, 0xdd,
-    0x1a, 0xdc, 0xac, 0x77, 0x64, 0x88, 0xb5, 0xeb, 0xba, 0xb7, 0xc0, 0xb7, 0x2d, 0xcf, 0x0e, 0x4a,
-    0xa3, 0x56, 0x43, 0xd1, 0xb2, 0x92, 0x6e, 0x03, 0x2a, 0x1f, 0x9b, 0x4c, 0x5d, 0x65, 0x61, 0x80,
-    0x41, 0x17, 0x86, 0x01, 0xcb, 0xc0, 0xcc, 0x73, 0xda, 0x9c, 0x9e, 0x5e, 0x93, 0x90, 0x11, 0xcf,
-    0xc3, 0x0c, 0x95, 0x34, 0x83, 0x00, 0x02, 0xad, 0xcd, 0x1c, 0x23, 0xca, 0x90, 0xd1, 0x63, 0xd9,
-    0xee, 0x50, 0x05, 0x28, 0xf2, 0xe6, 0x77, 0x4c, 0x1a, 0x94, 0xac, 0xed, 0x48, 0x62, 0xf6, 0xbb,
-    0x76, 0xf8, 0x85, 0xe0, 0x4f, 0x3a, 0x2c, 0x19, 0xd8, 0xf1, 0x09, 0xc4, 0x36, 0x58, 0xdb, 0xaa,
-    0x30, 0x0d, 0xf1, 0x65, 0xe0, 0x43, 0xa3, 0x7e, 0x50, 0x17, 0x05, 0x99, 0x87, 0xc4, 0x03, 0x84,
-    0x83, 0x92, 0xd6, 0x67, 0x01, 0x20, 0x63, 0x78, 0x8a, 0xb4, 0xf7, 0xde, 0x75, 0x54, 0x85, 0x47,
-    0x2f, 0xc3, 0x37, 0xc1, 0xaa, 0xa8, 0xde, 0xc9, 0x88, 0x86, 0xe0, 0xe4, 0xaa, 0x9d, 0x35, 0xba,
-    0x49, 0xd1, 0x44, 0x1a, 0x5a, 0xc3, 0x62, 0xeb, 0xb6, 0x4f, 0x63, 0x7c, 0x3e, 0x8e, 0x4b, 0x2d,
-    0xb0, 0xd6, 0xd8, 0x2f, 0x3a, 0xbc, 0x80, 0x56, 0xbf, 0xc1, 0x14, 0x23, 0x4f, 0x12, 0x72, 0xfe,
-    0xed, 0x77, 0xd6, 0x52, 0x8b, 0x05, 0x3c, 0x7c, 0x0a, 0x1b, 0x04, 0x55, 0x21, 0x47, 0x1c, 0x16,
-    0x25, 0x60, 0x86, 0x01, 0xad, 0x09, 0x1b, 0xe6, 0x66, 0x88, 0x47, 0x66, 0x12, 0x2e, 0x5c, 0x5a,
-    0xd3, 0xe8, 0x3d, 0x76, 0xf4, 0x95, 0x4a, 0x3b, 0x4e, 0x8d, 0xb2, 0xc0, 0xca, 0x2a, 0xac, 0xbe,
-    0x10, 0xbb, 0x5f, 0x9e, 0xd7, 0x9f, 0x25, 0x80, 0x69, 0x1b, 0xff, 0xcf, 0xe5, 0x42, 0xde, 0xcc,
-    0xf0, 0xe3, 0x56, 0x85, 0x16, 0x53, 0x40, 0x60, 0x77, 0x55, 0xc8, 0x8b, 0xc0, 0x45, 0x80, 0xe7,
-    0x00, 0x0f, 0x0d, 0x63, 0x0e, 0x5f, 0xb3, 0xc0, 0x73, 0x78, 0xf7, 0xa3, 0x97, 0x87, 0xc5, 0x1f,
-    0x0e, 0x49, 0x93, 0x5e, 0x02, 0x50, 0x73, 0x70, 0xf2, 0xbf, 0xcd, 0x83, 0xa0, 0x81, 0x3f, 0x50,
-    0x25, 0xd5, 0xeb, 0x00, 0xb7, 0xb2, 0xa7, 0x35, 0x7f, 0x7c, 0x44, 0x73, 0xf0, 0x72, 0x44, 0x86,
-    0x69, 0x27, 0x8d, 0x20, 0x16, 0xf4, 0x15, 0x4d, 0x2e, 0x7e, 0xaf, 0xb2, 0x12, 0x81, 0xe6, 0x38,
-    0xe4, 0xb4, 0xb4, 0xd7, 0xa9, 0xfc, 0x5a, 0x1c, 0xe9, 0x3d, 0x7a, 0xc4, 0xf6, 0x91, 0x2c, 0x98,
-    0x00, 0x49, 0x3d, 0xce, 0x47, 0xc8, 0x8f, 0xbf, 0xc9, 0xed, 0xe7, 0x87, 0x1e, 0x75, 0x7d, 0xf6,
-    0xbb, 0x4e, 0x99, 0x52, 0xc0, 0xd2, 0x48, 0x25, 0xc4, 0xc5, 0x93, 0x97, 0xdb, 0x4b, 0x87, 0x33,
-    0xca, 0x64, 0x50, 0x0a, 0x30, 0xa6, 0x50, 0x94, 0xfe, 0x56, 0xa4, 0xbb, 0xc0, 0x24, 0x56, 0xb0,
-    0xd7, 0x55, 0x74, 0x0c, 0x90, 0x6d, 0xe7, 0x4a, 0x00, 0xa0, 0xee, 0x3c, 0x51, 0xdf, 0xf0, 0xec,
-    0x5b, 0xfc, 0xbf, 0xf1, 0xb9, 0xb4, 0x98, 0x00, 0xda, 0x55, 0x45, 0xa8, 0xf0, 0x02, 0xa8, 0xd6,
-    0xe0, 0xe4, 0x54, 0x4f, 0x5d, 0x75, 0xb1, 0xdc, 0xf2, 0x22, 0x80, 0xff, 0xeb, 0x13, 0xf7, 0xb1,
-    0x14, 0xed, 0x07, 0x24, 0xd1, 0xab, 0xe1, 0xc8, 0x53, 0x52, 0x60, 0x25, 0xc8, 0x89, 0xe0, 0x30,
-    0xd2, 0xa4, 0x61, 0xf6, 0x65, 0xc7, 0x3a, 0x19, 0x79, 0x2a, 0x35, 0x03, 0x22, 0x88, 0x65, 0x1f,
-    0x92, 0x65, 0x2d, 0xb1, 0x71, 0xc2, 0x04, 0x16, 0x96, 0x18, 0x2c, 0xa4, 0xd0, 0xc0, 0xdc, 0xac,
-    0x3d, 0xb7, 0x82, 0xb2, 0x3f, 0xc0, 0x1b, 0xff, 0xae, 0x5c, 0xb8, 0x63, 0xd2, 0xb3, 0xd0, 0x55,
-    0xfa, 0xb0, 0xf3, 0xd1, 0xc2, 0x55, 0xb5, 0x6a, 0x5d, 0x60, 0x3d, 0x94, 0xa4, 0x26, 0x6f, 0x5e,
-    0x8e, 0x01, 0xf8, 0xe1, 0xd4, 0x1a, 0x0c, 0xd7, 0x32, 0xcd, 0xf0, 0xdc, 0x70, 0x04, 0x61, 0x42,
-    0xd0, 0x81, 0xaf, 0x12, 0x04, 0x54, 0x76, 0x18, 0x3a, 0x57, 0x09, 0xbe, 0x5b, 0xa8, 0xf0, 0x72,
-    0xa8, 0xb6, 0x60, 0xe4, 0xc2, 0xb5, 0x01, 0x1b, 0x87, 0x91, 0x24, 0x5a, 0xbf, 0x07, 0x95, 0x1d,
-    0xac, 0x1c, 0xcf, 0x66, 0x8d, 0x38, 0x16, 0xf4, 0x0a, 0xe5, 0xd9, 0x58, 0x2f, 0x16, 0x6d, 0x04,
-    0x18, 0x9a, 0x06, 0x01, 0xdc, 0xff, 0x1c, 0xec, 0x23, 0x7c, 0x19, 0xfc, 0x6a, 0x73, 0x9e, 0xbb,
-    0x9c, 0x01, 0x40, 0x7c, 0xc1, 0x80, 0x5d, 0x46, 0x98, 0xe1, 0x92, 0x04, 0xe7, 0x32, 0xc4, 0x1d,
-    0xb8, 0x0e, 0x23, 0x4f, 0x41, 0xc5, 0x81, 0xba, 0xfb, 0x3f, 0xad, 0xb6, 0x94, 0x76, 0xdc, 0x9e,
-    0x0f, 0x9b, 0x33, 0xcf, 0xff, 0xed, 0xbf, 0xf3, 0xd1, 0xc1, 0x1f, 0x59, 0x54, 0xf0, 0xa7, 0x9d,
-    0x1d, 0x3c, 0x5f, 0x28, 0x33, 0x78, 0x9f, 0x85, 0x58, 0x8b, 0x6e, 0xad, 0x23, 0x17, 0x60, 0xc0,
-    0x10, 0x45, 0x16, 0xa0, 0xe4, 0x44, 0x7c, 0x2c, 0x94, 0x1d, 0x24, 0x5a, 0xbf, 0x00, 0x95, 0x17,
-    0x7c, 0x1c, 0x55, 0x40, 0x73, 0x63, 0x44, 0x0a, 0x74, 0xe4, 0xbc, 0xe0, 0xec, 0x7a, 0x11, 0xdd,
-    0x39, 0x2f, 0x24, 0xb8, 0x49, 0xd1, 0x4c, 0x1a, 0xba, 0x43, 0x22, 0x74, 0x0a, 0x32, 0x9a, 0xaf,
-    0x00, 0x0d, 0x66, 0xd3, 0x69, 0x65, 0x6a, 0x1f, 0x80, 0x41, 0xc5, 0xe1, 0xdc, 0xc8, 0x5f, 0xac,
-    0xa1, 0x80, 0x90, 0xee, 0x85, 0x78, 0x1f, 0x22, 0x7c, 0x1b, 0x69, 0xdb, 0x35, 0x87, 0x8c, 0xcb,
-    0x31, 0x69, 0x7c, 0xbf, 0x99, 0xa3, 0xe3, 0xf9, 0x1c, 0xce, 0x82, 0x3b, 0xd7, 0x2f, 0xa5, 0x83,
-    0xfa, 0xb9, 0x31, 0x62, 0xf2, 0x96, 0x85, 0xb2, 0x04, 0x94, 0x8c, 0x18, 0xff, 0xcd, 0x2a, 0x42,
-    0x0c, 0x02, 0xa9, 0x4f, 0xbd, 0x6a, 0xc0, 0x82, 0x9b, 0x4d, 0x25, 0x80, 0x87, 0x22, 0x5b, 0xe0,
-    0x6b, 0x77, 0xba, 0xa3, 0x40, 0xdd, 0x03, 0x9d, 0x19, 0x11, 0xbc, 0x0d, 0xc6, 0x89, 0x35, 0xd6,
-    0xa3, 0x88, 0xaf, 0x17, 0xad, 0x3d, 0xb0, 0x26, 0x42, 0x61, 0xb0, 0x72, 0x08, 0x9a, 0xdd, 0x42,
-    0x83, 0x92, 0x45, 0x37, 0x3a, 0x97, 0x93, 0x55, 0xb4, 0x38, 0xa3, 0x42, 0x2a, 0x62, 0xe2, 0x67,
-    0x4d, 0x1b, 0x98, 0xdb, 0x5d, 0xff, 0xd4, 0xfe, 0x02, 0x80, 0x81, 0x0c, 0xaa, 0x06, 0xa2, 0x96,
-    0xab, 0x20, 0xe4, 0x96, 0xeb, 0xe9, 0x1a, 0xae, 0xb2, 0xae, 0x0c, 0xbf, 0x42, 0xa4, 0xd6, 0x02,
-    0x16, 0x39, 0x4a, 0x9c, 0x73, 0x33, 0xb6, 0xcf, 0xf8, 0x48, 0x1e, 0xf9, 0xe7, 0xdf, 0xb3, 0xb4,
-    0xa1, 0x85, 0x23, 0x81, 0x62, 0xe0, 0x4b, 0xf2, 0x76, 0xb9, 0xc4, 0xf2, 0x61, 0x56, 0x7d, 0xba,
-    0x86, 0x01, 0x17, 0x86, 0x48, 0xe0, 0x14, 0x61, 0x07, 0xbf, 0x5c, 0x58, 0xd0, 0xe1, 0xfc, 0xb3,
-    0x56, 0x1b, 0xe7, 0x46, 0x9e, 0x15, 0x11, 0x19, 0x12, 0x39, 0x57, 0xf8, 0xdd, 0xe0, 0x84, 0xf8,
-    0x0c, 0x6e, 0x27, 0xd3, 0x9f, 0x22, 0xd5, 0x50, 0x71, 0x48, 0xa2, 0x8a, 0xe0, 0xe4, 0xa5, 0x85,
-    0x5a, 0xed, 0x00, 0x24, 0xb2, 0x7f, 0x9f, 0xa5, 0x41, 0xf5, 0xc1, 0xc9, 0x55, 0x47, 0xf1, 0xf5,
-    0x63, 0xb8, 0xc9, 0x8b, 0x17, 0x70, 0x63, 0xd5, 0xee, 0xef, 0xc9, 0x78, 0x47, 0xc1, 0x9d, 0x13,
-    0x00, 0xc4, 0xf2, 0x8d, 0xf6, 0x18, 0x7f, 0xe7, 0xcc, 0xab, 0x86, 0xcd, 0xa8, 0x1b, 0x13, 0xd1,
-    0x4c, 0x33, 0x96, 0x98, 0x81, 0xbc, 0x44, 0x1a, 0x0f, 0x91, 0x21, 0xab, 0x98, 0xaa, 0x92, 0x04,
-    0xaf, 0x32, 0x75, 0x1b, 0x26, 0xf0, 0xf5, 0x60, 0xe0, 0x16, 0x60, 0xfe, 0xb9, 0xf8, 0x78, 0x13,
-    0xb7, 0xd0, 0xb6, 0x9d, 0xc3, 0x00, 0x55, 0x46, 0x59, 0x5d, 0xf0, 0xe1, 0x38, 0x5a, 0xcb, 0x01,
-    0xec, 0xa2, 0x02, 0x31, 0xf5, 0x0c, 0xff, 0xae, 0xe2, 0xcd, 0xa3, 0x09, 0x70, 0x00, 0x7b, 0x78,
-    0x29, 0x86, 0x05, 0x86, 0x62, 0x18, 0x05, 0x84, 0x09, 0xaa, 0x58, 0x30, 0xff, 0x9d, 0x10, 0x2d,
-    0xb7, 0x79, 0xfb, 0xd7, 0x83, 0x92, 0x07, 0x6e, 0x6c, 0xde, 0x02, 0xf4, 0xb4, 0xa2, 0xb7, 0x01,
-    0xc8, 0x8b, 0x55, 0x14, 0x2e, 0xbd, 0x6f, 0xf4, 0x4b, 0x75, 0xc6, 0x00, 0x0e, 0x48, 0x1b, 0x56,
-    0x5e, 0x8d, 0xaf, 0x5d, 0x6f, 0xbd, 0x88, 0xc4, 0x0c, 0x2e, 0x04, 0xfa, 0x69, 0x06, 0x53, 0xd4,
-    0x50, 0x15, 0xb2, 0x40, 0x82, 0x51, 0x9a, 0xb2, 0x54, 0x73, 0x15, 0x55, 0xf2, 0x91, 0x3c, 0xd3,
-    0x92, 0x66, 0xf4, 0xf0, 0x92, 0xef, 0xf8, 0x97, 0x26, 0x7c, 0x1d, 0xfa, 0x93, 0xbf, 0x08, 0x0f,
-    0x9c, 0x30, 0x21, 0x62, 0xb5, 0x44, 0xab, 0xb4, 0x00, 0x8a, 0x85, 0x83, 0xfa, 0x1e, 0xbb, 0xc3,
-    0x54, 0x72, 0x80, 0x18, 0xca, 0xa7, 0xae, 0xe2, 0xf1, 0x48, 0x07, 0xfa, 0xd3, 0x43, 0x56, 0x11,
-    0x4a, 0x3b, 0x02, 0x31, 0x66, 0x0c, 0x7f, 0xe7, 0x4c, 0x9b, 0x7d, 0x94, 0xcc, 0x90, 0x46, 0x06,
-    0x36, 0x94, 0x70, 0x9a, 0x58, 0x59, 0x1e, 0xe0, 0x5e, 0x9b, 0x15, 0xe2, 0xae, 0x23, 0x1a, 0x52,
-    0xbe, 0xfd, 0xfb, 0x15, 0xd7, 0xce, 0xc5, 0xcf, 0x42, 0x78, 0x00, 0x36, 0xc8, 0x88, 0xea, 0x54,
-    0x1c, 0x94, 0x7f, 0xbc, 0x2e, 0x7b, 0x44, 0x5c, 0x09, 0x64, 0xdb, 0xf0, 0x63, 0xb8, 0xcb, 0x8b,
-    0x3f, 0x5b, 0x8f, 0x50, 0xdf, 0xbd, 0xc8, 0xec, 0x7c, 0xf1, 0xde, 0xd0, 0xc0, 0xf3, 0x89, 0x03,
-    0x62, 0x4e, 0xba, 0x88, 0x65, 0x3d, 0xc0, 0xb1, 0x9c, 0xc1, 0xf6, 0xd2, 0xa3, 0xa4, 0x8c, 0x32,
-    0x60, 0x9a, 0x18, 0x36, 0xcf, 0x9a, 0xe6, 0x45, 0x57, 0x66, 0xe6, 0x85, 0x01, 0x66, 0x51, 0x96,
-    0x61, 0xec, 0xb2, 0xbf, 0xcf, 0x28, 0x97, 0x8d, 0x5d, 0xd5, 0x6c, 0x65, 0xc1, 0x23, 0x1f, 0x22,
-    0x05, 0xd6, 0x2a, 0x18, 0x3f, 0x2d, 0xe0, 0x12, 0xc3, 0x78, 0xbf, 0xf3, 0x85, 0x79, 0x96, 0x8b,
-    0x87, 0x75, 0x48, 0x33, 0x95, 0x9b, 0x82, 0xb2, 0x58, 0x4a, 0xc1, 0x80, 0x47, 0x46, 0x46, 0x29,
-    0xc1, 0x80, 0x03, 0xa8, 0xc7, 0x3e, 0x00, 0xbe, 0xb2, 0xc3, 0x14, 0x06, 0x48, 0x2e, 0xfc, 0x3b,
-    0x95, 0x0c, 0x7f, 0xe7, 0xf0, 0x3b, 0xec, 0x0a, 0x9e, 0x00, 0x97, 0x8a, 0xa2, 0xe9, 0x55, 0x2d,
-    0x38, 0x3a, 0xfb, 0xe7, 0x7e, 0x77, 0x72, 0x6a, 0xc7, 0x1b, 0x4e, 0x18, 0xbc, 0x20, 0x4b, 0x6b,
-    0x5f, 0xbf, 0xf1, 0x0e, 0x11, 0x68, 0xf8, 0xc9, 0x00, 0xd6, 0x90, 0x9b, 0xbc, 0x00, 0xca, 0xbe,
-    0xf2, 0x7a, 0xe1, 0x4f, 0xc6, 0x8d, 0xb6, 0x6b, 0x7d, 0x77, 0x7b, 0x32, 0x69, 0x56, 0x50, 0xc4,
-    0x50, 0x35, 0xc0, 0xe0, 0xe8, 0xc6, 0xf5, 0x77, 0x73, 0xc0, 0x00, 0xb3, 0xe1, 0x0f, 0x71, 0x0b,
-    0x80, 0x35, 0x09, 0x7f, 0x44, 0x2d, 0xbb, 0x4f, 0x70, 0xae, 0x69, 0x99, 0x19, 0xed, 0xaa, 0xe3,
-    0x31, 0x3e, 0x37, 0xcb, 0x95, 0x9a, 0xc0, 0x05, 0xbe, 0x7d, 0xb4, 0xed, 0x72, 0xd7, 0x41, 0x82,
-    0xa4, 0x05, 0x19, 0x21, 0xc9, 0x38, 0x28, 0xb0, 0xd3, 0xfb, 0x01, 0x51, 0x86, 0x86, 0x7f, 0xd6,
-    0xa6, 0x86, 0x60, 0x13, 0x83, 0x98, 0xd1, 0xaf, 0xb9, 0x4f, 0x10, 0x73, 0xb6, 0x28, 0x2f, 0xf2,
-    0xda, 0x53, 0x6d, 0x19, 0xbd, 0x78, 0x77, 0xf7, 0x05, 0x36, 0x7f, 0x22, 0x78, 0x2d, 0x14, 0x62,
-    0xc5, 0xdd, 0x5f, 0xa8, 0x12, 0x5d, 0x7f, 0x80, 0x9d, 0xd9, 0x41, 0x67, 0xd4, 0x30, 0x1a, 0xbe,
-    0x59, 0xf8, 0xb1, 0xdc, 0xa4, 0xc5, 0xbf, 0xb3, 0xc7, 0xaf, 0x05, 0x5e, 0xc1, 0xc9, 0x26, 0x9f,
-    0x89, 0x3a, 0x1a, 0x41, 0x6c, 0xd1, 0xc2, 0x07, 0x69, 0xcf, 0xff, 0xaf, 0xa1, 0x2d, 0x5f, 0xaa,
-    0xeb, 0xc0, 0xd5, 0x3d, 0x34, 0x1b, 0x01, 0xdd, 0x08, 0xdc, 0x15, 0xdc, 0x6f, 0xda, 0x44, 0x35,
-    0x95, 0x05, 0xb0, 0x13, 0x58, 0x66, 0x7e, 0xa8, 0x4d, 0x55, 0xb0, 0xfe, 0xc8, 0x49, 0xcd, 0xe3,
-    0x5e, 0xfb, 0x9a, 0x1a, 0x9b, 0xd7, 0x3f, 0xe9, 0x4c, 0xe8, 0x1d, 0x0b, 0x67, 0xa5, 0x0d, 0x82,
-    0x17, 0x4c, 0x35, 0x5e, 0x86, 0xa1, 0x22, 0x20, 0xf1, 0x23, 0x9c, 0x55, 0x21, 0xb3, 0xf0, 0xc0,
-    0x67, 0x4c, 0xc3, 0xc3, 0xe0, 0xcf, 0x44, 0xeb, 0xcc, 0x8c, 0xb3, 0x0a, 0x77, 0x0c, 0x76, 0x22,
-    0x95, 0xe7, 0xc1, 0xa5, 0xb1, 0xdf, 0x82, 0xb8, 0x00, 0xb0, 0xae, 0x58, 0x0c, 0xff, 0x02, 0xf1,
-    0xe1, 0x0c, 0x2b, 0x62, 0x0f, 0xc7, 0x18, 0xcd, 0xbe, 0x77, 0xee, 0x15, 0x49, 0x53, 0xa1, 0x14,
-    0xc9, 0x6e, 0x98, 0xc1, 0xef, 0xd1, 0xbe, 0x0d, 0xd7, 0x5a, 0xfe, 0x61, 0xdf, 0x11, 0xc5, 0x34,
-    0x2a, 0xfe, 0x58, 0x39, 0x46, 0x8d, 0x59, 0x3c, 0x58, 0xcd, 0x0b, 0x01, 0x55, 0x00, 0x49, 0xbd,
-    0xfe, 0x44, 0x37, 0x8c, 0xae, 0x12, 0x7b, 0x25, 0x03, 0x70, 0x09, 0x5e, 0xc0, 0xb6, 0x8b, 0x72,
-    0x00, 0xb0, 0x8d, 0x83, 0xd5, 0x10, 0xbe, 0xda, 0x38, 0x42, 0xaf, 0x8b, 0xb1, 0xcc, 0x54, 0x16,
-    0x62, 0x86, 0xff, 0x9c, 0x03, 0xbf, 0x8d, 0x9b, 0x1e, 0x1b, 0x3d, 0x1c, 0x6b, 0x78, 0xd7, 0x08,
-    0xfc, 0xc7, 0x24, 0xdb, 0xc6, 0xff, 0xed, 0x11, 0xa7, 0x86, 0x14, 0x47, 0x0e, 0x5e, 0xf6, 0x96,
-    0xb1, 0x79, 0x03, 0x4a, 0x0b, 0x53, 0xfd, 0x93, 0x47, 0x1b, 0x6c, 0x25, 0x6a, 0x90, 0xf4, 0x21,
-    0x00, 0x7b, 0xd6, 0x96, 0xbe, 0x73, 0x3c, 0xe2, 0xd4, 0xe2, 0xf6, 0xd2, 0x23, 0xe9, 0x0d, 0xb2,
-    0x4a, 0x2f, 0xe6, 0x1f, 0x3d, 0x89, 0x42, 0x79, 0x62, 0xbf, 0x02, 0xf0, 0x86, 0x0c, 0xd7, 0x3b,
-    0x04, 0x95, 0x44, 0x18, 0x5c, 0xe4, 0x6d, 0x7c, 0x8d, 0xb4, 0x16, 0x55, 0xa3, 0xf3, 0xa9, 0xf7,
-    0x4b, 0x54, 0x20, 0x3d, 0x28, 0x39, 0x97, 0x24, 0x5c, 0x00, 0x99, 0xdc, 0x7f, 0xe7, 0x92, 0x82,
-    0x5b, 0x83, 0x3b, 0x81, 0x8e, 0xe3, 0x4e, 0x2d, 0x7c, 0x03, 0x1e, 0xb2, 0xcd, 0x7b, 0x39, 0x22,
-    0x8d, 0x58, 0xfe, 0xba, 0xc5, 0xa2, 0xe3, 0x6c, 0xc3, 0xf2, 0x72, 0x3a, 0x30, 0xbc, 0xba, 0x69,
-    0x06, 0xf9, 0x46, 0x21, 0xa1, 0x80, 0x83, 0x62, 0xaa, 0xa0, 0xd8, 0x8b, 0xe7, 0x27, 0x28, 0xd5,
-    0xd7, 0xec, 0xae, 0x15, 0xfd, 0x92, 0x63, 0x64, 0x1c, 0x04, 0xab, 0x23, 0x1b, 0x77, 0xf1, 0x5e,
-    0x34, 0x93, 0x01, 0xc9, 0x06, 0xdb, 0xcf, 0x98, 0xc4, 0x39, 0x31, 0xbf, 0x70, 0xde, 0x69, 0x47,
-    0x6f, 0x75, 0xe0, 0x81, 0x0a, 0xea, 0x89, 0x26, 0x4d, 0xc8, 0x3a, 0xc0, 0xf0, 0xbc, 0x06, 0xd7,
-    0xfb, 0xbc, 0xc7, 0x97, 0x7e, 0x4b, 0xfb, 0xcd, 0x8b, 0xfe, 0xee, 0xdb, 0xd5, 0x54, 0xbe, 0x5d,
-    0x05, 0xf3, 0x8f, 0x7e, 0x8e, 0xe9, 0x78, 0x1f, 0xcf, 0xfa, 0xae, 0x21, 0x91, 0x15, 0x80, 0x17,
-    0x78, 0x55, 0xc4, 0x21, 0x44, 0xdd, 0xbf, 0xaf, 0x6f, 0xd2, 0x11, 0xcb, 0x9a, 0x8a, 0x34, 0xa5,
-    0xf0, 0x2d, 0x51, 0x42, 0x31, 0xce, 0xf2, 0x8e, 0xa4, 0x12, 0x16, 0x71, 0xb6, 0x8a, 0x49, 0x54,
-    0x6b, 0x0e, 0x79, 0xa6, 0x8f, 0xf2, 0xe3, 0x00, 0x3b, 0x4b, 0xaf, 0xcf, 0x02, 0x41, 0xeb, 0xf0,
-    0x75, 0xd1, 0xb7, 0xb8, 0x92, 0x86, 0xfd, 0x25, 0x08, 0x7c, 0xb3, 0xdf, 0x8b, 0x5e, 0x66, 0xbd,
-    0x1c, 0x91, 0x46, 0xac, 0x5d, 0xbd, 0xe3, 0xaa, 0x15, 0xf1, 0xb7, 0x04, 0xff, 0x31, 0x65, 0xbb,
-    0x81, 0x4d, 0x9b, 0x9d, 0x0d, 0x02, 0xfc, 0xc2, 0x91, 0x70, 0x0b, 0x70, 0x1d, 0xa4, 0x0a, 0xa2,
-    0xba, 0x60, 0x58, 0x81, 0x5d, 0x13, 0xd1, 0xbe, 0xe7, 0x81, 0x9a, 0x4c, 0xed, 0x81, 0x72, 0x22,
-    0xaa, 0xa9, 0x66, 0xc6, 0x12, 0x51, 0x58, 0x72, 0x5a, 0x13, 0xde, 0xcc, 0x18, 0xab, 0x75, 0x67,
-    0xbe, 0x28, 0x7c, 0x9e, 0x88, 0x2d, 0x42, 0xc8, 0xe2, 0xe0, 0x61, 0x62, 0xe0, 0x84, 0x69, 0xef,
-    0xdf, 0x35, 0x5a, 0xf9, 0xfd, 0x19, 0x17, 0x4d, 0xf2, 0x37, 0x29, 0xfc, 0xe0, 0x39, 0x17, 0x6f,
-    0xab, 0xff, 0x8d, 0x8a, 0x2d, 0xa2, 0xd6, 0x55, 0x37, 0x8c, 0xa1, 0x43, 0xb9, 0x9f, 0x90, 0x8d,
-    0x7c, 0x1c, 0xb7, 0xa5, 0x5e, 0x10, 0xdf, 0xab, 0x75, 0x49, 0xc1, 0xc9, 0xd4, 0xcf, 0xaf, 0x63,
-    0x24, 0x99, 0xab, 0x07, 0xef, 0x51, 0x9b, 0xdb, 0xfa, 0xc2, 0xe3, 0x5f, 0xa6, 0x19, 0x21, 0x83,
-    0x04, 0xed, 0x00, 0x92, 0x47, 0xa6, 0xd5, 0xc0, 0x7f, 0x9c, 0x30, 0x13, 0x78, 0x16, 0x44, 0x40,
-    0xaa, 0xae, 0xef, 0xf0, 0x4b, 0x13, 0x46, 0x1f, 0x05, 0x64, 0x11, 0xd3, 0x13, 0xdb, 0x66, 0x86,
-    0x30, 0x31, 0x77, 0x4d, 0xf0, 0x32, 0x88, 0xa4, 0x8d, 0x9c, 0xf7, 0xef, 0x57, 0x80, 0xc3, 0x84,
-    0x27, 0x34, 0x9c, 0x1b, 0x6d, 0x9f, 0x98, 0x11, 0xf8, 0x63, 0xc9, 0xfd, 0x2c, 0x29, 0xf1, 0xa8,
-    0x4e, 0x19, 0x5c, 0x41, 0x00, 0xa5, 0x17, 0xcc, 0x0c, 0x91, 0x5a, 0xbe, 0x93, 0x06, 0x84, 0xdb,
-    0x0c, 0xa3, 0x35, 0x4f, 0xdc, 0xc5, 0x35, 0xa7, 0x61, 0x45, 0xf7, 0x84, 0xd3, 0xe1, 0xae, 0x6c,
-    0x02, 0x55, 0x94, 0x30, 0x79, 0xc3, 0xaa, 0x87, 0xab, 0x6e, 0xf8, 0x70, 0x80, 0x7b, 0xea, 0xa3,
-    0xd7, 0xb5, 0x92, 0x2c, 0xd5, 0x83, 0xac, 0x68, 0xb6, 0x03, 0xfe, 0xb2, 0x5c, 0xd7, 0xa1, 0x85,
-    0x04, 0x04, 0x54, 0x42, 0x1a, 0xc7, 0x80, 0x76, 0xaa, 0x7b, 0x30, 0x08, 0xcb, 0x0c, 0x87, 0x08,
-    0x2e, 0x19, 0x10, 0x60, 0x05, 0x53, 0xd9, 0xa9, 0xe0, 0xc8, 0xb4, 0x49, 0x51, 0xc5, 0xd0, 0x8e,
-    0x33, 0x8c, 0xc0, 0x9c, 0x70, 0x02, 0x9b, 0x58, 0xdb, 0xf0, 0x43, 0x99, 0x75, 0x39, 0xb6, 0x78,
-    0x99, 0xd1, 0xe3, 0xe9, 0x8f, 0x80, 0x92, 0x12, 0x9b, 0xa0, 0xc1, 0x60, 0xdf, 0x01, 0x64, 0x7c,
-    0x1f, 0x07, 0xc4, 0x3e, 0xe3, 0xbb, 0x00, 0x58, 0x0f, 0x00, 0x49, 0x3b, 0x41, 0x44, 0xa4, 0x54,
-    0x88, 0xd5, 0xd7, 0xad, 0xcd, 0x0c, 0x2a, 0x26, 0x50, 0xaa, 0x8b, 0x0b, 0xf2, 0xbb, 0x16, 0x74,
-    0xcb, 0x6a, 0x37, 0xe0, 0x72, 0x2d, 0x23, 0x11, 0xb2, 0xae, 0x28, 0xa4, 0x30, 0xc0, 0x18, 0x0b,
-    0xda, 0x55, 0x63, 0x69, 0xc5, 0x95, 0xce, 0xa2, 0x7d, 0xc8, 0xb5, 0x2a, 0x75, 0xad, 0x00, 0x49,
-    0x89, 0x6e, 0x0e, 0x4a, 0x38, 0xe6, 0x24, 0x88, 0xab, 0x07, 0xef, 0x51, 0xb5, 0x5f, 0x80, 0xec,
-    0x87, 0xdb, 0x87, 0x0a, 0xb6, 0xcf, 0xc0, 0x20, 0x1c, 0x10, 0x87, 0x01, 0x18, 0x05, 0xd3, 0x8c,
-    0x02, 0x6c, 0x43, 0x0c, 0x18, 0x32, 0x3f, 0xb7, 0x45, 0xb6, 0x24, 0xb8, 0xe1, 0x61, 0x1b, 0x73,
-    0xd7, 0x3c, 0x67, 0x95, 0x57, 0x69, 0x3c, 0x39, 0x5e, 0x3a, 0xc6, 0x44, 0x28, 0xc4, 0x95, 0x0e,
-    0x5d, 0x33, 0x85, 0x43, 0x8d, 0xd8, 0xc6, 0xf1, 0x2d, 0x51, 0x31, 0x3c, 0x7b, 0xdb, 0xb6, 0xb5,
-    0x94, 0xe6, 0xbd, 0x75, 0xd6, 0x05, 0x2a, 0xf4, 0xfa, 0x6b, 0xbc, 0x0a, 0xa7, 0xda, 0x54, 0xe4,
-    0x6b, 0xc9, 0x72, 0x71, 0x8b, 0x54, 0xa3, 0x93, 0x79, 0x0a, 0x7d, 0xd5, 0x81, 0x9f, 0xc2, 0x82,
-    0x77, 0x1f, 0xd8, 0xe5, 0x5f, 0xd2, 0xee, 0xbe, 0x84, 0x19, 0x10, 0x04, 0xfc, 0x6c, 0x71, 0xa6,
-    0xc2, 0x2d, 0xd3, 0xed, 0x1c, 0xbd, 0x9e, 0xc6, 0x97, 0x82, 0xb8, 0x10, 0xb7, 0xae, 0x9a, 0xc0,
-    0x65, 0x3e, 0x6f, 0x6d, 0xce, 0x81, 0xc6, 0xbc, 0x96, 0xfc, 0x67, 0xd2, 0xfc, 0x0d, 0x95, 0x9e,
-    0x05, 0xbd, 0xfb, 0xe6, 0x74, 0x3a, 0x56, 0x36, 0xec, 0x0f, 0x69, 0xca, 0xcf, 0xcd, 0xa9, 0xef,
-    0xb3, 0x86, 0x63, 0xb3, 0xed, 0xde, 0x0b, 0x66, 0x5f, 0x3f, 0xaf, 0x80, 0x7f, 0xce, 0x92, 0x4d,
-    0xaf, 0x83, 0x11, 0xf6, 0x83, 0xac, 0x4f, 0xc1, 0x49, 0x2b, 0x16, 0x40, 0x8f, 0x0b, 0xcb, 0xec,
-    0x6e, 0xfc, 0xe4, 0x8c, 0xcf, 0xe0, 0x94, 0xd3, 0xac, 0x1c, 0xcd, 0x46, 0x58, 0x0e, 0xa6, 0x44,
-    0x47, 0x00, 0xb6, 0x94, 0x9f, 0xa7, 0x25, 0x9a, 0xb8, 0x6b, 0xd6, 0x93, 0x5b, 0xb5, 0xb7, 0x59,
-    0xf0, 0x2c, 0x2c, 0x90, 0x61, 0x4a, 0xbd, 0x52, 0xea, 0x19, 0x97, 0x0a, 0x91, 0xb1, 0x75, 0x05,
-    0xd4, 0xdd, 0x3d, 0x64, 0x5b, 0x50, 0x70, 0x7c, 0xb7, 0x45, 0x01, 0xdf, 0x37, 0x83, 0x1a, 0xdf,
-    0xc0, 0x76, 0x81, 0x2b, 0xc1, 0x63, 0x62, 0x5b, 0x35, 0xb1, 0x89, 0xa7, 0xf2, 0x17, 0xc3, 0xd7,
-    0x16, 0xf8, 0x7c, 0x61, 0x96, 0x4b, 0x86, 0x93, 0x7c, 0x0d, 0x1c, 0x6c, 0x3e, 0x87, 0x27, 0xb5,
-    0x09, 0xb0, 0xf7, 0x2c, 0x88, 0xef, 0x50, 0xc9, 0x4a, 0x36, 0xc6, 0x47, 0xfa, 0xcb, 0xa6, 0x3f,
-    0x70, 0xc6, 0xbf, 0xe8, 0xed, 0xae, 0x38, 0x0d, 0xa4, 0xe0, 0x4a, 0xcb, 0xe1, 0x6a, 0xa3, 0x0d,
-    0x78, 0x5a, 0x93, 0x43, 0x6a, 0x96, 0x52, 0xad, 0x23, 0x80, 0x5d, 0x10, 0x5d, 0x34, 0xa5, 0x6c,
-    0xb5, 0xca, 0xcb, 0x7c, 0x23, 0xbf, 0x04, 0xa9, 0xde, 0xe0, 0x72, 0xbc, 0x32, 0x5b, 0xc0, 0x09,
-    0x4b, 0x46, 0x42, 0x0e, 0x94, 0x93, 0x8c, 0x9d, 0x9e, 0xa3, 0xdf, 0xa7, 0xf8, 0x7a, 0xc5, 0x79,
-    0x39, 0x53, 0xe9, 0x42, 0xe9, 0x56, 0xff, 0xcf, 0x48, 0x5a, 0x8a, 0xc0, 0x31, 0x79, 0x95, 0x36,
-    0xf4, 0x3e, 0x4e, 0xdb, 0x6b, 0x3f, 0x42, 0x22, 0xd3, 0x73, 0xc0, 0xdd, 0x31, 0x4b, 0xad, 0x87,
-    0x6f, 0xf0, 0xdf, 0x3c, 0xff, 0xb5, 0xb0, 0xdc, 0x3d, 0xe5, 0x36, 0x05, 0x07, 0xf7, 0xf2, 0x7a,
-    0x08, 0x8b, 0xc6, 0xfd, 0x89, 0x50, 0xa6, 0xbd, 0xfc, 0x27, 0x5b, 0x2c, 0x0b, 0xec, 0x25, 0x35,
-    0x49, 0x83, 0x1a, 0xc0, 0x11, 0x9a, 0x34, 0x4e, 0x12, 0x3c, 0x88, 0x87, 0xf3, 0xde, 0x60, 0x1e,
-    0xbe, 0x38, 0xf5, 0x8c, 0x24, 0x9a, 0x37, 0x07, 0xc7, 0xf7, 0x94, 0xa9, 0x17, 0x3d, 0xac, 0x77,
-    0xbc, 0x88, 0x78, 0x16, 0x3d, 0x43, 0x9a, 0xf6, 0x72, 0x51, 0x1a, 0xb0, 0x95, 0xfb, 0xae, 0x03,
-    0xc0, 0x26, 0x91, 0x60, 0x5d, 0x40, 0xd3, 0x61, 0xaa, 0x21, 0x01, 0x18, 0xd5, 0x86, 0xb5, 0x78,
-    0x01, 0x4c, 0xf8, 0x4f, 0x52, 0xbd, 0xe8, 0x7d, 0x99, 0x03, 0x7d, 0x8d, 0xce, 0x1a, 0x7d, 0xce,
-    0xc2, 0xb2, 0xfb, 0x02, 0xfc, 0x67, 0xbf, 0x1b, 0xaa, 0x8c, 0x35, 0x26, 0x15, 0x2d, 0x84, 0x96,
-    0xc4, 0xac, 0xf6, 0x5b, 0xc0, 0x03, 0x77, 0x6f, 0xc2, 0xe4, 0xbd, 0xe1, 0x25, 0xa6, 0x84, 0xaf,
-    0x20, 0xab, 0x54, 0xf1, 0x71, 0x05, 0x83, 0x91, 0x98, 0x81, 0x7b, 0x77, 0xaa, 0xbd, 0x2e, 0xae,
-    0x3f, 0xd6, 0x27, 0x2e, 0xcd, 0x3d, 0x61, 0x19, 0xb1, 0x24, 0xc0, 0x2f, 0xbd, 0x2b, 0x36, 0x05,
-    0xd7, 0x06, 0x3d, 0xcf, 0x27, 0x8e, 0x50, 0x82, 0x16, 0xa6, 0xc0, 0x09, 0xa3, 0x9b, 0x8f, 0x4b,
-    0x4b, 0x6c, 0x56, 0x0e, 0x97, 0xb3, 0xf5, 0x3a, 0xe0, 0x38, 0xcf, 0x72, 0x93, 0x28, 0xa3, 0x85,
-    0x6b, 0x5f, 0xfe, 0x61, 0x10, 0x77, 0xb0, 0x15, 0x92, 0x4c, 0x00, 0x86, 0x92, 0xc3, 0x09, 0x68,
-    0xb9, 0xc8, 0xc5, 0x78, 0x01, 0xcb, 0x9e, 0x2f, 0xf4, 0xf3, 0xd8, 0x41, 0xcd, 0x88, 0xd6, 0x8b,
-    0xae, 0x5b, 0x1e, 0x54, 0x7e, 0xf1, 0xec, 0xa0, 0xef, 0x75, 0xd6, 0xd9, 0xce, 0x1f, 0x6c, 0x8e,
-    0xe6, 0x5a, 0x15, 0x46, 0x1e, 0x88, 0x2e, 0x2b, 0xbb, 0xb9, 0xb4, 0xbf, 0x4f, 0x63, 0xf9, 0x5e,
-    0x8e, 0xcd, 0xa3, 0xfd, 0x11, 0x53, 0x2c, 0xf3, 0x54, 0x57, 0x3a, 0xf7, 0x88, 0x18, 0x57, 0x11,
-    0x9d, 0x89, 0xb5, 0xff, 0xca, 0xb1, 0x66, 0x22, 0xbe, 0x24, 0x78, 0x13, 0x69, 0x47, 0x16, 0xa3,
-    0xc0, 0x09, 0x6e, 0x9f, 0x0f, 0xed, 0x5f, 0x2f, 0xab, 0x9c, 0x95, 0xaa, 0x6f, 0xea, 0x00, 0xcf,
-    0x55, 0xde, 0xbd, 0x8f, 0xc9, 0x18, 0xc7, 0xc1, 0x41, 0x9b, 0xb0, 0x72, 0x35, 0x1a, 0x0f, 0xb9,
-    0x19, 0x11, 0x97, 0x85, 0x07, 0xa5, 0xe1, 0xc0, 0xb2, 0xb3, 0x0c, 0x74, 0x2f, 0x33, 0xb0, 0xc0,
-    0xe9, 0xe2, 0x48, 0xe0, 0x42, 0xb0, 0x23, 0xe5, 0x58, 0x93, 0x60, 0x17, 0x30, 0xa8, 0x13, 0x2f,
-    0x3c, 0x48, 0x18, 0x3b, 0xb1, 0x1b, 0x16, 0xc1, 0x57, 0xd6, 0xed, 0xd5, 0x75, 0x78, 0x01, 0xc1,
-    0x23, 0x2f, 0x8e, 0xf3, 0x91, 0xcd, 0x72, 0x5e, 0x12, 0x53, 0x8d, 0xfa, 0xc0, 0x7d, 0xc5, 0x93,
-    0x3f, 0xcf, 0xff, 0xf1, 0xf5, 0xc3, 0x23, 0xeb, 0x2e, 0x4b, 0x92, 0x9a, 0xe5, 0xb8, 0x2f, 0x6c,
-    0xc3, 0x47, 0x07, 0xec, 0x83, 0x0d, 0xff, 0x9d, 0xa9, 0x4d, 0x09, 0x9d, 0x75, 0xb4, 0x24, 0x16,
-    0xaf, 0x00, 0xe7, 0xc6, 0x1a, 0x8f, 0xaf, 0x64, 0x47, 0xa9, 0x50, 0xbf, 0x08, 0xfb, 0x2c, 0xf8,
-    0x77, 0xff, 0x14, 0x6d, 0x58, 0xe0, 0x74, 0xb3, 0x02, 0x50, 0xa6, 0x0c, 0xaa, 0xb1, 0x0b, 0x2b,
-    0x1d, 0x15, 0xa0, 0x4d, 0xfc, 0x88, 0xb7, 0x0f, 0x57, 0xf4, 0x92, 0xcc, 0x50, 0x3e, 0x35, 0x09,
-    0x0a, 0x18, 0xab, 0xcc, 0xf8, 0x72, 0xfd, 0xf7, 0x9f, 0x1b, 0xdd, 0x5d, 0x2b, 0xcb, 0xcd, 0xbd,
-    0xb7, 0x1d, 0x96, 0xdd, 0xb0, 0xd3, 0xdb, 0x64, 0xbe, 0x33, 0xa8, 0x92, 0x01, 0x0f, 0x2c, 0xe5,
-    0x85, 0xd2, 0x79, 0x9d, 0x23, 0xfe, 0xf8, 0xda, 0x1d, 0x34, 0xd6, 0x95, 0x7f, 0x93, 0x4d, 0x7e,
-    0xec, 0x4f, 0x03, 0xfe, 0xc1, 0x9d, 0xc0, 0x54, 0xe0, 0xca, 0xea, 0x95, 0x4d, 0x34, 0x82, 0x8c,
-    0x94, 0xd7, 0x87, 0xd2, 0x24, 0x5a, 0x1f, 0x00, 0x9e, 0xd8, 0x85, 0xe3, 0xf3, 0xe0, 0x1c, 0xfb,
-    0x9b, 0xf0, 0x63, 0xb8, 0x64, 0x45, 0x70, 0x32, 0x3d, 0x69, 0x9a, 0xf6, 0x72, 0x59, 0x1a, 0xb0,
-    0x3a, 0xb5, 0xfb, 0x60, 0x38, 0x05, 0x0e, 0x52, 0x17, 0x3f, 0xfc, 0x09, 0x14, 0xee, 0x18, 0x04,
-    0xe3, 0x76, 0x13, 0xad, 0x09, 0x5c, 0x2c, 0x2c, 0x5c, 0xed, 0x5d, 0xd6, 0xae, 0xe0, 0xfb, 0x2d,
-    0x18, 0x47, 0x11, 0xb2, 0x15, 0x74, 0x67, 0x94, 0x05, 0x83, 0x9f, 0xe3, 0xd5, 0x53, 0x55, 0x9d,
-    0x72, 0xbe, 0xf0, 0x2f, 0x69, 0x48, 0x6f, 0x63, 0xf9, 0x5e, 0xf2, 0xc0, 0xb0, 0xee, 0x6f, 0x66,
-    0x51, 0x53, 0xbb, 0x4d, 0x28, 0xb6, 0x11, 0x36, 0x16, 0xc8, 0xea, 0xfd, 0x5e, 0xba, 0xda, 0x1e,
-    0x76, 0x99, 0xd0, 0x65, 0x54, 0xea, 0xc0, 0x72, 0x6e, 0x77, 0xe7, 0xee, 0xdb, 0xd7, 0xfb, 0x9b,
-    0x4d, 0xda, 0x37, 0x30, 0x6e, 0xf8, 0xc5, 0xef, 0x60, 0x13, 0x0e, 0x18, 0x58, 0x9c, 0x79, 0xda,
-    0xd0, 0xc2, 0xa3, 0x2c, 0x66, 0xb2, 0x8b, 0xa3, 0x73, 0x3b, 0x35, 0x5a, 0xb1, 0x39, 0x09, 0x26,
-    0x0d, 0xc0, 0x24, 0x89, 0xaf, 0x00, 0x53, 0xc4, 0xaa, 0x5c, 0x5e, 0xdd, 0x03, 0xb4, 0xf5, 0xfa,
-    0x91, 0x66, 0xac, 0x1c, 0xad, 0x46, 0x38, 0x0e, 0x80, 0xa8, 0xba, 0x74, 0xf5, 0xf5, 0x60, 0xbf,
-    0xfe, 0x7f, 0x0d, 0xb7, 0xad, 0x38, 0x3d, 0xb4, 0x23, 0xa3, 0xbc, 0x63, 0xc2, 0x08, 0xde, 0x9a,
-    0x00, 0x88, 0xbf, 0x83, 0xe6, 0xec, 0xfc, 0x57, 0xf0, 0xff, 0xd5, 0xb9, 0x07, 0x3d, 0x42, 0x4d,
-    0x82, 0xcb, 0xf9, 0x3d, 0xc8, 0x70, 0xea, 0xb5, 0x50, 0xb3, 0x11, 0x7c, 0x82, 0x3f, 0xfe, 0x57,
-    0xf0, 0x0e, 0xf3, 0x8a, 0xbd, 0x9f, 0x93, 0xb4, 0x96, 0xe5, 0xf1, 0x97, 0x96, 0x0c, 0xd1, 0x79,
-    0xdf, 0xf9, 0x6f, 0xc0, 0xd5, 0x54, 0x81, 0xbb, 0x97, 0x5f, 0xfb, 0xb6, 0x2e, 0x15, 0xb1, 0x7c,
-    0x5b, 0x8b, 0x4b, 0xa3, 0x9a, 0x30, 0xf5, 0x82, 0x1a, 0x7d, 0x1c, 0x16, 0x6c, 0x08, 0xf2, 0x5c,
-    0x17, 0x52, 0xbe, 0xff, 0x52, 0x3e, 0xf7, 0xbb, 0x25, 0x80, 0x5c, 0x46, 0x89, 0xe5, 0xc7, 0x62,
-    0x74, 0xea, 0xdc, 0xa0, 0xda, 0xa0, 0x3f, 0x08, 0xdf, 0xcf, 0xaf, 0x9b, 0xdf, 0x78, 0x91, 0x6b,
-    0x7c, 0x00, 0x77, 0x74, 0xb0, 0x3e, 0x0c, 0xd4, 0x6c, 0xaf, 0xdd, 0xed, 0xc7, 0x71, 0xa7, 0x16,
-    0x3f, 0x33, 0x8f, 0x5a, 0xc7, 0xbd, 0x47, 0x76, 0x07, 0x24, 0x11, 0xd7, 0xa6, 0x9a, 0x56, 0x69,
-    0x3b, 0x12, 0xb0, 0xe0, 0xd0, 0x12, 0x23, 0xc4, 0x8c, 0x32, 0xc4, 0x3a, 0x00, 0xba, 0x6e, 0xc3,
-    0x89, 0x7c, 0x96, 0x48, 0x0a, 0x08, 0x24, 0x30, 0x8d, 0x2c, 0x0b, 0x56, 0xe6, 0xd5, 0x55, 0x39,
-    0x5e, 0xf5, 0xed, 0x3c, 0xc0, 0x5b, 0x59, 0x0b, 0xe9, 0xbe, 0x2e, 0xb9, 0xb5, 0x7e, 0xff, 0xbd,
-    0x6f, 0x80, 0x1e, 0xc4, 0xe4, 0x1b, 0xaf, 0xfc, 0x55, 0x1f, 0x19, 0x7d, 0x4c, 0x4f, 0xcc, 0xbc,
-    0xee, 0xb2, 0x67, 0x02, 0xe9, 0x2f, 0x1b, 0xe4, 0xfa, 0x1b, 0xc5, 0xfc, 0x9a, 0x2e, 0x41, 0x82,
-    0xc6, 0xfe, 0x01, 0x8f, 0x4b, 0x1b, 0x79, 0x1b, 0x2b, 0x85, 0xe9, 0x5f, 0x92, 0xe1, 0xba, 0x97,
-    0xae, 0x9b, 0x68, 0x7c, 0xd2, 0x4c, 0x8d, 0xdc, 0xb2, 0xc0, 0x46, 0xd2, 0xe1, 0x5e, 0x6b, 0xf3,
-    0x79, 0x7a, 0xf3, 0xcb, 0x3c, 0x5d, 0x23, 0xb0, 0x93, 0x47, 0x39, 0xfd, 0x4e, 0x1a, 0xe5, 0x95,
-    0xc1, 0x47, 0x5f, 0xf9, 0xed, 0x0b, 0xdc, 0xcc, 0x75, 0x2a, 0x6a, 0x06, 0x00, 0x91, 0x19, 0x8c,
-    0x56, 0xfd, 0x00, 0x93, 0x18, 0xfc, 0xd2, 0x30, 0xbd, 0xa2, 0xa2, 0xa6, 0xd8, 0x96, 0x78, 0xf1,
-    0x8e, 0x7c, 0x46, 0xc8, 0x79, 0xf8, 0xda, 0xcb, 0x3b, 0x02, 0x6d, 0x5e, 0x01, 0x32, 0xf4, 0x86,
-    0x7f, 0xe6, 0x7c, 0xfd, 0xcf, 0x08, 0x0f, 0x09, 0x6f, 0x03, 0xfa, 0x11, 0x96, 0x7b, 0x73, 0x75,
-    0x90, 0xdc, 0xfe, 0x5e, 0x62, 0x61, 0x67, 0x1b, 0xc8, 0x8c, 0xb9, 0x32, 0x98, 0x4d, 0x9a, 0xd4,
-    0xa0, 0x39, 0x5b, 0xd6, 0x0b, 0x56, 0x56, 0xcf, 0x55, 0x43, 0x2f, 0x6f, 0xb8, 0xf6, 0x83, 0xff,
-    0xe7, 0x62, 0x7b, 0x73, 0xf9, 0x4e, 0xea, 0xec, 0x3e, 0x1e, 0xa6, 0xbf, 0xbf, 0x87, 0xdb, 0x1a,
-    0xdb, 0xca, 0xb4, 0xc7, 0xa5, 0x30, 0x2b, 0xcd, 0x79, 0xef, 0x9b, 0x58, 0xdc, 0x30, 0xf8, 0x70,
-    0x8e, 0x2f, 0x42, 0xde, 0x83, 0x44, 0x25, 0xf7, 0xdd, 0x55, 0x3e, 0x12, 0x55, 0x4e, 0x15, 0x5f,
-    0x37, 0x91, 0xe9, 0xe3, 0x1f, 0x20, 0xda, 0x51, 0xcb, 0xff, 0xfd, 0x6d, 0x72, 0xfc, 0x3f, 0x5b,
-    0x0f, 0xc7, 0x70, 0xcd, 0x84, 0xd9, 0x8e, 0x36, 0x92, 0x1d, 0x4a, 0x61, 0x70, 0x9b, 0x9b, 0x68,
-    0x9b, 0x27, 0xc6, 0x99, 0x10, 0xa3, 0xce, 0x53, 0x21, 0xf4, 0x31, 0x3c, 0x87, 0x84, 0x69, 0x81,
-    0x9d, 0xa5, 0xef, 0x0f, 0xf1, 0xca, 0xae, 0xf0, 0x63, 0x1c, 0x84, 0x5b, 0x8f, 0x77, 0xe5, 0x6b,
-    0x11, 0xec, 0x26, 0x59, 0x9f, 0x16, 0x89, 0xe1, 0xc2, 0xad, 0x56, 0xb8, 0x2e, 0x31, 0x68, 0x5d,
-    0x2a, 0x83, 0xf6, 0xef, 0xfe, 0x61, 0x76, 0x9d, 0x60, 0x2a, 0x87, 0xc5, 0x85, 0xff, 0x22, 0xe4,
-    0x4b, 0x08, 0x48, 0x13, 0x8a, 0x00, 0x3b, 0x48, 0xc9, 0x21, 0x06, 0xc1, 0xbb, 0xd9, 0xd1, 0x3d,
-    0x52, 0x49, 0x6a, 0x44, 0x93, 0x09, 0xc8, 0x8b, 0x8a, 0x5e, 0x7e, 0x8d, 0x0b, 0x26, 0xc3, 0x59,
-    0xbb, 0xad, 0x92, 0xaa, 0x46, 0x0b, 0xbe, 0xd6, 0xaa, 0xa0, 0x36, 0x5f, 0x34, 0x6a, 0x88, 0x84,
-    0x0a, 0xfc, 0xa8, 0xb8, 0xbd, 0xb4, 0xa4, 0xf4, 0xc6, 0xe1, 0x88, 0x55, 0x5d, 0x4e, 0xc9, 0xdc,
-    0x7d, 0xa2, 0x71, 0x0d, 0x18, 0x1e, 0x16, 0x1d, 0x17, 0x11, 0xb3, 0x91, 0x92, 0xf0, 0xc6, 0x1b,
-    0x3a, 0x54, 0x80, 0x8f, 0x11, 0x71, 0x9b, 0x02, 0x16, 0xf4, 0x8f, 0xf0, 0x37, 0xf2, 0xea, 0xa8,
-    0x95, 0x61, 0x8e, 0x8f, 0x22, 0x22, 0xc0, 0xef, 0x51, 0x0b, 0x18, 0x8d, 0xd8, 0xe8, 0x0b, 0x76,
-    0x3e, 0xa5, 0x28, 0xc3, 0x6f, 0xde, 0xf1, 0xf4, 0x55, 0x7d, 0x48, 0xfd, 0xe3, 0xa5, 0x64, 0x45,
-    0x70, 0x3c, 0xbe, 0x0f, 0x06, 0x22, 0xc8, 0x95, 0x89, 0x0a, 0x56, 0xd6, 0x8a, 0x36, 0x42, 0xbe,
-    0xe6, 0x20, 0x00, 0x5c, 0xaa, 0xc6, 0x2e, 0xea, 0x19, 0x11, 0xfc, 0x07, 0x38, 0x08, 0x30, 0x7f,
-    0xb1, 0xe7, 0xfd, 0x71, 0x1c, 0x37, 0xc1, 0xd1, 0x4c, 0x3f, 0x16, 0x4c, 0x4d, 0x06, 0x69, 0xca,
-    0x3b, 0x8b, 0x79, 0xfd, 0x05, 0x0c, 0x8c, 0x60, 0xee, 0xaa, 0x91, 0x16, 0xf1, 0xab, 0x8a, 0x55,
-    0xf1, 0xb2, 0x85, 0xfc, 0xa7, 0xde, 0x6f, 0x32, 0xd3, 0x1f, 0xfd, 0xc2, 0x0d, 0xc7, 0x74, 0x4d,
-    0xcb, 0xae, 0x77, 0x96, 0xd3, 0xf3, 0x0a, 0xa0, 0x97, 0xd1, 0xf5, 0x54, 0xb8, 0xba, 0x45, 0x63,
-    0x1f, 0xe4, 0xef, 0x80, 0x63, 0xd4, 0xef, 0xef, 0x74, 0x56, 0x93, 0xf3, 0xfe, 0x60, 0x97, 0xcb,
-    0xf5, 0x55, 0x89, 0x0b, 0x92, 0x4e, 0xb5, 0x22, 0xe3, 0x0e, 0xc4, 0x5e, 0xc9, 0x0b, 0xc8, 0x52,
-    0xc1, 0x43, 0x0a, 0x6e, 0x6e, 0xee, 0xe9, 0xd2, 0x58, 0xe1, 0x08, 0xd5, 0x93, 0xdd, 0x96, 0x57,
-    0x8b, 0x06, 0x2f, 0xb4, 0x3b, 0x0a, 0x00, 0x5f, 0x9d, 0x55, 0x14, 0x57, 0xfe, 0xee, 0xbe, 0x19,
-    0x61, 0xa5, 0x63, 0x81, 0x6a, 0xf0, 0x1e, 0xf8, 0xdc, 0xa0, 0xf4, 0x98, 0xaa, 0x0b, 0x40, 0xfa,
-    0xea, 0xb1, 0xb7, 0xce, 0xb7, 0x80, 0x3b, 0x56, 0x09, 0xb6, 0xa5, 0x92, 0x84, 0x0b, 0x01, 0xca,
-    0x51, 0x86, 0xad, 0xd5, 0x1a, 0xc5, 0x9f, 0xba, 0x2b, 0xc5, 0x30, 0x66, 0xd2, 0xbc, 0xa5, 0xb1,
-    0xcd, 0x3a, 0x73, 0x29, 0x49, 0x47, 0x58, 0xe3, 0xb7, 0x55, 0xeb, 0x15, 0x7f, 0x0d, 0xf8, 0x12,
-    0x55, 0x02, 0x92, 0x3a, 0xe7, 0x60, 0xdf, 0xfa, 0x3a, 0x3a, 0x01, 0x35, 0xf0, 0x06, 0xe5, 0x85,
-    0xdd, 0x21, 0xef, 0xe7, 0x84, 0xda, 0x08, 0x22, 0xa2, 0xab, 0x83, 0x92, 0x25, 0x15, 0x8b, 0x00,
-    0x4f, 0x6a, 0xc9, 0x01, 0xa4, 0xc1, 0x62, 0xf6, 0x07, 0x24, 0x19, 0xbb, 0x5d, 0xe0, 0x36, 0x69,
-    0xf5, 0x6a, 0xef, 0x22, 0x73, 0xc7, 0xb6, 0xc2, 0x03, 0xc9, 0x53, 0x9f, 0x4d, 0xd5, 0x1e, 0x03,
-    0x00, 0xd9, 0xa4, 0x44, 0x44, 0x45, 0x15, 0x2e, 0xdb, 0x91, 0x09, 0xf0, 0xd8, 0x30, 0x0b, 0x08,
-    0x29, 0x55, 0x1e, 0xd2, 0x58, 0xa1, 0xed, 0xda, 0xe0, 0x64, 0xec, 0x83, 0x2b, 0x5b, 0x30, 0x7a,
-    0x90, 0xb0, 0x5f, 0x1a, 0x55, 0x38, 0xa6, 0x5d, 0x6f, 0xaa, 0x4e, 0x03, 0x6e, 0x00, 0x0b, 0xc6,
-    0x35, 0x5d, 0x37, 0x23, 0xea, 0xa9, 0x81, 0xa2, 0x52, 0x0e, 0x9c, 0xd5, 0x7e, 0xaa, 0x98, 0x05,
-    0x5c, 0x0c, 0xf3, 0x41, 0x07, 0x3e, 0x81, 0x6b, 0xf1, 0x7f, 0x50, 0xef, 0x9b, 0x8f, 0xc2, 0xf0,
-    0x97, 0xaf, 0xbf, 0x00, 0x52, 0x02, 0x57, 0x59, 0xfc, 0x75, 0x0c, 0x90, 0x1a, 0x47, 0x17, 0x0e,
-    0xf0, 0x0d, 0x3f, 0x6e, 0x97, 0x80, 0x99, 0x60, 0x37, 0x6a, 0xcc, 0xe9, 0xd9, 0x11, 0x09, 0xc4,
-    0x09, 0x60, 0x00, 0x25, 0x06, 0x2f, 0xb6, 0x8e, 0xaf, 0x68, 0xa9, 0x29, 0xab, 0xa9, 0xaa, 0xa7,
-    0x45, 0xcb, 0x0c, 0xe4, 0x85, 0xbc, 0x27, 0xd5, 0xa6, 0x00, 0x72, 0xa5, 0xc0, 0x72, 0xf1, 0xef,
-    0x71, 0x42, 0x0c, 0x1b, 0x02, 0xdb, 0x44, 0x40, 0x0b, 0xde, 0x15, 0x7c, 0x43, 0xdf, 0xe2, 0x52,
-    0x0b, 0x2c, 0x9f, 0xf5, 0x24, 0xab, 0xc4, 0x69, 0xaa, 0xa2, 0xe0, 0x39, 0xe0, 0x2e, 0x11, 0x2e,
-    0x11, 0x39, 0x0f, 0x38, 0x5e, 0x6f, 0x2a, 0x70, 0xa3, 0x5e, 0x9c, 0xdc, 0xe8, 0xd5, 0x63, 0x6b,
-    0x70, 0x05, 0xf0, 0x27, 0xbd, 0x70, 0x0d, 0x4b, 0xf5, 0x54, 0xe0, 0x79, 0x11, 0x4a, 0x16, 0xb9,
-    0x03, 0x2f, 0x58, 0xf5, 0x39, 0xbc, 0xa9, 0xc9, 0xff, 0xc5, 0x94, 0x6a, 0xa8, 0x51, 0x05, 0x0b,
-    0x82, 0xfe, 0xa0, 0xd7, 0xd5, 0xc4, 0xae, 0xb7, 0x45, 0xfc, 0x4a, 0x2f, 0x07, 0x72, 0x87, 0x70,
-    0x1c, 0x88, 0x97, 0x8d, 0x59, 0x30, 0x3d, 0xfa, 0x80, 0xd3, 0xd8, 0x09, 0xaa, 0x8f, 0xbc, 0x03,
-    0xfc, 0x0a, 0xaf, 0x00, 0x70, 0x16, 0xa4, 0xec, 0xaa, 0xa3, 0xe3, 0x76, 0xd2, 0x85, 0x11, 0xef,
-    0x91, 0x91, 0x1c, 0xc0, 0x67, 0xbc, 0x50, 0xf8, 0x67, 0xbc, 0x32, 0x78, 0xf5, 0xde, 0xed, 0x27,
-    0x67, 0x01, 0x12, 0xf0, 0x46, 0x7d, 0x49, 0xe3, 0x75, 0xfc, 0x3a, 0x54, 0xe2, 0xf0, 0xe6, 0x71,
-    0xbf, 0x55, 0x14, 0xaa, 0x28, 0xe0, 0xec, 0x65, 0x5e, 0x7f, 0x16, 0x44, 0x97, 0x02, 0x92, 0x13,
-    0x34, 0x9f, 0x4b, 0xc4, 0xd3, 0x78, 0xe5, 0x6b, 0x99, 0x29, 0xa3, 0xa4, 0xad, 0xd1, 0xe5, 0x39,
-    0xc9, 0x07, 0x00, 0x24, 0x65, 0x03, 0x6b, 0x27, 0xb7, 0xb1, 0x48, 0xbf, 0x56, 0x0e, 0xe6, 0xa3,
-    0xb9, 0x46, 0x42, 0x18, 0xe8, 0xfa, 0x07, 0x80, 0x87, 0xee, 0xc8, 0x88, 0xc0, 0x21, 0x89, 0x8f,
-    0x58, 0xe9, 0x08, 0xb4, 0x6b, 0xbc, 0x79, 0xac, 0x56, 0x5f, 0xa6, 0x4b, 0x89, 0x6f, 0x88, 0xe2,
-    0xc0, 0x69, 0x93, 0x51, 0x1f, 0x63, 0xda, 0xaa, 0xe7, 0x8b, 0xfe, 0xf4, 0xf6, 0x92, 0x34, 0xb5,
-    0x55, 0x0a, 0x41, 0x5d, 0x8c, 0x48, 0x2d, 0x22, 0x64, 0x44, 0xf0, 0x22, 0xc0, 0x77, 0x44, 0x67,
-    0xb4, 0xc4, 0x2b, 0x97, 0x85, 0xe0, 0x4b, 0xe1, 0x77, 0x0e, 0x83, 0x04, 0x74, 0xe8, 0x6d, 0x4c,
-    0xf0, 0xcb, 0x84, 0xe9, 0x60, 0x4b, 0x21, 0x6a, 0x73, 0xa6, 0x49, 0x1d, 0x2c, 0x22, 0x72, 0xae,
-    0xd7, 0xb8, 0xc5, 0xf8, 0x22, 0x00, 0x76, 0xf2, 0x85, 0x7c, 0x8e, 0x30, 0x92, 0x1f, 0x02, 0xe1,
-    0x12, 0x83, 0xc5, 0x80, 0xc1, 0xc4, 0x0d, 0x53, 0x5b, 0xd8, 0xe8, 0x95, 0x4d, 0x24, 0x81, 0xc0,
-    0x2a, 0x34, 0x24, 0x6a, 0x47, 0x7f, 0xf3, 0x8c, 0x15, 0x6d, 0xda, 0xf8, 0x1d, 0xe1, 0x6d, 0x1c,
-    0x00, 0xb8, 0x4c, 0x74, 0xfa, 0xd1, 0xaa, 0x35, 0xce, 0xba, 0x51, 0xa8, 0xc3, 0x87, 0x22, 0x10,
-    0x21, 0xf2, 0xbc, 0xbc, 0xa6, 0x8d, 0x6f, 0x6d, 0x74, 0x66, 0xb8, 0x64, 0xe6, 0x7f, 0xe3, 0x50,
-    0xef, 0x59, 0x02, 0x31, 0xeb, 0x0c, 0x69, 0x2a, 0x5a, 0xe3, 0x73, 0xe4, 0x8d, 0xfe, 0xcd, 0xab,
-    0x00, 0x4b, 0x46, 0x06, 0x0d, 0xbf, 0x57, 0xb2, 0xe2, 0x4d, 0x69, 0xb0, 0xda, 0x69, 0x22, 0x17,
-    0xde, 0x65, 0xdf, 0xe4, 0x3b, 0x98, 0x18, 0x6b, 0xda, 0xd3, 0x25, 0xbd, 0x36, 0x1c, 0xa5, 0x56,
-    0x8e, 0x2c, 0x60, 0x17, 0x38, 0x70, 0x3b, 0xf6, 0x64, 0x44, 0x5e, 0x34, 0xd8, 0xe3, 0x6d, 0x74,
-    0xd8, 0xcd, 0xe1, 0x16, 0x31, 0xc2, 0x5c, 0x2d, 0xb6, 0x34, 0xb7, 0x95, 0x6e, 0x8e, 0x2e, 0x31,
-    0x02, 0xac, 0x20, 0x9e, 0x05, 0x45, 0x86, 0x01, 0x10, 0x54, 0xe3, 0x91, 0xad, 0xf0, 0x9e, 0x3d,
-    0x96, 0xda, 0x7d, 0xe1, 0x25, 0x06, 0x45, 0x00, 0x48, 0xe4, 0xcd, 0xe0, 0xec, 0x06, 0x4e, 0x2d,
-    0x92, 0x74, 0xa1, 0x26, 0x5e, 0xe9, 0x26, 0x8a, 0x30, 0x21, 0x34, 0x47, 0x44, 0x67, 0xea, 0xd6,
-    0x59, 0xa4, 0x39, 0xb5, 0x87, 0x22, 0x3f, 0x63, 0x52, 0xe3, 0xda, 0xbc, 0x80, 0x01, 0x45, 0x17,
-    0xdd, 0x32, 0xcd, 0x89, 0x8c, 0x22, 0xc2, 0xc8, 0x16, 0xa8, 0x44, 0x61, 0x18, 0x56, 0x15, 0x99,
-    0x66, 0x46, 0x64, 0x61, 0x18, 0x56, 0x22, 0xd5, 0xce, 0x8c, 0xe7, 0x0a, 0xcc, 0x8e, 0xba, 0xf2,
-    0x2d, 0x91, 0xd7, 0xd6, 0x37, 0xc7, 0xbb, 0xe1, 0xc9, 0x3d, 0xf1, 0xbf, 0x93, 0x8f, 0x28, 0xdb,
-    0xf4, 0x28, 0x32, 0x0e, 0xa2, 0xb3, 0x35, 0x5f, 0x02, 0x4e, 0xda, 0xb0, 0xf7, 0xe8, 0xcb, 0x50,
-    0x9a, 0xf6, 0xe7, 0x1a, 0xe3, 0x80, 0x4f, 0x29, 0xb5, 0x04, 0xfd, 0x8a, 0x95, 0x8c, 0x09, 0xa4,
-    0x0e, 0x58, 0x13, 0x47, 0xa8, 0x13, 0x34, 0xec, 0xf6, 0x7f, 0x2b, 0x30, 0xf2, 0xe2, 0xca, 0xcd,
-    0x44, 0xff, 0x75, 0xeb, 0xfd, 0xa7, 0x8f, 0x6e, 0x6f, 0xf4, 0x6e, 0x7c, 0x0f, 0x75, 0x5b, 0x9f,
-    0x97, 0x5d, 0xc6, 0x38, 0xaa, 0xe3, 0x2d, 0x5a, 0x22, 0x8f, 0xcc, 0xb0, 0x82, 0xcc, 0xa6, 0xbd,
-    0x00, 0xe6, 0xcf, 0x2a, 0x50, 0xd0, 0x0e, 0xca, 0x4d, 0xb8, 0x27, 0xec, 0x86, 0x8c, 0xe4, 0xaa,
-    0xc1, 0xec, 0xd9, 0x7e, 0x87, 0x4d, 0x51, 0xa3, 0x1d, 0x94, 0x88, 0xf0, 0x30, 0xac, 0x20, 0xfb,
-    0xbe, 0x76, 0xf2, 0xbb, 0x1f, 0xca, 0x0e, 0x83, 0x13, 0x78, 0x6c, 0xf0, 0x97, 0x4a, 0x62, 0x53,
-    0xd0, 0x21, 0xa5, 0xc8, 0x5f, 0x3b, 0xe0, 0x1a, 0x17, 0xdf, 0x9b, 0x01, 0x68, 0x1b, 0x6a, 0xcf,
-    0xa6, 0x41, 0xe3, 0x46, 0x70, 0x1c, 0xfb, 0x3c, 0xb0, 0x1c, 0x3b, 0xe5, 0x7c, 0xf4, 0x21, 0x77,
-    0x62, 0x2c, 0x2a, 0x5d, 0xee, 0xd2, 0xec, 0x70, 0x88, 0x57, 0x11, 0xc8, 0x42, 0xf8, 0x67, 0x8e,
-    0xc8, 0x8c, 0xd4, 0x1e, 0xce, 0x0d, 0xdb, 0x03, 0xf4, 0x73, 0x43, 0x05, 0xbf, 0xad, 0xa1, 0x4c,
-    0x6e, 0xa4, 0x55, 0x00, 0x0b, 0x5d, 0x07, 0xbc, 0x19, 0x6f, 0x3d, 0x4f, 0x80, 0xe4, 0x53, 0x7f,
-    0xdf, 0xd5, 0xc2, 0x0f, 0xc5, 0xde, 0xfa, 0x78, 0xf5, 0xd6, 0xfb, 0xda, 0xaa, 0xba, 0xae, 0xfe,
-    0xf3, 0xce, 0x8a, 0xa4, 0x41, 0x0b, 0xe3, 0xc7, 0x01, 0x1b, 0x35, 0xdb, 0x83, 0xfc, 0x91, 0x4d,
-    0xf2, 0xe7, 0x76, 0x0f, 0xc0, 0xaf, 0x68, 0xe1, 0x81, 0x18, 0xb3, 0xf0, 0x02, 0x8d, 0xcd, 0x36,
-    0x01, 0x4a, 0x94, 0xe2, 0x7e, 0xaa, 0xc2, 0x91, 0x44, 0xa5, 0xd5, 0x50, 0x45, 0x87, 0xf5, 0xe4,
-    0x3b, 0xc0, 0xd9, 0x81, 0x1b, 0x24, 0x29, 0x98, 0xd4, 0x9e, 0x7f, 0xe7, 0xea, 0xa9, 0x83, 0xab,
-    0xf7, 0xb4, 0x88, 0x98, 0x87, 0x9c, 0xf6, 0xb7, 0x35, 0xf8, 0xd8, 0x35, 0x4b, 0xfb, 0xde, 0xd1,
-    0x81, 0xc6, 0x6e, 0x0e, 0x9c, 0x76, 0x8e, 0x03, 0x95, 0x27, 0x74, 0x10, 0xc2, 0x9f, 0x82, 0x8f,
-    0x4d, 0x75, 0x78, 0xf3, 0x91, 0xeb, 0x8e, 0x1d, 0x91, 0xfd, 0x80, 0x80, 0x39, 0xc9, 0xb1, 0x07,
-    0xbe, 0x03, 0x63, 0x65, 0x58, 0x5f, 0x74, 0x2e, 0x4d, 0x35, 0xe6, 0xb4, 0x55, 0x5c, 0x62, 0xe7,
-    0x3e, 0x71, 0x55, 0x5a, 0x03, 0xe7, 0x6d, 0xf3, 0x6b, 0xd9, 0x0e, 0x56, 0x88, 0xe6, 0x35, 0x50,
-    0x09, 0x52, 0xdf, 0x41, 0xad, 0xbb, 0xad, 0x9f, 0xf4, 0xc1, 0x07, 0xfa, 0x84, 0x0f, 0x9e, 0x5e,
-    0xa0, 0xe3, 0x3c, 0xa5, 0x6e, 0x02, 0x6f, 0x11, 0xc1, 0x35, 0xc8, 0xc1, 0xce, 0xe2, 0x5f, 0x3c,
-    0x13, 0x58, 0xac, 0xa9, 0xc5, 0xf9, 0xc3, 0xb4, 0x8e, 0xcf, 0x71, 0xf4, 0x38, 0x0e, 0xeb, 0x1e,
-    0xe8, 0x21, 0x39, 0xad, 0x9a, 0xe5, 0x36, 0x68, 0x9d, 0xe0, 0xac, 0x76, 0x1c, 0x3b, 0xa5, 0x8d,
-    0xfe, 0xb8, 0x84, 0xf7, 0xf6, 0xd2, 0xc3, 0x89, 0x0c, 0xb2, 0x1c, 0xcb, 0x9a, 0x40, 0x83, 0x98,
-    0x97, 0xe4, 0xfa, 0xdb, 0x77, 0x39, 0x17, 0x69, 0xc1, 0x9d, 0x4d, 0xaa, 0x54, 0x7f, 0xff, 0xd5,
-    0xe9, 0x4a, 0x1c, 0x92, 0x84, 0x4d, 0x41, 0x0b, 0xb3, 0xc7, 0x19, 0x6f, 0xa5, 0x92, 0xe3, 0x46,
-    0x15, 0x8a, 0x6c, 0xdd, 0x66, 0x08, 0xbc, 0x68, 0xa7, 0x80, 0xea, 0xf3, 0xec, 0x70, 0x9c, 0x8f,
-    0x6f, 0x89, 0x5f, 0x05, 0x42, 0xd2, 0xfb, 0xfb, 0x0b, 0x3b, 0xf3, 0x3b, 0xb2, 0xdc, 0x8f, 0xb1,
-    0x6e, 0x1f, 0xe8, 0x89, 0xef, 0xc2, 0xfe, 0x02, 0x85, 0x3e, 0x72, 0x4b, 0x21, 0x34, 0x01, 0xce,
-    0x63, 0xc7, 0x04, 0x6d, 0x33, 0xbc, 0x7c, 0xa7, 0x55, 0x7a, 0x0f, 0x0f, 0x45, 0x04, 0xf3, 0xa5,
-    0xe5, 0xc0, 0xfb, 0x2e, 0xb1, 0xd9, 0x73, 0x1f, 0x7f, 0x96, 0x40, 0xe3, 0xc0, 0x76, 0xf6, 0xaf,
-    0x2b, 0x2b, 0x0a, 0x7b, 0x7f, 0xde, 0x05, 0xbd, 0xbf, 0x7e, 0x17, 0x23, 0x25, 0x2e, 0x62, 0x5b,
-    0xf0, 0x27, 0x55, 0x4e, 0xc5, 0x7d, 0x25, 0xf2, 0x9a, 0x3a, 0xe7, 0x14, 0xe3, 0x80, 0xea, 0x31,
-    0x0b, 0x80, 0x8b, 0xc0, 0x05, 0x5d, 0xdd, 0x1e, 0xe3, 0x93, 0x6b, 0xcb, 0x79, 0x7b, 0x3f, 0xb5,
-    0x06, 0x52, 0x2b, 0xe6, 0x3a, 0xaa, 0xf1, 0xaf, 0x1d, 0x96, 0x6b, 0x0e, 0x52, 0x04, 0xd7, 0x7e,
-    0x69, 0xf7, 0x2b, 0x58, 0x69, 0xb6, 0xf5, 0x50, 0xbc, 0x7a, 0x85, 0x79, 0x42, 0x9c, 0x95, 0x5e,
-    0x60, 0x5c, 0x72, 0x1b, 0xe4, 0xaa, 0xb6, 0xf1, 0xe6, 0x77, 0xec, 0xb4, 0x5f, 0x6c, 0xd1, 0xe9,
-    0x28, 0xb0, 0x25, 0x40, 0xc2, 0x5e, 0xbe, 0x73, 0x06, 0xcb, 0xd2, 0x3c, 0xd0, 0x71, 0x75, 0x20,
-    0xb9, 0xaa, 0x90, 0x1d, 0xc8, 0x88, 0xe0, 0x4a, 0xf0, 0x48, 0x07, 0x8a, 0x1c, 0xcc, 0x41, 0x92,
-    0x27, 0xd9, 0xa9, 0xd0, 0x2f, 0x78, 0x64, 0x6d, 0x79, 0x5f, 0x06, 0xbf, 0xa1, 0xf6, 0xe3, 0xc1,
-    0xf7, 0xd6, 0xb8, 0x69, 0xac, 0x1e, 0xdf, 0x9f, 0x17, 0x00, 0xd1, 0xb9, 0x63, 0xaf, 0x46, 0x7f,
-    0x2e, 0x44, 0x7e, 0x01, 0xf6, 0x96, 0x34, 0x75, 0xdd, 0x01, 0xf7, 0xc0, 0x2f, 0x80, 0x15, 0x14,
-    0x1c, 0xe4, 0x32, 0x8e, 0x01, 0xce, 0x20, 0xc7, 0x5f, 0x22, 0x3e, 0x02, 0xd9, 0x6f, 0x01, 0x6c,
-    0x18, 0x4f, 0x5a, 0xfe, 0x6d, 0x55, 0xa1, 0xce, 0xc3, 0x82, 0x48, 0x31, 0xe4, 0x44, 0xe0, 0x28,
-    0x3c, 0x19, 0xc0, 0x39, 0x91, 0x83, 0xc0, 0xe5, 0x81, 0x77, 0xa8, 0x1f, 0xf6, 0xea, 0x2f, 0xb4,
-    0xd1, 0xc6, 0x38, 0x9c, 0x1c, 0x07, 0x88, 0x83, 0x07, 0x4c, 0xc6, 0x9e, 0xe3, 0x5e, 0x08, 0xb1,
-    0x98, 0xf8, 0x3e, 0xaa, 0xc9, 0x6e, 0xc3, 0x9e, 0x1c, 0x61, 0x99, 0x11, 0xdc, 0x01, 0x1c, 0x07,
-    0xf6, 0x97, 0x18, 0xb5, 0x13, 0xa2, 0xe9, 0x58, 0xef, 0xfb, 0xe2, 0xe5, 0x97, 0xff, 0xea, 0xa9,
-    0x34, 0xca, 0xcc, 0x2f, 0x7f, 0xb1, 0x1c, 0xe0, 0x05, 0x70, 0x64, 0x44, 0xf0, 0x0c, 0xe0, 0x19,
-    0xc0, 0x63, 0x2a, 0x10, 0x9c, 0x44, 0xdc, 0x6b, 0xaa, 0x57, 0xbc, 0xef, 0x78, 0x00, 0x39, 0xc4,
-    0xc7, 0x5e, 0x8a, 0x81, 0x8c, 0x88, 0xde, 0x00, 0x8c, 0x06, 0xbe, 0xc3, 0xc9, 0xae, 0x51, 0x60,
-    0xd3, 0x8a, 0x78, 0xc0, 0x0e, 0x25, 0xff, 0xfd, 0xdb, 0x8f, 0x09, 0xd7, 0x52, 0xac, 0x4d, 0xd5,
-    0x5c, 0xa9, 0xe3, 0xad, 0xc1, 0x80, 0x60, 0x39, 0xc3, 0x87, 0x70, 0xe1, 0x52, 0x38, 0x15, 0xc0,
-    0x70, 0xe2, 0x1c, 0x38, 0x87, 0x0e, 0x05, 0x23, 0x03, 0x9c, 0x38, 0x76, 0x0e, 0x1c, 0x23, 0x87,
-    0x9c, 0x05, 0x76, 0x03, 0x1c, 0x38, 0x87, 0x0e, 0x05, 0x23, 0x03, 0x9c, 0x38, 0x76, 0x0e, 0x1c,
-    0x23, 0x87, 0x9c, 0x05, 0x76, 0x03, 0x1c, 0x38, 0x87, 0x0e, 0x05, 0x23, 0x03, 0x9c, 0x38, 0x76,
-    0x0e, 0x1c, 0x23, 0x87, 0x9c, 0x05, 0x76, 0x03, 0x1c, 0x38, 0x87, 0x0e, 0x05, 0x23, 0x03, 0x9c,
-    0x38, 0x76, 0x0e, 0x1c, 0x23, 0x87, 0x9c, 0x05, 0x76, 0x03, 0x1c, 0x38, 0x87, 0x0e, 0x05, 0x23,
-    0x03, 0x9c, 0x38, 0x76, 0x0e, 0x1c, 0x23, 0x87, 0x9c, 0x05, 0x76, 0x03, 0x1c, 0x38, 0x87, 0x0e,
-    0x05, 0x23, 0x03, 0x9c, 0x38, 0x76, 0x0e, 0x1c, 0x23, 0x87, 0x9c, 0x05, 0x76, 0x03, 0x1c, 0x38,
-    0x87, 0x0e, 0x05, 0x23, 0x0f, 0xfe, 0xf6, 0xa7, 0xbf, 0x78, 0xfb, 0x2d, 0xfb, 0xc5, 0x00, 0x00,
-    0x00, 0x00, 0x45, 0x49, 0x44, 0x4e, 0x42, 0xae, 0x82, 0x60,
-  ],
-  disp: function()
-  {
-    // Do Nothing
-
-    throw "Does Nothing!";
-  }
-
-};
-
-try
-{
-  LOGO.disp();
-}
-catch(e)
-{
-  alert("Error: " + e + "\n");
-}
diff --git a/jetty-spdy/spdy-http-server/src/test/resources/jetty-logging.properties b/jetty-spdy/spdy-http-server/src/test/resources/jetty-logging.properties
deleted file mode 100644
index be1b7aa..0000000
--- a/jetty-spdy/spdy-http-server/src/test/resources/jetty-logging.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
-#org.eclipse.jetty.spdy.LEVEL=DEBUG
-#org.eclipse.jetty.server.LEVEL=DEBUG
-#org.eclipse.jetty.io.ssl.LEVEL=DEBUG
-#org.eclipse.jetty.spdy.LEVEL=DEBUG
-#org.eclipse.jetty.client.LEVEL=DEBUG
-#org.eclipse.jetty.spdy.server.http.ReferrerPushStrategy.LEVEL=DEBUG
-#org.eclipse.jetty.spdy.server.proxy.LEVEL=DEBUG
-#org.mortbay.LEVEL=DEBUG
-
diff --git a/jetty-spdy/spdy-http-server/src/test/resources/keystore.jks b/jetty-spdy/spdy-http-server/src/test/resources/keystore.jks
deleted file mode 100644
index 428ba54..0000000
--- a/jetty-spdy/spdy-http-server/src/test/resources/keystore.jks
+++ /dev/null
Binary files differ
diff --git a/jetty-spdy/spdy-http-server/src/test/resources/truststore.jks b/jetty-spdy/spdy-http-server/src/test/resources/truststore.jks
deleted file mode 100644
index 839cb8c..0000000
--- a/jetty-spdy/spdy-http-server/src/test/resources/truststore.jks
+++ /dev/null
Binary files differ
diff --git a/jetty-spdy/spdy-npn-tests/pom.xml b/jetty-spdy/spdy-npn-tests/pom.xml
deleted file mode 100644
index 7b54c55..0000000
--- a/jetty-spdy/spdy-npn-tests/pom.xml
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.eclipse.jetty.spdy</groupId>
-        <artifactId>spdy-parent</artifactId>
-        <version>9.2.11-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>spdy-npn-tests</artifactId>
-    <name>Jetty :: SPDY :: NPN Tests</name>
-
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>copy</id>
-                        <phase>generate-resources</phase>
-                        <goals>
-                            <goal>copy</goal>
-                        </goals>
-                        <configuration>
-                            <artifactItems>
-                                <artifactItem>
-                                    <groupId>org.mortbay.jetty.npn</groupId>
-                                    <artifactId>npn-boot</artifactId>
-                                    <version>${npn.version}</version>
-                                    <type>jar</type>
-                                    <overWrite>false</overWrite>
-                                    <outputDirectory>${project.build.directory}/npn</outputDirectory>
-                                </artifactItem>
-                            </artifactItems>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <argLine>-Xbootclasspath/p:${project.build.directory}/npn/npn-boot-${npn.version}.jar</argLine>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.eclipse.jetty.npn</groupId>
-            <artifactId>npn-api</artifactId>
-            <version>${npn.api.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-start</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-server</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.spdy</groupId>
-            <artifactId>spdy-server</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.spdy</groupId>
-            <artifactId>spdy-http-server</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.spdy</groupId>
-            <artifactId>spdy-http-server</artifactId>
-            <version>${project.version}</version>
-            <classifier>tests</classifier>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-    
-</project>
diff --git a/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/AbstractNPNTest.java b/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/AbstractNPNTest.java
deleted file mode 100644
index 74c292a..0000000
--- a/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/AbstractNPNTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server;
-
-import java.net.InetSocketAddress;
-
-import org.eclipse.jetty.npn.NextProtoNego;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.spdy.client.SPDYClient;
-import org.eclipse.jetty.toolchain.test.TestTracker;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.junit.After;
-import org.junit.Rule;
-
-public class AbstractNPNTest
-{
-    @Rule
-    public final TestTracker tracker = new TestTracker();
-    protected Server server;
-    protected SPDYServerConnector connector;
-    protected SPDYClient.Factory clientFactory;
-
-    protected InetSocketAddress prepare() throws Exception
-    {
-        server = new Server();
-        connector = new SPDYServerConnector(server, newSslContextFactory(), null);
-        connector.setPort(0);
-        connector.setIdleTimeout(30000);
-        server.addConnector(connector);
-        server.start();
-
-        QueuedThreadPool threadPool = new QueuedThreadPool();
-        threadPool.setName(threadPool.getName() + "-client");
-        clientFactory = new SPDYClient.Factory(threadPool);
-        clientFactory.start();
-
-        NextProtoNego.debug = true;
-
-        return new InetSocketAddress("localhost", connector.getLocalPort());
-    }
-
-    protected SslContextFactory newSslContextFactory()
-    {
-        SslContextFactory sslContextFactory = new SslContextFactory();
-        sslContextFactory.setKeyStorePath("src/test/resources/keystore.jks");
-        sslContextFactory.setKeyStorePassword("storepwd");
-        sslContextFactory.setTrustStorePath("src/test/resources/truststore.jks");
-        sslContextFactory.setTrustStorePassword("storepwd");
-        sslContextFactory.setProtocol("TLSv1");
-        sslContextFactory.setIncludeProtocols("TLSv1");
-        return sslContextFactory;
-    }
-
-    @After
-    public void dispose() throws Exception
-    {
-        clientFactory.stop();
-        server.stop();
-    }
-}
diff --git a/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/NPNModuleTest.java b/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/NPNModuleTest.java
deleted file mode 100644
index c2497eb..0000000
--- a/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/NPNModuleTest.java
+++ /dev/null
@@ -1,193 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import org.eclipse.jetty.start.BaseHome;
-import org.eclipse.jetty.start.FileArg;
-import org.eclipse.jetty.start.Module;
-import org.eclipse.jetty.toolchain.test.FS;
-import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
-import org.eclipse.jetty.util.IO;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameter;
-import org.junit.runners.Parameterized.Parameters;
-
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-@RunWith(Parameterized.class)
-public class NPNModuleTest
-{
-    /** This is here to prevent pointless download attempts */
-    private static final List<String> KNOWN_GOOD_NPN_URLS = new ArrayList<>();
-
-    static
-    {
-        /** The main() method in this test case can be run to validate this list independently */
-        KNOWN_GOOD_NPN_URLS.add("http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.11.v20150415/npn-boot-1.1.11.v20150415.jar");
-        KNOWN_GOOD_NPN_URLS.add("http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.10.v20150130/npn-boot-1.1.10.v20150130.jar");
-        KNOWN_GOOD_NPN_URLS.add("http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.9.v20141016/npn-boot-1.1.9.v20141016.jar");
-        KNOWN_GOOD_NPN_URLS.add("http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.8.v20141013/npn-boot-1.1.8.v20141013.jar");
-        KNOWN_GOOD_NPN_URLS.add("http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.6.v20130911/npn-boot-1.1.6.v20130911.jar");
-        KNOWN_GOOD_NPN_URLS.add("http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.5.v20130313/npn-boot-1.1.5.v20130313.jar");
-        KNOWN_GOOD_NPN_URLS.add("http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.4.v20130313/npn-boot-1.1.4.v20130313.jar");
-        KNOWN_GOOD_NPN_URLS.add("http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.3.v20130313/npn-boot-1.1.3.v20130313.jar");
-        KNOWN_GOOD_NPN_URLS.add("http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.2.v20130305/npn-boot-1.1.2.v20130305.jar");
-        KNOWN_GOOD_NPN_URLS.add("http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.1.v20121030/npn-boot-1.1.1.v20121030.jar");
-        KNOWN_GOOD_NPN_URLS.add("http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.0.v20120525/npn-boot-1.1.0.v20120525.jar");
-    }
-
-    @Parameters(name = "{index}: mod:{0}")
-    public static List<Object[]> data()
-    {
-        File npnBootModDir = MavenTestingUtils.getProjectDir("../spdy-http-server/src/main/config/modules/protonego-impl");
-        List<Object[]> data = new ArrayList<>();
-        for (File file : npnBootModDir.listFiles())
-        {
-            if (Pattern.matches("npn-.*\\.mod",file.getName()))
-            {
-                data.add(new Object[] { file.getName() });
-            }
-        }
-        return data;
-    }
-
-    @Parameter(value = 0)
-    public String modBootFile;
-
-    private static BaseHome basehome;
-
-    @BeforeClass
-    public static void initBaseHome() throws IOException
-    {
-        File homeDir = MavenTestingUtils.getProjectDir("../spdy-http-server/src/main/config");
-        File baseDir = MavenTestingUtils.getTargetTestingDir(NPNModuleTest.class.getName());
-        FS.ensureEmpty(baseDir);
-        
-        String cmdLine[] = { "jetty.home="+homeDir.getAbsolutePath(),"jetty.base="+baseDir.getAbsolutePath() };
-        basehome = new BaseHome(cmdLine);
-    }
-
-    /**
-     * Check the sanity of the npn-boot file module 
-     */
-    @Test
-    public void testModuleValues() throws IOException
-    {
-        Path modFile = basehome.getPath("modules/protonego-impl/" + modBootFile);
-        Module mod = new Module(basehome,modFile);
-        assertNotNull("module",mod);
-        
-        // Validate logical name
-        assertThat("Module name",mod.getName(),is("protonego-boot"));
-
-        List<String> expectedBootClasspath = new ArrayList<>();
-
-        for (String line : mod.getFiles())
-        {
-            FileArg farg = new FileArg(line);
-            if (farg.uri != null)
-            {
-                assertTrue("Not a known good NPN URL: " + farg.uri,KNOWN_GOOD_NPN_URLS.contains(farg.uri));
-                expectedBootClasspath.add("-Xbootclasspath/p:" + farg.location);
-            }
-        }
-
-        for (String line : mod.getJvmArgs())
-        {
-            expectedBootClasspath.remove(line);
-        }
-
-        if (expectedBootClasspath.size() > 0)
-        {
-            StringBuilder err = new StringBuilder();
-            err.append("XBootClasspath mismatch between [files] and [exec]");
-            err.append("\nThe following are inferred from your [files] definition in ");
-            err.append(modFile.toAbsolutePath().toString());
-            err.append("\nbut are not referenced in your [exec] section");
-            for (String entry : expectedBootClasspath)
-            {
-                err.append("\n").append(entry);
-            }
-            fail(err.toString());
-        }
-    }
-
-    public static void main(String[] args)
-    {
-        File outputDir = MavenTestingUtils.getTargetTestingDir(NPNModuleTest.class.getSimpleName() + "-main");
-        FS.ensureEmpty(outputDir);
-        for (String ref : KNOWN_GOOD_NPN_URLS)
-        {
-            try
-            {
-                URL url = new URL(ref);
-                System.err.printf("Attempting: %s%n",ref);
-                HttpURLConnection connection = (HttpURLConnection)url.openConnection();
-                String refname = url.toURI().getPath();
-                int idx = refname.lastIndexOf('/');
-                File outputFile = new File(outputDir,refname.substring(idx));
-                try (InputStream stream = connection.getInputStream(); FileOutputStream out = new FileOutputStream(outputFile))
-                {
-                    assertThat("Response Status Code",connection.getResponseCode(),is(200));
-                    IO.copy(stream,out);
-                    System.err.printf("Downloaded %,d bytes%n",outputFile.length());
-                }
-                catch (IOException e)
-                {
-                    e.printStackTrace(System.err);
-                }
-            }
-            catch (MalformedURLException e)
-            {
-                System.err.printf("Bad Ref: %s%n",ref);
-                e.printStackTrace(System.err);
-            }
-            catch (URISyntaxException e)
-            {
-                System.err.printf("Bad Ref Syntax: %s%n",ref);
-                e.printStackTrace(System.err);
-            }
-            catch (IOException e)
-            {
-                System.err.printf("Bad Connection: %s%n",ref);
-                e.printStackTrace(System.err);
-            }
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/NPNNegotiationTest.java b/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/NPNNegotiationTest.java
deleted file mode 100644
index 62b4449..0000000
--- a/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/NPNNegotiationTest.java
+++ /dev/null
@@ -1,207 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server;
-
-import java.io.BufferedReader;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.net.InetSocketAddress;
-import java.nio.charset.StandardCharsets;
-import java.util.List;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSocket;
-
-import org.eclipse.jetty.npn.NextProtoNego;
-import org.eclipse.jetty.server.HttpConnectionFactory;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class NPNNegotiationTest extends AbstractNPNTest
-{
-    @Test
-    public void testServerAdvertisingHTTPSpeaksHTTP() throws Exception
-    {
-        InetSocketAddress address = prepare();
-        connector.addConnectionFactory(new HttpConnectionFactory());
-
-        SslContextFactory sslContextFactory = newSslContextFactory();
-        sslContextFactory.start();
-        SSLContext sslContext = sslContextFactory.getSslContext();
-
-        try (SSLSocket client = (SSLSocket)sslContext.getSocketFactory().createSocket(address.getAddress(), address.getPort()))
-        {
-            client.setUseClientMode(true);
-            client.setSoTimeout(5000);
-
-            NextProtoNego.put(client, new NextProtoNego.ClientProvider()
-            {
-                @Override
-                public boolean supports()
-                {
-                    return true;
-                }
-
-                @Override
-                public void unsupported()
-                {
-                }
-
-                @Override
-                public String selectProtocol(List<String> strings)
-                {
-                    Assert.assertNotNull(strings);
-                    String protocol = "http/1.1";
-                    Assert.assertTrue(strings.contains(protocol));
-                    return protocol;
-                }
-            });
-
-            client.startHandshake();
-
-            // Verify that the server really speaks http/1.1
-
-            OutputStream output = client.getOutputStream();
-            output.write(("" +
-                    "GET / HTTP/1.1\r\n" +
-                    "Host: localhost:" + address.getPort() + "\r\n" +
-                    "\r\n" +
-                    "").getBytes(StandardCharsets.UTF_8));
-            output.flush();
-
-            InputStream input = client.getInputStream();
-            BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
-            String line = reader.readLine();
-            Assert.assertTrue(line.contains(" 404 "));
-        }
-    }
-
-    @Test
-    public void testServerAdvertisingSPDYAndHTTPSpeaksHTTPWhenNegotiated() throws Exception
-    {
-        InetSocketAddress address = prepare();
-        connector.addConnectionFactory(new HttpConnectionFactory());
-
-        SslContextFactory sslContextFactory = newSslContextFactory();
-        sslContextFactory.start();
-        SSLContext sslContext = sslContextFactory.getSslContext();
-        try (SSLSocket client = (SSLSocket)sslContext.getSocketFactory().createSocket(address.getAddress(), address.getPort()))
-        {
-            client.setUseClientMode(true);
-            client.setSoTimeout(5000);
-
-            NextProtoNego.put(client, new NextProtoNego.ClientProvider()
-            {
-                @Override
-                public boolean supports()
-                {
-                    return true;
-                }
-
-                @Override
-                public void unsupported()
-                {
-                }
-
-                @Override
-                public String selectProtocol(List<String> strings)
-                {
-                    Assert.assertNotNull(strings);
-                    String spdyProtocol = "spdy/2";
-                    Assert.assertTrue(strings.contains(spdyProtocol));
-                    String httpProtocol = "http/1.1";
-                    Assert.assertTrue(strings.contains(httpProtocol));
-                    Assert.assertTrue(strings.indexOf(spdyProtocol) < strings.indexOf(httpProtocol));
-                    return httpProtocol;
-                }
-            });
-
-            client.startHandshake();
-
-            // Verify that the server really speaks http/1.1
-
-            OutputStream output = client.getOutputStream();
-            output.write(("" +
-                    "GET / HTTP/1.1\r\n" +
-                    "Host: localhost:" + address.getPort() + "\r\n" +
-                    "\r\n" +
-                    "").getBytes(StandardCharsets.UTF_8));
-            output.flush();
-
-            InputStream input = client.getInputStream();
-            BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
-            String line = reader.readLine();
-            Assert.assertTrue(line.contains(" 404 "));
-        }
-    }
-
-    @Test
-    public void testServerAdvertisingSPDYAndHTTPSpeaksDefaultProtocolWhenNPNMissing() throws Exception
-    {
-        InetSocketAddress address = prepare();
-        connector.addConnectionFactory(new HttpConnectionFactory());
-
-        SslContextFactory sslContextFactory = newSslContextFactory();
-        sslContextFactory.start();
-        SSLContext sslContext = sslContextFactory.getSslContext();
-        try (SSLSocket client = (SSLSocket)sslContext.getSocketFactory().createSocket(address.getAddress(), address.getPort()))
-        {
-            client.setUseClientMode(true);
-            client.setSoTimeout(5000);
-
-            NextProtoNego.put(client, new NextProtoNego.ClientProvider()
-            {
-                @Override
-                public boolean supports()
-                {
-                    return false;
-                }
-
-                @Override
-                public void unsupported()
-                {
-                }
-
-                @Override
-                public String selectProtocol(List<String> strings)
-                {
-                    return null;
-                }
-            });
-
-            client.startHandshake();
-
-            // Verify that the server really speaks http/1.1
-
-            OutputStream output = client.getOutputStream();
-            output.write(("" +
-                    "GET / HTTP/1.1\r\n" +
-                    "Host: localhost:" + address.getPort() + "\r\n" +
-                    "\r\n" +
-                    "").getBytes(StandardCharsets.UTF_8));
-            output.flush();
-
-            InputStream input = client.getInputStream();
-            BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
-            String line = reader.readLine();
-            Assert.assertTrue(line.contains(" 404 "));
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/SSLEngineLeakTest.java b/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/SSLEngineLeakTest.java
deleted file mode 100644
index 01074eb..0000000
--- a/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/SSLEngineLeakTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server;
-
-import java.lang.reflect.Field;
-import java.net.InetSocketAddress;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.npn.NextProtoNego;
-import org.eclipse.jetty.spdy.api.GoAwayInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class SSLEngineLeakTest extends AbstractNPNTest
-{
-    @Test
-    public void testSSLEngineLeak() throws Exception
-    {
-        System.gc();
-        Thread.sleep(1000);
-
-        Field field = NextProtoNego.class.getDeclaredField("objects");
-        field.setAccessible(true);
-        @SuppressWarnings("unchecked")
-        Map<Object, NextProtoNego.Provider> objects = (Map<Object, NextProtoNego.Provider>)field.get(null);
-        int initialSize = objects.size();
-
-        avoidStackLocalVariables();
-        // Allow the close to arrive to the server and the selector to process it
-        Thread.sleep(1000);
-
-        // Perform GC to be sure that the map is cleared
-        System.gc();
-        Thread.sleep(1000);
-
-        // Check that the map is empty
-        if (objects.size() != initialSize)
-        {
-            System.err.println(objects);
-            server.dumpStdErr();
-        }
-
-        Assert.assertEquals(initialSize, objects.size());
-    }
-
-    private void avoidStackLocalVariables() throws Exception
-    {
-        InetSocketAddress address = prepare();
-        Session session = clientFactory.newSPDYClient(SPDY.V3).connect(address, null);
-        session.goAway(new GoAwayInfo(5, TimeUnit.SECONDS));
-    }
-}
diff --git a/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/SSLSynReplyTest.java b/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/SSLSynReplyTest.java
deleted file mode 100644
index a1b2169..0000000
--- a/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/SSLSynReplyTest.java
+++ /dev/null
@@ -1,150 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server;
-
-import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
-import java.nio.channels.SocketChannel;
-import java.util.List;
-import javax.net.ssl.SSLEngine;
-
-import org.eclipse.jetty.npn.NextProtoNego;
-import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class SSLSynReplyTest extends AbstractNPNTest
-{
-    @Test
-    public void testGentleCloseDuringHandshake() throws Exception
-    {
-        InetSocketAddress address = prepare();
-        SslContextFactory sslContextFactory = newSslContextFactory();
-        sslContextFactory.start();
-        SSLEngine sslEngine = sslContextFactory.newSSLEngine(address);
-        sslEngine.setUseClientMode(true);
-        NextProtoNego.put(sslEngine, new NextProtoNego.ClientProvider()
-        {
-            @Override
-            public boolean supports()
-            {
-                return true;
-            }
-
-            @Override
-            public void unsupported()
-            {
-            }
-
-            @Override
-            public String selectProtocol(List<String> protocols)
-            {
-                return null;
-            }
-        });
-        sslEngine.beginHandshake();
-
-        ByteBuffer encrypted = ByteBuffer.allocate(sslEngine.getSession().getPacketBufferSize());
-        sslEngine.wrap(BufferUtil.EMPTY_BUFFER, encrypted);
-        encrypted.flip();
-
-        try (SocketChannel channel = SocketChannel.open(address))
-        {
-            // Send ClientHello, immediately followed by TLS Close Alert and then by FIN
-            channel.write(encrypted);
-            sslEngine.closeOutbound();
-            encrypted.clear();
-            sslEngine.wrap(BufferUtil.EMPTY_BUFFER, encrypted);
-            encrypted.flip();
-            channel.write(encrypted);
-            channel.shutdownOutput();
-
-            // Read ServerHello from server
-            encrypted.clear();
-            int read = channel.read(encrypted);
-            encrypted.flip();
-            Assert.assertTrue(read > 0);
-            // Cannot decrypt, as the SSLEngine has been already closed
-
-            // Now if we read more, we should either read the TLS Close Alert, or directly -1
-            encrypted.clear();
-            read = channel.read(encrypted);
-            // Sending a TLS Close Alert during handshake results in an exception when
-            // unwrapping that the server react to by closing the connection abruptly.
-            Assert.assertTrue(read < 0);
-        }
-    }
-
-    @Test
-    public void testAbruptCloseDuringHandshake() throws Exception
-    {
-        InetSocketAddress address = prepare();
-        SslContextFactory sslContextFactory = newSslContextFactory();
-        sslContextFactory.start();
-        SSLEngine sslEngine = sslContextFactory.newSSLEngine(address);
-        sslEngine.setUseClientMode(true);
-        NextProtoNego.put(sslEngine, new NextProtoNego.ClientProvider()
-        {
-            @Override
-            public boolean supports()
-            {
-                return true;
-            }
-
-            @Override
-            public void unsupported()
-            {
-            }
-
-            @Override
-            public String selectProtocol(List<String> protocols)
-            {
-                return null;
-            }
-        });
-        sslEngine.beginHandshake();
-
-        ByteBuffer encrypted = ByteBuffer.allocate(sslEngine.getSession().getPacketBufferSize());
-        sslEngine.wrap(BufferUtil.EMPTY_BUFFER, encrypted);
-        encrypted.flip();
-
-        try (SocketChannel channel = SocketChannel.open(address))
-        {
-            // Send ClientHello, immediately followed by FIN (no TLS Close Alert)
-            channel.write(encrypted);
-            channel.shutdownOutput();
-
-            // Read ServerHello from server
-            encrypted.clear();
-            int read = channel.read(encrypted);
-            encrypted.flip();
-            Assert.assertTrue(read > 0);
-            ByteBuffer decrypted = ByteBuffer.allocate(sslEngine.getSession().getApplicationBufferSize());
-            sslEngine.unwrap(encrypted, decrypted);
-
-            // Now if we read more, we should either read the TLS Close Alert, or directly -1
-            encrypted.clear();
-            read = channel.read(encrypted);
-            // Since we have close the connection abruptly, the server also does so
-            Assert.assertTrue(read < 0);
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/proxy/NPNProxySPDYToHTTPLoadTest.java b/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/proxy/NPNProxySPDYToHTTPLoadTest.java
deleted file mode 100644
index b91c8bf..0000000
--- a/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/proxy/NPNProxySPDYToHTTPLoadTest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.proxy;
-
-import org.eclipse.jetty.spdy.server.NPNServerConnectionFactory;
-
-public class NPNProxySPDYToHTTPLoadTest extends ProxySPDYToHTTPLoadTest
-{
-    public NPNProxySPDYToHTTPLoadTest(short version)
-    {
-        super(version, new NPNServerConnectionFactory("spdy/3", "spdy/2", "http/1.1"));
-    }
-}
diff --git a/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/proxy/NPNProxySPDYToHTTPTest.java b/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/proxy/NPNProxySPDYToHTTPTest.java
deleted file mode 100644
index 5a23193..0000000
--- a/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/proxy/NPNProxySPDYToHTTPTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.proxy;
-
-public class NPNProxySPDYToHTTPTest extends ProxySPDYToHTTPTest
-{
-    public NPNProxySPDYToHTTPTest(short version)
-    {
-        super(version);
-    }
-}
diff --git a/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/proxy/NPNProxySPDYToSPDYLoadTest.java b/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/proxy/NPNProxySPDYToSPDYLoadTest.java
deleted file mode 100644
index feaae88..0000000
--- a/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/proxy/NPNProxySPDYToSPDYLoadTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.proxy;
-
-public class NPNProxySPDYToSPDYLoadTest extends ProxySPDYToSPDYLoadTest
-{
-    public NPNProxySPDYToSPDYLoadTest(short version)
-    {
-        super(version);
-    }
-}
diff --git a/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/proxy/NPNProxySPDYToSPDYTest.java b/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/proxy/NPNProxySPDYToSPDYTest.java
deleted file mode 100644
index 4a85912..0000000
--- a/jetty-spdy/spdy-npn-tests/src/test/java/org/eclipse/jetty/spdy/server/proxy/NPNProxySPDYToSPDYTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server.proxy;
-
-public class NPNProxySPDYToSPDYTest extends ProxySPDYToSPDYTest
-{
-    public NPNProxySPDYToSPDYTest(short version)
-    {
-        super(version);
-    }
-}
diff --git a/jetty-spdy/spdy-npn-tests/src/test/resources/jetty-logging.properties b/jetty-spdy/spdy-npn-tests/src/test/resources/jetty-logging.properties
deleted file mode 100644
index ead13ec..0000000
--- a/jetty-spdy/spdy-npn-tests/src/test/resources/jetty-logging.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
-#org.eclipse.jetty.spdy.LEVEL=DEBUG
diff --git a/jetty-spdy/spdy-npn-tests/src/test/resources/keystore.jks b/jetty-spdy/spdy-npn-tests/src/test/resources/keystore.jks
deleted file mode 100644
index 428ba54..0000000
--- a/jetty-spdy/spdy-npn-tests/src/test/resources/keystore.jks
+++ /dev/null
Binary files differ
diff --git a/jetty-spdy/spdy-npn-tests/src/test/resources/truststore.jks b/jetty-spdy/spdy-npn-tests/src/test/resources/truststore.jks
deleted file mode 100644
index 839cb8c..0000000
--- a/jetty-spdy/spdy-npn-tests/src/test/resources/truststore.jks
+++ /dev/null
Binary files differ
diff --git a/jetty-spdy/spdy-server/pom.xml b/jetty-spdy/spdy-server/pom.xml
deleted file mode 100644
index cd22bd9..0000000
--- a/jetty-spdy/spdy-server/pom.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.eclipse.jetty.spdy</groupId>
-        <artifactId>spdy-parent</artifactId>
-        <version>9.2.14-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>spdy-server</artifactId>
-    <name>Jetty :: SPDY :: Server Binding</name>
-
-    <properties>
-        <bundle-symbolic-name>${project.groupId}.server</bundle-symbolic-name>
-    </properties>
-
-    <url>http://www.eclipse.org/jetty</url>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>manifest</goal>
-                        </goals>
-                        <configuration>
-                            <instructions>
-                                <Export-Package>org.eclipse.jetty.spdy.server;version="9.1"</Export-Package>
-                                <Import-Package>org.eclipse.jetty.alpn;resolution:=optional,org.eclipse.jetty.alpn.server;resolution:=optional, org.eclipse.jetty.npn;resolution:=optional,org.eclipse.jetty.*;version="[9.0,10.0)",*</Import-Package>
-                                <_nouses>true</_nouses>
-                            </instructions>
-                          </configuration>
-                       </execution>
-                  </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.eclipse.jetty.spdy</groupId>
-            <artifactId>spdy-core</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.spdy</groupId>
-            <artifactId>spdy-client</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-server</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.npn</groupId>
-            <artifactId>npn-api</artifactId>
-            <version>${npn.api.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.alpn</groupId>
-            <artifactId>alpn-api</artifactId>
-            <version>${alpn.api.version}</version>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/jetty-spdy/spdy-server/src/main/java/org/eclipse/jetty/spdy/server/NPNServerConnection.java b/jetty-spdy/spdy-server/src/main/java/org/eclipse/jetty/spdy/server/NPNServerConnection.java
deleted file mode 100644
index fbc1af3..0000000
--- a/jetty-spdy/spdy-server/src/main/java/org/eclipse/jetty/spdy/server/NPNServerConnection.java
+++ /dev/null
@@ -1,68 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server;
-
-import java.util.List;
-import javax.net.ssl.SSLEngine;
-
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.npn.NextProtoNego;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.NegotiatingServerConnection;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-public class NPNServerConnection extends NegotiatingServerConnection implements NextProtoNego.ServerProvider
-{
-    private static final Logger LOG = Log.getLogger(NPNServerConnection.class);
-
-    public NPNServerConnection(EndPoint endPoint, SSLEngine engine, Connector connector, List<String> protocols, String defaultProtocol)
-    {
-        super(connector, endPoint, engine, protocols, defaultProtocol);
-        NextProtoNego.put(engine, this);
-    }
-
-    @Override
-    public void unsupported()
-    {
-        protocolSelected(getDefaultProtocol());
-    }
-
-    @Override
-    public List<String> protocols()
-    {
-        return getProtocols();
-    }
-
-    @Override
-    public void protocolSelected(String protocol)
-    {
-        if (LOG.isDebugEnabled())
-            LOG.debug("{} protocol selected {}", this, protocol);
-        setProtocol(protocol != null ? protocol : getDefaultProtocol());
-        NextProtoNego.remove(getSSLEngine());
-    }
-
-    @Override
-    public void close()
-    {
-        NextProtoNego.remove(getSSLEngine());
-        super.close();
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/main/java/org/eclipse/jetty/spdy/server/NPNServerConnectionFactory.java b/jetty-spdy/spdy-server/src/main/java/org/eclipse/jetty/spdy/server/NPNServerConnectionFactory.java
deleted file mode 100644
index e4fab41..0000000
--- a/jetty-spdy/spdy-server/src/main/java/org/eclipse/jetty/spdy/server/NPNServerConnectionFactory.java
+++ /dev/null
@@ -1,61 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server;
-
-import java.util.List;
-import javax.net.ssl.SSLEngine;
-
-import org.eclipse.jetty.io.AbstractConnection;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.npn.NextProtoNego;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.NegotiatingServerConnectionFactory;
-import org.eclipse.jetty.util.annotation.Name;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-public class NPNServerConnectionFactory extends NegotiatingServerConnectionFactory
-{
-    private static final Logger LOG = Log.getLogger(NPNServerConnectionFactory.class);
-
-    public NPNServerConnectionFactory(@Name("protocols") String... protocols)
-    {
-        super("npn", protocols);
-        try
-        {
-            ClassLoader npnClassLoader = NextProtoNego.class.getClassLoader();
-            if (npnClassLoader != null)
-            {
-                LOG.warn("NPN must be in the boot classloader, not in: " + npnClassLoader);
-                throw new IllegalStateException("NPN must be in the boot classloader");
-            }
-        }
-        catch (Throwable x)
-        {
-            LOG.warn("NPN not available: " + x);
-            throw new IllegalStateException("NPN not available", x);
-        }
-    }
-
-    @Override
-    protected AbstractConnection newServerConnection(Connector connector, EndPoint endPoint, SSLEngine engine, List<String> protocols, String defaultProtocol)
-    {
-        return new NPNServerConnection(endPoint, engine, connector, protocols, defaultProtocol);
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/main/java/org/eclipse/jetty/spdy/server/SPDYServerConnectionFactory.java b/jetty-spdy/spdy-server/src/main/java/org/eclipse/jetty/spdy/server/SPDYServerConnectionFactory.java
deleted file mode 100644
index 8bf234f..0000000
--- a/jetty-spdy/spdy-server/src/main/java/org/eclipse/jetty/spdy/server/SPDYServerConnectionFactory.java
+++ /dev/null
@@ -1,245 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Queue;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.eclipse.jetty.io.Connection;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.server.AbstractConnectionFactory;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.spdy.CompressionFactory;
-import org.eclipse.jetty.spdy.FlowControlStrategy;
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.StandardSession;
-import org.eclipse.jetty.spdy.api.GoAwayInfo;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.spdy.client.FlowControlStrategyFactory;
-import org.eclipse.jetty.spdy.client.SPDYConnection;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.spdy.parser.Parser;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.annotation.ManagedAttribute;
-import org.eclipse.jetty.util.annotation.ManagedObject;
-
-@ManagedObject("SPDY Server Connection Factory")
-public class SPDYServerConnectionFactory extends AbstractConnectionFactory
-{
-    /**
-     * @deprecated use {@link #checkProtocolNegotiationAvailable()} instead.
-     */
-    @Deprecated
-    public static void checkNPNAvailable()
-    {
-        checkProtocolNegotiationAvailable();
-    }
-
-    public static void checkProtocolNegotiationAvailable()
-    {
-        if (!isAvailableInBootClassPath("org.eclipse.jetty.alpn.ALPN") &&
-                !isAvailableInBootClassPath("org.eclipse.jetty.npn.NextProtoNego"))
-            throw new IllegalStateException("No ALPN nor NPN classes available");
-    }
-
-    private static boolean isAvailableInBootClassPath(String className)
-    {
-        try
-        {
-            Class<?> klass = ClassLoader.getSystemClassLoader().loadClass(className);
-            if (klass.getClassLoader() != null)
-                throw new IllegalStateException(className + " must be on JVM boot classpath");
-            return true;
-        }
-        catch (ClassNotFoundException x)
-        {
-            return false;
-        }
-    }
-
-    private final Queue<Session> sessions = new ConcurrentLinkedQueue<>();
-    private final short version;
-    private final ServerSessionFrameListener listener;
-    private int initialWindowSize;
-    private boolean dispatchIO;
-
-    public SPDYServerConnectionFactory(int version)
-    {
-        this(version, null);
-    }
-
-    public SPDYServerConnectionFactory(int version, ServerSessionFrameListener listener)
-    {
-        super("spdy/" + version);
-        this.version = (short)version;
-        this.listener = listener;
-        setInitialWindowSize(65536);
-        setDispatchIO(true);
-    }
-
-    @ManagedAttribute("SPDY version")
-    public short getVersion()
-    {
-        return version;
-    }
-
-    public ServerSessionFrameListener getServerSessionFrameListener()
-    {
-        return listener;
-    }
-
-    @Override
-    public Connection newConnection(Connector connector, EndPoint endPoint)
-    {
-        CompressionFactory compressionFactory = new StandardCompressionFactory();
-        Parser parser = new Parser(compressionFactory.newDecompressor());
-        Generator generator = new Generator(connector.getByteBufferPool(), compressionFactory.newCompressor());
-
-        ServerSessionFrameListener listener = provideServerSessionFrameListener(connector, endPoint);
-        SPDYConnection connection = new ServerSPDYConnection(connector, endPoint, parser, listener,
-                isDispatchIO(), getInputBufferSize());
-
-        FlowControlStrategy flowControlStrategy = newFlowControlStrategy(version);
-
-        StandardSession session = new StandardSession(getVersion(), connector.getByteBufferPool(),
-                connector.getScheduler(), connection, endPoint, connection, 2, listener,
-                generator, flowControlStrategy);
-        session.setWindowSize(getInitialWindowSize());
-        parser.addListener(session);
-        connection.setSession(session);
-
-        sessionOpened(session);
-
-        return configure(connection, connector, endPoint);
-    }
-
-    protected FlowControlStrategy newFlowControlStrategy(short version)
-    {
-        return FlowControlStrategyFactory.newFlowControlStrategy(version);
-    }
-
-    protected ServerSessionFrameListener provideServerSessionFrameListener(Connector connector, EndPoint endPoint)
-    {
-        return listener;
-    }
-
-    @ManagedAttribute("Initial Window Size")
-    public int getInitialWindowSize()
-    {
-        return initialWindowSize;
-    }
-
-    public void setInitialWindowSize(int initialWindowSize)
-    {
-        this.initialWindowSize = initialWindowSize;
-    }
-
-    @ManagedAttribute("Dispatch I/O to a pooled thread")
-    public boolean isDispatchIO()
-    {
-        return dispatchIO;
-    }
-
-    public void setDispatchIO(boolean dispatchIO)
-    {
-        this.dispatchIO = dispatchIO;
-    }
-
-    protected boolean sessionOpened(Session session)
-    {
-        // Add sessions only if the connector is not stopping
-        return sessions.offer(session);
-    }
-
-    protected boolean sessionClosed(Session session)
-    {
-        // Remove sessions only if the connector is not stopping
-        // to avoid concurrent removes during iterations
-        return sessions.remove(session);
-    }
-
-    void closeSessions()
-    {
-        for (Session session : sessions)
-            session.goAway(new GoAwayInfo(), Callback.Adapter.INSTANCE);
-        sessions.clear();
-    }
-
-    @Override
-    protected void doStop() throws Exception
-    {
-        closeSessions();
-        super.doStop();
-    }
-
-    public Collection<Session> getSessions()
-    {
-        return Collections.unmodifiableCollection(sessions);
-    }
-
-    @Override
-    protected void dumpThis(Appendable out) throws IOException
-    {
-        super.dumpThis(out);
-        dump(out, "", sessions);
-    }
-
-    private class ServerSPDYConnection extends SPDYConnection implements Runnable
-    {
-        private final ServerSessionFrameListener listener;
-        private final AtomicBoolean connected = new AtomicBoolean();
-
-        private ServerSPDYConnection(Connector connector, EndPoint endPoint, Parser parser,
-                                     ServerSessionFrameListener listener, boolean dispatchIO, int bufferSize)
-        {
-            super(endPoint, connector.getByteBufferPool(), parser, connector.getExecutor(),
-                    dispatchIO, bufferSize);
-            this.listener = listener;
-        }
-
-        @Override
-        public void onOpen()
-        {
-            super.onOpen();
-            if (connected.compareAndSet(false, true))
-                getExecutor().execute(this);
-        }
-
-        @Override
-        public void onClose()
-        {
-            super.onClose();
-            sessionClosed(getSession());
-        }
-
-        @Override
-        public void run()
-        {
-            // NPE guard to support tests
-            if (listener != null)
-                listener.onConnect(getSession());
-        }
-    }
-
-}
diff --git a/jetty-spdy/spdy-server/src/main/java/org/eclipse/jetty/spdy/server/SPDYServerConnector.java b/jetty-spdy/spdy-server/src/main/java/org/eclipse/jetty/spdy/server/SPDYServerConnector.java
deleted file mode 100644
index 5ec6f32..0000000
--- a/jetty-spdy/spdy-server/src/main/java/org/eclipse/jetty/spdy/server/SPDYServerConnector.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server;
-
-import java.util.Objects;
-
-import org.eclipse.jetty.server.HttpConnectionFactory;
-import org.eclipse.jetty.server.NegotiatingServerConnectionFactory;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-
-public class SPDYServerConnector extends ServerConnector
-{
-    public SPDYServerConnector(Server server, ServerSessionFrameListener listener)
-    {
-        super(server, (SslContextFactory)null, new SPDYServerConnectionFactory(SPDY.V2, listener));
-    }
-
-    public SPDYServerConnector(Server server, SslContextFactory sslContextFactory, ServerSessionFrameListener listener)
-    {
-        this(server, sslContextFactory, listener, new NPNServerConnectionFactory("spdy/3", "spdy/2", "http/1.1"));
-    }
-
-    public SPDYServerConnector(Server server, SslContextFactory sslContextFactory, ServerSessionFrameListener listener, NegotiatingServerConnectionFactory negotiator)
-    {
-        super(server, Objects.requireNonNull(sslContextFactory),
-                negotiator,
-                new SPDYServerConnectionFactory(SPDY.V3, listener),
-                new SPDYServerConnectionFactory(SPDY.V2, listener),
-                new HttpConnectionFactory());
-        negotiator.setDefaultProtocol("http/1.1");
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/AbstractTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/AbstractTest.java
deleted file mode 100644
index 56e87d7..0000000
--- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/AbstractTest.java
+++ /dev/null
@@ -1,150 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server;
-
-import java.net.InetSocketAddress;
-import java.util.concurrent.Executor;
-
-import org.eclipse.jetty.server.ConnectionFactory;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.spdy.client.SPDYClient;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.junit.After;
-import org.junit.Rule;
-import org.junit.rules.TestWatcher;
-import org.junit.runner.Description;
-
-public abstract class AbstractTest
-{
-    @Rule
-    public final TestWatcher testName = new TestWatcher()
-    {
-
-        @Override
-        public void starting(Description description)
-        {
-            super.starting(description);
-            System.err.printf("Running %s.%s()%n",
-                    description.getClassName(),
-                    description.getMethodName());
-        }
-    };
-
-    protected final short version = SPDY.V2;
-
-    protected Server server;
-    protected SPDYClient.Factory clientFactory;
-    protected ServerConnector connector;
-
-    protected InetSocketAddress startServer(ServerSessionFrameListener listener) throws Exception
-    {
-        return startServer(version, listener);
-    }
-
-    protected InetSocketAddress startServer(short version, ServerSessionFrameListener listener) throws Exception
-    {
-        if (server == null)
-            server = newServer();
-        if (connector == null)
-            connector = newSPDYServerConnector(server, listener);
-        if (listener == null)
-            listener = connector.getConnectionFactory(SPDYServerConnectionFactory.class).getServerSessionFrameListener();
-
-        ConnectionFactory spdy = new SPDYServerConnectionFactory(version, listener);
-        connector.addConnectionFactory(spdy);
-        connector.setPort(0);
-        server.addConnector(connector);
-
-        if (connector.getConnectionFactory(NPNServerConnectionFactory.class)!=null)
-            connector.getConnectionFactory(NPNServerConnectionFactory.class).setDefaultProtocol(spdy.getProtocol());
-        else
-            connector.setDefaultProtocol(spdy.getProtocol());
-
-        server.start();
-        return new InetSocketAddress("localhost", connector.getLocalPort());
-    }
-
-    protected Server newServer()
-    {
-        QueuedThreadPool pool = new QueuedThreadPool();
-        pool.setName(pool.getName()+"-server");
-        return new Server(pool);
-    }
-
-    protected ServerConnector newSPDYServerConnector(Server server, ServerSessionFrameListener listener)
-    {
-        return new SPDYServerConnector(server, listener);
-    }
-
-    protected Session startClient(InetSocketAddress socketAddress, SessionFrameListener listener) throws Exception
-    {
-        return startClient(version, socketAddress, listener);
-    }
-
-    protected Session startClient(short version, InetSocketAddress socketAddress, SessionFrameListener listener) throws Exception
-    {
-        if (clientFactory == null)
-        {
-            QueuedThreadPool threadPool = new QueuedThreadPool();
-            threadPool.setName(threadPool.getName() + "-client");
-            clientFactory = newSPDYClientFactory(threadPool);
-        }
-        clientFactory.start();
-
-        return clientFactory.newSPDYClient(version).connect(socketAddress, listener);
-    }
-
-    protected SPDYClient.Factory newSPDYClientFactory(Executor threadPool)
-    {
-        return new SPDYClient.Factory(threadPool);
-    }
-
-    protected SslContextFactory newSslContextFactory()
-    {
-        SslContextFactory sslContextFactory = new SslContextFactory();
-        sslContextFactory.setKeyStorePath("src/test/resources/keystore.jks");
-        sslContextFactory.setKeyStorePassword("storepwd");
-        sslContextFactory.setTrustStorePath("src/test/resources/truststore.jks");
-        sslContextFactory.setTrustStorePassword("storepwd");
-        sslContextFactory.setProtocol("TLSv1");
-        sslContextFactory.setIncludeProtocols("TLSv1");
-        return sslContextFactory;
-    }
-
-    @After
-    public void destroy() throws Exception
-    {
-        if (clientFactory != null)
-        {
-            clientFactory.stop();
-        }
-        if (server != null)
-        {
-            server.stop();
-            server.join();
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ClosedStreamTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ClosedStreamTest.java
deleted file mode 100644
index f099414..0000000
--- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ClosedStreamTest.java
+++ /dev/null
@@ -1,273 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server;
-
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.not;
-import static org.junit.Assert.assertThat;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
-import java.nio.channels.ServerSocketChannel;
-import java.nio.channels.SocketChannel;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.api.BytesDataInfo;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.GoAwayInfo;
-import org.eclipse.jetty.spdy.api.GoAwayResultInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionStatus;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StringDataInfo;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.GoAwayFrame;
-import org.eclipse.jetty.spdy.frames.RstStreamFrame;
-import org.eclipse.jetty.spdy.frames.SynReplyFrame;
-import org.eclipse.jetty.spdy.frames.SynStreamFrame;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.spdy.parser.Parser;
-import org.eclipse.jetty.spdy.parser.Parser.Listener;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
-
-public class ClosedStreamTest extends AbstractTest
-{
-    //TODO: Right now it sends a rst as the stream is unknown to the session once it's closed.
-    //TODO: But according to the spec we probably should just ignore the data?!
-    @Test
-    public void testDataSentOnClosedStreamIsIgnored() throws Exception
-    {
-        ServerSocketChannel server = ServerSocketChannel.open();
-        server.bind(new InetSocketAddress("localhost", 0));
-
-        Session session = startClient(new InetSocketAddress("localhost", server.socket().getLocalPort()), null);
-        final CountDownLatch dataLatch = new CountDownLatch(2);
-        session.syn(new SynInfo(new Fields(), true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataLatch.countDown();
-            }
-        });
-
-        SocketChannel channel = server.accept();
-        ByteBuffer readBuffer = ByteBuffer.allocate(1024);
-        channel.read(readBuffer);
-        readBuffer.flip();
-        int streamId = readBuffer.getInt(8);
-
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory.StandardCompressor());
-
-        ByteBuffer writeBuffer = generator.control(new SynReplyFrame(SPDY.V2, (byte)0, streamId, new Fields()));
-        channel.write(writeBuffer);
-        Assert.assertThat(writeBuffer.hasRemaining(), is(false));
-
-        byte[] bytes = new byte[1];
-        writeBuffer = generator.data(streamId, bytes.length, new BytesDataInfo(bytes, true));
-        channel.write(writeBuffer);
-        Assert.assertThat(writeBuffer.hasRemaining(), is(false));
-
-        // Write again to simulate the faulty condition
-        writeBuffer.flip();
-        channel.write(writeBuffer);
-        Assert.assertThat(writeBuffer.hasRemaining(), is(false));
-
-        Assert.assertFalse(dataLatch.await(1, TimeUnit.SECONDS));
-
-        session.goAway(new GoAwayInfo(5, TimeUnit.SECONDS));
-
-        server.close();
-    }
-
-    @Test
-    public void testSendDataOnHalfClosedStreamCausesExceptionOnServer() throws Exception
-    {
-        final CountDownLatch replyReceivedLatch = new CountDownLatch(1);
-        final CountDownLatch clientReceivedDataLatch = new CountDownLatch(1);
-        final CountDownLatch exceptionWhenSendingData = new CountDownLatch(1);
-
-        Session clientSession = startClient(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.reply(new ReplyInfo(true), new Callback.Adapter());
-                try
-                {
-                    replyReceivedLatch.await(5,TimeUnit.SECONDS);
-                }
-                catch (InterruptedException e)
-                {
-                    e.printStackTrace();
-                }
-                try
-                {
-                    stream.data(new StringDataInfo("data send after half closed",false), new Callback.Adapter());
-                }
-                catch (RuntimeException e)
-                {
-                    // we expect an exception here, but we don't want it to be logged
-                    exceptionWhenSendingData.countDown();
-                }
-
-                return null;
-            }
-        }),null);
-
-        Stream stream = clientSession.syn(new SynInfo(new Fields(), false),new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                replyReceivedLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                clientReceivedDataLatch.countDown();
-            }
-        });
-        assertThat("reply has been received by client",replyReceivedLatch.await(5,TimeUnit.SECONDS),is(true));
-        assertThat("stream is half closed from server",stream.isHalfClosed(),is(true));
-        assertThat("client has not received any data sent after stream was half closed by server",
-                clientReceivedDataLatch.await(1,TimeUnit.SECONDS), is(false));
-        assertThat("sending data threw an exception",exceptionWhenSendingData.await(5,TimeUnit.SECONDS), is(true));
-    }
-
-    @Test
-    public void testV2ReceiveDataOnHalfClosedStream() throws Exception
-    {
-        runReceiveDataOnHalfClosedStream(SPDY.V2);
-    }
-
-    @Test
-    @Ignore("until v3 is properly implemented")
-    public void testV3ReceiveDataOnHalfClosedStream() throws Exception
-    {
-        runReceiveDataOnHalfClosedStream(SPDY.V3);
-    }
-
-    private void runReceiveDataOnHalfClosedStream(short version) throws Exception
-    {
-        final CountDownLatch clientResetReceivedLatch = new CountDownLatch(1);
-        final CountDownLatch serverReplySentLatch = new CountDownLatch(1);
-        final CountDownLatch clientReplyReceivedLatch = new CountDownLatch(1);
-        final CountDownLatch serverDataReceivedLatch = new CountDownLatch(1);
-        final CountDownLatch goAwayReceivedLatch = new CountDownLatch(1);
-
-        InetSocketAddress startServer = startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.reply(new ReplyInfo(false), new Callback.Adapter());
-                serverReplySentLatch.countDown();
-                try
-                {
-                    clientReplyReceivedLatch.await(5,TimeUnit.SECONDS);
-                }
-                catch (InterruptedException e)
-                {
-                    e.printStackTrace();
-                }
-                return new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        serverDataReceivedLatch.countDown();
-                    }
-                };
-            }
-            @Override
-            public void onGoAway(Session session, GoAwayResultInfo goAwayInfo)
-            {
-                goAwayReceivedLatch.countDown();
-            }
-        });
-
-        final Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory().newCompressor());
-        int streamId = 1;
-        ByteBuffer synData = generator.control(new SynStreamFrame(version,SynInfo.FLAG_CLOSE, streamId,0,(byte)0,(short)0,new Fields()));
-
-        final SocketChannel socketChannel = SocketChannel.open(startServer);
-        socketChannel.write(synData);
-        assertThat("synData is fully written", synData.hasRemaining(), is(false));
-
-        assertThat("server: push reply is sent",serverReplySentLatch.await(5,TimeUnit.SECONDS),is(true));
-
-        Parser parser = new Parser(new StandardCompressionFactory.StandardDecompressor());
-        parser.addListener(new Listener.Adapter()
-        {
-            @Override
-            public void onControlFrame(ControlFrame frame)
-            {
-                if (frame instanceof SynReplyFrame)
-                {
-                    SynReplyFrame synReplyFrame = (SynReplyFrame)frame;
-                    clientReplyReceivedLatch.countDown();
-                    int streamId = synReplyFrame.getStreamId();
-                    ByteBuffer data = generator.data(streamId,0,new StringDataInfo("data",false));
-                    try
-                    {
-                        socketChannel.write(data);
-                    }
-                    catch (IOException e)
-                    {
-                        e.printStackTrace();
-                    }
-                }
-                else if (frame instanceof RstStreamFrame)
-                {
-                    clientResetReceivedLatch.countDown();
-                }
-            }
-        });
-        ByteBuffer response = ByteBuffer.allocate(28);
-        socketChannel.read(response);
-        response.flip();
-        parser.parse(response);
-
-        assertThat("server didn't receive data",serverDataReceivedLatch.await(1,TimeUnit.SECONDS),not(true));
-        assertThat("client didn't receive reset",clientResetReceivedLatch.await(1,TimeUnit.SECONDS),not(true));
-
-        ByteBuffer buffer = generator.control(new GoAwayFrame(version, streamId, SessionStatus.OK.getCode()));
-        socketChannel.write(buffer);
-        Assert.assertThat(buffer.hasRemaining(), is(false));
-
-        assertThat("GoAway frame is received by server", goAwayReceivedLatch.await(5,TimeUnit.SECONDS), is(true));
-
-        socketChannel.close();
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/FlowControlTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/FlowControlTest.java
deleted file mode 100644
index 6dfc9e8..0000000
--- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/FlowControlTest.java
+++ /dev/null
@@ -1,493 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server;
-
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.nio.ByteBuffer;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Exchanger;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.eclipse.jetty.spdy.api.ByteBufferDataInfo;
-import org.eclipse.jetty.spdy.api.BytesDataInfo;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.SPDYException;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.api.Settings;
-import org.eclipse.jetty.spdy.api.SettingsInfo;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.FutureCallback;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class FlowControlTest extends AbstractTest
-{
-    @Test
-    public void testFlowControlWithConcurrentSettings() throws Exception
-    {
-        // Initial window is 64 KiB. We allow the client to send 1024 B
-        // then we change the window to 512 B. At this point, the client
-        // must stop sending data (although the initial window allows it)
-
-        final int size = 512;
-        final AtomicReference<DataInfo> dataInfoRef = new AtomicReference<>();
-        final CountDownLatch dataLatch = new CountDownLatch(2);
-        final CountDownLatch settingsLatch = new CountDownLatch(1);
-        Session session = startClient(SPDY.V3, startServer(SPDY.V3, new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.reply(new ReplyInfo(true), new Callback.Adapter());
-                return new StreamFrameListener.Adapter()
-                {
-                    private final AtomicInteger dataFrames = new AtomicInteger();
-
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        int dataFrameCount = dataFrames.incrementAndGet();
-                        if (dataFrameCount == 1)
-                        {
-                            dataInfoRef.set(dataInfo);
-                            Settings settings = new Settings();
-                            settings.put(new Settings.Setting(Settings.ID.INITIAL_WINDOW_SIZE, size));
-                            stream.getSession().settings(new SettingsInfo(settings), new FutureCallback());
-                        }
-                        else if (dataFrameCount > 1)
-                        {
-                            dataInfo.consume(dataInfo.length());
-                            dataLatch.countDown();
-                        }
-                    }
-                };
-            }
-        }), new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onSettings(Session session, SettingsInfo settingsInfo)
-            {
-                settingsLatch.countDown();
-            }
-        });
-
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), null);
-        stream.data(new BytesDataInfo(new byte[size * 2], false));
-        settingsLatch.await(5, TimeUnit.SECONDS);
-
-        // Send the second chunk of data, must not arrive since we're flow control stalled now
-        stream.data(new BytesDataInfo(new byte[size * 2], true), new Callback.Adapter());
-        Assert.assertFalse(dataLatch.await(1, TimeUnit.SECONDS));
-
-        // Consume the data arrived to server, this will resume flow control
-        DataInfo dataInfo = dataInfoRef.get();
-        dataInfo.consume(dataInfo.length());
-
-        Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testServerFlowControlOneBigWrite() throws Exception
-    {
-        final int windowSize = 1536;
-        final int length = 5 * windowSize;
-        final CountDownLatch settingsLatch = new CountDownLatch(1);
-        Session session = startClient(SPDY.V3, startServer(SPDY.V3, new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public void onSettings(Session session, SettingsInfo settingsInfo)
-            {
-                settingsLatch.countDown();
-            }
-
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.reply(new ReplyInfo(false), new Callback.Adapter());
-                stream.data(new BytesDataInfo(new byte[length], true), new Callback.Adapter());
-                return null;
-            }
-        }), null);
-
-        Settings settings = new Settings();
-        settings.put(new Settings.Setting(Settings.ID.INITIAL_WINDOW_SIZE, windowSize));
-        session.settings(new SettingsInfo(settings));
-
-        Assert.assertTrue(settingsLatch.await(5, TimeUnit.SECONDS));
-
-        final Exchanger<DataInfo> exchanger = new Exchanger<>();
-        session.syn(new SynInfo(new Fields(), true), new StreamFrameListener.Adapter()
-        {
-            private AtomicInteger dataFrames = new AtomicInteger();
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                try
-                {
-                    int dataFrames = this.dataFrames.incrementAndGet();
-                    if (dataFrames == 1)
-                    {
-                        // Do not consume nor read from the data frame.
-                        // We should then be flow-control stalled
-                        exchanger.exchange(dataInfo);
-                    }
-                    else if (dataFrames == 2)
-                    {
-                        // Read but not consume, we should be flow-control stalled
-                        dataInfo.asByteBuffer(false);
-                        exchanger.exchange(dataInfo);
-                    }
-                    else if (dataFrames == 3)
-                    {
-                        // Consume partially, we should be flow-control stalled
-                        dataInfo.consumeInto(ByteBuffer.allocate(dataInfo.length() / 2));
-                        exchanger.exchange(dataInfo);
-                    }
-                    else if (dataFrames == 4 || dataFrames == 5)
-                    {
-                        // Consume totally
-                        dataInfo.asByteBuffer(true);
-                        exchanger.exchange(dataInfo);
-                    }
-                    else
-                    {
-                        Assert.fail();
-                    }
-                }
-                catch (InterruptedException x)
-                {
-                    throw new SPDYException(x);
-                }
-            }
-        });
-
-        DataInfo dataInfo = exchanger.exchange(null, 5, TimeUnit.SECONDS);
-        checkThatWeAreFlowControlStalled(exchanger);
-
-        Assert.assertEquals(windowSize, dataInfo.available());
-        Assert.assertEquals(0, dataInfo.consumed());
-        dataInfo.asByteBuffer(true);
-
-        dataInfo = exchanger.exchange(null, 5, TimeUnit.SECONDS);
-        checkThatWeAreFlowControlStalled(exchanger);
-
-        Assert.assertEquals(0, dataInfo.available());
-        Assert.assertEquals(0, dataInfo.consumed());
-        dataInfo.consume(dataInfo.length());
-
-        dataInfo = exchanger.exchange(null, 5, TimeUnit.SECONDS);
-        checkThatWeAreFlowControlStalled(exchanger);
-
-        Assert.assertEquals(dataInfo.length() / 2, dataInfo.consumed());
-        dataInfo.asByteBuffer(true);
-
-        dataInfo = exchanger.exchange(null, 5, TimeUnit.SECONDS);
-        Assert.assertEquals(dataInfo.length(), dataInfo.consumed());
-        // Check that we are not flow control stalled
-        dataInfo = exchanger.exchange(null, 5, TimeUnit.SECONDS);
-        Assert.assertEquals(dataInfo.length(), dataInfo.consumed());
-    }
-
-    @Test
-    public void testClientFlowControlOneBigWrite() throws Exception
-    {
-        final int windowSize = 1536;
-        final Exchanger<DataInfo> exchanger = new Exchanger<>();
-        final CountDownLatch settingsLatch = new CountDownLatch(1);
-        Session session = startClient(SPDY.V3, startServer(SPDY.V3, new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public void onConnect(Session session)
-            {
-                Settings settings = new Settings();
-                settings.put(new Settings.Setting(Settings.ID.INITIAL_WINDOW_SIZE, windowSize));
-                session.settings(new SettingsInfo(settings), new FutureCallback());
-            }
-
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.reply(new ReplyInfo(false), new Callback.Adapter());
-                return new StreamFrameListener.Adapter()
-                {
-                    private AtomicInteger dataFrames = new AtomicInteger();
-
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        try
-                        {
-                            int dataFrames = this.dataFrames.incrementAndGet();
-                            if (dataFrames == 1)
-                            {
-                                // Do not consume nor read from the data frame.
-                                // We should then be flow-control stalled
-                                exchanger.exchange(dataInfo);
-                            }
-                            else if (dataFrames == 2)
-                            {
-                                // Read but not consume, we should be flow-control stalled
-                                dataInfo.asByteBuffer(false);
-                                exchanger.exchange(dataInfo);
-                            }
-                            else if (dataFrames == 3)
-                            {
-                                // Consume partially, we should be flow-control stalled
-                                dataInfo.consumeInto(ByteBuffer.allocate(dataInfo.length() / 2));
-                                exchanger.exchange(dataInfo);
-                            }
-                            else if (dataFrames == 4 || dataFrames == 5)
-                            {
-                                // Consume totally
-                                dataInfo.asByteBuffer(true);
-                                exchanger.exchange(dataInfo);
-                            }
-                            else
-                            {
-                                Assert.fail();
-                            }
-                        }
-                        catch (InterruptedException x)
-                        {
-                            throw new SPDYException(x);
-                        }
-                    }
-                };
-            }
-        }), new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onSettings(Session session, SettingsInfo settingsInfo)
-            {
-                settingsLatch.countDown();
-            }
-        });
-
-        Assert.assertTrue(settingsLatch.await(5, TimeUnit.SECONDS));
-
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), null);
-        final int length = 5 * windowSize;
-        stream.data(new BytesDataInfo(new byte[length], true), new Callback.Adapter());
-
-        DataInfo dataInfo = exchanger.exchange(null, 5, TimeUnit.SECONDS);
-        checkThatWeAreFlowControlStalled(exchanger);
-
-        Assert.assertEquals(windowSize, dataInfo.available());
-        Assert.assertEquals(0, dataInfo.consumed());
-        dataInfo.asByteBuffer(true);
-
-        dataInfo = exchanger.exchange(null, 5, TimeUnit.SECONDS);
-        checkThatWeAreFlowControlStalled(exchanger);
-
-        Assert.assertEquals(0, dataInfo.available());
-        Assert.assertEquals(0, dataInfo.consumed());
-        dataInfo.consume(dataInfo.length());
-
-        dataInfo = exchanger.exchange(null, 5, TimeUnit.SECONDS);
-        checkThatWeAreFlowControlStalled(exchanger);
-
-        Assert.assertEquals(dataInfo.length() / 2, dataInfo.consumed());
-        dataInfo.asByteBuffer(true);
-
-        dataInfo = exchanger.exchange(null, 5, TimeUnit.SECONDS);
-        Assert.assertEquals(dataInfo.length(), dataInfo.consumed());
-        // Check that we are not flow control stalled
-        dataInfo = exchanger.exchange(null, 5, TimeUnit.SECONDS);
-        Assert.assertEquals(dataInfo.length(), dataInfo.consumed());
-    }
-
-    @Test
-    public void testStreamsStalledDoesNotStallOtherStreams() throws Exception
-    {
-        final int windowSize = 1024;
-        final CountDownLatch settingsLatch = new CountDownLatch(1);
-        Session session = startClient(SPDY.V3, startServer(SPDY.V3, new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public void onSettings(Session session, SettingsInfo settingsInfo)
-            {
-                settingsLatch.countDown();
-            }
-
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.reply(new ReplyInfo(false), new Callback.Adapter());
-                stream.data(new BytesDataInfo(new byte[windowSize * 2], true), new Callback.Adapter());
-                return null;
-            }
-        }), null);
-        Settings settings = new Settings();
-        settings.put(new Settings.Setting(Settings.ID.INITIAL_WINDOW_SIZE, windowSize));
-        session.settings(new SettingsInfo(settings));
-
-        Assert.assertTrue(settingsLatch.await(5, TimeUnit.SECONDS));
-
-        final CountDownLatch latch = new CountDownLatch(3);
-        final AtomicReference<DataInfo> dataInfoRef1 = new AtomicReference<>();
-        final AtomicReference<DataInfo> dataInfoRef2 = new AtomicReference<>();
-        session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), true, (byte)0), new StreamFrameListener.Adapter()
-        {
-            private final AtomicInteger dataFrames = new AtomicInteger();
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                int frames = dataFrames.incrementAndGet();
-                if (frames == 1)
-                {
-                    // Do not consume it to stall flow control
-                    dataInfoRef1.set(dataInfo);
-                }
-                else
-                {
-                    dataInfo.consume(dataInfo.length());
-                    if (dataInfo.isClose())
-                        latch.countDown();
-                }
-            }
-        });
-        session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), true, (byte)0), new StreamFrameListener.Adapter()
-        {
-            private final AtomicInteger dataFrames = new AtomicInteger();
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                int frames = dataFrames.incrementAndGet();
-                if (frames == 1)
-                {
-                    // Do not consume it to stall flow control
-                    dataInfoRef2.set(dataInfo);
-                }
-                else
-                {
-                    dataInfo.consume(dataInfo.length());
-                    if (dataInfo.isClose())
-                        latch.countDown();
-                }
-            }
-        });
-        session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), true, (byte)0), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                DataInfo dataInfo1 = dataInfoRef1.getAndSet(null);
-                if (dataInfo1 != null)
-                    dataInfo1.consume(dataInfo1.length());
-                DataInfo dataInfo2 = dataInfoRef2.getAndSet(null);
-                if (dataInfo2 != null)
-                    dataInfo2.consume(dataInfo2.length());
-                dataInfo.consume(dataInfo.length());
-                if (dataInfo.isClose())
-                    latch.countDown();
-            }
-        });
-
-        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testSendBigFileWithoutFlowControl() throws Exception
-    {
-        testSendBigFile(SPDY.V2);
-    }
-
-    @Test
-    public void testSendBigFileWithFlowControl() throws Exception
-    {
-        testSendBigFile(SPDY.V3);
-    }
-
-    private void testSendBigFile(short version) throws Exception
-    {
-        final int dataSize = 1024 * 1024;
-        final ByteBufferDataInfo bigByteBufferDataInfo = new ByteBufferDataInfo(ByteBuffer.allocate(dataSize),false);
-        final CountDownLatch allDataReceivedLatch = new CountDownLatch(1);
-
-        Session session = startClient(version, startServer(version, new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.reply(new ReplyInfo(false), new Callback.Adapter());
-                stream.data(bigByteBufferDataInfo, new Callback.Adapter());
-                return null;
-            }
-        }),new SessionFrameListener.Adapter());
-
-        session.syn(new SynInfo(new Fields(), false),new StreamFrameListener.Adapter()
-        {
-            private int dataBytesReceived;
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataBytesReceived = dataBytesReceived + dataInfo.length();
-                dataInfo.consume(dataInfo.length());
-                if (dataBytesReceived == dataSize)
-                    allDataReceivedLatch.countDown();
-            }
-        });
-
-        assertThat("all data bytes have been received by the client", allDataReceivedLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    private void checkThatWeAreFlowControlStalled(final Exchanger<DataInfo> exchanger)
-    {
-        expectException(TimeoutException.class, new Callable<DataInfo>()
-        {
-            @Override
-            public DataInfo call() throws Exception
-            {
-                return exchanger.exchange(null, 1, TimeUnit.SECONDS);
-            }
-        });
-    }
-
-    private void expectException(Class<? extends Exception> exception, Callable<DataInfo> command)
-    {
-        try
-        {
-            command.call();
-            Assert.fail();
-        }
-        catch (Exception x)
-        {
-            Assert.assertSame(exception, x.getClass());
-        }
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/GoAwayTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/GoAwayTest.java
deleted file mode 100644
index 9bf8aea..0000000
--- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/GoAwayTest.java
+++ /dev/null
@@ -1,234 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.GoAwayInfo;
-import org.eclipse.jetty.spdy.api.GoAwayResultInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.api.SessionStatus;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StringDataInfo;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.FutureCallback;
-import org.eclipse.jetty.util.FuturePromise;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class GoAwayTest extends AbstractTest
-{
-    @Test
-    public void testServerReceivesGoAwayOnClientGoAway() throws Exception
-    {
-        final CountDownLatch latch = new CountDownLatch(1);
-        ServerSessionFrameListener serverSessionFrameListener = new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.reply(new ReplyInfo(true), new Callback.Adapter());
-                return null;
-            }
-
-            @Override
-            public void onGoAway(Session session, GoAwayResultInfo goAwayInfo)
-            {
-                Assert.assertEquals(0, goAwayInfo.getLastStreamId());
-                Assert.assertSame(SessionStatus.OK, goAwayInfo.getSessionStatus());
-                latch.countDown();
-            }
-        };
-        Session session = startClient(startServer(serverSessionFrameListener), null);
-
-        session.syn(new SynInfo(new Fields(), true), null);
-
-        session.goAway(new GoAwayInfo());
-
-        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testClientReceivesGoAwayOnServerGoAway() throws Exception
-    {
-        ServerSessionFrameListener serverSessionFrameListener = new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.reply(new ReplyInfo(true), new Callback.Adapter());
-                stream.getSession().goAway(new GoAwayInfo(), new FutureCallback());
-                return null;
-            }
-        };
-        final AtomicReference<GoAwayResultInfo> ref = new AtomicReference<>();
-        final CountDownLatch latch = new CountDownLatch(1);
-        SessionFrameListener clientSessionFrameListener = new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onGoAway(Session session, GoAwayResultInfo goAwayInfo)
-            {
-                ref.set(goAwayInfo);
-                latch.countDown();
-            }
-        };
-        Session session = startClient(startServer(serverSessionFrameListener), clientSessionFrameListener);
-
-        Stream stream1 = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), true, (byte)0), null);
-
-        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
-        GoAwayResultInfo goAwayResultInfo = ref.get();
-        Assert.assertNotNull(goAwayResultInfo);
-        Assert.assertEquals(stream1.getId(), goAwayResultInfo.getLastStreamId());
-        Assert.assertSame(SessionStatus.OK, goAwayResultInfo.getSessionStatus());
-    }
-
-    @Test
-    public void testSynStreamIgnoredAfterGoAway() throws Exception
-    {
-        final CountDownLatch latch = new CountDownLatch(1);
-        ServerSessionFrameListener serverSessionFrameListener = new ServerSessionFrameListener.Adapter()
-        {
-            private final AtomicInteger syns = new AtomicInteger();
-
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                int synCount = syns.incrementAndGet();
-                if (synCount == 1)
-                {
-                    stream.reply(new ReplyInfo(true), new Callback.Adapter());
-                    stream.getSession().goAway(new GoAwayInfo(), new FutureCallback());
-                }
-                else
-                {
-                    latch.countDown();
-                }
-                return null;
-            }
-        };
-        SessionFrameListener clientSessionFrameListener = new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onGoAway(Session session, GoAwayResultInfo goAwayInfo)
-            {
-                session.syn(new SynInfo(new Fields(), true), null, new FuturePromise<Stream>());
-            }
-        };
-        Session session = startClient(startServer(serverSessionFrameListener), clientSessionFrameListener);
-
-        session.syn(new SynInfo(new Fields(), true), null);
-
-        Assert.assertFalse(latch.await(1, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testDataNotProcessedAfterGoAway() throws Exception
-    {
-        final CountDownLatch closeLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-        ServerSessionFrameListener serverSessionFrameListener = new ServerSessionFrameListener.Adapter()
-        {
-            private AtomicInteger syns = new AtomicInteger();
-
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.reply(new ReplyInfo(true), new Callback.Adapter());
-                int synCount = syns.incrementAndGet();
-                if (synCount == 1)
-                {
-                    return null;
-                }
-                else
-                {
-                    stream.getSession().goAway(new GoAwayInfo(), new FutureCallback());
-                    closeLatch.countDown();
-                    return new StreamFrameListener.Adapter()
-                    {
-                        @Override
-                        public void onData(Stream stream, DataInfo dataInfo)
-                        {
-                            dataLatch.countDown();
-                        }
-                    };
-                }
-            }
-        };
-        final AtomicReference<GoAwayResultInfo> goAwayRef = new AtomicReference<>();
-        final CountDownLatch goAwayLatch = new CountDownLatch(1);
-        SessionFrameListener clientSessionFrameListener = new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onGoAway(Session session, GoAwayResultInfo goAwayInfo)
-            {
-                goAwayRef.set(goAwayInfo);
-                goAwayLatch.countDown();
-            }
-        };
-        Session session = startClient(startServer(serverSessionFrameListener), clientSessionFrameListener);
-
-        // First stream is processed ok
-        final CountDownLatch reply1Latch = new CountDownLatch(1);
-        session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), true, (byte)0), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                reply1Latch.countDown();
-            }
-        });
-        Assert.assertTrue(reply1Latch.await(5, TimeUnit.SECONDS));
-
-        // Second stream is closed in the middle
-        Stream stream2 = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), null);
-        Assert.assertTrue(closeLatch.await(5, TimeUnit.SECONDS));
-
-        // There is a race between the data we want to send, and the client
-        // closing the connection because the server closed it after the
-        // go_away, so we guard with a try/catch to have the test pass cleanly
-        try
-        {
-            stream2.data(new StringDataInfo("foo", true));
-            Assert.assertFalse(dataLatch.await(1, TimeUnit.SECONDS));
-        }
-        catch (ExecutionException x)
-        {
-            // doesn't matter which exception we get, it's important that the data is not been written and the
-            // previous assertion is true
-        }
-
-        // The last good stream is the second, because it was received by the server
-        Assert.assertTrue(goAwayLatch.await(5, TimeUnit.SECONDS));
-        GoAwayResultInfo goAway = goAwayRef.get();
-        Assert.assertNotNull(goAway);
-        Assert.assertEquals(stream2.getId(), goAway.getLastStreamId());
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/HeadersTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/HeadersTest.java
deleted file mode 100644
index afc3172..0000000
--- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/HeadersTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.spdy.api.HeadersInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class HeadersTest extends AbstractTest
-{
-    @Test
-    public void testHeaders() throws Exception
-    {
-        ServerSessionFrameListener serverSessionFrameListener = new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.reply(new ReplyInfo(false), new Callback.Adapter());
-                return new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onHeaders(Stream stream, HeadersInfo headersInfo)
-                    {
-                        Assert.assertTrue(stream.isHalfClosed());
-                        stream.headers(new HeadersInfo(new Fields(), true), new Callback.Adapter());
-                        Assert.assertTrue(stream.isClosed());
-                    }
-                };
-            }
-        };
-
-        Session session = startClient(startServer(serverSessionFrameListener), null);
-
-        final CountDownLatch latch = new CountDownLatch(1);
-        session.syn(new SynInfo(new Fields(), false), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Fields headers = new Fields();
-                headers.put("foo", "bar");
-                headers.put("baz", "woo");
-                stream.headers(new HeadersInfo(headers, true), new Callback.Adapter());
-                Assert.assertTrue(stream.isHalfClosed());
-            }
-
-            @Override
-            public void onHeaders(Stream stream, HeadersInfo headersInfo)
-            {
-                Assert.assertTrue(stream.isClosed());
-                latch.countDown();
-            }
-        });
-
-        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/IdleTimeoutTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/IdleTimeoutTest.java
deleted file mode 100644
index c0e436a..0000000
--- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/IdleTimeoutTest.java
+++ /dev/null
@@ -1,257 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server;
-
-import java.net.InetSocketAddress;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.spdy.api.GoAwayResultInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.spdy.client.SPDYClient;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class IdleTimeoutTest extends AbstractTest
-{
-    private final int idleTimeout = 1000;
-
-    @Test
-    public void testServerEnforcingIdleTimeout() throws Exception
-    {
-        server = newServer();
-        connector = newSPDYServerConnector(server, new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.reply(new ReplyInfo(true), new Callback.Adapter());
-                return null;
-            }
-        });
-        connector.setIdleTimeout(idleTimeout);
-
-        final CountDownLatch latch = new CountDownLatch(1);
-        Session session = startClient(startServer(null), new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onGoAway(Session session, GoAwayResultInfo goAwayInfo)
-            {
-                latch.countDown();
-            }
-        });
-
-        session.syn(new SynInfo(new Fields(), true), null);
-
-        Assert.assertTrue(latch.await(2 * idleTimeout, TimeUnit.MILLISECONDS));
-    }
-
-    @Test
-    public void testServerEnforcingIdleTimeoutWithUnrespondedStream() throws Exception
-    {
-        server = newServer();
-        connector = newSPDYServerConnector(server, null);
-        connector.setIdleTimeout(idleTimeout);
-
-        final CountDownLatch latch = new CountDownLatch(1);
-        Session session = startClient(startServer(null), new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onGoAway(Session session, GoAwayResultInfo goAwayInfo)
-            {
-                latch.countDown();
-            }
-        });
-
-        // The SYN is not replied, and the server should idle timeout
-        session.syn(new SynInfo(new Fields(), true), null);
-
-        Assert.assertTrue(latch.await(2 * idleTimeout, TimeUnit.MILLISECONDS));
-    }
-
-    @Test
-    public void testServerNotEnforcingIdleTimeoutWithPendingStream() throws Exception
-    {
-        server = newServer();
-        connector = newSPDYServerConnector(server, new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                try
-                {
-                    Thread.sleep(2 * idleTimeout);
-                    stream.reply(new ReplyInfo(true), new Callback.Adapter());
-                    return null;
-                }
-                catch (InterruptedException x)
-                {
-                    Assert.fail();
-                    return null;
-                }
-            }
-        });
-        connector.setIdleTimeout(idleTimeout);
-
-        final CountDownLatch goAwayLatch = new CountDownLatch(1);
-        Session session = startClient(startServer(null), new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onGoAway(Session session, GoAwayResultInfo goAwayInfo)
-            {
-                goAwayLatch.countDown();
-            }
-        });
-
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(new Fields(), true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                replyLatch.countDown();
-            }
-        });
-
-        Assert.assertTrue(replyLatch.await(3 * idleTimeout, TimeUnit.MILLISECONDS));
-
-        // Just make sure onGoAway has never been called, but don't wait too much
-        Assert.assertFalse(goAwayLatch.await(idleTimeout / 2, TimeUnit.MILLISECONDS));
-    }
-
-    @Test
-    public void testClientEnforcingIdleTimeout() throws Exception
-    {
-        final CountDownLatch latch = new CountDownLatch(1);
-        InetSocketAddress address = startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.reply(new ReplyInfo(true), new Callback.Adapter());
-                return null;
-            }
-
-            @Override
-            public void onGoAway(Session session, GoAwayResultInfo goAwayInfo)
-            {
-                latch.countDown();
-            }
-        });
-
-        QueuedThreadPool threadPool = new QueuedThreadPool();
-        threadPool.setName(threadPool.getName() + "-client");
-        clientFactory = newSPDYClientFactory(threadPool);
-        clientFactory.start();
-        SPDYClient client = clientFactory.newSPDYClient(SPDY.V2);
-        client.setIdleTimeout(idleTimeout);
-        Session session = client.connect(address, null);
-
-        session.syn(new SynInfo(new Fields(), true), null);
-
-        Assert.assertTrue(latch.await(2 * idleTimeout, TimeUnit.MILLISECONDS));
-    }
-
-    @Test
-    public void testClientEnforcingIdleTimeoutWithUnrespondedStream() throws Exception
-    {
-        final CountDownLatch latch = new CountDownLatch(1);
-        InetSocketAddress address = startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public void onGoAway(Session session, GoAwayResultInfo goAwayInfo)
-            {
-                latch.countDown();
-            }
-        });
-
-        QueuedThreadPool threadPool = new QueuedThreadPool();
-        threadPool.setName(threadPool.getName() + "-client");
-        clientFactory = newSPDYClientFactory(threadPool);
-        clientFactory.start();
-        SPDYClient client = clientFactory.newSPDYClient(SPDY.V2);
-        client.setIdleTimeout(idleTimeout);
-        Session session = client.connect(address, null);
-
-        session.syn(new SynInfo(new Fields(), true), null);
-
-        Assert.assertTrue(latch.await(2 * idleTimeout, TimeUnit.MILLISECONDS));
-    }
-
-    @Test
-    public void testClientNotEnforcingIdleTimeoutWithPendingStream() throws Exception
-    {
-        final CountDownLatch latch = new CountDownLatch(1);
-        InetSocketAddress address = startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.reply(new ReplyInfo(true), new Callback.Adapter());
-                return null;
-            }
-
-            @Override
-            public void onGoAway(Session session, GoAwayResultInfo goAwayInfo)
-            {
-                latch.countDown();
-            }
-        });
-
-        QueuedThreadPool threadPool = new QueuedThreadPool();
-        threadPool.setName(threadPool.getName() + "-client");
-        clientFactory = newSPDYClientFactory(threadPool);
-        clientFactory.start();
-        SPDYClient client = clientFactory.newSPDYClient(SPDY.V2);
-        client.setIdleTimeout(idleTimeout);
-        Session session = client.connect(address, null);
-
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        session.syn(new SynInfo(new Fields(), true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                try
-                {
-                    Thread.sleep(2 * idleTimeout);
-                    replyLatch.countDown();
-                }
-                catch (InterruptedException e)
-                {
-                    Assert.fail();
-                }
-            }
-        });
-
-        Assert.assertFalse(latch.await(2 * idleTimeout, TimeUnit.MILLISECONDS));
-        Assert.assertTrue(replyLatch.await(3 * idleTimeout, TimeUnit.MILLISECONDS));
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/MaxConcurrentStreamTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/MaxConcurrentStreamTest.java
deleted file mode 100644
index c6caee3..0000000
--- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/MaxConcurrentStreamTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server;
-
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-import org.eclipse.jetty.spdy.api.ByteBufferDataInfo;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.api.Settings;
-import org.eclipse.jetty.spdy.api.SettingsInfo;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.Fields;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-public class MaxConcurrentStreamTest extends AbstractTest
-{
-    @Test
-    public void testMaxConcurrentStreamsSetByServer() throws Exception, ExecutionException
-    {
-        final CountDownLatch settingsReceivedLatch = new CountDownLatch(1);
-        final CountDownLatch dataReceivedLatch = new CountDownLatch(1);
-
-        Session session = startClient(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public void onConnect(Session session)
-            {
-                Settings settings = new Settings();
-                settings.put(new Settings.Setting(Settings.ID.MAX_CONCURRENT_STREAMS, 1));
-                try
-                {
-                    session.settings(new SettingsInfo(settings));
-                }
-                catch (ExecutionException | InterruptedException | TimeoutException e)
-                {
-                    e.printStackTrace();
-                }
-            }
-
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                try
-                {
-                    stream.reply(new ReplyInfo(true));
-                }
-                catch (ExecutionException | InterruptedException | TimeoutException e)
-                {
-                    e.printStackTrace();
-                }
-                return new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        dataReceivedLatch.countDown();
-                    }
-                };
-            }
-        }), new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onSettings(Session session, SettingsInfo settingsInfo)
-            {
-                settingsReceivedLatch.countDown();
-            }
-        });
-
-        assertThat("Settings frame received", settingsReceivedLatch.await(5, TimeUnit.SECONDS), is(true));
-
-        SynInfo synInfo = new SynInfo(new Fields(), false);
-        Stream stream = session.syn(synInfo, null);
-
-        boolean failed = false;
-        try
-        {
-            session.syn(synInfo, null);
-        }
-        catch (ExecutionException | InterruptedException | TimeoutException e)
-        {
-            failed = true;
-        }
-
-        assertThat("Opening second stream failed", failed, is(true));
-
-        stream.data(new ByteBufferDataInfo(BufferUtil.EMPTY_BUFFER, true));
-        assertThat("Data has been received on first stream.", dataReceivedLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/PingTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/PingTest.java
deleted file mode 100644
index c7bcd59..0000000
--- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/PingTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.eclipse.jetty.spdy.api.PingInfo;
-import org.eclipse.jetty.spdy.api.PingResultInfo;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.util.Promise;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class PingTest extends AbstractTest
-{
-    @Test
-    public void testPingPong() throws Exception
-    {
-        final AtomicReference<PingResultInfo> ref = new AtomicReference<>();
-        final CountDownLatch latch = new CountDownLatch(1);
-        SessionFrameListener clientSessionFrameListener = new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onPing(Session session, PingResultInfo pingInfo)
-            {
-                ref.set(pingInfo);
-                latch.countDown();
-            }
-        };
-        Session session = startClient(startServer(null), clientSessionFrameListener);
-        PingResultInfo pingResultInfo = session.ping(new PingInfo(5, TimeUnit.SECONDS));
-        Assert.assertEquals(1, pingResultInfo.getPingId() % 2);
-
-        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
-        PingResultInfo pongInfo = ref.get();
-        Assert.assertNotNull(pongInfo);
-        Assert.assertEquals(pingResultInfo.getPingId(), pongInfo.getPingId());
-    }
-
-    @Test
-    public void testServerPingPong() throws Exception
-    {
-        final CountDownLatch pingReceived = new CountDownLatch(1);
-        ServerSessionFrameListener serverSessionFrameListener = new ServerSessionFrameListener.Adapter()
-        {
-            private final CountDownLatch pingSent = new CountDownLatch(1);
-            private int pingId;
-
-            @Override
-            public void onConnect(Session session)
-            {
-                session.ping(new PingInfo(), new Promise.Adapter<PingResultInfo>()
-                {
-                    @Override
-                    public void succeeded(PingResultInfo pingInfo)
-                    {
-                        pingId = pingInfo.getPingId();
-                        pingSent.countDown();
-                    }
-                });
-            }
-
-            @Override
-            public void onPing(Session session, PingResultInfo pingInfo)
-            {
-                try
-                {
-                    // This callback may be notified before the promise above,
-                    // so make sure we wait here to know the pingId
-                    Assert.assertTrue(pingSent.await(5, TimeUnit.SECONDS));
-                    Assert.assertEquals(0, pingInfo.getPingId() % 2);
-                    Assert.assertEquals(pingId, pingInfo.getPingId());
-                    pingReceived.countDown();
-                }
-                catch (InterruptedException x)
-                {
-                    Assert.fail();
-                }
-            }
-        };
-        startClient(startServer(serverSessionFrameListener), null);
-
-        Assert.assertTrue(pingReceived.await(5, TimeUnit.SECONDS));
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ProtocolViolationsTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ProtocolViolationsTest.java
deleted file mode 100644
index 96cc112..0000000
--- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ProtocolViolationsTest.java
+++ /dev/null
@@ -1,185 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server;
-
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
-import java.nio.channels.ServerSocketChannel;
-import java.nio.channels.SocketChannel;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.api.BytesDataInfo;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.GoAwayInfo;
-import org.eclipse.jetty.spdy.api.HeadersInfo;
-import org.eclipse.jetty.spdy.api.RstInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.spdy.api.StringDataInfo;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.spdy.frames.ControlFrameType;
-import org.eclipse.jetty.spdy.frames.SynReplyFrame;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class ProtocolViolationsTest extends AbstractTest
-{
-    @Test
-    public void testSendDataBeforeReplyIsIllegal() throws Exception
-    {
-        final CountDownLatch resetLatch = new CountDownLatch(1);
-        final CountDownLatch latch = new CountDownLatch(1);
-        Session session = startClient(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                try
-                {
-                    stream.data(new StringDataInfo("failure", true), new Callback.Adapter());
-                    return null;
-                }
-                catch (IllegalStateException x)
-                {
-                    latch.countDown();
-                    return null;
-                }
-            }
-        }), new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onRst(Session session, RstInfo rstInfo)
-            {
-                Assert.assertSame(StreamStatus.PROTOCOL_ERROR, rstInfo.getStreamStatus());
-                resetLatch.countDown();
-            }
-        });
-        session.syn(new SynInfo(new Fields(), true), null);
-        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(resetLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testReceiveDataBeforeReplyIsIllegal() throws Exception
-    {
-        ServerSocketChannel server = ServerSocketChannel.open();
-        server.bind(new InetSocketAddress("localhost", 0));
-
-        Session session = startClient(new InetSocketAddress("localhost", server.socket().getLocalPort()), null);
-        session.syn(new SynInfo(new Fields(), true), null);
-
-        SocketChannel channel = server.accept();
-        ByteBuffer readBuffer = ByteBuffer.allocate(1024);
-        channel.read(readBuffer);
-        readBuffer.flip();
-        int streamId = readBuffer.getInt(8);
-
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory.StandardCompressor());
-        byte[] bytes = new byte[1];
-        ByteBuffer writeBuffer = generator.data(streamId, bytes.length, new BytesDataInfo(bytes, true));
-        channel.write(writeBuffer);
-        assertThat("data is fully written", writeBuffer.hasRemaining(),is(false));
-
-        readBuffer.clear();
-        channel.read(readBuffer);
-        readBuffer.flip();
-        Assert.assertEquals(ControlFrameType.RST_STREAM.getCode(), readBuffer.getShort(2));
-        Assert.assertEquals(streamId, readBuffer.getInt(8));
-
-        session.goAway(new GoAwayInfo(5, TimeUnit.SECONDS));
-
-        server.close();
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void testSendDataAfterCloseIsIllegal() throws Exception
-    {
-        Session session = startClient(startServer(null), null);
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), true, (byte)0), null);
-        stream.data(new StringDataInfo("test", true));
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void testSendHeadersAfterCloseIsIllegal() throws Exception
-    {
-        Session session = startClient(startServer(null), null);
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), true, (byte)0), null);
-        stream.headers(new HeadersInfo(new Fields(), true));
-    }
-
-    @Test //TODO: throws an ISException in StandardStream.updateCloseState(). But instead we should send a rst or something to the server probably?!
-    public void testServerClosesStreamTwice() throws Exception
-    {
-        ServerSocketChannel server = ServerSocketChannel.open();
-        server.bind(new InetSocketAddress("localhost", 0));
-
-        Session session = startClient(new InetSocketAddress("localhost", server.socket().getLocalPort()), null);
-        final CountDownLatch dataLatch = new CountDownLatch(2);
-        session.syn(new SynInfo(new Fields(), false), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                dataLatch.countDown();
-            }
-        });
-
-        SocketChannel channel = server.accept();
-        ByteBuffer readBuffer = ByteBuffer.allocate(1024);
-        channel.read(readBuffer);
-        readBuffer.flip();
-        int streamId = readBuffer.getInt(8);
-
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory.StandardCompressor());
-
-        ByteBuffer writeBuffer = generator.control(new SynReplyFrame(SPDY.V2, (byte)0, streamId, new Fields()));
-        channel.write(writeBuffer);
-        assertThat("SynReply is fully written", writeBuffer.hasRemaining(), is(false));
-
-        byte[] bytes = new byte[1];
-        writeBuffer = generator.data(streamId, bytes.length, new BytesDataInfo(bytes, true));
-        channel.write(writeBuffer);
-        assertThat("data is fully written", writeBuffer.hasRemaining(), is(false));
-
-        // Write again to simulate the faulty condition
-        writeBuffer.flip();
-        channel.write(writeBuffer);
-        assertThat("data is fully written", writeBuffer.hasRemaining(), is(false));
-
-        Assert.assertFalse(dataLatch.await(1, TimeUnit.SECONDS));
-
-        session.goAway(new GoAwayInfo(5, TimeUnit.SECONDS));
-
-        server.close();
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/PushStreamTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/PushStreamTest.java
deleted file mode 100644
index 815baf2..0000000
--- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/PushStreamTest.java
+++ /dev/null
@@ -1,591 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server;
-
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.hamcrest.Matchers.sameInstance;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.fail;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
-import java.nio.channels.SocketChannel;
-import java.util.Arrays;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.CyclicBarrier;
-import java.util.concurrent.Exchanger;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ThreadLocalRandom;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.api.BytesDataInfo;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.GoAwayResultInfo;
-import org.eclipse.jetty.spdy.api.PushInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.RstInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.api.SessionStatus;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.spdy.api.StringDataInfo;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.DataFrame;
-import org.eclipse.jetty.spdy.frames.GoAwayFrame;
-import org.eclipse.jetty.spdy.frames.RstStreamFrame;
-import org.eclipse.jetty.spdy.frames.SynStreamFrame;
-import org.eclipse.jetty.spdy.frames.WindowUpdateFrame;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.spdy.parser.Parser;
-import org.eclipse.jetty.spdy.parser.Parser.Listener;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.Promise;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class PushStreamTest extends AbstractTest
-{
-    private static final Logger LOG = Log.getLogger(PushStreamTest.class);
-
-    @Test
-    public void testSynPushStream() throws Exception
-    {
-        final AtomicReference<Stream> pushStreamRef = new AtomicReference<>();
-        final CountDownLatch pushStreamLatch = new CountDownLatch(1);
-
-        Session clientSession = startClient(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.reply(new ReplyInfo(false), new Callback.Adapter());
-                stream.push(new PushInfo(new Fields(), true), new Promise.Adapter<Stream>());
-                return null;
-            }
-        }), null);
-
-        Stream stream = clientSession.syn(new SynInfo(new Fields(), true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-            {
-                assertThat("streamId is even", stream.getId() % 2, is(0));
-                assertThat("stream is unidirectional", stream.isUnidirectional(), is(true));
-                assertThat("stream is closed", stream.isClosed(), is(true));
-                assertThat("stream has associated stream", stream.getAssociatedStream(), notNullValue());
-                try
-                {
-                    stream.reply(new ReplyInfo(false), new Callback.Adapter());
-                    fail("Cannot reply to push streams");
-                }
-                catch (IllegalStateException x)
-                {
-                    // Expected
-                }
-                pushStreamRef.set(stream);
-                pushStreamLatch.countDown();
-                return null;
-            }
-        });
-        assertThat("onSyn has been called", pushStreamLatch.await(5, TimeUnit.SECONDS), is(true));
-        Stream pushStream = pushStreamRef.get();
-        assertThat("main stream and associated stream are the same", stream, sameInstance(pushStream.getAssociatedStream()));
-    }
-
-    @Test
-    public void testSendDataOnPushStreamAfterAssociatedStreamIsClosed() throws Exception
-    {
-        final Exchanger<Stream> streamExchanger = new Exchanger<>();
-        final CountDownLatch pushStreamSynLatch = new CountDownLatch(1);
-        final CyclicBarrier replyBarrier = new CyclicBarrier(3);
-        final CyclicBarrier closeBarrier = new CyclicBarrier(3);
-        final CountDownLatch streamDataSent = new CountDownLatch(2);
-        final CountDownLatch pushStreamDataReceived = new CountDownLatch(2);
-        final CountDownLatch exceptionCountDownLatch = new CountDownLatch(1);
-
-        Session clientSession = startClient(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.reply(new ReplyInfo(false), new Callback.Adapter());
-                try
-                {
-                    replyBarrier.await(5, TimeUnit.SECONDS);
-                    return new StreamFrameListener.Adapter()
-                    {
-                        @Override
-                        public void onData(Stream stream, DataInfo dataInfo)
-                        {
-                            try
-                            {
-                                if (dataInfo.isClose())
-                                {
-                                    stream.data(new StringDataInfo("close stream", true));
-                                    closeBarrier.await(5, TimeUnit.SECONDS);
-                                }
-                                streamDataSent.countDown();
-                                if (pushStreamDataReceived.getCount() == 2)
-                                {
-                                    Stream pushStream = stream.push(new PushInfo(new Fields(), false));
-                                    streamExchanger.exchange(pushStream, 5, TimeUnit.SECONDS);
-                                }
-                            }
-                            catch (Exception e)
-                            {
-                                exceptionCountDownLatch.countDown();
-                            }
-                        }
-                    };
-                }
-                catch (Exception e)
-                {
-                    exceptionCountDownLatch.countDown();
-                    throw new IllegalStateException(e);
-                }
-            }
-
-        }), null);
-
-        Stream stream = clientSession.syn(new SynInfo(new Fields(), false), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-            {
-                pushStreamSynLatch.countDown();
-                return new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        pushStreamDataReceived.countDown();
-                        super.onData(stream, dataInfo);
-                    }
-                };
-            }
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                try
-                {
-                    replyBarrier.await(5, TimeUnit.SECONDS);
-                }
-                catch (Exception e)
-                {
-                    exceptionCountDownLatch.countDown();
-                }
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                try
-                {
-                    closeBarrier.await(5, TimeUnit.SECONDS);
-                }
-                catch (Exception e)
-                {
-                    exceptionCountDownLatch.countDown();
-                }
-            }
-        });
-
-        replyBarrier.await(5, TimeUnit.SECONDS);
-        stream.data(new StringDataInfo("client data", false));
-        Stream pushStream = streamExchanger.exchange(null, 5, TimeUnit.SECONDS);
-        pushStream.data(new StringDataInfo("first push data frame", false));
-        // nasty, but less complex than using another cyclicBarrier for example
-        while (pushStreamDataReceived.getCount() != 1)
-            Thread.sleep(1);
-        stream.data(new StringDataInfo("client close", true));
-        closeBarrier.await(5, TimeUnit.SECONDS);
-        assertThat("stream is closed", stream.isClosed(), is(true));
-        pushStream.data(new StringDataInfo("second push data frame while associated stream has been closed already", false));
-        assertThat("2 pushStream data frames have been received.", pushStreamDataReceived.await(5, TimeUnit.SECONDS), is(true));
-        assertThat("2 data frames have been sent", streamDataSent.await(5, TimeUnit.SECONDS), is(true));
-        assertThatNoExceptionOccurred(exceptionCountDownLatch);
-    }
-
-    @Test
-    public void testSynPushStreamOnClosedStream() throws Exception
-    {
-        final CountDownLatch pushStreamFailedLatch = new CountDownLatch(1);
-
-        Session clientSession = startClient(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.reply(new ReplyInfo(true), new Callback.Adapter());
-                stream.push(new PushInfo(1, TimeUnit.SECONDS, new Fields(), false),
-                        new Promise.Adapter<Stream>()
-                        {
-                            @Override
-                            public void failed(Throwable x)
-                            {
-                                pushStreamFailedLatch.countDown();
-                            }
-                        });
-                return super.onSyn(stream, synInfo);
-            }
-        }), new SessionFrameListener.Adapter());
-
-        clientSession.syn(new SynInfo(new Fields(), true), null);
-        assertThat("pushStream push has failed", pushStreamFailedLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    @Test
-    public void testSendBigDataOnPushStreamWhenAssociatedStreamIsClosed() throws Exception
-    {
-        final CountDownLatch streamClosedLatch = new CountDownLatch(1);
-        final CountDownLatch allDataReceived = new CountDownLatch(1);
-        final CountDownLatch exceptionCountDownLatch = new CountDownLatch(1);
-        final Exchanger<ByteBuffer> exchanger = new Exchanger<>();
-        final int dataSizeInBytes = 1024 * 1024 * 1;
-        final byte[] transferBytes = createHugeByteArray(dataSizeInBytes);
-
-        Session clientSession = startClient(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                try
-                {
-                    Stream pushStream = stream.push(new PushInfo(new Fields(), false));
-                    stream.reply(new ReplyInfo(true));
-                    // wait until stream is closed
-                    streamClosedLatch.await(5, TimeUnit.SECONDS);
-                    pushStream.data(new BytesDataInfo(transferBytes, true), new Callback.Adapter());
-                    return null;
-                }
-                catch (Exception e)
-                {
-                    exceptionCountDownLatch.countDown();
-                    throw new IllegalStateException(e);
-                }
-            }
-        }), null);
-
-        Stream stream = clientSession.syn(new SynInfo(new Fields(), true), new StreamFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-            {
-                return new StreamFrameListener.Adapter()
-                {
-                    ByteBuffer receivedBytes = ByteBuffer.allocate(dataSizeInBytes);
-
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        dataInfo.consumeInto(receivedBytes);
-                        if (dataInfo.isClose())
-                        {
-                            allDataReceived.countDown();
-                            try
-                            {
-                                receivedBytes.flip();
-                                exchanger.exchange(receivedBytes.slice(), 5, TimeUnit.SECONDS);
-                            }
-                            catch (Exception e)
-                            {
-                                exceptionCountDownLatch.countDown();
-                            }
-                        }
-                    }
-                };
-            }
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                streamClosedLatch.countDown();
-                super.onReply(stream, replyInfo);
-            }
-        });
-
-        ByteBuffer receivedBytes = exchanger.exchange(null, 5, TimeUnit.SECONDS);
-
-        assertThat("received byte array is the same as transferred byte array", Arrays.equals(transferBytes, receivedBytes.array()), is(true));
-        assertThat("onReply has been called to close the stream", streamClosedLatch.await(5, TimeUnit.SECONDS), is(true));
-        assertThat("stream is closed", stream.isClosed(), is(true));
-        assertThat("all data has been received", allDataReceived.await(20, TimeUnit.SECONDS), is(true));
-        assertThatNoExceptionOccurred(exceptionCountDownLatch);
-    }
-
-    private byte[] createHugeByteArray(int sizeInBytes)
-    {
-        byte[] bytes = new byte[sizeInBytes];
-        ThreadLocalRandom.current().nextBytes(bytes);
-        return bytes;
-    }
-
-
-    @Test
-    public void testClientResetsStreamAfterPushSynDoesPreventSendingDataFramesWithFlowControl() throws Exception
-    {
-        final boolean flowControl = true;
-        testNoMoreFramesAreSentOnPushStreamAfterClientResetsThePushStream(flowControl);
-    }
-
-    @Test
-    public void testClientResetsStreamAfterPushSynDoesPreventSendingDataFramesWithoutFlowControl() throws Exception
-    {
-        final boolean flowControl = false;
-        testNoMoreFramesAreSentOnPushStreamAfterClientResetsThePushStream(flowControl);
-    }
-
-    private volatile boolean read = true;
-
-    private void testNoMoreFramesAreSentOnPushStreamAfterClientResetsThePushStream(final boolean flowControl) throws Exception
-    {
-        final short version = SPDY.V3;
-        final AtomicBoolean unexpectedExceptionOccurred = new AtomicBoolean(false);
-        final CountDownLatch resetReceivedLatch = new CountDownLatch(1);
-        final CountDownLatch allDataFramesReceivedLatch = new CountDownLatch(1);
-        final CountDownLatch goAwayReceivedLatch = new CountDownLatch(1);
-        final int dataSizeInBytes = 1024 * 256;
-        final byte[] transferBytes = createHugeByteArray(dataSizeInBytes);
-
-        InetSocketAddress serverAddress = startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(final Stream stream, SynInfo synInfo)
-            {
-                new Thread(new Runnable()
-                {
-
-                    @Override
-                    public void run()
-                    {
-                        Stream pushStream = null;
-                        try
-                        {
-                            stream.reply(new ReplyInfo(false), new Callback.Adapter());
-                            pushStream = stream.push(new PushInfo(new Fields(), false));
-                            resetReceivedLatch.await(5, TimeUnit.SECONDS);
-                        }
-                        catch (InterruptedException | ExecutionException | TimeoutException e)
-                        {
-                            e.printStackTrace();
-                            unexpectedExceptionOccurred.set(true);
-                        }
-                        assert pushStream != null;
-                        try
-                        {
-                            pushStream.data(new BytesDataInfo(transferBytes, true));
-                            stream.data(new StringDataInfo("close", true));
-                        }
-                        catch (InterruptedException | ExecutionException | TimeoutException e)
-                        {
-                            LOG.debug(e.getMessage());
-                        }
-                    }
-                }).start();
-                return null;
-            }
-
-            @Override
-            public void onRst(Session session, RstInfo rstInfo)
-            {
-                resetReceivedLatch.countDown();
-            }
-
-            @Override
-            public void onGoAway(Session session, GoAwayResultInfo goAwayInfo)
-            {
-                goAwayReceivedLatch.countDown();
-            }
-        }/*TODO, flowControl*/);
-
-        final SocketChannel channel = SocketChannel.open(serverAddress);
-        final Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory.StandardCompressor());
-        int streamId = 1;
-        ByteBuffer writeBuffer = generator.control(new SynStreamFrame(version, (byte)0, streamId, 0, (byte)0, (short)0, new Fields()));
-        channel.write(writeBuffer);
-        assertThat("writeBuffer is fully written", writeBuffer.hasRemaining(), is(false));
-
-        final Parser parser = new Parser(new StandardCompressionFactory.StandardDecompressor());
-        parser.addListener(new Listener.Adapter()
-        {
-            int bytesRead = 0;
-
-            @Override
-            public void onControlFrame(ControlFrame frame)
-            {
-                if (frame instanceof SynStreamFrame)
-                {
-                    int pushStreamId = ((SynStreamFrame)frame).getStreamId();
-                    ByteBuffer writeBuffer = generator.control(new RstStreamFrame(version, pushStreamId, StreamStatus.CANCEL_STREAM.getCode(version)));
-                    try
-                    {
-                        channel.write(writeBuffer);
-                    }
-                    catch (IOException e)
-                    {
-                        e.printStackTrace();
-                        unexpectedExceptionOccurred.set(true);
-                    }
-                }
-            }
-
-            @Override
-            public void onDataFrame(DataFrame frame, ByteBuffer data)
-            {
-                if (frame.getStreamId() == 2)
-                    bytesRead = bytesRead + frame.getLength();
-                if (bytesRead == dataSizeInBytes)
-                {
-                    allDataFramesReceivedLatch.countDown();
-                    return;
-                }
-                if (flowControl)
-                {
-                    ByteBuffer writeBuffer = generator.control(new WindowUpdateFrame(version, frame.getStreamId(), frame.getLength()));
-                    try
-                    {
-                        channel.write(writeBuffer);
-                    }
-                    catch (IOException e)
-                    {
-                        e.printStackTrace();
-                        unexpectedExceptionOccurred.set(true);
-                    }
-                }
-            }
-        });
-
-        Thread reader = new Thread(new Runnable()
-        {
-            @Override
-            public void run()
-            {
-                ByteBuffer readBuffer = ByteBuffer.allocate(dataSizeInBytes * 2);
-                while (read)
-                {
-                    try
-                    {
-                        channel.read(readBuffer);
-                    }
-                    catch (IOException e)
-                    {
-                        e.printStackTrace();
-                        unexpectedExceptionOccurred.set(true);
-                    }
-                    readBuffer.flip();
-                    parser.parse(readBuffer);
-                    readBuffer.clear();
-                }
-
-            }
-        });
-        reader.start();
-        read = false;
-
-        assertThat("no unexpected exceptions occurred", unexpectedExceptionOccurred.get(), is(false));
-        assertThat("not all dataframes have been received as the pushstream has been reset by the client.", allDataFramesReceivedLatch.await(streamId, TimeUnit.SECONDS), is(false));
-
-
-        ByteBuffer buffer = generator.control(new GoAwayFrame(version, streamId, SessionStatus.OK.getCode()));
-        channel.write(buffer);
-        Assert.assertThat(buffer.hasRemaining(), is(false));
-
-        assertThat("GoAway frame is received by server", goAwayReceivedLatch.await(5, TimeUnit.SECONDS), is(true));
-        channel.shutdownOutput();
-        channel.close();
-    }
-
-    @Test
-    public void testOddEvenStreamIds() throws Exception
-    {
-        final CountDownLatch pushStreamIdIsEvenLatch = new CountDownLatch(3);
-
-        Session clientSession = startClient(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.push(new PushInfo(new Fields(), false), new Promise.Adapter<Stream>());
-                return null;
-            }
-        }), null);
-
-        Stream stream = clientSession.syn(new SynInfo(new Fields(), false),
-                new VerifyPushStreamIdIsEvenStreamFrameListener(pushStreamIdIsEvenLatch));
-        Stream stream2 = clientSession.syn(new SynInfo(new Fields(), false),
-                new VerifyPushStreamIdIsEvenStreamFrameListener(pushStreamIdIsEvenLatch));
-        Stream stream3 = clientSession.syn(new SynInfo(new Fields(), false),
-                new VerifyPushStreamIdIsEvenStreamFrameListener(pushStreamIdIsEvenLatch));
-        assertStreamIdIsOdd(stream);
-        assertStreamIdIsOdd(stream2);
-        assertStreamIdIsOdd(stream3);
-
-        assertThat("all pushStreams had even ids", pushStreamIdIsEvenLatch.await(5, TimeUnit.SECONDS), is(true));
-    }
-
-    private class VerifyPushStreamIdIsEvenStreamFrameListener extends StreamFrameListener.Adapter
-    {
-        final CountDownLatch pushStreamIdIsEvenLatch;
-
-        private VerifyPushStreamIdIsEvenStreamFrameListener(CountDownLatch pushStreamIdIsEvenLatch)
-        {
-            this.pushStreamIdIsEvenLatch = pushStreamIdIsEvenLatch;
-        }
-
-        @Override
-        public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
-        {
-            assertStreamIdIsEven(stream);
-            pushStreamIdIsEvenLatch.countDown();
-            return super.onPush(stream, pushInfo);
-        }
-    }
-
-    private void assertStreamIdIsEven(Stream stream)
-    {
-        assertThat("streamId is odd", stream.getId() % 2, is(0));
-    }
-
-    private void assertStreamIdIsOdd(Stream stream)
-    {
-        assertThat("streamId is odd", stream.getId() % 2, is(1));
-    }
-
-    private void assertThatNoExceptionOccurred(final CountDownLatch exceptionCountDownLatch) throws InterruptedException
-    {
-        assertThat("No exception occurred", exceptionCountDownLatch.await(1, TimeUnit.SECONDS), is(false));
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ResetStreamTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ResetStreamTest.java
deleted file mode 100644
index b2321d8..0000000
--- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/ResetStreamTest.java
+++ /dev/null
@@ -1,204 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server;
-
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.RstInfo;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.spdy.api.StringDataInfo;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.FutureCallback;
-import org.junit.Test;
-
-public class ResetStreamTest extends AbstractTest
-{
-    @Test
-    public void testResetStreamIsRemoved() throws Exception
-    {
-        Session session = startClient(startServer(new ServerSessionFrameListener.Adapter()/*TODO, true*/), null);
-
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), null);
-        session.rst(new RstInfo(5, TimeUnit.SECONDS, stream.getId(), StreamStatus.CANCEL_STREAM));
-
-        assertEquals("session expected to contain 0 streams", 0, session.getStreams().size());
-    }
-
-    @Test
-    public void testRefusedStreamIsRemoved() throws Exception
-    {
-        final AtomicReference<Session> serverSessionRef = new AtomicReference<>();
-        final CountDownLatch synLatch = new CountDownLatch(1);
-        final CountDownLatch rstLatch = new CountDownLatch(1);
-        Session clientSession = startClient(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                Session serverSession = stream.getSession();
-                serverSessionRef.set(serverSession);
-                serverSession.rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM), new FutureCallback());
-                synLatch.countDown();
-                return null;
-            }
-        }), new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onRst(Session session, RstInfo rstInfo)
-            {
-                rstLatch.countDown();
-            }
-        });
-
-        Stream stream = clientSession.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), null);
-
-        assertTrue("syncLatch didn't count down", synLatch.await(5, TimeUnit.SECONDS));
-        Session serverSession = serverSessionRef.get();
-        assertEquals("serverSession expected to contain 0 streams", 0, serverSession.getStreams().size());
-
-        assertTrue("rstLatch didn't count down", rstLatch.await(5, TimeUnit.SECONDS));
-        // Need to sleep a while to give the chance to the implementation to remove the stream
-        TimeUnit.SECONDS.sleep(1);
-        assertTrue("stream is expected to be reset", stream.isReset());
-        assertEquals("clientSession expected to contain 0 streams", 0, clientSession.getStreams().size());
-    }
-
-    @Test
-    public void testRefusedStreamIgnoresData() throws Exception
-    {
-        final CountDownLatch synLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-        final CountDownLatch rstLatch = new CountDownLatch(1);
-        Session session = startClient(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                try
-                {
-                    // Refuse the stream, we must ignore data frames
-                    assertTrue(synLatch.await(5, TimeUnit.SECONDS));
-                    stream.getSession().rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM), new FutureCallback());
-                    return new StreamFrameListener.Adapter()
-                    {
-                        @Override
-                        public void onData(Stream stream, DataInfo dataInfo)
-                        {
-                            dataLatch.countDown();
-                        }
-                    };
-                }
-                catch (InterruptedException x)
-                {
-                    x.printStackTrace();
-                    return null;
-                }
-            }
-        }), new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onRst(Session session, RstInfo rstInfo)
-            {
-                rstLatch.countDown();
-            }
-        });
-
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), null);
-        stream.data(new StringDataInfo(5, TimeUnit.SECONDS, "data", true), new Callback.Adapter()
-        {
-            @Override
-            public void succeeded()
-            {
-                synLatch.countDown();
-            }
-        });
-
-        assertTrue("rstLatch didn't count down", rstLatch.await(5, TimeUnit.SECONDS));
-        assertTrue("stream is expected to be reset", stream.isReset());
-        assertFalse("dataLatch shouldn't be count down", dataLatch.await(1, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testResetAfterServerReceivedFirstDataFrameAndSecondDataFrameFails() throws Exception
-    {
-        final CountDownLatch synLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-        final CountDownLatch rstLatch = new CountDownLatch(1);
-        final CountDownLatch failLatch = new CountDownLatch(1);
-        Session session = startClient(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                synLatch.countDown();
-                return new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        dataLatch.countDown();
-                        stream.getSession().rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM), new FutureCallback());
-                    }
-                };
-            }
-        }), new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onRst(Session session, RstInfo rstInfo)
-            {
-                rstLatch.countDown();
-            }
-        });
-
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0), null);
-        assertThat("push is received by server", synLatch.await(5, TimeUnit.SECONDS), is(true));
-        stream.data(new StringDataInfo(5, TimeUnit.SECONDS, "data", false), new Callback.Adapter());
-        assertThat("stream is reset", rstLatch.await(5, TimeUnit.SECONDS), is(true));
-        stream.data(new StringDataInfo(5, TimeUnit.SECONDS, "2nd dataframe", false), new Callback.Adapter()
-        {
-            @Override
-            public void failed(Throwable x)
-            {
-                failLatch.countDown();
-            }
-        });
-
-        assertThat("2nd data call failed", failLatch.await(5, TimeUnit.SECONDS), is(true));
-        assertThat("stream is reset", stream.isReset(), is(true));
-    }
-
-    // TODO: If server already received 2nd dataframe after it rst, it should ignore it. Not easy to do.
-
-}
diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SPDYClientFactoryTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SPDYClientFactoryTest.java
deleted file mode 100644
index cfd85f6..0000000
--- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SPDYClientFactoryTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.spdy.api.GoAwayInfo;
-import org.eclipse.jetty.spdy.api.GoAwayResultInfo;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class SPDYClientFactoryTest extends AbstractTest
-{
-    @Test
-    public void testStoppingClientFactorySendsGoAway() throws Exception
-    {
-        final CountDownLatch latch = new CountDownLatch(1);
-        startClient(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public void onGoAway(Session session, GoAwayResultInfo goAwayResultInfo)
-            {
-                latch.countDown();
-            }
-        }), null);
-
-        // Sleep a while to avoid the factory is
-        // stopped before a session can be opened
-        TimeUnit.SECONDS.sleep(1);
-
-        clientFactory.stop();
-
-        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(clientFactory.getSessions().isEmpty());
-    }
-
-    @Test
-    public void testSessionClosedIsRemovedFromClientFactory() throws Exception
-    {
-        Session session = startClient(startServer(null), null);
-
-        session.goAway(new GoAwayInfo(5, TimeUnit.SECONDS));
-
-        for (int i=0;i<10;i++)
-        {
-            // Sleep a while to allow the factory to remove the session
-            // since it is done asynchronously by the selector thread
-            TimeUnit.SECONDS.sleep(1);
-            if (clientFactory.getSessions().isEmpty())
-                return;
-        }
-
-        Assert.fail(clientFactory.getSessions().toString());
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SPDYServerConnectorTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SPDYServerConnectorTest.java
deleted file mode 100644
index 673c067..0000000
--- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SPDYServerConnectorTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.spdy.api.GoAwayInfo;
-import org.eclipse.jetty.spdy.api.GoAwayResultInfo;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class SPDYServerConnectorTest extends AbstractTest
-{
-    @Test
-    public void testStoppingServerConnectorSendsGoAway() throws Exception
-    {
-        final CountDownLatch latch = new CountDownLatch(1);
-        startClient(startServer(null), new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onGoAway(Session session, GoAwayResultInfo goAwayResultInfo)
-            {
-                latch.countDown();
-            }
-        });
-
-        // Sleep a while to avoid the connector is
-        // stopped before a session can be opened
-        TimeUnit.SECONDS.sleep(1);
-
-        connector.stop();
-
-        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(connector.getConnectionFactory(SPDYServerConnectionFactory.class).getSessions().isEmpty());
-    }
-
-    @Test
-    public void testSessionClosedIsRemovedFromServerConnector() throws Exception
-    {
-        Session session = startClient(startServer(null), null);
-
-        session.goAway(new GoAwayInfo(5, TimeUnit.SECONDS));
-
-        // Sleep a while to allow the connector to remove the session
-        // since it is done asynchronously by the selector thread
-        TimeUnit.SECONDS.sleep(1);
-
-        Assert.assertTrue(connector.getConnectionFactory(SPDYServerConnectionFactory.class).getSessions().isEmpty());
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SettingsTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SettingsTest.java
deleted file mode 100644
index c8f61cb..0000000
--- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SettingsTest.java
+++ /dev/null
@@ -1,168 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server;
-
-import java.net.InetSocketAddress;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.api.Settings;
-import org.eclipse.jetty.spdy.api.SettingsInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.util.FutureCallback;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class SettingsTest extends AbstractTest
-{
-    @Test
-    public void testSettingsUsage() throws Exception
-    {
-        Settings settings = new Settings();
-        int streamsValue = 100;
-        settings.put(new Settings.Setting(Settings.ID.MAX_CONCURRENT_STREAMS, Settings.Flag.PERSIST, streamsValue));
-        int windowValue = 32768;
-        settings.put(new Settings.Setting(Settings.ID.INITIAL_WINDOW_SIZE, windowValue));
-        int newCode = 91;
-        Settings.ID newID = Settings.ID.from(newCode);
-        int newValue = 97;
-        settings.put(new Settings.Setting(newID, newValue));
-
-        Settings.Setting setting1 = settings.get(Settings.ID.MAX_CONCURRENT_STREAMS);
-        Assert.assertSame(Settings.ID.MAX_CONCURRENT_STREAMS, setting1.id());
-        Assert.assertSame(Settings.Flag.PERSIST, setting1.flag());
-        Assert.assertEquals(streamsValue, setting1.value());
-
-        Settings.Setting setting2 = settings.get(Settings.ID.INITIAL_WINDOW_SIZE);
-        Assert.assertSame(Settings.ID.INITIAL_WINDOW_SIZE, setting2.id());
-        Assert.assertSame(Settings.Flag.NONE, setting2.flag());
-        Assert.assertEquals(windowValue, setting2.value());
-
-        int size = settings.size();
-        Settings.Setting setting3 = settings.remove(Settings.ID.from(newCode));
-        Assert.assertEquals(size - 1, settings.size());
-        Assert.assertNotNull(setting3);
-        Assert.assertSame(newID, setting3.id());
-        Assert.assertEquals(newValue, setting3.value());
-    }
-
-    @Test
-    public void testSettings() throws Exception
-    {
-        Settings settings = new Settings();
-        settings.put(new Settings.Setting(Settings.ID.UPLOAD_BANDWIDTH, 1024 * 1024));
-        settings.put(new Settings.Setting(Settings.ID.DOWNLOAD_BANDWIDTH, 1024 * 1024));
-        settings.put(new Settings.Setting(Settings.ID.CURRENT_CONGESTION_WINDOW, Settings.Flag.PERSISTED, 1024));
-        final SettingsInfo clientSettingsInfo = new SettingsInfo(settings);
-        final CountDownLatch latch = new CountDownLatch(1);
-        ServerSessionFrameListener serverSessionFrameListener = new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public void onSettings(Session session, SettingsInfo serverSettingsInfo)
-            {
-                Assert.assertEquals(clientSettingsInfo.getFlags(), serverSettingsInfo.getFlags());
-                Assert.assertEquals(clientSettingsInfo.getSettings(), serverSettingsInfo.getSettings());
-                latch.countDown();
-            }
-        };
-        Session session = startClient(startServer(serverSessionFrameListener), null);
-
-        session.settings(clientSettingsInfo);
-
-        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testServerSettings() throws Exception
-    {
-        Settings settings = new Settings();
-        settings.put(new Settings.Setting(Settings.ID.UPLOAD_BANDWIDTH, 1024 * 1024));
-        settings.put(new Settings.Setting(Settings.ID.DOWNLOAD_BANDWIDTH, 1024 * 1024));
-        settings.put(new Settings.Setting(Settings.ID.CURRENT_CONGESTION_WINDOW, Settings.Flag.PERSIST, 1024));
-        final SettingsInfo serverSettingsInfo = new SettingsInfo(settings);
-        ServerSessionFrameListener serverSessionFrameListener = new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public void onConnect(Session session)
-            {
-                session.settings(serverSettingsInfo, new FutureCallback());
-            }
-        };
-
-        final CountDownLatch latch = new CountDownLatch(1);
-        SessionFrameListener clientSessionFrameListener = new SessionFrameListener.Adapter()
-        {
-            @Override
-            public void onSettings(Session session, SettingsInfo clientSettingsInfo)
-            {
-                Assert.assertEquals(serverSettingsInfo.getFlags(), clientSettingsInfo.getFlags());
-                Assert.assertEquals(serverSettingsInfo.getSettings(), clientSettingsInfo.getSettings());
-                latch.countDown();
-            }
-        };
-
-        startClient(startServer(serverSessionFrameListener), clientSessionFrameListener);
-
-        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testSettingIDIsTheSameInBothV2AndV3() throws Exception
-    {
-        final AtomicReference<SettingsInfo> v2 = new AtomicReference<>();
-        final AtomicReference<SettingsInfo> v3 = new AtomicReference<>();
-        final CountDownLatch settingsLatch = new CountDownLatch(2);
-        InetSocketAddress address = startServer(new ServerSessionFrameListener.Adapter()
-        {
-            private final AtomicInteger count = new AtomicInteger();
-
-            @Override
-            public void onSettings(Session session, SettingsInfo settingsInfo)
-            {
-                int count = this.count.incrementAndGet();
-                if (count == 1)
-                    v2.set(settingsInfo);
-                else if (count == 2)
-                    v3.set(settingsInfo);
-                else
-                    Assert.fail();
-                settingsLatch.countDown();
-            }
-        });
-
-        Settings settings = new Settings();
-        settings.put(new Settings.Setting(Settings.ID.INITIAL_WINDOW_SIZE, Settings.Flag.PERSIST, 0xC0_00));
-        SettingsInfo settingsInfo = new SettingsInfo(settings);
-
-        Session sessionV2 = startClient(address, null);
-        sessionV2.settings(settingsInfo);
-
-        Session sessionV3 = clientFactory.newSPDYClient(SPDY.V3).connect(address, null);
-        sessionV3.settings(settingsInfo);
-
-        Assert.assertTrue(settingsLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertEquals(v2.get().getSettings(), v3.get().getSettings());
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SynDataReplyDataLoadTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SynDataReplyDataLoadTest.java
deleted file mode 100644
index 3571878..0000000
--- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SynDataReplyDataLoadTest.java
+++ /dev/null
@@ -1,288 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-
-package org.eclipse.jetty.spdy.server;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.eclipse.jetty.io.LeakTrackingByteBufferPool;
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.spdy.api.ByteBufferDataInfo;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StringDataInfo;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.spdy.client.SPDYClient;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.Promise;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.eclipse.jetty.util.thread.Scheduler;
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
-public class SynDataReplyDataLoadTest extends AbstractTest
-{
-    private static final int TIMEOUT = 60 * 1000;
-    private static final Logger logger = Log.getLogger(SynDataReplyDataLoadTest.class);
-
-    @Test(timeout = TIMEOUT)
-    @Ignore("Test needs to be rewritten")
-    public void testSynDataReplyDataLoad() throws Exception
-    {
-        LeakTrackingByteBufferPool serverBufferPool = new LeakTrackingByteBufferPool(new MappedByteBufferPool.Tagged());
-        LeakTrackingByteBufferPool clientBufferPool = new LeakTrackingByteBufferPool(new MappedByteBufferPool.Tagged());
-
-        ServerSessionFrameListener listener = new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                stream.reply(new ReplyInfo(synInfo.getHeaders(), false), new Callback.Adapter());
-                return new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        ByteBuffer buffer = dataInfo.asByteBuffer(true);
-                        stream.data(new ByteBufferDataInfo(buffer, dataInfo.isClose()), new Callback.Adapter());
-                    }
-                };
-            }
-        };
-
-        short spdyVersion = SPDY.V2;
-        long idleTimeout = 2 * TIMEOUT;
-
-        server = newServer();
-        connector = new ServerConnector(server, null, null, serverBufferPool, 1,
-                Math.max(1, Runtime.getRuntime().availableProcessors() / 2),
-                new SPDYServerConnectionFactory(spdyVersion, listener));
-        connector.setIdleTimeout(idleTimeout);
-
-        QueuedThreadPool clientExecutor = new QueuedThreadPool();
-        clientExecutor.setName(clientExecutor.getName() + "-client");
-        clientFactory = new SPDYClient.Factory(clientExecutor, null, clientBufferPool, null, idleTimeout);
-        final Session session = startClient(spdyVersion, startServer(spdyVersion, listener), null);
-
-        final Thread testThread = Thread.currentThread();
-        Runnable timeout = new Runnable()
-        {
-            @Override
-            public void run()
-            {
-                logger.warn("Interrupting test, it is taking too long");
-                logger.warn("SERVER: {}", server.dump());
-                logger.warn("CLIENT: {}", clientFactory.dump());
-                testThread.interrupt();
-            }
-        };
-
-        final int iterations = 500;
-        final int count = 50;
-
-        final Fields headers = new Fields();
-        headers.put("method", "get");
-        headers.put("url", "/");
-        headers.put("version", "http/1.1");
-        headers.put("host", "localhost:8080");
-        headers.put("content-type", "application/octet-stream");
-
-        final CountDownLatch latch = new CountDownLatch(count * iterations);
-        session.addListener(new Session.StreamListener.Adapter()
-        {
-            @Override
-            public void onStreamClosed(Stream stream)
-            {
-                latch.countDown();
-            }
-        });
-
-        ExecutorService threadPool = Executors.newFixedThreadPool(count);
-        List<Callable<Object>> tasks = new ArrayList<>();
-
-        tasks.clear();
-        for (int i = 0; i < count; ++i)
-        {
-            tasks.add(new Callable<Object>()
-            {
-                @Override
-                public Object call() throws Exception
-                {
-                    synGetDataGet(session, headers, iterations);
-                    return null;
-                }
-            });
-        }
-        Scheduler.Task syncTimeoutTask = clientFactory.getScheduler().schedule(timeout, TIMEOUT / 2, TimeUnit.MILLISECONDS);
-        {
-            long begin = System.nanoTime();
-            List<Future<Object>> futures = threadPool.invokeAll(tasks);
-            for (Future<Object> future : futures)
-                future.get(iterations, TimeUnit.SECONDS);
-            Assert.assertTrue(latch.await(count * iterations, TimeUnit.SECONDS));
-            long end = System.nanoTime();
-            System.err.printf("SYN+GET+DATA+GET completed in %d ms%n", TimeUnit.NANOSECONDS.toMillis(end - begin));
-        }
-        syncTimeoutTask.cancel();
-
-        tasks.clear();
-        for (int i = 0; i < count; ++i)
-        {
-            tasks.add(new Callable<Object>()
-            {
-                @Override
-                public Object call() throws Exception
-                {
-                    synCompletedData(session, headers, iterations);
-                    return null;
-                }
-            });
-        }
-        Scheduler.Task asyncTimeoutTask = clientFactory.getScheduler().schedule(timeout, TIMEOUT / 2, TimeUnit.MILLISECONDS);
-        {
-            long begin = System.nanoTime();
-            List<Future<Object>> futures = threadPool.invokeAll(tasks);
-            for (Future<Object> future : futures)
-                future.get(iterations, TimeUnit.SECONDS);
-            Assert.assertTrue(latch.await(count * iterations, TimeUnit.SECONDS));
-            long end = System.nanoTime();
-            System.err.printf("SYN+COMPLETED+DATA completed in %d ms%n", TimeUnit.NANOSECONDS.toMillis(end - begin));
-        }
-        asyncTimeoutTask.cancel();
-
-        threadPool.shutdown();
-
-        System.gc();
-
-        assertThat("Server BufferPool - leaked acquires", serverBufferPool.getLeakedAcquires(), is(0L));
-        assertThat("Server BufferPool - leaked releases", serverBufferPool.getLeakedReleases(), is(0L));
-        assertThat("Server BufferPool - unreleased", serverBufferPool.getLeakedResources(), is(0L));
-        
-        assertThat("Client BufferPool - leaked acquires", clientBufferPool.getLeakedAcquires(), is(0L));
-        assertThat("Client BufferPool - leaked releases", clientBufferPool.getLeakedReleases(), is(0L));
-        assertThat("Client BufferPool - unreleased", clientBufferPool.getLeakedResources(), is(0L));
-    }
-
-    private void synCompletedData(Session session, Fields headers, int iterations) throws Exception
-    {
-        final Map<Integer, Integer> counter = new ConcurrentHashMap<>(iterations);
-        final CountDownLatch requestsLatch = new CountDownLatch(2 * iterations);
-        for (int i = 0; i < iterations; ++i)
-        {
-            final AtomicInteger count = new AtomicInteger(2);
-            final int index = i;
-            counter.put(index, index);
-            session.syn(new SynInfo(headers, false), new StreamFrameListener.Adapter()
-                    {
-                        @Override
-                        public void onReply(Stream stream, ReplyInfo replyInfo)
-                        {
-                            Assert.assertEquals(2, count.getAndDecrement());
-                            requestsLatch.countDown();
-                        }
-
-                        @Override
-                        public void onData(Stream stream, DataInfo dataInfo)
-                        {
-                            // TCP can split the data frames, so I may be receiving more than 1 data frame
-                            dataInfo.asBytes(true);
-                            if (dataInfo.isClose())
-                            {
-                                Assert.assertEquals(1, count.getAndDecrement());
-                                counter.remove(index);
-                                requestsLatch.countDown();
-                            }
-                        }
-                    }, new Promise.Adapter<Stream>()
-                    {
-                        @Override
-                        public void succeeded(Stream stream)
-                        {
-                            stream.data(new StringDataInfo("data_" + stream.getId(), true),
-                                    new Callback.Adapter());
-                        }
-                    }
-            );
-        }
-        Assert.assertTrue(requestsLatch.await(iterations, TimeUnit.SECONDS));
-        Assert.assertTrue(counter.toString(), counter.isEmpty());
-    }
-
-    private void synGetDataGet(Session session, Fields headers, int iterations) throws Exception
-    {
-        final Map<Integer, Integer> counter = new ConcurrentHashMap<>(iterations);
-        final CountDownLatch latch = new CountDownLatch(2 * iterations);
-        for (int i = 0; i < iterations; ++i)
-        {
-            final AtomicInteger count = new AtomicInteger(2);
-            final int index = i;
-            counter.put(index, index);
-            Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0),
-                    new StreamFrameListener.Adapter()
-                    {
-                        @Override
-                        public void onReply(Stream stream, ReplyInfo replyInfo)
-                        {
-                            Assert.assertEquals(2, count.getAndDecrement());
-                            latch.countDown();
-                        }
-
-                        @Override
-                        public void onData(Stream stream, DataInfo dataInfo)
-                        {
-                            // TCP can split the data frames, so I may be receiving more than 1 data frame
-                            dataInfo.asBytes(true);
-                            if (dataInfo.isClose())
-                            {
-                                Assert.assertEquals(1, count.getAndDecrement());
-                                counter.remove(index);
-                                latch.countDown();
-                            }
-                        }
-                    });
-            stream.data(new StringDataInfo(5, TimeUnit.SECONDS, "data_" + stream.getId(), true));
-        }
-        Assert.assertTrue(latch.await(iterations, TimeUnit.SECONDS));
-        Assert.assertTrue(counter.toString(), counter.isEmpty());
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SynReplyTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SynReplyTest.java
deleted file mode 100644
index 993b593..0000000
--- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/SynReplyTest.java
+++ /dev/null
@@ -1,375 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server;
-
-import java.io.ByteArrayOutputStream;
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.eclipse.jetty.spdy.api.BytesDataInfo;
-import org.eclipse.jetty.spdy.api.DataInfo;
-import org.eclipse.jetty.spdy.api.ReplyInfo;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.SessionFrameListener;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StringDataInfo;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Fields;
-import org.eclipse.jetty.util.Promise;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class SynReplyTest extends AbstractTest
-{
-    @Test
-    public void testSynReply() throws Exception
-    {
-        final AtomicReference<Session> sessionRef = new AtomicReference<>();
-        final CountDownLatch sessionLatch = new CountDownLatch(1);
-        final CountDownLatch synLatch = new CountDownLatch(1);
-        ServerSessionFrameListener serverSessionFrameListener = new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public void onConnect(Session session)
-            {
-                sessionRef.set(session);
-                sessionLatch.countDown();
-            }
-
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                Assert.assertTrue(stream.isHalfClosed());
-                stream.reply(new ReplyInfo(new Fields(), true), new Callback.Adapter());
-                synLatch.countDown();
-                return null;
-            }
-        };
-
-        Session session = startClient(startServer(serverSessionFrameListener), null);
-
-        Assert.assertTrue(sessionLatch.await(5, TimeUnit.SECONDS));
-        Session serverSession = sessionRef.get();
-        Assert.assertNotNull(serverSession);
-
-        final CountDownLatch streamCreatedLatch = new CountDownLatch(1);
-        final CountDownLatch streamRemovedLatch = new CountDownLatch(1);
-        session.addListener(new Session.StreamListener()
-        {
-            @Override
-            public void onStreamCreated(Stream stream)
-            {
-                streamCreatedLatch.countDown();
-            }
-
-            @Override
-            public void onStreamClosed(Stream stream)
-            {
-                streamRemovedLatch.countDown();
-            }
-        });
-
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), true, (byte)0),
-                new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Assert.assertTrue(stream.isClosed());
-                replyLatch.countDown();
-            }
-        });
-
-        Assert.assertTrue(synLatch.await(5, TimeUnit.SECONDS));
-
-        Assert.assertTrue(streamCreatedLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(stream.isClosed());
-
-        Assert.assertTrue(streamRemovedLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertEquals(0, session.getStreams().size());
-    }
-
-    @Test
-    public void testSynDataReply() throws Exception
-    {
-        final byte[] dataBytes = "foo".getBytes(StandardCharsets.UTF_8);
-
-        final CountDownLatch synLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch = new CountDownLatch(1);
-        ServerSessionFrameListener serverSessionFrameListener = new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                Assert.assertFalse(stream.isHalfClosed());
-                Assert.assertFalse(stream.isClosed());
-                synLatch.countDown();
-                return new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
-                        ByteBuffer buffer = ByteBuffer.allocate(2);
-                        while (dataInfo.available() > 0)
-                        {
-                            dataInfo.readInto(buffer);
-                            buffer.flip();
-                            bytes.write(buffer.array(), buffer.arrayOffset(), buffer.remaining());
-                            buffer.clear();
-                        }
-                        Assert.assertTrue(Arrays.equals(dataBytes, bytes.toByteArray()));
-                        Assert.assertTrue(stream.isHalfClosed());
-                        Assert.assertFalse(stream.isClosed());
-
-                        stream.reply(new ReplyInfo(true), new Callback.Adapter());
-                        Assert.assertTrue(stream.isClosed());
-                        dataLatch.countDown();
-                    }
-                };
-            }
-        };
-
-        Session session = startClient(startServer(serverSessionFrameListener), null);
-
-        final CountDownLatch streamRemovedLatch = new CountDownLatch(1);
-        session.addListener(new Session.StreamListener.Adapter()
-        {
-            @Override
-            public void onStreamClosed(Stream stream)
-            {
-                streamRemovedLatch.countDown();
-            }
-        });
-
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, new Fields(), false, (byte)0),
-                new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                replyLatch.countDown();
-            }
-        });
-        stream.data(new BytesDataInfo(dataBytes, true));
-
-        Assert.assertTrue(synLatch.await(5, TimeUnit.SECONDS));
-
-        Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-
-        Assert.assertTrue(streamRemovedLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertEquals(0, session.getStreams().size());
-    }
-
-    @Test
-    public void testSynReplyDataData() throws Exception
-    {
-        final String data1 = "foo";
-        final String data2 = "bar";
-        Session session = startClient(startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(final Stream stream, SynInfo synInfo)
-            {
-                Assert.assertTrue(stream.isHalfClosed());
-
-                stream.reply(new ReplyInfo(false), new Callback.Adapter());
-                stream.data(new StringDataInfo(5, TimeUnit.SECONDS, data1, false), new Callback.Adapter()
-                {
-                    @Override
-                    public void succeeded()
-                    {
-                        stream.data(new StringDataInfo(data2, true), new Adapter());
-                    }
-                });
-
-                return null;
-            }
-        }), null);
-
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch dataLatch1 = new CountDownLatch(1);
-        final CountDownLatch dataLatch2 = new CountDownLatch(1);
-        session.syn(new SynInfo(new Fields(), true), new StreamFrameListener.Adapter()
-        {
-            private AtomicInteger dataCount = new AtomicInteger();
-
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Assert.assertFalse(replyInfo.isClose());
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                int dataCount = this.dataCount.incrementAndGet();
-                if (dataCount == 1)
-                {
-                    String chunk1 = dataInfo.asString(StandardCharsets.UTF_8, true);
-                    Assert.assertEquals(data1, chunk1);
-                    dataLatch1.countDown();
-                }
-                else if (dataCount == 2)
-                {
-                    String chunk2 = dataInfo.asString(StandardCharsets.UTF_8, true);
-                    Assert.assertEquals(data2, chunk2);
-                    dataLatch2.countDown();
-                }
-            }
-        });
-
-        Assert.assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(dataLatch1.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(dataLatch2.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testServerSynDataReplyData() throws Exception
-    {
-        final String serverData = "server";
-        final String clientData = "client";
-
-        final CountDownLatch replyLatch = new CountDownLatch(1);
-        final CountDownLatch clientDataLatch = new CountDownLatch(1);
-        ServerSessionFrameListener serverSessionFrameListener = new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public void onConnect(Session session)
-            {
-                session.syn(new SynInfo(new Fields(), false), new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onReply(Stream stream, ReplyInfo replyInfo)
-                    {
-                        replyLatch.countDown();
-                    }
-
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        String data = dataInfo.asString(StandardCharsets.UTF_8, true);
-                        Assert.assertEquals(clientData, data);
-                        clientDataLatch.countDown();
-                    }
-                }, new Promise.Adapter<Stream>()
-                {
-                    @Override
-                    public void succeeded(Stream stream)
-                    {
-                        stream.data(new StringDataInfo(serverData, true), new Callback.Adapter());
-                    }
-                });
-            }
-        };
-
-        final CountDownLatch synLatch = new CountDownLatch(1);
-        final CountDownLatch serverDataLatch = new CountDownLatch(1);
-        SessionFrameListener clientSessionFrameListener = new SessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                Assert.assertEquals(0, stream.getId() % 2);
-
-                stream.reply(new ReplyInfo(false), new Callback.Adapter());
-                stream.data(new StringDataInfo(clientData, true), new Callback.Adapter());
-                synLatch.countDown();
-
-                return new StreamFrameListener.Adapter()
-                {
-                    @Override
-                    public void onData(Stream stream, DataInfo dataInfo)
-                    {
-                        ByteBuffer buffer = dataInfo.asByteBuffer(false);
-                        String data = StandardCharsets.UTF_8.decode(buffer).toString();
-                        Assert.assertEquals(serverData, data);
-                        serverDataLatch.countDown();
-                    }
-                };
-            }
-        };
-
-        startClient(startServer(serverSessionFrameListener), clientSessionFrameListener);
-
-        Assert.assertTrue(synLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(serverDataLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(clientDataLatch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testSynReplyDataSynReplyData() throws Exception
-    {
-        final String data = "foo";
-        ServerSessionFrameListener serverSessionFrameListener = new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                Assert.assertTrue(stream.isHalfClosed());
-
-                stream.reply(new ReplyInfo(false), new Callback.Adapter());
-                stream.data(new StringDataInfo(data, true), new Callback.Adapter());
-
-                return null;
-            }
-        };
-
-        Session session = startClient(startServer(serverSessionFrameListener), null);
-
-        final CountDownLatch replyLatch = new CountDownLatch(2);
-        final CountDownLatch dataLatch = new CountDownLatch(2);
-        StreamFrameListener clientStreamFrameListener = new StreamFrameListener.Adapter()
-        {
-            @Override
-            public void onReply(Stream stream, ReplyInfo replyInfo)
-            {
-                Assert.assertFalse(replyInfo.isClose());
-                replyLatch.countDown();
-            }
-
-            @Override
-            public void onData(Stream stream, DataInfo dataInfo)
-            {
-                String chunk = dataInfo.asString(StandardCharsets.UTF_8, true);
-                Assert.assertEquals(data, chunk);
-                dataLatch.countDown();
-            }
-        };
-        session.syn(new SynInfo(new Fields(), true), clientStreamFrameListener);
-        session.syn(new SynInfo(new Fields(), true), clientStreamFrameListener);
-
-        Assert.assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
-        Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/UnsupportedVersionTest.java b/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/UnsupportedVersionTest.java
deleted file mode 100644
index d755ee3..0000000
--- a/jetty-spdy/spdy-server/src/test/java/org/eclipse/jetty/spdy/server/UnsupportedVersionTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.spdy.server;
-
-import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
-import java.nio.channels.SocketChannel;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.spdy.StandardCompressionFactory;
-import org.eclipse.jetty.spdy.api.SPDY;
-import org.eclipse.jetty.spdy.api.Session;
-import org.eclipse.jetty.spdy.api.Stream;
-import org.eclipse.jetty.spdy.api.StreamFrameListener;
-import org.eclipse.jetty.spdy.api.StreamStatus;
-import org.eclipse.jetty.spdy.api.SynInfo;
-import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
-import org.eclipse.jetty.spdy.frames.ControlFrame;
-import org.eclipse.jetty.spdy.frames.ControlFrameType;
-import org.eclipse.jetty.spdy.frames.RstStreamFrame;
-import org.eclipse.jetty.spdy.frames.SynStreamFrame;
-import org.eclipse.jetty.spdy.generator.Generator;
-import org.eclipse.jetty.spdy.parser.Parser;
-import org.eclipse.jetty.util.Fields;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class UnsupportedVersionTest extends AbstractTest
-{
-    @Test
-    public void testSynWithUnsupportedVersion() throws Exception
-    {
-        final CountDownLatch synLatch = new CountDownLatch(1);
-        InetSocketAddress address = startServer(new ServerSessionFrameListener.Adapter()
-        {
-            @Override
-            public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
-            {
-                synLatch.countDown();
-                return null;
-            }
-
-            @Override
-            public void onFailure(Session session, Throwable x)
-            {
-                // Suppress exception logging for this test
-            }
-        });
-
-        SynStreamFrame frame = new SynStreamFrame(SPDY.V2, SynInfo.FLAG_CLOSE, 1, 0, (byte)0, (short)0, new Fields());
-        Generator generator = new Generator(new MappedByteBufferPool(), new StandardCompressionFactory.StandardCompressor());
-        ByteBuffer buffer = generator.control(frame);
-        // Replace the version byte with an unsupported version
-        buffer.putShort(0, (short)0x8001);
-
-        SocketChannel channel = SocketChannel.open(address);
-        channel.write(buffer);
-        Assert.assertFalse(buffer.hasRemaining());
-
-        Assert.assertFalse(synLatch.await(1, TimeUnit.SECONDS));
-
-        buffer = ByteBuffer.allocate(1024);
-        channel.read(buffer);
-        buffer.flip();
-
-        final CountDownLatch rstLatch = new CountDownLatch(1);
-        Parser parser = new Parser(new StandardCompressionFactory.StandardDecompressor());
-        parser.addListener(new Parser.Listener.Adapter()
-        {
-            @Override
-            public void onControlFrame(ControlFrame frame)
-            {
-                Assert.assertSame(ControlFrameType.RST_STREAM, frame.getType());
-                Assert.assertEquals(StreamStatus.UNSUPPORTED_VERSION.getCode(frame.getVersion()), ((RstStreamFrame)frame).getStatusCode());
-                rstLatch.countDown();
-            }
-        });
-        parser.parse(buffer);
-
-        Assert.assertTrue(rstLatch.await(5, TimeUnit.SECONDS));
-    }
-}
diff --git a/jetty-spdy/spdy-server/src/test/resources/jetty-logging.properties b/jetty-spdy/spdy-server/src/test/resources/jetty-logging.properties
deleted file mode 100644
index ead13ec..0000000
--- a/jetty-spdy/spdy-server/src/test/resources/jetty-logging.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
-#org.eclipse.jetty.spdy.LEVEL=DEBUG
diff --git a/jetty-spring/pom.xml b/jetty-spring/pom.xml
index 19fc269..2d4788b 100644
--- a/jetty-spring/pom.xml
+++ b/jetty-spring/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-spring</artifactId>
@@ -11,28 +11,12 @@
   <properties>
     <spring-version>3.2.8.RELEASE</spring-version>
     <dependencies>target/dependencies</dependencies>
+    <bundle-symbolic-name>${project.groupId}.spring</bundle-symbolic-name>
   </properties>
 
   <build>
     <defaultGoal>install</defaultGoal>
     <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
     </plugins>
   </build>
   <dependencies>
diff --git a/jetty-spring/src/main/config/modules/spring.mod b/jetty-spring/src/main/config/modules/spring.mod
index 444afb2..39b9b8d 100644
--- a/jetty-spring/src/main/config/modules/spring.mod
+++ b/jetty-spring/src/main/config/modules/spring.mod
@@ -1,6 +1,7 @@
 #
 # Spring
 #
+
 [name]
 spring
 
diff --git a/jetty-spring/src/main/java/org/eclipse/jetty/spring/SpringConfigurationProcessor.java b/jetty-spring/src/main/java/org/eclipse/jetty/spring/SpringConfigurationProcessor.java
index 52dddc0..1f22179 100644
--- a/jetty-spring/src/main/java/org/eclipse/jetty/spring/SpringConfigurationProcessor.java
+++ b/jetty-spring/src/main/java/org/eclipse/jetty/spring/SpringConfigurationProcessor.java
@@ -36,28 +36,27 @@
 import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.beans.factory.support.DefaultListableBeanFactory;
 import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
-import org.springframework.beans.factory.xml.XmlBeanFactory;
 import org.springframework.core.io.ByteArrayResource;
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.UrlResource;
 
 /**
  * Spring ConfigurationProcessor
- * <p/>
+ * <p>
  * A {@link ConfigurationProcessor} that uses a spring XML file to emulate the {@link XmlConfiguration} format.
- * <p/>
+ * <p>
  * {@link XmlConfiguration} expects a primary object that is either passed in to a call to {@link #configure(Object)}
  * or that is constructed by a call to {@link #configure()}. This processor looks for a bean definition
  * with an id, name or alias of "Main" as uses that as the primary bean.
- * <p/>
+ * <p>
  * The objects mapped by {@link XmlConfiguration#getIdMap()} are set as singletons before any configuration calls
  * and if the spring configuration file contains a definition for the singleton id, the the singleton is updated
- * with a call to {@link XmlBeanFactory#configureBean(Object, String)}.
- * <p/>
+ * with a call to {@link DefaultListableBeanFactory#configureBean(Object, String)}.
+ * <p>
  * The property map obtained via {@link XmlConfiguration#getProperties()} is set as a singleton called "properties"
  * and values can be accessed by somewhat verbose
  * usage of {@link org.springframework.beans.factory.config.MethodInvokingFactoryBean}.
- * <p/>
+ * <p>
  * This processor is returned by the {@link SpringConfigurationProcessorFactory} for any XML document whos first
  * element is "beans". The factory is discovered by a {@link ServiceLoader} for {@link ConfigurationProcessorFactory}.
  */
diff --git a/jetty-spring/src/main/java/org/eclipse/jetty/spring/SpringConfigurationProcessorFactory.java b/jetty-spring/src/main/java/org/eclipse/jetty/spring/SpringConfigurationProcessorFactory.java
index a29366a..701009c 100644
--- a/jetty-spring/src/main/java/org/eclipse/jetty/spring/SpringConfigurationProcessorFactory.java
+++ b/jetty-spring/src/main/java/org/eclipse/jetty/spring/SpringConfigurationProcessorFactory.java
@@ -24,7 +24,7 @@
 
 /**
  * Spring ConfigurationProcessor Factory
- * <p/>
+ * <p>
  * Create a {@link SpringConfigurationProcessor} for XML documents with a "beans" element.
  * The factory is discovered by a {@link java.util.ServiceLoader} for {@link ConfigurationProcessorFactory}.
  *
diff --git a/jetty-start/pom.xml b/jetty-start/pom.xml
index 16b33e1..fbf9214 100644
--- a/jetty-start/pom.xml
+++ b/jetty-start/pom.xml
@@ -2,13 +2,17 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-start</artifactId>
   <name>Jetty :: Start</name>
   <description>The start utility</description>
   <url>http://www.eclipse.org/jetty</url>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.start</bundle-symbolic-name>
+    <start-jar-file-name>start.jar</start-jar-file-name>
+  </properties>
   <build>
    <plugins>
       <plugin>
@@ -30,9 +34,6 @@
       </plugin>
     </plugins>
   </build>
-  <properties>
-    <start-jar-file-name>start.jar</start-jar-file-name>
-  </properties>
   <dependencies>
     <dependency>
       <groupId>org.eclipse.jetty.toolchain</groupId>
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/BaseBuilder.java b/jetty-start/src/main/java/org/eclipse/jetty/start/BaseBuilder.java
new file mode 100644
index 0000000..46b3122
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/BaseBuilder.java
@@ -0,0 +1,399 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start;
+
+import java.io.IOException;
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jetty.start.builders.StartDirBuilder;
+import org.eclipse.jetty.start.builders.StartIniBuilder;
+import org.eclipse.jetty.start.fileinits.MavenLocalRepoFileInitializer;
+import org.eclipse.jetty.start.fileinits.TestFileInitializer;
+import org.eclipse.jetty.start.fileinits.UriFileInitializer;
+import org.eclipse.jetty.start.graph.CriteriaSetPredicate;
+import org.eclipse.jetty.start.graph.UniqueCriteriaPredicate;
+import org.eclipse.jetty.start.graph.Predicate;
+import org.eclipse.jetty.start.graph.Selection;
+
+/**
+ * Build a start configuration in <code>${jetty.base}</code>, including
+ * ini files, directories, and libs. Also handles License management.
+ */
+public class BaseBuilder
+{
+    public static interface Config
+    {
+        /**
+         * Add a module to the start environment in <code>${jetty.base}</code>
+         *
+         * @param module
+         *            the module to add
+         * @return true if module was added, false if module was not added
+         *         (because that module already exists)
+         * @throws IOException if unable to add the module
+         */
+        public boolean addModule(Module module) throws IOException;
+    }
+
+    private static final String EXITING_LICENSE_NOT_ACKNOWLEDGED = "Exiting: license not acknowledged!";
+
+    private final BaseHome baseHome;
+    private final List<FileInitializer> fileInitializers;
+    private final StartArgs startArgs;
+
+    public BaseBuilder(BaseHome baseHome, StartArgs args)
+    {
+        this.baseHome = baseHome;
+        this.startArgs = args;
+        this.fileInitializers = new ArrayList<>();
+
+        // Establish FileInitializers
+        if (args.isTestingModeEnabled())
+        {
+            // No downloads performed
+            fileInitializers.add(new TestFileInitializer());
+        }
+        else if (args.isDownload())
+        {
+            // Downloads are allowed to be performed
+            // Setup Maven Local Repo
+            Path localRepoDir = args.getMavenLocalRepoDir();
+            if (localRepoDir != null)
+            {
+                // Use provided local repo directory
+                fileInitializers.add(new MavenLocalRepoFileInitializer(baseHome,localRepoDir));
+            }
+            else
+            {
+                // No no local repo directory (direct downloads)
+                fileInitializers.add(new MavenLocalRepoFileInitializer(baseHome));
+            }
+
+            // Normal URL downloads
+            fileInitializers.add(new UriFileInitializer(baseHome));
+        }
+    }
+
+    private void ackLicenses() throws IOException
+    {
+        if (startArgs.isLicenseCheckRequired())
+        {
+            if (startArgs.isApproveAllLicenses())
+            {
+                StartLog.info("All Licenses Approved via Command Line Option");
+            }
+            else
+            {
+                Licensing licensing = new Licensing();
+                for (Module module : startArgs.getAllModules().getSelected())
+                {
+                    if (!module.hasFiles(baseHome,startArgs.getProperties()))
+                    {
+                        licensing.addModule(module);
+                    }
+                }
+
+                if (licensing.hasLicenses())
+                {
+                    StartLog.debug("Requesting License Acknowledgement");
+                    if (!licensing.acknowledgeLicenses())
+                    {
+                        StartLog.warn(EXITING_LICENSE_NOT_ACKNOWLEDGED);
+                        System.exit(1);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Build out the Base directory (if needed)
+     * 
+     * @return true if base directory was changed, false if left unchanged.
+     * @throws IOException if unable to build
+     */
+    public boolean build() throws IOException
+    {
+        Modules modules = startArgs.getAllModules();
+        boolean dirty = false;
+
+        String dirCriteria = "<add-to-startd>";
+        String iniCriteria = "<add-to-start-ini>";
+        Selection startDirSelection = new Selection(dirCriteria);
+        Selection startIniSelection = new Selection(iniCriteria);
+        
+        List<String> startDNames = new ArrayList<>();
+        startDNames.addAll(startArgs.getAddToStartdIni());
+        List<String> startIniNames = new ArrayList<>();
+        startIniNames.addAll(startArgs.getAddToStartIni());
+
+        int count = 0;
+        count += modules.selectNodes(startDNames,startDirSelection);
+        count += modules.selectNodes(startIniNames,startIniSelection);
+
+        // look for ambiguous declaration found in both places
+        Predicate ambiguousPredicate = new CriteriaSetPredicate(dirCriteria,iniCriteria);
+        List<Module> ambiguous = modules.getMatching(ambiguousPredicate);
+
+        if (ambiguous.size() > 0)
+        {
+            StringBuilder warn = new StringBuilder();
+            warn.append("Ambiguous module locations detected, defaulting to --add-to-start for the following module selections:");
+            warn.append(" [");
+            
+            for (int i = 0; i < ambiguous.size(); i++)
+            {
+                if (i > 0)
+                {
+                    warn.append(", ");
+                }
+                warn.append(ambiguous.get(i).getName());
+            }
+            warn.append(']');
+            StartLog.warn(warn.toString());
+        }
+
+        StartLog.debug("Adding %s new module(s)",count);
+        
+        // Acknowledge Licenses
+        ackLicenses();
+
+        // Collect specific modules to enable
+        // Should match 'criteria', with no other selections.explicit
+        Predicate startDMatcher = new UniqueCriteriaPredicate(dirCriteria);
+        Predicate startIniMatcher = new UniqueCriteriaPredicate(iniCriteria);
+
+        List<Module> startDModules = modules.getMatching(startDMatcher);
+        List<Module> startIniModules = modules.getMatching(startIniMatcher);
+
+        List<FileArg> files = new ArrayList<FileArg>();
+
+        if (!startDModules.isEmpty())
+        {
+            StartDirBuilder builder = new StartDirBuilder(this);
+            for (Module mod : startDModules)
+            {
+                if (ambiguous.contains(mod))
+                {
+                    // skip ambiguous module
+                    continue;
+                }
+                
+                if (mod.isSkipFilesValidation())
+                {
+                    StartLog.debug("Skipping [files] validation on %s",mod.getName());
+                } 
+                else 
+                {
+                    dirty |= builder.addModule(mod);
+                    for (String file : mod.getFiles())
+                    {
+                        files.add(new FileArg(mod,startArgs.getProperties().expand(file)));
+                    }
+                }
+            }
+        }
+
+        if (!startIniModules.isEmpty())
+        {
+            StartIniBuilder builder = new StartIniBuilder(this);
+            for (Module mod : startIniModules)
+            {
+                if (mod.isSkipFilesValidation())
+                {
+                    StartLog.debug("Skipping [files] validation on %s",mod.getName());
+                } 
+                else 
+                {
+                    dirty |= builder.addModule(mod);
+                    for (String file : mod.getFiles())
+                    {
+                        files.add(new FileArg(mod,startArgs.getProperties().expand(file)));
+                    }
+                }
+            }
+        }
+        
+        // Process files
+        files.addAll(startArgs.getFiles());
+        dirty |= processFileResources(files);
+
+        return dirty;
+    }
+
+    public BaseHome getBaseHome()
+    {
+        return baseHome;
+    }
+
+    public StartArgs getStartArgs()
+    {
+        return startArgs;
+    }
+
+    /**
+     * Process a specific file resource
+     * 
+     * @param arg
+     *            the fileArg to work with
+     * @param file
+     *            the resolved file reference to work with
+     * @return true if change was made as a result of the file, false if no change made.
+     * @throws IOException
+     *             if there was an issue in processing this file
+     */
+    private boolean processFileResource(FileArg arg, Path file) throws IOException
+    {
+        if (startArgs.isDownload() && (arg.uri != null))
+        {
+            // now on copy/download paths (be safe above all else)
+            if (!file.startsWith(baseHome.getBasePath()))
+            {
+                throw new IOException("For security reasons, Jetty start is unable to process maven file resource not in ${jetty.base} - " + file);
+            }
+            
+            // make the directories in ${jetty.base} that we need
+            FS.ensureDirectoryExists(file.getParent());
+            
+            URI uri = URI.create(arg.uri);
+
+            // Process via initializers
+            for (FileInitializer finit : fileInitializers)
+            {
+                if (finit.init(uri,file,arg.location))
+                {
+                    // Completed successfully
+                    return true;
+                }
+            }
+
+            return false;
+        }
+        else
+        {
+            // Process directly
+            boolean isDir = arg.location.endsWith("/");
+
+            if (FS.exists(file))
+            {
+                // Validate existence
+                if (isDir)
+                {
+                    if (!Files.isDirectory(file))
+                    {
+                        throw new IOException("Invalid: path should be a directory (but isn't): " + file);
+                    }
+                    if (!FS.canReadDirectory(file))
+                    {
+                        throw new IOException("Unable to read directory: " + file);
+                    }
+                }
+                else
+                {
+                    if (!FS.canReadFile(file))
+                    {
+                        throw new IOException("Unable to read file: " + file);
+                    }
+                }
+
+                return false;
+            }
+
+            if (isDir)
+            {
+                // Create directory
+                StartLog.log("MKDIR",baseHome.toShortForm(file));
+                return FS.ensureDirectoryExists(file);
+            }
+            else
+            {
+                // Warn on missing file (this has to be resolved manually by user)
+                String shortRef = baseHome.toShortForm(file);
+                if (startArgs.isTestingModeEnabled())
+                {
+                    StartLog.log("TESTING MODE","Skipping required file check on: %s",shortRef);
+                    return true;
+                }
+
+                StartLog.warn("Missing Required File: %s",baseHome.toShortForm(file));
+                startArgs.setRun(false);
+                if (arg.uri != null)
+                {
+                    StartLog.warn("  Can be downloaded From: %s",arg.uri);
+                    StartLog.warn("  Run start.jar --create-files to download");
+                }
+
+                return true;
+            }
+        }
+    }
+
+    /**
+     * Process the {@link FileArg} for startup, assume that all licenses have
+     * been acknowledged at this stage.
+     *
+     * @param files
+     *            the list of {@link FileArg}s to process
+     * @return true if base directory modified, false if left untouched
+     */
+    private boolean processFileResources(List<FileArg> files) throws IOException
+    {
+        if ((files == null) || (files.isEmpty()))
+        {
+            return false;
+        }
+
+        boolean dirty = false;
+
+        List<String> failures = new ArrayList<String>();
+
+        for (FileArg arg : files)
+        {
+            Path file = baseHome.getBasePath(arg.location);
+            try
+            {
+                dirty |= processFileResource(arg,file);
+            }
+            catch (Throwable t)
+            {
+                StartLog.warn(t);
+                failures.add(String.format("[%s] %s - %s",t.getClass().getSimpleName(),t.getMessage(),file.toAbsolutePath().toString()));
+            }
+        }
+
+        if (!failures.isEmpty())
+        {
+            StringBuilder err = new StringBuilder();
+            err.append("Failed to process all file resources.");
+            for (String failure : failures)
+            {
+                err.append(System.lineSeparator()).append(" - ").append(failure);
+            }
+            StartLog.warn(err.toString());
+
+            throw new RuntimeException(err.toString());
+        }
+
+        return dirty;
+    }
+}
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/BaseHome.java b/jetty-start/src/main/java/org/eclipse/jetty/start/BaseHome.java
index 9ffb07b..f3a7b4b 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/BaseHome.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/BaseHome.java
@@ -130,7 +130,6 @@
 
     public BaseHome(CommandLineConfigSource cmdLineSource) throws IOException
     {
-
         sources = new ConfigSources();
         sources.add(cmdLineSource);
         this.homeDir = cmdLineSource.getHomePath();
@@ -201,7 +200,7 @@
      */
     public Path getBasePath(String path)
     {
-        return baseDir.resolve(path);
+        return baseDir.resolve(path).normalize().toAbsolutePath();
     }
 
     public ConfigSources getConfigSources()
@@ -324,20 +323,19 @@
      * <dt><code>lib/**&#47;*-dev.jar</code></dt>
      * <dd>Relative pattern, recursive search <code>${jetty.home}</code> then <code>${jetty.base}</code> for files under <code>lib</code> ending in
      * <code>-dev.jar</code></dd>
-     * </dl>
      * 
      * <dt><code>etc/jetty.xml</code></dt>
      * <dd>Relative pattern, no glob, search for <code>${jetty.home}/etc/jetty.xml</code> then <code>${jetty.base}/etc/jetty.xml</code></dd>
      * 
      * <dt><code>glob:/opt/app/common/*-corp.jar</code></dt>
-     * <dd>PathMapper pattern, glob, search <code>/opt/app/common/</code> for <code>*-corp.jar</code></code></dd>
+     * <dd>PathMapper pattern, glob, search <code>/opt/app/common/</code> for <code>*-corp.jar</code></dd>
      * 
      * </dl>
      * 
      * <p>
      * Notes:
      * <ul>
-     * <li>FileSystem case sensitivity is implementation specific (eg: linux is case-sensitive, windows is case-insensitive).<br/>
+     * <li>FileSystem case sensitivity is implementation specific (eg: linux is case-sensitive, windows is case-insensitive).<br>
      * See {@link java.nio.file.FileSystem#getPathMatcher(String)} for more details</li>
      * <li>Pattern slashes are implementation neutral (use '/' always and you'll be fine)</li>
      * <li>Recursive searching is limited to 30 levels deep (not configurable)</li>
@@ -415,6 +413,8 @@
 
     /**
      * Convenience method for <code>toShortForm(file.toPath())</code>
+     * @param path the path to shorten
+     * @return the short form of the path as a String
      */
     public String toShortForm(final File path)
     {
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/Classpath.java b/jetty-start/src/main/java/org/eclipse/jetty/start/Classpath.java
index 51ad4f7..6e4991f 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/Classpath.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/Classpath.java
@@ -36,6 +36,11 @@
 {
     private static class Loader extends URLClassLoader
     {
+        static
+        {
+            registerAsParallelCapable();
+        }
+
         Loader(URL[] urls, ClassLoader parent)
         {
             super(urls,parent);
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/CommandLineBuilder.java b/jetty-start/src/main/java/org/eclipse/jetty/start/CommandLineBuilder.java
index 7b3427a..7d86f66 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/CommandLineBuilder.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/CommandLineBuilder.java
@@ -62,8 +62,8 @@
      * Perform an optional quoting of the argument, being intelligent with spaces and quotes as needed. If a subString is set in quotes it won't the subString
      * won't be escaped.
      * 
-     * @param arg
-     * @return
+     * @param arg the argument to quote
+     * @return the quoted and escaped argument
      */
     public static String quote(String arg)
     {
@@ -126,7 +126,6 @@
     /**
      * Similar to {@link #addArg(String)} but concats both name + value with an "=" sign, quoting were needed, and excluding the "=" portion if the value is
      * undefined or empty.
-     * <p>
      * 
      * <pre>
      *   addEqualsArg("-Dname", "value") = "-Dname=value"
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/FS.java b/jetty-start/src/main/java/org/eclipse/jetty/start/FS.java
index d303412..bbb5cf6 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/FS.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/FS.java
@@ -67,14 +67,15 @@
         return Files.exists(ret);
     }
 
-    public static void ensureDirectoryExists(Path dir) throws IOException
+    public static boolean ensureDirectoryExists(Path dir) throws IOException
     {
         if (exists(dir))
         {
             // exists already, nothing to do
-            return;
+            return false;
         }
         Files.createDirectories(dir);
+        return true;
     }
 
     public static void ensureDirectoryWritable(Path dir) throws IOException
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/FileInitializer.java b/jetty-start/src/main/java/org/eclipse/jetty/start/FileInitializer.java
new file mode 100644
index 0000000..25055ad
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/FileInitializer.java
@@ -0,0 +1,46 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start;
+
+import java.io.IOException;
+import java.net.URI;
+import java.nio.file.Path;
+
+/**
+ * Interface for initializing a file resource.
+ */
+public interface FileInitializer
+{
+    /**
+     * Initialize a file resource
+     * 
+     * @param uri
+     *            the remote URI of the resource acting as its source
+     * @param file
+     *            the local file resource to initialize. (often in ${jetty.base} directory) 
+     * @param fileRef
+     *            the simple string reference to the output file, suitable for searching
+     *            for the file in other locations (like ${jetty.home} or ${jetty.dir})
+     * @return true if local file is initialized (resulted in a change on disk), false if this
+     *         {@link FileInitializer} did nothing.
+     * @throws IOException
+     *             if there was an attempt to initialize, but an error occurred.
+     */
+    public boolean init(URI uri, Path file, String fileRef) throws IOException;
+}
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/Licensing.java b/jetty-start/src/main/java/org/eclipse/jetty/start/Licensing.java
new file mode 100644
index 0000000..eb5149b
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/Licensing.java
@@ -0,0 +1,104 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * Handles basic license presentation and acknowledgement.
+ */
+public class Licensing
+{
+    private static final String PROP_ACK_LICENSES = "org.eclipse.jetty.start.ack.licenses";
+    public Map<String, List<String>> licenseMap = new TreeMap<>(new NaturalSort.Strings());
+
+    public void addModule(Module module)
+    {
+        if (!module.hasLicense())
+        {
+            // skip, no license
+            return;
+        }
+        
+        if (licenseMap.containsKey(module.getName()))
+        {
+            // skip, already being tracked
+            return;
+        }
+
+        licenseMap.put(module.getName(),module.getLicense());
+    }
+
+    public boolean hasLicenses()
+    {
+        return !licenseMap.isEmpty();
+    }
+
+    public boolean acknowledgeLicenses() throws IOException
+    {
+        if (!hasLicenses())
+        {
+            return true;
+        }
+        
+        System.err.printf("%nALERT: There are enabled module(s) with licenses.%n");
+        System.err.printf("The following %d module(s):%n", licenseMap.size());
+        System.err.printf(" + contains software not provided by the Eclipse Foundation!%n");
+        System.err.printf(" + contains software not covered by the Eclipse Public License!%n");
+        System.err.printf(" + has not been audited for compliance with its license%n");
+
+        for (String key : licenseMap.keySet())
+        {
+            System.err.printf("%n Module: %s%n",key);
+            for (String line : licenseMap.get(key))
+            {
+                System.err.printf("  + %s%n",line);
+            }
+        }
+
+        boolean licenseAck = false;
+
+        String propBasedAckValue = System.getProperty(PROP_ACK_LICENSES);
+        if (propBasedAckValue != null)
+        {
+            StartLog.log("TESTING MODE","Programmatic ACK - %s=%s",PROP_ACK_LICENSES,propBasedAckValue);
+            licenseAck = Boolean.parseBoolean(propBasedAckValue);
+        }
+        else
+        {
+            if (Boolean.getBoolean("org.eclipse.jetty.start.testing"))
+            {
+                throw new RuntimeException("Test Configuration Missing - Pre-specify answer to (" + PROP_ACK_LICENSES + ") in test case");
+            }
+
+            BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
+            System.err.printf("%nProceed (y/N)? ");
+            String response = input.readLine();
+
+            licenseAck = (Utils.isNotBlank(response) && response.toLowerCase().startsWith("y"));
+        }
+
+        return licenseAck;
+    }
+}
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/Main.java b/jetty-start/src/main/java/org/eclipse/jetty/start/Main.java
index e1faf56..192affe 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/Main.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/Main.java
@@ -18,38 +18,31 @@
 
 package org.eclipse.jetty.start;
 
-import static org.eclipse.jetty.start.UsageException.*;
+import static org.eclipse.jetty.start.UsageException.ERR_BAD_GRAPH;
+import static org.eclipse.jetty.start.UsageException.ERR_INVOKE_MAIN;
+import static org.eclipse.jetty.start.UsageException.ERR_NOT_STOPPED;
+import static org.eclipse.jetty.start.UsageException.ERR_UNKNOWN;
 
 import java.io.BufferedReader;
-import java.io.BufferedWriter;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.LineNumberReader;
 import java.io.OutputStream;
-import java.io.PrintWriter;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.net.ConnectException;
 import java.net.InetAddress;
 import java.net.Socket;
 import java.net.SocketTimeoutException;
-import java.net.URL;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
 import java.nio.file.Path;
-import java.nio.file.StandardOpenOption;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
-import java.util.Set;
-import java.util.regex.Pattern;
 
 import org.eclipse.jetty.start.config.CommandLineConfigSource;
+import org.eclipse.jetty.start.graph.GraphException;
+import org.eclipse.jetty.start.graph.Selection;
 
 /**
  * Main start class.
@@ -57,52 +50,22 @@
  * This class is intended to be the main class listed in the MANIFEST.MF of the start.jar archive. It allows the Jetty Application server to be started with the
  * command "java -jar start.jar".
  * <p>
- * Argument processing steps:
+ * <b>Argument processing steps:</b>
  * <ol>
- * <li>Directory Locations:
- * <ul>
- * <li>jetty.home=[directory] (the jetty.home location)</li>
- * <li>jetty.base=[directory] (the jetty.base location)</li>
- * </ul>
- * </li>
- * <li>Start Logging behavior:
- * <ul>
- * <li>--debug (debugging enabled)</li>
- * <li>--start-log-file=logs/start.log (output start logs to logs/start.log location)</li>
- * </ul>
- * </li>
+ * <li>Directory Location: jetty.home=[directory] (the jetty.home location)</li>
+ * <li>Directory Location: jetty.base=[directory] (the jetty.base location)</li>
+ * <li>Start Logging behavior: --debug (debugging enabled)</li>
+ * <li>Start Logging behavior: --start-log-file=logs/start.log (output start logs to logs/start.log location)</li>
  * <li>Module Resolution</li>
  * <li>Properties Resolution</li>
  * <li>Present Optional Informational Options</li>
  * <li>Normal Startup</li>
- * </li>
  * </ol>
  */
 public class Main
 {
-    private static final String EXITING_LICENSE_NOT_ACKNOWLEDGED = "Exiting: license not acknowledged!";
     private static final int EXIT_USAGE = 1;
 
-    public static String join(Collection<?> objs, String delim)
-    {
-        if (objs==null)
-        {
-            return "";
-        }
-        StringBuilder str = new StringBuilder();
-        boolean needDelim = false;
-        for (Object obj : objs)
-        {
-            if (needDelim)
-            {
-                str.append(delim);
-            }
-            str.append(obj);
-            needDelim = true;
-        }
-        return str.toString();
-    }
-
     public static void main(String[] args)
     {
         try
@@ -172,76 +135,6 @@
         }).start();
     }
 
-    private void initFile(StartArgs args, FileArg farg)
-    {
-        try
-        {
-            Path file = baseHome.getBasePath(farg.location);
-            
-            StartLog.debug("[init-file] %s module specified file %s",file.toAbsolutePath(),(FS.exists(file)?"[Exists!]":""));
-            if (FS.exists(file))
-            {
-                // file already initialized / downloaded, skip it
-                return;
-            }
-
-            if (farg.uri!=null)
-            {
-                URL url = new URL(farg.uri);
-
-                StartLog.log("DOWNLOAD", "%s to %s", url, farg.location);
-
-                FS.ensureDirectoryExists(file.getParent());
-                
-                if (args.isTestingModeEnabled())
-                {
-                    StartLog.log("TESTING MODE", "Skipping download of " + url);
-                    return;
-                }
-
-                byte[] buf = new byte[8192];
-                try (InputStream in = url.openStream(); 
-                     OutputStream out = Files.newOutputStream(file,StandardOpenOption.CREATE_NEW,StandardOpenOption.WRITE))
-                {
-                    while (true)
-                    {
-                        int len = in.read(buf);
-
-                        if (len > 0)
-                        {
-                            out.write(buf,0,len);
-                        }
-                        if (len < 0)
-                        {
-                            break;
-                        }
-                    }
-                }
-            }
-            else if (farg.location.endsWith("/"))
-            {
-                StartLog.log("MKDIR",baseHome.toShortForm(file));
-                FS.ensureDirectoryExists(file);
-            }
-            else
-            {
-                String shortRef = baseHome.toShortForm(file);
-                if (args.isTestingModeEnabled())
-                {
-                    StartLog.log("TESTING MODE","Skipping required file check on: %s",shortRef);
-                    return;
-                }
-                StartLog.warn("MISSING: Required file %s",shortRef);
-            }
-        }
-        catch (Exception e)
-        {
-            StartLog.warn("ERROR: processing %s%n%s",farg,e);
-            StartLog.warn(e);
-            usageExit(EXIT_USAGE);
-        }
-    }
-
     private void dumpClasspathWithVersions(Classpath classpath)
     {
         StartLog.endStartLog();
@@ -344,7 +237,7 @@
         args.dumpActiveXmls(baseHome);
     }
 
-    private void listModules(StartArgs args)
+    public void listModules(StartArgs args)
     {
         StartLog.endStartLog();
         System.out.println();
@@ -354,227 +247,17 @@
 
         // Dump Enabled Modules
         System.out.println();
-        System.out.println("Jetty Active Module Tree:");
-        System.out.println("-------------------------");
+        System.out.println("Jetty Selected Module Ordering:");
+        System.out.println("-------------------------------");
         Modules modules = args.getAllModules();
-        modules.dumpEnabledTree();
-    }
-
-    /**
-     * Build out INI file.
-     * <p>
-     * This applies equally for either <code>${jetty.base}/start.ini</code> or
-     * <code>${jetty.base}/start.d/${name}.ini</code> 
-     * 
-     * @param args the arguments of what modules are enabled
-     * @param name the name of the module to based the build of the ini
-     * @param topLevel 
-     * @param appendStartIni true to append to <code>${jetty.base}/start.ini</code>, 
-     * false to create a <code>${jetty.base}/start.d/${name}.ini</code> entry instead.
-     * @throws IOException
-     */
-    private void buildIni(StartArgs args, String name, boolean topLevel, boolean appendStartIni) throws IOException
-    {        
-        // Find the start.d relative to the base directory only.
-        Path start_d = baseHome.getBasePath("start.d");
-
-        // Is this a module?
-        Modules modules = args.getAllModules();
-        Module module = modules.get(name);
-        if (module == null)
-        {
-            StartLog.warn("ERROR: No known module for %s",name);
-            return;
-        }
-        
-        boolean transitive = module.isEnabled() && (module.getSources().size() == 0);
-
-        // Find any named ini file and check it follows the convention
-        Path start_ini = baseHome.getBasePath("start.ini");
-        String short_start_ini = baseHome.toShortForm(start_ini);
-        Path startd_ini = start_d.resolve(name + ".ini");
-        String short_startd_ini = baseHome.toShortForm(startd_ini);
-        StartIni module_ini = null;
-        if (FS.exists(startd_ini))
-        {
-            module_ini = new StartIni(startd_ini);
-            if (module_ini.getLineMatches(Pattern.compile("--module=(.*, *)*" + name)).size() == 0)
-            {
-                StartLog.warn("ERROR: %s is not enabled in %s!",name,short_startd_ini);
-                return;
-            }
-        }
-
-        if (!args.isApproveAllLicenses())
-        {
-            if (!module.hasFiles(baseHome) && !module.acknowledgeLicense())
-            {
-                StartLog.warn(EXITING_LICENSE_NOT_ACKNOWLEDGED);
-                System.exit(1);
-            }
-        }
-        
-        boolean buildIni=false;
-        if (module.isEnabled())
-        {
-            // is it an explicit request to create an ini file?
-            if (topLevel && !FS.exists(startd_ini) && !appendStartIni)
-            {
-                buildIni=true;
-            }
-            // else is it transitive
-            else if (transitive)
-            {
-                if (module.hasDefaultConfig())
-                {
-                    buildIni = true;
-                    StartLog.info("%-15s initialised transitively",name);
-                }
-            }
-            // else must be initialized explicitly
-            else 
-            {
-                for (String source : module.getSources())
-                {
-                    StartLog.info("%-15s initialised in %s",name,baseHome.toShortForm(source));
-                }
-            }
-        }
-        else 
-        {
-            buildIni=true;
-        }
-        
-        String source = "<transitive>";
-
-        // If we need an ini
-        if (buildIni)
-        {
-            // File BufferedWriter
-            BufferedWriter writer = null;
-            PrintWriter out = null;
-            try
-            {
-                if (appendStartIni)
-                {
-                    source = short_start_ini;
-                    StartLog.info("%-15s initialised in %s (appended)",name,source);
-                    writer = Files.newBufferedWriter(start_ini,StandardCharsets.UTF_8,StandardOpenOption.CREATE,StandardOpenOption.APPEND);
-                    out = new PrintWriter(writer);
-                }
-                else
-                {
-                    // Create the directory if needed
-                    FS.ensureDirectoryExists(start_d);
-                    FS.ensureDirectoryWritable(start_d);
-                    source = short_startd_ini;
-                    StartLog.info("%-15s initialised in %s (created)",name,source);
-                    writer = Files.newBufferedWriter(startd_ini,StandardCharsets.UTF_8,StandardOpenOption.CREATE_NEW,StandardOpenOption.WRITE);
-                    out = new PrintWriter(writer);
-                }
-
-                if (appendStartIni)
-                {
-                    out.println();
-                }
-                out.println("# --------------------------------------- ");
-                out.println("# Module: " + name);
-
-                out.println("--module=" + name);
-                
-                args.parse("--module=" + name,source);
-                args.parseModule(module);
-                
-                for (String line : module.getDefaultConfig())
-                {
-                    out.println(line);
-                }
-            }
-            finally
-            {
-                if (out != null)
-                {
-                    out.close();
-                }
-            }
-        }
-        
-        modules.enable(name,Collections.singletonList(source));
-        
-        // Also list other places this module is enabled
-        for (String src : module.getSources())
-        {
-            StartLog.debug("also enabled in: %s",src);
-            if (!short_start_ini.equals(src))
-            {
-                StartLog.info("%-15s enabled in     %s",name,baseHome.toShortForm(src));
-            }
-        }
-
-        // Do downloads now
-        for (String file : module.getFiles())
-        {
-            initFile(args, new FileArg(module,file));
-        }
-
-        // Process dependencies
-        module.expandProperties(args.getProperties());
-        modules.registerParentsIfMissing(module);
-        modules.buildGraph();
-        
-        // process new ini modules
-        if (topLevel)
-        {
-            List<Module> depends = new ArrayList<>();
-            for (String depend : modules.resolveParentModulesOf(name))
-            {
-                if (!name.equals(depend))
-                {
-                    Module m = modules.get(depend);
-                    m.setEnabled(true);
-                    depends.add(m);
-                }
-            }
-            Collections.sort(depends,Collections.reverseOrder(new Module.DepthComparator()));
-            
-            Set<String> done = new HashSet<>(0);
-            while (true)
-            {
-                // initialize known dependencies
-                boolean complete=true;
-                for (Module m : depends)
-                {
-                    if (!done.contains(m.getName()))
-                    {
-                        complete=false;
-                        buildIni(args,m.getName(),false,appendStartIni);
-                        done.add(m.getName());
-                    }
-                }
-                
-                if (complete)
-                {
-                    break;
-                }
-                
-                // look for any new ones resolved via expansion
-                depends.clear();
-                for (String depend : modules.resolveParentModulesOf(name))
-                {
-                    if (!name.equals(depend))
-                    {
-                        Module m = modules.get(depend);
-                        m.setEnabled(true);
-                        depends.add(m);
-                    }
-                }
-                Collections.sort(depends,Collections.reverseOrder(new Module.DepthComparator()));
-            }
-        }
+        modules.dumpSelected();
     }
 
     /**
      * Convenience for <code>processCommandLine(cmdLine.toArray(new String[cmdLine.size()]))</code>
+     * @param cmdLine the command line
+     * @return the start args parsed from the command line
+     * @throws Exception if unable to process the command line
      */
     public StartArgs processCommandLine(List<String> cmdLine) throws Exception
     {
@@ -601,30 +284,58 @@
         StartArgs args = new StartArgs();
         args.parse(baseHome.getConfigSources());
 
-        // ------------------------------------------------------------
-        // 3) Module Registration
-        Modules modules = new Modules(baseHome,args);
-        StartLog.debug("Registering all modules");
-        modules.registerAll();
-
-        // ------------------------------------------------------------
-        // 4) Active Module Resolution
-        for (String enabledModule : args.getEnabledModules())
+        try
         {
-            List<String> msources = args.getSources(enabledModule);
-            modules.enable(enabledModule,msources);
-        }
-        
-        StartLog.debug("Building Module Graph");
-        modules.buildGraph();
+            // ------------------------------------------------------------
+            // 3) Module Registration
+            Modules modules = new Modules(baseHome,args);
+            StartLog.debug("Registering all modules");
+            modules.registerAll();
 
-        args.setAllModules(modules);
-        List<Module> activeModules = modules.resolveEnabled();
-        
-        // ------------------------------------------------------------
-        // 5) Lib & XML Expansion / Resolution
-        args.expandLibs(baseHome);
-        args.expandModules(baseHome,activeModules);
+            // ------------------------------------------------------------
+            // 4) Active Module Resolution
+            for (String enabledModule : args.getEnabledModules())
+            {
+                for (String source : args.getSources(enabledModule))
+                {
+                    String shortForm = baseHome.toShortForm(source);
+                    modules.selectNode(enabledModule,new Selection(shortForm));
+                }
+            }
+
+            StartLog.debug("Building Module Graph");
+            modules.buildGraph();
+
+            args.setAllModules(modules);
+            List<Module> activeModules = modules.getSelected();
+            
+            final Version START_VERSION = new Version(StartArgs.VERSION);
+            
+            for(Module enabled: activeModules)
+            {
+                if(enabled.getVersion().isNewerThan(START_VERSION))
+                {
+                    throw new UsageException(UsageException.ERR_BAD_GRAPH, "Module [" + enabled.getName() + "] specifies jetty version [" + enabled.getVersion()
+                            + "] which is newer than this version of jetty [" + START_VERSION + "]");
+                }
+            }
+            
+            for(String name: args.getSkipFileValidationModules())
+            {
+                Module module = modules.get(name);
+                module.setSkipFilesValidation(true);
+            }
+
+            // ------------------------------------------------------------
+            // 5) Lib & XML Expansion / Resolution
+            args.expandLibs(baseHome);
+            args.expandModules(baseHome,activeModules);
+
+        }
+        catch (GraphException e)
+        {
+            throw new UsageException(ERR_BAD_GRAPH,e);
+        }
 
         // ------------------------------------------------------------
         // 6) Resolve Extra XMLs
@@ -636,7 +347,7 @@
 
         return args;
     }
-
+    
     public void start(StartArgs args) throws IOException, InterruptedException
     {
         StartLog.debug("StartArgs: %s",args);
@@ -684,7 +395,7 @@
         if (args.isDryRun())
         {
             CommandLineBuilder cmd = args.getMainArgs(baseHome,true);
-            System.out.println(cmd.toString(File.separatorChar=='/'?" \\\n":" "));
+            System.out.println(cmd.toString(StartLog.isDebugEnabled()?" \\\n":" "));
         }
 
         if (args.isStopCommand())
@@ -692,83 +403,12 @@
             doStop(args);
         }
         
-        boolean rebuildGraph = false;
-
-        // Initialize start.ini
-        for (String module : args.getAddToStartIni())
+        BaseBuilder baseBuilder = new BaseBuilder(baseHome,args);
+        if(baseBuilder.build())
         {
-            buildIni(args,module,true,true);
-            rebuildGraph = true;
-        }
-
-        // Initialize start.d
-        for (String module : args.getAddToStartdIni())
-        {
-            buildIni(args,module,true,false);
-            rebuildGraph = true;
-        }
-        
-        if (rebuildGraph)
-        {
-            args.getAllModules().clearMissing();
-            args.getAllModules().buildGraph();
-        }
-        
-        // If in --create-files, check licenses
-        if(args.isDownload())
-        {
-            if (!args.isApproveAllLicenses())
-            {
-                for (Module module : args.getAllModules().resolveEnabled())
-                {
-                    if (!module.hasFiles(baseHome) && !module.acknowledgeLicense())
-                    {
-                        StartLog.warn(EXITING_LICENSE_NOT_ACKNOWLEDGED);
-                        System.exit(1);
-                    }
-                }
-            }
-        }
-
-        // Check ini files for download possibilities
-        for (FileArg arg : args.getFiles())
-        {
-            Path file = baseHome.getBasePath(arg.location);
-            if (!FS.exists(file) && args.isDownload())
-            {
-                initFile(args, arg);
-            }
-
-            if (!FS.exists(file))
-            {
-                boolean isDir = arg.location.endsWith("/");
-                if (isDir)
-                {
-                    StartLog.log("MKDIR", baseHome.toShortForm(file));
-                    FS.ensureDirectoryExists(file);
-                    /* Startup should not fail to run on missing directories.
-                     * See Bug #427204
-                     */
-                    // args.setRun(false);
-                }
-                else
-                {
-                    String shortRef = baseHome.toShortForm(file);
-                    if (args.isTestingModeEnabled())
-                    {
-                        StartLog.log("TESTING MODE","Skipping required file check on: %s",shortRef);
-                        return;
-                    }
-
-                    StartLog.warn("Missing Required File: %s",baseHome.toShortForm(file));
-                    args.setRun(false);
-                    if (arg.uri != null)
-                    {
-                        StartLog.warn("  Can be downloaded From: %s",arg.uri);
-                        StartLog.warn("  Run start.jar --create-files to download");
-                    }
-                }
-            }
+            // base directory changed.
+            StartLog.info("Base directory was modified");
+            return;
         }
         
         // Informational command line, don't run jetty
@@ -842,6 +482,9 @@
 
     /**
      * Stop a running jetty instance.
+     * @param host the host
+     * @param port the port
+     * @param key the key
      */
     public void stop(String host, int port, String key)
     {
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/Module.java b/jetty-start/src/main/java/org/eclipse/jetty/start/Module.java
index f1be504..6d5ca28 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/Module.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/Module.java
@@ -21,46 +21,26 @@
 import java.io.BufferedReader;
 import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.io.InputStreamReader;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.text.CollationKey;
 import java.text.Collator;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Comparator;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
-import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.eclipse.jetty.start.graph.Node;
+
 /**
  * Represents a Module metadata, as defined in Jetty.
  */
-public class Module
+public class Module extends Node<Module>
 {
-    public static class DepthComparator implements Comparator<Module>
-    {
-        private Collator collator = Collator.getInstance();
-
-        @Override
-        public int compare(Module o1, Module o2)
-        {
-            // order by depth first.
-            int diff = o1.depth - o2.depth;
-            if (diff != 0)
-            {
-                return diff;
-            }
-            // then by name (not really needed, but makes for predictable test cases)
-            CollationKey k1 = collator.getCollationKey(o1.fileRef);
-            CollationKey k2 = collator.getCollationKey(o2.fileRef);
-            return k1.compareTo(k2);
-        }
-    }
+    private static final String VERSION_UNSPECIFIED = "9.2";
 
     public static class NameComparator implements Comparator<Module>
     {
@@ -78,84 +58,51 @@
 
     /** The file of the module */
     private Path file;
+    
     /** The name of this Module (as a filesystem reference) */
     private String fileRef;
-    /**
-     * The logical name of this module (for property selected references), And to aid in duplicate detection.
-     */
-    private String logicalName;
-    /** The depth of the module in the tree */
-    private int depth = 0;
-    /** Set of Modules, by name, that this Module depends on */
-    private Set<String> parentNames;
-    /** Set of Modules, by name, that this Module optionally depend on */
-    private Set<String> optionalParentNames;
-    /** The Edges to parent modules */
-    private Set<Module> parentEdges;
-    /** The Edges to child modules */
-    private Set<Module> childEdges;
+    
+    /** The version of Jetty the module supports */
+    private Version version;
+
     /** List of xml configurations for this Module */
     private List<String> xmls;
+    
     /** List of ini template lines */
+    private List<String> iniTemplate;
+    private boolean hasIniTemplate = false;
+    
+    /** List of default config */
     private List<String> defaultConfig;
     private boolean hasDefaultConfig = false;
+    
     /** List of library options for this Module */
     private List<String> libs;
+    
     /** List of files for this Module */
     private List<String> files;
+    /** Skip File Validation (default: false) */
+    private boolean skipFilesValidation = false;
+    
     /** List of jvm Args */
     private List<String> jvmArgs;
+    
     /** License lines */
     private List<String> license;
 
-    /** Is this Module enabled via start.jar command line, start.ini, or start.d/*.ini ? */
-    private boolean enabled = false;
-    /** List of sources that enabled this module */
-    private final Set<String> sources = new HashSet<>();
-    private boolean licenseAck = false;
-
     public Module(BaseHome basehome, Path file) throws FileNotFoundException, IOException
     {
+        super();
         this.file = file;
 
         // Strip .mod
         this.fileRef = Pattern.compile(".mod$",Pattern.CASE_INSENSITIVE).matcher(file.getFileName().toString()).replaceFirst("");
-        this.logicalName = fileRef;
+        this.setName(fileRef);
 
         init(basehome);
         process(basehome);
     }
 
-    public void addChildEdge(Module child)
-    {
-        if (childEdges.contains(child))
-        {
-            // already present, skip
-            return;
-        }
-        this.childEdges.add(child);
-    }
-
-    public void addParentEdge(Module parent)
-    {
-        if (parentEdges.contains(parent))
-        {
-            // already present, skip
-            return;
-        }
-        this.parentEdges.add(parent);
-    }
-
-    public void addSources(List<String> sources)
-    {
-        this.sources.addAll(sources);
-    }
-
-    public void clearSources()
-    {
-        this.sources.clear();
-    }
-
     @Override
     public boolean equals(Object obj)
     {
@@ -189,23 +136,22 @@
     public void expandProperties(Props props)
     {
         // Expand Parents
-        Set<String> parents = new HashSet<>();
-        for (String parent : parentNames)
+        List<String> parents = new ArrayList<>();
+        for (String parent : getParentNames())
         {
             parents.add(props.expand(parent));
         }
-        parentNames.clear();
-        parentNames.addAll(parents);
+        setParentNames(parents);
     }
 
-    public Set<Module> getChildEdges()
+    public List<String> getDefaultConfig()
     {
-        return childEdges;
+        return defaultConfig;
     }
-
-    public int getDepth()
+    
+    public List<String> getIniTemplate()
     {
-        return depth;
+        return iniTemplate;
     }
 
     public List<String> getFiles()
@@ -213,113 +159,50 @@
         return files;
     }
 
+    public boolean isSkipFilesValidation()
+    {
+        return skipFilesValidation;
+    }
+
     public String getFilesystemRef()
     {
         return fileRef;
     }
 
-    public List<String> getDefaultConfig()
-    {
-        return defaultConfig;
-    }
-
-    public boolean hasDefaultConfig()
-    {
-        return hasDefaultConfig;
-    }
-
-    public List<String> getLibs()
-    {
-        return libs;
-    }
-
-    public String getName()
-    {
-        return logicalName;
-    }
-
-    public Set<String> getOptionalParentNames()
-    {
-        return optionalParentNames;
-    }
-
-    public Set<Module> getParentEdges()
-    {
-        return parentEdges;
-    }
-
-    public Set<String> getParentNames()
-    {
-        return parentNames;
-    }
-
-    public Set<String> getSources()
-    {
-        return Collections.unmodifiableSet(sources);
-    }
-
-    public List<String> getXmls()
-    {
-        return xmls;
-    }
-
     public List<String> getJvmArgs()
     {
         return jvmArgs;
     }
 
-    public boolean hasLicense()
+    public List<String> getLibs()
     {
-        return license != null && license.size() > 0;
-    }
-
-    public boolean acknowledgeLicense() throws IOException
-    {
-        if (!hasLicense() || licenseAck)
-        {
-            return true;
-        }
-        
-        System.err.printf("%nModule %s:%n",getName());
-        System.err.printf(" + contains software not provided by the Eclipse Foundation!%n");
-        System.err.printf(" + contains software not covered by the Eclipse Public License!%n");
-        System.err.printf(" + has not been audited for compliance with its license%n");
-        System.err.printf("%n");
-        for (String l : getLicense())
-        {
-            System.err.printf("    %s%n",l);
-        }
-
-        String propBasedAckName = "org.eclipse.jetty.start.ack.license." + getName();
-        String propBasedAckValue = System.getProperty(propBasedAckName);
-        if (propBasedAckValue != null)
-        {
-            StartLog.log("TESTING MODE", "Programmatic ACK - %s=%s",propBasedAckName,propBasedAckValue);
-            licenseAck = Boolean.parseBoolean(propBasedAckValue);
-        }
-        else
-        {
-            if (Boolean.getBoolean("org.eclipse.jetty.start.testing"))
-            {
-                throw new RuntimeException("Test Configuration Missing - Pre-specify answer to (" + propBasedAckName + ") in test case");
-            }
-
-            try (BufferedReader input = new BufferedReader(new InputStreamReader(System.in)))
-            {
-                System.err.printf("%nProceed (y/N)? ");
-                String line = input.readLine();
-
-                licenseAck = !(line == null || line.length() == 0 || !line.toLowerCase().startsWith("y"));
-            }
-        }
-
-        return licenseAck;
+        return libs;
     }
 
     public List<String> getLicense()
     {
         return license;
     }
+    
+    public List<String> getXmls()
+    {
+        return xmls;
+    }
+    
+    public Version getVersion()
+    {
+        return version;
+    }
+
+    public boolean hasDefaultConfig()
+    {
+        return hasDefaultConfig;
+    }
+    
+    public boolean hasIniTemplate()
+    {
+        return hasIniTemplate;
+    }
 
     @Override
     public int hashCode()
@@ -330,14 +213,16 @@
         return result;
     }
 
+    public boolean hasLicense()
+    {
+        return (license != null) && (license.size() > 0);
+    }
+
     private void init(BaseHome basehome)
     {
-        parentNames = new HashSet<>();
-        optionalParentNames = new HashSet<>();
-        parentEdges = new HashSet<>();
-        childEdges = new HashSet<>();
         xmls = new ArrayList<>();
         defaultConfig = new ArrayList<>();
+        iniTemplate = new ArrayList<>();
         libs = new ArrayList<>();
         files = new ArrayList<>();
         jvmArgs = new ArrayList<>();
@@ -353,19 +238,24 @@
             throw new RuntimeException("Invalid Module location (must be located under /modules/ directory): " + name);
         }
         this.fileRef = mat.group(1).replace('\\','/');
-        this.logicalName = this.fileRef;
+        setName(this.fileRef);
     }
 
-    public boolean isEnabled()
+    /**
+     * Indicates a module that is dynamic in nature
+     * 
+     * @return a module where the declared metadata name does not match the filename reference (aka a dynamic module)
+     */
+    public boolean isDynamic()
     {
-        return enabled;
+        return !getName().equals(fileRef);
     }
 
-    public boolean hasFiles(BaseHome baseHome)
+    public boolean hasFiles(BaseHome baseHome, Props props)
     {
         for (String ref : getFiles())
         {
-            FileArg farg = new FileArg(this,ref);
+            FileArg farg = new FileArg(this,props.expand(ref));
             Path refPath = baseHome.getBasePath(farg.location);
             if (!Files.exists(refPath))
             {
@@ -404,9 +294,12 @@
                     // blank lines and comments are valid for ini-template section
                     if ((line.length() == 0) || line.startsWith("#"))
                     {
+                        // Remember ini comments and whitespace (empty lines)
+                        // for the [ini-template] section
                         if ("INI-TEMPLATE".equals(sectionType))
                         {
-                            defaultConfig.add(line);
+                            iniTemplate.add(line);
+                            hasIniTemplate = true;
                         }
                     }
                     else
@@ -417,16 +310,20 @@
                                 // ignore (this would be entries before first section)
                                 break;
                             case "DEPEND":
-                                parentNames.add(line);
+                                addParentName(line);
                                 break;
                             case "FILES":
                                 files.add(line);
                                 break;
-                            case "DEFAULTS":
-                            case "INI-TEMPLATE":
+                            case "DEFAULTS": // old name introduced in 9.2.x
+                            case "INI": // new name for 9.3+
                                 defaultConfig.add(line);
                                 hasDefaultConfig = true;
                                 break;
+                            case "INI-TEMPLATE":
+                                iniTemplate.add(line);
+                                hasIniTemplate = true;
+                                break;
                             case "LIB":
                                 libs.add(line);
                                 break;
@@ -435,14 +332,21 @@
                                 license.add(line);
                                 break;
                             case "NAME":
-                                logicalName = line;
+                                setName(line);
                                 break;
                             case "OPTIONAL":
-                                optionalParentNames.add(line);
+                                addOptionalParentName(line);
                                 break;
                             case "EXEC":
                                 jvmArgs.add(line);
                                 break;
+                            case "VERSION":
+                                if (version != null)
+                                {
+                                    throw new IOException("[version] already specified");
+                                }
+                                version = new Version(line);
+                                break;
                             case "XML":
                                 xmls.add(line);
                                 break;
@@ -453,40 +357,35 @@
                 }
             }
         }
-    }
-
-    public void setDepth(int depth)
-    {
-        this.depth = depth;
+        
+        if (version == null)
+        {
+            version = new Version(VERSION_UNSPECIFIED);
+        }
     }
 
     public void setEnabled(boolean enabled)
     {
-        this.enabled = enabled;
+        throw new RuntimeException("Don't enable directly");
     }
-
-    public void setParentNames(Set<String> parents)
+    
+    public void setSkipFilesValidation(boolean skipFilesValidation)
     {
-        this.parentNames.clear();
-        this.parentEdges.clear();
-        if (parents != null)
-        {
-            this.parentNames.addAll(parents);
-        }
+        this.skipFilesValidation = skipFilesValidation;
     }
-
+    
     @Override
     public String toString()
     {
         StringBuilder str = new StringBuilder();
-        str.append("Module[").append(logicalName);
-        if (!logicalName.equals(fileRef))
+        str.append("Module[").append(getName());
+        if (isDynamic())
         {
             str.append(",file=").append(fileRef);
         }
-        if (enabled)
+        if (isSelected())
         {
-            str.append(",enabled");
+            str.append(",selected");
         }
         str.append(']');
         return str.toString();
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/ModuleGraphWriter.java b/jetty-start/src/main/java/org/eclipse/jetty/start/ModuleGraphWriter.java
index b98a392..c292a17 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/ModuleGraphWriter.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/ModuleGraphWriter.java
@@ -28,6 +28,10 @@
 import java.util.Collection;
 import java.util.List;
 
+import org.eclipse.jetty.start.graph.Graph;
+import org.eclipse.jetty.start.graph.Node;
+import org.eclipse.jetty.start.graph.Selection;
+
 /**
  * Generate a graphviz dot graph of the modules found
  */
@@ -103,7 +107,7 @@
             out.println("    ssize = \"20,40\"");
             out.println("  ];");
 
-            List<Module> enabled = modules.resolveEnabled();
+            List<Module> enabled = modules.getSelected();
 
             // Module Nodes
             writeModules(out,modules,enabled);
@@ -164,7 +168,7 @@
     private void writeModuleNode(PrintWriter out, Module module, boolean resolved)
     {
         String color = colorModuleBg;
-        if (module.isEnabled())
+        if (module.isSelected())
         {
             // specifically enabled by config
             color = colorEnabledBg;
@@ -179,12 +183,12 @@
         out.printf("<TABLE BORDER=\"0\" CELLBORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"2\">%n");
         out.printf("  <TR><TD ALIGN=\"LEFT\"><B>%s</B></TD></TR>%n",module.getName());
 
-        if (module.isEnabled())
+        if (module.isSelected())
         {
             writeModuleDetailHeader(out,"ENABLED");
-            for (String source : module.getSources())
+            for (Selection selection : module.getSelections())
             {
-                writeModuleDetailLine(out,"via: " + source);
+                writeModuleDetailLine(out,"via: " + selection);
             }
         }
         else if (resolved)
@@ -212,9 +216,9 @@
             }
         }
 
-        if (!module.getDefaultConfig().isEmpty())
+        if (!module.getIniTemplate().isEmpty())
         {
-            List<String> inis = module.getDefaultConfig();
+            List<String> inis = module.getIniTemplate();
             writeModuleDetailHeader(out,"INI Template",inis.size());
         }
 
@@ -247,11 +251,11 @@
         }
     }
 
-    private void writeRelationships(PrintWriter out, Modules modules, List<Module> enabled)
+    private void writeRelationships(PrintWriter out, Graph<Module> modules, List<Module> enabled)
     {
         for (Module module : modules)
         {
-            for (Module parent : module.getParentEdges())
+            for (Node<?> parent : module.getParentEdges())
             {
                 out.printf("    \"%s\" -> \"%s\";%n",module.getName(),parent.getName());
             }
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/Modules.java b/jetty-start/src/main/java/org/eclipse/jetty/start/Modules.java
index 9a56624..68db15e 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/Modules.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/Modules.java
@@ -18,409 +18,133 @@
 
 package org.eclipse.jetty.start;
 
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Stack;
-import java.util.regex.Pattern;
+
+import org.eclipse.jetty.start.graph.Graph;
+import org.eclipse.jetty.start.graph.GraphException;
+import org.eclipse.jetty.start.graph.OnlyTransitivePredicate;
+import org.eclipse.jetty.start.graph.Selection;
 
 /**
  * Access for all modules declared, as well as what is enabled.
  */
-public class Modules implements Iterable<Module>
+public class Modules extends Graph<Module>
 {
     private final BaseHome baseHome;
     private final StartArgs args;
-    
-    private Map<String, Module> modules = new HashMap<>();
-    /*
-     * modules that may appear in the resolved graph but are undefined in the module system
-     * 
-     * ex: modules/npn/npn-1.7.0_01.mod (property expansion resolves to non-existent file)
-     */
-    private Set<String> missingModules = new HashSet<String>();
 
-    private int maxDepth = -1;
-    
     public Modules(BaseHome basehome, StartArgs args)
     {
         this.baseHome = basehome;
         this.args = args;
-    }
-
-    private Set<String> asNameSet(Set<Module> moduleSet)
-    {
-        Set<String> ret = new HashSet<>();
-        for (Module module : moduleSet)
-        {
-            ret.add(module.getName());
-        }
-        return ret;
-    }
-
-    private void assertNoCycle(Module module, Stack<String> refs)
-    {
-        for (Module parent : module.getParentEdges())
-        {
-            if (refs.contains(parent.getName()))
-            {
-                // Cycle detected.
-                StringBuilder err = new StringBuilder();
-                err.append("A cyclic reference in the modules has been detected: ");
-                for (int i = 0; i < refs.size(); i++)
-                {
-                    if (i > 0)
-                    {
-                        err.append(" -> ");
-                    }
-                    err.append(refs.get(i));
-                }
-                err.append(" -> ").append(parent.getName());
-                throw new IllegalStateException(err.toString());
-            }
-
-            refs.push(parent.getName());
-            assertNoCycle(parent,refs);
-            refs.pop();
-        }
-    }
-
-    private void bfsCalculateDepth(final Module module, final int depthNow)
-    {
-        int depth = depthNow + 1;
-
-        // Set depth on every child first
-        for (Module child : module.getChildEdges())
-        {
-            child.setDepth(Math.max(depth,child.getDepth()));
-            this.maxDepth = Math.max(this.maxDepth,child.getDepth());
-        }
-
-        // Dive down
-        for (Module child : module.getChildEdges())
-        {
-            bfsCalculateDepth(child,depth);
-        }
-    }
-
-    /**
-     * Using the provided dependencies, build the module graph
-     */
-    public void buildGraph() throws FileNotFoundException, IOException
-    {
-        normalizeDependencies();
+        this.setSelectionTerm("enable");
+        this.setNodeTerm("module");
         
-        // Connect edges
-        for (Module module : modules.values())
+        String java_version = System.getProperty("java.version");
+        if (java_version!=null)
         {
-            for (String parentName : module.getParentNames())
-            {
-                Module parent = get(parentName);
-
-                if (parent == null)
-                {
-                    if (Props.hasPropertyKey(parentName))
-                    {
-                        StartLog.debug("Module property not expandable (yet) [%s]",parentName);
-                    }
-                    else
-                    {
-                        StartLog.warn("Module not found [%s]",parentName);
-                    }
-                }
-                else
-                {
-                    module.addParentEdge(parent);
-                    parent.addChildEdge(module);
-                }
-            }
-
-            for (String optionalParentName : module.getOptionalParentNames())
-            {
-                Module optional = get(optionalParentName);
-                if (optional == null)
-                {
-                    StartLog.debug("Optional module not found [%s]",optionalParentName);
-                }
-                else if (optional.isEnabled())
-                {
-                    module.addParentEdge(optional);
-                    optional.addChildEdge(module);
-                }
-            }
-        }
-
-        // Verify there is no cyclic references
-        Stack<String> refs = new Stack<>();
-        for (Module module : modules.values())
-        {
-            refs.push(module.getName());
-            assertNoCycle(module,refs);
-            refs.pop();
-        }
-
-        // Calculate depth of all modules for sorting later
-        for (Module module : modules.values())
-        {
-            if (module.getParentEdges().isEmpty())
-            {
-                bfsCalculateDepth(module,0);
-            }
-        }
-    }
-
-    public void clearMissing()
-    {
-        missingModules.clear();
-    }
-    
-    public Integer count()
-    {
-        return modules.size();
+            args.setProperty("java.version",java_version,"<internal>",false);
+        }        
     }
 
     public void dump()
     {
         List<Module> ordered = new ArrayList<>();
-        ordered.addAll(modules.values());
+        ordered.addAll(getNodes());
         Collections.sort(ordered,new Module.NameComparator());
 
-        List<Module> active = resolveEnabled();
+        List<Module> active = getSelected();
 
         for (Module module : ordered)
         {
             boolean activated = active.contains(module);
-            boolean enabled = module.isEnabled();
-            boolean transitive = activated && !enabled;
+            boolean selected = module.isSelected();
+            boolean transitive = selected && module.matches(OnlyTransitivePredicate.INSTANCE);
 
-            char status = '-';
-            if (enabled)
+            String status = "[ ]";
+            if (transitive)
             {
-                status = '*';
+                status = "[t]";
             }
-            else if (transitive)
+            else if (selected)
             {
-                status = '+';
+                status = "[x]";
             }
 
             System.out.printf("%n %s Module: %s%n",status,module.getName());
             if (!module.getName().equals(module.getFilesystemRef()))
             {
-                System.out.printf("      Ref: %s%n",module.getFilesystemRef());
+                System.out.printf("        Ref: %s%n",module.getFilesystemRef());
             }
             for (String parent : module.getParentNames())
             {
-                System.out.printf("   Depend: %s%n",parent);
+                System.out.printf("     Depend: %s%n",parent);
             }
             for (String lib : module.getLibs())
             {
-                System.out.printf("      LIB: %s%n",lib);
+                System.out.printf("        LIB: %s%n",lib);
             }
             for (String xml : module.getXmls())
             {
-                System.out.printf("      XML: %s%n",xml);
+                System.out.printf("        XML: %s%n",xml);
             }
             if (StartLog.isDebugEnabled())
             {
-                System.out.printf("    depth: %d%n",module.getDepth());
+                System.out.printf("      depth: %d%n",module.getDepth());
             }
             if (activated)
             {
-                for (String source : module.getSources())
+                for (Selection selection : module.getSelections())
                 {
-                    System.out.printf("  Enabled: <via> %s%n",source);
-                }
-                if (transitive)
-                {
-                    System.out.printf("  Enabled: <via transitive reference>%n");
+                    System.out.printf("    Enabled: <via> %s%n",selection);
                 }
             }
             else
             {
-                System.out.printf("  Enabled: <not enabled in this configuration>%n");
+                System.out.printf("    Enabled: <not enabled in this configuration>%n");
             }
         }
     }
 
-    public void dumpEnabledTree()
-    {
-        List<Module> ordered = new ArrayList<>();
-        ordered.addAll(modules.values());
-        Collections.sort(ordered,new Module.DepthComparator());
-
-        List<Module> active = resolveEnabled();
-
-        for (Module module : ordered)
-        {
-            if (active.contains(module))
-            {
-                // Show module name
-                String indent = toIndent(module.getDepth());
-                System.out.printf("%s + Module: %s [%s]%n",indent,module.getName(),module.isEnabled()?"enabled":"transitive");
-            }
-        }
-    }
-
-    public void enable(String name) throws IOException
-    {
-        List<String> empty = Collections.emptyList();
-        enable(name,empty);
-    }
-    
-    public void enable(String name, List<String> sources) throws IOException
-    {
-        if (name.contains("*"))
-        {
-            // A regex!
-            Pattern pat = Pattern.compile(name);
-            List<Module> matching = new ArrayList<>();
-            do
-            {
-                matching.clear();
-                
-                // find matching entries that are not enabled
-                for (Map.Entry<String, Module> entry : modules.entrySet())
-                {
-                    if (pat.matcher(entry.getKey()).matches())
-                    {
-                        if (!entry.getValue().isEnabled())
-                        {
-                            matching.add(entry.getValue());
-                        }
-                    }
-                }
-                
-                // enable them
-                for (Module module : matching)
-                {
-                    enableModule(module,sources);
-                }
-            }
-            while (!matching.isEmpty());
-        }
-        else
-        {
-            Module module = modules.get(name);
-            if (module == null)
-            {
-                System.err.printf("WARNING: Cannot enable requested module [%s]: not a valid module name.%n",name);
-                return;
-            }
-            enableModule(module,sources);
-        }
-    }
-
-    private void enableModule(Module module, List<String> sources) throws IOException
-    {
-        String via = "<transitive>";
-
-        // Always add the sources
-        if (sources != null)
-        {
-            module.addSources(sources);
-            via = Main.join(sources, ", ");
-        }
-        
-        // If already enabled, nothing else to do
-        if (module.isEnabled())
-        {
-            StartLog.debug("Enabled module: %s (via %s)",module.getName(),via);
-            return;
-        }
-        
-        StartLog.debug("Enabling module: %s (via %s)",module.getName(),via);
-        module.setEnabled(true);
-        args.parseModule(module);
-        module.expandProperties(args.getProperties());
-        
-        // enable any parents that haven't been enabled (yet)
-        Set<String> parentNames = new HashSet<>();
-        parentNames.addAll(module.getParentNames());
-        for(String name: parentNames)
-        {
-            StartLog.debug("Enable parent '%s' of module: %s",name,module.getName());
-            Module parent = modules.get(name);
-            if (parent == null)
-            {
-                // parent module doesn't exist, yet
-                Path file = baseHome.getPath("modules/" + name + ".mod");
-                if (FS.canReadFile(file))
-                {
-                    parent = registerModule(file);
-                    parent.expandProperties(args.getProperties());
-                    updateParentReferencesTo(parent);
-                }
-                else
-                {
-                    if (!Props.hasPropertyKey(name))
-                    {
-                        StartLog.debug("Missing module definition: [ Mod: %s | File: %s ]",name,file);
-                        missingModules.add(name);
-                    }
-                }
-            }
-            if (parent != null)
-            {
-                enableModule(parent,null);
-            }
-        }
-    }
-    
-    private void findChildren(Module module, Set<Module> ret)
-    {
-        ret.add(module);
-        for (Module child : module.getChildEdges())
-        {
-            ret.add(child);
-        }
-    }
-
-    private void findParents(Module module, Map<String, Module> ret)
-    {
-        ret.put(module.getName(),module);
-        for (Module parent : module.getParentEdges())
-        {
-            ret.put(parent.getName(),parent);
-            findParents(parent,ret);
-        }
-    }
-
-    public Module get(String name)
-    {
-        return modules.get(name);
-    }
-
-    public int getMaxDepth()
-    {
-        return maxDepth;
-    }
-
-    public Set<Module> getModulesAtDepth(int depth)
-    {
-        Set<Module> ret = new HashSet<>();
-        for (Module module : modules.values())
-        {
-            if (module.getDepth() == depth)
-            {
-                ret.add(module);
-            }
-        }
-        return ret;
-    }
-
     @Override
-    public Iterator<Module> iterator()
+    public Module resolveNode(String name)
     {
-        return modules.values().iterator();
+        String expandedName = args.getProperties().expand(name);
+
+        if (Props.hasPropertyKey(expandedName))
+        {
+            StartLog.debug("Not yet able to expand property in: %s",name);
+            return null;
+        }
+
+        Path file = baseHome.getPath("modules/" + expandedName + ".mod");
+        if (FS.canReadFile(file))
+        {
+            Module parent = registerModule(file);
+            parent.expandProperties(args.getProperties());
+            updateParentReferencesTo(parent);
+            return parent;
+        }
+        else
+        {
+            if (!Props.hasPropertyKey(name))
+            {
+                StartLog.debug("Missing module definition: [ Mod: %s | File: %s ]",name,file);
+            }
+            return null;
+        }
+    }
+    
+    @Override
+    public void onNodeSelected(Module module)
+    {
+        StartLog.debug("on node selected: [%s] (%s.mod)",module.getName(),module.getFilesystemRef());
+        args.parseModule(module);
+        module.expandProperties(args.getProperties());
     }
 
     public List<String> normalizeLibs(List<Module> active)
@@ -455,30 +179,6 @@
         return xmls;
     }
 
-    public Module register(Module module)
-    {
-        modules.put(module.getName(),module);
-        return module;
-    }
-
-    public void registerParentsIfMissing(Module module) throws IOException
-    {
-        Set<String> parents = new HashSet<>(module.getParentNames());
-        for (String name : parents)
-        {
-            if (!modules.containsKey(name))
-            {
-                Path file = baseHome.getPath("modules/" + name + ".mod");
-                if (FS.canReadFile(file))
-                {
-                    Module parent = registerModule(file);
-                    updateParentReferencesTo(parent);
-                    registerParentsIfMissing(parent);
-                }
-            }
-        }
-    }
-    
     public void registerAll() throws IOException
     {
         for (Path path : baseHome.getPaths("modules/*.mod"))
@@ -486,140 +186,29 @@
             registerModule(path);
         }
     }
-    
-    // load missing post-expanded dependent modules
-    private void normalizeDependencies() throws FileNotFoundException, IOException
-    {
-        Set<String> expandedModules = new HashSet<>();
-        boolean done = false;
-        while (!done)
-        {
-            done = true;
-            Set<String> missingParents = new HashSet<>();
 
-            for (Module m : modules.values())
-            {
-                for (String parent : m.getParentNames())
-                {
-                    String expanded = args.getProperties().expand(parent);
-                    if (modules.containsKey(expanded) || missingModules.contains(parent) || expandedModules.contains(parent))
-                    {
-                        continue; // found. skip it.
-                    }
-                    done = false;
-                    StartLog.debug("Missing parent module %s == %s for %s",parent,expanded,m);
-                    missingParents.add(parent);
-                }
-            }
-
-            for (String missingParent : missingParents)
-            {
-                String expanded = args.getProperties().expand(missingParent);
-                Path file = baseHome.getPath("modules/" + expanded + ".mod");
-                if (FS.canReadFile(file))
-                {
-                    Module module = registerModule(file);
-                    updateParentReferencesTo(module);
-                    if (!expanded.equals(missingParent))
-                    {
-                        expandedModules.add(missingParent);
-                    }
-                }
-                else
-                {
-                    if (Props.hasPropertyKey(expanded))
-                    {
-                        StartLog.debug("Module property not expandable (yet) [%s]",expanded);
-                        expandedModules.add(missingParent);
-                    }
-                    else
-                    {
-                        StartLog.debug("Missing module definition: %s expanded to %s",missingParent,expanded);
-                        missingModules.add(missingParent);
-                    }
-                }
-            }
-        }
-    }
-
-    private Module registerModule(Path file) throws FileNotFoundException, IOException
+    private Module registerModule(Path file)
     {
         if (!FS.canReadFile(file))
         {
-            throw new IOException("Cannot read file: " + file);
+            throw new GraphException("Cannot read file: " + file);
         }
-        StartLog.debug("Registering Module: %s",baseHome.toShortForm(file));
-        Module module = new Module(baseHome,file);
-        return register(module);
-    }
-
-    public Set<String> resolveChildModulesOf(String moduleName)
-    {
-        Set<Module> ret = new HashSet<>();
-        Module module = get(moduleName);
-        findChildren(module,ret);
-        return asNameSet(ret);
+        String shortName = baseHome.toShortForm(file);
+        try
+        {
+            StartLog.debug("Registering Module: %s",shortName);
+            Module module = new Module(baseHome,file);
+            return register(module);
+        }
+        catch (Throwable t)
+        {
+            throw new GraphException("Unable to register module: " + shortName,t);
+        }
     }
 
     /**
-     * Resolve the execution order of the enabled modules, and all dependant modules, based on depth first transitive reduction.
-     * 
-     * @return the list of active modules (plus dependant modules), in execution order.
-     */
-    public List<Module> resolveEnabled()
-    {
-        Map<String, Module> active = new HashMap<String, Module>();
-
-        for (Module module : modules.values())
-        {
-            if (module.isEnabled())
-            {
-                findParents(module,active);
-            }
-        }
-
-        /*
-         * check against the missing modules
-         * 
-         * Ex: npn should match anything under npn/
-         */
-        for (String missing : missingModules)
-        {
-            for (String activeModule : active.keySet())
-            {
-                if (missing.startsWith(activeModule))
-                {
-                    StartLog.warn("** Unable to continue, required dependency missing. [%s]",missing);
-                    StartLog.warn("** As configured, Jetty is unable to start due to a missing enabled module dependency.");
-                    StartLog.warn("** This may be due to a transitive dependency akin to spdy on npn, which resolves based on the JDK in use.");
-                    throw new UsageException(UsageException.ERR_BAD_ARG, "Missing referenced dependency: " + missing);
-                }
-            }
-        }
-
-        List<Module> ordered = new ArrayList<>();
-        ordered.addAll(active.values());
-        Collections.sort(ordered,new Module.DepthComparator());
-        return ordered;
-    }
-
-    public Set<String> resolveParentModulesOf(String moduleName)
-    {
-        Map<String, Module> ret = new HashMap<>();
-        Module module = get(moduleName);
-        findParents(module,ret);
-        return ret.keySet();
-    }
-
-    private String toIndent(int depth)
-    {
-        char indent[] = new char[depth * 2];
-        Arrays.fill(indent,' ');
-        return new String(indent);
-    }
-
-    /**
-     * Modules can have a different logical name than to their filesystem reference. This updates existing references to the filesystem form to use the logical
+     * Modules can have a different logical name than to their filesystem reference. This updates existing references to
+     * the filesystem form to use the logical
      * name form.
      * 
      * @param module
@@ -633,9 +222,9 @@
             return;
         }
 
-        for (Module m : modules.values())
+        for (Module m : getNodes())
         {
-            Set<String> resolvedParents = new HashSet<>();
+            List<String> resolvedParents = new ArrayList<>();
             for (String parent : m.getParentNames())
             {
                 if (parent.equals(module.getFilesystemRef()))
@@ -658,10 +247,10 @@
     {
         StringBuilder str = new StringBuilder();
         str.append("Modules[");
-        str.append("count=").append(modules.size());
+        str.append("count=").append(count());
         str.append(",<");
         boolean delim = false;
-        for (String name : modules.keySet())
+        for (String name : getNodeNames())
         {
             if (delim)
             {
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/Props.java b/jetty-start/src/main/java/org/eclipse/jetty/start/Props.java
index ba3674e..9ab8cd3 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/Props.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/Props.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.start;
 
-import static org.eclipse.jetty.start.UsageException.*;
+import static org.eclipse.jetty.start.UsageException.ERR_BAD_ARG;
 
 import java.io.IOException;
 import java.io.OutputStream;
@@ -42,6 +42,8 @@
  */
 public final class Props implements Iterable<Prop>
 {
+    private static final Pattern __propertyPattern = Pattern.compile("(?<=[^$]|^)\\$\\{([^}]*)\\}");
+    
     public static class Prop
     {
         public String key;
@@ -129,6 +131,7 @@
      * If arg is not a property, ignore it.
      * @param arg the argument to parse for a potential property
      * @param source the source for this argument (to track origin of property from)
+     * @return true if the property was added, false if the property wasn't added
      */
     public boolean addPossibleProperty(String arg, String source)
     {
@@ -199,8 +202,7 @@
             return str;
         }
 
-        Pattern pat = Pattern.compile("(?<=[^$]|^)(\\$\\{[^}]*\\})");
-        Matcher mat = pat.matcher(str);
+        Matcher mat = __propertyPattern.matcher(str);
         StringBuilder expanded = new StringBuilder();
         int offset = 0;
         String property;
@@ -208,7 +210,7 @@
 
         while (mat.find(offset))
         {
-            property = cleanReference(mat.group(1));
+            property = mat.group(1);
 
             // Loop detection
             if (seenStack.contains(property))
@@ -228,13 +230,13 @@
             seenStack.push(property);
 
             // find property name
-            expanded.append(str.subSequence(offset,mat.start(1)));
+            expanded.append(str.subSequence(offset,mat.start()));
             // get property value
             value = getString(property);
             if (value == null)
             {
                 StartLog.trace("Unable to expand: %s",property);
-                expanded.append(mat.group(1));
+                expanded.append(mat.group());
             }
             else
             {
@@ -243,7 +245,7 @@
                 expanded.append(value);
             }
             // update offset
-            offset = mat.end(1);
+            offset = mat.end();
         }
 
         // leftover
@@ -318,7 +320,7 @@
 
     public static boolean hasPropertyKey(String name)
     {
-        return Pattern.compile("(?<=[^$]|^)(\\$\\{[^}]*\\})").matcher(name).find();
+        return __propertyPattern.matcher(name).find();
     }
 
     @Override
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/README.TXT b/jetty-start/src/main/java/org/eclipse/jetty/start/README.TXT
deleted file mode 100644
index fc569bc..0000000
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/README.TXT
+++ /dev/null
@@ -1,48 +0,0 @@
-Jetty start
------------
-
-The run directory is either the top-level of a distribution
-or jetty-distribution/target/distribution directory when built from
-source.
-
-Jetty start.jar provides a cross platform replacement for startup scripts.
-It makes use of executable JAR that builds the classpath and then executes
-jetty.
-
-To run with the demo:
-
-  java -jar start.jar --enable=demo
-  java -jar start.jar
-
-To run with the default modules:
-
-  java -jar start.jar
-
-The default options may be specified in the start.ini file, or if
-that is not present, they are defined in the start.config file that
-is within the start.jar.
-
-To run with specific configuration file(s)
-
-  java -jar start.jar etc/jetty.xml
-
-To see the available options
-
-  java -jar start.jar --help
-
-To run with JSP support (if available)
-
-  java -jar start.jar --module=jsp
-
-To run with JMX support
-
-  java -jar start.jar --module=jmx
-
-To run with JSP & JMX support
-
-    java -jar start.jar --module=jsp,jmx
-
-Note that JSP requires the jasper jars to be within $JETTY/lib/jsp  These 
-are currently not distributed with the eclipse release and must be
-obtained from a jetty-hightide release from codehaus.
-
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/StartArgs.java b/jetty-start/src/main/java/org/eclipse/jetty/start/StartArgs.java
index 43d9bee..145fb30 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/StartArgs.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/StartArgs.java
@@ -18,12 +18,14 @@
 
 package org.eclipse.jetty.start;
 
-import static org.eclipse.jetty.start.UsageException.*;
-
 import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.nio.file.Files;
 import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -31,6 +33,7 @@
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
+import java.util.Properties;
 import java.util.Set;
 import java.util.StringTokenizer;
 
@@ -39,6 +42,8 @@
 import org.eclipse.jetty.start.config.ConfigSources;
 import org.eclipse.jetty.start.config.DirConfigSource;
 
+import static org.eclipse.jetty.start.UsageException.ERR_BAD_ARG;
+
 /**
  * The Arguments required to start Jetty.
  */
@@ -48,40 +53,87 @@
 
     static
     {
+        // Use command line versions
         String ver = System.getProperty("jetty.version",null);
+        String tag = System.getProperty("jetty.tag.version","master");
 
+        // Use META-INF/MANIFEST.MF versions
         if (ver == null)
         {
             Package pkg = StartArgs.class.getPackage();
             if ((pkg != null) && "Eclipse.org - Jetty".equals(pkg.getImplementationVendor()) && (pkg.getImplementationVersion() != null))
             {
                 ver = pkg.getImplementationVersion();
+                if (tag == null)
+                {
+                    tag = "jetty-" + ver;
+                }
             }
         }
 
+        // Use jetty-version.properties values
         if (ver == null)
         {
-            ver = "TEST";
+            URL url = Thread.currentThread().getContextClassLoader().getResource("jetty-version.properties");
+            if (url != null)
+            {
+                try (InputStream in = url.openStream())
+                {
+                    Properties props = new Properties();
+                    props.load(in);
+                    ver = props.getProperty("jetty.version");
+                }
+                catch (IOException ignore)
+                {
+                    StartLog.debug(ignore);
+                }
+            }
+        }
+
+        // Default values
+        if (ver == null)
+        {
+            ver = "0.0";
+            if (tag == null)
+            {
+                tag = "master";
+            }
+        }
+
+        // Set Tag Defaults
+        if (tag == null || tag.contains("-SNAPSHOT"))
+        {
+            tag = "master";
         }
 
         VERSION = ver;
         System.setProperty("jetty.version",VERSION);
+        System.setProperty("jetty.tag.version",tag);
     }
 
     private static final String SERVER_MAIN = "org.eclipse.jetty.xml.XmlConfiguration";
 
     /** List of enabled modules */
     private Set<String> modules = new HashSet<>();
+
+    /** List of modules to skip [files] section validation */
+    private Set<String> skipFileValidationModules = new HashSet<>();
+
     /** Map of enabled modules to the source of where that activation occurred */
     private Map<String, List<String>> sources = new HashMap<>();
+
     /** Map of properties to where that property was declared */
     private Map<String, String> propertySource = new HashMap<>();
+
     /** List of all active [files] sections from enabled modules */
     private List<FileArg> files = new ArrayList<>();
+
     /** List of all active [lib] sections from enabled modules */
     private Classpath classpath;
+
     /** List of all active [xml] sections from enabled modules */
     private List<Path> xmls = new ArrayList<>();
+
     /** JVM arguments, found via commmand line and in all active [exec] sections from enabled modules */
     private List<String> jvmArgs = new ArrayList<>();
 
@@ -90,7 +142,7 @@
 
     /** List of all property references found directly on command line or start.ini */
     private List<String> propertyFileRefs = new ArrayList<>();
-    
+
     /** List of all property files */
     private List<Path> propertyFiles = new ArrayList<>();
 
@@ -112,7 +164,12 @@
     private Modules allModules;
     /** Should the server be run? */
     private boolean run = true;
+
+    /** Download related args */
     private boolean download = false;
+    private boolean licenseCheckRequired = false;
+    private boolean testingMode = false;
+
     private boolean help = false;
     private boolean stopCommand = false;
     private boolean listModules = false;
@@ -122,8 +179,8 @@
     private boolean dryRun = false;
 
     private boolean exec = false;
+    private String exec_properties;
     private boolean approveAllLicenses = false;
-    private boolean testingMode = false;
 
     public StartArgs()
     {
@@ -132,7 +189,13 @@
 
     private void addFile(Module module, String uriLocation)
     {
-        FileArg arg = new FileArg(module, uriLocation);
+        if (module.isSkipFilesValidation())
+        {
+            StartLog.debug("Not validating %s [files] for %s",module,uriLocation);
+            return;
+        }
+
+        FileArg arg = new FileArg(module,properties.expand(uriLocation));
         if (!files.contains(arg))
         {
             files.add(arg);
@@ -157,7 +220,7 @@
             xmls.add(xmlfile);
         }
     }
-    
+
     private void addUniquePropertyFile(String propertyFileRef, Path propertyFile) throws IOException
     {
         if (!FS.canReadFile(propertyFile))
@@ -211,9 +274,10 @@
         System.out.println("Jetty Environment:");
         System.out.println("-----------------");
         dumpProperty("jetty.version");
+        dumpProperty("jetty.tag.version");
         dumpProperty("jetty.home");
         dumpProperty("jetty.base");
-        
+
         // Jetty Configuration Environment
         System.out.println();
         System.out.println("Config Search Order:");
@@ -231,7 +295,7 @@
             }
             System.out.println();
         }
-        
+
         // Jetty Se
         System.out.println();
     }
@@ -344,8 +408,9 @@
     }
 
     /**
-     * Ensure that the System Properties are set (if defined as a System property, or start.config property, or start.ini property)
-     * 
+     * Ensure that the System Properties are set (if defined as a System property, or start.config property, or
+     * start.ini property)
+     *
      * @param key
      *            the key to be sure of
      */
@@ -371,9 +436,11 @@
 
     /**
      * Expand any command line added <code>--lib</code> lib references.
-     * 
+     *
      * @param baseHome
+     *            the base home in use
      * @throws IOException
+     *             if unable to expand the libraries
      */
     public void expandLibs(BaseHome baseHome) throws IOException
     {
@@ -383,10 +450,10 @@
             StartLog.debug("rawlibref = " + rawlibref);
             String libref = properties.expand(rawlibref);
             StartLog.debug("expanded = " + libref);
-            
+
             // perform path escaping (needed by windows)
             libref = libref.replaceAll("\\\\([^\\\\])","\\\\\\\\$1");
-            
+
             for (Path libpath : baseHome.getPaths(libref))
             {
                 classpath.addComponent(libpath.toFile());
@@ -396,10 +463,13 @@
 
     /**
      * Build up the Classpath and XML file references based on enabled Module list.
-     * 
+     *
      * @param baseHome
+     *            the base home in use
      * @param activeModules
+     *            the active (selected) modules
      * @throws IOException
+     *             if unable to expand the modules
      */
     public void expandModules(BaseHome baseHome, List<Module> activeModules) throws IOException
     {
@@ -429,6 +499,7 @@
             for (String xmlRef : module.getXmls())
             {
                 // Straight Reference
+                xmlRef = properties.expand(xmlRef);
                 Path xmlfile = baseHome.getPath(xmlRef);
                 addUniqueXmlFile(xmlRef,xmlfile);
             }
@@ -512,27 +583,34 @@
         ensureSystemPropertySet("STOP.WAIT");
 
         // pass properties as args or as a file
-        if (dryRun || isExec())
+        if (dryRun && exec_properties==null)
         {
             for (Prop p : properties)
-                cmd.addRawArg(CommandLineBuilder.quote(p.key)+"="+CommandLineBuilder.quote(p.value));
+                cmd.addRawArg(CommandLineBuilder.quote(p.key) + "=" + CommandLineBuilder.quote(p.value));
         }
         else if (properties.size() > 0)
         {
-            File prop_file = File.createTempFile("start",".properties");
-            prop_file.deleteOnExit();
-            try (FileOutputStream out = new FileOutputStream(prop_file))
+            Path prop_path;
+            if (exec_properties==null)
+            {
+                prop_path=Files.createTempFile("start_", ".properties");
+                prop_path.toFile().deleteOnExit();
+            }
+            else
+                prop_path=new File(exec_properties).toPath();
+                
+            try (OutputStream out = Files.newOutputStream(prop_path))
             {
                 properties.store(out,"start.jar properties");
             }
-            cmd.addRawArg(prop_file.getAbsolutePath());
+            cmd.addRawArg(prop_path.toAbsolutePath().toString());
         }
 
         for (Path xml : xmls)
         {
             cmd.addRawArg(xml.toAbsolutePath().toString());
         }
-        
+
         for (Path propertyFile : propertyFiles)
         {
             cmd.addRawArg(propertyFile.toAbsolutePath().toString());
@@ -547,6 +625,46 @@
         return System.getProperty("main.class",mainclass);
     }
 
+    public Path getMavenLocalRepoDir()
+    {
+        // Try property first
+        String localRepo = getProperties().getString("maven.local.repo");
+
+        if (Utils.isBlank(localRepo))
+        {
+            // Try jetty specific env variable
+            localRepo = System.getenv("JETTY_MAVEN_LOCAL_REPO");
+        }
+
+        if (Utils.isBlank(localRepo))
+        {
+            // Try generic env variable
+            localRepo = System.getenv("MAVEN_LOCAL_REPO");
+        }
+
+        // TODO: load & use $HOME/.m2/settings.xml ?
+        // TODO: possibly use Eclipse Aether to manage it ?
+        // TODO: see https://bugs.eclipse.org/bugs/show_bug.cgi?id=449511
+
+        // Still blank? then its not specified
+        if (Utils.isBlank(localRepo))
+        {
+            return null;
+        }
+
+        Path localRepoDir = new File(localRepo).toPath();
+        localRepoDir = localRepoDir.normalize().toAbsolutePath();
+        if (Files.exists(localRepoDir) && Files.isDirectory(localRepoDir))
+        {
+            return localRepoDir;
+        }
+
+        StartLog.warn("Not a valid maven local repository directory: %s",localRepoDir);
+
+        // Not a valid repository directory, skip it
+        return null;
+    }
+
     public String getModuleGraphFilename()
     {
         return moduleGraphFilename;
@@ -557,6 +675,11 @@
         return properties;
     }
 
+    public Set<String> getSkipFileValidationModules()
+    {
+        return skipFileValidationModules;
+    }
+
     public List<String> getSources(String module)
     {
         return sources.get(module);
@@ -606,7 +729,12 @@
     {
         return exec;
     }
-    
+
+    public boolean isLicenseCheckRequired()
+    {
+        return licenseCheckRequired;
+    }
+
     public boolean isNormalMainClass()
     {
         return SERVER_MAIN.equals(getMainClassname());
@@ -641,7 +769,7 @@
     {
         return stopCommand;
     }
-    
+
     public boolean isTestingModeEnabled()
     {
         return testingMode;
@@ -672,10 +800,13 @@
 
     /**
      * Parse a single line of argument.
-     * 
-     * @param rawarg the raw argument to parse
-     * @param source the origin of this line of argument
-     * @param replaceProps true if properties in this parse replace previous ones, false to not replace.
+     *
+     * @param rawarg
+     *            the raw argument to parse
+     * @param source
+     *            the origin of this line of argument
+     * @param replaceProps
+     *            true if properties in this parse replace previous ones, false to not replace.
      */
     private void parse(final String rawarg, String source, boolean replaceProps)
     {
@@ -683,7 +814,7 @@
         {
             return;
         }
-        
+
         StartLog.debug("parse(\"%s\", \"%s\", %b)",rawarg,source,replaceProps);
 
         final String arg = rawarg.trim();
@@ -710,7 +841,7 @@
             // valid, but handled in StartLog instead
             return;
         }
-        
+
         if ("--testing-mode".equals(arg))
         {
             System.setProperty("org.eclipse.jetty.start.testing","true");
@@ -743,6 +874,7 @@
         {
             run = false;
             download = true;
+            licenseCheckRequired = true;
             return;
         }
 
@@ -773,6 +905,15 @@
             exec = true;
             return;
         }
+        
+        // Assign a fixed name to the property file for exec
+        if (arg.startsWith("--exec-properties="))
+        {
+            exec_properties=Props.getValue(arg);
+            if (!exec_properties.endsWith(".properties"))
+                throw new UsageException(ERR_BAD_ARG,"--exec-properties filename must have .properties suffix: %s",exec_properties);
+            return;
+        }
 
         // Enable forked execution of Jetty server
         if ("--approve-all-licenses".equals(arg))
@@ -812,6 +953,7 @@
             addToStartdIni.addAll(moduleNames);
             run = false;
             download = true;
+            licenseCheckRequired = true;
             return;
         }
 
@@ -822,6 +964,7 @@
             addToStartIni.addAll(moduleNames);
             run = false;
             download = true;
+            licenseCheckRequired = true;
             return;
         }
 
@@ -833,6 +976,17 @@
             return;
         }
 
+        // Skip [files] validation on a module
+        if (arg.startsWith("--skip-file-validation="))
+        {
+            List<String> moduleNames = Props.getValues(arg);
+            for (String moduleName : moduleNames)
+            {
+                skipFileValidationModules.add(moduleName);
+            }
+            return;
+        }
+
         // Create graphviz output of module graph
         if (arg.startsWith("--write-module-graph="))
         {
@@ -914,7 +1068,7 @@
             }
             return;
         }
-        
+
         if (FS.isPropertyFile(arg))
         {
             // only add non-duplicates
@@ -922,7 +1076,7 @@
             {
                 propertyFileRefs.add(arg);
             }
-                return;
+            return;
         }
 
         // Anything else is unrecognized
@@ -946,9 +1100,9 @@
 
     public void parseModule(Module module)
     {
-        if(module.hasDefaultConfig()) 
+        if (module.hasDefaultConfig())
         {
-            for(String line: module.getDefaultConfig())
+            for (String line : module.getDefaultConfig())
             {
                 parse(line,module.getFilesystemRef(),false);
             }
@@ -969,7 +1123,7 @@
             addUniqueXmlFile(xmlRef,xmlfile);
         }
     }
-    
+
     public void resolvePropertyFiles(BaseHome baseHome) throws IOException
     {
         // Find and Expand property files
@@ -990,7 +1144,7 @@
         this.allModules = allModules;
     }
 
-    private void setProperty(String key, String value, String source, boolean replaceProp)
+    public void setProperty(String key, String value, String source, boolean replaceProp)
     {
         // Special / Prevent override from start.ini's
         if (key.equals("jetty.home"))
@@ -1006,18 +1160,18 @@
             return;
         }
 
-        // Normal
-        if (replaceProp)
+        if (replaceProp || (!properties.containsKey(key)))
         {
-            // always override
             properties.setProperty(key,value,source);
-        }
-        else
-        {
-            // only set if unset
-            if (!properties.containsKey(key))
+            if(key.equals("java.version"))
             {
-                properties.setProperty(key,value,source);
+                Version ver = new Version(value);
+
+                properties.setProperty("java.version",ver.toShortString(),source);
+                properties.setProperty("java.version.major",Integer.toString(ver.getLegacyMajor()),source);
+                properties.setProperty("java.version.minor",Integer.toString(ver.getMajor()),source);
+                properties.setProperty("java.version.revision",Integer.toString(ver.getRevision()),source);
+                properties.setProperty("java.version.update",Integer.toString(ver.getUpdate()),source);
             }
         }
     }
@@ -1042,5 +1196,4 @@
         builder.append("]");
         return builder.toString();
     }
-
 }
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/StartIni.java b/jetty-start/src/main/java/org/eclipse/jetty/start/StartIni.java
index 939f26f..2748dca 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/StartIni.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/StartIni.java
@@ -64,7 +64,14 @@
     @Override
     public void init()
     {
-        basedir = getFile().getParent().toAbsolutePath();
+        try
+        {
+            basedir = getFile().getParent().toRealPath();
+        }
+        catch (IOException e)
+        {
+            basedir = getFile().getParent().normalize().toAbsolutePath();
+        }
     }
 
     public Path getBaseDir()
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/UsageException.java b/jetty-start/src/main/java/org/eclipse/jetty/start/UsageException.java
index d42794d..c78aa9d 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/UsageException.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/UsageException.java
@@ -27,8 +27,9 @@
     public static final int ERR_LOGGING = -1;
     public static final int ERR_INVOKE_MAIN = -2;
     public static final int ERR_NOT_STOPPED = -4;
-    public static final int ERR_UNKNOWN = -5;
-    public static final int ERR_BAD_ARG = -6;
+    public static final int ERR_BAD_ARG = -5;
+    public static final int ERR_BAD_GRAPH = -6;
+    public static final int ERR_UNKNOWN = -9;
     private int exitCode;
 
     public UsageException(int exitCode, String format, Object... objs)
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/Utils.java b/jetty-start/src/main/java/org/eclipse/jetty/start/Utils.java
new file mode 100644
index 0000000..89ec61e
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/Utils.java
@@ -0,0 +1,122 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start;
+
+import java.util.Collection;
+
+public final class Utils
+{
+    public static String join(Object[] arr, String delim)
+    {
+        if (arr == null)
+        {
+            return "";
+        }
+
+        return join(arr,0,arr.length,delim);
+    }
+
+    public static String join(Object[] arr, int start, int end, String delim)
+    {
+        if (arr == null)
+        {
+            return "";
+        }
+        StringBuilder str = new StringBuilder();
+        for (int i = start; i < end; i++)
+        {
+            if (i > start)
+            {
+                str.append(delim);
+            }
+            str.append(arr[i]);
+        }
+        return str.toString();
+    }
+
+    public static String join(Collection<?> objs, String delim)
+    {
+        if (objs == null)
+        {
+            return "";
+        }
+        StringBuilder str = new StringBuilder();
+        boolean needDelim = false;
+        for (Object obj : objs)
+        {
+            if (needDelim)
+            {
+                str.append(delim);
+            }
+            str.append(obj);
+            needDelim = true;
+        }
+        return str.toString();
+    }
+
+    /**
+     * Is String null, empty, or consisting of only whitespace.
+     * 
+     * @param value
+     *            the value to test
+     * @return true if null, empty, or consisting of only whitespace
+     */
+    public static boolean isBlank(String value)
+    {
+        if (value == null)
+        {
+            return true;
+        }
+        int len = value.length();
+        for (int i = 0; i < len; i++)
+        {
+            int c = value.codePointAt(i);
+            if (!Character.isWhitespace(c))
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Is String valid and has something other than whitespace
+     * 
+     * @param value
+     *            the value to test
+     * @return true if String has something other than whitespace
+     */
+    public static boolean isNotBlank(String value)
+    {
+        if (value == null)
+        {
+            return false;
+        }
+        int len = value.length();
+        for (int i = 0; i < len; i++)
+        {
+            int c = value.codePointAt(i);
+            if (!Character.isWhitespace(c))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/Version.java b/jetty-start/src/main/java/org/eclipse/jetty/start/Version.java
index 26550e5..1cf5fd9 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/Version.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/Version.java
@@ -19,112 +19,223 @@
 package org.eclipse.jetty.start;
 
 /**
- * Utility class for parsing and comparing version strings. JDK 1.1 compatible.
- * 
+ * Utility class for parsing and comparing version strings.
+ * <p>
+ * http://www.oracle.com/technetwork/java/javase/namechange-140185.html
  */
-
-public class Version
+public class Version implements Comparable<Version>
 {
+    /**
+     * The major version for java is always "1" (per
+     * <a href="http://www.oracle.com/technetwork/java/javase/namechange-140185.html">legacy versioning history</a>)
+     */
+    private int legacyMajor = 0;
+    /**
+     * The true major version is the second value ("1.5" == "Java 5", "1.8" = "Java 8", etc..)
+     */
+    private int major = -1;
+    /**
+     * The revision of the version.
+     * <p>
+     * This value is always "0" (also per <a
+     * href="http://www.oracle.com/technetwork/java/javase/namechange-140185.html">legacy versioning history</a>)
+     */
+    private int revision = -1;
+    /**
+     * The update (where bug fixes are placed)
+     */
+    private int update = -1;
+    /**
+     * Extra versioning information present on the version string, but not relevant for version comparison reason.
+     * (eg: with "1.8.0_45-internal", the suffix would be "-internal")
+     */
+    private String suffix = "";
 
-    int _version = 0;
-    int _revision = 0;
-    int _subrevision = 0;
-    String _suffix = "";
-
-    public Version()
+    private static enum ParseState
     {
+        LEGACY,
+        MAJOR,
+        REVISION,
+        UPDATE;
     }
 
-    public Version(String version_string)
+    public Version(String versionString)
     {
-        parse(version_string);
+        parse(versionString);
     }
 
-    // java.lang.Comparable is Java 1.2! Cannot use it
+    @Override
     /**
      * Compares with other version. Does not take extension into account, as there is no reliable way to order them.
      * 
+     * @param other the other version to compare this to 
      * @return -1 if this is older version that other, 0 if its same version, 1 if it's newer version than other
      */
-    public int compare(Version other)
+    public int compareTo(Version other)
     {
         if (other == null)
         {
             throw new NullPointerException("other version is null");
         }
-        if (this._version < other._version)
+        if (this.legacyMajor < other.legacyMajor)
         {
             return -1;
         }
-        if (this._version > other._version)
+        if (this.legacyMajor > other.legacyMajor)
         {
             return 1;
         }
-        if (this._revision < other._revision)
+        if (this.major < other.major)
         {
             return -1;
         }
-        if (this._revision > other._revision)
+        if (this.major > other.major)
         {
             return 1;
         }
-        if (this._subrevision < other._subrevision)
+        if (this.revision < other.revision)
         {
             return -1;
         }
-        if (this._subrevision > other._subrevision)
+        if (this.revision > other.revision)
+        {
+            return 1;
+        }
+        if (this.update < other.update)
+        {
+            return -1;
+        }
+        if (this.update > other.update)
         {
             return 1;
         }
         return 0;
     }
 
-    /**
-     * Check whether this verion is in range of versions specified
-     */
-    public boolean isInRange(Version low, Version high)
+    public int getLegacyMajor()
     {
-        return ((compare(low) >= 0) && (compare(high) <= 0));
+        return legacyMajor;
+    }
+
+    public int getMajor()
+    {
+        return major;
+    }
+
+    public int getRevision()
+    {
+        return revision;
+    }
+
+    public int getUpdate()
+    {
+        return update;
+    }
+
+    public String getSuffix()
+    {
+        return suffix;
+    }
+
+    public boolean isNewerThan(Version other)
+    {
+        return compareTo(other) == 1;
+    }
+
+    public boolean isNewerThanOrEqualTo(Version other)
+    {
+        int comp = compareTo(other);
+        return (comp == 0) || (comp == 1);
+    }
+
+    public boolean isOlderThan(Version other)
+    {
+        return compareTo(other) == -1;
+    }
+
+    public boolean isOlderThanOrEqualTo(Version other)
+    {
+        int comp = compareTo(other);
+        return (comp == 0) || (comp == -1);
     }
 
     /**
-     * parses version string in the form version[.revision[.subrevision[extension]]] into this instance.
+     * Check whether this version is in range of versions specified
+     * 
+     * @param low
+     *            the low part of the range
+     * @param high
+     *            the high part of the range
+     * @return true if this version is within the provided range
      */
-    public void parse(String version_string)
+    public boolean isInRange(Version low, Version high)
     {
-        _version = 0;
-        _revision = 0;
-        _subrevision = 0;
-        _suffix = "";
-        int pos = 0;
-        int startpos = 0;
-        int endpos = version_string.length();
-        while ((pos < endpos) && Character.isDigit(version_string.charAt(pos)))
+        return ((compareTo(low) >= 0) && (compareTo(high) <= 0));
+    }
+
+    /**
+     * parses version string in the form legacy[.major[.revision[_update[-suffix]]]] into this instance.
+     * 
+     * @param versionStr
+     *            the version string
+     */
+    private void parse(String versionStr)
+    {
+        legacyMajor = 0;
+        major = -1;
+        revision = -1;
+        update = -1;
+        suffix = "";
+
+        ParseState state = ParseState.LEGACY;
+        int offset = 0;
+        int len = versionStr.length();
+        int val = 0;
+        while (offset < len)
         {
-            pos++;
-        }
-        _version = Integer.parseInt(version_string.substring(startpos,pos));
-        if ((pos < endpos) && (version_string.charAt(pos) == '.'))
-        {
-            startpos = ++pos;
-            while ((pos < endpos) && Character.isDigit(version_string.charAt(pos)))
+            char c = versionStr.charAt(offset);
+            boolean isSeparator = !Character.isLetterOrDigit(c);
+            if (isSeparator)
             {
-                pos++;
+                val = 0;
             }
-            _revision = Integer.parseInt(version_string.substring(startpos,pos));
-        }
-        if ((pos < endpos) && (version_string.charAt(pos) == '.'))
-        {
-            startpos = ++pos;
-            while ((pos < endpos) && Character.isDigit(version_string.charAt(pos)))
+            else if (Character.isDigit(c))
             {
-                pos++;
+                val = (val * 10) + (c - '0');
             }
-            _subrevision = Integer.parseInt(version_string.substring(startpos,pos));
-        }
-        if (pos < endpos)
-        {
-            _suffix = version_string.substring(pos);
+            else if (Character.isLetter(c))
+            {
+                suffix = versionStr.substring(offset);
+                return;
+            }
+
+            switch (state)
+            {
+                case LEGACY:
+                    if (isSeparator)
+                        state = ParseState.MAJOR;
+                    else
+                        legacyMajor = val;
+                    break;
+                case MAJOR:
+                    if (isSeparator)
+                        state = ParseState.REVISION;
+                    else
+                        major = val;
+                    break;
+                case REVISION:
+                    if (isSeparator)
+                        state = ParseState.UPDATE;
+                    else
+                        revision = val;
+                    break;
+                case UPDATE:
+                    if (!isSeparator)
+                        update = val;
+                    break;
+            }
+
+            offset++;
         }
     }
 
@@ -135,12 +246,46 @@
     public String toString()
     {
         StringBuffer sb = new StringBuffer(10);
-        sb.append(_version);
-        sb.append('.');
-        sb.append(_revision);
-        sb.append('.');
-        sb.append(_subrevision);
-        sb.append(_suffix);
+        sb.append(legacyMajor);
+        if (major >= 0)
+        {
+            sb.append('.').append(major);
+            if (revision >= 0)
+            {
+                sb.append('.').append(revision);
+                if (update >= 0)
+                {
+                    sb.append('_').append(update);
+                }
+            }
+        }
+        if (Utils.isNotBlank(suffix))
+        {
+            sb.append('-').append(suffix);
+        }
+        return sb.toString();
+    }
+    
+    /**
+     * Return short string form (without suffix)
+     * @return string the short version string form
+     */
+    public String toShortString()
+    {
+        StringBuffer sb = new StringBuffer(10);
+        sb.append(legacyMajor);
+        if (major >= 0)
+        {
+            sb.append('.').append(major);
+            if (revision >= 0)
+            {
+                sb.append('.').append(revision);
+                if (update >= 0)
+                {
+                    sb.append('_').append(update);
+                }
+            }
+        }
         return sb.toString();
     }
 }
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/builders/StartDirBuilder.java b/jetty-start/src/main/java/org/eclipse/jetty/start/builders/StartDirBuilder.java
new file mode 100644
index 0000000..1de331d
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/builders/StartDirBuilder.java
@@ -0,0 +1,106 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.builders;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
+
+import org.eclipse.jetty.start.BaseBuilder;
+import org.eclipse.jetty.start.BaseHome;
+import org.eclipse.jetty.start.FS;
+import org.eclipse.jetty.start.Module;
+import org.eclipse.jetty.start.StartLog;
+import org.eclipse.jetty.start.graph.OnlyTransitivePredicate;
+
+/**
+ * Management of the <code>${jetty.base}/start.d/</code> based configuration.
+ * <p>
+ * Implementation of the <code>--add-to-startd=[name]</code> command line behavior
+ */
+public class StartDirBuilder implements BaseBuilder.Config
+{
+    private final BaseHome baseHome;
+    private final Path startDir;
+
+    public StartDirBuilder(BaseBuilder baseBuilder) throws IOException
+    {
+        this.baseHome = baseBuilder.getBaseHome();
+        this.startDir = baseHome.getBasePath("start.d");
+        FS.ensureDirectoryExists(startDir);
+    }
+
+    @Override
+    public boolean addModule(Module module) throws IOException
+    {
+        if (module.isDynamic())
+        {
+            if (module.hasIniTemplate())
+            {
+                // warn
+                StartLog.warn("%-15s not adding [ini-template] from dynamic module",module.getName());
+            }
+            return false;
+        }
+
+        String mode = "";
+        boolean isTransitive = module.matches(OnlyTransitivePredicate.INSTANCE);
+        if (isTransitive)
+        {
+            mode = "(transitively) ";
+        }
+
+        if (module.hasIniTemplate() || !isTransitive)
+        {
+            // Create start.d/{name}.ini
+            Path ini = startDir.resolve(module.getName() + ".ini");
+            StartLog.info("%-15s initialised %sin %s",module.getName(),mode,baseHome.toShortForm(ini));
+
+            try (BufferedWriter writer = Files.newBufferedWriter(ini,StandardCharsets.UTF_8,StandardOpenOption.CREATE,StandardOpenOption.TRUNCATE_EXISTING))
+            {
+                writeModuleSection(writer,module);
+            }
+            return true;
+        }
+
+        return false;
+    }
+
+    protected void writeModuleSection(BufferedWriter writer, Module module)
+    {
+        PrintWriter out = new PrintWriter(writer);
+
+        out.println("# --------------------------------------- ");
+        out.println("# Module: " + module.getName());
+        out.println("--module=" + module.getName());
+        out.println();
+
+        for (String line : module.getIniTemplate())
+        {
+            out.println(line);
+        }
+
+        out.println();
+        out.flush();
+    }
+}
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/builders/StartIniBuilder.java b/jetty-start/src/main/java/org/eclipse/jetty/start/builders/StartIniBuilder.java
new file mode 100644
index 0000000..035ec20
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/builders/StartIniBuilder.java
@@ -0,0 +1,148 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.builders;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jetty.start.BaseBuilder;
+import org.eclipse.jetty.start.BaseHome;
+import org.eclipse.jetty.start.Module;
+import org.eclipse.jetty.start.Props;
+import org.eclipse.jetty.start.StartLog;
+import org.eclipse.jetty.start.graph.OnlyTransitivePredicate;
+
+/**
+ * Management of the <code>${jetty.base}/start.ini</code> based configuration.
+ * <p>
+ * Implementation of the <code>--add-to-start=[name]</code> command line behavior
+ */
+public class StartIniBuilder implements BaseBuilder.Config
+{
+    private final BaseHome baseHome;
+    private final Path startIni;
+
+    /* List of modules already present in start.ini */
+    private Set<String> modulesPresent = new HashSet<>();
+
+    /* List of properties (keys only) already present in start.ini */
+    private Set<String> propsPresent = new HashSet<>();
+
+    public StartIniBuilder(BaseBuilder baseBuilder) throws IOException
+    {
+        this.baseHome = baseBuilder.getBaseHome();
+        this.startIni = baseHome.getBasePath("start.ini");
+
+        if (Files.exists(startIni))
+        {
+            parseIni();
+        }
+    }
+
+    private void parseIni() throws IOException
+    {
+        try (BufferedReader reader = Files.newBufferedReader(startIni,StandardCharsets.UTF_8))
+        {
+            String line;
+            while ((line = reader.readLine()) != null)
+            {
+                line = line.trim();
+                if (line.startsWith("--module="))
+                {
+                    List<String> moduleNames = Props.getValues(line);
+                    this.modulesPresent.addAll(moduleNames);
+                }
+                else if (!line.startsWith("-") && line.contains("="))
+                {
+                    String key = line.substring(0,line.indexOf('='));
+                    this.propsPresent.add(key);
+                }
+            }
+        }
+    }
+
+    @Override
+    public boolean addModule(Module module) throws IOException
+    {
+        if (modulesPresent.contains(module.getName()))
+        {
+            StartLog.info("%-15s already initialised in %s",module.getName(),baseHome.toShortForm(startIni));
+            // skip, already present
+            return false;
+        }
+
+        if (module.isDynamic())
+        {
+            if (module.hasIniTemplate())
+            {
+                // warn
+                StartLog.warn("%-15s not adding [ini-template] from dynamic module",module.getName());
+            }
+            return false;
+        }
+
+        String mode = "";
+        boolean isTransitive = module.matches(OnlyTransitivePredicate.INSTANCE);
+        if (isTransitive)
+        {
+            mode = "(transitively) ";
+        }
+
+        if (module.hasIniTemplate() || !isTransitive)
+        {
+            StartLog.info("%-15s initialised %sin %s",module.getName(),mode,baseHome.toShortForm(startIni));
+
+            // Append to start.ini
+            try (BufferedWriter writer = Files.newBufferedWriter(startIni,StandardCharsets.UTF_8,StandardOpenOption.APPEND,StandardOpenOption.CREATE))
+            {
+                writeModuleSection(writer,module);
+            }
+            return true;
+        }
+
+        return false;
+    }
+
+    protected void writeModuleSection(BufferedWriter writer, Module module)
+    {
+        PrintWriter out = new PrintWriter(writer);
+
+        out.println("# --------------------------------------- ");
+        out.println("# Module: " + module.getName());
+        out.println("--module=" + module.getName());
+        out.println();
+
+        for (String line : module.getIniTemplate())
+        {
+            out.println(line);
+        }
+
+        out.println();
+        out.flush();
+    }
+}
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/config/CommandLineConfigSource.java b/jetty-start/src/main/java/org/eclipse/jetty/start/config/CommandLineConfigSource.java
index 5adc475..c6f2368 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/config/CommandLineConfigSource.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/config/CommandLineConfigSource.java
@@ -32,6 +32,7 @@
 import org.eclipse.jetty.start.Props.Prop;
 import org.eclipse.jetty.start.RawArgs;
 import org.eclipse.jetty.start.UsageException;
+import org.eclipse.jetty.start.Utils;
 
 /**
  * Configuration Source representing the Command Line arguments.
@@ -69,14 +70,14 @@
     {
         // If a jetty property is defined, use it
         Prop prop = this.props.getProp(BaseHome.JETTY_BASE,false);
-        if (prop != null && !isEmpty(prop.value))
+        if (prop != null && !Utils.isBlank(prop.value))
         {
             return FS.toPath(prop.value);
         }
 
         // If a system property is defined, use it
         String val = System.getProperty(BaseHome.JETTY_BASE);
-        if (!isEmpty(val))
+        if (!Utils.isBlank(val))
         {
             return FS.toPath(val);
         }
@@ -91,14 +92,14 @@
     {
         // If a jetty property is defined, use it
         Prop prop = this.props.getProp(BaseHome.JETTY_HOME,false);
-        if (prop != null && !isEmpty(prop.value))
+        if (prop != null && !Utils.isBlank(prop.value))
         {
             return FS.toPath(prop.value);
         }
 
         // If a system property is defined, use it
         String val = System.getProperty(BaseHome.JETTY_HOME);
-        if (!isEmpty(val))
+        if (!Utils.isBlank(val))
         {
             return FS.toPath(val);
         }
@@ -130,24 +131,6 @@
         return home;
     }
 
-    private boolean isEmpty(String value)
-    {
-        if (value == null)
-        {
-            return true;
-        }
-        int len = value.length();
-        for (int i = 0; i < len; i++)
-        {
-            int c = value.codePointAt(i);
-            if (!Character.isWhitespace(c))
-            {
-                return false;
-            }
-        }
-        return true;
-    }
-
     @Override
     public boolean equals(Object obj)
     {
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/config/ConfigSources.java b/jetty-start/src/main/java/org/eclipse/jetty/start/config/ConfigSources.java
index b9ce307..a95715e 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/config/ConfigSources.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/config/ConfigSources.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.start.config;
 
-import static org.eclipse.jetty.start.UsageException.*;
+import static org.eclipse.jetty.start.UsageException.ERR_BAD_ARG;
 
 import java.io.IOException;
 import java.nio.file.Path;
@@ -31,13 +31,12 @@
 
 import org.eclipse.jetty.start.FS;
 import org.eclipse.jetty.start.Props;
-import org.eclipse.jetty.start.RawArgs;
 import org.eclipse.jetty.start.Props.Prop;
+import org.eclipse.jetty.start.RawArgs;
 import org.eclipse.jetty.start.UsageException;
 
 /**
  * Weighted List of ConfigSources.
- * <p>
  */
 public class ConfigSources implements Iterable<ConfigSource>
 {
@@ -74,7 +73,7 @@
             {
                 String ref = getValue(arg.getLine());
                 String dirName = props.expand(ref);
-                Path dir = FS.toPath(dirName);
+                Path dir = FS.toPath(dirName).normalize().toAbsolutePath();
                 DirConfigSource dirsource = new DirConfigSource(ref,dir,sourceWeight.incrementAndGet(),true);
                 add(dirsource);
             }
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/config/DirConfigSource.java b/jetty-start/src/main/java/org/eclipse/jetty/start/config/DirConfigSource.java
index f339ce1..8aef92f 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/config/DirConfigSource.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/config/DirConfigSource.java
@@ -18,11 +18,12 @@
 
 package org.eclipse.jetty.start.config;
 
-import static org.eclipse.jetty.start.UsageException.*;
+import static org.eclipse.jetty.start.UsageException.ERR_BAD_ARG;
 
 import java.io.IOException;
 import java.nio.file.DirectoryStream;
 import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
 import java.nio.file.Path;
 import java.nio.file.PathMatcher;
 import java.util.ArrayList;
@@ -33,11 +34,11 @@
 import org.eclipse.jetty.start.NaturalSort;
 import org.eclipse.jetty.start.PathMatchers;
 import org.eclipse.jetty.start.Props;
-import org.eclipse.jetty.start.RawArgs;
-import org.eclipse.jetty.start.UsageException;
 import org.eclipse.jetty.start.Props.Prop;
+import org.eclipse.jetty.start.RawArgs;
 import org.eclipse.jetty.start.StartIni;
 import org.eclipse.jetty.start.StartLog;
+import org.eclipse.jetty.start.UsageException;
 
 /**
  * A Directory based {@link ConfigSource}.
@@ -100,12 +101,21 @@
 
         if (canHaveArgs)
         {
-            Path iniFile = dir.resolve("start.ini");
-            if (FS.canReadFile(iniFile))
+            Path iniFile = dir.resolve("start.ini").normalize().toAbsolutePath();
+            
+            try
             {
-                StartIni ini = new StartIni(iniFile);
-                args.addAll(ini.getLines(),iniFile);
-                parseAllArgs(ini.getLines(),iniFile.toString());
+                iniFile = iniFile.toRealPath();
+                if (FS.canReadFile(iniFile))
+                {
+                    StartIni ini = new StartIni(iniFile);
+                    args.addAll(ini.getLines(),iniFile);
+                    parseAllArgs(ini.getLines(),iniFile.toString());
+                }
+            }
+            catch (NoSuchFileException ignore)
+            {
+                // ignore
             }
 
             Path startDdir = dir.resolve("start.d");
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/fileinits/MavenLocalRepoFileInitializer.java b/jetty-start/src/main/java/org/eclipse/jetty/start/fileinits/MavenLocalRepoFileInitializer.java
new file mode 100644
index 0000000..76f8e55
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/fileinits/MavenLocalRepoFileInitializer.java
@@ -0,0 +1,194 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.fileinits;
+
+import java.io.IOException;
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.eclipse.jetty.start.BaseHome;
+import org.eclipse.jetty.start.FS;
+import org.eclipse.jetty.start.FileInitializer;
+import org.eclipse.jetty.start.StartLog;
+import org.eclipse.jetty.start.Utils;
+
+/**
+ * Attempt to download a <code>maven://</code> URI, by first attempting to find
+ * the resource in the maven repository system (starting with local, then
+ * central)
+ * <p>
+ * Valid URI Formats:
+ * <dl>
+ * <dt><code>maven://&lt;groupId&gt;/&lt;artifactId&gt;/&lt;version&gt;</code></dt>
+ * <dd>minimum requirement (type defaults to <code>jar</code>, with no
+ * classifier)</dd>
+ * <dt><code>maven://&lt;groupId&gt;/&lt;artifactId&gt;/&lt;version&gt;/&lt;type&gt;</code></dt>
+ * <dd>optional type requirement</dd>
+ * <dt>
+ * <code>maven://&lt;groupId&gt;/&lt;artifactId&gt;/&lt;version&gt;/&lt;type&gt;/&lt;classifier&gt;</code>
+ * </dt>
+ * <dd>optional type and classifier requirement</dd>
+ * </dl>
+ */
+public class MavenLocalRepoFileInitializer extends UriFileInitializer implements FileInitializer
+{
+    public static class Coordinates
+    {
+        public String groupId;
+        public String artifactId;
+        public String version;
+        public String type;
+        public String classifier;
+
+        public String toPath()
+        {
+            StringBuilder pathlike = new StringBuilder();
+            pathlike.append(groupId.replace('.','/'));
+            pathlike.append('/').append(artifactId);
+            pathlike.append('/').append(version);
+            pathlike.append('/').append(artifactId);
+            pathlike.append('-').append(version);
+            if (classifier != null)
+            {
+                pathlike.append('-').append(classifier);
+            }
+            pathlike.append('.').append(type);
+            return pathlike.toString();
+        }
+
+        public URI toCentralURI()
+        {
+            return URI.create("http://central.maven.org/maven2/" + toPath());
+        }
+    }
+
+    private Path localRepositoryDir;
+
+    public MavenLocalRepoFileInitializer(BaseHome baseHome)
+    {
+        this(baseHome,null);
+    }
+
+    public MavenLocalRepoFileInitializer(BaseHome baseHome, Path localRepoDir)
+    {
+        super(baseHome);
+        this.localRepositoryDir = localRepoDir;
+    }
+
+    @Override
+    public boolean init(URI uri, Path file, String fileRef) throws IOException
+    {
+        Coordinates coords = getCoordinates(uri);
+        if (coords == null)
+        {
+            // Skip, not a maven:// URI
+            return false;
+        }
+
+        if (isFilePresent(file, baseHome.getPath(fileRef)))
+        {
+            // All done
+            return true;
+        }
+
+        // If using local repository
+        if (this.localRepositoryDir != null)
+        {
+            // Grab copy from local repository (download if needed to local
+            // repository)
+            Path localRepoFile = getLocalRepoFile(coords);
+            StartLog.log("COPY","%s to %s",localRepoFile,baseHome.toShortForm(file));
+            Files.copy(localRepoFile,file);
+        }
+        else
+        {
+            // normal non-local repo version
+            download(coords.toCentralURI(),file);
+        }
+        return true;
+    }
+
+    private Path getLocalRepoFile(Coordinates coords) throws IOException
+    {
+        Path localFile = localRepositoryDir.resolve(coords.toPath());
+        if (FS.canReadFile(localFile))
+        {
+            return localFile;
+        }
+
+        // Download, if needed
+        download(coords.toCentralURI(),localFile);
+        return localFile;
+    }
+
+    public Coordinates getCoordinates(URI uri)
+    {
+        if (!"maven".equalsIgnoreCase(uri.getScheme()))
+        {
+            return null;
+        }
+
+        String ssp = uri.getSchemeSpecificPart();
+
+        if (ssp.startsWith("//"))
+        {
+            ssp = ssp.substring(2);
+        }
+
+        String parts[] = ssp.split("/");
+
+        if (StartLog.isDebugEnabled())
+        {
+            StartLog.debug("ssp = %s",ssp);
+            StartLog.debug("parts = %d",parts.length);
+            for (int i = 0; i < parts.length; i++)
+            {
+                StartLog.debug("  part[%2d]: [%s]",i,parts[i]);
+            }
+        }
+
+        if (parts.length < 3)
+        {
+            throw new RuntimeException("Not a valid maven:// uri - " + uri);
+        }
+
+        Coordinates coords = new Coordinates();
+        coords.groupId = parts[0];
+        coords.artifactId = parts[1];
+        coords.version = parts[2];
+        coords.type = "jar";
+        coords.classifier = null;
+
+        if (parts.length >= 4)
+        {
+            if (Utils.isNotBlank(parts[3]))
+            {
+                coords.type = parts[3];
+            }
+
+            if ((parts.length == 5) && (Utils.isNotBlank(parts[4])))
+            {
+                coords.classifier = parts[4];
+            }
+        }
+
+        return coords;
+    }
+}
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/fileinits/TestFileInitializer.java b/jetty-start/src/main/java/org/eclipse/jetty/start/fileinits/TestFileInitializer.java
new file mode 100644
index 0000000..f2c0107
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/fileinits/TestFileInitializer.java
@@ -0,0 +1,44 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.fileinits;
+
+import java.io.IOException;
+import java.net.URI;
+import java.nio.file.Path;
+
+import org.eclipse.jetty.start.FS;
+import org.eclipse.jetty.start.FileInitializer;
+import org.eclipse.jetty.start.StartLog;
+
+/**
+ * In a start testing scenario, it is often not important to actually download
+ * or initialize a file, this implementation is merely a no-op for the
+ * {@link FileInitializer}
+ */
+public class TestFileInitializer implements FileInitializer
+{
+    @Override
+    public boolean init(URI uri, Path file, String fileRef) throws IOException
+    {
+        FS.ensureDirectoryExists(file.getParent());
+
+        StartLog.log("TESTING MODE","Skipping download of " + uri);
+        return true;
+    }
+}
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/fileinits/UriFileInitializer.java b/jetty-start/src/main/java/org/eclipse/jetty/start/fileinits/UriFileInitializer.java
new file mode 100644
index 0000000..0f5c097
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/fileinits/UriFileInitializer.java
@@ -0,0 +1,149 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.fileinits;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
+
+import org.eclipse.jetty.start.BaseHome;
+import org.eclipse.jetty.start.FS;
+import org.eclipse.jetty.start.FileInitializer;
+import org.eclipse.jetty.start.StartLog;
+
+public class UriFileInitializer implements FileInitializer
+{
+    private final static String[] SUPPORTED_SCHEMES = { "http", "https" };
+    protected final BaseHome baseHome;
+    
+    public UriFileInitializer(BaseHome baseHome)
+    {
+        this.baseHome = baseHome;
+    }
+    
+    @Override
+    public boolean init(URI uri, Path file, String fileRef) throws IOException
+    {
+        if (!isSupportedScheme(uri))
+        {
+            // Not a supported scheme.
+            return false;
+        }
+
+        if(isFilePresent(file, baseHome.getPath(fileRef)))
+        {
+            // All done
+            return true;
+        }
+
+        download(uri,file);
+
+        return true;
+    }
+
+    protected void download(URI uri, Path file) throws IOException
+    {
+        StartLog.log("DOWNLOAD","%s to %s",uri,baseHome.toShortForm(file));
+
+        FS.ensureDirectoryExists(file.getParent());
+        
+        HttpURLConnection http = (HttpURLConnection)uri.toURL().openConnection();
+        http.setInstanceFollowRedirects(true);
+        http.setAllowUserInteraction(false);
+        
+        int status = http.getResponseCode();
+        
+        if(status != HttpURLConnection.HTTP_OK)
+        {
+            throw new IOException("URL GET Failure [" + status + "/" + http.getResponseMessage() + "] on " + uri);
+        }
+
+        byte[] buf = new byte[8192];
+        try (InputStream in = http.getInputStream(); OutputStream out = Files.newOutputStream(file,StandardOpenOption.CREATE_NEW,StandardOpenOption.WRITE))
+        {
+            while (true)
+            {
+                int len = in.read(buf);
+
+                if (len > 0)
+                {
+                    out.write(buf,0,len);
+                }
+                if (len < 0)
+                {
+                    break;
+                }
+            }
+        }
+    }
+
+    /**
+     * Test if any of the Paths exist (as files)
+     * 
+     * @param paths
+     *            the list of paths to check
+     * @return true if the path exist (as a file), false if it doesn't exist
+     * @throws IOException
+     *             if the path points to a non-file, or is not readable.
+     */
+    protected boolean isFilePresent(Path... paths) throws IOException
+    {
+        for (Path file : paths)
+        {
+            if (Files.exists(file))
+            {
+                if (Files.isDirectory(file))
+                {
+                    throw new IOException("Directory in the way: " + file.toAbsolutePath());
+                }
+
+                if (!Files.isReadable(file))
+                {
+                    throw new IOException("File not readable: " + file.toAbsolutePath());
+                }
+
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    private boolean isSupportedScheme(URI uri)
+    {
+        String scheme = uri.getScheme();
+        if (scheme == null)
+        {
+            return false;
+        }
+        for (String supported : SUPPORTED_SCHEMES)
+        {
+            if (supported.equalsIgnoreCase(scheme))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/graph/AllPredicate.java b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/AllPredicate.java
new file mode 100644
index 0000000..85ea61c
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/AllPredicate.java
@@ -0,0 +1,31 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.graph;
+
+/**
+ * Match on everything.
+ */
+public class AllPredicate implements Predicate
+{
+    @Override
+    public boolean match(Node<?> node)
+    {
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/graph/AndPredicate.java b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/AndPredicate.java
new file mode 100644
index 0000000..2234c4f
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/AndPredicate.java
@@ -0,0 +1,46 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.graph;
+
+/**
+ * Match on multiple predicates.
+ */
+public class AndPredicate implements Predicate
+{
+    private final Predicate predicates[];
+
+    public AndPredicate(Predicate... predicates)
+    {
+        this.predicates = predicates;
+    }
+
+    @Override
+    public boolean match(Node<?> node)
+    {
+        for (Predicate predicate : this.predicates)
+        {
+            if (!predicate.match(node))
+            {
+                return false;
+            }
+        }
+
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/graph/AnySelectionPredicate.java b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/AnySelectionPredicate.java
new file mode 100644
index 0000000..667edbc
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/AnySelectionPredicate.java
@@ -0,0 +1,28 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.graph;
+
+public class AnySelectionPredicate implements Predicate
+{
+    @Override
+    public boolean match(Node<?> input)
+    {
+        return !input.getSelections().isEmpty();
+    }
+}
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/graph/CriteriaPredicate.java b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/CriteriaPredicate.java
new file mode 100644
index 0000000..416a216
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/CriteriaPredicate.java
@@ -0,0 +1,45 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.graph;
+
+/**
+ * Predicate against a specific {@link Selection#getCriteria()}
+ */
+public class CriteriaPredicate implements Predicate
+{
+    private final String criteria;
+
+    public CriteriaPredicate(String criteria)
+    {
+        this.criteria = criteria;
+    }
+
+    @Override
+    public boolean match(Node<?> node)
+    {
+        for (Selection selection : node.getSelections())
+        {
+            if (criteria.equalsIgnoreCase(selection.getCriteria()))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/graph/CriteriaSetPredicate.java b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/CriteriaSetPredicate.java
new file mode 100644
index 0000000..82c29f9
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/CriteriaSetPredicate.java
@@ -0,0 +1,71 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.graph;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Should match against the provided set of {@link Selection#getCriteria()} values.
+ * <p>
+ * Incomplete set is considered to be no-match.
+ */
+public class CriteriaSetPredicate implements Predicate
+{
+    private final Set<String> criteriaSet;
+
+    public CriteriaSetPredicate(String... criterias)
+    {
+        this.criteriaSet = new HashSet<>();
+
+        for (String name : criterias)
+        {
+            this.criteriaSet.add(name);
+        }
+    }
+
+    @Override
+    public boolean match(Node<?> node)
+    {
+        Set<Selection> selections = node.getSelections();
+        if (selections == null)
+        {
+            // empty sources list
+            return false;
+        }
+
+        Set<String> actualCriterias = node.getSelectedCriteriaSet();
+
+        if (actualCriterias.size() != criteriaSet.size())
+        {
+            // non-equal sized set
+            return false;
+        }
+
+        for (String actualCriteria : actualCriterias)
+        {
+            if (!this.criteriaSet.contains(actualCriteria))
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+
+}
\ No newline at end of file
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/graph/Graph.java b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/Graph.java
new file mode 100644
index 0000000..50557f5
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/Graph.java
@@ -0,0 +1,503 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.graph;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Stack;
+
+import org.eclipse.jetty.start.Props;
+import org.eclipse.jetty.start.StartLog;
+import org.eclipse.jetty.start.Utils;
+
+/**
+ * Basic Graph
+ * @param <T> the node type
+ */
+public abstract class Graph<T extends Node<T>> implements Iterable<T>
+{
+    private String selectionTerm = "select";
+    private String nodeTerm = "node";
+    private Map<String, T> nodes = new LinkedHashMap<>();
+    private int maxDepth = -1;
+
+    protected Set<String> asNameSet(Set<T> nodeSet)
+    {
+        Set<String> ret = new HashSet<>();
+        for (T node : nodeSet)
+        {
+            ret.add(node.getName());
+        }
+        return ret;
+    }
+
+    private void assertNoCycle(T node, Stack<String> refs)
+    {
+        for (T parent : node.getParentEdges())
+        {
+            if (refs.contains(parent.getName()))
+            {
+                // Cycle detected.
+                StringBuilder err = new StringBuilder();
+                err.append("A cyclic reference in the ");
+                err.append(this.getClass().getSimpleName());
+                err.append(" has been detected: ");
+                for (int i = 0; i < refs.size(); i++)
+                {
+                    if (i > 0)
+                    {
+                        err.append(" -> ");
+                    }
+                    err.append(refs.get(i));
+                }
+                err.append(" -> ").append(parent.getName());
+                throw new IllegalStateException(err.toString());
+            }
+
+            refs.push(parent.getName());
+            assertNoCycle(parent,refs);
+            refs.pop();
+        }
+    }
+
+    private void bfsCalculateDepth(final T node, final int depthNow)
+    {
+        int depth = depthNow + 1;
+
+        // Set depth on every child first
+        for (T child : node.getChildEdges())
+        {
+            child.setDepth(Math.max(depth,child.getDepth()));
+            this.maxDepth = Math.max(this.maxDepth,child.getDepth());
+        }
+
+        // Dive down
+        for (T child : node.getChildEdges())
+        {
+            bfsCalculateDepth(child,depth);
+        }
+    }
+
+    public void buildGraph() throws FileNotFoundException, IOException
+    {
+        // Connect edges
+        // Make a copy of nodes.values() as the list could be modified
+        List<T> nodeList = new ArrayList<>(nodes.values());
+        for (T node : nodeList)
+        {
+            for (String parentName : node.getParentNames())
+            {
+                T parent = get(parentName);
+
+                if (parent == null)
+                {
+                    parent = resolveNode(parentName);
+                }
+
+                if (parent == null)
+                {
+                    if (Props.hasPropertyKey(parentName))
+                    {
+                        StartLog.debug("Module property not expandable (yet) [%s]",parentName);
+                    }
+                    else
+                    {
+                        StartLog.warn("Module not found [%s]",parentName);
+                    }
+                }
+                else
+                {
+                    node.addParentEdge(parent);
+                    parent.addChildEdge(node);
+                }
+            }
+
+            for (String optionalParentName : node.getOptionalParentNames())
+            {
+                T optional = get(optionalParentName);
+                if (optional == null)
+                {
+                    StartLog.debug("Optional module not found [%s]",optionalParentName);
+                }
+                else if (optional.isSelected())
+                {
+                    node.addParentEdge(optional);
+                    optional.addChildEdge(node);
+                }
+            }
+        }
+
+        // Verify there is no cyclic references
+        Stack<String> refs = new Stack<>();
+        for (T module : nodes.values())
+        {
+            refs.push(module.getName());
+            assertNoCycle(module,refs);
+            refs.pop();
+        }
+
+        // Calculate depth of all modules for sorting later
+        for (T module : nodes.values())
+        {
+            if (module.getParentEdges().isEmpty())
+            {
+                bfsCalculateDepth(module,0);
+            }
+        }
+    }
+
+    public boolean containsNode(String name)
+    {
+        return nodes.containsKey(name);
+    }
+
+    public int count()
+    {
+        return nodes.size();
+    }
+
+    public void dumpSelectedTree()
+    {
+        List<T> ordered = new ArrayList<>();
+        ordered.addAll(nodes.values());
+        Collections.sort(ordered,new NodeDepthComparator());
+
+        List<T> active = getSelected();
+
+        for (T module : ordered)
+        {
+            if (active.contains(module))
+            {
+                // Show module name
+                String indent = toIndent(module.getDepth());
+                boolean transitive = module.matches(OnlyTransitivePredicate.INSTANCE);
+                System.out.printf("%s + %s: %s [%s]%n",indent,toCap(nodeTerm),module.getName(),transitive?"transitive":"selected");
+            }
+        }
+    }
+
+    public void dumpSelected()
+    {
+        List<T> ordered = new ArrayList<>();
+        ordered.addAll(nodes.values());
+        Collections.sort(ordered,new NodeDepthComparator());
+
+        List<T> active = getSelected();
+
+        for (T module : ordered)
+        {
+            if (active.contains(module))
+            {
+                // Show module name
+                boolean transitive = module.matches(OnlyTransitivePredicate.INSTANCE);
+                System.out.printf("  %3d) %-15s ",module.getDepth() + 1,module.getName());
+                if (transitive)
+                {
+                    System.out.println("<transitive> ");
+                }
+                else
+                {
+                    List<String> criterias = new ArrayList<>();
+                    for (Selection selection : module.getSelections())
+                    {
+                        if (selection.isExplicit())
+                        {
+                            criterias.add(selection.getCriteria());
+                        }
+                    }
+                    Collections.sort(criterias);
+                    System.out.println(Utils.join(criterias,", "));
+                }
+            }
+        }
+    }
+
+    protected void findChildren(T module, Set<T> ret)
+    {
+        ret.add(module);
+        for (T child : module.getChildEdges())
+        {
+            ret.add(child);
+        }
+    }
+
+    protected void findParents(T module, Map<String, T> ret)
+    {
+        ret.put(module.getName(),module);
+        for (T parent : module.getParentEdges())
+        {
+            ret.put(parent.getName(),parent);
+            findParents(parent,ret);
+        }
+    }
+
+    public T get(String name)
+    {
+        return nodes.get(name);
+    }
+
+    /**
+     * Get the list of Selected nodes.
+     * @return the list of selected nodes
+     */
+    public List<T> getSelected()
+    {
+        return getMatching(new AnySelectionPredicate());
+    }
+
+    /**
+     * Get the Nodes from the tree that match the provided predicate.
+     *
+     * @param predicate
+     *            the way to match nodes
+     * @return the list of matching nodes in execution order.
+     */
+    public List<T> getMatching(Predicate predicate)
+    {
+        List<T> selected = new ArrayList<T>();
+
+        for (T node : nodes.values())
+        {
+            if (predicate.match(node))
+            {
+                selected.add(node);
+            }
+        }
+
+        Collections.sort(selected,new NodeDepthComparator());
+        return selected;
+    }
+
+    public int getMaxDepth()
+    {
+        return maxDepth;
+    }
+
+    public Set<T> getModulesAtDepth(int depth)
+    {
+        Set<T> ret = new HashSet<>();
+        for (T node : nodes.values())
+        {
+            if (node.getDepth() == depth)
+            {
+                ret.add(node);
+            }
+        }
+        return ret;
+    }
+
+    public Collection<String> getNodeNames()
+    {
+        return nodes.keySet();
+    }
+
+    public Collection<T> getNodes()
+    {
+        return nodes.values();
+    }
+
+    public String getNodeTerm()
+    {
+        return nodeTerm;
+    }
+
+    public String getSelectionTerm()
+    {
+        return selectionTerm;
+    }
+
+    @Override
+    public Iterator<T> iterator()
+    {
+        return nodes.values().iterator();
+    }
+
+    public abstract void onNodeSelected(T node);
+
+    public T register(T node)
+    {
+        StartLog.debug("Registering Node: [%s] %s",node.getName(),node);
+        nodes.put(node.getName(),node);
+        return node;
+    }
+
+    public Set<String> resolveChildNodesOf(String nodeName)
+    {
+        Set<T> ret = new HashSet<>();
+        T module = get(nodeName);
+        findChildren(module,ret);
+        return asNameSet(ret);
+    }
+
+    /**
+     * Resolve a node just in time.
+     * <p>
+     * Useful for nodes that are virtual/transient in nature (such as the jsp/jstl/alpn modules)
+     * @param name the name of the node to resolve
+     * @return the node
+     */
+    public abstract T resolveNode(String name);
+
+    public Set<String> resolveParentModulesOf(String nodeName)
+    {
+        Map<String, T> ret = new HashMap<>();
+        T node = get(nodeName);
+        findParents(node,ret);
+        return ret.keySet();
+    }
+
+    public int selectNode(Predicate nodePredicate, Selection selection)
+    {
+        int count = 0;
+        List<T> matches = getMatching(nodePredicate);
+        if (matches.isEmpty())
+        {
+            StringBuilder err = new StringBuilder();
+            err.append("WARNING: Cannot ").append(selectionTerm);
+            err.append(" requested ").append(nodeTerm);
+            err.append("s.  ").append(nodePredicate);
+            err.append(" returned no matches.");
+            StartLog.warn(err.toString());
+            return count;
+        }
+
+        // select them
+        for (T node : matches)
+        {
+            count += selectNode(node,selection);
+        }
+
+        return count;
+    }
+
+    public int selectNode(String name, Selection selection)
+    {
+        int count = 0;
+        T node = get(name);
+        if (node == null)
+        {
+            StringBuilder err = new StringBuilder();
+            err.append("Cannot ").append(selectionTerm);
+            err.append(" requested ").append(nodeTerm);
+            err.append(" [").append(name).append("]: not a valid ");
+            err.append(nodeTerm).append(" name.");
+            StartLog.warn(err.toString());
+            return count;
+        }
+
+        count += selectNode(node,selection);
+
+        return count;
+    }
+
+    private int selectNode(T node, Selection selection)
+    {
+        int count = 0;
+
+        if (node.getSelections().contains(selection))
+        {
+            // Already enabled with this selection.
+            return count;
+        }
+
+        StartLog.debug("%s %s: %s (via %s)",toCap(selectionTerm),nodeTerm,node.getName(),selection);
+
+        boolean newlySelected = node.getSelections().isEmpty();
+
+        // Add self
+        node.addSelection(selection);
+        if (newlySelected)
+        {
+            onNodeSelected(node);
+        }
+        count++;
+
+        // Walk transitive
+        Selection transitive = selection.asTransitive();
+        List<String> parentNames = new ArrayList<>();
+        parentNames.addAll(node.getParentNames());
+
+        count += selectNodes(parentNames,transitive);
+
+        return count;
+    }
+
+    public int selectNodes(Collection<String> names, Selection selection)
+    {
+        StartLog.debug("%s [%s] (via %s)",toCap(selectionTerm),Utils.join(names,", "),selection);
+
+        int count = 0;
+
+        for (String name : names)
+        {
+            T node = get(name);
+            // Node doesn't exist yet (try to resolve it it just-in-time)
+            if (node == null)
+            {
+                StartLog.debug("resolving node [%s]",name);
+                node = resolveNode(name);
+            }
+            // Node still doesn't exist? this is now an invalid graph.
+            if (node == null)
+            {
+                throw new GraphException("Missing referenced dependency: " + name);
+            }
+
+            count += selectNode(node.getName(),selection);
+        }
+
+        return count;
+    }
+
+    public void setNodeTerm(String nodeTerm)
+    {
+        this.nodeTerm = nodeTerm;
+    }
+
+    public void setSelectionTerm(String selectionTerm)
+    {
+        this.selectionTerm = selectionTerm;
+    }
+
+    private String toCap(String str)
+    {
+        StringBuilder cap = new StringBuilder();
+        cap.append(Character.toUpperCase(str.charAt(0)));
+        cap.append(str.substring(1));
+        return cap.toString();
+    }
+
+    private String toIndent(int depth)
+    {
+        char indent[] = new char[depth * 2];
+        Arrays.fill(indent,' ');
+        return new String(indent);
+    }
+}
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/graph/GraphException.java b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/GraphException.java
new file mode 100644
index 0000000..b616432
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/GraphException.java
@@ -0,0 +1,36 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.graph;
+
+/**
+ * A non-recoverable graph exception
+ */
+@SuppressWarnings("serial")
+public class GraphException extends RuntimeException
+{
+    public GraphException(String message, Throwable cause)
+    {
+        super(message,cause);
+    }
+
+    public GraphException(String message)
+    {
+        super(message);
+    }
+}
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/graph/NamePredicate.java b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/NamePredicate.java
new file mode 100644
index 0000000..db17559
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/NamePredicate.java
@@ -0,0 +1,35 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.graph;
+
+public class NamePredicate implements Predicate
+{
+    private final String name;
+    
+    public NamePredicate(String name)
+    {
+        this.name = name;
+    }
+    
+    @Override
+    public boolean match(Node<?> input)
+    {
+        return input.getName().equalsIgnoreCase(this.name);
+    }
+}
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/graph/Node.java b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/Node.java
new file mode 100644
index 0000000..5cd7eff
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/Node.java
@@ -0,0 +1,179 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.graph;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Basic Graph Node
+ * @param <T> the node type
+ */
+public abstract class Node<T>
+{
+    /** The logical name of this Node */
+    private String logicalName;
+    /** The depth of the Node in the tree */
+    private int depth = 0;
+    /** The set of selections for how this node was selected */
+    private Set<Selection> selections = new LinkedHashSet<>();
+    /** Set of Nodes, by name, that this Node depends on */
+    private List<String> parentNames = new ArrayList<>();
+    /** Set of Nodes, by name, that this Node optionally depend on */
+    private List<String> optionalParentNames = new ArrayList<>();
+
+    /** The Edges to parent Nodes */
+    private Set<T> parentEdges = new LinkedHashSet<>();
+    /** The Edges to child Nodes */
+    private Set<T> childEdges = new LinkedHashSet<>();
+
+    public void addChildEdge(T child)
+    {
+        if (childEdges.contains(child))
+        {
+            // already present, skip
+            return;
+        }
+        this.childEdges.add(child);
+    }
+
+    public void addOptionalParentName(String name)
+    {
+        if (this.optionalParentNames.contains(name))
+        {
+            // skip, name already exists
+            return;
+        }
+        this.optionalParentNames.add(name);
+    }
+
+    public void addParentEdge(T parent)
+    {
+        if (parentEdges.contains(parent))
+        {
+            // already present, skip
+            return;
+        }
+        this.parentEdges.add(parent);
+    }
+
+    public void addParentName(String name)
+    {
+        if (this.parentNames.contains(name))
+        {
+            // skip, name already exists
+            return;
+        }
+        this.parentNames.add(name);
+    }
+
+    public void addSelection(Selection selection)
+    {
+        this.selections.add(selection);
+    }
+
+    public Set<T> getChildEdges()
+    {
+        return childEdges;
+    }
+
+    public int getDepth()
+    {
+        return depth;
+    }
+
+    @Deprecated
+    public String getLogicalName()
+    {
+        return logicalName;
+    }
+
+    public String getName()
+    {
+        return logicalName;
+    }
+
+    public List<String> getOptionalParentNames()
+    {
+        return optionalParentNames;
+    }
+
+    public Set<T> getParentEdges()
+    {
+        return parentEdges;
+    }
+
+    public List<String> getParentNames()
+    {
+        return parentNames;
+    }
+
+    public Set<Selection> getSelections()
+    {
+        return selections;
+    }
+
+    public Set<String> getSelectedCriteriaSet()
+    {
+        Set<String> criteriaSet = new HashSet<>();
+        for (Selection selection : selections)
+        {
+            criteriaSet.add(selection.getCriteria());
+        }
+        return criteriaSet;
+    }
+
+    public boolean isSelected()
+    {
+        return !selections.isEmpty();
+    }
+
+    public boolean matches(Predicate predicate)
+    {
+        return predicate.match(this);
+    }
+
+    public void setDepth(int depth)
+    {
+        this.depth = depth;
+    }
+
+    public void setName(String name)
+    {
+        this.logicalName = name;
+    }
+
+    public void setParentNames(List<String> parents)
+    {
+        this.parentNames.clear();
+        this.parentEdges.clear();
+        if (parents != null)
+        {
+            this.parentNames.addAll(parents);
+        }
+    }
+
+    public void setSelections(Set<Selection> selection)
+    {
+        this.selections = selection;
+    }
+}
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/graph/NodeDepthComparator.java b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/NodeDepthComparator.java
new file mode 100644
index 0000000..3ae0bd8
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/NodeDepthComparator.java
@@ -0,0 +1,43 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.graph;
+
+import java.text.CollationKey;
+import java.text.Collator;
+import java.util.Comparator;
+
+public class NodeDepthComparator implements Comparator<Node<?>>
+{
+    private Collator collator = Collator.getInstance();
+
+    @Override
+    public int compare(Node<?> o1, Node<?> o2)
+    {
+        // order by depth first.
+        int diff = o1.getDepth() - o2.getDepth();
+        if (diff != 0)
+        {
+            return diff;
+        }
+        // then by name (not really needed, but makes for predictable test cases)
+        CollationKey k1 = collator.getCollationKey(o1.getName());
+        CollationKey k2 = collator.getCollationKey(o2.getName());
+        return k1.compareTo(k2);
+    }
+}
\ No newline at end of file
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/graph/OnlyTransitivePredicate.java b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/OnlyTransitivePredicate.java
new file mode 100644
index 0000000..8c91c40
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/OnlyTransitivePredicate.java
@@ -0,0 +1,41 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.graph;
+
+/**
+ * Predicate for a node that has no explicitly set selections.
+ * (They are all transitive)
+ */
+public class OnlyTransitivePredicate implements Predicate
+{
+    public static final Predicate INSTANCE = new OnlyTransitivePredicate();
+    
+    @Override
+    public boolean match(Node<?> input)
+    {
+        for (Selection selection : input.getSelections())
+        {
+            if (selection.isExplicit())
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+}
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/graph/Predicate.java b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/Predicate.java
new file mode 100644
index 0000000..b995932
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/Predicate.java
@@ -0,0 +1,27 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.graph;
+
+/**
+ * Matcher of Nodes
+ */
+public interface Predicate
+{
+    public boolean match(Node<?> input);
+}
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/graph/RegexNamePredicate.java b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/RegexNamePredicate.java
new file mode 100644
index 0000000..2adbb31
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/RegexNamePredicate.java
@@ -0,0 +1,40 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.graph;
+
+import java.util.regex.Pattern;
+
+/**
+ * Match a node based on name
+ */
+public class RegexNamePredicate implements Predicate
+{
+    private final Pattern pat;
+
+    public RegexNamePredicate(String regex)
+    {
+        this.pat = Pattern.compile(regex);
+    }
+
+    @Override
+    public boolean match(Node<?> node)
+    {
+        return pat.matcher(node.getName()).matches();
+    }
+}
\ No newline at end of file
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/graph/Selection.java b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/Selection.java
new file mode 100644
index 0000000..a6e9aa3
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/Selection.java
@@ -0,0 +1,129 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.graph;
+
+/**
+ * Represents a selection criteria.
+ * <p>
+ * Each <code>Selection</code> can be used [0..n] times in the graph. The <code>Selection</code> must contain a unique
+ * 'criteria' description that how selection was determined.
+ */
+public class Selection
+{
+    private final boolean explicit;
+    private final String criteria;
+
+    public Selection(String criteria)
+    {
+        this(criteria,true);
+    }
+
+    /**
+     * The Selection criteria
+     * 
+     * @param criteria
+     *            the selection criteria
+     * @param explicit
+     *            true if explicitly selected, false if transitively selected.
+     */
+    public Selection(String criteria, boolean explicit)
+    {
+        this.criteria = criteria;
+        this.explicit = explicit;
+    }
+
+    public Selection asTransitive()
+    {
+        if (this.explicit)
+        {
+            return new Selection(criteria,false);
+        }
+        return this;
+    }
+
+    @Override
+    public boolean equals(Object obj)
+    {
+        if (this == obj)
+        {
+            return true;
+        }
+        if (obj == null)
+        {
+            return false;
+        }
+        if (getClass() != obj.getClass())
+        {
+            return false;
+        }
+        Selection other = (Selection)obj;
+        if (explicit != other.explicit)
+        {
+            return false;
+        }
+        if (criteria == null)
+        {
+            if (other.criteria != null)
+            {
+                return false;
+            }
+        }
+        else if (!criteria.equals(other.criteria))
+        {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Get the criteria for this selection
+     * @return the criteria
+     */
+    public String getCriteria()
+    {
+        return criteria;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        final int prime = 31;
+        int result = 1;
+        result = (prime * result) + (explicit ? 1231 : 1237);
+        result = (prime * result) + ((criteria == null) ? 0 : criteria.hashCode());
+        return result;
+    }
+
+    public boolean isExplicit()
+    {
+        return explicit;
+    }
+
+    @Override
+    public String toString()
+    {
+        StringBuilder str = new StringBuilder();
+        if (!explicit)
+        {
+            str.append("<transitive from> ");
+        }
+        str.append(criteria);
+        return str.toString();
+    }
+}
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/graph/UniqueCriteriaPredicate.java b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/UniqueCriteriaPredicate.java
new file mode 100644
index 0000000..91b87bb
--- /dev/null
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/graph/UniqueCriteriaPredicate.java
@@ -0,0 +1,63 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.graph;
+
+/**
+ * Match against a specific {@link Selection#getCriteria()}, where
+ * there are no other {@link Selection#isExplicit()} specified.
+ */
+public class UniqueCriteriaPredicate implements Predicate
+{
+    private final String criteria;
+
+    public UniqueCriteriaPredicate(String criteria)
+    {
+        this.criteria = criteria;
+    }
+
+    @Override
+    public boolean match(Node<?> node)
+    {
+        if (node.getSelections().isEmpty())
+        {
+            // Empty selection list (no uniqueness to it)
+            return false;
+        }
+        
+        // Assume no match
+        boolean ret = false;
+        
+        for (Selection selection : node.getSelections())
+        {
+            if (criteria.equalsIgnoreCase(selection.getCriteria()))
+            {
+                // Found a match
+                ret = true;
+                continue; // this criteria is always valid.
+            }
+            else if (selection.isExplicit())
+            {
+                // Automatic failure
+                return false;
+            }
+        }
+
+        return ret;
+    }
+}
\ No newline at end of file
diff --git a/jetty-start/src/main/resources/org/eclipse/jetty/start/base-home-warning.txt b/jetty-start/src/main/resources/org/eclipse/jetty/start/base-home-warning.txt
deleted file mode 100644
index a34bfdb..0000000
--- a/jetty-start/src/main/resources/org/eclipse/jetty/start/base-home-warning.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-============================================================================
-WARNING: Jetty is starting using LEGACY behavior. 
-
-A proper {jetty.base} should be configured with no changes being made to the {jetty.home} directory.
-
-Please see http://www.eclipse.org/jetty/documentation/current/startup.html
-
-A demo-base directory has been provided as an example of this setup.
-
-  $ cd demo-base
-  $ java -jar ../start.jar
-
-This warning may be disabled by setting the system property
-
-  -Dorg.eclipse.jetty.start.home.warning=false
-============================================================================
diff --git a/jetty-start/src/main/resources/org/eclipse/jetty/start/usage.txt b/jetty-start/src/main/resources/org/eclipse/jetty/start/usage.txt
index eacb16b..413160b 100644
--- a/jetty-start/src/main/resources/org/eclipse/jetty/start/usage.txt
+++ b/jetty-start/src/main/resources/org/eclipse/jetty/start/usage.txt
@@ -34,7 +34,12 @@
                    a sub process. This can be used when start.ini
                    contains -X or -D arguments, but creates an extra
                    JVM instance.
-
+                   
+  --exec-properties=<filename>
+                   Assign a fixed name to the file used to transfer 
+                   properties to the sub process. This allows the 
+                   generated properties file to be saved and reused.
+                   Without this option, a temporary file is used.
 
 Debug and Start Logging:
 ------------------------
@@ -67,7 +72,7 @@
                    Temporarily enable a module from the command line.
                    Note: this can also be used in the ${jetty.base}/start.ini
                    or ${jetty.base}/start.d/*.ini files.
-
+                   
   --add-to-start=<modulename>(,<modulename>)*
                    Enable a module by appending lines to the
                    ${jetty.base}/start.ini file.
@@ -94,10 +99,25 @@
                    See http://graphviz.org/ for details on how to post-process
                    this file into the output best suited for your needs.
                    
-  --create-files   Create any missing files that are required by initialised 
+  --create-files   Create any missing files that are required by initialized 
                    modules.  This may download a file from the network if the 
                    module provides a URL.
 
+  --skip-file-validation=<modulename>(,<modulename)*
+                   Disable the [files] section validation of content
+                   in the ${jetty.base} directory for a specific
+                   module.  Useful for modules that have downloadable
+                   content that is being overridden with alternatives
+                   in the ${jetty.base} directory.
+                   CAUTION: 
+                     This advanced option is for administrators that
+                     fully understand the configuration of their
+                     ${jetty.base} and are willing to forego some of the
+                     safety checks built into the jetty-start mechanism.
+                     
+  --approve-all-licenses
+                   Approve all license questions. Useful for enabling 
+                   modules from a script that does not require user interaction.
 
 Startup / Shutdown Command Line:
 --------------------------------
@@ -118,7 +138,7 @@
 
     STOP.KEY=[alphanumeric]
       The passphrase defined to stop the server.
-      Requried along with STOP.PORT if you want to use the --stop option above.
+      Required along with STOP.PORT if you want to use the --stop option above.
 
     STOP.WAIT=[number]
       The time (in seconds) to wait for confirmation that the running
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/BaseHomeTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/BaseHomeTest.java
index 0592633..8a61545 100644
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/BaseHomeTest.java
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/BaseHomeTest.java
@@ -18,7 +18,10 @@
 
 package org.eclipse.jetty.start;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.containsInAnyOrder;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.startsWith;
 
 import java.io.File;
 import java.io.IOException;
@@ -57,7 +60,7 @@
                 System.out.printf(" %s%n",path);
             }
         }
-        Assert.assertThat(message + ": " + Main.join(actual,", "),actual,containsInAnyOrder(expected.toArray()));
+        Assert.assertThat(message + ": " + Utils.join(actual,", "),actual,containsInAnyOrder(expected.toArray()));
     }
     
     public static void assertPathList(BaseHome hb, String message, List<String> expected, List<Path> paths)
@@ -81,7 +84,7 @@
                 System.out.printf(" %s%n",path);
             }
         }
-        Assert.assertThat(message + ": " + Main.join(actual,", "),actual,containsInAnyOrder(expected.toArray()));
+        Assert.assertThat(message + ": " + Utils.join(actual,", "),actual,containsInAnyOrder(expected.toArray()));
     }
 
     public static void assertFileList(BaseHome hb, String message, List<String> expected, List<File> files)
@@ -91,7 +94,7 @@
         {
             actual.add(hb.toShortForm(file));
         }
-        Assert.assertThat(message + ": " + Main.join(actual,", "),actual,containsInAnyOrder(expected.toArray()));
+        Assert.assertThat(message + ": " + Utils.join(actual,", "),actual,containsInAnyOrder(expected.toArray()));
     }
 
     @Test
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/ConfigurationAssert.java b/jetty-start/src/test/java/org/eclipse/jetty/start/ConfigurationAssert.java
index 845811b..e651030 100644
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/ConfigurationAssert.java
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/ConfigurationAssert.java
@@ -18,7 +18,8 @@
 
 package org.eclipse.jetty.start;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
 
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -47,11 +48,12 @@
      *            the StartArgs that has been processed via {@link Main#processCommandLine(String[])}
      * @param filename
      *            the filename of the assertion values
-     * @throws IOException
+     * @throws FileNotFoundException if unable to find the configuration
+     * @throws IOException if unable to process the configuration
      */
     public static void assertConfiguration(BaseHome baseHome, StartArgs args, String filename) throws FileNotFoundException, IOException
     {
-        Path testResourcesDir = MavenTestingUtils.getTestResourcesDir().toPath().toAbsolutePath();
+        Path testResourcesDir = MavenTestingUtils.getTestResourcesDir().toPath().toRealPath();
         File file = MavenTestingUtils.getTestResourceFile(filename);
         TextFile textFile = new TextFile(file.toPath());
 
@@ -101,7 +103,8 @@
         {
             String name = prop.key;
             if ("jetty.home".equals(name) || "jetty.base".equals(name) ||
-                "user.dir".equals(name) || prop.origin.equals(Props.ORIGIN_SYSPROP))
+                "user.dir".equals(name) || prop.origin.equals(Props.ORIGIN_SYSPROP) ||
+                name.startsWith("java."))
             {
                 // strip these out from assertion, to make assertions easier.
                 continue;
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/DistTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/DistTest.java
new file mode 100644
index 0000000..1d08dea
--- /dev/null
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/DistTest.java
@@ -0,0 +1,211 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start;
+
+import static org.eclipse.jetty.start.StartMatchers.fileExists;
+import static org.eclipse.jetty.start.StartMatchers.notPathExists;
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.assertThat;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+import org.eclipse.jetty.toolchain.test.TestingDir;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+
+/**
+ * Test various things with a semi-valid src/test/resources/dist-home/
+ */
+public class DistTest
+{
+    @Rule
+    public TestingDir testdir = new TestingDir();
+
+    @Rule
+    public SystemExitAsException exitrule = new SystemExitAsException();
+
+    private void execMain(List<String> cmds) throws Exception
+    {
+        int len = cmds.size();
+        String args[] = cmds.toArray(new String[len]);
+
+        Main main = new Main();
+        StartArgs startArgs = main.processCommandLine(args);
+        main.start(startArgs);
+    }
+
+    public List<String> getBaseCommandLine(Path basePath)
+    {
+        List<String> cmds = new ArrayList<String>();
+        cmds.add("-Djava.io.tmpdir=" + MavenTestingUtils.getTargetDir().getAbsolutePath());
+        cmds.add("-Djetty.home=" + MavenTestingUtils.getTestResourceDir("dist-home").getAbsolutePath());
+        cmds.add("-Djetty.base=" + basePath.normalize().toAbsolutePath().toString());
+        cmds.add("--testing-mode");
+
+        return cmds;
+    }
+
+    @Test
+    public void testLikeDistro_SetupHome() throws Exception
+    {
+        Path basePath = testdir.getEmptyDir().toPath();
+
+        List<String> cmds = getBaseCommandLine(basePath);
+
+        cmds.add("--add-to-start=deploy,websocket,ext,resources,jsp,jstl,http");
+
+        execMain(cmds);
+    }
+    
+    @Test
+    public void testAddJstl() throws Exception
+    {
+        Path basePath = testdir.getEmptyDir().toPath();
+
+        List<String> cmds = getBaseCommandLine(basePath);
+        cmds.add("--add-to-start=jstl");
+        execMain(cmds);
+        
+        Path startIni = basePath.resolve("start.ini");
+        assertThat("start.ini", startIni, fileExists());
+
+        List<String> startIniLines = new TextFile(startIni).getLines();
+        // Modules that should be present
+        assertThat("start.ini", startIniLines, hasItem("--module=jstl"));
+        assertThat("start.ini", startIniLines, hasItem("--module=server"));
+        
+        // Test for modules that should not be present.
+        // Namely modules that are transitive and without ini-template.
+        assertThat("start.ini", startIniLines, not(hasItem("--module=servlet")));
+        assertThat("start.ini", startIniLines, not(hasItem("--module=apache-jsp")));
+        assertThat("start.ini", startIniLines, not(hasItem("--module=apache-jstl")));
+        assertThat("start.ini", startIniLines, not(hasItem("--module=jndi")));
+        assertThat("start.ini", startIniLines, not(hasItem("--module=security")));
+        assertThat("start.ini", startIniLines, not(hasItem("--module=webapp")));
+        assertThat("start.ini", startIniLines, not(hasItem("--module=plus")));
+        assertThat("start.ini", startIniLines, not(hasItem("--module=annotations")));
+        assertThat("start.ini", startIniLines, not(hasItem("--module=jsp")));
+        
+    }
+    
+    /**
+     * Test for https://bugs.eclipse.org/452329
+     * @throws Exception on test failure
+     */
+    @Test
+    public void testReAddServerModule() throws Exception
+    {
+        Path basePath = testdir.getEmptyDir().toPath();
+
+        List<String> cmds = getBaseCommandLine(basePath);
+        cmds.add("--add-to-startd=http");
+        execMain(cmds);
+        
+        Path httpIni = basePath.resolve("start.d/http.ini");
+        Path serverIni = basePath.resolve("start.d/server.ini");
+        
+        assertThat("start.d/http.ini", httpIni, fileExists());
+        assertThat("start.d/server.ini", serverIni, fileExists());
+        
+        // Delete server.ini
+        Files.deleteIfExists(serverIni);
+        
+        // Attempt to re-add via 'server' module reference
+        cmds = getBaseCommandLine(basePath);
+        cmds.add("--add-to-startd=server");
+        execMain(cmds);
+        
+        assertThat("start.d/server.ini", serverIni, fileExists());
+    }
+    
+    /**
+     * Test for https://bugs.eclipse.org/452329
+     * @throws Exception on test failure
+     */
+    @Test
+    public void testReAddServerViaHttpModule() throws Exception
+    {
+        Path basePath = testdir.getEmptyDir().toPath();
+
+        List<String> cmds = getBaseCommandLine(basePath);
+        cmds.add("--add-to-startd=http");
+        execMain(cmds);
+        
+        Path httpIni = basePath.resolve("start.d/http.ini");
+        Path serverIni = basePath.resolve("start.d/server.ini");
+        
+        assertThat("start.d/http.ini", httpIni, fileExists());
+        assertThat("start.d/server.ini", serverIni, fileExists());
+        
+        // Delete server.ini
+        Files.deleteIfExists(serverIni);
+        
+        // Attempt to re-add via 'http' module reference
+        cmds = getBaseCommandLine(basePath);
+        cmds.add("--add-to-startd=http");
+        execMain(cmds);
+        
+        assertThat("start.d/server.ini", serverIni, fileExists());
+    }
+    
+    /**
+     * Test for https://bugs.eclipse.org/452329
+     * @throws Exception on test failure
+     */
+    @Test
+    public void testReAddHttpThenDeployViaStartD() throws Exception
+    {
+        Path basePath = testdir.getEmptyDir().toPath();
+
+        List<String> cmds = getBaseCommandLine(basePath);
+        cmds.add("--add-to-start=http");
+        execMain(cmds);
+        
+        Path startIni = basePath.resolve("start.ini");
+        assertThat("start.ini", startIni, fileExists());
+
+        // Now add 'deploy' module.
+        cmds = getBaseCommandLine(basePath);
+        cmds.add("--add-to-startd=deploy");
+        execMain(cmds);
+        
+        // The following files should not exist (as its already defined in /start.ini)
+        Path serverIni = basePath.resolve("start.d/server.ini");
+        assertThat("start.d/server.ini", serverIni, notPathExists());
+    }
+    
+    @Test
+    @Ignore("See https://bugs.eclipse.org/451973")
+    public void testLikeDistro_SetupDemoBase() throws Exception
+    {
+        Path basePath = testdir.getEmptyDir().toPath();
+
+        List<String> cmds = getBaseCommandLine(basePath);
+
+        cmds.add("--add-to-start=continuation,deploy,websocket,ext,resources,client,annotations,jndi,servlets");
+        cmds.add("--add-to-startd=jsp,jstl,http,https");
+
+        execMain(cmds);
+    }
+}
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/FSTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/FSTest.java
index ce26f24..ba071e4 100644
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/FSTest.java
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/FSTest.java
@@ -50,6 +50,7 @@
     
     /**
      * Utility method used by other test cases
+     * @param expected the expected String paths to be converted (in place)
      */
     public static void toOsSeparators(List<String> expected)
     {
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/FileArgTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/FileArgTest.java
index 049437d..217f1c7 100644
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/FileArgTest.java
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/FileArgTest.java
@@ -18,8 +18,9 @@
 
 package org.eclipse.jetty.start;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.nullValue;
+import static org.junit.Assert.assertThat;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/IncludeJettyDirTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/IncludeJettyDirTest.java
index a197d64..3c353df 100644
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/IncludeJettyDirTest.java
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/IncludeJettyDirTest.java
@@ -18,8 +18,6 @@
 
 package org.eclipse.jetty.start;
 
-import static org.hamcrest.Matchers.*;
-
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
@@ -34,6 +32,10 @@
 import org.junit.Rule;
 import org.junit.Test;
 
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
 public class IncludeJettyDirTest
 {
     private static class MainResult
@@ -89,13 +91,13 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1");
+                "jetty.http.host=127.0.0.1");
 
         // Simple command line - no reference to include-jetty-dirs
         MainResult result = runMain(base,home);
@@ -105,7 +107,7 @@
         expectedSearchOrder.add("${jetty.home}");
         result.assertSearchOrder(expectedSearchOrder);
 
-        result.assertProperty("jetty.host","127.0.0.1");
+        result.assertProperty("jetty.http.host","127.0.0.1");
     }
 
     @Test
@@ -114,18 +116,18 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create common
         File common = testdir.getFile("common");
         FS.ensureEmpty(common);
-        TestEnv.makeFile(common,"start.ini","jetty.port=8080");
+        TestEnv.makeFile(common,"start.ini","jetty.http.port=8080");
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1");
+                "jetty.http.host=127.0.0.1");
 
         // Simple command line reference to include-jetty-dir
         MainResult result = runMain(base,home,
@@ -138,8 +140,8 @@
         expectedSearchOrder.add("${jetty.home}");
         result.assertSearchOrder(expectedSearchOrder);
 
-        result.assertProperty("jetty.host","127.0.0.1");
-        result.assertProperty("jetty.port","8080"); // from 'common'
+        result.assertProperty("jetty.http.host","127.0.0.1");
+        result.assertProperty("jetty.http.port","8080"); // from 'common'
     }
 
     @Test
@@ -148,18 +150,18 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create common
         File common = testdir.getFile("common");
         FS.ensureEmpty(common);
-        TestEnv.makeFile(common,"start.ini","jetty.port=8080");
+        TestEnv.makeFile(common,"start.ini","jetty.http.port=8080");
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1");
+                "jetty.http.host=127.0.0.1");
 
         // Simple command line reference to include-jetty-dir via property (also on command line)
         MainResult result = runMain(base,home,
@@ -174,8 +176,8 @@
         expectedSearchOrder.add("${jetty.home}");
         result.assertSearchOrder(expectedSearchOrder);
 
-        result.assertProperty("jetty.host","127.0.0.1");
-        result.assertProperty("jetty.port","8080"); // from 'common'
+        result.assertProperty("jetty.http.host","127.0.0.1");
+        result.assertProperty("jetty.http.port","8080"); // from 'common'
     }
 
     @Test
@@ -184,7 +186,7 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create opt
         File opt = testdir.getFile("opt");
@@ -193,13 +195,13 @@
         // Create common
         File common = new File(opt,"common");
         FS.ensureEmpty(common);
-        TestEnv.makeFile(common,"start.ini","jetty.port=8080");
+        TestEnv.makeFile(common,"start.ini","jetty.http.port=8080");
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1");
+                "jetty.http.host=127.0.0.1");
 
         String dirRef = "${my.opt}" + File.separator + "common";
 
@@ -216,8 +218,8 @@
         expectedSearchOrder.add("${jetty.home}");
         result.assertSearchOrder(expectedSearchOrder);
 
-        result.assertProperty("jetty.host","127.0.0.1");
-        result.assertProperty("jetty.port","8080"); // from 'common'
+        result.assertProperty("jetty.http.host","127.0.0.1");
+        result.assertProperty("jetty.http.port","8080"); // from 'common'
     }
 
     @Test
@@ -226,7 +228,7 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create opt
         File opt = testdir.getFile("opt");
@@ -235,13 +237,13 @@
         // Create common
         File common = new File(opt,"common");
         FS.ensureEmpty(common);
-        TestEnv.makeFile(common,"start.ini","jetty.port=8080");
+        TestEnv.makeFile(common,"start.ini","jetty.http.port=8080");
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1");
+                "jetty.http.host=127.0.0.1");
 
         String dirRef = "${my.opt}" + File.separator + "${my.dir}";
 
@@ -260,8 +262,8 @@
         expectedSearchOrder.add("${jetty.home}");
         result.assertSearchOrder(expectedSearchOrder);
 
-        result.assertProperty("jetty.host","127.0.0.1");
-        result.assertProperty("jetty.port","8080"); // from 'common'
+        result.assertProperty("jetty.http.host","127.0.0.1");
+        result.assertProperty("jetty.http.port","8080"); // from 'common'
     }
 
     @Test
@@ -270,18 +272,18 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create common
         File common = testdir.getFile("common");
         FS.ensureEmpty(common);
-        TestEnv.makeFile(common,"start.ini","jetty.port=8080");
+        TestEnv.makeFile(common,"start.ini","jetty.http.port=8080");
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1",//
+                "jetty.http.host=127.0.0.1",//
                 "--include-jetty-dir=" + common.getAbsolutePath());
 
         MainResult result = runMain(base,home);
@@ -292,8 +294,8 @@
         expectedSearchOrder.add("${jetty.home}");
         result.assertSearchOrder(expectedSearchOrder);
 
-        result.assertProperty("jetty.host","127.0.0.1");
-        result.assertProperty("jetty.port","8080"); // from 'common'
+        result.assertProperty("jetty.http.host","127.0.0.1");
+        result.assertProperty("jetty.http.port","8080"); // from 'common'
     }
 
     @Test
@@ -302,12 +304,12 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create common
         File common = testdir.getFile("common");
         FS.ensureEmpty(common);
-        TestEnv.makeFile(common,"start.ini","jetty.port=8080");
+        TestEnv.makeFile(common,"start.ini","jetty.http.port=8080");
 
         // Create corp
         File corp = testdir.getFile("corp");
@@ -317,7 +319,7 @@
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1",//
+                "jetty.http.host=127.0.0.1",//
                 "--include-jetty-dir=" + common.getAbsolutePath(), //
                 "--include-jetty-dir=" + corp.getAbsolutePath());
 
@@ -330,8 +332,8 @@
         expectedSearchOrder.add("${jetty.home}");
         result.assertSearchOrder(expectedSearchOrder);
 
-        result.assertProperty("jetty.host","127.0.0.1");
-        result.assertProperty("jetty.port","8080"); // from 'common'
+        result.assertProperty("jetty.http.host","127.0.0.1");
+        result.assertProperty("jetty.http.port","8080"); // from 'common'
     }
 
     @Test
@@ -340,25 +342,25 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create corp
         File corp = testdir.getFile("corp");
         FS.ensureEmpty(corp);
-        TestEnv.makeFile(corp,"start.ini","jetty.port=9090");
+        TestEnv.makeFile(corp,"start.ini","jetty.http.port=9090");
 
         // Create common
         File common = testdir.getFile("common");
         FS.ensureEmpty(common);
         TestEnv.makeFile(common,"start.ini", //
                 "--include-jetty-dir=" + corp.getAbsolutePath(), //
-                "jetty.port=8080");
+                "jetty.http.port=8080");
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1",//
+                "jetty.http.host=127.0.0.1",//
                 "--include-jetty-dir=" + common.getAbsolutePath());
 
         MainResult result = runMain(base,home);
@@ -370,8 +372,8 @@
         expectedSearchOrder.add("${jetty.home}");
         result.assertSearchOrder(expectedSearchOrder);
 
-        result.assertProperty("jetty.host","127.0.0.1");
-        result.assertProperty("jetty.port","8080"); // from 'common'
+        result.assertProperty("jetty.http.host","127.0.0.1");
+        result.assertProperty("jetty.http.port","8080"); // from 'common'
     }
 
     @Test
@@ -380,13 +382,13 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create corp
         File corp = testdir.getFile("corp");
         FS.ensureEmpty(corp);
         TestEnv.makeFile(corp,"start.ini", //
-                "jetty.port=9090");
+                "jetty.http.port=9090");
 
         // Create common
         File common = testdir.getFile("common");
@@ -394,13 +396,13 @@
         TestEnv.makeFile(common,"start.ini", //
                 "my.corp=" + corp.getAbsolutePath(), //
                 "--include-jetty-dir=${my.corp}", //
-                "jetty.port=8080");
+                "jetty.http.port=8080");
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1",//
+                "jetty.http.host=127.0.0.1",//
                 "my.common=" + common.getAbsolutePath(), //
                 "--include-jetty-dir=${my.common}");
 
@@ -413,8 +415,8 @@
         expectedSearchOrder.add("${jetty.home}");
         result.assertSearchOrder(expectedSearchOrder);
 
-        result.assertProperty("jetty.host","127.0.0.1");
-        result.assertProperty("jetty.port","8080"); // from 'common'
+        result.assertProperty("jetty.http.host","127.0.0.1");
+        result.assertProperty("jetty.http.port","8080"); // from 'common'
     }
 
     @Test
@@ -423,33 +425,33 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create devops
         File devops = testdir.getFile("devops");
         FS.ensureEmpty(devops);
         TestEnv.makeFile(devops,"start.ini", //
                 "--module=logging", //
-                "jetty.port=2222");
+                "jetty.http.port=2222");
 
         // Create corp
         File corp = testdir.getFile("corp");
         FS.ensureEmpty(corp);
         TestEnv.makeFile(corp,"start.ini", //
-                "jetty.port=9090");
+                "jetty.http.port=9090");
 
         // Create common
         File common = testdir.getFile("common");
         FS.ensureEmpty(common);
         TestEnv.makeFile(common,"start.ini", //
                 "--include-jetty-dir=" + corp.getAbsolutePath(), //
-                "jetty.port=8080");
+                "jetty.http.port=8080");
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1",//
+                "jetty.http.host=127.0.0.1",//
                 "--include-jetty-dir=" + common.getAbsolutePath());
 
         MainResult result = runMain(base,home,
@@ -464,8 +466,8 @@
         expectedSearchOrder.add("${jetty.home}");
         result.assertSearchOrder(expectedSearchOrder);
 
-        result.assertProperty("jetty.host","127.0.0.1");
-        result.assertProperty("jetty.port","2222"); // from 'devops'
+        result.assertProperty("jetty.http.host","127.0.0.1");
+        result.assertProperty("jetty.http.port","2222"); // from 'devops'
     }
 
     @Test
@@ -474,31 +476,31 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create corp
         File corp = testdir.getFile("corp");
         FS.ensureEmpty(corp);
         TestEnv.makeFile(corp,"start.ini", //
-                "jetty.port=9090");
+                "jetty.http.port=9090");
 
         // Create common
         File common = testdir.getFile("common");
         FS.ensureEmpty(common);
         TestEnv.makeFile(common,"start.ini", //
                 "--include-jetty-dir=" + corp.getAbsolutePath(), //
-                "jetty.port=8080");
+                "jetty.http.port=8080");
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1",//
+                "jetty.http.host=127.0.0.1",//
                 "--include-jetty-dir=" + common.getAbsolutePath());
 
         MainResult result = runMain(base,home,
         // command line property should override all others
-                "jetty.port=7070");
+                "jetty.http.port=7070");
 
         List<String> expectedSearchOrder = new ArrayList<>();
         expectedSearchOrder.add("${jetty.base}");
@@ -507,8 +509,8 @@
         expectedSearchOrder.add("${jetty.home}");
         result.assertSearchOrder(expectedSearchOrder);
 
-        result.assertProperty("jetty.host","127.0.0.1");
-        result.assertProperty("jetty.port","7070"); // from command line
+        result.assertProperty("jetty.http.host","127.0.0.1");
+        result.assertProperty("jetty.http.port","7070"); // from command line
     }
 
     @Test
@@ -517,7 +519,7 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create common
         File common = testdir.getFile("common");
@@ -528,14 +530,14 @@
         FS.ensureEmpty(corp);
         TestEnv.makeFile(corp,"start.ini",
         // standard property
-                "jetty.port=9090",
+                "jetty.http.port=9090",
                 // INTENTIONAL BAD Reference (duplicate)
                 "--include-jetty-dir=" + common.getAbsolutePath());
 
         // Populate common
         TestEnv.makeFile(common,"start.ini",
         // standard property
-                "jetty.port=8080",
+                "jetty.http.port=8080",
                 // reference to corp
                 "--include-jetty-dir=" + corp.getAbsolutePath());
 
@@ -543,7 +545,7 @@
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1",//
+                "jetty.http.host=127.0.0.1",//
                 "--include-jetty-dir=" + common.getAbsolutePath());
 
         try
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/JarVersionTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/JarVersionTest.java
index 88b1dfb..a424484 100644
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/JarVersionTest.java
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/JarVersionTest.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.start;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.containsString;
 
 import java.io.File;
 
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/LicenseTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/LicenseTest.java
deleted file mode 100644
index 5422aa1..0000000
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/LicenseTest.java
+++ /dev/null
@@ -1,181 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.start;
-
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jetty.toolchain.test.IO;
-import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
-import org.eclipse.jetty.toolchain.test.OS;
-import org.eclipse.jetty.toolchain.test.TestingDir;
-import org.junit.Rule;
-import org.junit.Test;
-
-/**
- * Test various license handling.
- */
-public class LicenseTest
-{
-    @Rule
-    public TestingDir testdir = new TestingDir();
-
-    @Rule
-    public SystemExitAsException exitrule = new SystemExitAsException();
-
-    private String assertFileExists(File basePath, String name) throws IOException
-    {
-        File file = new File(basePath, OS.separators(name));
-        FS.exists(file.toPath());
-        return IO.readToString(file);
-    }
-
-    private void execMain(List<String> cmds) throws Exception
-    {
-        int len = cmds.size();
-        String args[] = cmds.toArray(new String[len]);
-
-        System.err.printf("%n## Exec: %s%n", Main.join(cmds,", "));
-        Main main = new Main();
-        StartArgs startArgs = main.processCommandLine(args);
-        main.start(startArgs);
-    }
-
-    public List<String> getBaseCommandLine(File basePath)
-    {
-        List<String> cmds = new ArrayList<String>();
-        cmds.add("-Djava.io.tmpdir=" + MavenTestingUtils.getTargetDir().getAbsolutePath());
-        cmds.add("-Djetty.home=" + MavenTestingUtils.getTestResourceDir("dist-home").getAbsolutePath());
-        cmds.add("-Djetty.base=" + basePath.getAbsolutePath());
-        cmds.add("--testing-mode");
-
-        return cmds;
-    }
-
-    @Test
-    public void testAdd_NoLicensed() throws Exception
-    {
-        File basePath = testdir.getEmptyDir();
-
-        List<String> cmds = getBaseCommandLine(basePath);
-
-        cmds.add("--add-to-start=http,deploy");
-
-        execMain(cmds);
-    }
-
-    @Test
-    public void testAdd_CDI_Licensed() throws Exception
-    {
-        File basePath = testdir.getEmptyDir();
-
-        List<String> cmds = getBaseCommandLine(basePath);
-
-        cmds.add("-Dorg.eclipse.jetty.start.ack.license.cdi=true");
-        cmds.add("--add-to-start=cdi");
-
-        execMain(cmds);
-    }
-    
-    @Test
-    public void testAdd_SPDY_Licensed() throws Exception
-    {
-        File basePath = testdir.getEmptyDir();
-
-        List<String> cmds = getBaseCommandLine(basePath);
-
-        cmds.add("-Dorg.eclipse.jetty.start.ack.license.protonego-impl=true");
-        cmds.add("--add-to-start=spdy");
-
-        execMain(cmds);
-        
-        String contents = assertFileExists(basePath, "start.ini");
-        assertThat("Contents",contents,containsString("--module=spdy"+System.lineSeparator()));
-    }
-    
-    @Test
-    public void testAdd_HttpSpdy_Then_Deploy() throws Exception
-    {
-        File basePath = testdir.getEmptyDir();
-
-        List<String> cmds = getBaseCommandLine(basePath);
-
-        cmds.add("-Dorg.eclipse.jetty.start.ack.license.protonego-impl=true");
-        cmds.add("--add-to-start=http,spdy");
-
-        execMain(cmds);
-        
-        String contents = assertFileExists(basePath, "start.ini");
-        assertThat("Contents",contents,containsString("--module=http"+System.lineSeparator()));
-        assertThat("Contents",contents,containsString("--module=spdy"+System.lineSeparator()));
-        
-        // now request deploy (no license check should occur)
-        List<String> cmds2 = getBaseCommandLine(basePath);
-        cmds2.add("--add-to-start=deploy");
-        execMain(cmds2);
-
-        contents = assertFileExists(basePath, "start.ini");
-        assertThat("Contents",contents,containsString("--module=deploy"+System.lineSeparator()));
-        assertThat("Contents",contents,containsString("--module=spdy"+System.lineSeparator()));
-    }
-    
-    @Test
-    public void testCreate_SPDY_Licensed() throws Exception
-    {
-        File basePath = testdir.getEmptyDir();
-
-        List<String> cmds = getBaseCommandLine(basePath);
-
-        cmds.add("-Dorg.eclipse.jetty.start.ack.license.protonego-impl=true");
-        
-        StringReader startIni = new StringReader("--module=spdy\n");
-        try (FileWriter writer = new FileWriter(new File(basePath,"start.ini")))
-        {
-            IO.copy(startIni,writer);
-        }
-
-        execMain(cmds);
-    }
-
-    @Test
-    public void testCreate_CDI_Licensed() throws Exception
-    {
-        File basePath = testdir.getEmptyDir();
-
-        List<String> cmds = getBaseCommandLine(basePath);
-
-        cmds.add("-Dorg.eclipse.jetty.start.ack.license.cdi=true");
-        cmds.add("--create-files");
-
-        StringReader startIni = new StringReader("--module=cdi\n");
-        try (FileWriter writer = new FileWriter(new File(basePath,"start.ini")))
-        {
-            IO.copy(startIni,writer);
-        }
-
-        execMain(cmds);
-    }
-}
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/LicensingTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/LicensingTest.java
new file mode 100644
index 0000000..1bdcb25
--- /dev/null
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/LicensingTest.java
@@ -0,0 +1,181 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.Assert.assertThat;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jetty.toolchain.test.IO;
+import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+import org.eclipse.jetty.toolchain.test.OS;
+import org.eclipse.jetty.toolchain.test.TestingDir;
+import org.junit.Rule;
+import org.junit.Test;
+
+/**
+ * Test various license handling.
+ */
+public class LicensingTest
+{
+    @Rule
+    public TestingDir testdir = new TestingDir();
+
+    @Rule
+    public SystemExitAsException exitrule = new SystemExitAsException();
+
+    private String assertFileExists(File basePath, String name) throws IOException
+    {
+        File file = new File(basePath, OS.separators(name));
+        FS.exists(file.toPath());
+        return IO.readToString(file);
+    }
+
+    private void execMain(List<String> cmds) throws Exception
+    {
+        int len = cmds.size();
+        String args[] = cmds.toArray(new String[len]);
+
+        System.err.printf("%n## Exec: %s%n", Utils.join(cmds,", "));
+        Main main = new Main();
+        StartArgs startArgs = main.processCommandLine(args);
+        main.start(startArgs);
+    }
+
+    public List<String> getBaseCommandLine(File basePath)
+    {
+        List<String> cmds = new ArrayList<String>();
+        cmds.add("-Djava.io.tmpdir=" + MavenTestingUtils.getTargetDir().getAbsolutePath());
+        cmds.add("-Djetty.home=" + MavenTestingUtils.getTestResourceDir("dist-home").getAbsolutePath());
+        cmds.add("-Djetty.base=" + basePath.getAbsolutePath());
+        cmds.add("--testing-mode");
+
+        return cmds;
+    }
+
+    @Test
+    public void testAdd_NoLicensed() throws Exception
+    {
+        File basePath = testdir.getEmptyDir();
+
+        List<String> cmds = getBaseCommandLine(basePath);
+
+        cmds.add("--add-to-start=http,deploy");
+
+        execMain(cmds);
+    }
+
+    @Test
+    public void testAdd_CDI_Licensed() throws Exception
+    {
+        File basePath = testdir.getEmptyDir();
+
+        List<String> cmds = getBaseCommandLine(basePath);
+
+        cmds.add("-Dorg.eclipse.jetty.start.ack.licenses=true");
+        cmds.add("--add-to-start=cdi");
+
+        execMain(cmds);
+    }
+    
+    @Test
+    public void testAdd_HTTP2_Licensed() throws Exception
+    {
+        File basePath = testdir.getEmptyDir();
+
+        List<String> cmds = getBaseCommandLine(basePath);
+
+        cmds.add("-Dorg.eclipse.jetty.start.ack.licenses=true");
+        cmds.add("--add-to-start=http2");
+
+        execMain(cmds);
+        
+        String contents = assertFileExists(basePath, "start.ini");
+        assertThat("Contents",contents,containsString("--module=http2"+System.lineSeparator()));
+    }
+    
+    @Test
+    public void testAdd_Http_Http2_Then_Deploy() throws Exception
+    {
+        File basePath = testdir.getEmptyDir();
+
+        List<String> cmds = getBaseCommandLine(basePath);
+
+        cmds.add("-Dorg.eclipse.jetty.start.ack.license.protonego-impl=true");
+        cmds.add("--add-to-start=http,http2");
+
+        execMain(cmds);
+        
+        String contents = assertFileExists(basePath, "start.ini");
+        assertThat("Contents",contents,containsString("--module=http"+System.lineSeparator()));
+        assertThat("Contents",contents,containsString("--module=http2"+System.lineSeparator()));
+        
+        // now request deploy (no license check should occur)
+        List<String> cmds2 = getBaseCommandLine(basePath);
+        cmds2.add("--add-to-start=deploy");
+        execMain(cmds2);
+
+        contents = assertFileExists(basePath, "start.ini");
+        assertThat("Contents",contents,containsString("--module=deploy"+System.lineSeparator()));
+    }
+    
+    @Test
+    public void testCreate_HTTP2_Licensed() throws Exception
+    {
+        File basePath = testdir.getEmptyDir();
+
+        List<String> cmds = getBaseCommandLine(basePath);
+
+        cmds.add("-Dorg.eclipse.jetty.start.ack.licenses=true");
+        cmds.add("--dry-run");
+        
+        StringReader startIni = new StringReader("--module=http2\n");
+        try (FileWriter writer = new FileWriter(new File(basePath,"start.ini")))
+        {
+            IO.copy(startIni,writer);
+        }
+
+        execMain(cmds);
+    }
+
+    @Test
+    public void testCreate_CDI_Licensed() throws Exception
+    {
+        File basePath = testdir.getEmptyDir();
+
+        List<String> cmds = getBaseCommandLine(basePath);
+
+        cmds.add("-Dorg.eclipse.jetty.start.ack.licenses=true");
+        cmds.add("--create-files");
+
+        StringReader startIni = new StringReader("--module=cdi\n");
+        try (FileWriter writer = new FileWriter(new File(basePath,"start.ini")))
+        {
+            IO.copy(startIni,writer);
+        }
+
+        execMain(cmds);
+    }
+}
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/MainTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/MainTest.java
index 8de153f..450384e 100644
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/MainTest.java
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/MainTest.java
@@ -50,10 +50,10 @@
     public void testBasicProcessing() throws Exception
     {
         List<String> cmdLineArgs = new ArrayList<>();
-        File testJettyHome = MavenTestingUtils.getTestResourceDir("usecases/home").getAbsoluteFile();
+        Path testJettyHome = MavenTestingUtils.getTestResourceDir("dist-home").toPath().toRealPath();
         cmdLineArgs.add("user.dir=" + testJettyHome);
         cmdLineArgs.add("jetty.home=" + testJettyHome);
-        cmdLineArgs.add("jetty.port=9090");
+        // cmdLineArgs.add("jetty.http.port=9090");
 
         Main main = new Main();
         StartArgs args = main.processCommandLine(cmdLineArgs.toArray(new String[cmdLineArgs.size()]));
@@ -83,13 +83,13 @@
     }
 
     @Test
-    @Ignore("Just a bit noisy for general testing")
+    @Ignore("Too noisy for general testing")
     public void testListConfig() throws Exception
     {
         List<String> cmdLineArgs = new ArrayList<>();
-        File testJettyHome = MavenTestingUtils.getTestResourceDir("usecases/home");
+        File testJettyHome = MavenTestingUtils.getTestResourceDir("dist-home");
+        cmdLineArgs.add("user.dir=" + testJettyHome);
         cmdLineArgs.add("jetty.home=" + testJettyHome);
-        cmdLineArgs.add("jetty.port=9090");
         cmdLineArgs.add("--list-config");
         // cmdLineArgs.add("--debug");
 
@@ -111,9 +111,9 @@
     {
         List<String> cmdLineArgs = new ArrayList<>();
 
-        File homePath = MavenTestingUtils.getTestResourceDir("usecases/home").getAbsoluteFile();
-        cmdLineArgs.add("jetty.home=" + homePath);
-        cmdLineArgs.add("user.dir=" + homePath);
+        Path homePath = MavenTestingUtils.getTestResourceDir("dist-home").toPath().toRealPath();
+        cmdLineArgs.add("jetty.home=" + homePath.toString());
+        cmdLineArgs.add("user.dir=" + homePath.toString());
 
         // JVM args
         cmdLineArgs.add("--exec");
@@ -121,11 +121,8 @@
         cmdLineArgs.add("-Xmx1024m");
 
         // Arbitrary Libs
-        Path extraJar = MavenTestingUtils.getTestResourceFile("extra-libs/example.jar").toPath().normalize();
-        Path extraDir = MavenTestingUtils.getTestResourceDir("extra-resources").toPath().normalize();
-        
-        extraJar = extraJar.toAbsolutePath();
-        extraDir = extraDir.toAbsolutePath();
+        Path extraJar = MavenTestingUtils.getTestResourceFile("extra-libs/example.jar").toPath().toRealPath();
+        Path extraDir = MavenTestingUtils.getTestResourceDir("extra-resources").toPath().toRealPath();
         
         assertThat("Extra Jar exists: " + extraJar,Files.exists(extraJar),is(true));
         assertThat("Extra Dir exists: " + extraDir,Files.exists(extraDir),is(true));
@@ -148,36 +145,35 @@
         StartArgs args = main.processCommandLine(cmdLineArgs.toArray(new String[cmdLineArgs.size()]));
         BaseHome baseHome = main.getBaseHome();
 
-        assertThat("jetty.home",baseHome.getHome(),is(homePath.getAbsolutePath()));
-        assertThat("jetty.base",baseHome.getBase(),is(homePath.getAbsolutePath()));
+        assertThat("jetty.home",baseHome.getHome(),is(homePath.toString()));
+        assertThat("jetty.base",baseHome.getBase(),is(homePath.toString()));
 
         ConfigurationAssert.assertConfiguration(baseHome,args,"assert-home-with-jvm.txt");
     }
     
     @Test
-    public void testWithSpdy() throws Exception
+    public void testWithHttp2() throws Exception
     {
         List<String> cmdLineArgs = new ArrayList<>();
 
-        File homePath = MavenTestingUtils.getTestResourceDir("usecases/home").getAbsoluteFile();
+        Path homePath = MavenTestingUtils.getTestResourceDir("dist-home").toPath().toRealPath();
         cmdLineArgs.add("jetty.home=" + homePath);
         cmdLineArgs.add("user.dir=" + homePath);
-        cmdLineArgs.add("java.version=1.7.0_60");
+        cmdLineArgs.add("java.version=1.8.0_31");
 
         // Modules
-        cmdLineArgs.add("--module=server");
         cmdLineArgs.add("--module=deploy");
-        cmdLineArgs.add("--module=spdy");
+        cmdLineArgs.add("--module=http2");
 
         Main main = new Main();
 
         StartArgs args = main.processCommandLine(cmdLineArgs.toArray(new String[cmdLineArgs.size()]));
         BaseHome baseHome = main.getBaseHome();
 
-        assertThat("jetty.home",baseHome.getHome(),is(homePath.getAbsolutePath()));
-        assertThat("jetty.base",baseHome.getBase(),is(homePath.getAbsolutePath()));
+        assertThat("jetty.home",baseHome.getHome(),is(homePath.toString()));
+        assertThat("jetty.base",baseHome.getBase(),is(homePath.toString()));
 
-        ConfigurationAssert.assertConfiguration(baseHome,args,"assert-home-with-spdy.txt");
+        ConfigurationAssert.assertConfiguration(baseHome,args,"assert-home-with-http2.txt");
     }
 
     @Test
@@ -185,7 +181,7 @@
     {
         List<String> cmdLineArgs = new ArrayList<>();
 
-        File homePath = MavenTestingUtils.getTestResourceDir("jetty home with spaces").getAbsoluteFile();
+        Path homePath = MavenTestingUtils.getTestResourceDir("jetty home with spaces").toPath().toRealPath();
         cmdLineArgs.add("user.dir=" + homePath);
         cmdLineArgs.add("jetty.home=" + homePath);
 
@@ -193,8 +189,8 @@
         StartArgs args = main.processCommandLine(cmdLineArgs.toArray(new String[cmdLineArgs.size()]));
         BaseHome baseHome = main.getBaseHome();
 
-        assertThat("jetty.home",baseHome.getHome(),is(homePath.getAbsolutePath()));
-        assertThat("jetty.base",baseHome.getBase(),is(homePath.getAbsolutePath()));
+        assertThat("jetty.home",baseHome.getHome(),is(homePath.toString()));
+        assertThat("jetty.base",baseHome.getBase(),is(homePath.toString()));
 
         ConfigurationAssert.assertConfiguration(baseHome,args,"assert-home-with-spaces.txt");
     }
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/ModuleGraphWriterTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/ModuleGraphWriterTest.java
index 4e82d0d..dad2554 100644
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/ModuleGraphWriterTest.java
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/ModuleGraphWriterTest.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.start;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.is;
 
 import java.io.File;
 import java.io.IOException;
@@ -43,7 +43,7 @@
     public void testGenerate_NothingEnabled() throws IOException
     {
         // Test Env
-        File homeDir = MavenTestingUtils.getTestResourceDir("usecases/home");
+        File homeDir = MavenTestingUtils.getTestResourceDir("dist-home");
         File baseDir = testdir.getEmptyDir();
         String cmdLine[] = new String[] {"jetty.version=TEST"};
         
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/ModuleTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/ModuleTest.java
index 65dc94b..2ecd03a 100644
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/ModuleTest.java
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/ModuleTest.java
@@ -18,7 +18,9 @@
 
 package org.eclipse.jetty.start;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.containsInAnyOrder;
+import static org.hamcrest.Matchers.is;
 
 import java.io.File;
 import java.io.IOException;
@@ -42,7 +44,7 @@
     public void testLoadWebSocket() throws IOException
     {
         // Test Env
-        File homeDir = MavenTestingUtils.getTestResourceDir("usecases/home");
+        File homeDir = MavenTestingUtils.getTestResourceDir("dist-home");
         File baseDir = testdir.getEmptyDir();
         String cmdLine[] = new String[] {"jetty.version=TEST"};
         
@@ -56,14 +58,13 @@
         // Initialize
         BaseHome basehome = new BaseHome(config);
         
-        File file = MavenTestingUtils.getTestResourceFile("usecases/home/modules/websocket.mod");
+        File file = MavenTestingUtils.getTestResourceFile("dist-home/modules/websocket.mod");
         Module module = new Module(basehome,file.toPath());
         
         Assert.assertThat("Module Name",module.getName(),is("websocket"));
-        Assert.assertThat("Module Parents Size",module.getParentNames().size(),is(2));
-        Assert.assertThat("Module Parents",module.getParentNames(),containsInAnyOrder("annotations","server"));
-        Assert.assertThat("Module Xmls Size",module.getXmls().size(),is(1));
-        Assert.assertThat("Module Xmls",module.getXmls(),contains("etc/jetty-websockets.xml"));
+        Assert.assertThat("Module Parents Size",module.getParentNames().size(),is(1));
+        Assert.assertThat("Module Parents",module.getParentNames(),containsInAnyOrder("annotations"));
+        Assert.assertThat("Module Xmls Size",module.getXmls().size(),is(0));
         Assert.assertThat("Module Options Size",module.getLibs().size(),is(1));
         Assert.assertThat("Module Options",module.getLibs(),contains("lib/websocket/*.jar"));
     }
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/ModulesTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/ModulesTest.java
index 5256f07..ceea461 100644
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/ModulesTest.java
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/ModulesTest.java
@@ -18,27 +18,32 @@
 
 package org.eclipse.jetty.start;
 
-import static org.hamcrest.Matchers.contains;
-
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 import org.eclipse.jetty.start.config.CommandLineConfigSource;
 import org.eclipse.jetty.start.config.ConfigSources;
 import org.eclipse.jetty.start.config.JettyBaseConfigSource;
 import org.eclipse.jetty.start.config.JettyHomeConfigSource;
+import org.eclipse.jetty.start.graph.CriteriaSetPredicate;
+import org.eclipse.jetty.start.graph.Predicate;
+import org.eclipse.jetty.start.graph.RegexNamePredicate;
+import org.eclipse.jetty.start.graph.Selection;
 import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
 import org.eclipse.jetty.toolchain.test.TestingDir;
-import org.junit.Assert;
+import org.hamcrest.Matchers;
 import org.junit.Rule;
 import org.junit.Test;
 
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.assertThat;
+
 public class ModulesTest
 {
-    private final static List<String> TEST_SOURCE = Collections.singletonList("<test>");
+    private final static String TEST_SOURCE = "<test>";
 
     @Rule
     public TestingDir testdir = new TestingDir();
@@ -47,20 +52,126 @@
     public void testLoadAllModules() throws IOException
     {
         // Test Env
-        File homeDir = MavenTestingUtils.getTestResourceDir("usecases/home");
-        File baseDir = testdir.getEmptyDir();
-        String cmdLine[] = new String[] {"jetty.version=TEST"};
-        
+        File homeDir = MavenTestingUtils.getTestResourceDir("dist-home");
+        File baseDir = testdir.getEmptyPathDir().toFile();
+        String cmdLine[] = new String[] { "jetty.version=TEST" };
+
         // Configuration
         CommandLineConfigSource cmdLineSource = new CommandLineConfigSource(cmdLine);
         ConfigSources config = new ConfigSources();
         config.add(cmdLineSource);
         config.add(new JettyHomeConfigSource(homeDir.toPath()));
         config.add(new JettyBaseConfigSource(baseDir.toPath()));
-        
+
         // Initialize
         BaseHome basehome = new BaseHome(config);
-        
+
+        StartArgs args = new StartArgs();
+        args.parse(config);
+
+        // Test Modules
+        Modules modules = new Modules(basehome,args);
+        modules.registerAll();
+
+        // Check versions
+        assertThat("java.version.major", args.getProperties().getString("java.version.major"),equalTo("1"));
+        assertThat("java.version.minor", args.getProperties().getString("java.version.minor"),anyOf(equalTo("7"),Matchers.equalTo("8"),Matchers.equalTo("9")));
+
+        List<String> moduleNames = new ArrayList<>();
+        for (Module mod : modules)
+        {
+            // skip alpn-boot in this test (as its behavior is jdk specific)
+            if (mod.getName().equals("alpn-boot"))
+            {
+                continue;
+            }
+            moduleNames.add(mod.getName());
+        }
+
+        List<String> expected = new ArrayList<>();
+        expected.add("alpn");
+        expected.add("annotations");
+        expected.add("apache-jsp");
+        expected.add("apache-jstl");
+        expected.add("cdi");
+        expected.add("client");
+        expected.add("continuation");
+        expected.add("debuglog");
+        expected.add("deploy");
+        expected.add("ext");
+        expected.add("fcgi");
+        expected.add("gzip");
+        expected.add("hawtio");
+        expected.add("home-base-warning");
+        expected.add("http");
+        expected.add("http2");
+        expected.add("http2c");
+        expected.add("https");
+        expected.add("ipaccess");
+        expected.add("jaas");
+        expected.add("jamon");
+        expected.add("jaspi");
+        expected.add("jminix");
+        expected.add("jmx");
+        expected.add("jmx-remote");
+        expected.add("jndi");
+        expected.add("jolokia");
+        expected.add("jsp");
+        expected.add("jstl");
+        expected.add("jvm");
+        expected.add("logging");
+        expected.add("lowresources");
+        expected.add("monitor");
+        expected.add("plus");
+        expected.add("proxy");
+        expected.add("quickstart");
+        expected.add("requestlog");
+        expected.add("resources");
+        expected.add("rewrite");
+        expected.add("security");
+        expected.add("server");
+        expected.add("servlet");
+        expected.add("servlets");
+        expected.add("setuid");
+        expected.add("spring");
+        expected.add("ssl");
+        expected.add("stats");
+        expected.add("webapp");
+        expected.add("websocket");
+        expected.add("infinispan");
+        expected.add("jdbc-sessions");
+        expected.add("nosql");
+
+        ConfigurationAssert.assertContainsUnordered("All Modules",expected,moduleNames);
+    }
+
+    /**
+     * Test loading of only shallow modules, not deep references.
+     * In other words. ${search-dir}/modules/*.mod should be the only
+     * valid references, but ${search-dir}/alt/foo/modules/*.mod should
+     * not be considered valid.
+     * @throws IOException on test failures
+     */
+    @Test
+    public void testLoadShallowModulesOnly() throws IOException
+    {
+        // Test Env
+        File homeDir = MavenTestingUtils.getTestResourceDir("jetty home with spaces");
+        // intentionally setup top level resources dir (as this would have many
+        // deep references)
+        File baseDir = MavenTestingUtils.getTestResourcesDir();
+        String cmdLine[] = new String[] { "jetty.version=TEST" };
+
+        // Configuration
+        CommandLineConfigSource cmdLineSource = new CommandLineConfigSource(cmdLine);
+        ConfigSources config = new ConfigSources();
+        config.add(cmdLineSource);
+        config.add(new JettyHomeConfigSource(homeDir.toPath()));
+        config.add(new JettyBaseConfigSource(baseDir.toPath()));
+
+        // Initialize
+        BaseHome basehome = new BaseHome(config);
+
         StartArgs args = new StartArgs();
         args.parse(config);
 
@@ -71,49 +182,12 @@
         List<String> moduleNames = new ArrayList<>();
         for (Module mod : modules)
         {
-            // skip npn-boot in this test (as its behavior is jdk specific)
-            if (mod.getName().equals("npn-boot"))
-            {
-                continue;
-            }
             moduleNames.add(mod.getName());
         }
 
         List<String> expected = new ArrayList<>();
-        expected.add("jmx");
-        expected.add("client");
-        expected.add("stats");
-        expected.add("spdy");
-        expected.add("deploy");
-        expected.add("debug");
-        expected.add("security");
-        expected.add("ext");
-        expected.add("websocket");
-        expected.add("rewrite");
-        expected.add("ipaccess");
-        expected.add("xinetd");
-        expected.add("proxy");
-        expected.add("webapp");
-        expected.add("jndi");
-        expected.add("lowresources");
-        expected.add("https");
-        expected.add("plus");
-        expected.add("requestlog");
-        expected.add("jsp");
-        // (only present if enabled) expected.add("jsp-impl");
-        expected.add("monitor");
-        expected.add("xml");
-        expected.add("ssl");
-        expected.add("protonego");
-        expected.add("servlet");
-        expected.add("jaas");
-        expected.add("http");
         expected.add("base");
-        expected.add("server");
-        expected.add("annotations");
-        expected.add("resources");
-        expected.add("logging"); 
-        
+
         ConfigurationAssert.assertContainsUnordered("All Modules",expected,moduleNames);
     }
 
@@ -121,50 +195,61 @@
     public void testEnableRegexSimple() throws IOException
     {
         // Test Env
-        File homeDir = MavenTestingUtils.getTestResourceDir("usecases/home");
-        File baseDir = testdir.getEmptyDir();
-        String cmdLine[] = new String[] {"jetty.version=TEST", "java.version=1.7.0_60"};
-        
+        File homeDir = MavenTestingUtils.getTestResourceDir("dist-home");
+        File baseDir = testdir.getEmptyPathDir().toFile();
+        String cmdLine[] = new String[] { "jetty.version=TEST", "java.version=1.8.0_31" };
+
         // Configuration
         CommandLineConfigSource cmdLineSource = new CommandLineConfigSource(cmdLine);
         ConfigSources config = new ConfigSources();
         config.add(cmdLineSource);
         config.add(new JettyHomeConfigSource(homeDir.toPath()));
         config.add(new JettyBaseConfigSource(baseDir.toPath()));
-        
+
         // Initialize
         BaseHome basehome = new BaseHome(config);
-        
+
         StartArgs args = new StartArgs();
         args.parse(config);
 
         // Test Modules
         Modules modules = new Modules(basehome,args);
         modules.registerAll();
-        modules.enable("[sj]{1}.*",TEST_SOURCE);
+        Predicate sjPredicate = new RegexNamePredicate("[sj]{1}.*");
+        modules.selectNode(sjPredicate,new Selection(TEST_SOURCE));
         modules.buildGraph();
 
         List<String> expected = new ArrayList<>();
         expected.add("jmx");
         expected.add("stats");
-        expected.add("spdy");
         expected.add("security");
         expected.add("jndi");
         expected.add("jsp");
         expected.add("servlet");
+        expected.add("servlets");
         expected.add("jaas");
         expected.add("server");
+        expected.add("setuid");
+        expected.add("spring");
+        expected.add("jaspi");
+        expected.add("jminix");
+        expected.add("jolokia");
+        expected.add("jamon");
+        expected.add("jstl");
+        expected.add("jmx-remote");
+        expected.add("jvm");
         // transitive
-        expected.add("base");
         expected.add("ssl");
-        expected.add("protonego");
-        expected.add("protonego-boot");
-        expected.add("protonego-impl");
-        expected.add("xml");
-        expected.add("jsp-impl");
-        
+        expected.add("apache-jsp");
+        expected.add("apache-jstl");
+        expected.add("webapp");
+        expected.add("deploy");
+        expected.add("plus");
+        expected.add("annotations");
+        expected.add("jdbc-sessions");
+
         List<String> resolved = new ArrayList<>();
-        for (Module module : modules.resolveEnabled())
+        for (Module module : modules.getSelected())
         {
             resolved.add(module.getName());
         }
@@ -176,40 +261,38 @@
     public void testResolve_ServerHttp() throws IOException
     {
         // Test Env
-        File homeDir = MavenTestingUtils.getTestResourceDir("usecases/home");
-        File baseDir = testdir.getEmptyDir();
-        String cmdLine[] = new String[] {"jetty.version=TEST"};
-        
+        File homeDir = MavenTestingUtils.getTestResourceDir("dist-home");
+        File baseDir = testdir.getEmptyPathDir().toFile();
+        String cmdLine[] = new String[] { "jetty.version=TEST" };
+
         // Configuration
         CommandLineConfigSource cmdLineSource = new CommandLineConfigSource(cmdLine);
         ConfigSources config = new ConfigSources();
         config.add(cmdLineSource);
         config.add(new JettyHomeConfigSource(homeDir.toPath()));
         config.add(new JettyBaseConfigSource(baseDir.toPath()));
-        
+
         // Initialize
         BaseHome basehome = new BaseHome(config);
-        
+
         StartArgs args = new StartArgs();
         args.parse(config);
 
         // Test Modules
-        Modules modules = new Modules(basehome, args);
+        Modules modules = new Modules(basehome,args);
         modules.registerAll();
 
         // Enable 2 modules
-        modules.enable("server",TEST_SOURCE);
-        modules.enable("http",TEST_SOURCE);
+        modules.selectNode("server",new Selection(TEST_SOURCE));
+        modules.selectNode("http",new Selection(TEST_SOURCE));
 
         modules.buildGraph();
 
         // Collect active module list
-        List<Module> active = modules.resolveEnabled();
+        List<Module> active = modules.getSelected();
 
         // Assert names are correct, and in the right order
         List<String> expectedNames = new ArrayList<>();
-        expectedNames.add("base");
-        expectedNames.add("xml");
         expectedNames.add("server");
         expectedNames.add("http");
 
@@ -219,21 +302,20 @@
             actualNames.add(actual.getName());
         }
 
-        Assert.assertThat("Resolved Names: " + actualNames,actualNames,contains(expectedNames.toArray()));
+        assertThat("Resolved Names: " + actualNames,actualNames,contains(expectedNames.toArray()));
 
         // Assert Library List
         List<String> expectedLibs = new ArrayList<>();
-        expectedLibs.add("lib/jetty-util-${jetty.version}.jar");
-        expectedLibs.add("lib/jetty-io-${jetty.version}.jar");
-        expectedLibs.add("lib/jetty-xml-${jetty.version}.jar");
         expectedLibs.add("lib/servlet-api-3.1.jar");
         expectedLibs.add("lib/jetty-schemas-3.1.jar");
         expectedLibs.add("lib/jetty-http-${jetty.version}.jar");
-        expectedLibs.add("lib/jetty-continuation-${jetty.version}.jar");
         expectedLibs.add("lib/jetty-server-${jetty.version}.jar");
+        expectedLibs.add("lib/jetty-xml-${jetty.version}.jar");
+        expectedLibs.add("lib/jetty-util-${jetty.version}.jar");
+        expectedLibs.add("lib/jetty-io-${jetty.version}.jar");
 
         List<String> actualLibs = modules.normalizeLibs(active);
-        Assert.assertThat("Resolved Libs: " + actualLibs,actualLibs,contains(expectedLibs.toArray()));
+        assertThat("Resolved Libs: " + actualLibs,actualLibs,contains(expectedLibs.toArray()));
 
         // Assert XML List
         List<String> expectedXmls = new ArrayList<>();
@@ -241,27 +323,27 @@
         expectedXmls.add("etc/jetty-http.xml");
 
         List<String> actualXmls = modules.normalizeXmls(active);
-        Assert.assertThat("Resolved XMLs: " + actualXmls,actualXmls,contains(expectedXmls.toArray()));
+        assertThat("Resolved XMLs: " + actualXmls,actualXmls,contains(expectedXmls.toArray()));
     }
 
     @Test
     public void testResolve_WebSocket() throws IOException
     {
         // Test Env
-        File homeDir = MavenTestingUtils.getTestResourceDir("usecases/home");
-        File baseDir = testdir.getEmptyDir();
-        String cmdLine[] = new String[] {"jetty.version=TEST"};
-        
+        File homeDir = MavenTestingUtils.getTestResourceDir("dist-home");
+        File baseDir = testdir.getEmptyPathDir().toFile();
+        String cmdLine[] = new String[] { "jetty.version=TEST" };
+
         // Configuration
         CommandLineConfigSource cmdLineSource = new CommandLineConfigSource(cmdLine);
         ConfigSources config = new ConfigSources();
         config.add(cmdLineSource);
         config.add(new JettyHomeConfigSource(homeDir.toPath()));
         config.add(new JettyBaseConfigSource(baseDir.toPath()));
-        
+
         // Initialize
         BaseHome basehome = new BaseHome(config);
-        
+
         StartArgs args = new StartArgs();
         args.parse(config);
 
@@ -270,23 +352,23 @@
         modules.registerAll();
 
         // Enable 2 modules
-        modules.enable("websocket",TEST_SOURCE);
-        modules.enable("http",TEST_SOURCE);
+        modules.selectNode("websocket",new Selection(TEST_SOURCE));
+        modules.selectNode("http",new Selection(TEST_SOURCE));
 
         modules.buildGraph();
         // modules.dump();
 
         // Collect active module list
-        List<Module> active = modules.resolveEnabled();
+        List<Module> active = modules.getSelected();
 
         // Assert names are correct, and in the right order
         List<String> expectedNames = new ArrayList<>();
-        expectedNames.add("base");
-        expectedNames.add("xml");
         expectedNames.add("server");
         expectedNames.add("http");
         expectedNames.add("jndi");
         expectedNames.add("security");
+        expectedNames.add("servlet");
+        expectedNames.add("webapp");
         expectedNames.add("plus");
         expectedNames.add("annotations");
         expectedNames.add("websocket");
@@ -297,28 +379,29 @@
             actualNames.add(actual.getName());
         }
 
-        Assert.assertThat("Resolved Names: " + actualNames,actualNames,contains(expectedNames.toArray()));
+        assertThat("Resolved Names: " + actualNames,actualNames,contains(expectedNames.toArray()));
 
         // Assert Library List
         List<String> expectedLibs = new ArrayList<>();
-        expectedLibs.add("lib/jetty-util-${jetty.version}.jar");
-        expectedLibs.add("lib/jetty-io-${jetty.version}.jar");
-        expectedLibs.add("lib/jetty-xml-${jetty.version}.jar");
         expectedLibs.add("lib/servlet-api-3.1.jar");
         expectedLibs.add("lib/jetty-schemas-3.1.jar");
         expectedLibs.add("lib/jetty-http-${jetty.version}.jar");
-        expectedLibs.add("lib/jetty-continuation-${jetty.version}.jar");
         expectedLibs.add("lib/jetty-server-${jetty.version}.jar");
+        expectedLibs.add("lib/jetty-xml-${jetty.version}.jar");
+        expectedLibs.add("lib/jetty-util-${jetty.version}.jar");
+        expectedLibs.add("lib/jetty-io-${jetty.version}.jar");
         expectedLibs.add("lib/jetty-jndi-${jetty.version}.jar");
         expectedLibs.add("lib/jndi/*.jar");
         expectedLibs.add("lib/jetty-security-${jetty.version}.jar");
+        expectedLibs.add("lib/jetty-servlet-${jetty.version}.jar");
+        expectedLibs.add("lib/jetty-webapp-${jetty.version}.jar");
         expectedLibs.add("lib/jetty-plus-${jetty.version}.jar");
         expectedLibs.add("lib/jetty-annotations-${jetty.version}.jar");
         expectedLibs.add("lib/annotations/*.jar");
         expectedLibs.add("lib/websocket/*.jar");
 
         List<String> actualLibs = modules.normalizeLibs(active);
-        Assert.assertThat("Resolved Libs: " + actualLibs,actualLibs,contains(expectedLibs.toArray()));
+        assertThat("Resolved Libs: " + actualLibs,actualLibs,contains(expectedLibs.toArray()));
 
         // Assert XML List
         List<String> expectedXmls = new ArrayList<>();
@@ -326,9 +409,98 @@
         expectedXmls.add("etc/jetty-http.xml");
         expectedXmls.add("etc/jetty-plus.xml");
         expectedXmls.add("etc/jetty-annotations.xml");
-        expectedXmls.add("etc/jetty-websockets.xml");
 
         List<String> actualXmls = modules.normalizeXmls(active);
-        Assert.assertThat("Resolved XMLs: " + actualXmls,actualXmls,contains(expectedXmls.toArray()));
+        assertThat("Resolved XMLs: " + actualXmls,actualXmls,contains(expectedXmls.toArray()));
+    }
+
+    @Test
+    public void testResolve_Alt() throws IOException
+    {
+        // Test Env
+        File homeDir = MavenTestingUtils.getTestResourceDir("dist-home");
+        File baseDir = testdir.getEmptyPathDir().toFile();
+        String cmdLine[] = new String[] { "jetty.version=TEST" };
+
+        // Configuration
+        CommandLineConfigSource cmdLineSource = new CommandLineConfigSource(cmdLine);
+        ConfigSources config = new ConfigSources();
+        config.add(cmdLineSource);
+        config.add(new JettyHomeConfigSource(homeDir.toPath()));
+        config.add(new JettyBaseConfigSource(baseDir.toPath()));
+
+        // Initialize
+        BaseHome basehome = new BaseHome(config);
+
+        StartArgs args = new StartArgs();
+        args.parse(config);
+
+        // Test Modules
+        Modules modules = new Modules(basehome,args);
+        modules.registerAll();
+
+        // Enable test modules
+        modules.selectNode("http",new Selection(TEST_SOURCE));
+        modules.selectNode("annotations",new Selection(TEST_SOURCE));
+        modules.selectNode("deploy",new Selection(TEST_SOURCE));
+        // Enable alternate modules
+        String alt = "<alt>";
+        modules.selectNode("websocket",new Selection(alt));
+        modules.selectNode("jsp",new Selection(alt));
+
+        modules.buildGraph();
+        // modules.dump();
+
+        // Collect active module list
+        List<Module> active = modules.getSelected();
+
+        // Assert names are correct, and in the right order
+        List<String> expectedNames = new ArrayList<>();
+        expectedNames.add("apache-jsp");
+        expectedNames.add("server");
+        expectedNames.add("http");
+        expectedNames.add("jndi");
+        expectedNames.add("security");
+        expectedNames.add("servlet");
+        expectedNames.add("webapp");
+        expectedNames.add("deploy");
+        expectedNames.add("plus");
+        expectedNames.add("annotations");
+        expectedNames.add("jsp");
+        expectedNames.add("websocket");
+
+        List<String> actualNames = new ArrayList<>();
+        for (Module actual : active)
+        {
+            actualNames.add(actual.getName());
+        }
+
+        assertThat("Resolved Names: " + actualNames,actualNames,contains(expectedNames.toArray()));
+
+        // Now work with the 'alt' selected
+        List<String> expectedAlts = new ArrayList<>();
+        expectedAlts.add("apache-jsp");
+        expectedAlts.add("jsp");
+        expectedAlts.add("websocket");
+
+        for (String expectedAlt : expectedAlts)
+        {
+            Module altMod = modules.get(expectedAlt);
+            assertThat("Alt.mod[" + expectedAlt + "].selected",altMod.isSelected(),is(true));
+            Set<String> sources = altMod.getSelectedCriteriaSet();
+            assertThat("Alt.mod[" + expectedAlt + "].sources: [" + Utils.join(sources,", ") + "]",sources,contains(alt));
+        }
+
+        // Now collect the unique source list
+        List<Module> alts = modules.getMatching(new CriteriaSetPredicate(alt));
+
+        // Assert names are correct, and in the right order
+        actualNames = new ArrayList<>();
+        for (Module actual : alts)
+        {
+            actualNames.add(actual.getName());
+        }
+
+        assertThat("Resolved Alt (Sources) Names: " + actualNames,actualNames,contains(expectedAlts.toArray()));
     }
 }
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/PathFinderTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/PathFinderTest.java
index 7815c72..4f7e60d 100644
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/PathFinderTest.java
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/PathFinderTest.java
@@ -28,15 +28,22 @@
 import java.util.List;
 
 import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+import org.eclipse.jetty.toolchain.test.TestingDir;
+import org.junit.Rule;
 import org.junit.Test;
 
 public class PathFinderTest
 {
+    @Rule
+    public TestingDir testdir = new TestingDir();
+
     @Test
     public void testFindInis() throws IOException
     {
         File homeDir = MavenTestingUtils.getTestResourceDir("hb.1/home");
         Path homePath = homeDir.toPath().toAbsolutePath();
+        File baseDir = testdir.getEmptyDir();
+        Path basePath = baseDir.toPath().toAbsolutePath();
 
         PathFinder finder = new PathFinder();
         finder.setFileMatcher("glob:**/*.ini");
@@ -53,15 +60,17 @@
         expected.add("${jetty.home}/start.ini");
         FSTest.toOsSeparators(expected);
 
-        BaseHome hb = new BaseHome(new String[] { "jetty.home=" + homePath.toString() });
+        BaseHome hb = new BaseHome(new String[] { "jetty.home=" + homePath.toString(), "jetty.base=" + basePath.toString() });
         BaseHomeTest.assertPathList(hb,"Files found",expected,finder);
     }
 
     @Test
     public void testFindMods() throws IOException
     {
-        File homeDir = MavenTestingUtils.getTestResourceDir("usecases/home");
+        File homeDir = MavenTestingUtils.getTestResourceDir("dist-home");
         Path homePath = homeDir.toPath().toAbsolutePath();
+        File baseDir = testdir.getEmptyDir();
+        Path basePath = baseDir.toPath().toAbsolutePath();
 
         List<String> expected = new ArrayList<>();
         File modulesDir = new File(homeDir,"modules");
@@ -82,7 +91,7 @@
         
         Files.walkFileTree(modulesPath,EnumSet.of(FileVisitOption.FOLLOW_LINKS),1,finder);
 
-        BaseHome hb = new BaseHome(new String[] { "jetty.home=" + homePath.toString() });
+        BaseHome hb = new BaseHome(new String[] { "jetty.home=" + homePath.toString(), "jetty.base=" + basePath.toString() });
         BaseHomeTest.assertPathList(hb,"Files found",expected,finder);
     }
 }
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/PropertyPassingTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/PropertyPassingTest.java
index 52e92d5..e325e09 100644
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/PropertyPassingTest.java
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/PropertyPassingTest.java
@@ -18,8 +18,7 @@
 
 package org.eclipse.jetty.start;
 
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.*;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -89,7 +88,7 @@
 
     @Rule
     public TestingDir testingdir = new TestingDir();
-
+    
     @Test
     public void testAsJvmArg() throws IOException, InterruptedException
     {
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/PropsTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/PropsTest.java
index c287c86..f7c9ee1 100644
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/PropsTest.java
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/PropsTest.java
@@ -18,8 +18,11 @@
 
 package org.eclipse.jetty.start;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.nullValue;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
 
 import org.eclipse.jetty.start.Props.Prop;
 import org.junit.Test;
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/RebuildTestResources.java b/jetty-start/src/test/java/org/eclipse/jetty/start/RebuildTestResources.java
deleted file mode 100644
index 4f2fe61..0000000
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/RebuildTestResources.java
+++ /dev/null
@@ -1,190 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.start;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.PathMatcher;
-import java.nio.file.StandardCopyOption;
-import java.util.regex.Pattern;
-
-import org.eclipse.jetty.toolchain.test.FS;
-import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
-
-/**
- * Utility class to rebuild the src/test/resources/dist-home from the active build tree.
- * <p>
- * Not really meant to be run with each build. Nor is it a good idea to attempt to do that (as this would introduce a dependency from jetty-start ->
- * jetty-distribution which is a circular dependency)
- */
-public class RebuildTestResources
-{
-    public static void main(String[] args)
-    {
-        File realDistHome = MavenTestingUtils.getProjectDir("../jetty-distribution/target/distribution");
-        File outputDir = MavenTestingUtils.getTestResourceDir("dist-home");
-        try
-        {
-            new RebuildTestResources(realDistHome,outputDir).rebuild();
-        }
-        catch (Throwable t)
-        {
-            t.printStackTrace();
-        }
-    }
-
-    private static interface FileCopier
-    {
-        public void copy(Path from, Path to) throws IOException;
-    }
-
-    private static class NormalFileCopier implements FileCopier
-    {
-        @Override
-        public void copy(Path from, Path to) throws IOException
-        {
-            Files.copy(from,to,StandardCopyOption.REPLACE_EXISTING);
-        }
-    }
-
-    private static class TouchFileCopier implements FileCopier
-    {
-        @Override
-        public void copy(Path from, Path to) throws IOException
-        {
-            Files.createFile(to);
-        }
-    }
-
-    private static interface Renamer
-    {
-        public String getName(Path path);
-    }
-
-    private static class NoRenamer implements Renamer
-    {
-        @Override
-        public String getName(Path path)
-        {
-            return path.getFileName().toString();
-        }
-    }
-
-    private static class RegexRenamer implements Renamer
-    {
-        private final Pattern pat;
-        private final String replacement;
-
-        public RegexRenamer(String regex, String replacement)
-        {
-            this.pat = Pattern.compile(regex);
-            this.replacement = replacement;
-        }
-
-        @Override
-        public String getName(Path path)
-        {
-            String origName = path.getFileName().toString();
-            return pat.matcher(origName).replaceAll(replacement);
-        }
-    }
-
-    private final Path destDir;
-    private final Path srcDir;
-
-    public RebuildTestResources(File realDistHome, File outputDir) throws IOException
-    {
-        this.srcDir = realDistHome.toPath().toRealPath();
-        this.destDir = outputDir.toPath();
-    }
-
-    private void copyLibs() throws IOException
-    {
-        System.out.println("Copying libs (lib dir) ...");
-        Path libsDir = destDir.resolve("lib");
-        FS.ensureDirExists(libsDir.toFile());
-
-        PathMatcher matcher = getPathMatcher("glob:**.jar");
-        Renamer renamer = new RegexRenamer("-9\\.[0-9.]*(v[0-9]*)?(-SNAPSHOT)?(RC[0-9])?(M[0-9])?","-TEST");
-        FileCopier copier = new TouchFileCopier();
-        copyDir(srcDir.resolve("lib"),libsDir,matcher,renamer,copier);
-    }
-
-    private void copyModules() throws IOException
-    {
-        System.out.println("Copying modules ...");
-        Path modulesDir = destDir.resolve("modules");
-        FS.ensureDirExists(modulesDir.toFile());
-
-        PathMatcher matcher = getPathMatcher("glob:**.mod");
-        Renamer renamer = new NoRenamer();
-        FileCopier copier = new NormalFileCopier();
-        copyDir(srcDir.resolve("modules"),modulesDir,matcher,renamer,copier);
-    }
-
-    private void copyXmls() throws IOException
-    {
-        System.out.println("Copying xmls (etc dir) ...");
-        Path xmlDir = destDir.resolve("etc");
-        FS.ensureDirExists(xmlDir.toFile());
-
-        PathMatcher matcher = getPathMatcher("glob:**.xml");
-        Renamer renamer = new NoRenamer();
-        FileCopier copier = new TouchFileCopier();
-        copyDir(srcDir.resolve("etc"),xmlDir,matcher,renamer,copier);
-    }
-
-    private void rebuild() throws IOException
-    {
-        copyModules();
-        copyLibs();
-        copyXmls();
-        System.out.println("Done");
-    }
-
-    private PathMatcher getPathMatcher(String pattern)
-    {
-        return FileSystems.getDefault().getPathMatcher(pattern);
-    }
-
-    private void copyDir(Path from, Path to, PathMatcher fileMatcher, Renamer renamer, FileCopier copier) throws IOException
-    {
-        Files.createDirectories(to);
-
-        for (Path path : Files.newDirectoryStream(from))
-        {
-            String name = renamer.getName(path);
-            Path dest = to.resolve(name);
-            if (Files.isDirectory(path))
-            {
-                copyDir(path,dest,fileMatcher,renamer,copier);
-            }
-            else
-            {
-                if (fileMatcher.matches(path))
-                {
-                    copier.copy(path,dest);
-                }
-            }
-        }
-    }
-}
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/StartMatchers.java b/jetty-start/src/test/java/org/eclipse/jetty/start/StartMatchers.java
new file mode 100644
index 0000000..367303b
--- /dev/null
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/StartMatchers.java
@@ -0,0 +1,104 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+
+public final class StartMatchers
+{
+    public static Matcher<Path> pathExists()
+    {
+        return new BaseMatcher<Path>()
+        {
+            @Override
+            public boolean matches(Object item)
+            {
+                final Path path = (Path)item;
+                return Files.exists(path);
+            }
+
+            @Override
+            public void describeTo(Description description)
+            {
+                description.appendText("Path should exist");
+            }
+            
+            @Override
+            public void describeMismatch(Object item, Description description)
+            {
+                description.appendText("Path did not exist ").appendValue(item);
+            }
+        };
+    }
+    
+    public static Matcher<Path> notPathExists()
+    {
+        return new BaseMatcher<Path>()
+        {
+            @Override
+            public boolean matches(Object item)
+            {
+                final Path path = (Path)item;
+                return !Files.exists(path);
+            }
+
+            @Override
+            public void describeTo(Description description)
+            {
+                description.appendText("Path should not exist");
+            }
+            
+            @Override
+            public void describeMismatch(Object item, Description description)
+            {
+                description.appendText("Path exists ").appendValue(item);
+            }
+        };
+    }
+    
+    public static Matcher<Path> fileExists()
+    {
+        return new BaseMatcher<Path>()
+        {
+            @Override
+            public boolean matches(Object item)
+            {
+                final Path path = (Path)item;
+                return Files.exists(path) && Files.isRegularFile(path);
+            }
+
+            @Override
+            public void describeTo(Description description)
+            {
+                description.appendText("File should exist");
+            }
+            
+            @Override
+            public void describeMismatch(Object item, Description description)
+            {
+                description.appendText("File did not exist ").appendValue(item);
+            }
+        };
+    }
+}
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/TestBadUseCases.java b/jetty-start/src/test/java/org/eclipse/jetty/start/TestBadUseCases.java
index f949fde..4b91583 100644
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/TestBadUseCases.java
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/TestBadUseCases.java
@@ -18,68 +18,78 @@
 
 package org.eclipse.jetty.start;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
-
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.eclipse.jetty.start.util.RebuildTestResources;
 import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+import static org.hamcrest.Matchers.containsString;
 
 /**
  * Test bad configuration scenarios.
  */
+@RunWith(Parameterized.class)
 public class TestBadUseCases
 {
-    private void assertBadConfig(String homeName, String baseName, String expectedErrorMessage, String... cmdLineArgs) throws Exception
+    @Parameters(name = "{0}")
+    public static List<Object[]> getCases()
     {
-        File homeDir = MavenTestingUtils.getTestResourceDir("usecases/" + homeName);
-        File baseDir = MavenTestingUtils.getTestResourceDir("usecases/" + baseName);
+        List<Object[]> ret = new ArrayList<>();
+
+        ret.add(new Object[]{ "http2",
+                "Missing referenced dependency: alpn-impl/alpn-0.0.0_0",
+                new String[]{"java.version=0.0.0_0"}});
+
+        ret.add(new Object[]{ "versioned-modules-too-new",
+                "Module [http3] specifies jetty version [10.0] which is newer than this version of jetty [" + RebuildTestResources.JETTY_VERSION + "]",
+                null});
+
+        return ret;
+    }
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Parameter(0)
+    public String caseName;
+
+    @Parameter(1)
+    public String expectedErrorMessage;
+
+    @Parameter(2)
+    public String[] commandLineArgs;
+
+    @Test
+    public void testBadConfig() throws Exception
+    {
+        File homeDir = MavenTestingUtils.getTestResourceDir("dist-home");
+        File baseDir = MavenTestingUtils.getTestResourceDir("usecases/" + caseName);
 
         Main main = new Main();
         List<String> cmdLine = new ArrayList<>();
         cmdLine.add("jetty.home=" + homeDir.getAbsolutePath());
         cmdLine.add("jetty.base=" + baseDir.getAbsolutePath());
         // cmdLine.add("--debug");
-        for (String arg : cmdLineArgs)
+
+        if (commandLineArgs != null)
         {
-            cmdLine.add(arg);
+            for (String arg : commandLineArgs)
+            {
+                cmdLine.add(arg);
+            }
         }
 
-        try
-        {
-            main.processCommandLine(cmdLine);
-            fail("Expected " + UsageException.class.getName());
-        }
-        catch (UsageException e)
-        {
-            assertThat("Usage error",e.getMessage(),containsString(expectedErrorMessage));
-        }
+        expectedException.expect(UsageException.class);
+        expectedException.expectMessage(containsString(expectedErrorMessage));
+        main.processCommandLine(cmdLine);
     }
-
-    @Test
-    public void testBadJspCommandLine() throws Exception
-    {
-        assertBadConfig("home","base.with.jsp.default",
-                "Missing referenced dependency: jsp-impl/bad-jsp","jsp-impl=bad");
-    }
-
-    @Test
-    public void testBadJspImplName() throws Exception
-    {
-        assertBadConfig("home","base.with.jsp.bad",
-                "Missing referenced dependency: jsp-impl/bogus-jsp");
-    }
-    
-    @Test
-    public void testWithSpdyBadNpnVersion() throws Exception
-    {
-        assertBadConfig("home","base.enable.spdy.bad.npn.version",
-                "Missing referenced dependency: protonego-impl/npn-1.7.0_01",
-                "java.version=1.7.0_01", "protonego=npn");
-    }
-
-
 }
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/TestUseCases.java b/jetty-start/src/test/java/org/eclipse/jetty/start/TestUseCases.java
index 59df17f..4ae6492 100644
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/TestUseCases.java
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/TestUseCases.java
@@ -18,118 +18,73 @@
 
 package org.eclipse.jetty.start;
 
-import java.io.File;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
 
 import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
 
 /**
  * Various Home + Base use cases
  */
+@RunWith(Parameterized.class)
 public class TestUseCases
 {
-    private void assertUseCase(String homeName, String baseName, String assertName, String... cmdLineArgs) throws Exception
+    @Parameters(name = "{0}")
+    public static List<Object[]> getCases()
     {
-        File homeDir = MavenTestingUtils.getTestResourceDir("usecases/" + homeName);
-        File baseDir = MavenTestingUtils.getTestResourceDir("usecases/" + baseName);
+        List<Object[]> ret = new ArrayList<>();
+
+        ret.add(new String[] {"barebones", null});
+        ret.add(new String[] {"include-jetty-dir-logging", null});
+        ret.add(new String[] {"jmx", null});
+        ret.add(new String[] {"logging", null});
+        ret.add(new String[] {"jsp", null});
+        ret.add(new String[] {"database", null});
+        ret.add(new String[] {"deep-ext", null});
+        ret.add(new String[] {"versioned-modules", null});
+        
+        // Ones with command lines
+        ret.add(new Object[] {"http2", new String[]{"java.version=1.8.0_31"}});
+        ret.add(new Object[] {"basic-properties", new String[]{"port=9090"}});
+        ret.add(new Object[] {"agent-properties", new String[]{"java.vm.specification.version=1.6"}});
+        
+        return ret;
+    }
+
+    @Parameter(0)
+    public String caseName;
+
+    @Parameter(1)
+    public String[] commandLineArgs;
+
+    @Test
+    public void testUseCase() throws Exception
+    {
+        Path homeDir = MavenTestingUtils.getTestResourceDir("dist-home").toPath().toRealPath();
+        Path baseDir = MavenTestingUtils.getTestResourceDir("usecases/" + caseName).toPath().toRealPath();
 
         Main main = new Main();
         List<String> cmdLine = new ArrayList<>();
-        cmdLine.add("jetty.home=" + homeDir.getAbsolutePath());
-        cmdLine.add("jetty.base=" + baseDir.getAbsolutePath());
+        cmdLine.add("jetty.home=" + homeDir.toString());
+        cmdLine.add("jetty.base=" + baseDir.toString());
         // cmdLine.add("--debug");
-        for (String arg : cmdLineArgs)
+
+        if (commandLineArgs != null)
         {
-            cmdLine.add(arg);
+            for (String arg : commandLineArgs)
+            {
+                cmdLine.add(arg);
+            }
         }
+
         StartArgs args = main.processCommandLine(cmdLine);
         BaseHome baseHome = main.getBaseHome();
-        ConfigurationAssert.assertConfiguration(baseHome,args,"usecases/" + assertName);
-    }
-
-    @Test
-    public void testBarebones() throws Exception
-    {
-        assertUseCase("home","base.barebones","assert-barebones.txt");
-    }
-
-    @Test
-    public void testJMX() throws Exception
-    {
-        assertUseCase("home","base.jmx","assert-jmx.txt");
-    }
-    
-    @Test
-    public void testWithLogging() throws Exception
-    {
-        assertUseCase("home","base.logging","assert-logging.txt");
-    }
-
-    @Test
-    public void testWithIncludeJettyDir_Logging() throws Exception
-    {
-        assertUseCase("home","base.with.include.jetty.dirs","assert-include-jetty-dir-logging.txt");
-    }
-
-    @Test
-    public void testWithJspDefault() throws Exception
-    {
-        assertUseCase("home","base.with.jsp.default","assert-jsp-apache.txt");
-    }
-
-    @Test
-    public void testWithJspApache() throws Exception
-    {
-        assertUseCase("home","base.with.jsp.apache","assert-jsp-apache.txt");
-    }
-    
-    @Test
-    public void testWithJspGlassfish() throws Exception
-    {
-        assertUseCase("home","base.with.jsp.glassfish","assert-jsp-glassfish.txt");
-    }
-
-    @Test
-    public void testWithJspGlassfishCmdLine() throws Exception
-    {
-        assertUseCase("home","base.with.jsp.default","assert-jsp-glassfish.txt","jsp-impl=glassfish");
-    }
-
-    @Test
-    public void testWithMissingNpnVersion() throws Exception
-    {
-        assertUseCase("home","base.missing.npn.version","assert-missing-npn-version.txt","java.version=1.7.0_01");
-    }
-    
-    @Test
-    public void testWithSpdy() throws Exception
-    {
-        assertUseCase("home","base.enable.spdy","assert-enable-spdy.txt","java.version=1.7.0_60");
-    }
-    
-    @Test
-    public void testWithDatabase() throws Exception
-    {
-        assertUseCase("home","base.with.db","assert-with-db.txt");
-    }
-
-    @Test
-    public void testWithDeepExt() throws Exception
-    {
-        assertUseCase("home","base.with.ext","assert-with.ext.txt");
-    }
-    
-    @Test
-    public void testWithPropsBasic() throws Exception
-    {
-        assertUseCase("home","base.props.basic","assert-props.basic.txt","port=9090");
-    }
-    
-    @Test
-    public void testWithPropsAgent() throws Exception
-    {
-        assertUseCase("home","base.props.agent","assert-props.agent.txt","java.vm.specification.version=1.6");
+        ConfigurationAssert.assertConfiguration(baseHome,args,"usecases/" + caseName + ".assert.txt");
     }
 }
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/VersionTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/VersionTest.java
index 7e61d1f..f7df07b 100644
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/VersionTest.java
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/VersionTest.java
@@ -18,18 +18,46 @@
 
 package org.eclipse.jetty.start;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
 
 import org.junit.Test;
 
 public class VersionTest
 {
     @Test
-    public void testDefaultVersion()
+    public void testParse() 
     {
-        Version version = new Version();
-        assertEquals("Default version difference to 0.0.0",0,version.compare(new Version("0.0.0")));
+        assertParse("1.8.0_45",1,8,0,45);
+        assertParse("1.8.0_45-internal",1,8,0,45);
+        assertParse("1.8.0-debug",1,8,0,-1);
+    }
+    
+    private void assertParse(String verStr, int legacyMajor, int major, int revision, int update)
+    {
+        Version ver = new Version(verStr);
+        assertThat("Version [" + verStr + "].legacyMajor", ver.getLegacyMajor(), is(legacyMajor));
+        assertThat("Version [" + verStr + "].major", ver.getMajor(), is(major));
+        assertThat("Version [" + verStr + "].revision", ver.getRevision(), is(revision));
+        assertThat("Version [" + verStr + "].update", ver.getUpdate(), is(update));
+        
+        assertThat("Version [" + verStr + "].toString", ver.toString(), is(verStr));
+    }
+
+    @Test
+    public void testToShortString() 
+    {
+        assertToShortString("1.8","1.8");
+        assertToShortString("1.8.0","1.8.0");
+        assertToShortString("1.8.0_45","1.8.0_45");
+        assertToShortString("1.8.0_45-internal","1.8.0_45");
+        assertToShortString("1.8.0-debug","1.8.0");
+    }
+    
+    private void assertToShortString(String verStr, String expectedShortString)
+    {
+        Version ver = new Version(verStr);
+        assertThat("Version [" + verStr + "].toShortString", ver.toShortString(), is(expectedShortString));
     }
 
     @Test
@@ -39,27 +67,41 @@
         assertIsNewer("1.5.0", "1.6.0");
         // assertIsNewer("1.6.0_12", "1.6.0_16"); // JDK version spec?
     }
-
+    
     @Test
     public void testOlderVersion() {
         assertIsOlder("0.0.1", "0.0.0");
         assertIsOlder("0.1.1", "0.1.0");
         assertIsOlder("1.6.0", "1.5.0");
     }
+    
+    @Test
+    public void testOlderOrEqualTo()
+    {
+        assertThat("9.2 <= 9.2",new Version("9.2").isOlderThanOrEqualTo(new Version("9.2")),is(true));
+        assertThat("9.2 <= 9.3",new Version("9.2").isOlderThanOrEqualTo(new Version("9.3")),is(true));
+        assertThat("9.3 <= 9.2",new Version("9.3").isOlderThanOrEqualTo(new Version("9.2")),is(false));
+    }
+    
+    @Test
+    public void testNewerOrEqualTo()
+    {
+        assertThat("9.2 >= 9.2",new Version("9.2").isNewerThanOrEqualTo(new Version("9.2")),is(true));
+        assertThat("9.2 >= 9.3",new Version("9.2").isNewerThanOrEqualTo(new Version("9.3")),is(false));
+        assertThat("9.3 >= 9.2",new Version("9.3").isNewerThanOrEqualTo(new Version("9.2")),is(true));
+    }
 
     private void assertIsOlder(String basever, String testver)
     {
         Version vbase = new Version(basever);
         Version vtest = new Version(testver);
-        assertTrue("Version [" + testver + "] should be older than [" + basever + "]",
-                vtest.compare(vbase) == -1);
+        assertTrue("Version [" + testver + "] should be older than [" + basever + "]", vtest.isOlderThan(vbase));
     }
 
     private void assertIsNewer(String basever, String testver)
     {
         Version vbase = new Version(basever);
         Version vtest = new Version(testver);
-        assertTrue("Version [" + testver + "] should be newer than [" + basever + "]",
-                vtest.compare(vbase) == 1);
+        assertTrue("Version [" + testver + "] should be newer than [" + basever + "]", vtest.isNewerThan(vbase));
     }
 }
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/config/ConfigSourcesTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/config/ConfigSourcesTest.java
index 7aad9a9..19a0c3c 100644
--- a/jetty-start/src/test/java/org/eclipse/jetty/start/config/ConfigSourcesTest.java
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/config/ConfigSourcesTest.java
@@ -18,10 +18,9 @@
 
 package org.eclipse.jetty.start.config;
 
-import static org.hamcrest.Matchers.*;
-
 import java.io.File;
 import java.io.IOException;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -36,6 +35,10 @@
 import org.junit.Rule;
 import org.junit.Test;
 
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
 public class ConfigSourcesTest
 {
     @Rule
@@ -83,13 +86,13 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1");
+                "jetty.http.host=127.0.0.1");
 
         ConfigSources sources = new ConfigSources();
 
@@ -107,27 +110,28 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create common
-        File common = testdir.getFile("common");
-        FS.ensureEmpty(common);
+        Path common = testdir.getFile("common").toPath();
+        FS.ensureEmpty(common.toFile());
+        common = common.toRealPath();
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1",//
-                "--include-jetty-dir=" + common.getAbsolutePath());
+                "jetty.http.host=127.0.0.1",//
+                "--include-jetty-dir=" + common.toString());
 
         ConfigSources sources = new ConfigSources();
 
         String[] cmdLine = new String[0];
         sources.add(new CommandLineConfigSource(cmdLine));
-        sources.add(new JettyHomeConfigSource(home.toPath()));
-        sources.add(new JettyBaseConfigSource(base.toPath()));
+        sources.add(new JettyHomeConfigSource(home.toPath().toRealPath()));
+        sources.add(new JettyBaseConfigSource(base.toPath().toRealPath()));
 
-        assertIdOrder(sources,"<command-line>","${jetty.base}",common.getAbsolutePath(),"${jetty.home}");
+        assertIdOrder(sources,"<command-line>","${jetty.base}",common.toString(),"${jetty.home}");
     }
 
     @Test
@@ -136,18 +140,18 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create common
         File common = testdir.getFile("common");
         FS.ensureEmpty(common);
-        TestEnv.makeFile(common,"start.ini","jetty.port=8080");
+        TestEnv.makeFile(common,"start.ini","jetty.http.port=8080");
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1");
+                "jetty.http.host=127.0.0.1");
 
         ConfigSources sources = new ConfigSources();
 
@@ -167,8 +171,8 @@
 
         assertDirOrder(sources,base,common,home);
 
-        assertProperty(sources,"jetty.host","127.0.0.1");
-        assertProperty(sources,"jetty.port","8080"); // from 'common'
+        assertProperty(sources,"jetty.http.host","127.0.0.1");
+        assertProperty(sources,"jetty.http.port","8080"); // from 'common'
     }
 
     @Test
@@ -177,7 +181,7 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create opt
         File opt = testdir.getFile("opt");
@@ -186,13 +190,13 @@
         // Create common
         File common = new File(opt,"common");
         FS.ensureEmpty(common);
-        TestEnv.makeFile(common,"start.ini","jetty.port=8080");
+        TestEnv.makeFile(common,"start.ini","jetty.http.port=8080");
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1");
+                "jetty.http.host=127.0.0.1");
 
         String dirRef = "${my.opt}" + File.separator + "common";
 
@@ -213,8 +217,8 @@
 
         assertDirOrder(sources,base,common,home);
 
-        assertProperty(sources,"jetty.host","127.0.0.1");
-        assertProperty(sources,"jetty.port","8080"); // from 'common'
+        assertProperty(sources,"jetty.http.host","127.0.0.1");
+        assertProperty(sources,"jetty.http.port","8080"); // from 'common'
     }
 
     @Test
@@ -223,7 +227,7 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create opt
         File opt = testdir.getFile("opt");
@@ -232,13 +236,13 @@
         // Create common
         File common = new File(opt,"common");
         FS.ensureEmpty(common);
-        TestEnv.makeFile(common,"start.ini","jetty.port=8080");
+        TestEnv.makeFile(common,"start.ini","jetty.http.port=8080");
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1");
+                "jetty.http.host=127.0.0.1");
 
         String dirRef = "${my.opt}" + File.separator + "${my.dir}";
 
@@ -262,8 +266,8 @@
 
         assertDirOrder(sources,base,common,home);
 
-        assertProperty(sources,"jetty.host","127.0.0.1");
-        assertProperty(sources,"jetty.port","8080"); // from 'common'
+        assertProperty(sources,"jetty.http.host","127.0.0.1");
+        assertProperty(sources,"jetty.http.port","8080"); // from 'common'
     }
     
     @Test
@@ -272,18 +276,18 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create common
         File common = testdir.getFile("common");
         FS.ensureEmpty(common);
-        TestEnv.makeFile(common,"start.ini","jetty.port=8080");
+        TestEnv.makeFile(common,"start.ini","jetty.http.port=8080");
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1",//
+                "jetty.http.host=127.0.0.1",//
                 "--include-jetty-dir=" + common.getAbsolutePath());
 
         ConfigSources sources = new ConfigSources();
@@ -297,8 +301,8 @@
 
         assertDirOrder(sources,base,common,home);
 
-        assertProperty(sources,"jetty.host","127.0.0.1");
-        assertProperty(sources,"jetty.port","8080"); // from 'common'
+        assertProperty(sources,"jetty.http.host","127.0.0.1");
+        assertProperty(sources,"jetty.http.port","8080"); // from 'common'
     }
 
     @Test
@@ -307,12 +311,12 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create common
         File common = testdir.getFile("common");
         FS.ensureEmpty(common);
-        TestEnv.makeFile(common,"start.ini","jetty.port=8080");
+        TestEnv.makeFile(common,"start.ini","jetty.http.port=8080");
 
         // Create corp
         File corp = testdir.getFile("corp");
@@ -322,7 +326,7 @@
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1",//
+                "jetty.http.host=127.0.0.1",//
                 "--include-jetty-dir=" + common.getAbsolutePath(), //
                 "--include-jetty-dir=" + corp.getAbsolutePath());
 
@@ -340,8 +344,8 @@
 
         assertDirOrder(sources,base,common,corp,home);
 
-        assertProperty(sources,"jetty.host","127.0.0.1");
-        assertProperty(sources,"jetty.port","8080"); // from 'common'
+        assertProperty(sources,"jetty.http.host","127.0.0.1");
+        assertProperty(sources,"jetty.http.port","8080"); // from 'common'
     }
     
     @Test
@@ -350,26 +354,26 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create corp
         File corp = testdir.getFile("corp");
         FS.ensureEmpty(corp);
         TestEnv.makeFile(corp,"start.ini", //
-                "jetty.port=9090");
+                "jetty.http.port=9090");
 
         // Create common
         File common = testdir.getFile("common");
         FS.ensureEmpty(common);
         TestEnv.makeFile(common,"start.ini", //
                 "--include-jetty-dir=" + corp.getAbsolutePath(), //
-                "jetty.port=8080");
+                "jetty.http.port=8080");
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1",//
+                "jetty.http.host=127.0.0.1",//
                 "--include-jetty-dir=" + common.getAbsolutePath());
 
         ConfigSources sources = new ConfigSources();
@@ -386,8 +390,8 @@
 
         assertDirOrder(sources,base,common,corp,home);
 
-        assertProperty(sources,"jetty.host","127.0.0.1");
-        assertProperty(sources,"jetty.port","8080"); // from 'common'
+        assertProperty(sources,"jetty.http.host","127.0.0.1");
+        assertProperty(sources,"jetty.http.port","8080"); // from 'common'
     }
     
     @Test
@@ -396,13 +400,13 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create corp
         File corp = testdir.getFile("corp");
         FS.ensureEmpty(corp);
         TestEnv.makeFile(corp,"start.ini", //
-                "jetty.port=9090");
+                "jetty.http.port=9090");
 
         // Create common
         File common = testdir.getFile("common");
@@ -410,13 +414,13 @@
         TestEnv.makeFile(common,"start.ini", //
                 "my.corp=" + corp.getAbsolutePath(), //
                 "--include-jetty-dir=${my.corp}", //
-                "jetty.port=8080");
+                "jetty.http.port=8080");
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1",//
+                "jetty.http.host=127.0.0.1",//
                 "my.common="+common.getAbsolutePath(), //
                 "--include-jetty-dir=${my.common}");
 
@@ -435,8 +439,8 @@
 
         assertDirOrder(sources,base,common,corp,home);
 
-        assertProperty(sources,"jetty.host","127.0.0.1");
-        assertProperty(sources,"jetty.port","8080"); // from 'common'
+        assertProperty(sources,"jetty.http.host","127.0.0.1");
+        assertProperty(sources,"jetty.http.port","8080"); // from 'common'
     }
     
     @Test
@@ -445,33 +449,33 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create devops
         File devops = testdir.getFile("devops");
         FS.ensureEmpty(devops);
         TestEnv.makeFile(devops,"start.ini", //
                 "--module=logging", //
-                "jetty.port=2222");
+                "jetty.http.port=2222");
 
         // Create corp
         File corp = testdir.getFile("corp");
         FS.ensureEmpty(corp);
         TestEnv.makeFile(corp,"start.ini", //
-                "jetty.port=9090");
+                "jetty.http.port=9090");
 
         // Create common
         File common = testdir.getFile("common");
         FS.ensureEmpty(common);
         TestEnv.makeFile(common,"start.ini", //
                 "--include-jetty-dir=" + corp.getAbsolutePath(), //
-                "jetty.port=8080");
+                "jetty.http.port=8080");
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1",//
+                "jetty.http.host=127.0.0.1",//
                 "--include-jetty-dir=" + common.getAbsolutePath());
 
         ConfigSources sources = new ConfigSources();
@@ -492,8 +496,8 @@
 
         assertDirOrder(sources,base,devops,common,corp,home);
 
-        assertProperty(sources,"jetty.host","127.0.0.1");
-        assertProperty(sources,"jetty.port","2222"); // from 'common'
+        assertProperty(sources,"jetty.http.host","127.0.0.1");
+        assertProperty(sources,"jetty.http.port","2222"); // from 'common'
     }
     
     @Test
@@ -502,33 +506,33 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create corp
         File corp = testdir.getFile("corp");
         FS.ensureEmpty(corp);
         TestEnv.makeFile(corp,"start.ini", //
-                "jetty.port=9090");
+                "jetty.http.port=9090");
 
         // Create common
         File common = testdir.getFile("common");
         FS.ensureEmpty(common);
         TestEnv.makeFile(common,"start.ini", //
                 "--include-jetty-dir=" + corp.getAbsolutePath(), //
-                "jetty.port=8080");
+                "jetty.http.port=8080");
 
         // Create base
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1",//
+                "jetty.http.host=127.0.0.1",//
                 "--include-jetty-dir=" + common.getAbsolutePath());
 
         ConfigSources sources = new ConfigSources();
         
         String cmdLine[] = new String[]{
              // command line property should override all others
-                "jetty.port=7070"
+                "jetty.http.port=7070"
         };
         sources.add(new CommandLineConfigSource(cmdLine));
         sources.add(new JettyHomeConfigSource(home.toPath()));
@@ -541,8 +545,8 @@
 
         assertDirOrder(sources,base,common,corp,home);
 
-        assertProperty(sources,"jetty.host","127.0.0.1");
-        assertProperty(sources,"jetty.port","7070"); // from <command-line>
+        assertProperty(sources,"jetty.http.host","127.0.0.1");
+        assertProperty(sources,"jetty.http.port","7070"); // from <command-line>
     }
     
     @Test
@@ -551,7 +555,7 @@
         // Create home
         File home = testdir.getFile("home");
         FS.ensureEmpty(home);
-        TestEnv.copyTestDir("usecases/home",home);
+        TestEnv.copyTestDir("dist-home",home);
 
         // Create common
         File common = testdir.getFile("common");
@@ -562,14 +566,14 @@
         FS.ensureEmpty(corp);
         TestEnv.makeFile(corp,"start.ini", 
                 // standard property
-                "jetty.port=9090",
+                "jetty.http.port=9090",
                 // INTENTIONAL BAD Reference (duplicate)
                 "--include-jetty-dir=" + common.getAbsolutePath());
 
         // Populate common
         TestEnv.makeFile(common,"start.ini", 
                 // standard property
-                "jetty.port=8080",
+                "jetty.http.port=8080",
                 // reference to corp
                 "--include-jetty-dir=" + corp.getAbsolutePath());
 
@@ -577,7 +581,7 @@
         File base = testdir.getFile("base");
         FS.ensureEmpty(base);
         TestEnv.makeFile(base,"start.ini", //
-                "jetty.host=127.0.0.1",//
+                "jetty.http.host=127.0.0.1",//
                 "--include-jetty-dir=" + common.getAbsolutePath());
 
         ConfigSources sources = new ConfigSources();
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/fileinits/MavenLocalRepoFileInitializerTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/fileinits/MavenLocalRepoFileInitializerTest.java
new file mode 100644
index 0000000..14e180b
--- /dev/null
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/fileinits/MavenLocalRepoFileInitializerTest.java
@@ -0,0 +1,154 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.fileinits;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+
+import org.eclipse.jetty.start.BaseHome;
+import org.eclipse.jetty.start.config.ConfigSources;
+import org.eclipse.jetty.start.config.JettyBaseConfigSource;
+import org.eclipse.jetty.start.config.JettyHomeConfigSource;
+import org.eclipse.jetty.start.fileinits.MavenLocalRepoFileInitializer.Coordinates;
+import org.eclipse.jetty.toolchain.test.TestingDir;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class MavenLocalRepoFileInitializerTest
+{
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+    
+    @Rule
+    public TestingDir testdir = new TestingDir();
+    
+    private BaseHome baseHome;
+    
+    @Before
+    public void setupBaseHome() throws IOException
+    {
+        File homeDir = testdir.getEmptyDir();
+        
+        ConfigSources config = new ConfigSources();
+        config.add(new JettyHomeConfigSource(homeDir.toPath()));
+        config.add(new JettyBaseConfigSource(homeDir.toPath()));
+
+        this.baseHome = new BaseHome(config);
+    }
+
+    @Test
+    public void testGetCoordinate_NotMaven()
+    {
+        MavenLocalRepoFileInitializer repo = new MavenLocalRepoFileInitializer(baseHome);
+        String ref = "http://www.eclipse.org/jetty";
+        Coordinates coords = repo.getCoordinates(URI.create(ref));
+        assertThat("Coords",coords,nullValue());
+    }
+
+    @Test
+    public void testGetCoordinate_InvalidMaven()
+    {
+        MavenLocalRepoFileInitializer repo = new MavenLocalRepoFileInitializer(baseHome);
+        String ref = "maven://www.eclipse.org/jetty";
+        expectedException.expect(RuntimeException.class);
+        expectedException.expectMessage(containsString("Not a valid maven:// uri"));
+        repo.getCoordinates(URI.create(ref));
+    }
+
+    @Test
+    public void testGetCoordinate_Normal()
+    {
+        MavenLocalRepoFileInitializer repo = new MavenLocalRepoFileInitializer(baseHome);
+        String ref = "maven://org.eclipse.jetty/jetty-start/9.3.x";
+        Coordinates coords = repo.getCoordinates(URI.create(ref));
+        assertThat("Coordinates",coords,notNullValue());
+
+        assertThat("coords.groupId",coords.groupId,is("org.eclipse.jetty"));
+        assertThat("coords.artifactId",coords.artifactId,is("jetty-start"));
+        assertThat("coords.version",coords.version,is("9.3.x"));
+        assertThat("coords.type",coords.type,is("jar"));
+        assertThat("coords.classifier",coords.classifier,nullValue());
+        
+        assertThat("coords.toCentralURI", coords.toCentralURI().toASCIIString(), 
+                is("http://central.maven.org/maven2/org/eclipse/jetty/jetty-start/9.3.x/jetty-start-9.3.x.jar"));
+    }
+
+    @Test
+    public void testGetCoordinate_Zip()
+    {
+        MavenLocalRepoFileInitializer repo = new MavenLocalRepoFileInitializer(baseHome);
+        String ref = "maven://org.eclipse.jetty/jetty-distribution/9.3.x/zip";
+        Coordinates coords = repo.getCoordinates(URI.create(ref));
+        assertThat("Coordinates",coords,notNullValue());
+
+        assertThat("coords.groupId",coords.groupId,is("org.eclipse.jetty"));
+        assertThat("coords.artifactId",coords.artifactId,is("jetty-distribution"));
+        assertThat("coords.version",coords.version,is("9.3.x"));
+        assertThat("coords.type",coords.type,is("zip"));
+        assertThat("coords.classifier",coords.classifier,nullValue());
+        
+        assertThat("coords.toCentralURI", coords.toCentralURI().toASCIIString(), 
+                is("http://central.maven.org/maven2/org/eclipse/jetty/jetty-distribution/9.3.x/jetty-distribution-9.3.x.zip"));
+    }
+
+    @Test
+    public void testGetCoordinate_TestJar()
+    {
+        MavenLocalRepoFileInitializer repo = new MavenLocalRepoFileInitializer(baseHome);
+        String ref = "maven://org.eclipse.jetty/jetty-http/9.3.x/jar/tests";
+        Coordinates coords = repo.getCoordinates(URI.create(ref));
+        assertThat("Coordinates",coords,notNullValue());
+
+        assertThat("coords.groupId",coords.groupId,is("org.eclipse.jetty"));
+        assertThat("coords.artifactId",coords.artifactId,is("jetty-http"));
+        assertThat("coords.version",coords.version,is("9.3.x"));
+        assertThat("coords.type",coords.type,is("jar"));
+        assertThat("coords.classifier",coords.classifier,is("tests"));
+        
+        assertThat("coords.toCentralURI", coords.toCentralURI().toASCIIString(), 
+                is("http://central.maven.org/maven2/org/eclipse/jetty/jetty-http/9.3.x/jetty-http-9.3.x-tests.jar"));
+    }
+    
+    @Test
+    public void testGetCoordinate_Test_UnspecifiedType()
+    {
+        MavenLocalRepoFileInitializer repo = new MavenLocalRepoFileInitializer(baseHome);
+        String ref = "maven://org.eclipse.jetty/jetty-http/9.3.x//tests";
+        Coordinates coords = repo.getCoordinates(URI.create(ref));
+        assertThat("Coordinates",coords,notNullValue());
+
+        assertThat("coords.groupId",coords.groupId,is("org.eclipse.jetty"));
+        assertThat("coords.artifactId",coords.artifactId,is("jetty-http"));
+        assertThat("coords.version",coords.version,is("9.3.x"));
+        assertThat("coords.type",coords.type,is("jar"));
+        assertThat("coords.classifier",coords.classifier,is("tests"));
+        
+        assertThat("coords.toCentralURI", coords.toCentralURI().toASCIIString(), 
+                is("http://central.maven.org/maven2/org/eclipse/jetty/jetty-http/9.3.x/jetty-http-9.3.x-tests.jar"));
+    }
+}
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/graph/NodeTest.java b/jetty-start/src/test/java/org/eclipse/jetty/start/graph/NodeTest.java
new file mode 100644
index 0000000..2d4182d
--- /dev/null
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/graph/NodeTest.java
@@ -0,0 +1,75 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.graph;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Test;
+
+public class NodeTest
+{
+    private static class TestNode extends Node<TestNode>
+    {
+        public TestNode(String name)
+        {
+            setName(name);
+        }
+
+        @Override
+        public String toString()
+        {
+            return String.format("TestNode[%s]",getName());
+        }
+    }
+
+    @Test
+    public void testNoNameMatch()
+    {
+        TestNode node = new TestNode("a");
+        Predicate predicate = new NamePredicate("b");
+        assertThat(node.toString(),node.matches(predicate),is(false));
+    }
+    
+    @Test
+    public void testNameMatch()
+    {
+        TestNode node = new TestNode("a");
+        Predicate predicate = new NamePredicate("a");
+        assertThat(node.toString(),node.matches(predicate),is(true));
+    }
+    
+    @Test
+    public void testAnySelectionMatch()
+    {
+        TestNode node = new TestNode("a");
+        node.addSelection(new Selection("test"));
+        Predicate predicate = new AnySelectionPredicate();
+        assertThat(node.toString(),node.matches(predicate),is(true));
+    }
+    
+    @Test
+    public void testAnySelectionNoMatch()
+    {
+        TestNode node = new TestNode("a");
+        // NOT Selected - node.addSelection(new Selection("test"));
+        Predicate predicate = new AnySelectionPredicate();
+        assertThat(node.toString(),node.matches(predicate),is(false));
+    }
+}
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/util/CorrectMavenCentralRefs.java b/jetty-start/src/test/java/org/eclipse/jetty/start/util/CorrectMavenCentralRefs.java
new file mode 100644
index 0000000..def1277
--- /dev/null
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/util/CorrectMavenCentralRefs.java
@@ -0,0 +1,256 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.util;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.FileVisitOption;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.PathMatcher;
+import java.nio.file.StandardOpenOption;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.jetty.start.PathFinder;
+import org.eclipse.jetty.start.PathMatchers;
+import org.eclipse.jetty.start.Utils;
+import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+
+/**
+ * Simple utility to scan all of the mod files and correct references
+ * to maven central URL in [files] sections to the new maven:// syntax
+ */
+public class CorrectMavenCentralRefs
+{
+    public static void main(String[] args)
+    {
+        Path buildRoot = MavenTestingUtils.getProjectDir("..").toPath();
+        buildRoot = buildRoot.normalize().toAbsolutePath();
+
+        // Test to make sure we are in right directory
+        Path rootPomXml = buildRoot.resolve("pom.xml");
+        Path distPomXml = buildRoot.resolve("jetty-distribution/pom.xml");
+        if (!Files.exists(rootPomXml) || !Files.exists(distPomXml))
+        {
+            System.err.println("Not build root directory: " + buildRoot);
+            System.exit(-1);
+        }
+
+        try
+        {
+            new CorrectMavenCentralRefs().fix(buildRoot);
+        }
+        catch (Throwable t)
+        {
+            t.printStackTrace(System.err);
+        }
+    }
+
+    public void fix(Path buildRoot) throws IOException
+    {
+        // Find all of the *.mod files
+        PathFinder finder = new PathFinder();
+        finder.setFileMatcher("glob:**/*.mod");
+        finder.setBase(buildRoot);
+
+        // Matcher for target directories
+        PathMatcher targetMatcher = PathMatchers.getMatcher("glob:**/target/**");
+        PathMatcher testMatcher = PathMatchers.getMatcher("glob:**/test/**");
+
+        System.out.printf("Walking path: %s%n",buildRoot);
+        Set<FileVisitOption> options = Collections.emptySet();
+        Files.walkFileTree(buildRoot,options,30,finder);
+
+        System.out.printf("Found: %d hits%n",finder.getHits().size());
+        int count = 0;
+        for (Path path : finder.getHits())
+        {
+            if (Files.isDirectory(path))
+            {
+                // skip
+                continue;
+            }
+
+            if (targetMatcher.matches(path))
+            {
+                // skip
+                continue;
+            }
+
+            if (testMatcher.matches(path))
+            {
+                // skip
+                continue;
+            }
+
+            if (processModFile(path))
+            {
+                count++;
+            }
+        }
+
+        System.out.printf("Processed %,d modules",count);
+    }
+
+    private boolean processFileRefs(List<String> lines)
+    {
+        Pattern section = Pattern.compile("\\s*\\[([^]]*)\\]\\s*");
+        int filesStart = -1;
+        int filesEnd = -1;
+
+        // Find [files] section
+        String sectionId = null;
+        int lineCount = lines.size();
+        for (int i = 0; i < lineCount; i++)
+        {
+            String line = lines.get(i).trim();
+
+            Matcher sectionMatcher = section.matcher(line);
+
+            if (sectionMatcher.matches())
+            {
+                sectionId = sectionMatcher.group(1).trim().toUpperCase(Locale.ENGLISH);
+            }
+            else
+            {
+                if ("FILES".equals(sectionId))
+                {
+                    if (filesStart < 0)
+                    {
+                        filesStart = i;
+                    }
+                    filesEnd = i;
+                }
+            }
+        }
+
+        if (filesStart == (-1))
+        {
+            // no [files] section
+            return false;
+        }
+
+        // process lines, only in files section
+        int updated = 0;
+        for (int i = filesStart; i <= filesEnd; i++)
+        {
+            String line = lines.get(i);
+            String keyword = "maven.org/maven2/";
+            int idx = line.indexOf(keyword);
+            if (idx > 0)
+            {
+                int pipe = line.indexOf('|');
+                String rawpath = line.substring(idx + keyword.length(),pipe);
+                String destpath = line.substring(pipe + 1);
+
+                String parts[] = rawpath.split("/");
+                int rev = parts.length;
+                String filename = parts[--rev];
+
+                String type = "jar";
+                int ext = filename.lastIndexOf('.');
+                if (ext > 0)
+                {
+                    type = filename.substring(ext + 1);
+                }
+                String version = parts[--rev];
+                String artifactId = parts[--rev];
+                String groupId = Utils.join(parts,0,rev,".");
+
+                String classifier = filename.replaceFirst(artifactId + '-' + version,"");
+                classifier = classifier.replaceFirst('.' + type + '$',"");
+                if (Utils.isNotBlank(classifier) && (classifier.charAt(0) == '-'))
+                {
+                    classifier = classifier.substring(1);
+                }
+
+                StringBuilder murl = new StringBuilder();
+                murl.append("maven://");
+                murl.append(groupId).append('/');
+                murl.append(artifactId).append('/');
+                murl.append(version);
+                if (!"jar".equals(type) || Utils.isNotBlank(classifier))
+                {
+                    murl.append('/').append(type);
+                    if (Utils.isNotBlank(classifier))
+                    {
+                        murl.append('/').append(classifier);
+                    }
+                }
+
+                lines.set(i,murl.toString()+'|'+destpath);
+
+                updated++;
+            }
+        }
+
+        return (updated > 0);
+    }
+
+    private boolean processModFile(Path path) throws IOException
+    {
+        List<String> lines = readLines(path);
+        if (processFileRefs(lines))
+        {
+            // the lines are now dirty, save them.
+            System.out.printf("Updating: %s%n",path);
+            saveLines(path,lines);
+            return true;
+        }
+
+        // no update performed
+        return false;
+    }
+
+    private List<String> readLines(Path path) throws IOException
+    {
+        List<String> lines = new ArrayList<>();
+
+        try (BufferedReader reader = Files.newBufferedReader(path,StandardCharsets.UTF_8))
+        {
+            String line;
+            while ((line = reader.readLine()) != null)
+            {
+                lines.add(line);
+            }
+        }
+
+        return lines;
+    }
+
+    private void saveLines(Path path, List<String> lines) throws IOException
+    {
+        try (BufferedWriter writer = Files.newBufferedWriter(path,StandardCharsets.UTF_8,StandardOpenOption.TRUNCATE_EXISTING))
+        {
+            for (String line : lines)
+            {
+                writer.write(line);
+                writer.write(System.lineSeparator());
+            }
+        }
+    }
+}
diff --git a/jetty-start/src/test/java/org/eclipse/jetty/start/util/RebuildTestResources.java b/jetty-start/src/test/java/org/eclipse/jetty/start/util/RebuildTestResources.java
new file mode 100644
index 0000000..d20fae3
--- /dev/null
+++ b/jetty-start/src/test/java/org/eclipse/jetty/start/util/RebuildTestResources.java
@@ -0,0 +1,197 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.start.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.PathMatcher;
+import java.nio.file.StandardCopyOption;
+import java.util.regex.Pattern;
+
+import org.eclipse.jetty.toolchain.test.FS;
+import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+
+/**
+ * Utility class to rebuild the src/test/resources/dist-home from the active build tree.
+ * <p>
+ * Not really meant to be run with each build. Nor is it a good idea to attempt to do that (as this would introduce a dependency from jetty-start ->
+ * jetty-distribution which is a circular dependency)
+ */
+public class RebuildTestResources
+{
+    public static final String JETTY_VERSION = "9.3";
+    
+    public static void main(String[] args)
+    {
+        File realDistHome = MavenTestingUtils.getProjectDir("../jetty-distribution/target/distribution");
+        File outputDir = MavenTestingUtils.getTestResourceDir("dist-home");
+        try
+        {
+            new RebuildTestResources(realDistHome,outputDir).rebuild();
+        }
+        catch (Throwable t)
+        {
+            t.printStackTrace();
+        }
+    }
+
+    private static interface FileCopier
+    {
+        public void copy(Path from, Path to) throws IOException;
+    }
+
+    private static class NormalFileCopier implements FileCopier
+    {
+        @Override
+        public void copy(Path from, Path to) throws IOException
+        {
+            Files.copy(from,to,StandardCopyOption.REPLACE_EXISTING);
+        }
+    }
+
+    private static class TouchFileCopier implements FileCopier
+    {
+        @Override
+        public void copy(Path from, Path to) throws IOException
+        {
+            if(Files.exists(to)) 
+            {
+                // skip if it exists
+                return;
+            }
+            Files.createFile(to);
+        }
+    }
+
+    private static interface Renamer
+    {
+        public String getName(Path path);
+    }
+
+    private static class NoRenamer implements Renamer
+    {
+        @Override
+        public String getName(Path path)
+        {
+            return path.getFileName().toString();
+        }
+    }
+
+    private static class RegexRenamer implements Renamer
+    {
+        private final Pattern pat;
+        private final String replacement;
+
+        public RegexRenamer(String regex, String replacement)
+        {
+            this.pat = Pattern.compile(regex);
+            this.replacement = replacement;
+        }
+
+        @Override
+        public String getName(Path path)
+        {
+            String origName = path.getFileName().toString();
+            return pat.matcher(origName).replaceAll(replacement);
+        }
+    }
+
+    private final Path destDir;
+    private final Path srcDir;
+
+    public RebuildTestResources(File realDistHome, File outputDir) throws IOException
+    {
+        this.srcDir = realDistHome.toPath().toRealPath();
+        this.destDir = outputDir.toPath();
+    }
+
+    private void copyLibs() throws IOException
+    {
+        System.out.println("Copying libs (lib dir) ...");
+        Path libsDir = destDir.resolve("lib");
+        FS.ensureDirExists(libsDir.toFile());
+
+        PathMatcher matcher = getPathMatcher("glob:**.jar");
+        Renamer renamer = new RegexRenamer("-9\\.[0-9.]*(v[0-9-]*)?(-SNAPSHOT)?(RC[0-9])?(M[0-9])?","-" + JETTY_VERSION);
+        FileCopier copier = new TouchFileCopier();
+        copyDir(srcDir.resolve("lib"),libsDir,matcher,renamer,copier);
+    }
+
+    private void copyModules() throws IOException
+    {
+        System.out.println("Copying modules ...");
+        Path modulesDir = destDir.resolve("modules");
+        FS.ensureDirExists(modulesDir.toFile());
+
+        PathMatcher matcher = getPathMatcher("glob:**.mod");
+        Renamer renamer = new NoRenamer();
+        FileCopier copier = new NormalFileCopier();
+        copyDir(srcDir.resolve("modules"),modulesDir,matcher,renamer,copier);
+    }
+
+    private void copyXmls() throws IOException
+    {
+        System.out.println("Copying xmls (etc dir) ...");
+        Path xmlDir = destDir.resolve("etc");
+        FS.ensureDirExists(xmlDir.toFile());
+
+        PathMatcher matcher = getPathMatcher("glob:**.xml");
+        Renamer renamer = new NoRenamer();
+        FileCopier copier = new TouchFileCopier();
+        copyDir(srcDir.resolve("etc"),xmlDir,matcher,renamer,copier);
+    }
+
+    private void rebuild() throws IOException
+    {
+        copyModules();
+        copyLibs();
+        copyXmls();
+        System.out.println("Done");
+    }
+
+    private PathMatcher getPathMatcher(String pattern)
+    {
+        return FileSystems.getDefault().getPathMatcher(pattern);
+    }
+
+    private void copyDir(Path from, Path to, PathMatcher fileMatcher, Renamer renamer, FileCopier copier) throws IOException
+    {
+        Files.createDirectories(to);
+
+        for (Path path : Files.newDirectoryStream(from))
+        {
+            String name = renamer.getName(path);
+            Path dest = to.resolve(name);
+            if (Files.isDirectory(path))
+            {
+                copyDir(path,dest,fileMatcher,renamer,copier);
+            }
+            else
+            {
+                if (fileMatcher.matches(path))
+                {
+                    copier.copy(path,dest);
+                }
+            }
+        }
+    }
+}
diff --git a/jetty-start/src/test/resources/assert-home-with-http2.txt b/jetty-start/src/test/resources/assert-home-with-http2.txt
new file mode 100644
index 0000000..f02d164
--- /dev/null
+++ b/jetty-start/src/test/resources/assert-home-with-http2.txt
@@ -0,0 +1,83 @@
+# The XMLs we expect (order is important)
+XML|${jetty.base}/etc/home-base-warning.xml
+XML|${jetty.base}/etc/jetty.xml
+XML|${jetty.base}/etc/jetty-http.xml
+XML|${jetty.base}/etc/jetty-ssl.xml
+XML|${jetty.base}/etc/jetty-ssl-context.xml
+XML|${jetty.base}/etc/jetty-alpn.xml
+XML|${jetty.base}/etc/jetty-deploy.xml
+XML|${jetty.base}/etc/jetty-http2.xml
+XML|${jetty.base}/etc/jetty-plus.xml
+XML|${jetty.base}/etc/jetty-annotations.xml
+
+# The LIBs we expect (order is irrelevant)
+LIB|${jetty.base}/lib/apache-jsp/org.eclipse.jetty.apache-jsp-9.3.jar
+LIB|${jetty.base}/lib/apache-jsp/org.eclipse.jetty.orbit.org.eclipse.jdt.core-3.8.2.v20130121.jar
+LIB|${jetty.base}/lib/apache-jsp/org.mortbay.jasper.apache-el-8.0.20.M0.jar
+LIB|${jetty.base}/lib/apache-jsp/org.mortbay.jasper.apache-jsp-8.0.20.M0.jar
+LIB|${jetty.base}/lib/apache-jstl/org.apache.taglibs.taglibs-standard-impl-1.2.1.jar
+LIB|${jetty.base}/lib/apache-jstl/org.apache.taglibs.taglibs-standard-spec-1.2.1.jar
+LIB|${jetty.base}/lib/jndi/javax.mail.glassfish-1.4.1.v201005082020.jar
+LIB|${jetty.base}/lib/jndi/javax.transaction-api-1.2.jar
+LIB|${jetty.base}/lib/annotations/asm-5.0.1.jar
+LIB|${jetty.base}/lib/annotations/asm-commons-5.0.1.jar
+LIB|${jetty.base}/lib/annotations/javax.annotation-api-1.2.jar
+LIB|${jetty.base}/lib/websocket/javax.websocket-api-1.0.jar
+LIB|${jetty.base}/lib/websocket/javax-websocket-client-impl-9.3.jar
+LIB|${jetty.base}/lib/websocket/javax-websocket-server-impl-9.3.jar
+LIB|${jetty.base}/lib/websocket/websocket-api-9.3.jar
+LIB|${jetty.base}/lib/websocket/websocket-client-9.3.jar
+LIB|${jetty.base}/lib/websocket/websocket-common-9.3.jar
+LIB|${jetty.base}/lib/websocket/websocket-server-9.3.jar
+LIB|${jetty.base}/lib/websocket/websocket-servlet-9.3.jar
+LIB|${jetty.base}/lib/jetty-alpn-server-9.3.jar
+LIB|${jetty.base}/lib/jetty-schemas-3.1.jar
+LIB|${jetty.base}/lib/http2/http2-common-9.3.jar
+LIB|${jetty.base}/lib/http2/http2-hpack-9.3.jar
+LIB|${jetty.base}/lib/http2/http2-server-9.3.jar
+LIB|${jetty.base}/lib/servlet-api-3.1.jar
+LIB|${jetty.base}/lib/jetty-annotations-9.3.jar
+LIB|${jetty.base}/lib/jetty-http-9.3.jar
+LIB|${jetty.base}/lib/jetty-io-9.3.jar
+LIB|${jetty.base}/lib/jetty-deploy-9.3.jar
+LIB|${jetty.base}/lib/jetty-plus-9.3.jar
+LIB|${jetty.base}/lib/jetty-schemas-3.1.jar
+LIB|${jetty.base}/lib/jetty-security-9.3.jar
+LIB|${jetty.base}/lib/jetty-server-9.3.jar
+LIB|${jetty.base}/lib/jetty-servlet-9.3.jar
+LIB|${jetty.base}/lib/jetty-util-9.3.jar
+LIB|${jetty.base}/lib/jetty-webapp-9.3.jar
+LIB|${jetty.base}/lib/jetty-xml-9.3.jar
+LIB|${jetty.base}/lib/jetty-jndi-9.3.jar
+
+
+# The Properties we expect (order is irrelevant)
+# (these are the properties we actually set in the configuration)
+# PROP|java.version=1.8.0_31
+PROP|jetty.http.port=8080
+PROP|jetty.httpConfig.delayDispatchUntilContent=false
+PROP|jetty.server.dumpAfterStart=false
+PROP|jetty.server.dumpBeforeStop=false
+PROP|jetty.httpConfig.outputBufferSize=32768
+PROP|jetty.httpConfig.requestHeaderSize=8192
+PROP|jetty.httpConfig.responseHeaderSize=8192
+PROP|jetty.httpConfig.sendDateHeader=false
+PROP|jetty.httpConfig.sendServerVersion=true
+PROP|jetty.threadPool.maxThreads=200
+PROP|jetty.threadPool.minThreads=10
+PROP|jetty.threadPool.idleTimeout=60000
+
+# JVM Args
+JVM|-Xms1024m
+JVM|-Xmx1024m
+
+# Downloads
+DOWNLOAD|maven://org.mortbay.jetty.alpn/alpn-boot/8.1.3.v20150130|lib/alpn/alpn-boot-8.1.3.v20150130.jar
+DOWNLOAD|http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/plain/jetty-server/src/test/config/etc/keystore?id=master|etc/keystore
+
+# Files
+FILE|lib/
+FILE|lib/ext/
+FILE|lib/alpn/
+FILE|resources/
+FILE|webapps/
diff --git a/jetty-start/src/test/resources/assert-home-with-jvm.txt b/jetty-start/src/test/resources/assert-home-with-jvm.txt
index 9774d97..871aa8d 100644
--- a/jetty-start/src/test/resources/assert-home-with-jvm.txt
+++ b/jetty-start/src/test/resources/assert-home-with-jvm.txt
@@ -1,44 +1,75 @@
 # The XMLs we expect (order is important)
-XML|${jetty.base}/etc/jetty-jmx.xml
+XML|${jetty.base}/etc/home-base-warning.xml
 XML|${jetty.base}/etc/jetty.xml
 XML|${jetty.base}/etc/jetty-http.xml
+XML|${jetty.base}/etc/jetty-deploy.xml
 XML|${jetty.base}/etc/jetty-plus.xml
 XML|${jetty.base}/etc/jetty-annotations.xml
-XML|${jetty.base}/etc/jetty-websockets.xml
+XML|${jetty.base}/etc/jetty-jmx.xml
 XML|${jetty.base}/etc/jetty-logging.xml
 
 # The LIBs we expect (order is irrelevant)
-LIB|${jetty.base}/lib/annotations/javax.annotation-api-1.2.jar
-LIB|${jetty.base}/lib/annotations/org.objectweb.asm-TEST.jar
-LIB|${jetty.base}/lib/jetty-annotations-TEST.jar
-LIB|${jetty.base}/lib/jetty-continuation-TEST.jar
-LIB|${jetty.base}/lib/jetty-http-TEST.jar
-LIB|${jetty.base}/lib/jetty-io-TEST.jar
-LIB|${jetty.base}/lib/jetty-jmx-TEST.jar
-LIB|${jetty.base}/lib/jetty-jndi-TEST.jar
-LIB|${jetty.base}/lib/jetty-plus-TEST.jar
-LIB|${jetty.base}/lib/jetty-schemas-3.1.jar
-LIB|${jetty.base}/lib/jetty-security-TEST.jar
-LIB|${jetty.base}/lib/jetty-server-TEST.jar
-LIB|${jetty.base}/lib/jetty-util-TEST.jar
-LIB|${jetty.base}/lib/jetty-xml-TEST.jar
-LIB|${jetty.base}/lib/jndi/javax.activation-1.1.jar
-LIB|${jetty.base}/lib/jndi/javax.transaction-api-1.2.jar
-LIB|${jetty.base}/lib/servlet-api-3.1.jar
-LIB|${jetty.base}/lib/websocket/javax.websocket-api-1.0.jar
-LIB|${jetty.base}/lib/websocket/javax-websocket-client-impl-TEST.jar
-LIB|${jetty.base}/lib/websocket/javax-websocket-server-impl-TEST.jar
-LIB|${jetty.base}/lib/websocket/websocket-api-TEST.jar
-LIB|${jetty.base}/lib/websocket/websocket-client-TEST.jar
-LIB|${jetty.base}/lib/websocket/websocket-common-TEST.jar
-LIB|${jetty.base}/lib/websocket/websocket-server-TEST.jar
-LIB|${jetty.base}/lib/websocket/websocket-servlet-TEST.jar
 LIB|${maven-test-resources}/extra-resources
 LIB|${maven-test-resources}/extra-libs/example.jar
+LIB|${jetty.base}/lib/apache-jsp/org.eclipse.jetty.apache-jsp-9.3.jar
+LIB|${jetty.base}/lib/apache-jsp/org.eclipse.jetty.orbit.org.eclipse.jdt.core-3.8.2.v20130121.jar
+LIB|${jetty.base}/lib/apache-jsp/org.mortbay.jasper.apache-el-8.0.20.M0.jar
+LIB|${jetty.base}/lib/apache-jsp/org.mortbay.jasper.apache-jsp-8.0.20.M0.jar
+LIB|${jetty.base}/lib/apache-jstl/org.apache.taglibs.taglibs-standard-impl-1.2.1.jar
+LIB|${jetty.base}/lib/apache-jstl/org.apache.taglibs.taglibs-standard-spec-1.2.1.jar
+LIB|${jetty.base}/lib/servlet-api-3.1.jar
+LIB|${jetty.base}/lib/jetty-schemas-3.1.jar
+LIB|${jetty.base}/lib/jndi/javax.mail.glassfish-1.4.1.v201005082020.jar
+LIB|${jetty.base}/lib/jndi/javax.transaction-api-1.2.jar
+LIB|${jetty.base}/lib/annotations/asm-5.0.1.jar
+LIB|${jetty.base}/lib/annotations/asm-commons-5.0.1.jar
+LIB|${jetty.base}/lib/annotations/javax.annotation-api-1.2.jar
+LIB|${jetty.base}/lib/websocket/javax.websocket-api-1.0.jar
+LIB|${jetty.base}/lib/websocket/javax-websocket-client-impl-9.3.jar
+LIB|${jetty.base}/lib/websocket/javax-websocket-server-impl-9.3.jar
+LIB|${jetty.base}/lib/websocket/websocket-api-9.3.jar
+LIB|${jetty.base}/lib/websocket/websocket-client-9.3.jar
+LIB|${jetty.base}/lib/websocket/websocket-common-9.3.jar
+LIB|${jetty.base}/lib/websocket/websocket-server-9.3.jar
+LIB|${jetty.base}/lib/websocket/websocket-servlet-9.3.jar
+LIB|${jetty.base}/lib/jetty-annotations-9.3.jar
+LIB|${jetty.base}/lib/jetty-http-9.3.jar
+LIB|${jetty.base}/lib/jetty-io-9.3.jar
+LIB|${jetty.base}/lib/jetty-deploy-9.3.jar
+LIB|${jetty.base}/lib/jetty-plus-9.3.jar
+LIB|${jetty.base}/lib/jetty-schemas-3.1.jar
+LIB|${jetty.base}/lib/jetty-security-9.3.jar
+LIB|${jetty.base}/lib/jetty-server-9.3.jar
+LIB|${jetty.base}/lib/jetty-servlet-9.3.jar
+LIB|${jetty.base}/lib/jetty-util-9.3.jar
+LIB|${jetty.base}/lib/jetty-webapp-9.3.jar
+LIB|${jetty.base}/lib/jetty-xml-9.3.jar
+LIB|${jetty.base}/lib/jetty-jndi-9.3.jar
+
 
 # The Properties we expect (order is irrelevant)
-# PROP|jetty.port=9090
+# (these are the properties we actually set in the configuration)
+# PROP|jetty.http.port=8080
+# (these are the ones set by default from jetty.home modules)
+PROP|jetty.http.port=8080
+PROP|jetty.httpConfig.delayDispatchUntilContent=false
+PROP|jetty.server.dumpAfterStart=false
+PROP|jetty.server.dumpBeforeStop=false
+PROP|jetty.httpConfig.outputBufferSize=32768
+PROP|jetty.httpConfig.requestHeaderSize=8192
+PROP|jetty.httpConfig.responseHeaderSize=8192
+PROP|jetty.httpConfig.sendDateHeader=false
+PROP|jetty.httpConfig.sendServerVersion=true
+PROP|jetty.threadPool.maxThreads=200
+PROP|jetty.threadPool.minThreads=10
+PROP|jetty.threadPool.idleTimeout=60000
 
 # JVM Args
 JVM|-Xms1024m
 JVM|-Xmx1024m
+
+# Files / Directories to create
+FILE|lib/
+FILE|lib/ext/
+FILE|resources/
+FILE|webapps/
diff --git a/jetty-start/src/test/resources/assert-home-with-spdy.txt b/jetty-start/src/test/resources/assert-home-with-spdy.txt
deleted file mode 100644
index aa5aea9..0000000
--- a/jetty-start/src/test/resources/assert-home-with-spdy.txt
+++ /dev/null
@@ -1,72 +0,0 @@
-# The XMLs we expect (order is important)
-XML|${jetty.base}/etc/jetty-jmx.xml
-XML|${jetty.base}/etc/protonego-alpn.xml
-XML|${jetty.base}/etc/jetty.xml
-XML|${jetty.base}/etc/jetty-http.xml
-XML|${jetty.base}/etc/jetty-ssl.xml
-XML|${jetty.base}/etc/jetty-plus.xml
-XML|${jetty.base}/etc/jetty-spdy.xml
-XML|${jetty.base}/etc/jetty-annotations.xml
-XML|${jetty.base}/etc/jetty-deploy.xml
-XML|${jetty.base}/etc/jetty-websockets.xml
-
-# The LIBs we expect (order is irrelevant)
-LIB|${jetty.base}/lib/annotations/javax.annotation-api-1.2.jar
-LIB|${jetty.base}/lib/annotations/org.objectweb.asm-TEST.jar
-LIB|${jetty.base}/lib/jetty-annotations-TEST.jar
-LIB|${jetty.base}/lib/jetty-continuation-TEST.jar
-LIB|${jetty.base}/lib/jetty-http-TEST.jar
-LIB|${jetty.base}/lib/jetty-io-TEST.jar
-LIB|${jetty.base}/lib/jetty-deploy-TEST.jar
-LIB|${jetty.base}/lib/jetty-jmx-TEST.jar
-LIB|${jetty.base}/lib/jetty-jndi-TEST.jar
-LIB|${jetty.base}/lib/jetty-plus-TEST.jar
-LIB|${jetty.base}/lib/jetty-schemas-3.1.jar
-LIB|${jetty.base}/lib/jetty-security-TEST.jar
-LIB|${jetty.base}/lib/jetty-server-TEST.jar
-LIB|${jetty.base}/lib/jetty-servlet-TEST.jar
-LIB|${jetty.base}/lib/jetty-util-TEST.jar
-LIB|${jetty.base}/lib/jetty-webapp-TEST.jar
-LIB|${jetty.base}/lib/jetty-xml-TEST.jar
-LIB|${jetty.base}/lib/spdy/spdy-client-TEST.jar
-LIB|${jetty.base}/lib/spdy/spdy-core-TEST.jar
-LIB|${jetty.base}/lib/spdy/spdy-http-common-TEST.jar
-LIB|${jetty.base}/lib/spdy/spdy-http-server-TEST.jar
-LIB|${jetty.base}/lib/spdy/spdy-server-TEST.jar
-LIB|${jetty.base}/lib/jndi/javax.activation-1.1.jar
-LIB|${jetty.base}/lib/jndi/javax.transaction-api-1.2.jar
-LIB|${jetty.base}/lib/servlet-api-3.1.jar
-LIB|${jetty.base}/lib/websocket/javax.websocket-api-1.0.jar
-LIB|${jetty.base}/lib/websocket/javax-websocket-client-impl-TEST.jar
-LIB|${jetty.base}/lib/websocket/javax-websocket-server-impl-TEST.jar
-LIB|${jetty.base}/lib/websocket/websocket-api-TEST.jar
-LIB|${jetty.base}/lib/websocket/websocket-client-TEST.jar
-LIB|${jetty.base}/lib/websocket/websocket-common-TEST.jar
-LIB|${jetty.base}/lib/websocket/websocket-server-TEST.jar
-LIB|${jetty.base}/lib/websocket/websocket-servlet-TEST.jar
-
-# The Properties we expect (order is irrelevant)
-PROP|java.version=1.7.0_60
-PROP|jetty.keymanager.password=OBF:1u2u1wml1z7s1z7a1wnl1u2g
-PROP|jetty.keystore=etc/keystore
-PROP|jetty.keystore.password=OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
-PROP|jetty.secure.port=8443
-PROP|jetty.truststore=etc/keystore
-PROP|jetty.truststore.password=OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
-PROP|protonego=alpn
-PROP|spdy.port=8443
-PROP|spdy.timeout=30000
-
-# JVM Args
-JVM|-Xms1024m
-JVM|-Xmx1024m
-
-# Downloads
-DOWNLOAD|http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-DOWNLOAD|http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/plain/jetty-server/src/main/config/etc/keystore|etc/keystore
-
-# Files
-FILE|lib/
-FILE|lib/alpn/
-
-
diff --git a/jetty-start/src/test/resources/assert-home.txt b/jetty-start/src/test/resources/assert-home.txt
index 5be8d46..70515e3 100644
--- a/jetty-start/src/test/resources/assert-home.txt
+++ b/jetty-start/src/test/resources/assert-home.txt
@@ -1,37 +1,64 @@
 # The XMLs we expect (order is important)
-XML|${jetty.base}/etc/jetty-jmx.xml
+XML|${jetty.base}/etc/home-base-warning.xml
 XML|${jetty.base}/etc/jetty.xml
 XML|${jetty.base}/etc/jetty-http.xml
+XML|${jetty.base}/etc/jetty-deploy.xml
 XML|${jetty.base}/etc/jetty-plus.xml
 XML|${jetty.base}/etc/jetty-annotations.xml
-XML|${jetty.base}/etc/jetty-websockets.xml
 
 # The LIBs we expect (order is irrelevant)
+LIB|${jetty.base}/lib/apache-jsp/org.eclipse.jetty.apache-jsp-9.3.jar
+LIB|${jetty.base}/lib/apache-jsp/org.eclipse.jetty.orbit.org.eclipse.jdt.core-3.8.2.v20130121.jar
+LIB|${jetty.base}/lib/apache-jsp/org.mortbay.jasper.apache-el-8.0.20.M0.jar
+LIB|${jetty.base}/lib/apache-jsp/org.mortbay.jasper.apache-jsp-8.0.20.M0.jar
+LIB|${jetty.base}/lib/apache-jstl/org.apache.taglibs.taglibs-standard-impl-1.2.1.jar
+LIB|${jetty.base}/lib/apache-jstl/org.apache.taglibs.taglibs-standard-spec-1.2.1.jar
+LIB|${jetty.base}/lib/annotations/asm-5.0.1.jar
+LIB|${jetty.base}/lib/annotations/asm-commons-5.0.1.jar
 LIB|${jetty.base}/lib/annotations/javax.annotation-api-1.2.jar
-LIB|${jetty.base}/lib/annotations/org.objectweb.asm-TEST.jar
-LIB|${jetty.base}/lib/jetty-annotations-TEST.jar
-LIB|${jetty.base}/lib/jetty-continuation-TEST.jar
-LIB|${jetty.base}/lib/jetty-http-TEST.jar
-LIB|${jetty.base}/lib/jetty-io-TEST.jar
-LIB|${jetty.base}/lib/jetty-jmx-TEST.jar
-LIB|${jetty.base}/lib/jetty-jndi-TEST.jar
-LIB|${jetty.base}/lib/jetty-plus-TEST.jar
-LIB|${jetty.base}/lib/jetty-schemas-3.1.jar
-LIB|${jetty.base}/lib/jetty-security-TEST.jar
-LIB|${jetty.base}/lib/jetty-server-TEST.jar
-LIB|${jetty.base}/lib/jetty-util-TEST.jar
-LIB|${jetty.base}/lib/jetty-xml-TEST.jar
-LIB|${jetty.base}/lib/jndi/javax.activation-1.1.jar
+LIB|${jetty.base}/lib/jetty-jndi-9.3.jar
+LIB|${jetty.base}/lib/jndi/javax.mail.glassfish-1.4.1.v201005082020.jar
 LIB|${jetty.base}/lib/jndi/javax.transaction-api-1.2.jar
+LIB|${jetty.base}/lib/jetty-annotations-9.3.jar
+LIB|${jetty.base}/lib/jetty-http-9.3.jar
+LIB|${jetty.base}/lib/jetty-io-9.3.jar
+LIB|${jetty.base}/lib/jetty-deploy-9.3.jar
+LIB|${jetty.base}/lib/jetty-plus-9.3.jar
+LIB|${jetty.base}/lib/jetty-schemas-3.1.jar
+LIB|${jetty.base}/lib/jetty-security-9.3.jar
+LIB|${jetty.base}/lib/jetty-server-9.3.jar
+LIB|${jetty.base}/lib/jetty-servlet-9.3.jar
+LIB|${jetty.base}/lib/jetty-util-9.3.jar
+LIB|${jetty.base}/lib/jetty-webapp-9.3.jar
+LIB|${jetty.base}/lib/jetty-xml-9.3.jar
 LIB|${jetty.base}/lib/servlet-api-3.1.jar
 LIB|${jetty.base}/lib/websocket/javax.websocket-api-1.0.jar
-LIB|${jetty.base}/lib/websocket/javax-websocket-client-impl-TEST.jar
-LIB|${jetty.base}/lib/websocket/javax-websocket-server-impl-TEST.jar
-LIB|${jetty.base}/lib/websocket/websocket-api-TEST.jar
-LIB|${jetty.base}/lib/websocket/websocket-client-TEST.jar
-LIB|${jetty.base}/lib/websocket/websocket-common-TEST.jar
-LIB|${jetty.base}/lib/websocket/websocket-server-TEST.jar
-LIB|${jetty.base}/lib/websocket/websocket-servlet-TEST.jar
+LIB|${jetty.base}/lib/websocket/javax-websocket-client-impl-9.3.jar
+LIB|${jetty.base}/lib/websocket/javax-websocket-server-impl-9.3.jar
+LIB|${jetty.base}/lib/websocket/websocket-api-9.3.jar
+LIB|${jetty.base}/lib/websocket/websocket-client-9.3.jar
+LIB|${jetty.base}/lib/websocket/websocket-common-9.3.jar
+LIB|${jetty.base}/lib/websocket/websocket-server-9.3.jar
+LIB|${jetty.base}/lib/websocket/websocket-servlet-9.3.jar
 
 # The Properties we expect (order is irrelevant)
-PROP|jetty.port=9090
+# (these are the properties we actually set in the configuration)
+PROP|jetty.http.port=8080
+# (these are the ones set by default from jetty.home modules)
+PROP|jetty.httpConfig.delayDispatchUntilContent=false
+PROP|jetty.server.dumpAfterStart=false
+PROP|jetty.server.dumpBeforeStop=false
+PROP|jetty.httpConfig.outputBufferSize=32768
+PROP|jetty.httpConfig.requestHeaderSize=8192
+PROP|jetty.httpConfig.responseHeaderSize=8192
+PROP|jetty.httpConfig.sendDateHeader=false
+PROP|jetty.httpConfig.sendServerVersion=true
+PROP|jetty.threadPool.maxThreads=200
+PROP|jetty.threadPool.minThreads=10
+PROP|jetty.threadPool.idleTimeout=60000
+
+# Files
+FILE|lib/
+FILE|lib/ext/
+FILE|resources/
+FILE|webapps/
diff --git a/jetty-start/src/test/resources/dist-home/etc/protonego-alpn.xml b/jetty-start/src/test/resources/dist-home/etc/jetty-alpn.xml
similarity index 100%
rename from jetty-start/src/test/resources/dist-home/etc/protonego-alpn.xml
rename to jetty-start/src/test/resources/dist-home/etc/jetty-alpn.xml
diff --git a/jetty-start/src/test/resources/dist-home/etc/jetty-debug.xml b/jetty-start/src/test/resources/dist-home/etc/jetty-debuglog.xml
similarity index 100%
rename from jetty-start/src/test/resources/dist-home/etc/jetty-debug.xml
rename to jetty-start/src/test/resources/dist-home/etc/jetty-debuglog.xml
diff --git a/jetty-start/src/test/resources/dist-home/etc/jetty-spdy.xml b/jetty-start/src/test/resources/dist-home/etc/jetty-gzip.xml
similarity index 100%
rename from jetty-start/src/test/resources/dist-home/etc/jetty-spdy.xml
rename to jetty-start/src/test/resources/dist-home/etc/jetty-gzip.xml
diff --git a/jetty-start/src/test/resources/dist-home/etc/jetty-debug.xml b/jetty-start/src/test/resources/dist-home/etc/jetty-http2.xml
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/etc/jetty-debug.xml
copy to jetty-start/src/test/resources/dist-home/etc/jetty-http2.xml
diff --git a/jetty-start/src/test/resources/dist-home/etc/jetty-debug.xml b/jetty-start/src/test/resources/dist-home/etc/jetty-http2c.xml
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/etc/jetty-debug.xml
copy to jetty-start/src/test/resources/dist-home/etc/jetty-http2c.xml
diff --git a/jetty-start/src/test/resources/dist-home/etc/protonego-alpn.xml b/jetty-start/src/test/resources/dist-home/etc/jetty-infinispan.xml
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/etc/protonego-alpn.xml
copy to jetty-start/src/test/resources/dist-home/etc/jetty-infinispan.xml
diff --git a/jetty-start/src/test/resources/dist-home/etc/jetty-debug.xml b/jetty-start/src/test/resources/dist-home/etc/jetty-jdbc-sessions.xml
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/etc/jetty-debug.xml
copy to jetty-start/src/test/resources/dist-home/etc/jetty-jdbc-sessions.xml
diff --git a/jetty-start/src/test/resources/dist-home/etc/jetty-debug.xml b/jetty-start/src/test/resources/dist-home/etc/jetty-nosql.xml
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/etc/jetty-debug.xml
copy to jetty-start/src/test/resources/dist-home/etc/jetty-nosql.xml
diff --git a/jetty-start/src/test/resources/dist-home/etc/jetty-spdy-proxy.xml b/jetty-start/src/test/resources/dist-home/etc/jetty-spdy-proxy.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/etc/jetty-spdy-proxy.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/etc/jetty-debug.xml b/jetty-start/src/test/resources/dist-home/etc/jetty-ssl-context.xml
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/etc/jetty-debug.xml
copy to jetty-start/src/test/resources/dist-home/etc/jetty-ssl-context.xml
diff --git a/jetty-start/src/test/resources/dist-home/etc/jetty-xinetd.xml b/jetty-start/src/test/resources/dist-home/etc/jetty-xinetd.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/etc/jetty-xinetd.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/etc/protonego-npn.xml b/jetty-start/src/test/resources/dist-home/etc/protonego-npn.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/etc/protonego-npn.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/apache-jsp/org.mortbay.jasper.apache-el-8.0.9.M3.jar b/jetty-start/src/test/resources/dist-home/lib/apache-jsp/org.eclipse.jetty.apache-jsp-9.3.jar
similarity index 100%
rename from jetty-start/src/test/resources/dist-home/lib/apache-jsp/org.mortbay.jasper.apache-el-8.0.9.M3.jar
rename to jetty-start/src/test/resources/dist-home/lib/apache-jsp/org.eclipse.jetty.apache-jsp-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/apache-jsp/org.eclipse.jetty.apache-jsp-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/apache-jsp/org.mortbay.jasper.apache-el-8.0.20.M0.jar
similarity index 100%
rename from jetty-start/src/test/resources/dist-home/lib/apache-jsp/org.eclipse.jetty.apache-jsp-TEST.jar
rename to jetty-start/src/test/resources/dist-home/lib/apache-jsp/org.mortbay.jasper.apache-el-8.0.20.M0.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/apache-jsp/org.eclipse.jetty.apache-jsp-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/apache-jsp/org.mortbay.jasper.apache-jsp-8.0.20.M0.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/apache-jsp/org.eclipse.jetty.apache-jsp-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/apache-jsp/org.mortbay.jasper.apache-jsp-8.0.20.M0.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/apache-jsp/org.mortbay.jasper.apache-jsp-8.0.9.M3.jar b/jetty-start/src/test/resources/dist-home/lib/apache-jsp/org.mortbay.jasper.apache-jsp-8.0.9.M3.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/apache-jsp/org.mortbay.jasper.apache-jsp-8.0.9.M3.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/cdi-core-9.3.jar
similarity index 100%
rename from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
rename to jetty-start/src/test/resources/dist-home/lib/cdi-core-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/cdi-servlet-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/cdi-servlet-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/cdi-websocket-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/cdi-websocket-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/fcgi/fcgi-client-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/fcgi/fcgi-client-9.3.jar
similarity index 100%
rename from jetty-start/src/test/resources/dist-home/lib/fcgi/fcgi-client-TEST.jar
rename to jetty-start/src/test/resources/dist-home/lib/fcgi/fcgi-client-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/fcgi/fcgi-client-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/fcgi/fcgi-server-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/fcgi/fcgi-client-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/fcgi/fcgi-server-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/fcgi/fcgi-server-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/fcgi/fcgi-server-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/fcgi/fcgi-server-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jsp/jetty-jsp-jdt-2.3.3.jar b/jetty-start/src/test/resources/dist-home/lib/http2/http2-common-9.3.jar
similarity index 100%
rename from jetty-start/src/test/resources/dist-home/lib/jsp/jetty-jsp-jdt-2.3.3.jar
rename to jetty-start/src/test/resources/dist-home/lib/http2/http2-common-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jsp/jetty-jsp-jdt-2.3.3.jar b/jetty-start/src/test/resources/dist-home/lib/http2/http2-hpack-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jsp/jetty-jsp-jdt-2.3.3.jar
copy to jetty-start/src/test/resources/dist-home/lib/http2/http2-hpack-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jsp/jetty-jsp-jdt-2.3.3.jar b/jetty-start/src/test/resources/dist-home/lib/http2/http2-server-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jsp/jetty-jsp-jdt-2.3.3.jar
copy to jetty-start/src/test/resources/dist-home/lib/http2/http2-server-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-alpn-server-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-alpn-server-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-alpn-server-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-alpn-server-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-alpn-server-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-annotations-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-annotations-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-annotations-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-annotations-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-annotations-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-client-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-client-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-client-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-client-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-client-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-alpn-client-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-continuation-9.3.jar
similarity index 100%
rename from jetty-start/src/test/resources/dist-home/lib/jetty-alpn-client-TEST.jar
rename to jetty-start/src/test/resources/dist-home/lib/jetty-continuation-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-continuation-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-continuation-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-continuation-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-deploy-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-deploy-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-deploy-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-deploy-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-deploy-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-http-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-http-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-http-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-http-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-http-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-infinispan-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-infinispan-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-io-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-io-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-io-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-io-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-io-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-jaas-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-jaas-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-jaas-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-jaas-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-jaas-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-jaspi-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-jaspi-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-jaspi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-jaspi-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-jaspi-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-jmx-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-jmx-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-jmx-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-jmx-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-jmx-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-jndi-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-jndi-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-jndi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-jndi-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-jndi-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-nosql-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-nosql-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-plus-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-plus-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-plus-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-plus-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-plus-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-proxy-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-proxy-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-proxy-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-proxy-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-proxy-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-quickstart-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-quickstart-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-quickstart-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-quickstart-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-quickstart-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-rewrite-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-rewrite-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-rewrite-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-rewrite-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-rewrite-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-security-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-security-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-security-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-security-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-security-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-server-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-server-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-server-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-server-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-server-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-servlet-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-servlet-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-servlet-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-servlet-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-servlet-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-servlets-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-servlets-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-servlets-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-servlets-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-servlets-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-util-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-util-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-util-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-util-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-util-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-webapp-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-webapp-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-webapp-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-webapp-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-webapp-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-xml-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/jetty-cdi-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/jetty-xml-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/jetty-xml-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/jetty-xml-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jetty-xml-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jsp/javax.el-3.0.0.jar b/jetty-start/src/test/resources/dist-home/lib/jsp/javax.el-3.0.0.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jsp/javax.el-3.0.0.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jsp/javax.servlet.jsp-2.3.2.jar b/jetty-start/src/test/resources/dist-home/lib/jsp/javax.servlet.jsp-2.3.2.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jsp/javax.servlet.jsp-2.3.2.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jsp/javax.servlet.jsp-api-2.3.1.jar b/jetty-start/src/test/resources/dist-home/lib/jsp/javax.servlet.jsp-api-2.3.1.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jsp/javax.servlet.jsp-api-2.3.1.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jsp/javax.servlet.jsp.jstl-1.2.2.jar b/jetty-start/src/test/resources/dist-home/lib/jsp/javax.servlet.jsp.jstl-1.2.2.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jsp/javax.servlet.jsp.jstl-1.2.2.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jsp/org.eclipse.jdt.core-3.8.2.v20130121.jar b/jetty-start/src/test/resources/dist-home/lib/jsp/org.eclipse.jdt.core-3.8.2.v20130121.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jsp/org.eclipse.jdt.core-3.8.2.v20130121.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/jsp/org.eclipse.jetty.orbit.javax.servlet.jsp.jstl-1.2.0.v201105211821.jar b/jetty-start/src/test/resources/dist-home/lib/jsp/org.eclipse.jetty.orbit.javax.servlet.jsp.jstl-1.2.0.v201105211821.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/jsp/org.eclipse.jetty.orbit.javax.servlet.jsp.jstl-1.2.0.v201105211821.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/monitor/jetty-monitor-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/monitor/jetty-monitor-9.3.jar
similarity index 100%
rename from jetty-start/src/test/resources/dist-home/lib/monitor/jetty-monitor-TEST.jar
rename to jetty-start/src/test/resources/dist-home/lib/monitor/jetty-monitor-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/setuid/jetty-setuid-java-1.0.1.jar b/jetty-start/src/test/resources/dist-home/lib/setuid/jetty-setuid-java-1.0.3.jar
similarity index 100%
rename from jetty-start/src/test/resources/dist-home/lib/setuid/jetty-setuid-java-1.0.1.jar
rename to jetty-start/src/test/resources/dist-home/lib/setuid/jetty-setuid-java-1.0.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/spdy/spdy-client-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/spdy/spdy-client-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/spdy/spdy-client-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/spdy/spdy-core-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/spdy/spdy-core-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/spdy/spdy-core-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/spdy/spdy-http-common-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/spdy/spdy-http-common-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/spdy/spdy-http-common-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/spdy/spdy-http-server-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/spdy/spdy-http-server-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/spdy/spdy-http-server-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/spdy/spdy-server-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/spdy/spdy-server-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/spdy/spdy-server-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/spring/jetty-spring-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/spring/jetty-spring-9.3.jar
similarity index 100%
rename from jetty-start/src/test/resources/dist-home/lib/spring/jetty-spring-TEST.jar
rename to jetty-start/src/test/resources/dist-home/lib/spring/jetty-spring-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/websocket/javax-websocket-client-impl-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/websocket/javax-websocket-client-impl-9.3.jar
similarity index 100%
rename from jetty-start/src/test/resources/dist-home/lib/websocket/javax-websocket-client-impl-TEST.jar
rename to jetty-start/src/test/resources/dist-home/lib/websocket/javax-websocket-client-impl-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/websocket/javax-websocket-client-impl-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/websocket/javax-websocket-server-impl-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/websocket/javax-websocket-client-impl-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/websocket/javax-websocket-server-impl-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/websocket/javax-websocket-server-impl-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/websocket/javax-websocket-server-impl-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/websocket/javax-websocket-server-impl-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-api-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-api-9.3.jar
similarity index 100%
rename from jetty-start/src/test/resources/dist-home/lib/websocket/websocket-api-TEST.jar
rename to jetty-start/src/test/resources/dist-home/lib/websocket/websocket-api-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-api-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-client-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/websocket/websocket-api-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/websocket/websocket-client-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-client-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-client-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-client-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-api-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-common-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/websocket/websocket-api-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/websocket/websocket-common-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-common-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-common-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-common-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-api-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-server-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/websocket/websocket-api-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/websocket/websocket-server-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-server-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-server-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-server-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-api-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-servlet-9.3.jar
similarity index 100%
copy from jetty-start/src/test/resources/dist-home/lib/websocket/websocket-api-TEST.jar
copy to jetty-start/src/test/resources/dist-home/lib/websocket/websocket-servlet-9.3.jar
diff --git a/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-servlet-TEST.jar b/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-servlet-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/dist-home/lib/websocket/websocket-servlet-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0.mod b/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0.mod
new file mode 100644
index 0000000..cb91b4c
--- /dev/null
+++ b/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0.mod
@@ -0,0 +1,8 @@
+[name]
+alpn-boot
+
+[files]
+maven://org.mortbay.jetty.alpn/alpn-boot/8.1.0.v20141016|lib/alpn/alpn-boot-8.1.0.v20141016.jar
+
+[exec]
+-Xbootclasspath/p:lib/alpn/alpn-boot-8.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_05.mod b/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_05.mod
new file mode 100644
index 0000000..cb91b4c
--- /dev/null
+++ b/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_05.mod
@@ -0,0 +1,8 @@
+[name]
+alpn-boot
+
+[files]
+maven://org.mortbay.jetty.alpn/alpn-boot/8.1.0.v20141016|lib/alpn/alpn-boot-8.1.0.v20141016.jar
+
+[exec]
+-Xbootclasspath/p:lib/alpn/alpn-boot-8.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_11.mod b/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_11.mod
new file mode 100644
index 0000000..cb91b4c
--- /dev/null
+++ b/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_11.mod
@@ -0,0 +1,8 @@
+[name]
+alpn-boot
+
+[files]
+maven://org.mortbay.jetty.alpn/alpn-boot/8.1.0.v20141016|lib/alpn/alpn-boot-8.1.0.v20141016.jar
+
+[exec]
+-Xbootclasspath/p:lib/alpn/alpn-boot-8.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_20.mod b/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_20.mod
new file mode 100644
index 0000000..cb91b4c
--- /dev/null
+++ b/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_20.mod
@@ -0,0 +1,8 @@
+[name]
+alpn-boot
+
+[files]
+maven://org.mortbay.jetty.alpn/alpn-boot/8.1.0.v20141016|lib/alpn/alpn-boot-8.1.0.v20141016.jar
+
+[exec]
+-Xbootclasspath/p:lib/alpn/alpn-boot-8.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_25.mod b/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_25.mod
new file mode 100644
index 0000000..6d6d75e
--- /dev/null
+++ b/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_25.mod
@@ -0,0 +1,8 @@
+[name]
+alpn-boot
+
+[files]
+maven://org.mortbay.jetty.alpn/alpn-boot/8.1.2.v20141202|lib/alpn/alpn-boot-8.1.2.v20141202.jar
+
+[exec]
+-Xbootclasspath/p:lib/alpn/alpn-boot-8.1.2.v20141202.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_31.mod b/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_31.mod
new file mode 100644
index 0000000..e52bd23
--- /dev/null
+++ b/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_31.mod
@@ -0,0 +1,8 @@
+[name]
+alpn-boot
+
+[files]
+maven://org.mortbay.jetty.alpn/alpn-boot/8.1.3.v20150130|lib/alpn/alpn-boot-8.1.3.v20150130.jar
+
+[exec]
+-Xbootclasspath/p:lib/alpn/alpn-boot-8.1.3.v20150130.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_40.mod b/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_40.mod
similarity index 100%
rename from jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_40.mod
rename to jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_40.mod
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_45.mod b/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_45.mod
similarity index 100%
rename from jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_45.mod
rename to jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_45.mod
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_51.mod b/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_51.mod
similarity index 100%
rename from jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_51.mod
rename to jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_51.mod
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_60.mod b/jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_60.mod
similarity index 100%
rename from jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_60.mod
rename to jetty-start/src/test/resources/dist-home/modules/alpn-impl/alpn-1.8.0_60.mod
diff --git a/jetty-start/src/test/resources/dist-home/modules/alpn.mod b/jetty-start/src/test/resources/dist-home/modules/alpn.mod
new file mode 100644
index 0000000..7928e64
--- /dev/null
+++ b/jetty-start/src/test/resources/dist-home/modules/alpn.mod
@@ -0,0 +1,53 @@
+# ALPN is provided via a -Xbootclasspath that modifies the secure connections
+# in java to support the ALPN layer needed for HTTP/2.
+#
+# This modification has a tight dependency on specific recent updates of
+# Java 1.7 and Java 1.8 (Java versions prior to 1.7u40 are not supported).
+#
+# The alpn module will use an appropriate alpn-boot jar for your
+# specific version of Java.
+#
+# IMPORTANT: Versions of Java that exist after this module was created are
+#            not guaranteed to work with existing alpn-boot jars, and might
+#            need a new alpn-boot to be created / tested / deployed by the
+#            Jetty project in order to provide support for these future
+#            Java versions.
+#
+# All versions of alpn-boot can be found at
+# http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/
+
+[name]
+alpn
+
+[depend]
+ssl
+alpn-impl/alpn-${java.version}
+
+[lib]
+lib/jetty-alpn-client-${jetty.version}.jar
+lib/jetty-alpn-server-${jetty.version}.jar
+
+[xml]
+etc/jetty-alpn.xml
+
+[files]
+lib/
+lib/alpn/
+
+[ini-template]
+## Overrides the order protocols are chosen by the server.
+## The default order is that specified by the order of the
+## modules declared in start.ini.
+# jetty.alpn.protocols=h2-16,http/1.1
+
+## Specifies what protocol to use when negotiation fails.
+# jetty.alpn.defaultProtocol=http/1.1
+
+## ALPN debug logging on System.err
+# jetty.alpn.debug=false
+
+[license]
+ALPN is a hosted at github under the GPL v2 with ClassPath Exception.
+ALPN replaces/modifies OpenJDK classes in the java.sun.security.ssl package.
+http://github.com/jetty-project/jetty-alpn
+http://openjdk.java.net/legal/gplv2+ce.html
diff --git a/jetty-start/src/test/resources/dist-home/modules/apache-jsp.mod b/jetty-start/src/test/resources/dist-home/modules/apache-jsp.mod
new file mode 100644
index 0000000..5123670
--- /dev/null
+++ b/jetty-start/src/test/resources/dist-home/modules/apache-jsp.mod
@@ -0,0 +1,10 @@
+#
+# Apache JSP Module
+#
+
+[name]
+apache-jsp
+
+[lib]
+lib/apache-jsp/*.jar
+
diff --git a/jetty-start/src/test/resources/dist-home/modules/apache-jstl.mod b/jetty-start/src/test/resources/dist-home/modules/apache-jstl.mod
new file mode 100644
index 0000000..e4a9001
--- /dev/null
+++ b/jetty-start/src/test/resources/dist-home/modules/apache-jstl.mod
@@ -0,0 +1,9 @@
+#
+# Apache JSTL 
+#
+
+[name]
+apache-jstl
+
+[lib]
+lib/apache-jstl/*.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/cdi.mod b/jetty-start/src/test/resources/dist-home/modules/cdi.mod
index 68dea58..ebffb55 100644
--- a/jetty-start/src/test/resources/dist-home/modules/cdi.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/cdi.mod
@@ -1,5 +1,5 @@
 #
-# CDI / Weld Jetty module
+# [EXPERIMENTAL] CDI / Weld Jetty module
 #
 
 [depend]
@@ -10,12 +10,24 @@
 jsp
 
 [files]
-lib/weld/
-http://central.maven.org/maven2/org/jboss/weld/servlet/weld-servlet/2.2.5.Final/weld-servlet-2.2.5.Final.jar|lib/weld/weld-servlet-2.2.5.Final.jar
+lib/cdi/
+maven://javax.enterprise/cdi-api/1.2|lib/cdi/javax.enterprise.cdi-api-1.2.jar
+maven://javax.interceptor/javax.interceptor-api/1.2|lib/cdi/javax.interceptor-api-1.2.jar
+maven://javax.inject/javax.inject/1|lib/cdi/javax.inject-1.0.jar
+maven://org.jboss.weld.servlet/weld-servlet-core/2.2.9.Final|lib/cdi/weld-servlet-core-2.2.9.Final.jar
+maven://org.jboss.weld.environment/weld-environment-common/2.2.9.Final|lib/cdi/weld-environment-common-2.2.9.Final.jar
+maven://org.jboss.weld/weld-core-impl/2.2.9.Final|lib/cdi/weld-core-impl-2.2.9.Final.jar
+maven://org.jboss.classfilewriter/jboss-classfilewriter/1.0.5.Final|lib/cdi/jboss-classfilewriter-1.0.5.Final.jar
+maven://com.google.guava/guava/13.0.1|lib/cdi/com.google.guava.guava-13.0.1.jar
+maven://org.jboss.weld/weld-spi/2.2.SP3|lib/cdi/weld-spi-2.2.SP3.jar
+maven://org.jboss.weld/weld-api/2.2.SP3|lib/cdi/weld-api-2.2.SP3.jar
+maven://org.jboss.logging/jboss-logging/3.1.3.GA|lib/cdi/jboss-logging-3.1.3.GA.jar
+
 
 [lib]
-lib/weld/weld-servlet-2.2.5.Final.jar
-lib/jetty-cdi-${jetty.version}.jar
+lib/cdi/*.jar
+lib/cdi-core-${jetty.version}.jar
+lib/cdi-servlet-${jetty.version}.jar
 
 [xml]
 etc/jetty-cdi.xml
diff --git a/jetty-start/src/test/resources/dist-home/modules/debug.mod b/jetty-start/src/test/resources/dist-home/modules/debug.mod
deleted file mode 100644
index f740ea2..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/debug.mod
+++ /dev/null
@@ -1,9 +0,0 @@
-#
-# Debug module
-#
-
-[depend]
-server
-
-[xml]
-etc/jetty-debug.xml
diff --git a/jetty-start/src/test/resources/dist-home/modules/debuglog.mod b/jetty-start/src/test/resources/dist-home/modules/debuglog.mod
new file mode 100644
index 0000000..ba8b60a
--- /dev/null
+++ b/jetty-start/src/test/resources/dist-home/modules/debuglog.mod
@@ -0,0 +1,25 @@
+#
+# Debug module
+#
+
+[depend]
+server
+
+[files]
+logs/
+
+[xml]
+etc/jetty-debuglog.xml
+
+[ini-template]
+## Logging directory (relative to $jetty.base)
+# jetty.debuglog.dir=logs
+
+## Whether to append to existing file
+# jetty.debuglog.append=false
+
+## How many days to retain old log files
+# jetty.debuglog.retainDays=90
+
+## Timezone of the log entries
+# jetty.debuglog.timezone=GMT
diff --git a/jetty-start/src/test/resources/dist-home/modules/deploy.mod b/jetty-start/src/test/resources/dist-home/modules/deploy.mod
index f16b3f2..f567a20 100644
--- a/jetty-start/src/test/resources/dist-home/modules/deploy.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/deploy.mod
@@ -15,7 +15,11 @@
 etc/jetty-deploy.xml
 
 [ini-template]
-## DeployManager configuration
-# Monitored Directory name (relative to jetty.base)
-# jetty.deploy.monitoredDirName=webapps
+# Monitored directory name (relative to $jetty.base)
+# jetty.deploy.monitoredDir=webapps
 
+# Monitored directory scan period (seconds)
+# jetty.deploy.scanInterval=1
+
+# Whether to extract *.war files
+# jetty.deploy.extractWars=true
diff --git a/jetty-start/src/test/resources/dist-home/modules/fcgi.mod b/jetty-start/src/test/resources/dist-home/modules/fcgi.mod
index e837b00..14152d5 100644
--- a/jetty-start/src/test/resources/dist-home/modules/fcgi.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/fcgi.mod
@@ -12,4 +12,4 @@
 
 [ini-template]
 ## For configuration of FastCGI contexts, see
-## TODO: documentation url here
+## https://www.eclipse.org/jetty/documentation/current/fastcgi.html
diff --git a/jetty-start/src/test/resources/dist-home/modules/gzip.mod b/jetty-start/src/test/resources/dist-home/modules/gzip.mod
new file mode 100644
index 0000000..1efc834
--- /dev/null
+++ b/jetty-start/src/test/resources/dist-home/modules/gzip.mod
@@ -0,0 +1,23 @@
+#
+# GZIP module
+# Applies GzipHandler to entire server
+#
+
+[depend]
+server
+
+[xml]
+etc/jetty-gzip.xml
+
+[ini-template]
+## Minimum content length after which gzip is enabled
+# jetty.gzip.minGzipSize=2048
+
+## Check whether a file with *.gz extension exists
+# jetty.gzip.checkGzExists=false
+
+## Gzip compression level (-1 for default)
+# jetty.gzip.compressionLevel=-1
+
+## User agents for which gzip is disabled
+# jetty.gzip.excludedUserAgent=.*MSIE.6\.0.*
diff --git a/jetty-start/src/test/resources/dist-home/modules/hawtio.mod b/jetty-start/src/test/resources/dist-home/modules/hawtio.mod
index 2dfb31b..f6d0d9d 100644
--- a/jetty-start/src/test/resources/dist-home/modules/hawtio.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/hawtio.mod
@@ -22,7 +22,7 @@
 http://www.apache.org/licenses/LICENSE-2.0.html
 
 [ini-template]
-
+## Hawt.io configuration
 -Dhawtio.authenticationEnabled=false
 -Dhawtio.dirname=/dirname
 -Dhawtio.config.dir=${jetty.base}/etc/hawtio
diff --git a/jetty-start/src/test/resources/dist-home/modules/http.mod b/jetty-start/src/test/resources/dist-home/modules/http.mod
index dc34bc3..01e9862 100644
--- a/jetty-start/src/test/resources/dist-home/modules/http.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/http.mod
@@ -11,17 +11,26 @@
 [ini-template]
 ### HTTP Connector Configuration
 
-## HTTP port to listen on
-jetty.port=8080
+## Connector host/address to bind to
+# jetty.http.host=0.0.0.0
 
-## HTTP idle timeout in milliseconds
-http.timeout=30000
+## Connector port to listen on
+# jetty.http.port=8080
 
-## HTTP Socket.soLingerTime in seconds. (-1 to disable)
-# http.soLingerTime=-1
+## Connector idle timeout in milliseconds
+# jetty.http.idleTimeout=30000
 
-## Parameters to control the number and priority of acceptors and selectors
-# http.selectors=1
-# http.acceptors=1
-# http.selectorPriorityDelta=0
-# http.acceptorPriorityDelta=0
+## Connector socket linger time in seconds (-1 to disable)
+# jetty.http.soLingerTime=-1
+
+## Number of acceptors (-1 picks default based on number of cores)
+# jetty.http.acceptors=-1
+
+## Number of selectors (-1 picks default based on number of cores)
+# jetty.http.selectors=-1
+
+## ServerSocketChannel backlog (0 picks platform default)
+# jetty.http.acceptorQueueSize=0
+
+## Thread priority delta to give to acceptor threads
+# jetty.http.acceptorPriorityDelta=0
diff --git a/jetty-start/src/test/resources/dist-home/modules/http2.mod b/jetty-start/src/test/resources/dist-home/modules/http2.mod
new file mode 100644
index 0000000..585c1fa
--- /dev/null
+++ b/jetty-start/src/test/resources/dist-home/modules/http2.mod
@@ -0,0 +1,20 @@
+#
+# HTTP2 Support Module
+#
+
+[depend]
+ssl
+alpn
+
+[lib]
+lib/http2/*.jar
+
+[xml]
+etc/jetty-http2.xml
+
+[ini-template]
+## Max number of concurrent streams per connection
+# jetty.http2.maxConcurrentStreams=1024
+
+## Initial stream send (server to client) window
+# jetty.http2.initialStreamSendWindow=65535
diff --git a/jetty-start/src/test/resources/dist-home/modules/http2c.mod b/jetty-start/src/test/resources/dist-home/modules/http2c.mod
new file mode 100644
index 0000000..15883ca
--- /dev/null
+++ b/jetty-start/src/test/resources/dist-home/modules/http2c.mod
@@ -0,0 +1,22 @@
+#
+# HTTP2 Clear Text Support Module
+# This module adds support for HTTP/2 clear text to the
+# HTTP/1 clear text connector (defined in jetty-http.xml).
+# The resulting connector will accept both HTTP/1 and HTTP/2 connections.
+#
+
+[depend]
+http
+
+[lib]
+lib/http2/*.jar
+
+[xml]
+etc/jetty-http2c.xml
+
+[ini-template]
+## Max number of concurrent streams per connection
+# jetty.http2.maxConcurrentStreams=1024
+
+## Initial stream send (server to client) window
+# jetty.http2.initialStreamSendWindow=65535
diff --git a/jetty-start/src/test/resources/dist-home/modules/https.mod b/jetty-start/src/test/resources/dist-home/modules/https.mod
index bd1b718..092e0d7 100644
--- a/jetty-start/src/test/resources/dist-home/modules/https.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/https.mod
@@ -5,15 +5,9 @@
 [depend]
 ssl
 
+[optional]
+http2
+
 [xml]
 etc/jetty-https.xml
 
-[ini-template]
-## HTTPS Configuration
-# HTTP port to listen on
-https.port=8443
-# HTTPS idle timeout in milliseconds
-https.timeout=30000
-# HTTPS Socket.soLingerTime in seconds. (-1 to disable)
-# https.soLingerTime=-1
-
diff --git a/jetty-start/src/test/resources/dist-home/modules/infinispan.mod b/jetty-start/src/test/resources/dist-home/modules/infinispan.mod
new file mode 100644
index 0000000..afa39fc
--- /dev/null
+++ b/jetty-start/src/test/resources/dist-home/modules/infinispan.mod
@@ -0,0 +1,33 @@
+#
+# Jetty Infinispan module
+#
+
+[depend]
+annotations
+webapp
+
+[files]
+maven://org.infinispan/infinispan-core/7.1.1.Final|lib/infinispan/infinispan-core-7.1.1.Final.jar
+maven://org.infinispan/infinispan-commons/7.1.1.Final|lib/infinispan/infinispan-commons-7.1.1.Final.jar
+maven://org.jgroups/jgroups/3.6.1.Final|lib/infinispan/jgroups-3.6.1.Final.jar
+maven://org.jboss.marshalling/jboss-marshalling-osgi/1.4.4.Final|lib/infinispan/jboss-marshalling-osgi-1.4.4.Final.jar
+maven://org.jboss.logging/jboss-logging/3.1.2.GA|lib/infinispan/jboss-logging-3.1.2.GA.jar
+
+[lib]
+lib/jetty-infinispan-${jetty.version}.jar
+lib/infinispan/*.jar
+
+[xml]
+etc/jetty-infinispan.xml
+
+[license]
+Infinispan is an open source project hosted on Github and released under the Apache 2.0 license.
+http://infinispan.org/
+http://www.apache.org/licenses/LICENSE-2.0.html
+
+[ini-template]
+## Infinispan Session config
+
+## Unique identifier for this node in the cluster
+# jetty.infinispanSession.workerName=node1
+
diff --git a/jetty-start/src/test/resources/dist-home/modules/jaas.mod b/jetty-start/src/test/resources/dist-home/modules/jaas.mod
index 4932140..fee3f59 100644
--- a/jetty-start/src/test/resources/dist-home/modules/jaas.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/jaas.mod
@@ -12,5 +12,6 @@
 etc/jetty-jaas.xml
 
 [ini-template]
-## JAAS Configuration
-jaas.login.conf=etc/login.conf
+## The file location (relative to $jetty.base) for the
+## JAAS "java.security.auth.login.config" system property
+# jetty.jaas.login.conf=etc/login.conf
diff --git a/jetty-start/src/test/resources/dist-home/modules/jamon.mod b/jetty-start/src/test/resources/dist-home/modules/jamon.mod
index 2aeb2ad..2d1f144 100644
--- a/jetty-start/src/test/resources/dist-home/modules/jamon.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/jamon.mod
@@ -13,8 +13,8 @@
 
 [files]
 lib/jamon/
-http://central.maven.org/maven2/com/jamonapi/jamon/2.79/jamon-2.79.jar|lib/jamon/jamon-2.79.jar
-http://central.maven.org/maven2/com/jamonapi/jamon_war/2.79/jamon_war-2.79.war|lib/jamon/jamon.war
+maven://com.jamonapi/jamon/2.79|lib/jamon/jamon-2.79.jar
+maven://com.jamonapi/jamon_war/2.79/war|lib/jamon/jamon.war
 
 [lib]
 lib/jamon/**.jar
@@ -25,6 +25,7 @@
 http://jamonapi.sourceforge.net/JAMonLicense.html
 
 [ini-template]
+## Jamon Configuration
+# jamon.summaryLabels=demo
 jamon.summaryLabels=default, request.getStatus().contextpath.value.ms
-#jamon.summaryLabels=demo
 
diff --git a/jetty-start/src/test/resources/dist-home/modules/jdbc-sessions.mod b/jetty-start/src/test/resources/dist-home/modules/jdbc-sessions.mod
new file mode 100644
index 0000000..d77ff04
--- /dev/null
+++ b/jetty-start/src/test/resources/dist-home/modules/jdbc-sessions.mod
@@ -0,0 +1,27 @@
+#
+# Jetty JDBC Session module
+#
+
+[depend]
+annotations
+webapp
+
+[xml]
+etc/jetty-jdbc-sessions.xml
+
+
+[ini-template]
+## JDBC Session config
+
+## Unique identifier for this node in the cluster
+# jetty.jdbcSession.workerName=node1
+
+## The interval in seconds between sweeps of the scavenger
+# jetty.jdbcSession.scavenge=600
+
+## Uncomment either the datasource name or driverClass and connectionURL
+# jetty.jdbcSession.datasource=sessions
+# jetty.jdbcSession.driverClass=changeme
+# jetty.jdbcSession.connectionURL=changeme
+
+
diff --git a/jetty-start/src/test/resources/dist-home/modules/jminix.mod b/jetty-start/src/test/resources/dist-home/modules/jminix.mod
index b35d702..05788f0 100644
--- a/jetty-start/src/test/resources/dist-home/modules/jminix.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/jminix.mod
@@ -11,21 +11,21 @@
 
 [files]
 lib/jminix/
-http://central.maven.org/maven2/org/jminix/jminix/1.1.0/jminix-1.1.0.jar|lib/jminix/jminix-1.1.0.jar
+maven://org.jminix/jminix/1.1.0|lib/jminix/jminix-1.1.0.jar
 http://maven.restlet.com/org/restlet/org.restlet/1.1.5/org.restlet-1.1.5.jar|lib/jminix/org.restlet-1.1.5.jar
 http://maven.restlet.com/org/restlet/org.restlet.ext.velocity/1.1.5/org.restlet.ext.velocity-1.1.5.jar|lib/jminix/org.restlet.ext.velocity-1.1.5.jar
-http://central.maven.org/maven2/org/apache/velocity/velocity/1.5/velocity-1.5.jar|lib/jminix/velocity-1.5.jar
-http://central.maven.org/maven2/oro/oro/2.0.8/oro-2.0.8.jar|lib/jminix/oro-2.0.8.jar
+maven://org.apache.velocity/velocity/1.5|lib/jminix/velocity-1.5.jar
+maven://oro/oro/2.0.8|lib/jminix/oro-2.0.8.jar
 http://maven.restlet.com/com/noelios/restlet/com.noelios.restlet/1.1.5/com.noelios.restlet-1.1.5.jar|lib/jminix/com.noelios.restlet-1.1.5.jar
 http://maven.restlet.com/com/noelios/restlet/com.noelios.restlet.ext.servlet/1.1.5/com.noelios.restlet.ext.servlet-1.1.5.jar|lib/jminix/com.noelios.restlet.ext.servlet-1.1.5.jar
-http://central.maven.org/maven2/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar|lib/jminix/commons-logging-1.1.1.jar
-http://repo2.maven.org/maven2/net/sf/json-lib/json-lib/2.2.3/json-lib-2.2.3-jdk15.jar|lib/jminix/json-lib-2.2.3-jdk15.jar
-http://central.maven.org/maven2/commons-lang/commons-lang/2.4/commons-lang-2.4.jar|lib/jminix/commons-lang-2.4.jar
-http://central.maven.org/maven2/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0.jar|lib/jminix/commons-beanutils-1.7.0.jar
-http://central.maven.org/maven2/commons-collections/commons-collections/3.2/commons-collections-3.2.jar|lib/jminix/commons-collections-3.2.jar
-http://central.maven.org/maven2/net/sf/ezmorph/ezmorph/1.0.6/ezmorph-1.0.6.jar|lib/jminix/ezmorph-1.0.6.jar
-http://central.maven.org/maven2/org/jgroups/jgroups/2.12.1.3.Final/jgroups-2.12.1.3.Final.jar|lib/jminix/jgroups-2.12.1.3.Final.jar
-http://central.maven.org/maven2/org/jasypt/jasypt/1.8/jasypt-1.8.jar|lib/jminix/jasypt-1.8.jar
+maven://commons-logging/commons-logging/1.1.1|lib/jminix/commons-logging-1.1.1.jar
+maven://net.sf.json-lib/json-lib/2.2.3/jar/jdk15|lib/jminix/json-lib-2.2.3-jdk15.jar
+maven://commons-lang/commons-lang/2.4|lib/jminix/commons-lang-2.4.jar
+maven://commons-beanutils/commons-beanutils/1.7.0|lib/jminix/commons-beanutils-1.7.0.jar
+maven://commons-collections/commons-collections/3.2|lib/jminix/commons-collections-3.2.jar
+maven://net.sf.ezmorph/ezmorph/1.0.6|lib/jminix/ezmorph-1.0.6.jar
+maven://org.jgroups/jgroups/2.12.1.3.Final|lib/jminix/jgroups-2.12.1.3.Final.jar
+maven://org.jasypt/jasypt/1.8|lib/jminix/jasypt-1.8.jar
 
 [lib]
 lib/jminix/**.jar
@@ -36,6 +36,6 @@
 http://www.apache.org/licenses/LICENSE-2.0
 
 [ini-template]
-# Jminix Configuration
+## Jminix Configuration
 jminix.port=8088
 
diff --git a/jetty-start/src/test/resources/dist-home/modules/jmx-remote.mod b/jetty-start/src/test/resources/dist-home/modules/jmx-remote.mod
index b6be74a..f8a5111 100644
--- a/jetty-start/src/test/resources/dist-home/modules/jmx-remote.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/jmx-remote.mod
@@ -9,10 +9,8 @@
 etc/jetty-jmx-remote.xml
 
 [ini-template]
-## JMX Configuration
-## Enable for an open port accessible by remote machines
-# jetty.jmxrmihost=localhost
-# jetty.jmxrmiport=1099
-## Strictly speaking you shouldn't need --exec to use this in most environments.
-## If this isn't working, make sure you enable --exec as well
-# -Dcom.sun.management.jmxremote
+## The host/address to bind RMI to
+# jetty.jmxremote.rmihost=localhost
+
+## The port RMI listens to
+# jetty.jmxremote.rmiport=1099
diff --git a/jetty-start/src/test/resources/dist-home/modules/jolokia.mod b/jetty-start/src/test/resources/dist-home/modules/jolokia.mod
index 876c2fc..da8ac8f 100644
--- a/jetty-start/src/test/resources/dist-home/modules/jolokia.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/jolokia.mod
@@ -11,7 +11,7 @@
 etc/jolokia.xml
 
 [files]
-http://repo1.maven.org/maven2/org/jolokia/jolokia-war/1.2.2/jolokia-war-1.2.2.war|lib/jolokia/jolokia.war
+maven://org.jolokia/jolokia-war/1.2.2/war|lib/jolokia/jolokia.war
 
 [license]
 Jolokia is released under the Apache License 2.0
diff --git a/jetty-start/src/test/resources/dist-home/modules/jsp-impl/apache-jsp.mod b/jetty-start/src/test/resources/dist-home/modules/jsp-impl/apache-jsp.mod
deleted file mode 100644
index aed547c..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/jsp-impl/apache-jsp.mod
+++ /dev/null
@@ -1,10 +0,0 @@
-#
-# Apache JSP Module
-#
-
-[name]
-jsp-impl
-
-[lib]
-lib/apache-jsp/*.jar
-
diff --git a/jetty-start/src/test/resources/dist-home/modules/jsp-impl/apache-jstl.mod b/jetty-start/src/test/resources/dist-home/modules/jsp-impl/apache-jstl.mod
deleted file mode 100644
index 804b191..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/jsp-impl/apache-jstl.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Apache JSTL 
-#
-[name]
-jstl-impl
-
-[lib]
-lib/apache-jstl/*.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/jsp-impl/glassfish-jsp.mod b/jetty-start/src/test/resources/dist-home/modules/jsp-impl/glassfish-jsp.mod
deleted file mode 100644
index 130d2b3..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/jsp-impl/glassfish-jsp.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Glassfish JSP Module
-#
-[name]
-jsp-impl
-
-[lib]
-lib/jsp/*.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/jsp-impl/glassfish-jstl.mod b/jetty-start/src/test/resources/dist-home/modules/jsp-impl/glassfish-jstl.mod
deleted file mode 100644
index 4b8e6f3..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/jsp-impl/glassfish-jstl.mod
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Glassfish JSTL
-[name]
-jstl-impl
-
-# This file is empty as glassfish jstl is provided by glassfish jsp
diff --git a/jetty-start/src/test/resources/dist-home/modules/jsp.mod b/jetty-start/src/test/resources/dist-home/modules/jsp.mod
index bb31ca7..a16cc93 100644
--- a/jetty-start/src/test/resources/dist-home/modules/jsp.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/jsp.mod
@@ -5,17 +5,5 @@
 [depend]
 servlet
 annotations
-jsp-impl/${jsp-impl}-jsp
+apache-jsp
 
-[ini-template]
-# JSP Configuration
-
-# Select JSP implementation, choices are
-#   glassfish : The reference implementation 
-#               default in jetty <= 9.1
-#   apache    : The apache version 
-#               default jetty >= 9.2
-jsp-impl=apache
-
-# To use a non-jdk compiler for JSP compilation when using glassfish uncomment next line
-# -Dorg.apache.jasper.compiler.disablejsr199=true
diff --git a/jetty-start/src/test/resources/dist-home/modules/jstl.mod b/jetty-start/src/test/resources/dist-home/modules/jstl.mod
index cb06244..efc310a 100644
--- a/jetty-start/src/test/resources/dist-home/modules/jstl.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/jstl.mod
@@ -1,14 +1,8 @@
 #
-# Jetty JSP Module
+# Jetty JSTL Module
 #
 
 [depend]
 jsp
-jsp-impl/${jsp-impl}-jstl
+apache-jstl
 
-[ini-template]
-# JSTL Configuration
-# The glassfish jsp-impl includes JSTL by default and this module
-# is not required to activate it.
-# The apache jsp-impl does not include JSTL by default and this module
-# is required to put JSTL on the container classpath
diff --git a/jetty-start/src/test/resources/dist-home/modules/logging.mod b/jetty-start/src/test/resources/dist-home/modules/logging.mod
index a39bfe4..4f30a88 100644
--- a/jetty-start/src/test/resources/dist-home/modules/logging.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/logging.mod
@@ -14,18 +14,23 @@
 
 [ini-template]
 ## Logging Configuration
-# Configure jetty logging for default internal behavior STDERR output
+## Configure jetty logging for default internal behavior STDERR output
 # -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
 
-# Configure jetty logging for slf4j
+## Configure jetty logging for slf4j
 # -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.Slf4jLog
 
-# Configure jetty logging for java.util.logging
+## Configure jetty logging for java.util.logging
 # -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.JavaUtilLog
 
-# STDERR / STDOUT Logging
-# Number of days to retain logs
-# jetty.log.retain=90
-# Directory for logging output
-# Either a path relative to ${jetty.base} or an absolute path
-# jetty.logs=logs
+## Logging directory (relative to $jetty.base)
+# jetty.logging.dir=logs
+
+## Whether to append to existing file
+# jetty.logging.append=false
+
+## How many days to retain old log files
+# jetty.logging.retainDays=90
+
+## Timezone of the log timestamps
+# jetty.logging.timezone=GMT
diff --git a/jetty-start/src/test/resources/dist-home/modules/lowresources.mod b/jetty-start/src/test/resources/dist-home/modules/lowresources.mod
index 99112d5..2f765d9 100644
--- a/jetty-start/src/test/resources/dist-home/modules/lowresources.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/lowresources.mod
@@ -9,10 +9,20 @@
 etc/jetty-lowresources.xml
 
 [ini-template]
-## Low Resources Configuration
-# lowresources.period=1050
-# lowresources.lowResourcesIdleTimeout=200
-# lowresources.monitorThreads=true
-# lowresources.maxConnections=0
-# lowresources.maxMemory=0
-# lowresources.maxLowResourcesTime=5000
+## Scan period to look for low resources (in milliseconds)
+# jetty.lowresources.period=1000
+
+## The idle timeout to apply to low resources (in milliseconds)
+# jetty.lowresources.idleTimeout=1000
+
+## Whether to monitor ThreadPool threads for low resources
+# jetty.lowresources.monitorThreads=true
+
+## Max number of connections allowed before being in low resources mode
+# jetty.lowresources.maxConnections=0
+
+## Max memory allowed before being in low resources mode (in bytes)
+# jetty.lowresources.maxMemory=0
+
+## Max time a resource may stay in low resource mode before actions are taken (in milliseconds)
+# jetty.lowresources.maxLowResourcesTime=5000
diff --git a/jetty-start/src/test/resources/dist-home/modules/nosql.mod b/jetty-start/src/test/resources/dist-home/modules/nosql.mod
new file mode 100644
index 0000000..a5b5a9e
--- /dev/null
+++ b/jetty-start/src/test/resources/dist-home/modules/nosql.mod
@@ -0,0 +1,31 @@
+#
+# Jetty NoSql module
+#
+
+[depend]
+webapp
+
+[files]
+maven://org.mongodb/mongo-java-driver/2.6.1|lib/nosql/mongo-java-driver-2.6.1.jar
+
+[lib]
+lib/jetty-nosql-${jetty.version}.jar
+lib/nosql/*.jar
+
+[xml]
+etc/jetty-nosql.xml
+
+[license]
+The java driver for the MongoDB document-based database system is hosted on GitHub and released under the Apache 2.0 license.
+http://www.mongodb.org/
+http://www.apache.org/licenses/LICENSE-2.0.html
+
+[ini-template]
+## MongoDB SessionIdManager config
+
+## Unique identifier for this node in the cluster
+# jetty.nosqlSession.workerName=node1
+
+## Interval in seconds between scavenging expired sessions
+# jetty.nosqlSession.scavenge=1800
+
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_40.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_40.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_40.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_45.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_45.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_45.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_51.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_51.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_51.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_55.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_55.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_55.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_60.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_60.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_60.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_65.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_65.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_65.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_67.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_67.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_67.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_71.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_71.mod
deleted file mode 100644
index e9b4e2a..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_71.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.2.v20141202/alpn-boot-7.1.2.v20141202.jar|lib/alpn/alpn-boot-7.1.2.v20141202.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.2.v20141202.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_72.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_72.mod
deleted file mode 100644
index e9b4e2a..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_72.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.2.v20141202/alpn-boot-7.1.2.v20141202.jar|lib/alpn/alpn-boot-7.1.2.v20141202.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.2.v20141202.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_75.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_75.mod
deleted file mode 100644
index ac315d6..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_75.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.3.v20150130/alpn-boot-7.1.3.v20150130.jar|lib/alpn/alpn-boot-7.1.3.v20150130.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.3.v20150130.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_76.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_76.mod
deleted file mode 100644
index ac315d6..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_76.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.3.v20150130/alpn-boot-7.1.3.v20150130.jar|lib/alpn/alpn-boot-7.1.3.v20150130.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.3.v20150130.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_79.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_79.mod
deleted file mode 100644
index ac315d6..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_79.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.3.v20150130/alpn-boot-7.1.3.v20150130.jar|lib/alpn/alpn-boot-7.1.3.v20150130.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.3.v20150130.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_80.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_80.mod
deleted file mode 100644
index ac315d6..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.7.0_80.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.3.v20150130/alpn-boot-7.1.3.v20150130.jar|lib/alpn/alpn-boot-7.1.3.v20150130.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.3.v20150130.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0.mod
deleted file mode 100644
index a81732c..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.0.v20141016/alpn-boot-8.1.0.v20141016.jar|lib/alpn/alpn-boot-8.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-8.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_05.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_05.mod
deleted file mode 100644
index a81732c..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_05.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.0.v20141016/alpn-boot-8.1.0.v20141016.jar|lib/alpn/alpn-boot-8.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-8.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_11.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_11.mod
deleted file mode 100644
index a81732c..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_11.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.0.v20141016/alpn-boot-8.1.0.v20141016.jar|lib/alpn/alpn-boot-8.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-8.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_20.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_20.mod
deleted file mode 100644
index a81732c..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_20.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.0.v20141016/alpn-boot-8.1.0.v20141016.jar|lib/alpn/alpn-boot-8.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-8.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_25.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_25.mod
deleted file mode 100644
index 8d13261..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_25.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.2.v20141202/alpn-boot-8.1.2.v20141202.jar|lib/alpn/alpn-boot-8.1.2.v20141202.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-8.1.2.v20141202.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_31.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_31.mod
deleted file mode 100644
index 4114979..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn-1.8.0_31.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.3.v20150130/alpn-boot-8.1.3.v20150130.jar|lib/alpn/alpn-boot-8.1.3.v20150130.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-8.1.3.v20150130.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn.mod
deleted file mode 100644
index d3e4118..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/alpn.mod
+++ /dev/null
@@ -1,42 +0,0 @@
-# ALPN is provided via a -Xbootclasspath that modifies the secure connections
-# in java to support the ALPN layer needed for SPDY (and eventually HTTP/2)
-#
-# This modification has a tight dependency on specific recent updates of
-# Java 1.7 and Java 1.8
-# (Java versions prior to 1.7u40 are not supported)
-#
-# The alpn protonego module will use an appropriate alpn-boot jar for your
-# specific version of Java.
-#
-# IMPORTANT: Versions of Java that exist after this module was created are
-#            not guaranteed to work with existing alpn-boot jars, and might
-#            need a new alpn-boot to be created / tested / deployed by the
-#            Jetty project in order to provide support for these future
-#            Java versions.
-#
-# All versions of alpn-boot can be found at
-# http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/
-
-[name]
-protonego-impl
-
-[depend]
-protonego-impl/alpn-${java.version}
-
-[lib]
-lib/jetty-alpn-client-${jetty.version}.jar
-lib/jetty-alpn-server-${jetty.version}.jar
-
-[xml]
-etc/protonego-alpn.xml
-
-[files]
-lib/
-lib/alpn/
-
-[license]
-ALPN is a hosted at github under the GPL v2 with ClassPath Exception.
-ALPN replaces/modifies OpenJDK classes in the java.sun.security.ssl package.
-http://github.com/jetty-project/jetty-alpn
-http://openjdk.java.net/legal/gplv2+ce.html
-
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_04.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_04.mod
deleted file mode 100644
index 007570b..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_04.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.0.v20120525/npn-boot-1.1.0.v20120525.jar|lib/npn/npn-boot-1.1.0.v20120525.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.0.v20120525.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_05.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_05.mod
deleted file mode 100644
index 007570b..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_05.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.0.v20120525/npn-boot-1.1.0.v20120525.jar|lib/npn/npn-boot-1.1.0.v20120525.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.0.v20120525.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_06.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_06.mod
deleted file mode 100644
index 868a7a7..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_06.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.1.v20121030/npn-boot-1.1.1.v20121030.jar|lib/npn/npn-boot-1.1.1.v20121030.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.1.v20121030.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_07.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_07.mod
deleted file mode 100644
index 868a7a7..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_07.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.1.v20121030/npn-boot-1.1.1.v20121030.jar|lib/npn/npn-boot-1.1.1.v20121030.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.1.v20121030.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_09.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_09.mod
deleted file mode 100644
index 20c1db2..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_09.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.3.v20130313/npn-boot-1.1.3.v20130313.jar|lib/npn/npn-boot-1.1.3.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.3.v20130313.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_10.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_10.mod
deleted file mode 100644
index 20c1db2..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_10.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.3.v20130313/npn-boot-1.1.3.v20130313.jar|lib/npn/npn-boot-1.1.3.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.3.v20130313.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_11.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_11.mod
deleted file mode 100644
index 20c1db2..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_11.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.3.v20130313/npn-boot-1.1.3.v20130313.jar|lib/npn/npn-boot-1.1.3.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.3.v20130313.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_13.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_13.mod
deleted file mode 100644
index 1645a52..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_13.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.4.v20130313/npn-boot-1.1.4.v20130313.jar|lib/npn/npn-boot-1.1.4.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.4.v20130313.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_15.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_15.mod
deleted file mode 100644
index 73bc090..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_15.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.5.v20130313/npn-boot-1.1.5.v20130313.jar|lib/npn/npn-boot-1.1.5.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.5.v20130313.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_17.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_17.mod
deleted file mode 100644
index 73bc090..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_17.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.5.v20130313/npn-boot-1.1.5.v20130313.jar|lib/npn/npn-boot-1.1.5.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.5.v20130313.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_21.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_21.mod
deleted file mode 100644
index 73bc090..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_21.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.5.v20130313/npn-boot-1.1.5.v20130313.jar|lib/npn/npn-boot-1.1.5.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.5.v20130313.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_25.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_25.mod
deleted file mode 100644
index 73bc090..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_25.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.5.v20130313/npn-boot-1.1.5.v20130313.jar|lib/npn/npn-boot-1.1.5.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.5.v20130313.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_40.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_40.mod
deleted file mode 100644
index 465e6f0..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_40.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.6.v20130911/npn-boot-1.1.6.v20130911.jar|lib/npn/npn-boot-1.1.6.v20130911.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.6.v20130911.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_45.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_45.mod
deleted file mode 100644
index 465e6f0..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_45.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.6.v20130911/npn-boot-1.1.6.v20130911.jar|lib/npn/npn-boot-1.1.6.v20130911.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.6.v20130911.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_51.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_51.mod
deleted file mode 100644
index 465e6f0..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_51.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.6.v20130911/npn-boot-1.1.6.v20130911.jar|lib/npn/npn-boot-1.1.6.v20130911.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.6.v20130911.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_55.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_55.mod
deleted file mode 100644
index 5f8704d..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_55.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.8.v20141013/npn-boot-1.1.8.v20141013.jar|lib/npn/npn-boot-1.1.8.v20141013.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.8.v20141013.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_60.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_60.mod
deleted file mode 100644
index 5f8704d..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_60.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.8.v20141013/npn-boot-1.1.8.v20141013.jar|lib/npn/npn-boot-1.1.8.v20141013.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.8.v20141013.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_65.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_65.mod
deleted file mode 100644
index 5f8704d..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_65.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.8.v20141013/npn-boot-1.1.8.v20141013.jar|lib/npn/npn-boot-1.1.8.v20141013.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.8.v20141013.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_67.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_67.mod
deleted file mode 100644
index 5f8704d..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_67.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.8.v20141013/npn-boot-1.1.8.v20141013.jar|lib/npn/npn-boot-1.1.8.v20141013.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.8.v20141013.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_71.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_71.mod
deleted file mode 100644
index 851aca8..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_71.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.9.v20141016/npn-boot-1.1.9.v20141016.jar|lib/npn/npn-boot-1.1.9.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.9.v20141016.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_72.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_72.mod
deleted file mode 100644
index 851aca8..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_72.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.9.v20141016/npn-boot-1.1.9.v20141016.jar|lib/npn/npn-boot-1.1.9.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.9.v20141016.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_75.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_75.mod
deleted file mode 100644
index a5fac11..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_75.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.10.v20150130/npn-boot-1.1.10.v20150130.jar|lib/npn/npn-boot-1.1.10.v20150130.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.10.v20150130.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_76.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_76.mod
deleted file mode 100644
index a5fac11..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_76.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.10.v20150130/npn-boot-1.1.10.v20150130.jar|lib/npn/npn-boot-1.1.10.v20150130.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.10.v20150130.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_79.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_79.mod
deleted file mode 100644
index a5fac11..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_79.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.10.v20150130/npn-boot-1.1.10.v20150130.jar|lib/npn/npn-boot-1.1.10.v20150130.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.10.v20150130.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_80.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_80.mod
deleted file mode 100644
index 2cce5fa..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn-1.7.0_80.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.11.v20150415/npn-boot-1.1.11.v20150415.jar|lib/npn/npn-boot-1.1.11.v20150415.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.11.v20150415.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn.mod b/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn.mod
deleted file mode 100644
index 1a2c71d..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego-impl/npn.mod
+++ /dev/null
@@ -1,37 +0,0 @@
-# NPN is provided via a -Xbootclasspath that modifies the secure connections
-# in java to support the NPN layer needed for SPDY.
-#
-# This modification has a tight dependency on specific updates of Java 1.7.
-# (No support for Java 8 exists for npn / npn-boot, use alpn instead)
-#
-# The npn module will use an appropriate npn-boot jar for your specific
-# version of Java.
-#
-# IMPORTANT: Versions of Java that exist after this module was created are
-#            not guaranteed to work with existing npn-boot jars, and might
-#            need a new npn-boot to be created / tested / deployed by the
-#            Jetty project in order to provide support for these future
-#            Java versions.
-#
-# All versions of npn-boot can be found at
-# http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/
-
-
-[name]
-protonego-impl
-
-[depend]
-protonego-impl/npn-${java.version}
-
-[xml]
-etc/protonego-npn.xml
-
-[files]
-lib/
-lib/npn/
-
-[license]
-NPN is a hosted at github under the GPL v2 with ClassPath Exception.
-NPN replaces/modifies OpenJDK classes in the java.sun.security.ssl package.
-http://github.com/jetty-project/jetty-npn
-http://openjdk.java.net/legal/gplv2+ce.html
diff --git a/jetty-start/src/test/resources/dist-home/modules/protonego.mod b/jetty-start/src/test/resources/dist-home/modules/protonego.mod
deleted file mode 100644
index fbf4d08..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/protonego.mod
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# Protocol Negotiatin Selection Module
-#
-
-[depend]
-protonego-impl/${protonego}
-
-[ini-template]
-# Protocol Negotiation Implementation Selection
-#  choices are:
-#    'npn'  : original implementation for SPDY (now deprecated)
-#    'alpn' : replacement for NPN, in use by current SPDY implementations
-#             and the future HTTP/2 spec
-#  Note: java 1.8+ are ALPN only.
-protonego=alpn
-
-# Configuration for NPN
-# npn.protocols=spdy/3,http/1.1
-# npn.defaultProtocol=http/1.1
-
-# Configuration for ALPN
-# alpn.protocols=h2-14,http/1.1
-# alpn.defaultProtocol=http/1.1
-
diff --git a/jetty-start/src/test/resources/dist-home/modules/proxy.mod b/jetty-start/src/test/resources/dist-home/modules/proxy.mod
index a879ae1..6b91f68 100644
--- a/jetty-start/src/test/resources/dist-home/modules/proxy.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/proxy.mod
@@ -14,9 +14,9 @@
 
 [ini-template]
 ## Proxy Configuration
-#jetty.proxy.servletClass=org.eclipse.jetty.proxy.ProxyServlet
-#jetty.proxy.servletMapping=/*
-#jetty.proxy.maxThreads=128
-#jetty.proxy.maxConnections=256
-#jetty.proxy.idleTimeout=30000
-#jetty.proxy.timeout=60000
+# jetty.proxy.servletClass=org.eclipse.jetty.proxy.ProxyServlet
+# jetty.proxy.servletMapping=/*
+# jetty.proxy.maxThreads=128
+# jetty.proxy.maxConnections=256
+# jetty.proxy.idleTimeout=30000
+# jetty.proxy.timeout=60000
diff --git a/jetty-start/src/test/resources/dist-home/modules/quickstart.mod b/jetty-start/src/test/resources/dist-home/modules/quickstart.mod
index 89db9fd..4e59dd0 100644
--- a/jetty-start/src/test/resources/dist-home/modules/quickstart.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/quickstart.mod
@@ -7,6 +7,5 @@
 plus
 annotations
 
-
 [lib]
 lib/jetty-quickstart-${jetty.version}.jar
diff --git a/jetty-start/src/test/resources/dist-home/modules/requestlog.mod b/jetty-start/src/test/resources/dist-home/modules/requestlog.mod
index f5e0614..e27b246 100644
--- a/jetty-start/src/test/resources/dist-home/modules/requestlog.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/requestlog.mod
@@ -12,19 +12,26 @@
 logs/
 
 [ini-template]
-## Request Log Configuration
-# Filename for Request Log output (relative to jetty.base)
-# requestlog.filename=/logs/yyyy_mm_dd.request.log
-# Date format for rollovered files (uses SimpleDateFormat syntax)
-# requestlog.filenameDateFormat=yyyy_MM_dd
-# How many days to retain the logs
-# requestlog.retain=90
-# If an existing log with the same name is found, just append to it
-# requestlog.append=true
-# Use the extended log output
-# requestlog.extended=true
-# Log http cookie information as well
-# requestlog.cookies=true
-# Set the log output timezone
-# requestlog.timezone=GMT
+## Logging directory (relative to $jetty.base)
+# jetty.requestlog.dir=logs
 
+## File path
+# jetty.requestlog.filePath=${jetty.requestlog.dir}/yyyy_mm_dd.request.log
+
+## Date format for rollovered files (uses SimpleDateFormat syntax)
+# jetty.requestlog.filenameDateFormat=yyyy_MM_dd
+
+## How many days to retain old log files
+# jetty.requestlog.retainDays=90
+
+## Whether to append to existing file
+# jetty.requestlog.append=true
+
+## Whether to use the extended log output
+# jetty.requestlog.extended=true
+
+## Whether to log http cookie information
+# jetty.requestlog.cookies=true
+
+## Timezone of the log entries
+# jetty.requestlog.timezone=GMT
diff --git a/jetty-start/src/test/resources/dist-home/modules/rewrite.mod b/jetty-start/src/test/resources/dist-home/modules/rewrite.mod
index d2e00c8..c8a1750 100644
--- a/jetty-start/src/test/resources/dist-home/modules/rewrite.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/rewrite.mod
@@ -10,3 +10,13 @@
 
 [xml]
 etc/jetty-rewrite.xml
+
+[ini-template]
+## Whether to rewrite the request URI
+# jetty.rewrite.rewriteRequestURI=true
+
+## Whether to rewrite the path info
+# jetty.rewrite.rewritePathInfo=false
+
+## Request attribute key under with the original path is stored
+# jetty.rewrite.originalPathAttribute=requestedPath
diff --git a/jetty-start/src/test/resources/dist-home/modules/server.mod b/jetty-start/src/test/resources/dist-home/modules/server.mod
index 3cdac35..6b5dbe9 100644
--- a/jetty-start/src/test/resources/dist-home/modules/server.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/server.mod
@@ -20,30 +20,53 @@
 etc/jetty.xml
 
 [ini-template]
-##
-## Server Threading Configuration
-##
-# minimum number of threads
-threads.min=10
-# maximum number of threads
-threads.max=200
-# thread idle timeout in milliseconds
-threads.timeout=60000
-# buffer size for output
-jetty.output.buffer.size=32768
-# request header buffer size
-jetty.request.header.size=8192
-# response header buffer size
-jetty.response.header.size=8192
-# should jetty send the server version header?
-jetty.send.server.version=true
-# should jetty send the date header?
-jetty.send.date.header=false
-# What host to listen on (leave commented to listen on all interfaces)
-#jetty.host=myhost.com
-# Dump the state of the Jetty server, components, and webapps after startup
-jetty.dump.start=false
-# Dump the state of the Jetty server, before stop
-jetty.dump.stop=false
+### ThreadPool configuration
+## Minimum number of threads
+# jetty.threadPool.minThreads=10
 
+## Maximum number of threads
+# jetty.threadPool.maxThreads=200
 
+## Thread idle timeout (in milliseconds)
+# jetty.threadPool.idleTimeout=60000
+
+### Common HTTP configuration
+## Scheme to use to build URIs for secure redirects
+# jetty.httpConfig.secureScheme=https
+
+## Port to use to build URIs for secure redirects
+# jetty.httpConfig.securePort=8443
+
+## Response content buffer size (in bytes)
+# jetty.httpConfig.outputBufferSize=32768
+
+## Max response content write length that is buffered (in bytes)
+# jetty.httpConfig.outputAggregationSize=8192
+
+## Max request headers size (in bytes)
+# jetty.httpConfig.requestHeaderSize=8192
+
+## Max response headers size (in bytes)
+# jetty.httpConfig.responseHeaderSize=8192
+
+## Whether to send the Server: header
+# jetty.httpConfig.sendServerVersion=true
+
+## Whether to send the Date: header
+# jetty.httpConfig.sendDateHeader=false
+
+## Max per-connection header cache size (in nodes)
+# jetty.httpConfig.headerCacheSize=512
+
+## Whether, for requests with content, delay dispatch until some content has arrived
+# jetty.httpConfig.delayDispatchUntilContent=true
+
+### Server configuration
+## Whether ctrl+c on the console gracefully stops the Jetty server
+# jetty.server.stopAtShutdown=true
+
+## Dump the state of the Jetty server, components, and webapps after startup
+# jetty.server.dumpAfterStart=false
+
+## Dump the state of the Jetty server, components, and webapps before shutdown
+# jetty.server.dumpBeforeStop=false
diff --git a/jetty-start/src/test/resources/dist-home/modules/servlets.mod b/jetty-start/src/test/resources/dist-home/modules/servlets.mod
index e8724b8..2e977c0 100644
--- a/jetty-start/src/test/resources/dist-home/modules/servlets.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/servlets.mod
@@ -2,6 +2,7 @@
 # Jetty Servlets Module
 #
 
+
 [depend]
 servlet
 
diff --git a/jetty-start/src/test/resources/dist-home/modules/setuid.mod b/jetty-start/src/test/resources/dist-home/modules/setuid.mod
index 64c9e23..41ef757 100644
--- a/jetty-start/src/test/resources/dist-home/modules/setuid.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/setuid.mod
@@ -6,14 +6,14 @@
 server
 
 [lib]
-lib/setuid/jetty-setuid-java-1.0.1.jar
+lib/setuid/jetty-setuid-java-1.0.3.jar
 
 [xml]
 etc/jetty-setuid.xml
 
 [ini-template]
 ## SetUID Configuration
-# jetty.startServerAsPrivileged=false
-# jetty.username=jetty
-# jetty.groupname=jetty
-# jetty.umask=002
+# jetty.setuid.startServerAsPrivileged=false
+# jetty.setuid.userName=jetty
+# jetty.setuid.groupName=jetty
+# jetty.setuid.umask=002
diff --git a/jetty-start/src/test/resources/dist-home/modules/spdy.mod b/jetty-start/src/test/resources/dist-home/modules/spdy.mod
deleted file mode 100644
index cf79dfa..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/spdy.mod
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# SPDY Support Module
-#
-
-[depend]
-ssl
-protonego
-
-[lib]
-lib/spdy/*.jar
-
-[xml]
-etc/jetty-ssl.xml
-etc/jetty-spdy.xml
-
-[ini-template]
-## SPDY Configuration
-
-# Port for SPDY connections
-spdy.port=8443
-
-# SPDY idle timeout in milliseconds
-spdy.timeout=30000
-
-# Initial Window Size for SPDY
-#spdy.initialWindowSize=65536
diff --git a/jetty-start/src/test/resources/dist-home/modules/spring.mod b/jetty-start/src/test/resources/dist-home/modules/spring.mod
index 444afb2..39b9b8d 100644
--- a/jetty-start/src/test/resources/dist-home/modules/spring.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/spring.mod
@@ -1,6 +1,7 @@
 #
 # Spring
 #
+
 [name]
 spring
 
diff --git a/jetty-start/src/test/resources/dist-home/modules/ssl.mod b/jetty-start/src/test/resources/dist-home/modules/ssl.mod
index ef47192..809543f 100644
--- a/jetty-start/src/test/resources/dist-home/modules/ssl.mod
+++ b/jetty-start/src/test/resources/dist-home/modules/ssl.mod
@@ -2,39 +2,82 @@
 # SSL Keystore module
 #
 
+[name]
+ssl
+
 [depend]
 server
 
 [xml]
 etc/jetty-ssl.xml
+etc/jetty-ssl-context.xml
 
 [files]
-http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/plain/jetty-server/src/main/config/etc/keystore|etc/keystore
+http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/plain/jetty-server/src/test/config/etc/keystore?id=${jetty.tag.version}|etc/keystore
 
 [ini-template]
-### SSL Keystore Configuration
-# define the port to use for secure redirection
-jetty.secure.port=8443
+### TLS(SSL) Connector Configuration
 
-## Setup a demonstration keystore and truststore
-jetty.keystore=etc/keystore
-jetty.truststore=etc/keystore
+## Connector host/address to bind to
+# jetty.ssl.host=0.0.0.0
 
-## Set the demonstration passwords.
+## Connector port to listen on
+jetty.ssl.port=8443
+
+## Connector idle timeout in milliseconds
+# jetty.ssl.idleTimeout=30000
+
+## Connector socket linger time in seconds (-1 to disable)
+# jetty.ssl.soLingerTime=-1
+
+## Number of acceptors (-1 picks default based on number of cores)
+# jetty.ssl.acceptors=-1
+
+## Number of selectors (-1 picks default based on number of cores)
+# jetty.ssl.selectors=-1
+
+## ServerSocketChannel backlog (0 picks platform default)
+# jetty.ssl.acceptorQueueSize=0
+
+## Thread priority delta to give to acceptor threads
+# jetty.ssl.acceptorPriorityDelta=0
+
+## Whether request host names are checked to match any SNI names
+# jetty.ssl.sniHostCheck=true
+
+### SslContextFactory Configuration
 ## Note that OBF passwords are not secure, just protected from casual observation
 ## See http://www.eclipse.org/jetty/documentation/current/configuring-security-secure-passwords.html
-jetty.keystore.password=OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
-jetty.keymanager.password=OBF:1u2u1wml1z7s1z7a1wnl1u2g
-jetty.truststore.password=OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
 
-### Set the client auth behavior
-## Set to true if client certificate authentication is required
-# jetty.ssl.needClientAuth=true
-## Set to true if client certificate authentication is desired
-# jetty.ssl.wantClientAuth=true
+## Keystore file path (relative to $jetty.base)
+# jetty.sslContext.keyStorePath=etc/keystore
 
-## Parameters to control the number and priority of acceptors and selectors
-# ssl.selectors=1
-# ssl.acceptors=1
-# ssl.selectorPriorityDelta=0
-# ssl.acceptorPriorityDelta=0
+## Truststore file path (relative to $jetty.base)
+# jetty.sslContext.trustStorePath=etc/keystore
+
+## Keystore password
+# jetty.sslContext.keyStorePassword=OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
+
+## Keystore type and provider
+# jetty.sslContext.keyStoreType=JKS
+# jetty.sslContext.keyStoreProvider=
+
+## KeyManager password
+# jetty.sslContext.keyManagerPassword=OBF:1u2u1wml1z7s1z7a1wnl1u2g
+
+## Truststore password
+# jetty.sslContext.trustStorePassword=OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
+
+## Truststore type and provider
+# jetty.sslContext.trustStoreType=JKS
+# jetty.sslContext.trustStoreProvider=
+
+## whether client certificate authentication is required
+# jetty.sslContext.needClientAuth=false
+
+## Whether client certificate authentication is desired
+# jetty.sslContext.wantClientAuth=false
+
+## Whether cipher order is significant (since java 8 only)
+# jetty.sslContext.useCipherSuitesOrder=true
+
diff --git a/jetty-start/src/test/resources/dist-home/modules/xinetd.mod b/jetty-start/src/test/resources/dist-home/modules/xinetd.mod
deleted file mode 100644
index e53618e..0000000
--- a/jetty-start/src/test/resources/dist-home/modules/xinetd.mod
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Xinetd module
-#
-
-[depend]
-server
-
-[xml]
-etc/jetty-xinetd.xml
-
-[ini-template]
-## Xinetd Configuration
-## See ${jetty.home}/etc/jetty-xinetd.xml for example service entry
-jetty.xinetd.idleTimeout=300000
-jetty.xinetd.acceptors=2
-jetty.xinetd.statsOn=false
-
diff --git a/jetty-start/src/test/resources/dist-home/start.ini b/jetty-start/src/test/resources/dist-home/start.ini
new file mode 100644
index 0000000..76987d9
--- /dev/null
+++ b/jetty-start/src/test/resources/dist-home/start.ini
@@ -0,0 +1,131 @@
+#===========================================================
+# Jetty Startup 
+#
+# Starting Jetty from this {jetty.home} is not recommended.
+#
+# A proper {jetty.base} directory should be configured, instead
+# of making changes to this {jetty.home} directory.
+#
+# See documentation about {jetty.base} at
+# http://www.eclipse.org/jetty/documentation/current/startup.html
+#
+# A demo-base directory has been provided as an example of
+# this sort of setup.
+#
+# $ cd demo-base
+# $ java -jar ../start.jar
+#
+#===========================================================
+
+# To disable the warning message, comment the following line
+--module=home-base-warning
+
+# --------------------------------------- 
+# Module: apache-jsp
+--module=apache-jsp
+
+# --------------------------------------- 
+# Module: apache-jstl
+--module=apache-jstl
+
+# --------------------------------------- 
+# Module: ext
+--module=ext
+
+# --------------------------------------- 
+# Module: resources
+--module=resources
+
+# --------------------------------------- 
+# Module: server
+--module=server
+##
+## Server Threading Configuration
+##
+# minimum number of threads
+jetty.threadPool.minThreads=10
+# maximum number of threads
+jetty.threadPool.maxThreads=200
+# thread idle timeout in milliseconds
+jetty.threadPool.idleTimeout=60000
+# buffer size for output
+jetty.httpConfig.outputBufferSize=32768
+# request header buffer size
+jetty.httpConfig.requestHeaderSize=8192
+# response header buffer size
+jetty.httpConfig.responseHeaderSize=8192
+# should jetty send the server version header?
+jetty.httpConfig.sendServerVersion=true
+# should jetty send the date header?
+jetty.httpConfig.sendDateHeader=false
+# What host to listen on (leave commented to listen on all interfaces)
+#jetty.http.host=myhost.com
+# Dump the state of the Jetty server, components, and webapps after startup
+jetty.server.dumpAfterStart=false
+# Dump the state of the Jetty server, before stop
+jetty.server.dumpBeforeStop=false
+# Enable delayed dispatch optimisation
+jetty.httpConfig.delayDispatchUntilContent=false
+
+# --------------------------------------- 
+# Module: http
+--module=http
+### HTTP Connector Configuration
+
+## HTTP port to listen on
+jetty.http.port=8080
+
+## HTTP idle timeout in milliseconds
+# jetty.http.idleTimeout=30000
+
+## HTTP Socket.soLingerTime in seconds. (-1 to disable)
+# jetty.http.soLingerTime=-1
+
+## Parameters to control the number and priority of acceptors and selectors
+# jetty.http.selectors=1
+# jetty.http.acceptors=1
+# jetty.http.acceptorPriorityDelta=0
+
+# --------------------------------------- 
+# Module: jndi
+--module=jndi
+
+# --------------------------------------- 
+# Module: security
+--module=security
+
+# --------------------------------------- 
+# Module: servlet
+--module=servlet
+
+# --------------------------------------- 
+# Module: webapp
+--module=webapp
+
+# --------------------------------------- 
+# Module: deploy
+--module=deploy
+## DeployManager configuration
+# Monitored Directory name (relative to jetty.base)
+# jetty.deploy.monitoredDir=webapps
+
+# --------------------------------------- 
+# Module: plus
+--module=plus
+
+# --------------------------------------- 
+# Module: annotations
+--module=annotations
+
+# --------------------------------------- 
+# Module: jsp
+--module=jsp
+
+# --------------------------------------- 
+# Module: websocket
+--module=websocket
+
+# --------------------------------------- 
+# Module: jstl
+--module=jstl
+
diff --git a/jetty-start/src/test/resources/jetty-version.properties b/jetty-start/src/test/resources/jetty-version.properties
new file mode 100644
index 0000000..968f6fc
--- /dev/null
+++ b/jetty-start/src/test/resources/jetty-version.properties
@@ -0,0 +1 @@
+jetty.version=9.3
\ No newline at end of file
diff --git a/jetty-start/src/test/resources/usecases/agent-properties.assert.txt b/jetty-start/src/test/resources/usecases/agent-properties.assert.txt
new file mode 100644
index 0000000..664fec8
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/agent-properties.assert.txt
@@ -0,0 +1,33 @@
+# The XMLs we expect (order is important)
+XML|${jetty.home}/etc/jetty.xml
+XML|${jetty.home}/etc/jetty-http.xml
+XML|${jetty.home}/etc/jetty-jmx.xml
+
+# The LIBs we expect (order is irrelevant)
+LIB|${jetty.home}/lib/jetty-http-9.3.jar
+LIB|${jetty.home}/lib/jetty-io-9.3.jar
+LIB|${jetty.home}/lib/jetty-jmx-9.3.jar
+LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
+LIB|${jetty.home}/lib/jetty-server-9.3.jar
+LIB|${jetty.home}/lib/jetty-util-9.3.jar
+LIB|${jetty.home}/lib/jetty-xml-9.3.jar
+LIB|${jetty.home}/lib/servlet-api-3.1.jar
+LIB|${jetty.base}/lib/agent-jdk-1.6.jar
+
+# The Properties we expect (order is irrelevant)
+# (this is the property we actually set in jetty.base)
+PROP|jetty.http.port=9090
+# PROP|java.vm.specification.version=1.6
+# (these are the ones set by default from jetty.home modules)
+# PROP|jetty.http.idleTimeout=30000
+# PROP|jetty.httpConfig.delayDispatchUntilContent=false
+# PROP|jetty.server.dumpAfterStart=false
+# PROP|jetty.server.dumpBeforeStop=false
+# PROP|jetty.httpConfig.outputBufferSize=32768
+# PROP|jetty.httpConfig.requestHeaderSize=8192
+# PROP|jetty.httpConfig.responseHeaderSize=8192
+# PROP|jetty.httpConfig.sendDateHeader=false
+# PROP|jetty.httpConfig.sendServerVersion=true
+# PROP|jetty.threadPool.maxThreads=200
+# PROP|jetty.threadPool.minThreads=10
+# PROP|jetty.threadPool.idleTimeout=60000
diff --git a/jetty-start/src/test/resources/usecases/base.props.agent/lib/agent-jdk-1.5.jar b/jetty-start/src/test/resources/usecases/agent-properties/lib/agent-jdk-1.5.jar
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.props.agent/lib/agent-jdk-1.5.jar
rename to jetty-start/src/test/resources/usecases/agent-properties/lib/agent-jdk-1.5.jar
diff --git a/jetty-start/src/test/resources/usecases/base.props.agent/lib/agent-jdk-1.6.jar b/jetty-start/src/test/resources/usecases/agent-properties/lib/agent-jdk-1.6.jar
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.props.agent/lib/agent-jdk-1.6.jar
rename to jetty-start/src/test/resources/usecases/agent-properties/lib/agent-jdk-1.6.jar
diff --git a/jetty-start/src/test/resources/usecases/base.props.agent/lib/agent-jdk-1.7.jar b/jetty-start/src/test/resources/usecases/agent-properties/lib/agent-jdk-1.7.jar
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.props.agent/lib/agent-jdk-1.7.jar
rename to jetty-start/src/test/resources/usecases/agent-properties/lib/agent-jdk-1.7.jar
diff --git a/jetty-start/src/test/resources/usecases/base.props.agent/modules/agent.mod b/jetty-start/src/test/resources/usecases/agent-properties/modules/agent.mod
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.props.agent/modules/agent.mod
rename to jetty-start/src/test/resources/usecases/agent-properties/modules/agent.mod
diff --git a/jetty-start/src/test/resources/usecases/agent-properties/start.ini b/jetty-start/src/test/resources/usecases/agent-properties/start.ini
new file mode 100644
index 0000000..db061d8
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/agent-properties/start.ini
@@ -0,0 +1,4 @@
+
+--module=http,agent
+
+jetty.http.port=9090
diff --git a/jetty-start/src/test/resources/usecases/assert-barebones.txt b/jetty-start/src/test/resources/usecases/assert-barebones.txt
deleted file mode 100644
index 164f3f9..0000000
--- a/jetty-start/src/test/resources/usecases/assert-barebones.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-# The XMLs we expect (order is important)
-XML|${jetty.home}/etc/jetty.xml
-XML|${jetty.home}/etc/jetty-http.xml
-
-# The LIBs we expect (order is irrelevant)
-LIB|${jetty.home}/lib/jetty-continuation-TEST.jar
-LIB|${jetty.home}/lib/jetty-http-TEST.jar
-LIB|${jetty.home}/lib/jetty-io-TEST.jar
-LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
-LIB|${jetty.home}/lib/jetty-server-TEST.jar
-LIB|${jetty.home}/lib/jetty-util-TEST.jar
-LIB|${jetty.home}/lib/jetty-xml-TEST.jar
-LIB|${jetty.home}/lib/servlet-api-3.1.jar
-
-# The Properties we expect (order is irrelevant)
-PROP|jetty.port=9090
diff --git a/jetty-start/src/test/resources/usecases/assert-enable-spdy-bad-npn-version.txt b/jetty-start/src/test/resources/usecases/assert-enable-spdy-bad-npn-version.txt
deleted file mode 100644
index 84c8867..0000000
--- a/jetty-start/src/test/resources/usecases/assert-enable-spdy-bad-npn-version.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-# The XMLs we expect (order is important)
-
-# The LIBs we expect (order is irrelevant)
-
-# The Properties we expect (order is irrelevant)
-PROP|jetty.port=9090
-PROP|jetty.keystore=etc/keystore
-PROP|jetty.keystore.password=friendly
-PROP|jetty.keymanager.password=icecream
-PROP|jetty.truststore=etc/keystore
-PROP|jetty.truststore.password=sundae
-PROP|java.version=1.7.0_01
-
-# The Downloads
-
-# The Bootlib
diff --git a/jetty-start/src/test/resources/usecases/assert-enable-spdy.txt b/jetty-start/src/test/resources/usecases/assert-enable-spdy.txt
deleted file mode 100644
index a69eeb6..0000000
--- a/jetty-start/src/test/resources/usecases/assert-enable-spdy.txt
+++ /dev/null
@@ -1,49 +0,0 @@
-# The XMLs we expect (order is important)
-XML|${jetty.home}/etc/jetty-jmx.xml
-XML|${jetty.home}/etc/protonego-alpn.xml
-XML|${jetty.home}/etc/jetty.xml
-XML|${jetty.home}/etc/jetty-http.xml
-XML|${jetty.home}/etc/jetty-ssl.xml
-XML|${jetty.home}/etc/jetty-spdy.xml
-
-
-# The LIBs we expect (order is irrelevant)
-LIB|${jetty.home}/lib/jetty-continuation-TEST.jar
-LIB|${jetty.home}/lib/jetty-http-TEST.jar
-LIB|${jetty.home}/lib/jetty-io-TEST.jar
-LIB|${jetty.home}/lib/jetty-jmx-TEST.jar
-LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
-LIB|${jetty.home}/lib/jetty-server-TEST.jar
-LIB|${jetty.home}/lib/jetty-util-TEST.jar
-LIB|${jetty.home}/lib/jetty-xml-TEST.jar
-LIB|${jetty.home}/lib/servlet-api-3.1.jar
-LIB|${jetty.home}/lib/spdy/spdy-client-TEST.jar
-LIB|${jetty.home}/lib/spdy/spdy-http-server-TEST.jar
-LIB|${jetty.home}/lib/spdy/spdy-http-common-TEST.jar
-LIB|${jetty.home}/lib/spdy/spdy-server-TEST.jar
-LIB|${jetty.home}/lib/spdy/spdy-core-TEST.jar
-
-# The Properties we expect (order is irrelevant)
-PROP|jetty.port=9090
-PROP|jetty.secure.port=8443
-PROP|jetty.keystore=etc/keystore
-PROP|jetty.keystore.password=friendly
-PROP|jetty.keymanager.password=icecream
-PROP|jetty.truststore=etc/keystore
-PROP|jetty.truststore.password=sundae
-PROP|java.version=1.7.0_60
-PROP|protonego=alpn
-PROP|spdy.port=8443
-PROP|spdy.timeout=30000
-
-# The Downloads
-DOWNLOAD|http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-DOWNLOAD|http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/plain/jetty-server/src/main/config/etc/keystore|etc/keystore
-
-# The Bootlib
-BOOTLIB|-Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-# The Files
-FILE|lib/
-FILE|lib/alpn/
-
diff --git a/jetty-start/src/test/resources/usecases/assert-include-jetty-dir-logging.txt b/jetty-start/src/test/resources/usecases/assert-include-jetty-dir-logging.txt
deleted file mode 100644
index 4ecd847..0000000
--- a/jetty-start/src/test/resources/usecases/assert-include-jetty-dir-logging.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-# The XMLs we expect (order is important)
-XML|${jetty.home}/etc/jetty-jmx.xml
-XML|${maven-test-resources}/extra-jetty-dirs/logging/etc/jetty-logging.xml
-XML|${jetty.home}/etc/jetty.xml
-XML|${jetty.home}/etc/jetty-http.xml
-
-# The LIBs we expect (order is irrelevant)
-LIB|${jetty.home}/lib/jetty-continuation-TEST.jar
-LIB|${jetty.home}/lib/jetty-http-TEST.jar
-LIB|${jetty.home}/lib/jetty-io-TEST.jar
-LIB|${jetty.home}/lib/jetty-jmx-TEST.jar
-LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
-LIB|${jetty.home}/lib/jetty-server-TEST.jar
-LIB|${jetty.home}/lib/jetty-util-TEST.jar
-LIB|${jetty.home}/lib/jetty-xml-TEST.jar
-LIB|${jetty.home}/lib/servlet-api-3.1.jar
-LIB|${jetty.home}/resources
-LIB|${maven-test-resources}/extra-jetty-dirs/logging/lib/logging/logback.jar
-
-# The Properties we expect (order is irrelevant)
-PROP|jetty.port=9090
-
-# Files
-FILE|logs/
diff --git a/jetty-start/src/test/resources/usecases/assert-jmx.txt b/jetty-start/src/test/resources/usecases/assert-jmx.txt
deleted file mode 100644
index def27d7..0000000
--- a/jetty-start/src/test/resources/usecases/assert-jmx.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-# The XMLs we expect (order is important)
-XML|${jetty.home}/etc/jetty-jmx.xml
-XML|${jetty.home}/etc/jetty.xml
-XML|${jetty.home}/etc/jetty-http.xml
-
-# The LIBs we expect (order is irrelevant)
-LIB|${jetty.home}/lib/jetty-continuation-TEST.jar
-LIB|${jetty.home}/lib/jetty-http-TEST.jar
-LIB|${jetty.home}/lib/jetty-io-TEST.jar
-LIB|${jetty.home}/lib/jetty-jmx-TEST.jar
-LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
-LIB|${jetty.home}/lib/jetty-server-TEST.jar
-LIB|${jetty.home}/lib/jetty-util-TEST.jar
-LIB|${jetty.home}/lib/jetty-xml-TEST.jar
-LIB|${jetty.home}/lib/servlet-api-3.1.jar
-
-# The Properties we expect (order is irrelevant)
-PROP|jetty.port=9090
diff --git a/jetty-start/src/test/resources/usecases/assert-jsp-apache.txt b/jetty-start/src/test/resources/usecases/assert-jsp-apache.txt
deleted file mode 100644
index fe3d51c..0000000
--- a/jetty-start/src/test/resources/usecases/assert-jsp-apache.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-# The XMLs we expect (order is important)
-XML|${jetty.home}/etc/jetty.xml
-XML|${jetty.home}/etc/jetty-http.xml
-
-# The LIBs we expect (order is irrelevant)
-LIB|${jetty.home}/lib/jetty-continuation-TEST.jar
-LIB|${jetty.home}/lib/jetty-http-TEST.jar
-LIB|${jetty.home}/lib/jetty-io-TEST.jar
-LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
-LIB|${jetty.home}/lib/jetty-server-TEST.jar
-LIB|${jetty.home}/lib/jetty-servlet-TEST.jar
-LIB|${jetty.home}/lib/jetty-util-TEST.jar
-LIB|${jetty.home}/lib/jetty-xml-TEST.jar
-LIB|${jetty.home}/lib/servlet-api-3.1.jar
-LIB|${jetty.home}/lib/apache-jsp/javax.servlet.jsp.javax.servlet.jsp-api-TEST.jar
-LIB|${jetty.home}/lib/apache-jsp/org.eclipse.jetty.apache-jsp-TEST.jar
-LIB|${jetty.home}/lib/apache-jsp/org.eclipse.jetty.orbit.org.eclipse.jdt.core-TEST.jar
-LIB|${jetty.home}/lib/apache-jsp/org.mortbay.jasper.apache-el-TEST.jar
-LIB|${jetty.home}/lib/apache-jsp/org.mortbay.jasper.apache-jsp-TEST.jar
-
-# The Properties we expect (order is irrelevant)
-PROP|jetty.port=9090
-PROP|jsp-impl=apache
-
-# Files / Directories to create
-# FILE|lib/
diff --git a/jetty-start/src/test/resources/usecases/assert-jsp-glassfish.txt b/jetty-start/src/test/resources/usecases/assert-jsp-glassfish.txt
deleted file mode 100644
index 9c17c56..0000000
--- a/jetty-start/src/test/resources/usecases/assert-jsp-glassfish.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-# The XMLs we expect (order is important)
-XML|${jetty.home}/etc/jetty.xml
-XML|${jetty.home}/etc/jetty-http.xml
-
-# The LIBs we expect (order is irrelevant)
-LIB|${jetty.home}/lib/jetty-continuation-TEST.jar
-LIB|${jetty.home}/lib/jetty-http-TEST.jar
-LIB|${jetty.home}/lib/jetty-io-TEST.jar
-LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
-LIB|${jetty.home}/lib/jetty-server-TEST.jar
-LIB|${jetty.home}/lib/jetty-servlet-TEST.jar
-LIB|${jetty.home}/lib/jetty-util-TEST.jar
-LIB|${jetty.home}/lib/jetty-xml-TEST.jar
-LIB|${jetty.home}/lib/servlet-api-3.1.jar
-LIB|${jetty.home}/lib/jsp/javax.el-TEST.jar
-LIB|${jetty.home}/lib/jsp/javax.servlet.jsp.jstl-TEST.jar
-LIB|${jetty.home}/lib/jsp/javax.servlet.jsp-api-TEST.jar
-LIB|${jetty.home}/lib/jsp/javax.servlet.jsp-TEST.jar
-LIB|${jetty.home}/lib/jsp/jetty-jsp-jdt-TEST.jar
-LIB|${jetty.home}/lib/jsp/org.eclipse.jdt.core-TEST.jar
-LIB|${jetty.home}/lib/jsp/org.eclipse.jetty.orbit.javax.servlet.jsp.jstl-TEST.jar
-
-# The Properties we expect (order is irrelevant)
-PROP|jetty.port=9090
-PROP|jsp-impl=glassfish
-
-# Files / Directories to create
-# FILE|lib/
diff --git a/jetty-start/src/test/resources/usecases/assert-logging.txt b/jetty-start/src/test/resources/usecases/assert-logging.txt
deleted file mode 100644
index c83dc2c..0000000
--- a/jetty-start/src/test/resources/usecases/assert-logging.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-# The XMLs we expect (order is important)
-XML|${jetty.home}/etc/jetty.xml
-XML|${jetty.home}/etc/jetty-http.xml
-
-# The LIBs we expect (order is irrelevant)
-LIB|${jetty.home}/lib/jetty-continuation-TEST.jar
-LIB|${jetty.home}/lib/jetty-http-TEST.jar
-LIB|${jetty.home}/lib/jetty-io-TEST.jar
-LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
-LIB|${jetty.home}/lib/jetty-server-TEST.jar
-LIB|${jetty.home}/lib/jetty-util-TEST.jar
-LIB|${jetty.home}/lib/jetty-xml-TEST.jar
-LIB|${jetty.home}/lib/servlet-api-3.1.jar
-LIB|${jetty.base}/lib/logging/slf4j-api.jar
-LIB|${jetty.base}/lib/logging/jul-to-slf4j.jar
-LIB|${jetty.base}/lib/logging/logback-core.jar
-LIB|${jetty.base}/lib/logging/logback-classic.jar
-LIB|${jetty.base}/resources
-
-# The Properties we expect (order is irrelevant)
-PROP|jetty.port=9090
-
-# Other File References
-FILE|logs/
-FILE|resources/
-
-# Downloads
-DOWNLOAD|http://central.maven.org/maven2/org/slf4j/slf4j-api/1.6.6/slf4j-api-1.6.6.jar|lib/logging/slf4j-api-1.6.6.jar
-DOWNLOAD|http://repo1.maven.org/maven2/ch/qos/logback/logback-core/1.0.7/logback-core-1.0.7.jar|lib/logging/logback-core-1.0.7.jar
-DOWNLOAD|http://repo1.maven.org/maven2/ch/qos/logback/logback-classic/1.0.7/logback-classic-1.0.7.jar|lib/logging/logback-classic-1.0.7.jar
-DOWNLOAD|https://raw.githubusercontent.com/jetty-project/logging-modules/master/logback/logback.xml|resources/logback.xml
-DOWNLOAD|https://raw.githubusercontent.com/jetty-project/logging-modules/master/logback/jetty-logging.properties|resources/jetty-logging.properties
diff --git a/jetty-start/src/test/resources/usecases/assert-missing-npn-version.txt b/jetty-start/src/test/resources/usecases/assert-missing-npn-version.txt
deleted file mode 100644
index 884767a..0000000
--- a/jetty-start/src/test/resources/usecases/assert-missing-npn-version.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-# The XMLs we expect (order is important)
-XML|${jetty.home}/etc/jetty-jmx.xml
-XML|${jetty.home}/etc/jetty.xml
-XML|${jetty.home}/etc/jetty-http.xml
-
-# The LIBs we expect (order is irrelevant)
-LIB|${jetty.home}/lib/jetty-continuation-TEST.jar
-LIB|${jetty.home}/lib/jetty-http-TEST.jar
-LIB|${jetty.home}/lib/jetty-io-TEST.jar
-LIB|${jetty.home}/lib/jetty-jmx-TEST.jar
-LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
-LIB|${jetty.home}/lib/jetty-server-TEST.jar
-LIB|${jetty.home}/lib/jetty-util-TEST.jar
-LIB|${jetty.home}/lib/jetty-xml-TEST.jar
-LIB|${jetty.home}/lib/servlet-api-3.1.jar
-
-# The Properties we expect (order is irrelevant)
-PROP|jetty.port=9090
-PROP|jetty.keystore=etc/keystore
-PROP|jetty.keystore.password=friendly
-PROP|jetty.keymanager.password=icecream
-PROP|jetty.truststore=etc/keystore
-PROP|jetty.truststore.password=sundae
-PROP|java.version=1.7.0_01
-
-# The Downloads
-
-# The Bootlib
diff --git a/jetty-start/src/test/resources/usecases/assert-props.agent.txt b/jetty-start/src/test/resources/usecases/assert-props.agent.txt
deleted file mode 100644
index 27108ab..0000000
--- a/jetty-start/src/test/resources/usecases/assert-props.agent.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# The XMLs we expect (order is important)
-XML|${jetty.home}/etc/jetty-jmx.xml
-XML|${jetty.home}/etc/jetty.xml
-XML|${jetty.home}/etc/jetty-http.xml
-
-# The LIBs we expect (order is irrelevant)
-LIB|${jetty.home}/lib/jetty-continuation-TEST.jar
-LIB|${jetty.home}/lib/jetty-http-TEST.jar
-LIB|${jetty.home}/lib/jetty-io-TEST.jar
-LIB|${jetty.home}/lib/jetty-jmx-TEST.jar
-LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
-LIB|${jetty.home}/lib/jetty-server-TEST.jar
-LIB|${jetty.home}/lib/jetty-util-TEST.jar
-LIB|${jetty.home}/lib/jetty-xml-TEST.jar
-LIB|${jetty.home}/lib/servlet-api-3.1.jar
-LIB|${jetty.base}/lib/agent-jdk-1.6.jar
-
-# The Properties we expect (order is irrelevant)
-PROP|jetty.port=9090
-PROP|java.vm.specification.version=1.6
diff --git a/jetty-start/src/test/resources/usecases/assert-props.basic.txt b/jetty-start/src/test/resources/usecases/assert-props.basic.txt
deleted file mode 100644
index e56177e..0000000
--- a/jetty-start/src/test/resources/usecases/assert-props.basic.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-# The XMLs we expect (order is important)
-XML|${jetty.home}/etc/jetty.xml
-XML|${jetty.home}/etc/jetty-http.xml
-
-# The LIBs we expect (order is irrelevant)
-LIB|${jetty.home}/lib/jetty-continuation-TEST.jar
-LIB|${jetty.home}/lib/jetty-http-TEST.jar
-LIB|${jetty.home}/lib/jetty-io-TEST.jar
-LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
-LIB|${jetty.home}/lib/jetty-server-TEST.jar
-LIB|${jetty.home}/lib/jetty-util-TEST.jar
-LIB|${jetty.home}/lib/jetty-xml-TEST.jar
-LIB|${jetty.home}/lib/servlet-api-3.1.jar
-
-# The Properties we expect (order is irrelevant)
-PROP|jetty.port=9090
-PROP|port=9090
diff --git a/jetty-start/src/test/resources/usecases/assert-with-db.txt b/jetty-start/src/test/resources/usecases/assert-with-db.txt
deleted file mode 100644
index 1651974..0000000
--- a/jetty-start/src/test/resources/usecases/assert-with-db.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-# The XMLs we expect (order is important)
-XML|${jetty.home}/etc/jetty.xml
-XML|${jetty.home}/etc/jetty-http.xml
-XML|${jetty.home}/etc/jetty-plus.xml
-XML|${jetty.home}/etc/jetty-deploy.xml
-XML|${jetty.base}/etc/jetty-db.xml
-
-# The LIBs we expect (order is irrelevant)
-LIB|${jetty.home}/lib/jetty-http-TEST.jar
-LIB|${jetty.home}/lib/jetty-io-TEST.jar
-LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
-LIB|${jetty.home}/lib/jetty-server-TEST.jar
-LIB|${jetty.home}/lib/jetty-util-TEST.jar
-LIB|${jetty.home}/lib/jetty-xml-TEST.jar
-LIB|${jetty.home}/lib/servlet-api-3.1.jar
-LIB|${jetty.home}/lib/jetty-jndi-TEST.jar
-LIB|${jetty.home}/lib/jetty-continuation-TEST.jar
-LIB|${jetty.home}/lib/jndi/javax.transaction-api-1.2.jar
-LIB|${jetty.home}/lib/jetty-plus-TEST.jar
-LIB|${jetty.home}/lib/jetty-deploy-TEST.jar
-LIB|${jetty.home}/lib/jetty-security-TEST.jar
-LIB|${jetty.home}/lib/jndi/javax.activation-1.1.jar
-LIB|${jetty.home}/lib/jetty-webapp-TEST.jar
-LIB|${jetty.home}/lib/jetty-servlet-TEST.jar
-LIB|${jetty.base}/lib/db/mysql-driver.jar
-LIB|${jetty.base}/lib/db/bonecp.jar
-
-# The Properties we expect (order is irrelevant)
-PROP|jetty.port=9090
-PROP|mysql.user=frank
-PROP|mysql.pass=secret
\ No newline at end of file
diff --git a/jetty-start/src/test/resources/usecases/assert-with-module-persistence.txt b/jetty-start/src/test/resources/usecases/assert-with-module-persistence.txt
deleted file mode 100644
index 75fb89c..0000000
--- a/jetty-start/src/test/resources/usecases/assert-with-module-persistence.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-# The XMLs we expect (order is important)
-XML|${jetty.home}/etc/jetty.xml
-XML|${jetty.home}/etc/jetty-ssl.xml
-XML|${jetty.home}/etc/jetty-https.xml
-XML|${jetty.home}/etc/jetty-plus.xml
-XML|${jetty.home}/etc/jetty-annotations.xml
-XML|${jetty.home}/etc/jetty-websockets.xml
-
-# The LIBs we expect (order is irrelevant)
-LIB|${jetty.home}/lib/annotations/javax.annotation-api-1.2.jar
-LIB|${jetty.home}/lib/annotations/org.objectweb.asm-TEST.jar
-LIB|${jetty.home}/lib/jetty-annotations-TEST.jar
-LIB|${jetty.home}/lib/jetty-continuation-TEST.jar
-LIB|${jetty.home}/lib/jetty-http-TEST.jar
-LIB|${jetty.home}/lib/jetty-io-TEST.jar
-LIB|${jetty.home}/lib/jetty-jndi-TEST.jar
-LIB|${jetty.home}/lib/jetty-plus-TEST.jar
-LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
-LIB|${jetty.home}/lib/jetty-security-TEST.jar
-LIB|${jetty.home}/lib/jetty-server-TEST.jar
-LIB|${jetty.home}/lib/jetty-util-TEST.jar
-LIB|${jetty.home}/lib/jetty-xml-TEST.jar
-LIB|${jetty.home}/lib/jndi/javax.activation-1.1.jar
-LIB|${jetty.home}/lib/jndi/javax.transaction-api-1.2.jar
-LIB|${jetty.home}/lib/servlet-api-3.1.jar
-LIB|${jetty.home}/lib/websocket/javax.websocket-api-1.0.jar
-LIB|${jetty.home}/lib/websocket/javax-websocket-client-impl-TEST.jar
-LIB|${jetty.home}/lib/websocket/javax-websocket-server-impl-TEST.jar
-LIB|${jetty.home}/lib/websocket/websocket-api-TEST.jar
-LIB|${jetty.home}/lib/websocket/websocket-client-TEST.jar
-LIB|${jetty.home}/lib/websocket/websocket-common-TEST.jar
-LIB|${jetty.home}/lib/websocket/websocket-server-TEST.jar
-LIB|${jetty.home}/lib/websocket/websocket-servlet-TEST.jar
-
-# The Properties we expect (order is irrelevant)
-PROP|jetty.port=12345
-PROP|jetty.keystore=etc/keystore
-PROP|jetty.keystore.password=friendly
-PROP|jetty.keymanager.password=icecream
-PROP|jetty.truststore=etc/keystore
-PROP|jetty.truststore.password=sundae
-
-# JVM Args
-# JVM|-Xms1024m
diff --git a/jetty-start/src/test/resources/usecases/assert-with.ext.txt b/jetty-start/src/test/resources/usecases/assert-with.ext.txt
deleted file mode 100644
index 7759a41..0000000
--- a/jetty-start/src/test/resources/usecases/assert-with.ext.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-# The XMLs we expect (order is important)
-XML|${jetty.home}/etc/jetty.xml
-XML|${jetty.home}/etc/jetty-http.xml
-
-# The LIBs we expect (order is irrelevant)
-LIB|${jetty.home}/lib/jetty-continuation-TEST.jar
-LIB|${jetty.home}/lib/jetty-http-TEST.jar
-LIB|${jetty.home}/lib/jetty-io-TEST.jar
-LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
-LIB|${jetty.home}/lib/jetty-server-TEST.jar
-LIB|${jetty.home}/lib/jetty-util-TEST.jar
-LIB|${jetty.home}/lib/jetty-xml-TEST.jar
-LIB|${jetty.home}/lib/servlet-api-3.1.jar
-LIB|${jetty.base}/lib/ext/agent.jar
-LIB|${jetty.base}/lib/ext/jdbc/mariadb-jdbc.jar
-LIB|${jetty.base}/lib/ext/logging/slf4j-api.jar
-LIB|${jetty.base}/lib/ext/logging/jul-to-slf4j.jar
-LIB|${jetty.base}/lib/ext/logging/logback-core.jar
-LIB|${jetty.base}/lib/ext/logging/logback-classic.jar
-
-# The Properties we expect (order is irrelevant)
-PROP|jetty.port=9090
-
-# Files / Directories to create
-FILE|lib/
-FILE|lib/ext/
diff --git a/jetty-start/src/test/resources/usecases/barebones.assert.txt b/jetty-start/src/test/resources/usecases/barebones.assert.txt
new file mode 100644
index 0000000..3314346
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/barebones.assert.txt
@@ -0,0 +1,29 @@
+# The XMLs we expect (order is important)
+XML|${jetty.home}/etc/jetty.xml
+XML|${jetty.home}/etc/jetty-http.xml
+
+# The LIBs we expect (order is irrelevant)
+LIB|${jetty.home}/lib/jetty-http-9.3.jar
+LIB|${jetty.home}/lib/jetty-io-9.3.jar
+LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
+LIB|${jetty.home}/lib/jetty-server-9.3.jar
+LIB|${jetty.home}/lib/jetty-util-9.3.jar
+LIB|${jetty.home}/lib/jetty-xml-9.3.jar
+LIB|${jetty.home}/lib/servlet-api-3.1.jar
+
+# The Properties we expect (order is irrelevant)
+# (this is the property we actually set in jetty.base)
+PROP|jetty.http.port=9090
+# (these are the ones set by default from jetty.home modules)
+# PROP|jetty.http.idleTimeout=30000
+# PROP|jetty.httpConfig.delayDispatchUntilContent=false
+# PROP|jetty.server.dumpAfterStart=false
+# PROP|jetty.server.dumpBeforeStop=false
+# PROP|jetty.httpConfig.outputBufferSize=32768
+# PROP|jetty.httpConfig.requestHeaderSize=8192
+# PROP|jetty.httpConfig.responseHeaderSize=8192
+# PROP|jetty.httpConfig.sendDateHeader=false
+# PROP|jetty.httpConfig.sendServerVersion=true
+# PROP|jetty.threadPool.maxThreads=200
+# PROP|jetty.threadPool.minThreads=10
+# PROP|jetty.threadPool.idleTimeout=60000
diff --git a/jetty-start/src/test/resources/usecases/barebones/start.ini b/jetty-start/src/test/resources/usecases/barebones/start.ini
new file mode 100644
index 0000000..a3d92b9
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/barebones/start.ini
@@ -0,0 +1,5 @@
+
+--module=server
+--module=http
+
+jetty.http.port=9090
diff --git a/jetty-start/src/test/resources/usecases/base.barebones/start.ini b/jetty-start/src/test/resources/usecases/base.barebones/start.ini
deleted file mode 100644
index 1c0e065..0000000
--- a/jetty-start/src/test/resources/usecases/base.barebones/start.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-
---module=server
---module=http
-
-jetty.port=9090
diff --git a/jetty-start/src/test/resources/usecases/base.enable.spdy.bad.npn.version/start.ini b/jetty-start/src/test/resources/usecases/base.enable.spdy.bad.npn.version/start.ini
deleted file mode 100644
index 13fa508..0000000
--- a/jetty-start/src/test/resources/usecases/base.enable.spdy.bad.npn.version/start.ini
+++ /dev/null
@@ -1,12 +0,0 @@
-
---module=server,http,jmx,spdy
-
-jetty.port=9090
-
-# Some SSL keystore configuration
-jetty.keystore=etc/keystore
-jetty.keystore.password=friendly
-jetty.keymanager.password=icecream
-jetty.truststore=etc/keystore
-jetty.truststore.password=sundae
-
diff --git a/jetty-start/src/test/resources/usecases/base.enable.spdy/start.ini b/jetty-start/src/test/resources/usecases/base.enable.spdy/start.ini
deleted file mode 100644
index 13fa508..0000000
--- a/jetty-start/src/test/resources/usecases/base.enable.spdy/start.ini
+++ /dev/null
@@ -1,12 +0,0 @@
-
---module=server,http,jmx,spdy
-
-jetty.port=9090
-
-# Some SSL keystore configuration
-jetty.keystore=etc/keystore
-jetty.keystore.password=friendly
-jetty.keymanager.password=icecream
-jetty.truststore=etc/keystore
-jetty.truststore.password=sundae
-
diff --git a/jetty-start/src/test/resources/usecases/base.jmx/start.ini b/jetty-start/src/test/resources/usecases/base.jmx/start.ini
deleted file mode 100644
index d3950e6..0000000
--- a/jetty-start/src/test/resources/usecases/base.jmx/start.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-
---module=server,http,jmx
-
-jetty.port=9090
diff --git a/jetty-start/src/test/resources/usecases/base.logging/start.ini b/jetty-start/src/test/resources/usecases/base.logging/start.ini
deleted file mode 100644
index e18ff3d..0000000
--- a/jetty-start/src/test/resources/usecases/base.logging/start.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-
---module=server
---module=http
---module=logging
---module=resources
-
-jetty.port=9090
diff --git a/jetty-start/src/test/resources/usecases/base.missing.npn.version/start.ini b/jetty-start/src/test/resources/usecases/base.missing.npn.version/start.ini
deleted file mode 100644
index 2915961..0000000
--- a/jetty-start/src/test/resources/usecases/base.missing.npn.version/start.ini
+++ /dev/null
@@ -1,12 +0,0 @@
-
---module=server,http,jmx
-
-jetty.port=9090
-
-# Some SSL keystore configuration
-jetty.keystore=etc/keystore
-jetty.keystore.password=friendly
-jetty.keymanager.password=icecream
-jetty.truststore=etc/keystore
-jetty.truststore.password=sundae
-
diff --git a/jetty-start/src/test/resources/usecases/base.props.agent/start.ini b/jetty-start/src/test/resources/usecases/base.props.agent/start.ini
deleted file mode 100644
index 198a07c..0000000
--- a/jetty-start/src/test/resources/usecases/base.props.agent/start.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-
---module=http,agent
-
-jetty.port=9090
diff --git a/jetty-start/src/test/resources/usecases/base.props.basic/start.ini b/jetty-start/src/test/resources/usecases/base.props.basic/start.ini
deleted file mode 100644
index f80bdb2..0000000
--- a/jetty-start/src/test/resources/usecases/base.props.basic/start.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-
---module=server
---module=http
-
-jetty.port=${port}
diff --git a/jetty-start/src/test/resources/usecases/base.with.db/start.ini b/jetty-start/src/test/resources/usecases/base.with.db/start.ini
deleted file mode 100644
index d5513df..0000000
--- a/jetty-start/src/test/resources/usecases/base.with.db/start.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-
---module=http,db
-
-mysql.user=frank
-mysql.pass=secret
-
-jetty.port=9090
diff --git a/jetty-start/src/test/resources/usecases/base.with.ext/start.ini b/jetty-start/src/test/resources/usecases/base.with.ext/start.ini
deleted file mode 100644
index c8fa930..0000000
--- a/jetty-start/src/test/resources/usecases/base.with.ext/start.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-
---module=server
---module=http
---module=ext
-
-jetty.port=9090
diff --git a/jetty-start/src/test/resources/usecases/base.with.include.jetty.dirs/start.ini b/jetty-start/src/test/resources/usecases/base.with.include.jetty.dirs/start.ini
deleted file mode 100644
index 9e16be6..0000000
--- a/jetty-start/src/test/resources/usecases/base.with.include.jetty.dirs/start.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-
---include-jetty-dir=${start.basedir}/../../extra-jetty-dirs/logging
---module=server,http,jmx
-
-jetty.port=9090
diff --git a/jetty-start/src/test/resources/usecases/base.with.jsp.apache/start.ini b/jetty-start/src/test/resources/usecases/base.with.jsp.apache/start.ini
deleted file mode 100644
index fcdea02..0000000
--- a/jetty-start/src/test/resources/usecases/base.with.jsp.apache/start.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-
---module=server
---module=http
---module=jsp
-jsp-impl=apache
-
-jetty.port=9090
diff --git a/jetty-start/src/test/resources/usecases/base.with.jsp.bad/start.ini b/jetty-start/src/test/resources/usecases/base.with.jsp.bad/start.ini
deleted file mode 100644
index 96e495a..0000000
--- a/jetty-start/src/test/resources/usecases/base.with.jsp.bad/start.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-
---module=server
---module=http
---module=jsp
-jsp-impl=bogus
-
-jetty.port=9090
diff --git a/jetty-start/src/test/resources/usecases/base.with.jsp.default/start.ini b/jetty-start/src/test/resources/usecases/base.with.jsp.default/start.ini
deleted file mode 100644
index bf58fa8..0000000
--- a/jetty-start/src/test/resources/usecases/base.with.jsp.default/start.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-
---module=server
---module=http
---module=jsp
-
-jetty.port=9090
diff --git a/jetty-start/src/test/resources/usecases/base.with.jsp.glassfish/start.ini b/jetty-start/src/test/resources/usecases/base.with.jsp.glassfish/start.ini
deleted file mode 100644
index 7107ade..0000000
--- a/jetty-start/src/test/resources/usecases/base.with.jsp.glassfish/start.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-
---module=server
---module=http
---module=jsp
-jsp-impl=glassfish
-
-jetty.port=9090
diff --git a/jetty-start/src/test/resources/usecases/basic-properties.assert.txt b/jetty-start/src/test/resources/usecases/basic-properties.assert.txt
new file mode 100644
index 0000000..ab45829
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/basic-properties.assert.txt
@@ -0,0 +1,30 @@
+# The XMLs we expect (order is important)
+XML|${jetty.home}/etc/jetty.xml
+XML|${jetty.home}/etc/jetty-http.xml
+
+# The LIBs we expect (order is irrelevant)
+LIB|${jetty.home}/lib/jetty-http-9.3.jar
+LIB|${jetty.home}/lib/jetty-io-9.3.jar
+LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
+LIB|${jetty.home}/lib/jetty-server-9.3.jar
+LIB|${jetty.home}/lib/jetty-util-9.3.jar
+LIB|${jetty.home}/lib/jetty-xml-9.3.jar
+LIB|${jetty.home}/lib/servlet-api-3.1.jar
+
+# The Properties we expect (order is irrelevant)
+# (this is the property we actually set in jetty.base)
+PROP|jetty.http.port=9090
+PROP|port=9090
+# (these are the ones set by default from jetty.home modules)
+# PROP|jetty.http.idleTimeout=30000
+# PROP|jetty.httpConfig.delayDispatchUntilContent=false
+# PROP|jetty.server.dumpAfterStart=false
+# PROP|jetty.server.dumpBeforeStop=false
+# PROP|jetty.httpConfig.outputBufferSize=32768
+# PROP|jetty.httpConfig.requestHeaderSize=8192
+# PROP|jetty.httpConfig.responseHeaderSize=8192
+# PROP|jetty.httpConfig.sendDateHeader=false
+# PROP|jetty.httpConfig.sendServerVersion=true
+# PROP|jetty.threadPool.maxThreads=200
+# PROP|jetty.threadPool.minThreads=10
+# PROP|jetty.threadPool.idleTimeout=60000
diff --git a/jetty-start/src/test/resources/usecases/basic-properties/start.ini b/jetty-start/src/test/resources/usecases/basic-properties/start.ini
new file mode 100644
index 0000000..eaef9da
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/basic-properties/start.ini
@@ -0,0 +1,5 @@
+
+--module=server
+--module=http
+
+jetty.http.port=${port}
diff --git a/jetty-start/src/test/resources/usecases/database.assert.txt b/jetty-start/src/test/resources/usecases/database.assert.txt
new file mode 100644
index 0000000..e8fd0ec
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/database.assert.txt
@@ -0,0 +1,47 @@
+# The XMLs we expect (order is important)
+XML|${jetty.home}/etc/jetty.xml
+XML|${jetty.home}/etc/jetty-http.xml
+XML|${jetty.home}/etc/jetty-deploy.xml
+XML|${jetty.home}/etc/jetty-plus.xml
+XML|${jetty.base}/etc/jetty-db.xml
+
+# The LIBs we expect (order is irrelevant)
+LIB|${jetty.home}/lib/jetty-http-9.3.jar
+LIB|${jetty.home}/lib/jetty-io-9.3.jar
+LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
+LIB|${jetty.home}/lib/jetty-server-9.3.jar
+LIB|${jetty.home}/lib/jetty-util-9.3.jar
+LIB|${jetty.home}/lib/jetty-xml-9.3.jar
+LIB|${jetty.home}/lib/servlet-api-3.1.jar
+LIB|${jetty.home}/lib/jetty-jndi-9.3.jar
+LIB|${jetty.home}/lib/jndi/javax.mail.glassfish-1.4.1.v201005082020.jar
+LIB|${jetty.home}/lib/jndi/javax.transaction-api-1.2.jar
+LIB|${jetty.home}/lib/jetty-plus-9.3.jar
+LIB|${jetty.home}/lib/jetty-deploy-9.3.jar
+LIB|${jetty.home}/lib/jetty-security-9.3.jar
+LIB|${jetty.home}/lib/jetty-webapp-9.3.jar
+LIB|${jetty.home}/lib/jetty-servlet-9.3.jar
+LIB|${jetty.base}/lib/db/mysql-driver.jar
+LIB|${jetty.base}/lib/db/bonecp.jar
+
+# The Properties we expect (order is irrelevant)
+# (this is the property we actually set in jetty.base)
+PROP|jetty.http.port=9090
+PROP|mysql.user=frank
+PROP|mysql.pass=secret
+# (these are the ones set by default from jetty.home modules)
+# PROP|jetty.http.idleTimeout=30000
+# PROP|jetty.httpConfig.delayDispatchUntilContent=false
+# PROP|jetty.server.dumpAfterStart=false
+# PROP|jetty.server.dumpBeforeStop=false
+# PROP|jetty.httpConfig.outputBufferSize=32768
+# PROP|jetty.httpConfig.requestHeaderSize=8192
+# PROP|jetty.httpConfig.responseHeaderSize=8192
+# PROP|jetty.httpConfig.sendDateHeader=false
+# PROP|jetty.httpConfig.sendServerVersion=true
+# PROP|jetty.threadPool.maxThreads=200
+# PROP|jetty.threadPool.minThreads=10
+# PROP|jetty.threadPool.idleTimeout=60000
+
+# Files / Directories to create
+FILE|webapps/
diff --git a/jetty-start/src/test/resources/usecases/base.with.db/etc/jetty-db.xml b/jetty-start/src/test/resources/usecases/database/etc/jetty-db.xml
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.with.db/etc/jetty-db.xml
rename to jetty-start/src/test/resources/usecases/database/etc/jetty-db.xml
diff --git a/jetty-start/src/test/resources/usecases/base.with.db/lib/db/bonecp.jar b/jetty-start/src/test/resources/usecases/database/lib/db/bonecp.jar
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.with.db/lib/db/bonecp.jar
rename to jetty-start/src/test/resources/usecases/database/lib/db/bonecp.jar
diff --git a/jetty-start/src/test/resources/usecases/base.with.db/lib/db/mysql-driver.jar b/jetty-start/src/test/resources/usecases/database/lib/db/mysql-driver.jar
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.with.db/lib/db/mysql-driver.jar
rename to jetty-start/src/test/resources/usecases/database/lib/db/mysql-driver.jar
diff --git a/jetty-start/src/test/resources/usecases/base.with.db/modules/db.mod b/jetty-start/src/test/resources/usecases/database/modules/db.mod
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.with.db/modules/db.mod
rename to jetty-start/src/test/resources/usecases/database/modules/db.mod
diff --git a/jetty-start/src/test/resources/usecases/database/start.ini b/jetty-start/src/test/resources/usecases/database/start.ini
new file mode 100644
index 0000000..a9a013b
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/database/start.ini
@@ -0,0 +1,7 @@
+
+--module=http,db
+
+mysql.user=frank
+mysql.pass=secret
+
+jetty.http.port=9090
diff --git a/jetty-start/src/test/resources/usecases/deep-ext.assert.txt b/jetty-start/src/test/resources/usecases/deep-ext.assert.txt
new file mode 100644
index 0000000..bb8684e
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/deep-ext.assert.txt
@@ -0,0 +1,39 @@
+# The XMLs we expect (order is important)
+XML|${jetty.home}/etc/jetty.xml
+XML|${jetty.home}/etc/jetty-http.xml
+
+# The LIBs we expect (order is irrelevant)
+LIB|${jetty.home}/lib/jetty-http-9.3.jar
+LIB|${jetty.home}/lib/jetty-io-9.3.jar
+LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
+LIB|${jetty.home}/lib/jetty-server-9.3.jar
+LIB|${jetty.home}/lib/jetty-util-9.3.jar
+LIB|${jetty.home}/lib/jetty-xml-9.3.jar
+LIB|${jetty.home}/lib/servlet-api-3.1.jar
+LIB|${jetty.base}/lib/ext/agent.jar
+LIB|${jetty.base}/lib/ext/jdbc/mariadb-jdbc.jar
+LIB|${jetty.base}/lib/ext/logging/slf4j-api.jar
+LIB|${jetty.base}/lib/ext/logging/jul-to-slf4j.jar
+LIB|${jetty.base}/lib/ext/logging/logback-core.jar
+LIB|${jetty.base}/lib/ext/logging/logback-classic.jar
+
+# The Properties we expect (order is irrelevant)
+# (this is the property we actually set in jetty.base)
+PROP|jetty.http.port=9090
+# (these are the ones set by default from jetty.home modules)
+# PROP|jetty.http.idleTimeout=30000
+# PROP|jetty.httpConfig.delayDispatchUntilContent=false
+# PROP|jetty.server.dumpAfterStart=false
+# PROP|jetty.server.dumpBeforeStop=false
+# PROP|jetty.httpConfig.outputBufferSize=32768
+# PROP|jetty.httpConfig.requestHeaderSize=8192
+# PROP|jetty.httpConfig.responseHeaderSize=8192
+# PROP|jetty.httpConfig.sendDateHeader=false
+# PROP|jetty.httpConfig.sendServerVersion=true
+# PROP|jetty.threadPool.maxThreads=200
+# PROP|jetty.threadPool.minThreads=10
+# PROP|jetty.threadPool.idleTimeout=60000
+
+# Files / Directories to create
+FILE|lib/
+FILE|lib/ext/
diff --git a/jetty-start/src/test/resources/usecases/base.with.ext/lib/ext/agent.jar b/jetty-start/src/test/resources/usecases/deep-ext/lib/ext/agent.jar
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.with.ext/lib/ext/agent.jar
rename to jetty-start/src/test/resources/usecases/deep-ext/lib/ext/agent.jar
diff --git a/jetty-start/src/test/resources/usecases/base.with.ext/lib/ext/jdbc/mariadb-jdbc.jar b/jetty-start/src/test/resources/usecases/deep-ext/lib/ext/jdbc/mariadb-jdbc.jar
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.with.ext/lib/ext/jdbc/mariadb-jdbc.jar
rename to jetty-start/src/test/resources/usecases/deep-ext/lib/ext/jdbc/mariadb-jdbc.jar
diff --git a/jetty-start/src/test/resources/usecases/base.with.ext/lib/ext/logging/jul-to-slf4j.jar b/jetty-start/src/test/resources/usecases/deep-ext/lib/ext/logging/jul-to-slf4j.jar
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.with.ext/lib/ext/logging/jul-to-slf4j.jar
rename to jetty-start/src/test/resources/usecases/deep-ext/lib/ext/logging/jul-to-slf4j.jar
diff --git a/jetty-start/src/test/resources/usecases/base.with.ext/lib/ext/logging/logback-classic.jar b/jetty-start/src/test/resources/usecases/deep-ext/lib/ext/logging/logback-classic.jar
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.with.ext/lib/ext/logging/logback-classic.jar
rename to jetty-start/src/test/resources/usecases/deep-ext/lib/ext/logging/logback-classic.jar
diff --git a/jetty-start/src/test/resources/usecases/base.with.ext/lib/ext/logging/logback-core.jar b/jetty-start/src/test/resources/usecases/deep-ext/lib/ext/logging/logback-core.jar
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.with.ext/lib/ext/logging/logback-core.jar
rename to jetty-start/src/test/resources/usecases/deep-ext/lib/ext/logging/logback-core.jar
diff --git a/jetty-start/src/test/resources/usecases/base.with.ext/lib/ext/logging/slf4j-api.jar b/jetty-start/src/test/resources/usecases/deep-ext/lib/ext/logging/slf4j-api.jar
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.with.ext/lib/ext/logging/slf4j-api.jar
rename to jetty-start/src/test/resources/usecases/deep-ext/lib/ext/logging/slf4j-api.jar
diff --git a/jetty-start/src/test/resources/usecases/base.with.ext/lib/jetty-util-alt.jar b/jetty-start/src/test/resources/usecases/deep-ext/lib/jetty-util-alt.jar
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.with.ext/lib/jetty-util-alt.jar
rename to jetty-start/src/test/resources/usecases/deep-ext/lib/jetty-util-alt.jar
diff --git a/jetty-start/src/test/resources/usecases/deep-ext/start.ini b/jetty-start/src/test/resources/usecases/deep-ext/start.ini
new file mode 100644
index 0000000..2165a30
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/deep-ext/start.ini
@@ -0,0 +1,6 @@
+
+--module=server
+--module=http
+--module=ext
+
+jetty.http.port=9090
diff --git a/jetty-start/src/test/resources/usecases/home/etc/README.spnego b/jetty-start/src/test/resources/usecases/home/etc/README.spnego
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/README.spnego
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jdbcRealm.properties b/jetty-start/src/test/resources/usecases/home/etc/jdbcRealm.properties
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jdbcRealm.properties
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-annotations.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-annotations.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-annotations.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-contexts.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-contexts.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-contexts.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-debug.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-debug.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-debug.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-demo.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-demo.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-demo.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-deploy.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-deploy.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-deploy.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-http.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-http.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-http.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-https.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-https.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-https.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-ipaccess.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-ipaccess.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-ipaccess.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-jaas.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-jaas.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-jaas.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-jmx.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-jmx.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-jmx.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-logging.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-logging.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-logging.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-lowresources.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-lowresources.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-lowresources.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-monitor.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-monitor.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-monitor.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-plus.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-plus.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-plus.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-proxy.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-proxy.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-proxy.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-requestlog.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-requestlog.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-requestlog.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-rewrite.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-rewrite.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-rewrite.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-setuid.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-setuid.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-setuid.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-spdy-proxy.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-spdy-proxy.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-spdy-proxy.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-spdy.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-spdy.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-spdy.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-ssl.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-ssl.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-ssl.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-started.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-started.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-started.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-stats.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-stats.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-stats.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-testrealm.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-testrealm.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-testrealm.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-webapps.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-webapps.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-webapps.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-websockets.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-websockets.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-websockets.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty-xinetd.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty-xinetd.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty-xinetd.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty.conf b/jetty-start/src/test/resources/usecases/home/etc/jetty.conf
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty.conf
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/jetty.xml b/jetty-start/src/test/resources/usecases/home/etc/jetty.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/jetty.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/keystore b/jetty-start/src/test/resources/usecases/home/etc/keystore
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/keystore
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/krb5.ini b/jetty-start/src/test/resources/usecases/home/etc/krb5.ini
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/krb5.ini
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/protonego-alpn.xml b/jetty-start/src/test/resources/usecases/home/etc/protonego-alpn.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/protonego-alpn.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/protonego-npn.xml b/jetty-start/src/test/resources/usecases/home/etc/protonego-npn.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/protonego-npn.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/spnego.conf b/jetty-start/src/test/resources/usecases/home/etc/spnego.conf
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/spnego.conf
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/spnego.properties b/jetty-start/src/test/resources/usecases/home/etc/spnego.properties
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/spnego.properties
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/test-realm.xml b/jetty-start/src/test/resources/usecases/home/etc/test-realm.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/test-realm.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/etc/webdefault.xml b/jetty-start/src/test/resources/usecases/home/etc/webdefault.xml
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/etc/webdefault.xml
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/annotations/javax.annotation-api-1.2.jar b/jetty-start/src/test/resources/usecases/home/lib/annotations/javax.annotation-api-1.2.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/annotations/javax.annotation-api-1.2.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/annotations/org.objectweb.asm-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/annotations/org.objectweb.asm-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/annotations/org.objectweb.asm-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/apache-jsp/javax.servlet.jsp.javax.servlet.jsp-api-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/apache-jsp/javax.servlet.jsp.javax.servlet.jsp-api-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/apache-jsp/javax.servlet.jsp.javax.servlet.jsp-api-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/apache-jsp/org.eclipse.jetty.apache-jsp-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/apache-jsp/org.eclipse.jetty.apache-jsp-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/apache-jsp/org.eclipse.jetty.apache-jsp-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/apache-jsp/org.eclipse.jetty.orbit.org.eclipse.jdt.core-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/apache-jsp/org.eclipse.jetty.orbit.org.eclipse.jdt.core-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/apache-jsp/org.eclipse.jetty.orbit.org.eclipse.jdt.core-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/apache-jsp/org.mortbay.jasper.apache-el-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/apache-jsp/org.mortbay.jasper.apache-el-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/apache-jsp/org.mortbay.jasper.apache-el-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/apache-jsp/org.mortbay.jasper.apache-jsp-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/apache-jsp/org.mortbay.jasper.apache-jsp-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/apache-jsp/org.mortbay.jasper.apache-jsp-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/apache-jstl/org.apache.taglibs.taglibs-standard-impl-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/apache-jstl/org.apache.taglibs.taglibs-standard-impl-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/apache-jstl/org.apache.taglibs.taglibs-standard-impl-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/apache-jstl/org.apache.taglibs.taglibs-standard-spec-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/apache-jstl/org.apache.taglibs.taglibs-standard-spec-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/apache-jstl/org.apache.taglibs.taglibs-standard-spec-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/ext/.nodelete b/jetty-start/src/test/resources/usecases/home/lib/ext/.nodelete
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/ext/.nodelete
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-annotations-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-annotations-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-annotations-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-client-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-client-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-client-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-continuation-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-continuation-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-continuation-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-deploy-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-deploy-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-deploy-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-http-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-http-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-http-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-io-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-io-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-io-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-jaas-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-jaas-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-jaas-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-jmx-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-jmx-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-jmx-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-jndi-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-jndi-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-jndi-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-jsp-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-jsp-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-jsp-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-plus-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-plus-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-plus-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-proxy-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-proxy-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-proxy-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-rewrite-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-rewrite-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-rewrite-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-schemas-3.1.RC0.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-schemas-3.1.RC0.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-schemas-3.1.RC0.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-schemas-3.1.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-schemas-3.1.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-schemas-3.1.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-security-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-security-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-security-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-server-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-server-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-server-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-servlet-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-servlet-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-servlet-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-servlets-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-servlets-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-servlets-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-util-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-util-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-util-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-webapp-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-webapp-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-webapp-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jetty-xml-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jetty-xml-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jetty-xml-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jndi/javax.activation-1.1.jar b/jetty-start/src/test/resources/usecases/home/lib/jndi/javax.activation-1.1.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jndi/javax.activation-1.1.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jndi/javax.transaction-api-1.2.jar b/jetty-start/src/test/resources/usecases/home/lib/jndi/javax.transaction-api-1.2.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jndi/javax.transaction-api-1.2.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jsp/javax.el-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jsp/javax.el-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jsp/javax.el-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jsp/javax.servlet.jsp-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jsp/javax.servlet.jsp-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jsp/javax.servlet.jsp-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jsp/javax.servlet.jsp-api-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jsp/javax.servlet.jsp-api-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jsp/javax.servlet.jsp-api-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jsp/javax.servlet.jsp.jstl-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jsp/javax.servlet.jsp.jstl-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jsp/javax.servlet.jsp.jstl-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jsp/jetty-jsp-jdt-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jsp/jetty-jsp-jdt-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jsp/jetty-jsp-jdt-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jsp/org.eclipse.jdt.core-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jsp/org.eclipse.jdt.core-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jsp/org.eclipse.jdt.core-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/jsp/org.eclipse.jetty.orbit.javax.servlet.jsp.jstl-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/jsp/org.eclipse.jetty.orbit.javax.servlet.jsp.jstl-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/jsp/org.eclipse.jetty.orbit.javax.servlet.jsp.jstl-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/monitor/jetty-monitor-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/monitor/jetty-monitor-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/monitor/jetty-monitor-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/servlet-api-3.1.jar b/jetty-start/src/test/resources/usecases/home/lib/servlet-api-3.1.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/servlet-api-3.1.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/setuid/jetty-setuid-java-1.0.1.jar b/jetty-start/src/test/resources/usecases/home/lib/setuid/jetty-setuid-java-1.0.1.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/setuid/jetty-setuid-java-1.0.1.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/setuid/libsetuid-linux.so b/jetty-start/src/test/resources/usecases/home/lib/setuid/libsetuid-linux.so
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/setuid/libsetuid-linux.so
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/setuid/libsetuid-osx.so b/jetty-start/src/test/resources/usecases/home/lib/setuid/libsetuid-osx.so
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/setuid/libsetuid-osx.so
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/spdy/spdy-client-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/spdy/spdy-client-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/spdy/spdy-client-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/spdy/spdy-core-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/spdy/spdy-core-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/spdy/spdy-core-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/spdy/spdy-http-common-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/spdy/spdy-http-common-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/spdy/spdy-http-common-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/spdy/spdy-http-server-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/spdy/spdy-http-server-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/spdy/spdy-http-server-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/spdy/spdy-server-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/spdy/spdy-server-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/spdy/spdy-server-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/websocket/javax-websocket-client-impl-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/websocket/javax-websocket-client-impl-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/websocket/javax-websocket-client-impl-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/websocket/javax-websocket-server-impl-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/websocket/javax-websocket-server-impl-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/websocket/javax-websocket-server-impl-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/websocket/javax.websocket-api-1.0.jar b/jetty-start/src/test/resources/usecases/home/lib/websocket/javax.websocket-api-1.0.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/websocket/javax.websocket-api-1.0.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/websocket/websocket-api-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/websocket/websocket-api-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/websocket/websocket-api-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/websocket/websocket-client-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/websocket/websocket-client-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/websocket/websocket-client-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/websocket/websocket-common-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/websocket/websocket-common-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/websocket/websocket-common-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/websocket/websocket-server-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/websocket/websocket-server-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/websocket/websocket-server-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/lib/websocket/websocket-servlet-TEST.jar b/jetty-start/src/test/resources/usecases/home/lib/websocket/websocket-servlet-TEST.jar
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/lib/websocket/websocket-servlet-TEST.jar
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/modules/annotations.mod b/jetty-start/src/test/resources/usecases/home/modules/annotations.mod
deleted file mode 100644
index 65e4654..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/annotations.mod
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Jetty Annotation Scanning Module
-#
-
-[depend]
-# Annotations needs plus, and jndi features
-plus
-
-[lib]
-# Annotations needs jetty annotation jars
-lib/jetty-annotations-${jetty.version}.jar
-# Need annotation processing jars too
-lib/annotations/*.jar
-
-[xml]
-# Enable annotation scanning webapp configurations
-etc/jetty-annotations.xml
diff --git a/jetty-start/src/test/resources/usecases/home/modules/base.mod b/jetty-start/src/test/resources/usecases/home/modules/base.mod
deleted file mode 100644
index ad8ea32..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/base.mod
+++ /dev/null
@@ -1,11 +0,0 @@
-#
-# Base Module
-#
-
-[optional]
-# JMX is optional, if it appears in the module tree then depend on it
-jmx
-
-[lib]
-lib/jetty-util-${jetty.version}.jar
-lib/jetty-io-${jetty.version}.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/client.mod b/jetty-start/src/test/resources/usecases/home/modules/client.mod
deleted file mode 100644
index 6788eac..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/client.mod
+++ /dev/null
@@ -1,7 +0,0 @@
-#
-# Client Feature
-#
-
-[lib]
-# Client jars
-lib/jetty-client-${jetty.version}.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/debug.mod b/jetty-start/src/test/resources/usecases/home/modules/debug.mod
deleted file mode 100644
index f740ea2..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/debug.mod
+++ /dev/null
@@ -1,9 +0,0 @@
-#
-# Debug module
-#
-
-[depend]
-server
-
-[xml]
-etc/jetty-debug.xml
diff --git a/jetty-start/src/test/resources/usecases/home/modules/deploy.mod b/jetty-start/src/test/resources/usecases/home/modules/deploy.mod
deleted file mode 100644
index 94c0e40..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/deploy.mod
+++ /dev/null
@@ -1,14 +0,0 @@
-#
-# Deploy Feature
-#
-
-[depend]
-webapp
-
-[lib]
-# Deploy jars
-lib/jetty-deploy-${jetty.version}.jar
-
-[xml]
-# Deploy configuration
-etc/jetty-deploy.xml
diff --git a/jetty-start/src/test/resources/usecases/home/modules/ext.mod b/jetty-start/src/test/resources/usecases/home/modules/ext.mod
deleted file mode 100644
index 66c0519..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/ext.mod
+++ /dev/null
@@ -1,10 +0,0 @@
-#
-# ext module
-#
-
-[lib]
-lib/ext/**.jar
-
-[files]
-lib/
-lib/ext/
diff --git a/jetty-start/src/test/resources/usecases/home/modules/http.mod b/jetty-start/src/test/resources/usecases/home/modules/http.mod
deleted file mode 100644
index 8515414..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/http.mod
+++ /dev/null
@@ -1,9 +0,0 @@
-#
-# Jetty HTTP Server
-#
-
-[depend]
-server
-
-[xml]
-etc/jetty-http.xml
diff --git a/jetty-start/src/test/resources/usecases/home/modules/https.mod b/jetty-start/src/test/resources/usecases/home/modules/https.mod
deleted file mode 100644
index 281c5db..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/https.mod
+++ /dev/null
@@ -1,10 +0,0 @@
-#
-# Jetty HTTP Server
-#
-
-[depend]
-server
-
-[xml]
-etc/jetty-ssl.xml
-etc/jetty-https.xml
diff --git a/jetty-start/src/test/resources/usecases/home/modules/ipaccess.mod b/jetty-start/src/test/resources/usecases/home/modules/ipaccess.mod
deleted file mode 100644
index 956ea0f..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/ipaccess.mod
+++ /dev/null
@@ -1,9 +0,0 @@
-#
-# IPAccess module
-#
-
-[depend]
-server
-
-[xml]
-etc/jetty-ipaccess.xml
diff --git a/jetty-start/src/test/resources/usecases/home/modules/jaas.mod b/jetty-start/src/test/resources/usecases/home/modules/jaas.mod
deleted file mode 100644
index 9fb04f7..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/jaas.mod
+++ /dev/null
@@ -1,14 +0,0 @@
-#
-# JAAS Feature
-#
-
-[depend]
-server
-
-[lib]
-# JAAS jars
-lib/jetty-jaas-${jetty.version}.jar
-
-[xml]
-# JAAS configuration
-etc/jetty-jaas.xml
diff --git a/jetty-start/src/test/resources/usecases/home/modules/jmx.mod b/jetty-start/src/test/resources/usecases/home/modules/jmx.mod
deleted file mode 100644
index fd8740a..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/jmx.mod
+++ /dev/null
@@ -1,11 +0,0 @@
-#
-# JMX Feature
-#
-
-[lib]
-# JMX jars (as defined in start.config)
-lib/jetty-jmx-${jetty.version}.jar
-
-[xml]
-# JMX configuration
-etc/jetty-jmx.xml
diff --git a/jetty-start/src/test/resources/usecases/home/modules/jndi.mod b/jetty-start/src/test/resources/usecases/home/modules/jndi.mod
deleted file mode 100644
index 33c077c..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/jndi.mod
+++ /dev/null
@@ -1,11 +0,0 @@
-#
-# JNDI Support
-#
-
-[depend]
-server
-
-[lib]
-lib/jetty-jndi-${jetty.version}.jar
-lib/jndi/*.jar
-
diff --git a/jetty-start/src/test/resources/usecases/home/modules/jsp-impl/apache-jsp.mod b/jetty-start/src/test/resources/usecases/home/modules/jsp-impl/apache-jsp.mod
deleted file mode 100644
index aed547c..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/jsp-impl/apache-jsp.mod
+++ /dev/null
@@ -1,10 +0,0 @@
-#
-# Apache JSP Module
-#
-
-[name]
-jsp-impl
-
-[lib]
-lib/apache-jsp/*.jar
-
diff --git a/jetty-start/src/test/resources/usecases/home/modules/jsp-impl/glassfish-jsp.mod b/jetty-start/src/test/resources/usecases/home/modules/jsp-impl/glassfish-jsp.mod
deleted file mode 100644
index 130d2b3..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/jsp-impl/glassfish-jsp.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Glassfish JSP Module
-#
-[name]
-jsp-impl
-
-[lib]
-lib/jsp/*.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/jsp.mod b/jetty-start/src/test/resources/usecases/home/modules/jsp.mod
deleted file mode 100644
index fa5b9fd..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/jsp.mod
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Jetty JSP Module
-#
-
-[depend]
-servlet
-jsp-impl/${jsp-impl}-jsp
-
-[ini-template]
-# JSP Configuration
-
-# Select JSP implementation, choices are
-#   glassfish : The reference implementation 
-#               default in jetty <= 9.1
-#   apache    : The apache version 
-#               default jetty >= 9.2
-jsp-impl=apache
-
-# To use a non-jdk compiler for JSP compilation when using glassfish uncomment next line
-# -Dorg.apache.jasper.compiler.disablejsr199=true
diff --git a/jetty-start/src/test/resources/usecases/home/modules/logging.mod b/jetty-start/src/test/resources/usecases/home/modules/logging.mod
deleted file mode 100644
index a39bfe4..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/logging.mod
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-# Jetty std err/out logging
-#
-
-[xml]
-etc/jetty-logging.xml
-
-[files]
-logs/
-
-[lib]
-lib/logging/**.jar
-resources/
-
-[ini-template]
-## Logging Configuration
-# Configure jetty logging for default internal behavior STDERR output
-# -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
-
-# Configure jetty logging for slf4j
-# -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.Slf4jLog
-
-# Configure jetty logging for java.util.logging
-# -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.JavaUtilLog
-
-# STDERR / STDOUT Logging
-# Number of days to retain logs
-# jetty.log.retain=90
-# Directory for logging output
-# Either a path relative to ${jetty.base} or an absolute path
-# jetty.logs=logs
diff --git a/jetty-start/src/test/resources/usecases/home/modules/lowresources.mod b/jetty-start/src/test/resources/usecases/home/modules/lowresources.mod
deleted file mode 100644
index 4ca96de..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/lowresources.mod
+++ /dev/null
@@ -1,9 +0,0 @@
-#
-# Low Resources module
-#
-
-[depend]
-server
-
-[xml]
-etc/jetty-lowresources.xml
diff --git a/jetty-start/src/test/resources/usecases/home/modules/monitor.mod b/jetty-start/src/test/resources/usecases/home/modules/monitor.mod
deleted file mode 100644
index 67f006d..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/monitor.mod
+++ /dev/null
@@ -1,13 +0,0 @@
-#
-# Jetty Monitor module
-#
-
-[depend]
-server
-client
-
-[lib]
-lib/jetty-monitor-${jetty.version}.jar
-
-[xml]
-etc/jetty-monitor.xml
\ No newline at end of file
diff --git a/jetty-start/src/test/resources/usecases/home/modules/plus.mod b/jetty-start/src/test/resources/usecases/home/modules/plus.mod
deleted file mode 100644
index b781f00..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/plus.mod
+++ /dev/null
@@ -1,15 +0,0 @@
-#
-# Jetty Proxy module
-#
-
-[depend]
-server
-security
-jndi
-
-[lib]
-lib/jetty-plus-${jetty.version}.jar
-
-[xml]
-# Plus requires configuration
-etc/jetty-plus.xml
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.7.0_40.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.7.0_40.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.7.0_40.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.7.0_45.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.7.0_45.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.7.0_45.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.7.0_51.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.7.0_51.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.7.0_51.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.7.0_55.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.7.0_55.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.7.0_55.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.7.0_60.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.7.0_60.mod
deleted file mode 100644
index 54d3731..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.7.0_60.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/7.1.0.v20141016/alpn-boot-7.1.0.v20141016.jar|lib/alpn/alpn-boot-7.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-7.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.8.0.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.8.0.mod
deleted file mode 100644
index a81732c..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.8.0.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.0.v20141016/alpn-boot-8.1.0.v20141016.jar|lib/alpn/alpn-boot-8.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-8.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.8.0_05.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.8.0_05.mod
deleted file mode 100644
index a81732c..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn-1.8.0_05.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.0.v20141016/alpn-boot-8.1.0.v20141016.jar|lib/alpn/alpn-boot-8.1.0.v20141016.jar
-
-[exec]
--Xbootclasspath/p:lib/alpn/alpn-boot-8.1.0.v20141016.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn.mod
deleted file mode 100644
index 0e399f0..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/alpn.mod
+++ /dev/null
@@ -1,36 +0,0 @@
-# ALPN is provided via a -Xbootclasspath that modifies the secure connections
-# in java to support the ALPN layer needed for SPDY (and eventually HTTP/2)
-#
-# This modification has a tight dependency on specific recent updates of
-# Java 1.7 and Java 1.8
-# (Java versions prior to 1.7u40 are not supported)
-#
-# The alpn protonego module will use an appropriate alpn-boot jar for your
-# specific version of Java.
-#
-# IMPORTANT: Versions of Java that exist after this module was created are
-#            not guaranteed to work with existing alpn-boot jars, and might
-#            need a new alpn-boot to be created / tested / deployed by the
-#            Jetty project in order to provide support for these future
-#            Java versions.
-#
-# All versions of alpn-boot can be found at
-# http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/
-
-[name]
-protonego-impl
-
-[depend]
-protonego-impl/alpn-${java.version}
-
-[lib]
-lib/jetty-alpn-client-${jetty.version}.jar
-lib/jetty-alpn-server-${jetty.version}.jar
-
-[xml]
-etc/protonego-alpn.xml
-
-[files]
-lib/
-lib/alpn/
-
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_04.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_04.mod
deleted file mode 100644
index 007570b..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_04.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.0.v20120525/npn-boot-1.1.0.v20120525.jar|lib/npn/npn-boot-1.1.0.v20120525.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.0.v20120525.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_05.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_05.mod
deleted file mode 100644
index 007570b..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_05.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.0.v20120525/npn-boot-1.1.0.v20120525.jar|lib/npn/npn-boot-1.1.0.v20120525.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.0.v20120525.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_06.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_06.mod
deleted file mode 100644
index 868a7a7..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_06.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.1.v20121030/npn-boot-1.1.1.v20121030.jar|lib/npn/npn-boot-1.1.1.v20121030.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.1.v20121030.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_07.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_07.mod
deleted file mode 100644
index 868a7a7..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_07.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.1.v20121030/npn-boot-1.1.1.v20121030.jar|lib/npn/npn-boot-1.1.1.v20121030.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.1.v20121030.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_09.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_09.mod
deleted file mode 100644
index 20c1db2..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_09.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.3.v20130313/npn-boot-1.1.3.v20130313.jar|lib/npn/npn-boot-1.1.3.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.3.v20130313.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_10.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_10.mod
deleted file mode 100644
index 20c1db2..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_10.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.3.v20130313/npn-boot-1.1.3.v20130313.jar|lib/npn/npn-boot-1.1.3.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.3.v20130313.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_11.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_11.mod
deleted file mode 100644
index 20c1db2..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_11.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.3.v20130313/npn-boot-1.1.3.v20130313.jar|lib/npn/npn-boot-1.1.3.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.3.v20130313.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_13.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_13.mod
deleted file mode 100644
index 1645a52..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_13.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.4.v20130313/npn-boot-1.1.4.v20130313.jar|lib/npn/npn-boot-1.1.4.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.4.v20130313.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_15.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_15.mod
deleted file mode 100644
index 73bc090..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_15.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.5.v20130313/npn-boot-1.1.5.v20130313.jar|lib/npn/npn-boot-1.1.5.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.5.v20130313.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_17.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_17.mod
deleted file mode 100644
index 73bc090..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_17.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.5.v20130313/npn-boot-1.1.5.v20130313.jar|lib/npn/npn-boot-1.1.5.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.5.v20130313.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_21.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_21.mod
deleted file mode 100644
index 73bc090..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_21.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.5.v20130313/npn-boot-1.1.5.v20130313.jar|lib/npn/npn-boot-1.1.5.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.5.v20130313.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_25.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_25.mod
deleted file mode 100644
index 73bc090..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_25.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.5.v20130313/npn-boot-1.1.5.v20130313.jar|lib/npn/npn-boot-1.1.5.v20130313.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.5.v20130313.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_40.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_40.mod
deleted file mode 100644
index 465e6f0..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_40.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.6.v20130911/npn-boot-1.1.6.v20130911.jar|lib/npn/npn-boot-1.1.6.v20130911.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.6.v20130911.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_45.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_45.mod
deleted file mode 100644
index 465e6f0..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_45.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.6.v20130911/npn-boot-1.1.6.v20130911.jar|lib/npn/npn-boot-1.1.6.v20130911.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.6.v20130911.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_51.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_51.mod
deleted file mode 100644
index 465e6f0..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_51.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.6.v20130911/npn-boot-1.1.6.v20130911.jar|lib/npn/npn-boot-1.1.6.v20130911.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.6.v20130911.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_55.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_55.mod
deleted file mode 100644
index 5f8704d..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_55.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.8.v20141013/npn-boot-1.1.8.v20141013.jar|lib/npn/npn-boot-1.1.8.v20141013.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.8.v20141013.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_60.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_60.mod
deleted file mode 100644
index 5f8704d..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn-1.7.0_60.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-[name]
-protonego-boot
-
-[files]
-http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/1.1.8.v20141013/npn-boot-1.1.8.v20141013.jar|lib/npn/npn-boot-1.1.8.v20141013.jar
-
-[exec]
--Xbootclasspath/p:lib/npn/npn-boot-1.1.8.v20141013.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn.mod
deleted file mode 100644
index 040aad1..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego-impl/npn.mod
+++ /dev/null
@@ -1,31 +0,0 @@
-# NPN is provided via a -Xbootclasspath that modifies the secure connections
-# in java to support the NPN layer needed for SPDY.
-#
-# This modification has a tight dependency on specific updates of Java 1.7.
-# (No support for Java 8 exists for npn / npn-boot, use alpn instead)
-#
-# The npn module will use an appropriate npn-boot jar for your specific
-# version of Java.
-#
-# IMPORTANT: Versions of Java that exist after this module was created are
-#            not guaranteed to work with existing npn-boot jars, and might
-#            need a new npn-boot to be created / tested / deployed by the
-#            Jetty project in order to provide support for these future
-#            Java versions.
-#
-# All versions of npn-boot can be found at
-# http://central.maven.org/maven2/org/mortbay/jetty/npn/npn-boot/
-
-
-[name]
-protonego-impl
-
-[depend]
-protonego-impl/npn-${java.version}
-
-[xml]
-etc/protonego-npn.xml
-
-[files]
-lib/
-lib/npn/
diff --git a/jetty-start/src/test/resources/usecases/home/modules/protonego.mod b/jetty-start/src/test/resources/usecases/home/modules/protonego.mod
deleted file mode 100644
index d7bba9f..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/protonego.mod
+++ /dev/null
@@ -1,15 +0,0 @@
-#
-# Protocol Negotiatin Selection Module
-#
-
-[depend]
-protonego-impl/${protonego}
-
-[ini-template]
-# Protocol Negotiation Implementation Selection
-#  choices are:
-#    'npn'  : original implementation for SPDY (now deprecated)
-#    'alpn' : replacement for NPN, in use by current SPDY implementations
-#             and the future HTTP/2 spec
-#  Note: java 1.8+ are ALPN only.
-protonego=alpn
diff --git a/jetty-start/src/test/resources/usecases/home/modules/proxy.mod b/jetty-start/src/test/resources/usecases/home/modules/proxy.mod
deleted file mode 100644
index 7873329..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/proxy.mod
+++ /dev/null
@@ -1,14 +0,0 @@
-#
-# Jetty Proxy module
-#
-
-[depend]
-server
-client
-
-[lib]
-lib/jetty-proxy-${jetty.version}.jar
-
-[xml]
-# Proxy requires configuration
-etc/jetty-proxy.xml
diff --git a/jetty-start/src/test/resources/usecases/home/modules/requestlog.mod b/jetty-start/src/test/resources/usecases/home/modules/requestlog.mod
deleted file mode 100644
index 2b048db..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/requestlog.mod
+++ /dev/null
@@ -1,9 +0,0 @@
-#
-# Request Log module
-#
-
-[depend]
-server
-
-[xml]
-etc/jetty-requestlog.xml
diff --git a/jetty-start/src/test/resources/usecases/home/modules/resources.mod b/jetty-start/src/test/resources/usecases/home/modules/resources.mod
deleted file mode 100644
index 8647d81..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/resources.mod
+++ /dev/null
@@ -1,10 +0,0 @@
-#
-# Module to add resources directory to classpath
-#
-
-[lib]
-resources/
-
-[files]
-resources/
-
diff --git a/jetty-start/src/test/resources/usecases/home/modules/rewrite.mod b/jetty-start/src/test/resources/usecases/home/modules/rewrite.mod
deleted file mode 100644
index 85fe5f0..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/rewrite.mod
+++ /dev/null
@@ -1,13 +0,0 @@
-#
-# Jetty Rewrite module
-#
-
-[depend]
-server
-
-[lib]
-lib/jetty-rewrite-${jetty.version}.jar
-
-[xml]
-# Annotations needs annotations configuration
-etc/jetty-rewrite.xml
diff --git a/jetty-start/src/test/resources/usecases/home/modules/security.mod b/jetty-start/src/test/resources/usecases/home/modules/security.mod
deleted file mode 100644
index ba31632..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/security.mod
+++ /dev/null
@@ -1,9 +0,0 @@
-#
-# Jetty Security Module
-#
-
-[depend]
-server
-
-[lib]
-lib/jetty-security-${jetty.version}.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/server.mod b/jetty-start/src/test/resources/usecases/home/modules/server.mod
deleted file mode 100644
index b1e9f33..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/server.mod
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Base server
-#
-
-[optional]
-ext
-
-[depend]
-base
-xml
-
-[lib]
-lib/servlet-api-3.1.jar
-lib/jetty-schemas-3.1.jar
-lib/jetty-http-${jetty.version}.jar
-lib/jetty-continuation-${jetty.version}.jar
-lib/jetty-server-${jetty.version}.jar
-
-[xml]
-# Annotations needs annotations configuration
-etc/jetty.xml
diff --git a/jetty-start/src/test/resources/usecases/home/modules/servlet.mod b/jetty-start/src/test/resources/usecases/home/modules/servlet.mod
deleted file mode 100644
index fdb65c5..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/servlet.mod
+++ /dev/null
@@ -1,9 +0,0 @@
-#
-# Jetty Servlet Module
-#
-
-[depend]
-server
-
-[lib]
-lib/jetty-servlet-${jetty.version}.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/spdy.mod b/jetty-start/src/test/resources/usecases/home/modules/spdy.mod
deleted file mode 100644
index cf79dfa..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/spdy.mod
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# SPDY Support Module
-#
-
-[depend]
-ssl
-protonego
-
-[lib]
-lib/spdy/*.jar
-
-[xml]
-etc/jetty-ssl.xml
-etc/jetty-spdy.xml
-
-[ini-template]
-## SPDY Configuration
-
-# Port for SPDY connections
-spdy.port=8443
-
-# SPDY idle timeout in milliseconds
-spdy.timeout=30000
-
-# Initial Window Size for SPDY
-#spdy.initialWindowSize=65536
diff --git a/jetty-start/src/test/resources/usecases/home/modules/ssl.mod b/jetty-start/src/test/resources/usecases/home/modules/ssl.mod
deleted file mode 100644
index 449f581..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/ssl.mod
+++ /dev/null
@@ -1,35 +0,0 @@
-#
-# SSL Keystore module
-#
-
-[depend]
-server
-
-[xml]
-etc/jetty-ssl.xml
-
-[files]
-http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/plain/jetty-server/src/main/config/etc/keystore|etc/keystore
-
-[ini-template]
-## SSL Keystore Configuration
-# define the port to use for secure redirection
-jetty.secure.port=8443
-
-# Setup a demonstration keystore and truststore
-jetty.keystore=etc/keystore
-jetty.truststore=etc/keystore
-
-# Set the demonstration passwords.
-# Note that OBF passwords are not secure, just protected from casual observation
-# See http://www.eclipse.org/jetty/documentation/current/configuring-security-secure-passwords.html
-jetty.keystore.password=OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
-jetty.keymanager.password=OBF:1u2u1wml1z7s1z7a1wnl1u2g
-jetty.truststore.password=OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
-
-# Set the client auth behavior
-# Set to true if client certificate authentication is required
-# jetty.ssl.needClientAuth=true
-# Set to true if client certificate authentication is desired
-# jetty.ssl.wantClientAuth=true
-
diff --git a/jetty-start/src/test/resources/usecases/home/modules/stats.mod b/jetty-start/src/test/resources/usecases/home/modules/stats.mod
deleted file mode 100644
index 0922469..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/stats.mod
+++ /dev/null
@@ -1,9 +0,0 @@
-#
-# Stats module
-#
-
-[depend]
-server
-
-[xml]
-etc/jetty-stats.xml
diff --git a/jetty-start/src/test/resources/usecases/home/modules/webapp.mod b/jetty-start/src/test/resources/usecases/home/modules/webapp.mod
deleted file mode 100644
index f62c554..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/webapp.mod
+++ /dev/null
@@ -1,9 +0,0 @@
-#
-# Base server
-#
-
-[depend]
-servlet
-
-[lib]
-lib/jetty-webapp-${jetty.version}.jar
diff --git a/jetty-start/src/test/resources/usecases/home/modules/websocket.mod b/jetty-start/src/test/resources/usecases/home/modules/websocket.mod
deleted file mode 100644
index f45babd..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/websocket.mod
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# WebSocket Feature
-#
-
-# WebSocket needs Annotations feature
-[depend]
-server
-annotations
-
-# WebSocket needs websocket jars (as defined in start.config)
-[lib]
-lib/websocket/*.jar
-
-# WebSocket needs websocket configuration
-[xml]
-etc/jetty-websockets.xml
-
diff --git a/jetty-start/src/test/resources/usecases/home/modules/xinetd.mod b/jetty-start/src/test/resources/usecases/home/modules/xinetd.mod
deleted file mode 100644
index fdc1b3c..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/xinetd.mod
+++ /dev/null
@@ -1,9 +0,0 @@
-#
-# Stats module
-#
-
-[depend]
-server
-
-[xml]
-etc/jetty-xinetd.xml
diff --git a/jetty-start/src/test/resources/usecases/home/modules/xml.mod b/jetty-start/src/test/resources/usecases/home/modules/xml.mod
deleted file mode 100644
index d53107a..0000000
--- a/jetty-start/src/test/resources/usecases/home/modules/xml.mod
+++ /dev/null
@@ -1,10 +0,0 @@
-#
-# Jetty XML Configuration
-#
-
-[depend]
-base
-
-[lib]
-lib/jetty-xml-${jetty.version}.jar
-
diff --git a/jetty-start/src/test/resources/usecases/home/resources/.nodelete b/jetty-start/src/test/resources/usecases/home/resources/.nodelete
deleted file mode 100644
index e69de29..0000000
--- a/jetty-start/src/test/resources/usecases/home/resources/.nodelete
+++ /dev/null
diff --git a/jetty-start/src/test/resources/usecases/home/start.ini b/jetty-start/src/test/resources/usecases/home/start.ini
deleted file mode 100644
index a65a9cb..0000000
--- a/jetty-start/src/test/resources/usecases/home/start.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-
---module=server,http,jmx,annotations,websocket
diff --git a/jetty-start/src/test/resources/usecases/http2.assert.txt b/jetty-start/src/test/resources/usecases/http2.assert.txt
new file mode 100644
index 0000000..d5baccc
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/http2.assert.txt
@@ -0,0 +1,44 @@
+# The XMLs we expect (order is important)
+XML|${jetty.home}/etc/jetty.xml
+XML|${jetty.home}/etc/jetty-http.xml
+XML|${jetty.home}/etc/jetty-jmx.xml
+XML|${jetty.home}/etc/jetty-ssl.xml
+XML|${jetty.home}/etc/jetty-ssl-context.xml
+XML|${jetty.home}/etc/jetty-alpn.xml
+XML|${jetty.home}/etc/jetty-http2.xml
+
+
+# The LIBs we expect (order is irrelevant)
+LIB|${jetty.home}/lib/jetty-http-9.3.jar
+LIB|${jetty.home}/lib/jetty-io-9.3.jar
+LIB|${jetty.home}/lib/jetty-jmx-9.3.jar
+LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
+LIB|${jetty.home}/lib/jetty-server-9.3.jar
+LIB|${jetty.home}/lib/jetty-util-9.3.jar
+LIB|${jetty.home}/lib/jetty-xml-9.3.jar
+LIB|${jetty.home}/lib/servlet-api-3.1.jar
+LIB|${jetty.home}/lib/jetty-alpn-server-9.3.jar
+LIB|${jetty.home}/lib/http2/http2-common-9.3.jar
+LIB|${jetty.home}/lib/http2/http2-hpack-9.3.jar
+LIB|${jetty.home}/lib/http2/http2-server-9.3.jar
+
+# The Properties we expect (order is irrelevant)
+# (this is the property we actually set in jetty.base)
+PROP|jetty.http.port=9090
+#PROP|java.version=1.8.0_31
+PROP|jetty.sslContext.keyStorePath=etc/keystore
+PROP|jetty.sslContext.keyStorePassword=friendly
+PROP|jetty.sslContext.keyManagerPassword=icecream
+PROP|jetty.sslContext.trustStorePath=etc/keystore
+PROP|jetty.sslContext.trustStorePassword=sundae
+
+# The Downloads
+DOWNLOAD|maven://org.mortbay.jetty.alpn/alpn-boot/8.1.3.v20150130|lib/alpn/alpn-boot-8.1.3.v20150130.jar
+DOWNLOAD|http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/plain/jetty-server/src/test/config/etc/keystore?id=master|etc/keystore
+
+# The Bootlib
+BOOTLIB|-Xbootclasspath/p:lib/alpn/alpn-boot-8.1.3.v20150130.jar
+
+# The Files
+FILE|lib/
+FILE|lib/alpn/
diff --git a/jetty-start/src/test/resources/usecases/http2/start.ini b/jetty-start/src/test/resources/usecases/http2/start.ini
new file mode 100644
index 0000000..96a9c58
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/http2/start.ini
@@ -0,0 +1,12 @@
+
+--module=server,http,jmx,http2
+
+jetty.http.port=9090
+
+# Some SSL keystore configuration
+jetty.sslContext.keyStorePath=etc/keystore
+jetty.sslContext.keyStorePassword=friendly
+jetty.sslContext.keyManagerPassword=icecream
+jetty.sslContext.trustStorePath=etc/keystore
+jetty.sslContext.trustStorePassword=sundae
+
diff --git a/jetty-start/src/test/resources/usecases/include-jetty-dir-logging.assert.txt b/jetty-start/src/test/resources/usecases/include-jetty-dir-logging.assert.txt
new file mode 100644
index 0000000..60f10dd
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/include-jetty-dir-logging.assert.txt
@@ -0,0 +1,37 @@
+# The XMLs we expect (order is important)
+XML|${maven-test-resources}/extra-jetty-dirs/logging/etc/jetty-logging.xml
+XML|${jetty.home}/etc/jetty.xml
+XML|${jetty.home}/etc/jetty-http.xml
+XML|${jetty.home}/etc/jetty-jmx.xml
+
+# The LIBs we expect (order is irrelevant)
+LIB|${jetty.home}/lib/jetty-http-9.3.jar
+LIB|${jetty.home}/lib/jetty-io-9.3.jar
+LIB|${jetty.home}/lib/jetty-jmx-9.3.jar
+LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
+LIB|${jetty.home}/lib/jetty-server-9.3.jar
+LIB|${jetty.home}/lib/jetty-util-9.3.jar
+LIB|${jetty.home}/lib/jetty-xml-9.3.jar
+LIB|${jetty.home}/lib/servlet-api-3.1.jar
+LIB|${jetty.base}/resources
+LIB|${maven-test-resources}/extra-jetty-dirs/logging/lib/logging/logback.jar
+
+# The Properties we expect (order is irrelevant)
+# (this is the property we actually set in jetty.base)
+PROP|jetty.http.port=9090
+# (these are the ones set by default from jetty.home modules)
+# PROP|jetty.http.idleTimeout=30000
+# PROP|jetty.httpConfig.delayDispatchUntilContent=false
+# PROP|jetty.server.dumpAfterStart=false
+# PROP|jetty.server.dumpBeforeStop=false
+# PROP|jetty.httpConfig.outputBufferSize=32768
+# PROP|jetty.httpConfig.requestHeaderSize=8192
+# PROP|jetty.httpConfig.responseHeaderSize=8192
+# PROP|jetty.httpConfig.sendDateHeader=false
+# PROP|jetty.httpConfig.sendServerVersion=true
+# PROP|jetty.threadPool.maxThreads=200
+# PROP|jetty.threadPool.minThreads=10
+# PROP|jetty.threadPool.idleTimeout=60000
+
+# Files
+FILE|logs/
diff --git a/jetty-start/src/test/resources/usecases/home/etc/realm.properties b/jetty-start/src/test/resources/usecases/include-jetty-dir-logging/resources/some.properties
similarity index 100%
rename from jetty-start/src/test/resources/usecases/home/etc/realm.properties
rename to jetty-start/src/test/resources/usecases/include-jetty-dir-logging/resources/some.properties
diff --git a/jetty-start/src/test/resources/usecases/include-jetty-dir-logging/start.ini b/jetty-start/src/test/resources/usecases/include-jetty-dir-logging/start.ini
new file mode 100644
index 0000000..d44a453
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/include-jetty-dir-logging/start.ini
@@ -0,0 +1,6 @@
+
+--include-jetty-dir=${start.basedir}/../../extra-jetty-dirs/logging
+--module=server,http,jmx
+#--module=resources
+
+jetty.http.port=9090
diff --git a/jetty-start/src/test/resources/usecases/jmx.assert.txt b/jetty-start/src/test/resources/usecases/jmx.assert.txt
new file mode 100644
index 0000000..205c2ea
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/jmx.assert.txt
@@ -0,0 +1,31 @@
+# The XMLs we expect (order is important)
+XML|${jetty.home}/etc/jetty.xml
+XML|${jetty.home}/etc/jetty-http.xml
+XML|${jetty.home}/etc/jetty-jmx.xml
+
+# The LIBs we expect (order is irrelevant)
+LIB|${jetty.home}/lib/jetty-http-9.3.jar
+LIB|${jetty.home}/lib/jetty-io-9.3.jar
+LIB|${jetty.home}/lib/jetty-jmx-9.3.jar
+LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
+LIB|${jetty.home}/lib/jetty-server-9.3.jar
+LIB|${jetty.home}/lib/jetty-util-9.3.jar
+LIB|${jetty.home}/lib/jetty-xml-9.3.jar
+LIB|${jetty.home}/lib/servlet-api-3.1.jar
+
+# The Properties we expect (order is irrelevant)
+# (this is the property we actually set in jetty.base)
+PROP|jetty.http.port=9090
+# (these are the ones set by default from jetty.home modules)
+# PROP|jetty.http.idleTimeout=30000
+# PROP|jetty.httpConfig.delayDispatchUntilContent=false
+# PROP|jetty.server.dumpAfterStart=false
+# PROP|jetty.server.dumpBeforeStop=false
+# PROP|jetty.httpConfig.outputBufferSize=32768
+# PROP|jetty.httpConfig.requestHeaderSize=8192
+# PROP|jetty.httpConfig.responseHeaderSize=8192
+# PROP|jetty.httpConfig.sendDateHeader=false
+# PROP|jetty.httpConfig.sendServerVersion=true
+# PROP|jetty.threadPool.maxThreads=200
+# PROP|jetty.threadPool.minThreads=10
+# PROP|jetty.threadPool.idleTimeout=60000
diff --git a/jetty-start/src/test/resources/usecases/jmx/start.ini b/jetty-start/src/test/resources/usecases/jmx/start.ini
new file mode 100644
index 0000000..5339629
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/jmx/start.ini
@@ -0,0 +1,4 @@
+
+--module=server,http,jmx
+
+jetty.http.port=9090
diff --git a/jetty-start/src/test/resources/usecases/jsp.assert.txt b/jetty-start/src/test/resources/usecases/jsp.assert.txt
new file mode 100644
index 0000000..96bd0ca
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/jsp.assert.txt
@@ -0,0 +1,49 @@
+# The XMLs we expect (order is important)
+XML|${jetty.home}/etc/jetty.xml
+XML|${jetty.home}/etc/jetty-http.xml
+XML|${jetty.home}/etc/jetty-plus.xml
+XML|${jetty.home}/etc/jetty-annotations.xml
+
+# The LIBs we expect (order is irrelevant)
+LIB|${jetty.home}/lib/jetty-annotations-9.3.jar
+LIB|${jetty.home}/lib/annotations/asm-5.0.1.jar
+LIB|${jetty.home}/lib/annotations/asm-commons-5.0.1.jar
+LIB|${jetty.home}/lib/annotations/javax.annotation-api-1.2.jar
+LIB|${jetty.home}/lib/jetty-http-9.3.jar
+LIB|${jetty.home}/lib/jetty-io-9.3.jar
+LIB|${jetty.home}/lib/jetty-jndi-9.3.jar
+LIB|${jetty.home}/lib/jndi/javax.mail.glassfish-1.4.1.v201005082020.jar
+LIB|${jetty.home}/lib/jndi/javax.transaction-api-1.2.jar
+LIB|${jetty.home}/lib/jetty-plus-9.3.jar
+LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
+LIB|${jetty.home}/lib/jetty-security-9.3.jar
+LIB|${jetty.home}/lib/jetty-server-9.3.jar
+LIB|${jetty.home}/lib/jetty-servlet-9.3.jar
+LIB|${jetty.home}/lib/jetty-util-9.3.jar
+LIB|${jetty.home}/lib/jetty-webapp-9.3.jar
+LIB|${jetty.home}/lib/jetty-xml-9.3.jar
+LIB|${jetty.home}/lib/servlet-api-3.1.jar
+LIB|${jetty.home}/lib/apache-jsp/org.eclipse.jetty.apache-jsp-9.3.jar
+LIB|${jetty.home}/lib/apache-jsp/org.eclipse.jetty.orbit.org.eclipse.jdt.core-3.8.2.v20130121.jar
+LIB|${jetty.home}/lib/apache-jsp/org.mortbay.jasper.apache-el-8.0.20.M0.jar
+LIB|${jetty.home}/lib/apache-jsp/org.mortbay.jasper.apache-jsp-8.0.20.M0.jar
+
+# The Properties we expect (order is irrelevant)
+# (these are the properties we actually set in the configuration)
+PROP|jetty.http.port=9090
+# (these are the ones set by default from jetty.home modules)
+# PROP|jetty.http.idleTimeout=30000
+# PROP|jetty.httpConfig.delayDispatchUntilContent=false
+# PROP|jetty.server.dumpAfterStart=false
+# PROP|jetty.server.dumpBeforeStop=false
+# PROP|jetty.httpConfig.outputBufferSize=32768
+# PROP|jetty.httpConfig.requestHeaderSize=8192
+# PROP|jetty.httpConfig.responseHeaderSize=8192
+# PROP|jetty.httpConfig.sendDateHeader=false
+# PROP|jetty.httpConfig.sendServerVersion=true
+# PROP|jetty.threadPool.maxThreads=200
+# PROP|jetty.threadPool.minThreads=10
+# PROP|jetty.threadPool.idleTimeout=60000
+
+# Files / Directories to create
+# FILE|lib/
diff --git a/jetty-start/src/test/resources/usecases/jsp/start.ini b/jetty-start/src/test/resources/usecases/jsp/start.ini
new file mode 100644
index 0000000..f01871c
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/jsp/start.ini
@@ -0,0 +1,6 @@
+
+--module=server
+--module=http
+--module=jsp
+
+jetty.http.port=9090
diff --git a/jetty-start/src/test/resources/usecases/logging.assert.txt b/jetty-start/src/test/resources/usecases/logging.assert.txt
new file mode 100644
index 0000000..90780a9
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/logging.assert.txt
@@ -0,0 +1,45 @@
+# The XMLs we expect (order is important)
+XML|${jetty.home}/etc/jetty.xml
+XML|${jetty.home}/etc/jetty-http.xml
+
+# The LIBs we expect (order is irrelevant)
+LIB|${jetty.home}/lib/jetty-http-9.3.jar
+LIB|${jetty.home}/lib/jetty-io-9.3.jar
+LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
+LIB|${jetty.home}/lib/jetty-server-9.3.jar
+LIB|${jetty.home}/lib/jetty-util-9.3.jar
+LIB|${jetty.home}/lib/jetty-xml-9.3.jar
+LIB|${jetty.home}/lib/servlet-api-3.1.jar
+LIB|${jetty.base}/lib/logging/slf4j-api.jar
+LIB|${jetty.base}/lib/logging/jul-to-slf4j.jar
+LIB|${jetty.base}/lib/logging/logback-core.jar
+LIB|${jetty.base}/lib/logging/logback-classic.jar
+LIB|${jetty.base}/resources
+
+# The Properties we expect (order is irrelevant)
+# (this is the property we actually set in jetty.base)
+PROP|jetty.http.port=9090
+# (these are the ones set by default from jetty.home modules)
+# PROP|jetty.http.idleTimeout=30000
+# PROP|jetty.httpConfig.delayDispatchUntilContent=false
+# PROP|jetty.server.dumpAfterStart=false
+# PROP|jetty.server.dumpBeforeStop=false
+# PROP|jetty.httpConfig.outputBufferSize=32768
+# PROP|jetty.httpConfig.requestHeaderSize=8192
+# PROP|jetty.httpConfig.responseHeaderSize=8192
+# PROP|jetty.httpConfig.sendDateHeader=false
+# PROP|jetty.httpConfig.sendServerVersion=true
+# PROP|jetty.threadPool.maxThreads=200
+# PROP|jetty.threadPool.minThreads=10
+# PROP|jetty.threadPool.idleTimeout=60000
+
+# Other File References
+FILE|logs/
+FILE|resources/
+
+# Downloads
+DOWNLOAD|http://central.maven.org/maven2/org/slf4j/slf4j-api/1.6.6/slf4j-api-1.6.6.jar|lib/logging/slf4j-api-1.6.6.jar
+DOWNLOAD|http://repo1.maven.org/maven2/ch/qos/logback/logback-core/1.0.7/logback-core-1.0.7.jar|lib/logging/logback-core-1.0.7.jar
+DOWNLOAD|http://repo1.maven.org/maven2/ch/qos/logback/logback-classic/1.0.7/logback-classic-1.0.7.jar|lib/logging/logback-classic-1.0.7.jar
+DOWNLOAD|https://raw.githubusercontent.com/jetty-project/logging-modules/master/logback/logback.xml|resources/logback.xml
+DOWNLOAD|https://raw.githubusercontent.com/jetty-project/logging-modules/master/logback/jetty-logging.properties|resources/jetty-logging.properties
diff --git a/jetty-start/src/test/resources/usecases/base.logging/lib/logging/jul-to-slf4j.jar b/jetty-start/src/test/resources/usecases/logging/lib/logging/jul-to-slf4j.jar
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.logging/lib/logging/jul-to-slf4j.jar
rename to jetty-start/src/test/resources/usecases/logging/lib/logging/jul-to-slf4j.jar
diff --git a/jetty-start/src/test/resources/usecases/base.logging/lib/logging/logback-classic.jar b/jetty-start/src/test/resources/usecases/logging/lib/logging/logback-classic.jar
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.logging/lib/logging/logback-classic.jar
rename to jetty-start/src/test/resources/usecases/logging/lib/logging/logback-classic.jar
diff --git a/jetty-start/src/test/resources/usecases/base.logging/lib/logging/logback-core.jar b/jetty-start/src/test/resources/usecases/logging/lib/logging/logback-core.jar
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.logging/lib/logging/logback-core.jar
rename to jetty-start/src/test/resources/usecases/logging/lib/logging/logback-core.jar
diff --git a/jetty-start/src/test/resources/usecases/base.logging/lib/logging/slf4j-api.jar b/jetty-start/src/test/resources/usecases/logging/lib/logging/slf4j-api.jar
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.logging/lib/logging/slf4j-api.jar
rename to jetty-start/src/test/resources/usecases/logging/lib/logging/slf4j-api.jar
diff --git a/jetty-start/src/test/resources/usecases/base.logging/modules/logging.mod b/jetty-start/src/test/resources/usecases/logging/modules/logging.mod
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.logging/modules/logging.mod
rename to jetty-start/src/test/resources/usecases/logging/modules/logging.mod
diff --git a/jetty-start/src/test/resources/usecases/base.logging/resources/jetty-logging.properties b/jetty-start/src/test/resources/usecases/logging/resources/jetty-logging.properties
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.logging/resources/jetty-logging.properties
rename to jetty-start/src/test/resources/usecases/logging/resources/jetty-logging.properties
diff --git a/jetty-start/src/test/resources/usecases/base.logging/resources/logback.xml b/jetty-start/src/test/resources/usecases/logging/resources/logback.xml
similarity index 100%
rename from jetty-start/src/test/resources/usecases/base.logging/resources/logback.xml
rename to jetty-start/src/test/resources/usecases/logging/resources/logback.xml
diff --git a/jetty-start/src/test/resources/usecases/logging/start.ini b/jetty-start/src/test/resources/usecases/logging/start.ini
new file mode 100644
index 0000000..083675e
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/logging/start.ini
@@ -0,0 +1,7 @@
+
+--module=server
+--module=http
+--module=logging
+--module=resources
+
+jetty.http.port=9090
diff --git a/jetty-start/src/test/resources/usecases/versioned-modules-too-new/modules/http.mod b/jetty-start/src/test/resources/usecases/versioned-modules-too-new/modules/http.mod
new file mode 100644
index 0000000..cff8028
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/versioned-modules-too-new/modules/http.mod
@@ -0,0 +1,39 @@
+#
+# Jetty HTTP Connector
+#
+
+[version]
+9.3
+
+[depend]
+server
+
+[xml]
+etc/jetty-http.xml
+
+[ini-template]
+### HTTP Connector Configuration
+
+## Connector host/address to bind to
+# jetty.http.host=0.0.0.0
+
+## Connector port to listen on
+# jetty.http.port=80
+
+## Connector idle timeout in milliseconds
+# jetty.http.idleTimeout=30000
+
+## Connector socket linger time in seconds (-1 to disable)
+# jetty.http.soLingerTime=-1
+
+## Number of acceptors (-1 picks default based on number of cores)
+# jetty.http.acceptors=-1
+
+## Number of selectors (-1 picks default based on number of cores)
+# jetty.http.selectors=-1
+
+## ServerSocketChannel backlog (0 picks platform default)
+# jetty.http.acceptorQueueSize=0
+
+## Thread priority delta to give to acceptor threads
+# jetty.http.acceptorPriorityDelta=0
diff --git a/jetty-start/src/test/resources/usecases/versioned-modules-too-new/modules/http3.mod b/jetty-start/src/test/resources/usecases/versioned-modules-too-new/modules/http3.mod
new file mode 100644
index 0000000..34ec477
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/versioned-modules-too-new/modules/http3.mod
@@ -0,0 +1,10 @@
+#
+# Fake Jetty HTTP/3 Connector
+#
+
+[version]
+10.0
+
+[depend]
+server
+
diff --git a/jetty-start/src/test/resources/usecases/versioned-modules-too-new/start.ini b/jetty-start/src/test/resources/usecases/versioned-modules-too-new/start.ini
new file mode 100644
index 0000000..42b2db8
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/versioned-modules-too-new/start.ini
@@ -0,0 +1,6 @@
+
+--module=server
+--module=http
+--module=http3
+
+jetty.http.port=9090
diff --git a/jetty-start/src/test/resources/usecases/versioned-modules.assert.txt b/jetty-start/src/test/resources/usecases/versioned-modules.assert.txt
new file mode 100644
index 0000000..f1b8108
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/versioned-modules.assert.txt
@@ -0,0 +1,18 @@
+# The XMLs we expect (order is important)
+XML|${jetty.home}/etc/jetty.xml
+XML|${jetty.home}/etc/jetty-http.xml
+
+# The LIBs we expect (order is irrelevant)
+LIB|${jetty.home}/lib/jetty-http-9.3.jar
+LIB|${jetty.home}/lib/jetty-io-9.3.jar
+LIB|${jetty.home}/lib/jetty-schemas-3.1.jar
+LIB|${jetty.home}/lib/jetty-server-9.3.jar
+LIB|${jetty.home}/lib/jetty-util-9.3.jar
+LIB|${jetty.home}/lib/jetty-xml-9.3.jar
+LIB|${jetty.home}/lib/servlet-api-3.1.jar
+
+# The Properties we expect (order is irrelevant)
+# (this is the property we actually set in jetty.base)
+PROP|jetty.http.port=9090
+PROP|from-module=old
+PROP|the-future=is-new
diff --git a/jetty-start/src/test/resources/usecases/versioned-modules/modules/http.mod b/jetty-start/src/test/resources/usecases/versioned-modules/modules/http.mod
new file mode 100644
index 0000000..cff8028
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/versioned-modules/modules/http.mod
@@ -0,0 +1,39 @@
+#
+# Jetty HTTP Connector
+#
+
+[version]
+9.3
+
+[depend]
+server
+
+[xml]
+etc/jetty-http.xml
+
+[ini-template]
+### HTTP Connector Configuration
+
+## Connector host/address to bind to
+# jetty.http.host=0.0.0.0
+
+## Connector port to listen on
+# jetty.http.port=80
+
+## Connector idle timeout in milliseconds
+# jetty.http.idleTimeout=30000
+
+## Connector socket linger time in seconds (-1 to disable)
+# jetty.http.soLingerTime=-1
+
+## Number of acceptors (-1 picks default based on number of cores)
+# jetty.http.acceptors=-1
+
+## Number of selectors (-1 picks default based on number of cores)
+# jetty.http.selectors=-1
+
+## ServerSocketChannel backlog (0 picks platform default)
+# jetty.http.acceptorQueueSize=0
+
+## Thread priority delta to give to acceptor threads
+# jetty.http.acceptorPriorityDelta=0
diff --git a/jetty-start/src/test/resources/usecases/versioned-modules/modules/new.mod b/jetty-start/src/test/resources/usecases/versioned-modules/modules/new.mod
new file mode 100644
index 0000000..ae1b359
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/versioned-modules/modules/new.mod
@@ -0,0 +1,10 @@
+#
+# New Module (testing module based defaults)
+#
+
+[version]
+9.3
+
+[ini]
+the-future=is-new
+
diff --git a/jetty-start/src/test/resources/usecases/versioned-modules/modules/old.mod b/jetty-start/src/test/resources/usecases/versioned-modules/modules/old.mod
new file mode 100644
index 0000000..ff27710
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/versioned-modules/modules/old.mod
@@ -0,0 +1,7 @@
+#
+# Old Module (backward compat test with 9.2 modules)
+#
+
+[defaults]
+from-module=old
+
diff --git a/jetty-start/src/test/resources/usecases/versioned-modules/start.ini b/jetty-start/src/test/resources/usecases/versioned-modules/start.ini
new file mode 100644
index 0000000..c306053
--- /dev/null
+++ b/jetty-start/src/test/resources/usecases/versioned-modules/start.ini
@@ -0,0 +1,7 @@
+
+--module=server
+--module=http
+--module=old
+--module=new
+
+jetty.http.port=9090
diff --git a/jetty-util-ajax/pom.xml b/jetty-util-ajax/pom.xml
index 3b41d7b..09c6185 100644
--- a/jetty-util-ajax/pom.xml
+++ b/jetty-util-ajax/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-util-ajax</artifactId>
@@ -15,54 +15,6 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-                <Import-Package>javax.servlet.*;version="[2.6.0,3.2)",org.slf4j;version="[1.5,2.0)";resolution:=optional,org.slf4j.impl;version="[1.5,2.0)";resolution:=optional,*</Import-Package>
-              </instructions>
-            </configuration>
-           </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <!--
-        Required for OSGI
-        -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-<!--
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
--->
-      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
         <configuration>
diff --git a/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSON.java b/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSON.java
index ada3663..8730764 100644
--- a/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSON.java
+++ b/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSON.java
@@ -39,51 +39,51 @@
 
 /**
  * JSON Parser and Generator.
- * <p />
+ * <p>
  * This class provides some static methods to convert POJOs to and from JSON
  * notation. The mapping from JSON to java is:
  *
  * <pre>
- *   object ==> Map
- *   array  ==> Object[]
- *   number ==> Double or Long
- *   string ==> String
- *   null   ==> null
- *   bool   ==> Boolean
+ *   object --&gt; Map
+ *   array  --&gt; Object[]
+ *   number --&gt; Double or Long
+ *   string --&gt; String
+ *   null   --&gt; null
+ *   bool   --&gt; Boolean
  * </pre>
 
  * The java to JSON mapping is:
  *
  * <pre>
- *   String --> string
- *   Number --> number
- *   Map    --> object
- *   List   --> array
- *   Array  --> array
- *   null   --> null
- *   Boolean--> boolean
- *   Object --> string (dubious!)
+ *   String --&gt; string
+ *   Number --&gt; number
+ *   Map    --&gt; object
+ *   List   --&gt; array
+ *   Array  --&gt; array
+ *   null   --&gt; null
+ *   Boolean--&gt; boolean
+ *   Object --&gt; string (dubious!)
  * </pre>
  *
  * The interface {@link JSON.Convertible} may be implemented by classes that
  * wish to externalize and initialize specific fields to and from JSON objects.
  * Only directed acyclic graphs of objects are supported.
- * <p />
+ * <p>
  * The interface {@link JSON.Generator} may be implemented by classes that know
  * how to render themselves as JSON and the {@link #toString(Object)} method
  * will use {@link JSON.Generator#addJSON(Appendable)} to generate the JSON.
  * The class {@link JSON.Literal} may be used to hold pre-generated JSON object.
- * <p />
+ * <p>
  * The interface {@link JSON.Convertor} may be implemented to provide static
  * converters for objects that may be registered with
  * {@link #registerConvertor(Class, Convertor)}.
  * These converters are looked up by class, interface and super class by
  * {@link #getConvertor(Class)}.
- * <p />
+ * <p>
  * If a JSON object has a "class" field, then a java class for that name is
  * loaded and the method {@link #convertTo(Class,Map)} is used to find a
  * {@link JSON.Convertor} for that class.
- * <p />
+ * <p>
  * If a JSON object has a "x-class" field then a direct lookup for a
  * {@link JSON.Convertor} for that class name is done (without loading the class).
  */
@@ -188,6 +188,7 @@
      * @param in
      *            Reader containing JSON object or array.
      * @return A Map, Object array or primitive array parsed from the JSON.
+     * @throws IOException if unable to parse
      */
     public static Object parse(Reader in) throws IOException
     {
@@ -200,6 +201,7 @@
      * @param stripOuterComment
      *            If true, an outer comment around the JSON is ignored.
      * @return A Map, Object array or primitive array parsed from the JSON.
+     * @throws IOException if unable to parse
      */
     public static Object parse(Reader in, boolean stripOuterComment) throws IOException
     {
@@ -207,10 +209,11 @@
     }
 
     /**
-     * @deprecated use {@link #parse(Reader)}
      * @param in
      *            Reader containing JSON object or array.
      * @return A Map, Object array or primitive array parsed from the JSON.
+     * @throws IOException if unable to parse
+     * @deprecated use {@link #parse(Reader)}
      */
     @Deprecated
     public static Object parse(InputStream in) throws IOException
@@ -219,12 +222,13 @@
     }
 
     /**
-     * @deprecated use {@link #parse(Reader, boolean)}
      * @param in
      *            Stream containing JSON object or array.
      * @param stripOuterComment
      *            If true, an outer comment around the JSON is ignored.
      * @return A Map, Object array or primitive array parsed from the JSON.
+     * @throws IOException if unable to parse
+     * @deprecated use {@link #parse(Reader, boolean)}
      */
     @Deprecated
     public static Object parse(InputStream in, boolean stripOuterComment) throws IOException
diff --git a/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSONObjectConvertor.java b/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSONObjectConvertor.java
index b94692d..482c2f9 100644
--- a/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSONObjectConvertor.java
+++ b/jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSONObjectConvertor.java
@@ -28,12 +28,8 @@
 
 import org.eclipse.jetty.util.ajax.JSON.Output;
 
-/* ------------------------------------------------------------ */
 /**
  * Convert an Object to JSON using reflection on getters methods.
- * 
- * 
- *
  */
 public class JSONObjectConvertor implements JSON.Convertor
 {
@@ -52,7 +48,7 @@
     
     /* ------------------------------------------------------------ */
     /**
-     * @param fromJSON
+     * @param fromJSON true to convert from JSON
      * @param excluded An array of field names to exclude from the conversion
      */
     public JSONObjectConvertor(boolean fromJSON,String[] excluded)
diff --git a/jetty-util/pom.xml b/jetty-util/pom.xml
index a86fe0e..07f9230 100644
--- a/jetty-util/pom.xml
+++ b/jetty-util/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-util</artifactId>
@@ -15,52 +15,6 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-                <Import-Package>javax.servlet.*;version="[2.6.0,3.2)",org.slf4j;version="[1.6,2.0)";resolution:=optional,org.slf4j.impl;version="[1.6,2.0)";resolution:=optional,*</Import-Package>
-              </instructions>
-            </configuration>
-           </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <!--
-        Required for OSGI
-        -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
         <configuration>
diff --git a/jetty-util/src/main/config/etc/jetty-logging.xml b/jetty-util/src/main/config/etc/jetty-logging.xml
index 52589ee..dc7fe9e 100644
--- a/jetty-util/src/main/config/etc/jetty-logging.xml
+++ b/jetty-util/src/main/config/etc/jetty-logging.xml
@@ -1,6 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Configure stderr and stdout to a Jetty rollover log file        -->
@@ -13,10 +12,12 @@
     <New id="ServerLog" class="java.io.PrintStream">
       <Arg>
         <New class="org.eclipse.jetty.util.RolloverFileOutputStream">
-          <Arg><Property name="jetty.logs" default="./logs"/>/yyyy_mm_dd.stderrout.log</Arg>
-          <Arg type="boolean">false</Arg>
-          <Arg type="int">90</Arg>
-          <Arg><Call class="java.util.TimeZone" name="getTimeZone"><Arg>GMT</Arg></Call></Arg>
+          <Arg><Property name="jetty.logging.dir" deprecated="jetty.logs" default="./logs"/>/yyyy_mm_dd.stderrout.log</Arg>
+          <Arg type="boolean"><Property name="jetty.logging.append" default="false"/></Arg>
+          <Arg type="int"><Property name="jetty.logging.retainDays" default="90"/></Arg>
+          <Arg>
+              <Call class="java.util.TimeZone" name="getTimeZone"><Arg><Property name="jetty.logging.timezone" default="GMT"/></Arg></Call>
+          </Arg>
           <Get id="ServerLogName" name="datedFilename"/>
         </New>
       </Arg>
diff --git a/jetty-util/src/main/config/modules/logging.mod b/jetty-util/src/main/config/modules/logging.mod
index a39bfe4..4f30a88 100644
--- a/jetty-util/src/main/config/modules/logging.mod
+++ b/jetty-util/src/main/config/modules/logging.mod
@@ -14,18 +14,23 @@
 
 [ini-template]
 ## Logging Configuration
-# Configure jetty logging for default internal behavior STDERR output
+## Configure jetty logging for default internal behavior STDERR output
 # -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
 
-# Configure jetty logging for slf4j
+## Configure jetty logging for slf4j
 # -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.Slf4jLog
 
-# Configure jetty logging for java.util.logging
+## Configure jetty logging for java.util.logging
 # -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.JavaUtilLog
 
-# STDERR / STDOUT Logging
-# Number of days to retain logs
-# jetty.log.retain=90
-# Directory for logging output
-# Either a path relative to ${jetty.base} or an absolute path
-# jetty.logs=logs
+## Logging directory (relative to $jetty.base)
+# jetty.logging.dir=logs
+
+## Whether to append to existing file
+# jetty.logging.append=false
+
+## How many days to retain old log files
+# jetty.logging.retainDays=90
+
+## Timezone of the log timestamps
+# jetty.logging.timezone=GMT
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/AbstractTrie.java b/jetty-util/src/main/java/org/eclipse/jetty/util/AbstractTrie.java
index d4ff8b6..1f6223d 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/AbstractTrie.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/AbstractTrie.java
@@ -22,12 +22,13 @@
 import java.nio.charset.StandardCharsets;
 
 
-/* ------------------------------------------------------------ */
-/** Abstract Trie implementation.
+/** 
+ * Abstract Trie implementation.
  * <p>Provides some common implementations, which may not be the most
  * efficient. For byte operations, the assumption is made that the charset
  * is ISO-8859-1</p>
- * @param <V>
+ * 
+ * @param <V> the type of object that the Trie holds
  */
 public abstract class AbstractTrie<V> implements Trie<V>
 {
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayQueue.java b/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayQueue.java
index 572cb76..1e44b3b 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayQueue.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayQueue.java
@@ -25,11 +25,12 @@
 /* ------------------------------------------------------------ */
 /**
  * Queue backed by circular array.
- * <p/>
+ * <p>
  * This partial Queue implementation (also with {@link #remove()} for stack operation)
  * is backed by a growable circular array.
+ * </p>
  *
- * @param <E>
+ * @param <E> the type of object the queue holds
  */
 public class ArrayQueue<E> extends AbstractList<E> implements Queue<E>
 {
@@ -91,6 +92,15 @@
     }
 
     /* ------------------------------------------------------------ */
+    /**
+     * @return the next slot to be used
+     */
+    public int getNextSlotUnsafe()
+    {
+        return _nextSlot;
+    }
+    
+    /* ------------------------------------------------------------ */
     @Override
     public boolean add(E e)
     {
@@ -109,9 +119,9 @@
     }
 
     /* ------------------------------------------------------------ */
-    private boolean enqueue(E e)
+    protected boolean enqueue(E e)
     {
-        if (_size == _elements.length && !grow())
+        if (_size == _elements.length && !growUnsafe())
             return false;
 
         _size++;
@@ -192,7 +202,7 @@
     }
 
     /* ------------------------------------------------------------ */
-    private E dequeue()
+    protected E dequeue()
     {
         E e = at(_nextE);
         _elements[_nextE] = null;
@@ -246,6 +256,12 @@
     }
 
     /* ------------------------------------------------------------ */
+    public int sizeUnsafe()
+    {
+        return _size;
+    }
+
+    /* ------------------------------------------------------------ */
     @Override
     public E get(int index)
     {
@@ -339,7 +355,7 @@
             if (index < 0 || index > _size)
                 throw new IndexOutOfBoundsException("!(" + 0 + "<" + index + "<=" + _size + ")");
 
-            if (_size == _elements.length && !grow())
+            if (_size == _elements.length && !growUnsafe())
                 throw new IllegalStateException("Full");
 
             if (index == _size)
@@ -384,25 +400,33 @@
     }
 
     /* ------------------------------------------------------------ */
-    protected boolean grow()
+    protected void resizeUnsafe(int newCapacity)
     {
-        synchronized (_lock)
+        newCapacity = Math.max(newCapacity,_size);
+        Object[] elements = new Object[newCapacity];
+
+        if (_size>0)
         {
-            if (_growCapacity <= 0)
-                return false;
-
-            Object[] elements = new Object[_elements.length + _growCapacity];
-
-            int split = _elements.length - _nextE;
-            if (split > 0)
+            if (_nextSlot>_nextE)
+                System.arraycopy(_elements, _nextE, elements, 0, _size);
+            else
+            {
+                int split = _elements.length - _nextE;
                 System.arraycopy(_elements, _nextE, elements, 0, split);
-            if (_nextE != 0)
                 System.arraycopy(_elements, 0, elements, split, _nextSlot);
-
-            _elements = elements;
-            _nextE = 0;
-            _nextSlot = _size;
-            return true;
+            }
         }
+        _elements = elements;
+        _nextE = 0;
+        _nextSlot = _size;
+    }
+    
+    /* ------------------------------------------------------------ */
+    protected boolean growUnsafe()
+    {
+        if (_growCapacity <= 0)
+            return false;
+        resizeUnsafe(_elements.length+_growCapacity);
+        return true;
     }
 }
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayTernaryTrie.java b/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayTernaryTrie.java
index e289aeb..8f96862 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayTernaryTrie.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayTernaryTrie.java
@@ -24,20 +24,22 @@
 import java.util.Set;
 
 
-/* ------------------------------------------------------------ */
 /** 
  * <p>A Ternary Trie String lookup data structure.</p>
- * This Trie is of a fixed size and cannot grow (which can be a good thing with regards to DOS when used as a cache).
  * <p>
- * The Trie is stored in 3 arrays:<dl>
+ * This Trie is of a fixed size and cannot grow (which can be a good thing with regards to DOS when used as a cache).
+ * </p>
+ * <p>
+ * The Trie is stored in 3 arrays:
+ * </p>
+ * <dl>
  * <dt>char[] _tree</dt><dd>This is semantically 2 dimensional array flattened into a 1 dimensional char array. The second dimension
  * is that every 4 sequential elements represents a row of: character; hi index; eq index; low index, used to build a
  * ternary trie of key strings.</dd>
- * <dt>String[] _key<dt><dd>An array of key values where each element matches a row in the _tree array. A non zero key element 
+ * <dt>String[] _key</dt><dd>An array of key values where each element matches a row in the _tree array. A non zero key element 
  * indicates that the _tree row is a complete key rather than an intermediate character of a longer key.</dd>
  * <dt>V[] _value</dt><dd>An array of values corresponding to the _key array</dd>
  * </dl>
- * </p>
  * <p>The lookup of a value will iterate through the _tree array matching characters. If the equal tree branch is followed,
  * then the _key array is looked up to see if this is a complete match.  If a match is found then the _value array is looked up
  * to return the matching value.
@@ -52,7 +54,7 @@
  * Trie is required external locks need to be applied.
  * </p>
  * 
- * @param <V>
+ * @param <V> the Entry type 
  */
 public class ArrayTernaryTrie<V> extends AbstractTrie<V>
 {
@@ -141,8 +143,8 @@
 
     /* ------------------------------------------------------------ */
     /** Copy Trie and change capacity by a factor
-     * @param trie
-     * @param factor
+     * @param trie the trie to copy from
+     * @param factor the factor to grow the capacity by
      */
     public ArrayTernaryTrie(ArrayTernaryTrie<V> trie, double factor)
     {
@@ -153,6 +155,16 @@
         _tree=Arrays.copyOf(trie._tree, capacity*ROW_SIZE);
         _key=Arrays.copyOf(trie._key, capacity);
     }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public void clear()
+    {
+        _rows=0;
+        Arrays.fill(_value,null);
+        Arrays.fill(_tree,(char)0);
+        Arrays.fill(_key,null);
+    }
     
     /* ------------------------------------------------------------ */
     @Override
@@ -311,9 +323,11 @@
     private V getBest(int t,String s,int offset,int len)
     {
         int node=t;
-        loop: for(int i=0; i<len; i++)
+        int end=offset+len;
+        loop: while(offset<end)
         {
-            char c=s.charAt(offset+i);
+            char c=s.charAt(offset++);
+            len--;
             if(isCaseInsensitive() && c<128)
                 c=StringUtil.lowercases[c];
 
@@ -333,9 +347,9 @@
                     if (_key[t]!=null)
                     {
                         node=t;
-                        V best=getBest(t,s,offset+i+1,len-i-1);
-                        if (best!=null)
-                            return best;
+                        V better=getBest(t,s,offset,len);
+                        if (better!=null)
+                            return better;
                     }
                     break;
                 }
@@ -362,9 +376,11 @@
     private V getBest(int t,byte[] b, int offset, int len)
     {
         int node=t;
-        loop: for(int i=0; i<len; i++)
+        int end=offset+len;
+        loop: while(offset<end)
         {
-            byte c=(byte)(b[offset+i]&0x7f);
+            byte c=(byte)(b[offset++]&0x7f);
+            len--;
             if(isCaseInsensitive())
                 c=(byte)StringUtil.lowercases[c];
 
@@ -384,9 +400,9 @@
                     if (_key[t]!=null)
                     {
                         node=t;
-                        V best=getBest(t,b,offset+i+1,len-i-1);
-                        if (best!=null)
-                            return best;
+                        V better=getBest(t,b,offset,len);
+                        if (better!=null)
+                            return better;
                     }
                     break;
                 }
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayTrie.java b/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayTrie.java
index 172503e..084c40e 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayTrie.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayTrie.java
@@ -20,6 +20,7 @@
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -44,7 +45,7 @@
  * and not mutated during that access.  If concurrent mutations of the
  * Trie is required external locks need to be applied.
  * </p>
- * @param <V>
+ * @param <V> the entry type
  */
 public class ArrayTrie<V> extends AbstractTrie<V>
 {
@@ -132,7 +133,16 @@
         _rowIndex=new char[capacity*32];
         _key=new String[capacity];
     }
-    
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public void clear()
+    {
+        _rows=0;
+        Arrays.fill(_value,null);
+        Arrays.fill(_rowIndex,(char)0);
+        Arrays.fill(_key,null);
+    }
     
     /* ------------------------------------------------------------ */
     @Override
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayUtil.java b/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayUtil.java
index 903b9a4..36a8a8a 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayUtil.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayUtil.java
@@ -25,8 +25,8 @@
 import java.util.List;
 
 
-/* ------------------------------------------------------------ */
 /**
+ * Utility methods for Array manipulation
  */
 public class ArrayUtil
     implements Cloneable, Serializable
@@ -60,6 +60,7 @@
      * @param item The item to add
      * @param type The type of the array (in case of null array)
      * @return new array with contents of array plus item
+     * @param <T> the array entry type
      */
     public static<T> T[] addToArray(T[] array, T item, Class<?> type)
     {
@@ -86,6 +87,7 @@
      * @param item The item to add
      * @param type The type of the array (in case of null array)
      * @return new array with contents of array plus item
+     * @param <T> the array entry type
      */
     public static<T> T[] prependToArray(T item, T[] array, Class<?> type)
     {
@@ -113,6 +115,7 @@
     /**
      * @param array Any array of object
      * @return A new <i>modifiable</i> list initialised with the elements from <code>array</code>.
+     * @param <E> the array entry type
      */
     public static<E> List<E> asMutableList(E[] array)
     {	
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/B64Code.java b/jetty-util/src/main/java/org/eclipse/jetty/util/B64Code.java
index f828642..5e96696 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/B64Code.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/B64Code.java
@@ -22,6 +22,7 @@
 import java.io.IOException;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
+import java.nio.charset.UnsupportedCharsetException;
 
 
 /** Fast B64 Encoder/Decoder as described in RFC 1421.
@@ -35,12 +36,12 @@
 {
     private static final char __pad='=';
     private static final char[] __rfc1421alphabet=
-            {
-                'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
-                'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
-                'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
-                'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'
-            };
+        {
+        'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
+        'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
+        'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
+        'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'
+        };
 
     private static final byte[] __rfc1421nibbles;
     static
@@ -52,6 +53,25 @@
             __rfc1421nibbles[(byte)__rfc1421alphabet[b]]=b;
         __rfc1421nibbles[(byte)__pad]=0;
     }
+    
+    private static final char[] __rfc4648urlAlphabet=
+        {
+        'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
+        'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
+        'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
+        'w','x','y','z','0','1','2','3','4','5','6','7','8','9','-','_'
+        };
+
+    private static final byte[] __rfc4648urlNibbles;
+    static
+    {
+        __rfc4648urlNibbles=new byte[256];
+        for (int i=0;i<256;i++)
+            __rfc4648urlNibbles[i]=-1;
+        for (byte b=0;b<64;b++)
+            __rfc4648urlNibbles[(byte)__rfc4648urlAlphabet[b]]=b;
+        __rfc4648urlNibbles[(byte)__pad]=0;
+    }
 
     private B64Code()
     {
@@ -430,6 +450,75 @@
         return;
     }
     
+    /* ------------------------------------------------------------ */
+    public static byte[] decodeRFC4648URL(String encoded)
+    {
+        if (encoded==null)
+            return null;
+
+        ByteArrayOutputStream bout = new ByteArrayOutputStream(4*encoded.length()/3);        
+        decodeRFC4648URL(encoded, bout);
+        return bout.toByteArray();
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * Base 64 decode as described in RFC 4648 URL.
+     * <p>Unlike {@link #decode(char[])}, extra whitespace is ignored.
+     * @param encoded String to decode.
+     * @param bout stream for decoded bytes
+     * @throws IllegalArgumentException if the input is not a valid
+     *         B64 encoding.
+     */
+    static public void decodeRFC4648URL (String encoded, ByteArrayOutputStream bout)
+    {
+        if (encoded==null)
+            return;
+        
+        if (bout == null)
+            throw new IllegalArgumentException("No outputstream for decoded bytes");
+        
+        int ci=0;
+        byte nibbles[] = new byte[4];
+        int s=0;
+  
+        while (ci<encoded.length())
+        {
+            char c=encoded.charAt(ci++);
+
+            if (c==__pad)
+                break;
+
+            if (Character.isWhitespace(c))
+                continue;
+
+            byte nibble=__rfc4648urlNibbles[c];
+            if (nibble<0)
+                throw new IllegalArgumentException("Not B64 encoded");
+
+            nibbles[s++]=__rfc4648urlNibbles[c];
+
+            switch(s)
+            {
+                case 1:
+                    break;
+                case 2:
+                    bout.write(nibbles[0]<<2|nibbles[1]>>>4);
+                    break;
+                case 3:
+                    bout.write(nibbles[1]<<4|nibbles[2]>>>2);
+                    break;
+                case 4:
+                    bout.write(nibbles[2]<<6|nibbles[3]);
+                    s=0;
+                    break;
+            }
+
+        }
+
+        return;
+    }
+    
 
     public static void encode(int value,Appendable buf) throws IOException
     {
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/BlockingArrayQueue.java b/jetty-util/src/main/java/org/eclipse/jetty/util/BlockingArrayQueue.java
index bb1e2dd..d8894ba 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/BlockingArrayQueue.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/BlockingArrayQueue.java
@@ -33,13 +33,16 @@
 
 /**
  * A BlockingQueue backed by a circular array capable or growing.
- * <p/>
+ * <p>
  * This queue is uses a variant of the two lock queue algorithm to provide an efficient queue or list backed by a growable circular array.
- * <p/>
+ * </p>
+ * <p>
  * Unlike {@link java.util.concurrent.ArrayBlockingQueue}, this class is able to grow and provides a blocking put call.
- * <p/>
+ * </p>
+ * <p>
  * The queue has both a capacity (the size of the array currently allocated) and a max capacity (the maximum size that may be allocated), which defaults to
  * {@link Integer#MAX_VALUE}.
+ * </p>
  * 
  * @param <E>
  *            The element type
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/BlockingCallback.java b/jetty-util/src/main/java/org/eclipse/jetty/util/BlockingCallback.java
index 84b2002..c84ef64 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/BlockingCallback.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/BlockingCallback.java
@@ -26,17 +26,15 @@
 
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.util.thread.NonBlockingThread;
 
-/* ------------------------------------------------------------ */
 /**
  * An implementation of Callback that blocks until success or failure.
  */
-public class BlockingCallback implements Callback
+@Deprecated
+public class BlockingCallback implements Callback.NonBlocking
 {
     private static final Logger LOG = Log.getLogger(BlockingCallback.class);
-    
-    private static Throwable SUCCEEDED=new Throwable()
+    private static Throwable SUCCEEDED = new Throwable()
     {
         @Override
         public String toString() { return "SUCCEEDED"; }
@@ -44,9 +42,10 @@
     
     private final CountDownLatch _latch = new CountDownLatch(1);
     private final AtomicReference<Throwable> _state = new AtomicReference<>();
-    
+
     public BlockingCallback()
-    {}
+    {
+    }
 
     @Override
     public void succeeded()
@@ -62,7 +61,8 @@
             _latch.countDown();
     }
 
-    /** Block until the Callback has succeeded or failed and 
+    /**
+     * Blocks until the Callback has succeeded or failed and
      * after the return leave in the state to allow reuse.
      * This is useful for code that wants to repeatable use a FutureCallback to convert
      * an asynchronous API to a blocking API. 
@@ -70,9 +70,6 @@
      */
     public void block() throws IOException
     {
-        if (NonBlockingThread.isNonBlockingThread())
-            LOG.warn("Blocking a NonBlockingThread: ",new Throwable());
-        
         try
         {
             _latch.await();
@@ -94,12 +91,10 @@
             _state.set(null);
         }
     }
-    
-    
+
     @Override
     public String toString()
     {
         return String.format("%s@%x{%s}",BlockingCallback.class.getSimpleName(),hashCode(),_state.get());
     }
-
 }
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/BufferUtil.java b/jetty-util/src/main/java/org/eclipse/jetty/util/BufferUtil.java
index dfff5b4..4937714 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/BufferUtil.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/BufferUtil.java
@@ -23,6 +23,7 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.RandomAccessFile;
+import java.nio.Buffer;
 import java.nio.BufferOverflowException;
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
@@ -31,6 +32,7 @@
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 
+import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.resource.Resource;
 
 
@@ -42,10 +44,12 @@
  * The various ByteBuffer methods assume a mode and some of them will switch or enforce a mode:
  * Allocate and clear set fill mode; flip and compact switch modes; read and write assume fill 
  * and flush modes.    This duality can result in confusing code such as:
+ * </p>
  * <pre>
  *     buffer.clear();
  *     channel.write(buffer);
  * </pre>
+ * <p>
  * Which looks as if it should write no data, but in fact writes the buffer worth of garbage.
  * </p>
  * <p>
@@ -57,13 +61,14 @@
  * <p>
  * Thus this class provides alternate implementations of {@link #allocate(int)}, 
  * {@link #allocateDirect(int)} and {@link #clear(ByteBuffer)} that leave the buffer
- * in flush mode.   Thus the following tests will pass:<pre>
+ * in flush mode.   Thus the following tests will pass:
+ * </p>
+ * <pre>
  *     ByteBuffer buffer = BufferUtil.allocate(1024);
  *     assert(buffer.remaining()==0);
  *     BufferUtil.clear(buffer);
  *     assert(buffer.remaining()==0);
  * </pre>
- * </p>
  * <p>If the BufferUtil methods {@link #fill(ByteBuffer, byte[], int, int)}, 
  * {@link #append(ByteBuffer, byte[], int, int)} or {@link #put(ByteBuffer, ByteBuffer)} are used,
  * then the caller does not need to explicitly switch the buffer to fill mode.    
@@ -71,6 +76,7 @@
  * then they can use explicit calls of #flipToFill(ByteBuffer) and #flipToFlush(ByteBuffer, int)
  * to change modes.  Note because this convention attempts to avoid the copies of compact, the position
  * is not set to zero on each fill cycle and so its value must be remembered:
+ * </p>
  * <pre>
  *      int pos = BufferUtil.flipToFill(buffer);
  *      try
@@ -82,8 +88,9 @@
  *          flipToFlush(buffer, pos);
  *      }
  * </pre>
- * The flipToFill method will effectively clear the buffer if it is emtpy and will compact the buffer if there is no space.
- * 
+ * <p>
+ * The flipToFill method will effectively clear the buffer if it is empty and will compact the buffer if there is no space.
+ * </p>
  */
 public class BufferUtil
 {
@@ -312,8 +319,7 @@
             {
                 to.put(from);
                 put = remaining;
-                from.position(0);
-                from.limit(0);
+                from.position(from.limit());
             }
             else if (from.hasArray())
             {
@@ -355,7 +361,7 @@
      * @param b bytes to append
      * @param off offset into byte
      * @param len length to append
-     * @throws BufferOverflowException
+     * @throws BufferOverflowException if unable to append buffer due to space limits
      */
     public static void append(ByteBuffer to, byte[] b, int off, int len) throws BufferOverflowException
     {
@@ -392,6 +398,7 @@
     /** Appends a buffer to a buffer
      * @param to Buffer is flush mode
      * @param b buffer to append
+     * @return The position of the valid data before the flipped position.
      */
     public static int append(ByteBuffer to, ByteBuffer b)
     {
@@ -413,6 +420,7 @@
      * @param b bytes to fill
      * @param off offset into byte
      * @param len length to fill
+     * @return The position of the valid data before the flipped position.
      */
     public static int fill(ByteBuffer to, byte[] b, int off, int len)
     {
@@ -521,10 +529,13 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** Convert a partial buffer to an ISO-8859-1 String
-     * @param buffer  The buffer to convert in flush mode. The buffer is unchanged
+    /** Convert a partial buffer to a String.
+     * 
+     * @param buffer the buffer to convert 
+     * @param position The position in the buffer to start the string from
+     * @param length The length of the buffer
      * @param charset The {@link Charset} to use to convert the bytes
-     * @return The buffer as a string.
+     * @return  The buffer as a string.
      */
     public static String toString(ByteBuffer buffer, int position, int length, Charset charset)
     {
@@ -553,11 +564,34 @@
      */
     public static int toInt(ByteBuffer buffer)
     {
+        return toInt(buffer,buffer.position(),buffer.remaining());
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * Convert buffer to an integer. Parses up to the first non-numeric character. If no number is found an
+     * IllegalArgumentException is thrown
+     *
+     * @param buffer
+     *            A buffer containing an integer in flush mode. The position is not changed.
+     * @param position
+     *            the position in the buffer to start reading from
+     * @param length
+     *            the length of the buffer to use for conversion
+     * @return an int of the buffer bytes
+     */
+    public static int toInt(ByteBuffer buffer, int position, int length)
+    {
         int val = 0;
         boolean started = false;
         boolean minus = false;
 
-        for (int i = buffer.position(); i < buffer.limit(); i++)
+        int limit = position+length;
+        
+        if (length<=0)
+            throw new NumberFormatException(toString(buffer,position,length,StandardCharsets.UTF_8));
+        
+        for (int i = position; i < limit; i++)
         {
             byte b = buffer.get(i);
             if (b <= SPACE)
@@ -809,30 +843,14 @@
 
     public static ByteBuffer toBuffer(String s)
     {
-        return ByteBuffer.wrap(s.getBytes(StandardCharsets.ISO_8859_1));
-    }
-
-    public static ByteBuffer toDirectBuffer(String s)
-    {
-        byte[] bytes = s.getBytes(StandardCharsets.ISO_8859_1);
-        ByteBuffer buf = ByteBuffer.allocateDirect(bytes.length);
-        buf.put(bytes);
-        buf.flip();
-        return buf;
+        return toBuffer(s, StandardCharsets.ISO_8859_1);
     }
 
     public static ByteBuffer toBuffer(String s, Charset charset)
     {
-        return ByteBuffer.wrap(s.getBytes(charset));
-    }
-
-    public static ByteBuffer toDirectBuffer(String s, Charset charset)
-    {
-        byte[] bytes = s.getBytes(charset);
-        ByteBuffer buf = ByteBuffer.allocateDirect(bytes.length);
-        buf.put(bytes);
-        buf.flip();
-        return buf;
+        if (s == null)
+            return EMPTY_BUFFER;
+        return toBuffer(s.getBytes(charset));
     }
 
     /**
@@ -842,9 +860,11 @@
      *            the byte array to back buffer with.
      * @return ByteBuffer with provided byte array, in flush mode
      */
-    public static ByteBuffer toBuffer(byte array[])
+    public static ByteBuffer toBuffer(byte[] array)
     {
-        return ByteBuffer.wrap(array);
+        if (array == null)
+            return EMPTY_BUFFER;
+        return toBuffer(array, 0, array.length);
     }
 
     /**
@@ -860,9 +880,27 @@
      */
     public static ByteBuffer toBuffer(byte array[], int offset, int length)
     {
+        if (array == null)
+            return EMPTY_BUFFER;
         return ByteBuffer.wrap(array, offset, length);
     }
 
+    public static ByteBuffer toDirectBuffer(String s)
+    {
+        return toDirectBuffer(s, StandardCharsets.ISO_8859_1);
+    }
+
+    public static ByteBuffer toDirectBuffer(String s, Charset charset)
+    {
+        if (s == null)
+            return EMPTY_BUFFER;
+        byte[] bytes = s.getBytes(charset);
+        ByteBuffer buf = ByteBuffer.allocateDirect(bytes.length);
+        buf.put(bytes);
+        buf.flip();
+        return buf;
+    }
+
     public static ByteBuffer toMappedBuffer(File file) throws IOException
     {
         try (RandomAccessFile raf = new RandomAccessFile(file, "r"))
@@ -928,7 +966,6 @@
     
     /* ------------------------------------------------------------ */
     /** Convert Buffer to string ID independent of content
-     * @param buffer
      */
     private static void idString(ByteBuffer buffer, StringBuilder out) 
     {
@@ -949,7 +986,7 @@
     
     /* ------------------------------------------------------------ */
     /** Convert Buffer to string ID independent of content
-     * @param buffer
+     * @param buffer the buffet to generate a string ID from
      * @return A string showing the buffer ID
      */
     public static String toIDString(ByteBuffer buffer)
@@ -962,7 +999,7 @@
     
     /* ------------------------------------------------------------ */
     /** Convert Buffer to a detail debug string of pointers and content
-     * @param buffer
+     * @param buffer the buffer to generate a detail string from
      * @return A string showing the pointers and content of the buffer
      */
     public static String toDetailString(ByteBuffer buffer)
@@ -991,38 +1028,46 @@
 
     private static void appendDebugString(StringBuilder buf,ByteBuffer buffer)
     {
-        for (int i = 0; i < buffer.position(); i++)
+        try
         {
-            appendContentChar(buf,buffer.get(i));
-            if (i == 16 && buffer.position() > 32)
+            for (int i = 0; i < buffer.position(); i++)
             {
-                buf.append("...");
-                i = buffer.position() - 16;
+                appendContentChar(buf,buffer.get(i));
+                if (i == 16 && buffer.position() > 32)
+                {
+                    buf.append("...");
+                    i = buffer.position() - 16;
+                }
             }
+            buf.append("<<<");
+            for (int i = buffer.position(); i < buffer.limit(); i++)
+            {
+                appendContentChar(buf,buffer.get(i));
+                if (i == buffer.position() + 16 && buffer.limit() > buffer.position() + 32)
+                {
+                    buf.append("...");
+                    i = buffer.limit() - 16;
+                }
+            }
+            buf.append(">>>");
+            int limit = buffer.limit();
+            buffer.limit(buffer.capacity());
+            for (int i = limit; i < buffer.capacity(); i++)
+            {
+                appendContentChar(buf,buffer.get(i));
+                if (i == limit + 16 && buffer.capacity() > limit + 32)
+                {
+                    buf.append("...");
+                    i = buffer.capacity() - 16;
+                }
+            }
+            buffer.limit(limit);
         }
-        buf.append("<<<");
-        for (int i = buffer.position(); i < buffer.limit(); i++)
+        catch(Throwable x)
         {
-            appendContentChar(buf,buffer.get(i));
-            if (i == buffer.position() + 16 && buffer.limit() > buffer.position() + 32)
-            {
-                buf.append("...");
-                i = buffer.limit() - 16;
-            }
+            Log.getRootLogger().ignore(x);
+            buf.append("!!concurrent mod!!");
         }
-        buf.append(">>>");
-        int limit = buffer.limit();
-        buffer.limit(buffer.capacity());
-        for (int i = limit; i < buffer.capacity(); i++)
-        {
-            appendContentChar(buf,buffer.get(i));
-            if (i == limit + 16 && buffer.capacity() > limit + 32)
-            {
-                buf.append("...");
-                i = buffer.capacity() - 16;
-            }
-        }
-        buffer.limit(limit);
     }
 
     private static void appendContentChar(StringBuilder buf, byte b)
@@ -1040,6 +1085,33 @@
         else
             buf.append("\\x").append(TypeUtil.toHexString(b));
     }
+    
+
+    /* ------------------------------------------------------------ */
+    /** Convert buffer to a Hex Summary String.
+     * @param buffer the buffer to generate a hex byte summary from
+     * @return A string showing the escaped content of the buffer around the
+     * position and limit (marked with &lt;&lt;&lt; and &gt;&gt;&gt;)
+     */
+    public static String toHexSummary(ByteBuffer buffer)
+    {
+        if (buffer == null)
+            return "null";
+        StringBuilder buf = new StringBuilder();
+        
+        buf.append("b[").append(buffer.remaining()).append("]=");
+        for (int i = buffer.position(); i < buffer.limit(); i++)
+        {
+            TypeUtil.toHex(buffer.get(i),buf);
+            if (i == buffer.position() + 24 && buffer.limit() > buffer.position() + 32)
+            {
+                buf.append("...");
+                i = buffer.limit() - 8;
+            }
+        }
+        return buf.toString();
+    }
+
 
     private final static int[] decDivisors =
             {1000000000, 100000000, 10000000, 1000000, 100000, 10000, 1000, 100, 10, 1};
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/Callback.java b/jetty-util/src/main/java/org/eclipse/jetty/util/Callback.java
index 8b10128..33da374 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/Callback.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/Callback.java
@@ -43,37 +43,53 @@
 public interface Callback
 {
     /**
+     * Instance of Adapter that can be used when the callback methods need an empty
+     * implementation without incurring in the cost of allocating a new Adapter object.
+     */
+    static Callback NOOP = new Callback(){};
+
+
+    /**
      * <p>Callback invoked when the operation completes.</p>
      *
      * @see #failed(Throwable)
      */
-    public abstract void succeeded();
+    default void succeeded()
+    {}
 
     /**
      * <p>Callback invoked when the operation fails.</p>
      * @param x the reason for the operation failure
      */
-    public void failed(Throwable x);
+    default void failed(Throwable x)
+    {}
 
     /**
+     * @return True if the callback is known to never block the caller
+     */
+    default boolean isNonBlocking()
+    {
+        return false;
+    }
+    
+    
+    /**
+     * Callback interface that declares itself as non-blocking
+     */
+    interface NonBlocking extends Callback
+    {
+        @Override
+        public default boolean isNonBlocking()
+        {
+            return true;
+        }
+    }
+    
+    
+    /**
      * <p>Empty implementation of {@link Callback}</p>
      */
-    public static class Adapter implements Callback
-    {
-        /**
-         * Instance of Adapter that can be used when the callback methods need an empty
-         * implementation without incurring in the cost of allocating a new Adapter object.
-         */
-        public static final Adapter INSTANCE = new Adapter();
-
-        @Override
-        public void succeeded()
-        {
-        }
-
-        @Override
-        public void failed(Throwable x)
-        {
-        }
-    }
+    @Deprecated
+    static class Adapter implements Callback
+    {}
 }
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/CompletableCallback.java b/jetty-util/src/main/java/org/eclipse/jetty/util/CompletableCallback.java
index 1020bb6..156b4c2 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/CompletableCallback.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/CompletableCallback.java
@@ -21,16 +21,18 @@
 import java.util.concurrent.atomic.AtomicReference;
 
 /**
+ * <p>
  * A callback to be used by driver code that needs to know whether the callback has been
  * succeeded or failed (that is, completed) just after the asynchronous operation or not,
  * typically because further processing depends on the callback being completed.
  * The driver code competes with the asynchronous operation to complete the callback.
- * <p />
+ * </p>
+ * <p>
  * If the callback is already completed, the driver code continues the processing,
  * otherwise it suspends it. If it is suspended, the callback will be completed some time
  * later, and {@link #resume()} or {@link #abort(Throwable)} will be called to allow the
  * application to resume the processing.
- * <p />
+ * </p>
  * Typical usage:
  * <pre>
  * CompletableCallback callback = new CompletableCallback()
@@ -124,6 +126,7 @@
 
     /**
      * Callback method invoked when this callback is failed.
+     * @param failure the throwable reprsenting the callback failure
      */
     public abstract void abort(Throwable failure);
 
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/ConcurrentArrayQueue.java b/jetty-util/src/main/java/org/eclipse/jetty/util/ConcurrentArrayQueue.java
index 74aa255..9508b97 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/ConcurrentArrayQueue.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/ConcurrentArrayQueue.java
@@ -25,6 +25,8 @@
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Objects;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.atomic.AtomicIntegerArray;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.atomic.AtomicReferenceArray;
@@ -32,14 +34,16 @@
 /**
  * A concurrent, unbounded implementation of {@link Queue} that uses singly-linked array blocks
  * to store elements.
- * <p/>
+ * <p>
  * This class is a drop-in replacement for {@link ConcurrentLinkedQueue}, with similar performance
  * but producing less garbage because arrays are used to store elements rather than nodes.
- * <p/>
+ * </p>
+ * <p>
  * The algorithm used is a variation of the algorithm from Gidenstam, Sundell and Tsigas
  * (http://www.adm.hb.se/~AGD/Presentations/CacheAwareQueue_OPODIS.pdf).
+ * </p>
  *
- * @param <T>
+ * @param <T> the Array entry type
  */
 public class ConcurrentArrayQueue<T> extends AbstractQueue<T>
 {
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/DateCache.java b/jetty-util/src/main/java/org/eclipse/jetty/util/DateCache.java
index 1b5784f..0434324 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/DateCache.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/DateCache.java
@@ -23,7 +23,6 @@
 import java.util.Locale;
 import java.util.TimeZone;
 
-/* ------------------------------------------------------------ */
 /**  Date Format Cache.
  * Computes String representations of Dates and caches
  * the results so that subsequent requests within the same second
@@ -37,9 +36,7 @@
  *
  * If consecutive calls are frequently very different, then this
  * may be a little slower than a normal DateFormat.
- *
  */
-
 public class DateCache
 {
     public static final String DEFAULT_FORMAT="EEE MMM dd HH:mm:ss zzz yyyy";
@@ -77,6 +74,7 @@
     /* ------------------------------------------------------------ */
     /** Constructor.
      * Make a DateCache that will use the given format
+     * @param format the format to use
      */
     public DateCache(String format)
     {
@@ -161,7 +159,7 @@
 
     /* ------------------------------------------------------------ */
     /** Format a date according to our stored formatter.
-     * @param inDate 
+     * @param inDate the Date
      * @return Formatted date
      */
     public String format(Date inDate)
@@ -187,7 +185,7 @@
     /** Format a date according to our stored formatter.
      * If it happens to be in the same second as the last formatNow
      * call, then the format is reused.
-     * @param inDate 
+     * @param inDate the date in milliseconds since unix epoch 
      * @return Formatted date
      */
     public String format(long inDate)
@@ -215,7 +213,7 @@
      * The passed time is expected to be close to the current time, so it is 
      * compared to the last value passed and if it is within the same second,
      * the format is reused.  Otherwise a new cached format is created.
-     * @param now 
+     * @param now the milliseconds since unix epoch 
      * @return Formatted date
      */
     public String formatNow(long now)
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/DecoratedObjectFactory.java b/jetty-util/src/main/java/org/eclipse/jetty/util/DecoratedObjectFactory.java
new file mode 100644
index 0000000..f409d76
--- /dev/null
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/DecoratedObjectFactory.java
@@ -0,0 +1,119 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+/**
+ * An ObjectFactory enhanced by {@link Decorator} instances.
+ * <p>
+ * Consistent single location for all Decorator behavior, with equal behavior in a ServletContext and also for a stand
+ * alone client.
+ * <p>
+ * Used by ServletContextHandler, WebAppContext, WebSocketServerFactory, and WebSocketClient.
+ * <p>
+ * Can be found in the ServletContext Attributes at the {@link #ATTR DecoratedObjectFactory.ATTR} key.
+ */
+public class DecoratedObjectFactory implements Iterable<Decorator>
+{
+    private static final Logger LOG = Log.getLogger(DecoratedObjectFactory.class);
+
+    /**
+     * ServletContext attribute for the active DecoratedObjectFactory
+     */
+    public static final String ATTR = DecoratedObjectFactory.class.getName();
+
+    private List<Decorator> decorators = new ArrayList<>();
+
+    public void addDecorator(Decorator decorator)
+    {
+        LOG.debug("Adding Decorator: {}", decorator);
+        this.decorators.add(decorator);
+    }
+
+    public void clear()
+    {
+        this.decorators.clear();
+    }
+
+    public <T> T createInstance(Class<T> clazz) throws InstantiationException, IllegalAccessException
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("Creating Instance: " + clazz);
+        }
+        T o = clazz.newInstance();
+        return decorate(o);
+    }
+
+    public <T> T decorate(T obj)
+    {
+        T f = obj;
+        // Decorate is always backwards
+        for (int i = decorators.size() - 1; i >= 0; i--)
+        {
+            f = decorators.get(i).decorate(f);
+        }
+        return f;
+    }
+
+    public void destroy(Object obj)
+    {
+        for (Decorator decorator : this.decorators)
+        {
+            decorator.destroy(obj);
+        }
+    }
+
+    public List<Decorator> getDecorators()
+    {
+        return Collections.unmodifiableList(decorators);
+    }
+
+    @Override
+    public Iterator<Decorator> iterator()
+    {
+        return this.decorators.iterator();
+    }
+
+    public void setDecorators(List<? extends Decorator> decorators)
+    {
+        this.decorators.clear();
+        if (decorators != null)
+        {
+            this.decorators.addAll(decorators);
+        }
+    }
+    
+    @Override
+    public String toString()
+    {
+        StringBuilder str = new StringBuilder();
+        str.append(this.getClass().getName()).append("[decorators=");
+        str.append(Integer.toString(decorators.size()));
+        str.append("]");
+        return str.toString();
+    }
+}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/Decorator.java b/jetty-util/src/main/java/org/eclipse/jetty/util/Decorator.java
new file mode 100644
index 0000000..523de20
--- /dev/null
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/Decorator.java
@@ -0,0 +1,35 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util;
+
+/**
+ * Interface for 3rd party libraries to decorate recently created objects in Jetty.
+ * <p>
+ * Most common use is weld/CDI.
+ * <p>
+ * This was moved from org.eclipse.jetty.servlet.ServletContextHandler to allow
+ * client applications to also use Weld/CDI to decorate objects.  
+ * Such as websocket client (which has no servlet api requirement)
+ */
+public interface Decorator
+{
+    <T> T decorate(T o);
+
+    void destroy(Object o);
+}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/HostMap.java b/jetty-util/src/main/java/org/eclipse/jetty/util/HostMap.java
index 18f557f..5db650f 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/HostMap.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/HostMap.java
@@ -23,8 +23,8 @@
 import java.util.HashSet;
 import java.util.Map;
 
-/* ------------------------------------------------------------ */
 /**
+ * @param <TYPE> the element type
  */
 @SuppressWarnings("serial")
 public class HostMap<TYPE> extends HashMap<String, TYPE>
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/IO.java b/jetty-util/src/main/java/org/eclipse/jetty/util/IO.java
index ead3793..674ff5f 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/IO.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/IO.java
@@ -17,7 +17,9 @@
 //
 
 package org.eclipse.jetty.util;
+
 import java.io.ByteArrayOutputStream;
+import java.io.Closeable;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
@@ -30,7 +32,6 @@
 import java.io.StringWriter;
 import java.io.Writer;
 import java.nio.ByteBuffer;
-import java.nio.channels.FileChannel;
 import java.nio.channels.GatheringByteChannel;
 import java.nio.charset.Charset;
 
@@ -42,10 +43,10 @@
  * Provides stream handling utilities in
  * singleton Threadpool implementation accessed by static members.
  */
-public class IO 
+public class IO
 {
     private static final Logger LOG = Log.getLogger(IO.class);
-    
+
     /* ------------------------------------------------------------------- */
     public final static String
         CRLF      = "\015\012";
@@ -79,9 +80,9 @@
             this.read=read;
             this.write=write;
         }
-        
+
         /* ------------------------------------------------------------ */
-        /* 
+        /*
          * @see java.lang.Runnable#run()
          */
         public void run()
@@ -108,46 +109,56 @@
             }
         }
     }
-    
+
     /* ------------------------------------------------------------------- */
     /** Copy Stream in to Stream out until EOF or exception.
+     * @param in the input stream to read from (until EOF)
+     * @param out the output stream to write to
+     * @throws IOException if unable to copy streams
      */
     public static void copy(InputStream in, OutputStream out)
          throws IOException
     {
         copy(in,out,-1);
     }
-    
+
     /* ------------------------------------------------------------------- */
     /** Copy Reader to Writer out until EOF or exception.
+     * @param in the read to read from (until EOF)
+     * @param out the writer to write to
+     * @throws IOException if unable to copy the streams
      */
     public static void copy(Reader in, Writer out)
          throws IOException
     {
         copy(in,out,-1);
     }
-    
+
     /* ------------------------------------------------------------------- */
     /** Copy Stream in to Stream for byteCount bytes or until EOF or exception.
+     * @param in the stream to read from
+     * @param out the stream to write to
+     * @param byteCount the number of bytes to copy
+     * @throws IOException if unable to copy the streams
      */
     public static void copy(InputStream in,
                             OutputStream out,
                             long byteCount)
          throws IOException
-    {     
+    {
         byte buffer[] = new byte[bufferSize];
         int len=bufferSize;
-        
+
         if (byteCount>=0)
         {
             while (byteCount>0)
             {
                 int max = byteCount<bufferSize?(int)byteCount:bufferSize;
                 len=in.read(buffer,0,max);
-                
+
                 if (len==-1)
                     break;
-                
+
                 byteCount -= len;
                 out.write(buffer,0,len);
             }
@@ -162,19 +173,23 @@
                 out.write(buffer,0,len);
             }
         }
-    }  
-    
+    }
+
     /* ------------------------------------------------------------------- */
     /** Copy Reader to Writer for byteCount bytes or until EOF or exception.
+     * @param in the Reader to read from
+     * @param out the Writer to write to
+     * @param byteCount the number of bytes to copy
+     * @throws IOException if unable to copy streams
      */
     public static void copy(Reader in,
                             Writer out,
                             long byteCount)
          throws IOException
-    {  
+    {
         char buffer[] = new char[bufferSize];
         int len=bufferSize;
-        
+
         if (byteCount>=0)
         {
             while (byteCount>0)
@@ -182,11 +197,11 @@
                 if (byteCount<bufferSize)
                     len=in.read(buffer,0,(int)byteCount);
                 else
-                    len=in.read(buffer,0,bufferSize);                   
-                
+                    len=in.read(buffer,0,bufferSize);
+
                 if (len==-1)
                     break;
-                
+
                 byteCount -= len;
                 out.write(buffer,0,len);
             }
@@ -216,9 +231,9 @@
 
     /* ------------------------------------------------------------ */
     /** Copy files or directories
-     * @param from
-     * @param to
-     * @throws IOException
+     * @param from the file to copy
+     * @param to the destination to copy to
+     * @throws IOException if unable to copy
      */
     public static void copy(File from,File to) throws IOException
     {
@@ -238,7 +253,7 @@
         }
         else
             to.mkdirs();
-        
+
         File[] files = from.listFiles();
         if (files!=null)
         {
@@ -251,7 +266,7 @@
             }
         }
     }
-    
+
     /* ------------------------------------------------------------ */
     public static void copyFile(File from,File to) throws IOException
     {
@@ -261,18 +276,25 @@
             copy(in,out);
         }
     }
-    
+
     /* ------------------------------------------------------------ */
     /** Read input stream to string.
+     * @param in the stream to read from (until EOF)
+     * @return the String parsed from stream (default Charset)
+     * @throws IOException if unable to read the stream (or handle the charset)
      */
     public static String toString(InputStream in)
         throws IOException
     {
         return toString(in,(Charset)null);
     }
-    
+
     /* ------------------------------------------------------------ */
     /** Read input stream to string.
+     * @param in the stream to read from (until EOF)
+     * @param encoding the encoding to use (can be null to use default Charset)
+     * @return the String parsed from the stream
+     * @throws IOException if unable to read the stream (or handle the charset)
      */
     public static String toString(InputStream in,String encoding)
         throws IOException
@@ -281,6 +303,10 @@
     }
 
     /** Read input stream to string.
+     * @param in the stream to read from (until EOF)
+     * @param encoding the Charset to use (can be null to use default Charset)
+     * @return the String parsed from the stream
+     * @throws IOException if unable to read the stream (or handle the charset)
      */
     public static String toString(InputStream in, Charset encoding)
             throws IOException
@@ -294,6 +320,9 @@
 
     /* ------------------------------------------------------------ */
     /** Read input stream to string.
+     * @param in the reader to read from (until EOF)
+     * @return the String parsed from the reader
+     * @throws IOException if unable to read the stream (or handle the charset)
      */
     public static String toString(Reader in)
         throws IOException
@@ -307,7 +336,8 @@
     /* ------------------------------------------------------------ */
     /** Delete File.
      * This delete will recursively delete directories - BE CAREFULL
-     * @param file The file to be deleted.
+     * @param file The file (or directory) to be deleted.
+     * @return true if anything was deleted. (note: this does not mean that all content in a directory was deleted)
      */
     public static boolean delete(File file)
     {
@@ -322,7 +352,24 @@
         return file.delete();
     }
 
-    /* ------------------------------------------------------------ */
+    /**
+     * Closes an arbitrary closable, and logs exceptions at ignore level
+     *
+     * @param closeable the closeable to close
+     */
+    public static void close(Closeable closeable)
+    {
+        try
+        {
+            if (closeable != null)
+                closeable.close();
+        }
+        catch (IOException ignore)
+        {
+            LOG.ignore(ignore);
+        }
+    }
+
     /**
      * closes an input stream, and logs exceptions
      *
@@ -330,52 +377,39 @@
      */
     public static void close(InputStream is)
     {
-        try
-        {
-            if (is != null)
-                is.close();
-        }
-        catch (IOException e)
-        {
-            LOG.ignore(e);
-        }
+        close((Closeable)is);
+    }
+
+    /**
+     * closes an output stream, and logs exceptions
+     *
+     * @param os the output stream to close
+     */
+    public static void close(OutputStream os)
+    {
+        close((Closeable)os);
     }
 
     /**
      * closes a reader, and logs exceptions
-     * 
+     *
      * @param reader the reader to close
      */
     public static void close(Reader reader)
     {
-        try
-        {
-            if (reader != null)
-                reader.close();
-        } catch (IOException e)
-        {
-            LOG.ignore(e);
-        }
+        close((Closeable)reader);
     }
 
     /**
      * closes a writer, and logs exceptions
-     * 
+     *
      * @param writer the writer to close
      */
     public static void close(Writer writer)
     {
-        try
-        {
-            if (writer != null)
-                writer.close();
-        } 
-        catch (IOException e)
-        {
-            LOG.ignore(e);
-        }
+        close((Closeable)writer);
     }
-    
+
     /* ------------------------------------------------------------ */
     public static byte[] readBytes(InputStream in)
         throws IOException
@@ -388,15 +422,22 @@
     /* ------------------------------------------------------------ */
     /**
      * A gathering write utility wrapper.
-     * <p>This method wraps a gather write with a loop that handles the limitations of some operating systems that
-     * have a limit on the number of buffers written.  The method loops on the write until either all the content
-     * is written or no progress is made.
-     * @param out The GatheringgByteChannel to write to
-     * @param buffers The buffers to write
-     * @param offset The offset into the buffers array
-     * @param length The length in buffers to write
+     * <p>
+     * This method wraps a gather write with a loop that handles the limitations of some operating systems that have a
+     * limit on the number of buffers written. The method loops on the write until either all the content is written or
+     * no progress is made.
+     *
+     * @param out
+     *            The GatheringByteChannel to write to
+     * @param buffers
+     *            The buffers to write
+     * @param offset
+     *            The offset into the buffers array
+     * @param length
+     *            The length in buffers to write
      * @return The total bytes written
      * @throws IOException
+     *             if unable write to the GatheringByteChannel
      */
     public static long write(GatheringByteChannel out, ByteBuffer[] buffers, int offset, int length) throws IOException
     {
@@ -405,14 +446,14 @@
         {
             // Write as much as we can
             long wrote=out.write(buffers,offset,length);
-            
+
             // If we can't write any more, give up
             if (wrote==0)
                 break;
-            
+
             // count the total
             total+=wrote;
-            
+
             // Look for unwritten content
             for (int i=offset;i<buffers.length;i++)
             {
@@ -426,32 +467,12 @@
             }
             length=0;
         }
-        
+
         return total;
     }
-    
-    
-    /* ------------------------------------------------------------ */
-    /**
-     * closes an output stream, and logs exceptions
-     *
-     * @param os the output stream to close
-     */
-    public static void close(OutputStream os)
-    {
-        try
-        {
-            if (os != null)
-                os.close();
-        }
-        catch (IOException e)
-        {
-            LOG.ignore(e);
-        }
-    }
 
     /* ------------------------------------------------------------ */
-    /** 
+    /**
      * @return An outputstream to nowhere
      */
     public static OutputStream getNullStream()
@@ -460,17 +481,17 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** 
+    /**
      * @return An outputstream to nowhere
      */
     public static InputStream getClosedStream()
     {
         return __closedStream;
     }
-    
+
     /* ------------------------------------------------------------ */
     /* ------------------------------------------------------------ */
-    private static class NullOS extends OutputStream                                    
+    private static class NullOS extends OutputStream
     {
         @Override
         public void close(){}
@@ -485,10 +506,10 @@
     }
     private static NullOS __nullStream = new NullOS();
 
-    
+
     /* ------------------------------------------------------------ */
     /* ------------------------------------------------------------ */
-    private static class ClosedIS extends InputStream                                    
+    private static class ClosedIS extends InputStream
     {
         @Override
         public int read() throws IOException
@@ -497,28 +518,28 @@
         }
     }
     private static ClosedIS __closedStream = new ClosedIS();
-    
+
     /* ------------------------------------------------------------ */
-    /** 
+    /**
      * @return An writer to nowhere
      */
     public static Writer getNullWriter()
     {
         return __nullWriter;
     }
-    
+
     /* ------------------------------------------------------------ */
-    /** 
+    /**
      * @return An writer to nowhere
      */
     public static PrintWriter getNullPrintWriter()
     {
         return __nullPrintWriter;
     }
-    
+
     /* ------------------------------------------------------------ */
     /* ------------------------------------------------------------ */
-    private static class NullWrite extends Writer                                    
+    private static class NullWrite extends Writer
     {
         @Override
         public void close(){}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/IPAddressMap.java b/jetty-util/src/main/java/org/eclipse/jetty/util/IPAddressMap.java
index 370693c..f9143ff 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/IPAddressMap.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/IPAddressMap.java
@@ -32,14 +32,15 @@
  * four octet wildcard specifications (a.b.c.d) that are defined as follows.
  * </p>
  * <pre>
- * nnn - an absolute value (0-255)
- * mmm-nnn - an inclusive range of absolute values, 
- *           with following shorthand notations:
- *           nnn- => nnn-255
- *           -nnn => 0-nnn
- *           -    => 0-255
- * a,b,... - a list of wildcard specifications
+ *     nnn  - an absolute value (0-255)
+ * mmm-nnn  - an inclusive range of absolute values, 
+ *            with following shorthand notations:
+ *              nnn- =&gt; nnn-255
+ *             -nnn  =&gt; 0-nnn
+ *             -     =&gt; 0-255
+ *          a,b,...  - a list of wildcard specifications
  * </pre>
+ * @param <TYPE> the Map Entry value type
  */
 @SuppressWarnings("serial")
 public class IPAddressMap<TYPE> extends HashMap<String, TYPE>
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/IncludeExclude.java b/jetty-util/src/main/java/org/eclipse/jetty/util/IncludeExclude.java
new file mode 100644
index 0000000..fd20040
--- /dev/null
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/IncludeExclude.java
@@ -0,0 +1,129 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.function.BiFunction;
+
+
+/** Utility class to maintain a set of inclusions and exclusions.
+ * <p>Maintains a set of included and excluded elements.  The method {@link #matches(Object)}
+ * will return true IFF the passed object is not in the excluded set AND ( either the 
+ * included set is empty OR the object is in the included set) 
+ * <p>The type of the underlying {@link Set} used may be passed into the 
+ * constructor, so special sets like Servlet PathMap may be used.
+ * <p>
+ * @param <ITEM> The type of element
+ */
+public class IncludeExclude<ITEM> 
+{
+    private final Set<ITEM> _includes;
+    private final Set<ITEM> _excludes;
+    private final BiFunction<Set<ITEM>,ITEM, Boolean> _matcher;
+
+    /**
+     * Default constructor over {@link HashSet}
+     */
+    public IncludeExclude()
+    {
+        this(HashSet.class,null);
+    }
+    
+    /**
+     * Construct an IncludeExclude
+     * @param setClass The type of {@link Set} to using internally
+     * @param matcher A function to test if a passed ITEM is matched by the passed SET, or null to use {@link Set#contains(Object)}
+     */
+    public <SET extends Set<ITEM>> IncludeExclude(Class<SET> setClass, BiFunction<SET,ITEM, Boolean> matcher)
+    {
+        try
+        {
+            _includes = setClass.newInstance();
+            _excludes = setClass.newInstance();
+            _matcher = (BiFunction<Set<ITEM>,ITEM, Boolean>)matcher;
+        }
+        catch (InstantiationException | IllegalAccessException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void include(ITEM element)
+    {
+        _includes.add(element);
+    }
+    
+    public void include(ITEM... element)
+    {
+        for (ITEM e: element)
+            _includes.add(e);
+    }
+
+    public void exclude(ITEM element)
+    {
+        _excludes.add(element);
+    }
+    
+    public void exclude(ITEM... element)
+    {
+        for (ITEM e: element)
+            _excludes.add(e);
+    }
+    
+    public boolean matches(ITEM e)
+    {
+        if (_matcher==null)
+        {
+            if (_includes.size()>0 && !_includes.contains(e))
+                return false;
+            return !_excludes.contains(e);
+        }
+        if (_includes.size()>0 && !_matcher.apply(_includes,e))
+            return false;
+        return !_matcher.apply(_excludes,e);
+    }
+
+    public int size()
+    {
+        return _includes.size()+_excludes.size();
+    }
+    
+    public Set<ITEM> getIncluded()
+    {
+        return _includes;
+    }
+    
+    public Set<ITEM> getExcluded()
+    {
+        return _excludes;
+    }
+
+    public void clear()
+    {
+        _includes.clear();
+        _excludes.clear();
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("%s@%x{i=%s,e=%s,m=%s}",this.getClass().getSimpleName(),hashCode(),_includes,_excludes,_matcher);
+    }
+}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/IteratingCallback.java b/jetty-util/src/main/java/org/eclipse/jetty/util/IteratingCallback.java
index 365dc50..cc140b3 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/IteratingCallback.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/IteratingCallback.java
@@ -19,35 +19,40 @@
 package org.eclipse.jetty.util;
 
 import java.nio.channels.ClosedChannelException;
-import java.util.concurrent.atomic.AtomicReference;
+
+import org.eclipse.jetty.util.thread.Locker;
 
 /**
  * This specialized callback implements a pattern that allows
  * a large job to be broken into smaller tasks using iteration
  * rather than recursion.
- * <p/>
+ * <p>
  * A typical example is the write of a large content to a socket,
  * divided in chunks. Chunk C1 is written by thread T1, which
  * also invokes the callback, which writes chunk C2, which invokes
  * the callback again, which writes chunk C3, and so forth.
- * <p/>
+ * </p>
+ * <p>
  * The problem with the example is that if the callback thread
  * is the same that performs the I/O operation, then the process
  * is recursive and may result in a stack overflow.
  * To avoid the stack overflow, a thread dispatch must be performed,
  * causing context switching and cache misses, affecting performance.
- * <p/>
+ * </p>
+ * <p>
  * To avoid this issue, this callback uses an AtomicReference to
  * record whether success callback has been called during the processing
  * of a sub task, and if so then the processing iterates rather than
  * recurring.
- * <p/>
+ * </p>
+ * <p>
  * Subclasses must implement method {@link #process()} where the sub
  * task is executed and a suitable {@link IteratingCallback.Action} is
  * returned to this callback to indicate the overall progress of the job.
  * This callback is passed to the asynchronous execution of each sub
  * task and a call the {@link #succeeded()} on this callback represents
  * the completion of the sub task.
+ * </p>
  */
 public abstract class IteratingCallback implements Callback
 {
@@ -67,37 +72,32 @@
          * and set iterating to true.
          */
         PROCESSING,
-        
+
         /**
          * Waiting for a schedule callback
          */
         PENDING,
-        
+
         /**
          * Called by a schedule callback
          */
         CALLED,
-        
+
         /**
-         * The overall job has succeeded as indicated by a {@link Action#SUCCEEDED} return 
+         * The overall job has succeeded as indicated by a {@link Action#SUCCEEDED} return
          * from {@link IteratingCallback#process()}
          */
         SUCCEEDED,
-        
+
         /**
          * The overall job has failed as indicated by a call to {@link IteratingCallback#failed(Throwable)}
          */
         FAILED,
-        
+
         /**
          * This callback has been closed and cannot be reset.
-         */ 
-        CLOSED,
-        
-        /**
-         * State is locked while leaving processing state to check the iterate boolean
          */
-        LOCKED
+        CLOSED
     }
 
     /**
@@ -118,32 +118,34 @@
          * may have not yet been invoked.
          */
         SCHEDULED,
-        
+
         /**
          * Indicates that {@link #process()} has completed the overall job.
          */
         SUCCEEDED
     }
 
-    private final AtomicReference<State> _state;
+    private Locker _locker = new Locker();
+    private State _state;
     private boolean _iterate;
-    
-    
+
+
     protected IteratingCallback()
     {
-        _state = new AtomicReference<>(State.IDLE);
+        _state = State.IDLE;
     }
-    
+
     protected IteratingCallback(boolean needReset)
     {
-        _state = new AtomicReference<>(needReset ? State.SUCCEEDED : State.IDLE);
+        _state = needReset ? State.SUCCEEDED : State.IDLE;
     }
-    
+
     /**
      * Method called by {@link #iterate()} to process the sub task.
-     * <p/>
+     * <p>
      * Implementations must start the asynchronous execution of the sub task
      * (if any) and return an appropriate action:
+     * </p>
      * <ul>
      * <li>{@link Action#IDLE} when no sub tasks are available for execution
      * but the overall job is not completed yet</li>
@@ -152,90 +154,83 @@
      * <li>{@link Action#SUCCEEDED} when the overall job is completed</li>
      * </ul>
      *
+     * @return the appropriate Action
+     *
      * @throws Exception if the sub task processing throws
      */
     protected abstract Action process() throws Exception;
 
     /**
-     * @deprecated Use {@link #onCompleteSuccess()} instead.
-     */
-    @Deprecated
-    protected void completed()
-    {
-    }
-
-    /**
      * Invoked when the overall task has completed successfully.
      *
      * @see #onCompleteFailure(Throwable)
      */
     protected void onCompleteSuccess()
     {
-        completed();
     }
-    
+
     /**
      * Invoked when the overall task has completed with a failure.
+     * @param cause the throwable to indicate cause of failure
      *
      * @see #onCompleteSuccess()
      */
-    protected void onCompleteFailure(Throwable x)
+    protected void onCompleteFailure(Throwable cause)
     {
     }
 
     /**
      * This method must be invoked by applications to start the processing
-     * of sub tasks.  It can be called at any time by any thread, and it's 
+     * of sub tasks.  It can be called at any time by any thread, and it's
      * contract is that when called, then the {@link #process()} method will
-     * be called during or soon after, either by the calling thread or by 
+     * be called during or soon after, either by the calling thread or by
      * another thread.
      */
     public void iterate()
     {
+        boolean process=false;
+
         loop: while (true)
         {
-            State state=_state.get();
-            switch (state)
+            try (Locker.Lock lock = _locker.lock())
             {
-                case PENDING:
-                case CALLED:
-                    // process will be called when callback is handled
-                    break loop;
-                    
-                case IDLE:
-                    if (!_state.compareAndSet(state,State.PROCESSING))
-                        continue;
-                    processing();
-                    break loop;
-                    
-                case PROCESSING:
-                    if (!_state.compareAndSet(state,State.LOCKED))
-                        continue;
-                    // Tell the thread that is processing that it must iterate again
-                    _iterate=true;
-                    _state.set(State.PROCESSING);
-                    break loop;
-                    
-                case LOCKED:
-                    Thread.yield();
-                    continue loop;
+                switch (_state)
+                {
+                    case PENDING:
+                    case CALLED:
+                        // process will be called when callback is handled
+                        break loop;
 
-                case FAILED:
-                case SUCCEEDED:
-                    break loop;
+                    case IDLE:
+                        _state=State.PROCESSING;
+                        process=true;
+                        break loop;
 
-                case CLOSED:
-                default:
-                    throw new IllegalStateException("state="+state);
+                    case PROCESSING:
+                        _iterate=true;
+                        break loop;
+
+                    case FAILED:
+                    case SUCCEEDED:
+                        break loop;
+
+                    case CLOSED:
+                    default:
+                        throw new IllegalStateException(toString());
+                }
             }
         }
+        if (process)
+            processing();
     }
 
-    private void processing() 
+    private void processing()
     {
         // This should only ever be called when in processing state, however a failed or close call
         // may happen concurrently, so state is not assumed.
-        
+
+        boolean on_complete_success=false;
+
         // While we are processing
         processing: while (true)
         {
@@ -251,13 +246,10 @@
                 break processing;
             }
 
-            // loop until we have successfully acted on the action we have just received
-            acting: while(true)
+            // acted on the action we have just received
+            try(Locker.Lock lock = _locker.lock())
             {
-                // action handling needs to know the state
-                State state=_state.get();
-                
-                switch (state)
+                switch (_state)
                 {
                     case PROCESSING:
                     {
@@ -265,67 +257,56 @@
                         {
                             case IDLE:
                             {
-                                // lock the state
-                                if (!_state.compareAndSet(state,State.LOCKED))
-                                    continue acting;
-
                                 // Has iterate been called while we were processing?
                                 if (_iterate)
                                 {
                                     // yes, so skip idle and keep processing
                                     _iterate=false;
-                                    _state.set(State.PROCESSING);
+                                    _state=State.PROCESSING;
                                     continue processing;
                                 }
 
                                 // No, so we can go idle
-                                _state.set(State.IDLE);
+                                _state=State.IDLE;
                                 break processing;
                             }
-                            
+
                             case SCHEDULED:
                             {
-                                if (!_state.compareAndSet(state, State.PENDING))
-                                    continue acting;
                                 // we won the race against the callback, so the callback has to process and we can break processing
+                                _state=State.PENDING;
                                 break processing;
                             }
-                            
+
                             case SUCCEEDED:
                             {
-                                if (!_state.compareAndSet(state, State.LOCKED))
-                                    continue acting;
+                                // we lost the race against the callback,
                                 _iterate=false;
-                                _state.set(State.SUCCEEDED);
-                                onCompleteSuccess();
+                                _state=State.SUCCEEDED;
+                                on_complete_success=true;
                                 break processing;
                             }
 
                             default:
-                                throw new IllegalStateException("state="+state+" action="+action); 
+                                throw new IllegalStateException(String.format("%s[action=%s]", this, action));
                         }
                     }
-                    
+
                     case CALLED:
                     {
                         switch (action)
                         {
                             case SCHEDULED:
                             {
-                                if (!_state.compareAndSet(state, State.PROCESSING))
-                                    continue acting;
                                 // we lost the race, so we have to keep processing
+                                _state=State.PROCESSING;
                                 continue processing;
                             }
 
                             default:
-                                throw new IllegalStateException("state="+state+" action="+action); 
+                                throw new IllegalStateException(String.format("%s[action=%s]", this, action));
                         }
                     }
-                        
-                    case LOCKED:
-                        Thread.yield();
-                        continue acting;
 
                     case SUCCEEDED:
                     case FAILED:
@@ -335,12 +316,15 @@
                     case IDLE:
                     case PENDING:
                     default:
-                        throw new IllegalStateException("state="+state+" action="+action); 
+                        throw new IllegalStateException(String.format("%s[action=%s]", this, action));
                 }
             }
         }
+
+        if (on_complete_success)
+            onCompleteSuccess();
     }
-    
+
     /**
      * Invoked when the sub task succeeds.
      * Subclasses that override this method must always remember to call
@@ -349,41 +333,36 @@
     @Override
     public void succeeded()
     {
-        loop: while (true)
+        boolean process=false;
+        try(Locker.Lock lock = _locker.lock())
         {
-            State state = _state.get();
-            switch (state)
+            switch (_state)
             {
                 case PROCESSING:
                 {
-                    if (!_state.compareAndSet(state, State.CALLED))
-                        continue loop;
-                    break loop;
+                    _state=State.CALLED;
+                    break;
                 }
                 case PENDING:
                 {
-                    if (!_state.compareAndSet(state, State.PROCESSING))
-                        continue loop;
-                    processing();
-                    break loop;
+                    _state=State.PROCESSING;
+                    process=true;
+                    break;
                 }
                 case CLOSED:
                 case FAILED:
                 {
                     // Too late!
-                    break loop;
+                    break;
                 }
-                case LOCKED:
-                {
-                    Thread.yield();
-                    continue loop;
-                }       
                 default:
                 {
-                    throw new IllegalStateException("state="+state);
+                    throw new IllegalStateException(toString());
                 }
             }
         }
+        if (process)
+            processing();
     }
 
     /**
@@ -394,73 +373,58 @@
     @Override
     public void failed(Throwable x)
     {
-        loop: while (true)
+        boolean failure=false;
+        try(Locker.Lock lock = _locker.lock())
         {
-            State state = _state.get();
-            switch (state)
+            switch (_state)
             {
                 case SUCCEEDED:
                 case FAILED:
                 case IDLE:
                 case CLOSED:
                 case CALLED:
-                {
                     // too late!.
-                    break loop;
-                }
-                case LOCKED:
-                {
-                    Thread.yield();
-                    continue loop;
-                }  
-                case PENDING: 
-                case PROCESSING: 
-                {
-                    if (!_state.compareAndSet(state, State.FAILED))
-                        continue loop;
+                    break;
 
-                    onCompleteFailure(x);
-                    break loop;
+                case PENDING:
+                case PROCESSING:
+                {
+                    _state=State.FAILED;
+                    failure=true;
+                    break;
                 }
                 default:
-                    throw new IllegalStateException("state="+state);
+                    throw new IllegalStateException(toString());
             }
         }
+        if (failure)
+            onCompleteFailure(x);
     }
 
     public void close()
     {
-        loop: while (true)
+        boolean failure=false;
+        try(Locker.Lock lock = _locker.lock())
         {
-            State state = _state.get();
-            switch (state)
+            switch (_state)
             {
                 case IDLE:
                 case SUCCEEDED:
                 case FAILED:
-                {
-                    if (!_state.compareAndSet(state, State.CLOSED))
-                        continue loop;
-                    break loop;
-                }
+                    _state=State.CLOSED;
+                    break;
+
                 case CLOSED:
-                {
-                    break loop;
-                }
-                case LOCKED:
-                {
-                    Thread.yield();
-                    continue loop;
-                }    
+                    break;
+
                 default:
-                {
-                    if (!_state.compareAndSet(state, State.CLOSED))
-                        continue loop;
-                    onCompleteFailure(new ClosedChannelException());
-                    break loop;
-                }
+                    _state=State.CLOSED;
+                    failure=true;
             }
         }
+
+        if(failure)
+            onCompleteFailure(new ClosedChannelException());
     }
 
     /*
@@ -469,20 +433,29 @@
      */
     boolean isIdle()
     {
-        return _state.get() == State.IDLE;
+        try(Locker.Lock lock = _locker.lock())
+        {
+            return _state == State.IDLE;
+        }
     }
 
     public boolean isClosed()
     {
-        return _state.get() == State.CLOSED;
+        try(Locker.Lock lock = _locker.lock())
+        {
+            return _state == State.CLOSED;
+        }
     }
-    
+
     /**
      * @return whether this callback has failed
      */
     public boolean isFailed()
     {
-        return _state.get() == State.FAILED;
+        try(Locker.Lock lock = _locker.lock())
+        {
+            return _state == State.FAILED;
+        }
     }
 
     /**
@@ -490,51 +463,42 @@
      */
     public boolean isSucceeded()
     {
-        return _state.get() == State.SUCCEEDED;
+        try(Locker.Lock lock = _locker.lock())
+        {
+            return _state == State.SUCCEEDED;
+        }
     }
 
     /**
      * Resets this callback.
-     * <p/>
+     * <p>
      * A callback can only be reset to IDLE from the
      * SUCCEEDED or FAILED states or if it is already IDLE.
+     * </p>
      *
      * @return true if the reset was successful
      */
     public boolean reset()
     {
-        while (true)
+        try(Locker.Lock lock = _locker.lock())
         {
-            State state=_state.get();
-            switch(state)
+            switch(_state)
             {
                 case IDLE:
                     return true;
-                    
+
                 case SUCCEEDED:
-                    if (!_state.compareAndSet(state, State.LOCKED))
-                        continue;
-                    _iterate=false;
-                    _state.set(State.IDLE);
-                    return true;
-                    
                 case FAILED:
-                    if (!_state.compareAndSet(state, State.LOCKED))
-                        continue;
                     _iterate=false;
-                    _state.set(State.IDLE);
+                    _state=State.IDLE;
                     return true;
 
-                case LOCKED:
-                    Thread.yield();
-                    continue;
-                    
                 default:
                     return false;
             }
         }
     }
-    
+
     @Override
     public String toString()
     {
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/IteratingNestedCallback.java b/jetty-util/src/main/java/org/eclipse/jetty/util/IteratingNestedCallback.java
index ac6c99a..8f230e4 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/IteratingNestedCallback.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/IteratingNestedCallback.java
@@ -46,6 +46,12 @@
     {
         _callback=callback;
     }
+
+    @Override
+    public boolean isNonBlocking()
+    { 
+        return _callback.isNonBlocking();
+    }
     
     @Override
     protected void onCompleteSuccess()
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/Jetty.java b/jetty-util/src/main/java/org/eclipse/jetty/util/Jetty.java
index 6a0aa53..fc33845 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/Jetty.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/Jetty.java
@@ -21,6 +21,7 @@
 public class Jetty
 {
     public static final String VERSION;
+    public static final String POWERED_BY;
 
     static
     {
@@ -30,10 +31,13 @@
                 pkg.getImplementationVersion() != null)
             VERSION = pkg.getImplementationVersion();
         else
-            VERSION = System.getProperty("jetty.version", "9.2.z-SNAPSHOT");
+            VERSION = System.getProperty("jetty.version", "9.3.z-SNAPSHOT");
+        
+        POWERED_BY="<a href=\"http://eclipse.org/jetty\">Powered by Jetty:// "+VERSION+"</a>";
     }
 
     private Jetty()
     {
     }
+    
 }
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/LazyList.java b/jetty-util/src/main/java/org/eclipse/jetty/util/LazyList.java
index 2013a68..0855be3 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/LazyList.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/LazyList.java
@@ -27,21 +27,23 @@
 import java.util.List;
 import java.util.ListIterator;
 
-/* ------------------------------------------------------------ */
-/** Lazy List creation.
+/** 
+ * Lazy List creation.
+ * <p>
  * A List helper class that attempts to avoid unnecessary List
  * creation.   If a method needs to create a List to return, but it is
  * expected that this will either be empty or frequently contain a
  * single item, then using LazyList will avoid additional object
  * creations by using {@link Collections#EMPTY_LIST} or
  * {@link Collections#singletonList(Object)} where possible.
+ * </p>
  * <p>
  * LazyList works by passing an opaque representation of the list in
  * and out of all the LazyList methods.  This opaque object is either
  * null for an empty list, an Object for a list with a single entry
  * or an {@link ArrayList} for a list of items.
- *
- * <p><h4>Usage</h4>
+ * </p>
+ * <strong>Usage</strong>
  * <pre>
  *   Object lazylist =null;
  *   while(loopCondition)
@@ -162,7 +164,9 @@
 
     /* ------------------------------------------------------------ */
     /** Ensure the capacity of the underlying list.
-     * 
+     * @param list the list to grow 
+     * @param initialSize the size to grow to
+     * @return the new List with new size
      */
     public static Object ensureSize(Object list, int initialSize)
     {
@@ -230,6 +234,7 @@
      * @param list A LazyList returned from LazyList.add(Object)
      * @return The List of added items, which may be an EMPTY_LIST
      * or a SingletonList.
+     * @param <E> the list entry type
      */
     public static<E> List<E> getList(Object list)
     {
@@ -245,6 +250,7 @@
      * empty list.
      * @return The List of added items, which may be null, an EMPTY_LIST
      * or a SingletonList.
+     * @param <E> the list entry type
      */
     @SuppressWarnings("unchecked")
     public static<E> List<E> getList(Object list, boolean nullForEmpty)
@@ -365,6 +371,7 @@
      * @param list  A LazyList returned from LazyList.add(Object) or null
      * @param i int index
      * @return the item from the list.
+     * @param <E> the list entry type
      */
     @SuppressWarnings("unchecked")
     public static <E> E get(Object list, int i)
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/Loader.java b/jetty-util/src/main/java/org/eclipse/jetty/util/Loader.java
index 500f9f9..062029c 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/Loader.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/Loader.java
@@ -69,10 +69,10 @@
     /* ------------------------------------------------------------ */
     /** Load a class.
      * 
-     * @param loadClass
-     * @param name
+     * @param loadClass the class to use for the ClassLoader that was used
+     * @param name the name of the new class to load, using the same ClassLoader as the <code>loadClass</code> 
      * @return Class
-     * @throws ClassNotFoundException
+     * @throws ClassNotFoundException if not able to find the class
      */
     @SuppressWarnings("rawtypes")
     public static Class loadClass(Class loadClass,String name)
@@ -153,7 +153,9 @@
      * above the given classloader.
      * 
      * This is primarily used for jasper.
+     * @param loader the classloader to use
      * @return the system class path
+     * @throws Exception if unable to generate the classpath from the resource references
      */
     public static String getClassPath(ClassLoader loader) throws Exception
     {
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/MemoryUtils.java b/jetty-util/src/main/java/org/eclipse/jetty/util/MemoryUtils.java
index a0e50f4..a8f830d 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/MemoryUtils.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/MemoryUtils.java
@@ -22,8 +22,7 @@
 import java.security.PrivilegedAction;
 
 /**
- * {@link MemoryUtils} provides an abstraction over memory properties and operations.
- * <p />
+ * MemoryUtils provides an abstraction over memory properties and operations.
  */
 public class MemoryUtils
 {
@@ -67,5 +66,4 @@
     {
         return getCacheLineBytes() >> 3;
     }
-
 }
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiException.java b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiException.java
index f3e7d39..73aa26c 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiException.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiException.java
@@ -86,7 +86,7 @@
      * If this multi exception is empty then no action is taken. If it
      * contains a single exception that is thrown, otherwise the this
      * multi exception is thrown. 
-     * @exception Exception 
+     * @exception Exception the Error or Exception if nested is 1, or the MultiException itself if nested is more than 1.
      */
     public void ifExceptionThrow()
         throws Exception
@@ -146,6 +146,7 @@
      * If this multi exception is empty then no action is taken. If it
      * contains a any exceptions then this
      * multi exception is thrown. 
+     * @throws MultiException the multiexception if there are nested exception
      */
     public void ifExceptionThrowMulti()
         throws MultiException
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiMap.java b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiMap.java
index 286889b..2d9a533 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiMap.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiMap.java
@@ -28,6 +28,7 @@
 
 /** 
  * A multi valued Map.
+ * @param <V> the entry type for multimap values
  */
 @SuppressWarnings("serial")
 public class MultiMap<V> extends HashMap<String,List<V>>
@@ -283,7 +284,7 @@
      * Test for a specific single value in the map.
      * <p>
      * NOTE: This is a SLOW operation, and is actively discouraged.
-     * @param value
+     * @param value the value to search for
      * @return true if contains simple value
      */
     public boolean containsSimpleValue(V value)
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStreamParser.java b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStreamParser.java
index a8607ea..755e6bd 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStreamParser.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStreamParser.java
@@ -30,6 +30,9 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -37,7 +40,6 @@
 import java.util.Locale;
 
 import javax.servlet.MultipartConfigElement;
-import javax.servlet.ServletException;
 import javax.servlet.http.Part;
 
 import org.eclipse.jetty.util.log.Log;
@@ -125,7 +127,7 @@
 
             if (MultiPartInputStreamParser.this._config.getFileSizeThreshold() > 0 && _size + length > MultiPartInputStreamParser.this._config.getFileSizeThreshold() && _file==null)
                 createFile();
-           
+
             _out.write(bytes, offset, length);
             _size += length;
         }
@@ -134,7 +136,7 @@
         throws IOException
         {
             _file = File.createTempFile("MultiPart", "", MultiPartInputStreamParser.this._tmpDir);
-            
+
             if (_deleteOnExit)
                 _file.deleteOnExit();
             FileOutputStream fos = new FileOutputStream(_file);
@@ -173,7 +175,7 @@
         {
             if (name == null)
                 return null;
-            return (String)_headers.getValue(name.toLowerCase(Locale.ENGLISH), 0);
+            return _headers.getValue(name.toLowerCase(Locale.ENGLISH), 0);
         }
 
         /**
@@ -209,8 +211,8 @@
            }
         }
 
-        
-        /** 
+
+        /**
          * @see javax.servlet.http.Part#getSubmittedFileName()
          */
         @Override
@@ -239,7 +241,7 @@
          */
         public long getSize()
         {
-            return _size;         
+            return _size;
         }
 
         /**
@@ -250,7 +252,7 @@
             if (_file == null)
             {
                 _temporary = false;
-                
+
                 //part data is only in the ByteArrayOutputStream and never been written to disk
                 _file = new File (_tmpDir, fileName);
 
@@ -272,10 +274,11 @@
             {
                 //the part data is already written to a temporary file, just rename it
                 _temporary = false;
-                
-                File f = new File(_tmpDir, fileName);
-                if (_file.renameTo(f))
-                    _file = f;
+
+                Path src = _file.toPath();
+                Path target = src.resolveSibling(fileName);
+                Files.move(src, target, StandardCopyOption.REPLACE_EXISTING);
+                _file = target.toFile();
             }
         }
 
@@ -287,13 +290,13 @@
         public void delete() throws IOException
         {
             if (_file != null && _file.exists())
-                _file.delete();     
+                _file.delete();
         }
-        
+
         /**
          * Only remove tmp files.
-         * 
-         * @throws IOException
+         *
+         * @throws IOException if unable to delete the file
          */
         public void cleanUp() throws IOException
         {
@@ -303,7 +306,8 @@
 
 
         /**
-         * Get the file, if any, the data has been written to.
+         * Get the file
+         * @return the file, if any, the data has been written to.
          */
         public File getFile ()
         {
@@ -338,13 +342,14 @@
        _contextTmpDir = contextTmpDir;
        if (_contextTmpDir == null)
            _contextTmpDir = new File (System.getProperty("java.io.tmpdir"));
-       
+
        if (_config == null)
            _config = new MultipartConfigElement(_contextTmpDir.getAbsolutePath());
     }
 
     /**
      * Get the already parsed parts.
+     * @return the parts that were parsed
      */
     public Collection<Part> getParsedParts()
     {
@@ -352,7 +357,7 @@
             return Collections.emptyList();
 
         Collection<List<Part>> values = _parts.values();
-        List<Part> parts = new ArrayList<Part>();
+        List<Part> parts = new ArrayList<>();
         for (List<Part> o: values)
         {
             List<Part> asList = LazyList.getList(o, false);
@@ -363,8 +368,8 @@
 
     /**
      * Delete any tmp storage for parts, and clear out the parts list.
-     * 
-     * @throws MultiException
+     *
+     * @throws MultiException if unable to delete the parts
      */
     public void deleteParts ()
     throws MultiException
@@ -376,30 +381,30 @@
             try
             {
                 ((MultiPartInputStreamParser.MultiPart)p).cleanUp();
-            } 
+            }
             catch(Exception e)
-            {     
-                err.add(e); 
+            {
+                err.add(e);
             }
         }
         _parts.clear();
-        
+
         err.ifExceptionThrowMulti();
     }
 
-   
+
     /**
      * Parse, if necessary, the multipart data and return the list of Parts.
-     * 
-     * @throws IOException
-     * @throws ServletException
+     *
+     * @return the parts
+     * @throws IOException if unable to get the parts
      */
     public Collection<Part> getParts()
-    throws IOException, ServletException
+    throws IOException
     {
         parse();
         Collection<List<Part>> values = _parts.values();
-        List<Part> parts = new ArrayList<Part>();
+        List<Part> parts = new ArrayList<>();
         for (List<Part> o: values)
         {
             List<Part> asList = LazyList.getList(o, false);
@@ -411,27 +416,26 @@
 
     /**
      * Get the named Part.
-     * 
-     * @param name
-     * @throws IOException
-     * @throws ServletException
+     *
+     * @param name the part name
+     * @return the parts
+     * @throws IOException if unable to get the part
      */
     public Part getPart(String name)
-    throws IOException, ServletException
+    throws IOException
     {
         parse();
-        return (Part)_parts.getValue(name, 0);
+        return _parts.getValue(name, 0);
     }
 
 
     /**
      * Parse, if necessary, the multipart stream.
-     * 
-     * @throws IOException
-     * @throws ServletException
+     *
+     * @throws IOException if unable to parse
      */
     protected void parse ()
-    throws IOException, ServletException
+    throws IOException
     {
         //have we already parsed the input?
         if (_parts != null)
@@ -439,7 +443,7 @@
 
         //initialize
         long total = 0; //keep running total of size of bytes read from input and throw an exception if exceeds MultipartConfigElement._maxRequestSize
-        _parts = new MultiMap<Part>();
+        _parts = new MultiMap<>();
 
         //if its not a multipart request, don't parse it
         if (_contentType == null || !_contentType.startsWith("multipart/form-data"))
@@ -471,28 +475,29 @@
             bend = (bend < 0? _contentType.length(): bend);
             contentTypeBoundary = QuotedStringTokenizer.unquote(value(_contentType.substring(bstart,bend)).trim());
         }
-        
+
         String boundary="--"+contentTypeBoundary;
-        byte[] byteBoundary=(boundary+"--").getBytes(StandardCharsets.ISO_8859_1);
+        String lastBoundary=boundary+"--";
+        byte[] byteBoundary=lastBoundary.getBytes(StandardCharsets.ISO_8859_1);
 
         // Get first boundary
         String line = null;
         try
         {
-            line=((ReadLineInputStream)_in).readLine();  
+            line=((ReadLineInputStream)_in).readLine();
         }
         catch (IOException e)
         {
             LOG.warn("Badly formatted multipart request");
             throw e;
         }
-        
+
         if (line == null)
             throw new IOException("Missing content for multipart request");
-        
+
         boolean badFormatLogged = false;
         line=line.trim();
-        while (line != null && !line.equals(boundary))
+        while (line != null && !line.equals(boundary) && !line.equals(lastBoundary))
         {
             if (!badFormatLogged)
             {
@@ -506,6 +511,10 @@
         if (line == null)
             throw new IOException("Missing initial multi part boundary");
 
+        // Empty multipart.
+        if (line.equals(lastBoundary))
+            return;
+
         // Read each part
         boolean lastPart=false;
 
@@ -514,20 +523,20 @@
             String contentDisposition=null;
             String contentType=null;
             String contentTransferEncoding=null;
-            
-            MultiMap<String> headers = new MultiMap<String>();
+
+            MultiMap<String> headers = new MultiMap<>();
             while(true)
             {
                 line=((ReadLineInputStream)_in).readLine();
-                
+
                 //No more input
                 if(line==null)
                     break outer;
-                
+
                 //end of headers:
                 if("".equals(line))
                     break;
-           
+
                 total += line.length();
                 if (_config.getMaxRequestSize() > 0 && total > _config.getMaxRequestSize())
                     throw new IllegalStateException ("Request exceeds maxRequestSize ("+_config.getMaxRequestSize()+")");
@@ -591,7 +600,7 @@
             part.setContentType(contentType);
             _parts.add(name, part);
             part.open();
-            
+
             InputStream partInput = null;
             if ("base64".equalsIgnoreCase(contentTransferEncoding))
             {
@@ -623,7 +632,7 @@
             else
                 partInput = _in;
 
-            
+
             try
             {
                 int state=-2;
@@ -642,7 +651,7 @@
                             throw new IllegalStateException("Request exceeds maxRequestSize ("+_config.getMaxRequestSize()+")");
 
                         state=-2;
-                        
+
                         // look for CR and/or LF
                         if(c==13||c==10)
                         {
@@ -657,7 +666,7 @@
                             }
                             break;
                         }
-                        
+
                         // Look for boundary
                         if(b>=0&&b<byteBoundary.length&&c==byteBoundary[b])
                         {
@@ -681,7 +690,7 @@
                             part.write(c);
                         }
                     }
-                    
+
                     // Check for incomplete boundary match, writing out the chars we matched along the way
                     if((b>0&&b<byteBoundary.length-2)||(b==byteBoundary.length-1))
                     {
@@ -695,18 +704,18 @@
                         part.write(byteBoundary,0,b);
                         b=-1;
                     }
-                    
+
                     // Boundary match. If we've run out of input or we matched the entire final boundary marker, then this is the last part.
                     if(b>0||c==-1)
                     {
-                       
+
                         if(b==byteBoundary.length)
                             lastPart=true;
                         if(state==10)
                             state=-2;
                         break;
                     }
-                    
+
                     // handle CR LF
                     if(cr)
                         part.write(13);
@@ -729,7 +738,7 @@
         if (!lastPart)
             throw new IOException("Incomplete parts");
     }
-    
+
     public void setDeleteOnExit(boolean deleteOnExit)
     {
         _deleteOnExit = deleteOnExit;
@@ -749,8 +758,8 @@
         String value = nameEqualsValue.substring(idx+1).trim();
         return QuotedStringTokenizer.unquoteOnly(value);
     }
-    
-    
+
+
     /* ------------------------------------------------------------ */
     private String filenameValue(String nameEqualsValue)
     {
@@ -778,7 +787,7 @@
             return QuotedStringTokenizer.unquoteOnly(value, true);
     }
 
-    
+
 
     private static class Base64InputStream extends InputStream
     {
@@ -787,7 +796,7 @@
         byte[] _buffer;
         int _pos;
 
-    
+
         public Base64InputStream(ReadLineInputStream rlis)
         {
             _in = rlis;
@@ -802,7 +811,7 @@
                 //We need to put them back into the bytes returned from this
                 //method because the parsing of the multipart content uses them
                 //as markers to determine when we've reached the end of a part.
-                _line = _in.readLine(); 
+                _line = _in.readLine();
                 if (_line==null)
                     return -1;  //nothing left
                 if (_line.startsWith("--"))
@@ -820,7 +829,7 @@
 
                 _pos=0;
             }
-            
+
             return _buffer[_pos++];
         }
     }
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartOutputStream.java b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartOutputStream.java
index ddf9850..13284c2 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartOutputStream.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartOutputStream.java
@@ -24,7 +24,6 @@
 import java.nio.charset.StandardCharsets;
 
 
-/* ================================================================ */
 /** Handle a multipart MIME response.
  *
  * 
@@ -100,6 +99,8 @@
     
     /* ------------------------------------------------------------ */
     /** Start creation of the next Content.
+     * @param contentType the content type of the part
+     * @throws IOException if unable to write the part
      */
     public void startPart(String contentType)
          throws IOException
@@ -118,6 +119,9 @@
         
     /* ------------------------------------------------------------ */
     /** Start creation of the next Content.
+     * @param contentType the content type of the part
+     * @param headers the part headers
+     * @throws IOException if unable to write the part
      */
     public void startPart(String contentType, String[] headers)
          throws IOException
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartWriter.java b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartWriter.java
index f0654f5..93f603c 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartWriter.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartWriter.java
@@ -87,6 +87,8 @@
     
     /* ------------------------------------------------------------ */
     /** Start creation of the next Content.
+     * @param contentType the content type
+     * @throws IOException if unable to write the part
      */
     public void startPart(String contentType)
          throws IOException
@@ -105,6 +107,7 @@
     
     /* ------------------------------------------------------------ */
     /** end creation of the next Content.
+     * @throws IOException if unable to write the part
      */
     public void endPart()
          throws IOException
@@ -116,6 +119,9 @@
         
     /* ------------------------------------------------------------ */
     /** Start creation of the next Content.
+     * @param contentType the content type of the part
+     * @param headers the part headers
+     * @throws IOException if unable to write the part
      */
     public void startPart(String contentType, String[] headers)
          throws IOException
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/PathWatcher.java b/jetty-util/src/main/java/org/eclipse/jetty/util/PathWatcher.java
new file mode 100644
index 0000000..f33ea8e
--- /dev/null
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/PathWatcher.java
@@ -0,0 +1,1454 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util;
+
+import static java.nio.file.StandardWatchEventKinds.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.nio.file.ClosedWatchServiceException;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.LinkOption;
+import java.nio.file.Path;
+import java.nio.file.PathMatcher;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.WatchEvent;
+import java.nio.file.WatchEvent.Kind;
+import java.nio.file.WatchKey;
+import java.nio.file.WatchService;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.EventListener;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Scanner;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jetty.util.component.AbstractLifeCycle;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+/**
+ * Watch a Path (and sub directories) for Path changes.
+ * <p>
+ * Suitable replacement for the old {@link Scanner} implementation.
+ * <p>
+ * Allows for configured Excludes and Includes using {@link FileSystem#getPathMatcher(String)} syntax.
+ * <p>
+ * Reports activity via registered {@link Listener}s
+ */
+public class PathWatcher extends AbstractLifeCycle implements Runnable
+{
+    public static class Config
+    {
+        public static final int UNLIMITED_DEPTH = -9999;
+        
+        private static final String PATTERN_SEP;
+
+        static
+        {
+            String sep = File.separator;
+            if (File.separatorChar == '\\')
+            {
+                sep = "\\\\";
+            }
+            PATTERN_SEP = sep;
+        }
+
+        protected final Path dir;
+        protected int recurseDepth = 0; // 0 means no sub-directories are scanned
+        protected List<PathMatcher> includes;
+        protected List<PathMatcher> excludes;
+        protected boolean excludeHidden = false;
+
+        public Config(Path path)
+        {
+            this.dir = path;
+            includes = new ArrayList<>();
+            excludes = new ArrayList<>();
+        }
+
+        /**
+         * Add an exclude PathMatcher
+         *
+         * @param matcher
+         *            the path matcher for this exclude
+         */
+        public void addExclude(PathMatcher matcher)
+        {
+            this.excludes.add(matcher);
+        }
+
+        /**
+         * Add an exclude PathMatcher.
+         * <p>
+         * Note: this pattern is FileSystem specific (so use "/" for Linux and OSX, and "\\" for Windows)
+         *
+         * @param syntaxAndPattern
+         *            the PathMatcher syntax and pattern to use
+         * @see FileSystem#getPathMatcher(String) for detail on syntax and pattern
+         */
+        public void addExclude(final String syntaxAndPattern)
+        {
+            if (LOG.isDebugEnabled())
+            {
+                LOG.debug("Adding exclude: [{}]",syntaxAndPattern);
+            }
+            addExclude(dir.getFileSystem().getPathMatcher(syntaxAndPattern));
+        }
+
+        /**
+         * Add a <code>glob:</code> syntax pattern exclude reference in a directory relative, os neutral, pattern.
+         *
+         * <pre>
+         *    On Linux:
+         *    Config config = new Config(Path("/home/user/example"));
+         *    config.addExcludeGlobRelative("*.war") =&gt; "glob:/home/user/example/*.war"
+         * 
+         *    On Windows
+         *    Config config = new Config(Path("D:/code/examples"));
+         *    config.addExcludeGlobRelative("*.war") =&gt; "glob:D:\\code\\examples\\*.war"
+         *
+         * </pre>
+         *
+         * @param pattern
+         *            the pattern, in unixy format, relative to config.dir
+         */
+        public void addExcludeGlobRelative(String pattern)
+        {
+            addExclude(toGlobPattern(dir,pattern));
+        }
+
+        /**
+         * Exclude hidden files and hidden directories
+         */
+        public void addExcludeHidden()
+        {
+            if (!excludeHidden)
+            {
+                if (LOG.isDebugEnabled())
+                {
+                    LOG.debug("Adding hidden files and directories to exclusions");
+                }
+                excludeHidden = true;
+
+                addExclude("regex:^.*" + PATTERN_SEP + "\\..*$"); // ignore hidden files
+                addExclude("regex:^.*" + PATTERN_SEP + "\\..*" + PATTERN_SEP + ".*$"); // ignore files in hidden directories
+            }
+        }
+
+        /**
+         * Add multiple exclude PathMatchers
+         *
+         * @param syntaxAndPatterns
+         *            the list of PathMatcher syntax and patterns to use
+         * @see FileSystem#getPathMatcher(String) for detail on syntax and pattern
+         */
+        public void addExcludes(List<String> syntaxAndPatterns)
+        {
+            for (String syntaxAndPattern : syntaxAndPatterns)
+            {
+                addExclude(syntaxAndPattern);
+            }
+        }
+
+        /**
+         * Add an include PathMatcher
+         *
+         * @param matcher
+         *            the path matcher for this include
+         */
+        public void addInclude(PathMatcher matcher)
+        {
+            this.includes.add(matcher);
+        }
+
+        /**
+         * Add an include PathMatcher
+         *
+         * @param syntaxAndPattern
+         *            the PathMatcher syntax and pattern to use
+         * @see FileSystem#getPathMatcher(String) for detail on syntax and pattern
+         */
+        public void addInclude(String syntaxAndPattern)
+        {
+            if (LOG.isDebugEnabled())
+            {
+                LOG.debug("Adding include: [{}]",syntaxAndPattern);
+            }
+            addInclude(dir.getFileSystem().getPathMatcher(syntaxAndPattern));
+        }
+
+        /**
+         * Add a <code>glob:</code> syntax pattern reference in a directory relative, os neutral, pattern.
+         *
+         * <pre>
+         *    On Linux:
+         *    Config config = new Config(Path("/home/user/example"));
+         *    config.addIncludeGlobRelative("*.war") =&gt; "glob:/home/user/example/*.war"
+         * 
+         *    On Windows
+         *    Config config = new Config(Path("D:/code/examples"));
+         *    config.addIncludeGlobRelative("*.war") =&gt; "glob:D:\\code\\examples\\*.war"
+         *
+         * </pre>
+         *
+         * @param pattern
+         *            the pattern, in unixy format, relative to config.dir
+         */
+        public void addIncludeGlobRelative(String pattern)
+        {
+            addInclude(toGlobPattern(dir,pattern));
+        }
+
+        /**
+         * Add multiple include PathMatchers
+         *
+         * @param syntaxAndPatterns
+         *            the list of PathMatcher syntax and patterns to use
+         * @see FileSystem#getPathMatcher(String) for detail on syntax and pattern
+         */
+        public void addIncludes(List<String> syntaxAndPatterns)
+        {
+            for (String syntaxAndPattern : syntaxAndPatterns)
+            {
+                addInclude(syntaxAndPattern);
+            }
+        }
+
+        /**
+         * Build a new config from a this configuration.
+         * <p>
+         * Useful for working with sub-directories that also need to be watched.
+         *
+         * @param dir
+         *            the directory to build new Config from (using this config as source of includes/excludes)
+         * @return the new Config
+         */
+        public Config asSubConfig(Path dir)
+        {
+            Config subconfig = new Config(dir);
+            subconfig.includes = this.includes;
+            subconfig.excludes = this.excludes;
+            if (dir == this.dir)
+                subconfig.recurseDepth = this.recurseDepth; // TODO shouldn't really do a subconfig for this
+            else
+            {
+                if (this.recurseDepth == UNLIMITED_DEPTH)
+                    subconfig.recurseDepth = UNLIMITED_DEPTH;
+                else
+                    subconfig.recurseDepth = this.recurseDepth - (dir.getNameCount() - this.dir.getNameCount());                
+            }
+            return subconfig;
+        }
+
+        public int getRecurseDepth()
+        {
+            return recurseDepth;
+        }
+        
+        public boolean isRecurseDepthUnlimited ()
+        {
+            return this.recurseDepth == UNLIMITED_DEPTH;
+        }
+        
+        public Path getPath ()
+        {
+            return this.dir;
+        }
+
+        private boolean hasMatch(Path path, List<PathMatcher> matchers)
+        {
+            for (PathMatcher matcher : matchers)
+            {
+                if (matcher.matches(path))
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        public boolean isExcluded(Path dir) throws IOException
+        {
+            if (excludeHidden)
+            {
+                if (Files.isHidden(dir))
+                {
+                    if (NOISY_LOG.isDebugEnabled())
+                    {
+                        NOISY_LOG.debug("isExcluded [Hidden] on {}",dir);
+                    }
+                    return true;
+                }
+            }
+
+            if (excludes.isEmpty())
+            {
+                // no excludes == everything allowed
+                return false;
+            }
+
+            boolean matched = hasMatch(dir,excludes);
+            if (NOISY_LOG.isDebugEnabled())
+            {
+                NOISY_LOG.debug("isExcluded [{}] on {}",matched,dir);
+            }
+            return matched;
+        }
+
+        public boolean isIncluded(Path dir)
+        {
+            if (includes.isEmpty())
+            {
+                // no includes == everything allowed
+                if (NOISY_LOG.isDebugEnabled())
+                {
+                    NOISY_LOG.debug("isIncluded [All] on {}",dir);
+                }
+                return true;
+            }
+
+            boolean matched = hasMatch(dir,includes);
+            if (NOISY_LOG.isDebugEnabled())
+            {
+                NOISY_LOG.debug("isIncluded [{}] on {}",matched,dir);
+            }
+            return matched;
+        }
+
+        public boolean matches(Path path)
+        {
+            try
+            {
+                return !isExcluded(path) && isIncluded(path);
+            }
+            catch (IOException e)
+            {
+                LOG.warn("Unable to match path: " + path,e);
+                return false;
+            }
+        }
+
+        /**
+         * Set the recurse depth for the directory scanning.
+         * <p>
+         * -999 indicates arbitrarily deep recursion, 0 indicates no recursion, 1 is only one directory deep, and so on.
+         *
+         * @param depth
+         *            the number of directories deep to recurse
+         */
+        public void setRecurseDepth(int depth)
+        {
+            this.recurseDepth = depth;
+        }
+        
+   
+
+        /**
+         * Determine if the provided child directory should be recursed into based on the configured {@link #setRecurseDepth(int)}
+         *
+         * @param child
+         *            the child directory to test against
+         * @return true if recurse should occur, false otherwise
+         */
+        public boolean shouldRecurseDirectory(Path child)
+        {
+            if (!child.startsWith(dir))
+            {
+                // not part of parent? don't recurse
+                return false;
+            }
+
+            //If not limiting depth, should recurse all
+            if (isRecurseDepthUnlimited())
+                return true;
+            
+            //Depth limited, check it
+            int childDepth = dir.relativize(child).getNameCount();
+            return (childDepth <= recurseDepth);
+        }
+
+        private String toGlobPattern(Path path, String subPattern)
+        {
+            StringBuilder s = new StringBuilder();
+            s.append("glob:");
+
+            boolean needDelim = false;
+
+            // Add root (aka "C:\" for Windows)
+            Path root = path.getRoot();
+            if (root != null)
+            {
+                if (NOISY_LOG.isDebugEnabled())
+                {
+                    NOISY_LOG.debug("Path: {} -> Root: {}",path,root);
+                }
+                for (char c : root.toString().toCharArray())
+                {
+                    if (c == '\\')
+                    {
+                        s.append(PATTERN_SEP);
+                    }
+                    else
+                    {
+                        s.append(c);
+                    }
+                }
+            }
+            else
+            {
+                needDelim = true;
+            }
+
+            // Add the individual path segments
+            for (Path segment : path)
+            {
+                if (needDelim)
+                {
+                    s.append(PATTERN_SEP);
+                }
+                s.append(segment);
+                needDelim = true;
+            }
+
+            // Add the sub pattern (if specified)
+            if ((subPattern != null) && (subPattern.length() > 0))
+            {
+                if (needDelim)
+                {
+                    s.append(PATTERN_SEP);
+                }
+                for (char c : subPattern.toCharArray())
+                {
+                    if (c == '/')
+                    {
+                        s.append(PATTERN_SEP);
+                    }
+                    else
+                    {
+                        s.append(c);
+                    }
+                }
+            }
+
+            return s.toString();
+        }
+
+        @Override
+        public String toString()
+        {
+            StringBuilder s = new StringBuilder();
+            s.append(dir);
+            if (recurseDepth > 0)
+            {
+                s.append(" [depth=").append(recurseDepth).append("]");
+            }
+            return s.toString();
+        }
+    }
+    
+    public static class DepthLimitedFileVisitor extends SimpleFileVisitor<Path>
+    {
+        private Config base;
+        private PathWatcher watcher;
+        
+        public DepthLimitedFileVisitor (PathWatcher watcher, Config base)
+        {
+            this.base = base;
+            this.watcher = watcher;
+        }
+
+        /*
+         * 2 situations:
+         * 
+         * 1. a subtree exists at the time a dir to watch is added (eg watching /tmp/xxx and it contains aaa/)
+         *  - will start with /tmp/xxx for which we want to register with the poller
+         *  - want to visit each child
+         *     - if child is file, gen add event
+         *     - if child is dir, gen add event but ONLY register it if inside depth limit and ONLY continue visit of child if inside depth limit
+         * 2. a subtree is added inside a watched dir (eg watching /tmp/xxx, add aaa/ to xxx/)
+         *  - will start with /tmp/xxx/aaa 
+         *    - gen add event but ONLY register it if inside depth limit and ONLY continue visit of children if inside depth limit
+         *    
+         */
+        @Override
+        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException
+        {
+            //In a directory:
+            // 1. the dir is the base directory
+            //   - register it with the poll mechanism
+            //   - generate pending add event (iff notifiable and matches patterns)
+            //   - continue the visit (sibling dirs, sibling files)
+            // 2. the dir is a subdir at some depth in the basedir's tree
+            //   - if the level of the subdir less or equal to base's limit
+            //     - register it wih the poll mechanism
+            //     - generate pending add event (iff notifiable and matches patterns)
+            //   - else stop visiting this dir
+
+            if (!base.isExcluded(dir))
+            {
+                if (base.isIncluded(dir))
+                {
+                    if (watcher.isNotifiable())
+                    {
+                        // Directory is specifically included in PathMatcher, then
+                        // it should be notified as such to interested listeners
+                        PathWatchEvent event = new PathWatchEvent(dir,PathWatchEventType.ADDED);
+                        if (LOG.isDebugEnabled())
+                        {
+                            LOG.debug("Pending {}",event);
+                        }
+                        watcher.addToPendingList(dir, event);
+                    }
+                }
+
+                //Register the dir with the watcher if it is:
+                // - the base dir and recursion is unlimited
+                // - the base dir and its depth is 0 (meaning we want to capture events from it, but not necessarily its children)
+                // - the base dir and we are recursing it and the depth is within the limit
+                // - a child dir and its depth is within the limits
+                if ((base.getPath().equals(dir) && (base.isRecurseDepthUnlimited() || base.getRecurseDepth() >= 0)) || base.shouldRecurseDirectory(dir))
+                    watcher.register(dir,base);
+            }
+
+            //Continue walking the tree of this dir if it is:
+            // - the base dir and recursion is unlimited
+            // - the base dir and we're not recursing in it
+            // - the base dir and we are recursing it and the depth is within the limit
+            // - a child dir and its depth is within the limits
+            if ((base.getPath().equals(dir)&& (base.isRecurseDepthUnlimited() || base.getRecurseDepth() >= 0)) || base.shouldRecurseDirectory(dir))
+                return FileVisitResult.CONTINUE;
+            else 
+                return FileVisitResult.SKIP_SUBTREE;   
+        }
+
+        @Override
+        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException
+        {
+            // In a file:
+            //    - register with poll mechanism
+            //    - generate pending add event (iff notifiable and matches patterns)
+            
+            if (base.matches(file) && watcher.isNotifiable())
+            {
+                PathWatchEvent event = new PathWatchEvent(file,PathWatchEventType.ADDED);
+                if (LOG.isDebugEnabled())
+                {
+                    LOG.debug("Pending {}",event);
+                }
+                watcher.addToPendingList(file, event);
+            }
+
+            return FileVisitResult.CONTINUE;
+        }
+        
+    }
+
+    /**
+     * Listener for path change events
+     */
+    public static interface Listener extends EventListener
+    {
+        void onPathWatchEvent(PathWatchEvent event);
+    }
+    
+    /**
+     * EventListListener
+     *
+     * Listener that reports accumulated events in one shot
+     */
+    public static interface EventListListener extends EventListener
+    {
+        void onPathWatchEvents(List<PathWatchEvent> events);
+    }
+
+    /**
+     * PathWatchEvent
+     *
+     * Represents a file event. Reported to registered listeners.
+     */
+    public static class PathWatchEvent
+    {
+        private final Path path;
+        private final PathWatchEventType type;
+        private int count = 0;
+     
+        public PathWatchEvent(Path path, PathWatchEventType type)
+        {
+            this.path = path;
+            this.count = 1;
+            this.type = type;
+
+        }
+
+        public PathWatchEvent(Path path, WatchEvent<Path> event)
+        {
+            this.path = path;
+            this.count = event.count();
+            if (event.kind() == ENTRY_CREATE)
+            {
+                this.type = PathWatchEventType.ADDED;
+            }
+            else if (event.kind() == ENTRY_DELETE)
+            {
+                this.type = PathWatchEventType.DELETED;
+            }
+            else if (event.kind() == ENTRY_MODIFY)
+            {
+                this.type = PathWatchEventType.MODIFIED;
+            }
+            else
+            {
+                this.type = PathWatchEventType.UNKNOWN;
+            }
+        }
+
+        /** 
+         * @see java.lang.Object#equals(java.lang.Object)
+         */
+        @Override
+        public boolean equals(Object obj)
+        {
+            if (this == obj)
+            {
+                return true;
+            }
+            if (obj == null)
+            {
+                return false;
+            }
+            if (getClass() != obj.getClass())
+            {
+                return false;
+            }
+            PathWatchEvent other = (PathWatchEvent)obj;
+            if (path == null)
+            {
+                if (other.path != null)
+                {
+                    return false;
+                }
+            }
+            else if (!path.equals(other.path))
+            {
+                return false;
+            }
+            if (type != other.type)
+            {
+                return false;
+            }
+            return true;
+        }
+
+        public Path getPath()
+        {
+            return path;
+        }
+
+        public PathWatchEventType getType()
+        {
+            return type;
+        }
+        
+        public void incrementCount(int num)
+        {
+            count += num;
+        }
+
+        public int getCount()
+        {
+            return count;
+        }
+        
+        /** 
+         * @see java.lang.Object#hashCode()
+         */
+        @Override
+        public int hashCode()
+        {
+            final int prime = 31;
+            int result = 1;
+            result = (prime * result) + ((path == null)?0:path.hashCode());
+            result = (prime * result) + ((type == null)?0:type.hashCode());
+            return result;
+        }
+
+        /** 
+         * @see java.lang.Object#toString()
+         */
+        @Override
+        public String toString()
+        {
+            return String.format("PathWatchEvent[%s|%s]",type,path);
+        }
+    }
+    
+    
+    
+    /**
+     * PathPendingEvents
+     *
+     * For a given path, a list of events that are awaiting the
+     * quiet time. The list is in the order that the event were
+     * received from the WatchService
+     */
+    public static class PathPendingEvents
+    {
+        private Path _path;
+        private List<PathWatchEvent> _events;
+        private long _timestamp;
+        private long _lastFileSize = -1;
+
+        public PathPendingEvents (Path path)
+        {
+            _path = path;
+        }
+        
+        public PathPendingEvents (Path path, PathWatchEvent event)
+        {
+            this (path);
+            addEvent(event);
+        }
+        
+        public void addEvent (PathWatchEvent event)
+        {
+            long now = System.currentTimeMillis();
+            _timestamp = now;
+
+            if (_events == null)
+            {
+                _events = new ArrayList<PathWatchEvent>();
+                _events.add(event);
+            }
+            else
+            {
+                //Check if the same type of event is already present, in which case we
+                //can increment its counter. Otherwise, add it
+                PathWatchEvent existingType = null;
+                for (PathWatchEvent e:_events)
+                {
+                    if (e.getType() == event.getType())
+                    {
+                        existingType = e;
+                        break;
+                    }
+                }
+
+                if (existingType == null)
+                {
+                    _events.add(event);
+                }
+                else
+                {
+                    existingType.incrementCount(event.getCount());
+                }
+            }
+
+        }
+        
+        public List<PathWatchEvent> getEvents()
+        {
+            return _events;
+        }
+
+        public long getTimestamp()
+        {
+            return _timestamp;
+        }
+   
+        
+        /**
+         * Check to see if the file referenced by this Event is quiet.
+         * <p>
+         * Will validate the timestamp to see if it is expired, as well as if the file size hasn't changed within the quiet period.
+         * <p>
+         * Always updates timestamp to 'now' on use of this method.
+         * 
+         * @param now the time now 
+         *
+         * @param expiredDuration
+         *            the expired duration past the timestamp to be considered expired
+         * @param expiredUnit
+         *            the unit of time for the expired check
+         * @return true if expired, false if not
+         */
+        public boolean isQuiet(long now, long expiredDuration, TimeUnit expiredUnit)
+        {
+
+            long pastdue = _timestamp + expiredUnit.toMillis(expiredDuration);
+            _timestamp = now;
+
+            long fileSize = _path.toFile().length(); // File.length() returns 0 for non existant files
+            boolean fileSizeChanged = (_lastFileSize != fileSize);
+            _lastFileSize = fileSize;
+
+            if ((now > pastdue) && (!fileSizeChanged /*|| fileSize == 0*/))
+            {
+                // Quiet period timestamp has expired, and file size hasn't changed, or the file
+                // has been deleted.
+                // Consider this a quiet event now.
+                return true;
+            }
+
+            return false;
+        }
+
+    }
+
+    /**
+     * PathWatchEventType
+     *
+     * Type of an event
+     */
+    public static enum PathWatchEventType
+    {
+        ADDED, DELETED, MODIFIED, UNKNOWN;
+    }
+
+    private static final boolean IS_WINDOWS;
+
+    static
+    {
+        String os = System.getProperty("os.name");
+        if (os == null)
+        {
+            IS_WINDOWS = false;
+        }
+        else
+        {
+            String osl = os.toLowerCase(Locale.ENGLISH);
+            IS_WINDOWS = osl.contains("windows");
+        }
+    }
+
+    private static final Logger LOG = Log.getLogger(PathWatcher.class);
+    /**
+     * super noisy debug logging
+     */
+    private static final Logger NOISY_LOG = Log.getLogger(PathWatcher.class.getName() + ".Noisy");
+
+    @SuppressWarnings("unchecked")
+    protected static <T> WatchEvent<T> cast(WatchEvent<?> event)
+    {
+        return (WatchEvent<T>)event;
+    }
+
+    private static final WatchEvent.Kind<?> WATCH_EVENT_KINDS[] = { ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY };
+    
+    private  WatchService watchService;
+    private  WatchEvent.Modifier watchModifiers[];
+    private  boolean nativeWatchService;
+    
+    private Map<WatchKey, Config> keys = new HashMap<>();
+    private List<EventListener> listeners = new CopyOnWriteArrayList<>(); //a listener may modify the listener list directly or by stopping the PathWatcher
+    private List<Config> configs = new ArrayList<>();
+
+    /**
+     * Update Quiet Time - set to 1000 ms as default (a lower value in Windows is not supported)
+     */
+    private long updateQuietTimeDuration = 1000;
+    private TimeUnit updateQuietTimeUnit = TimeUnit.MILLISECONDS;
+    private Thread thread;
+    private boolean _notifyExistingOnStart = true;
+    private Map<Path, PathPendingEvents> pendingEvents = new LinkedHashMap<>();
+    
+    
+    
+    /**
+     * Construct new PathWatcher
+     */
+    public PathWatcher()
+    {
+    }
+    
+    /**
+     * Request watch on a the given path (either file or dir)
+     * using all Config defaults. In the case of a dir,
+     * the default is not to recurse into subdirs for watching.
+     * 
+     * @param file the path to watch
+     */
+    public void watch (final Path file)
+    {
+        //Make a config for the dir above it and
+        //include a match only for the given path
+        //using all defaults for the configuration
+        Path abs = file;
+        if (!abs.isAbsolute())
+        {
+            abs = file.toAbsolutePath();
+        }
+        
+        //Check we don't already have a config for the parent directory. 
+        //If we do, add in this filename.
+        Config config = null;
+        Path parent = abs.getParent();
+        for (Config c:configs)
+        {
+            if (c.getPath().equals(parent))
+            {
+                config = c;
+                break;
+            }
+        }
+        
+        //Make a new config
+        if (config == null)
+        {
+            config = new Config(abs.getParent());
+            // the include for the directory itself
+            config.addIncludeGlobRelative("");
+            //add the include for the file
+            config.addIncludeGlobRelative(file.getFileName().toString());
+            watch(config);
+        }
+        else
+            //add the include for the file
+            config.addIncludeGlobRelative(file.getFileName().toString());
+    }
+    
+    /**
+     * Request watch on a path with custom Config 
+     * provided.
+     * 
+     * @param config the configuration to watch
+     */
+    public void watch (final Config config)
+    {
+        //Add a custom config
+        configs.add(config);
+    }
+    
+    /**
+     * Register path in the config with the file watch service,
+     * walking the tree if it happens to be a directory.
+     * 
+     * @param baseDir the base directory configuration to watch
+     * @throws IOException if unable to walk the filesystem tree
+     */
+    protected void prepareConfig (final Config baseDir) throws IOException
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("Watching directory {}",baseDir);
+        }
+        Files.walkFileTree(baseDir.getPath(), new DepthLimitedFileVisitor(this, baseDir));
+    }
+
+    
+    
+    /**
+     * Add a listener for changes the watcher notices.
+     * 
+     * @param listener change listener
+     */
+    public void addListener(EventListener listener)
+    {
+        listeners.add(listener);
+    }
+
+    /**
+     * Append some info on the paths that we are watching.
+     * 
+     * @param s
+     */
+    private void appendConfigId(StringBuilder s)
+    {
+        List<Path> dirs = new ArrayList<>();
+
+        for (Config config : keys.values())
+        {
+            dirs.add(config.dir);
+        }
+
+        Collections.sort(dirs);
+
+        s.append("[");
+        if (dirs.size() > 0)
+        {
+            s.append(dirs.get(0));
+            if (dirs.size() > 1)
+            {
+                s.append(" (+").append(dirs.size() - 1).append(")");
+            }
+        }
+        else
+        {
+            s.append("<null>");
+        }
+        s.append("]");
+    }
+
+    /** 
+     * @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStart()
+     */
+    @Override
+    protected void doStart() throws Exception
+    {
+        //create a new watchservice
+        createWatchService();
+        
+        //ensure setting of quiet time is appropriate now we have a watcher
+        setUpdateQuietTime(getUpdateQuietTimeMillis(), TimeUnit.MILLISECONDS);
+
+        // Register all watched paths, walking dir hierarchies as needed, possibly generating
+        // fake add events if notifyExistingOnStart is true
+        for (Config c:configs)
+            prepareConfig(c);
+        
+        // Start Thread for watcher take/pollKeys loop
+        StringBuilder threadId = new StringBuilder();
+        threadId.append("PathWatcher-Thread");
+        appendConfigId(threadId);
+
+        thread = new Thread(this,threadId.toString());
+        thread.setDaemon(true);
+        thread.start();
+        super.doStart();
+    }
+
+    /** 
+     * @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStop()
+     */
+    @Override
+    protected void doStop() throws Exception
+    {
+        if (watchService != null)
+            watchService.close(); //will invalidate registered watch keys, interrupt thread in take or poll
+        watchService = null;
+        thread = null;
+        keys.clear();
+        pendingEvents.clear();
+        super.doStop();
+    }
+    
+    
+    /**
+     * Remove all current configs and listeners.
+     */
+    public void reset ()
+    {
+        if (!isStopped())
+            throw new IllegalStateException("PathWatcher must be stopped before reset.");
+        
+        configs.clear();
+        listeners.clear();
+    }
+    
+    
+    /**
+     * Create a fresh WatchService and determine if it is a 
+     * native implementation or not.
+     * 
+     * @throws IOException
+     */
+    private void createWatchService () throws IOException
+    {
+        //create a watch service
+        this.watchService = FileSystems.getDefault().newWatchService();
+
+        WatchEvent.Modifier modifiers[] = null;
+        boolean nativeService = true;
+        // Try to determine native behavior
+        // See http://stackoverflow.com/questions/9588737/is-java-7-watchservice-slow-for-anyone-else
+        try
+        {
+            ClassLoader cl = Thread.currentThread().getContextClassLoader();
+            Class<?> pollingWatchServiceClass = Class.forName("sun.nio.fs.PollingWatchService",false,cl);
+            if (pollingWatchServiceClass.isAssignableFrom(this.watchService.getClass()))
+            {
+                nativeService = false;
+                LOG.info("Using Non-Native Java {}",pollingWatchServiceClass.getName());
+                Class<?> c = Class.forName("com.sun.nio.file.SensitivityWatchEventModifier");
+                Field f = c.getField("HIGH");
+                modifiers = new WatchEvent.Modifier[]
+                        {
+                         (WatchEvent.Modifier)f.get(c)
+                        };
+            }
+        }
+        catch (Throwable t)
+        {
+            // Unknown JVM environment, assuming native.
+            LOG.ignore(t);
+        }
+
+        this.watchModifiers = modifiers;
+        this.nativeWatchService = nativeService;
+    }
+    
+    /**
+     * Check to see if the watcher is in a state where it should generate
+     * watch events to the listeners. Used to determine if watcher should generate
+     * events for existing files and dirs on startup.
+     * 
+     * @return true if the watcher should generate events to the listeners.
+     */
+    protected boolean isNotifiable ()
+    {
+        return (isStarted() || (!isStarted() && isNotifyExistingOnStart()));
+    }
+
+    /**
+     * Get an iterator over the listeners.
+     * 
+     * @return iterator over the listeners.
+     */
+    public Iterator<EventListener> getListeners()
+    {
+        return listeners.iterator();
+    }
+
+    /**
+     * Change the quiet time.
+     * 
+     * @return the quiet time in millis
+     */
+    public long getUpdateQuietTimeMillis()
+    {
+        return TimeUnit.MILLISECONDS.convert(updateQuietTimeDuration,updateQuietTimeUnit);
+    }
+
+    /**
+     * Generate events to the listeners.
+     * 
+     * @param events the events captured
+     */
+    protected void notifyOnPathWatchEvents (List<PathWatchEvent> events)
+    {
+        if (events == null || events.isEmpty())
+            return;
+
+        for (EventListener listener : listeners)
+        {
+            if (listener instanceof EventListListener)
+            {
+                try
+                {
+                    ((EventListListener)listener).onPathWatchEvents(events);
+                }
+                catch (Throwable t)
+                {
+                    LOG.warn(t);
+                }
+            }
+            else
+            {
+                Listener l = (Listener)listener;
+                for (PathWatchEvent event:events)
+                {
+                    try
+                    {
+                        l.onPathWatchEvent(event);
+                    }
+                    catch (Throwable t)
+                    {
+                        LOG.warn(t);
+                    }
+                }
+            }
+        }
+
+    }
+
+    /**
+     * Register a path (directory) with the WatchService.
+     * 
+     * @param dir the directory to register
+     * @param root the configuration root
+     * @throws IOException if unable to register the path with the watch service.
+     */
+    protected void register(Path dir, Config root) throws IOException
+    {
+       
+        LOG.debug("Registering watch on {}",dir);
+        if(watchModifiers != null) 
+        {
+            // Java Watcher
+            WatchKey key = dir.register(watchService,WATCH_EVENT_KINDS,watchModifiers);
+            keys.put(key,root.asSubConfig(dir));
+        } else 
+        {
+            // Native Watcher
+            WatchKey key = dir.register(watchService,WATCH_EVENT_KINDS);
+            keys.put(key,root.asSubConfig(dir));
+        }
+    }
+
+    
+    /**
+     * Delete a listener
+     * @param listener the listener to remove
+     * @return true if the listener existed and was removed
+     */
+    public boolean removeListener(Listener listener)
+    {
+        return listeners.remove(listener);
+    }
+
+    
+    /** 
+     * Forever loop.
+     * 
+     * Wait for the WatchService to report some filesystem events for the
+     * watched paths.
+     * 
+     * When an event for a path first occurs, it is subjected to a quiet time.
+     * Subsequent events that arrive for the same path during this quiet time are
+     * accumulated and the timer reset. Only when the quiet time has expired are
+     * the accumulated events sent. MODIFY events are handled slightly differently -
+     * multiple MODIFY events arriving within a quiet time are coalesced into a
+     * single MODIFY event. Both the accumulation of events and coalescing of MODIFY
+     * events reduce the number and frequency of event reporting for "noisy" files (ie
+     * those that are undergoing rapid change).
+     * 
+     * @see java.lang.Runnable#run()
+     */
+    @Override
+    public void run()
+    {
+
+        List<PathWatchEvent> notifiableEvents = new ArrayList<PathWatchEvent>();
+        
+        // Start the java.nio watching
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("Starting java.nio file watching with {}",watchService);
+        }
+
+        while (watchService != null)
+        {
+            WatchKey key = null;
+
+            try
+            {     
+                //If no pending events, wait forever for new events
+                if (pendingEvents.isEmpty())
+                {
+                    if (NOISY_LOG.isDebugEnabled())
+                        NOISY_LOG.debug("Waiting for take()");
+                    key = watchService.take();
+                }
+                else
+                {
+                    //There are existing events that might be ready to go,
+                    //only wait as long as the quiet time for any new events
+                    if (NOISY_LOG.isDebugEnabled())
+                        NOISY_LOG.debug("Waiting for poll({}, {})",updateQuietTimeDuration,updateQuietTimeUnit);
+
+                    key = watchService.poll(updateQuietTimeDuration,updateQuietTimeUnit);
+                   
+                    //If no new events its safe to process the pendings
+                    if (key == null)
+                    {
+                        long now = System.currentTimeMillis();
+                        // no new event encountered.
+                        for (Path path : new HashSet<Path>(pendingEvents.keySet()))
+                        {
+                            PathPendingEvents pending = pendingEvents.get(path);
+                            if (pending.isQuiet(now, updateQuietTimeDuration,updateQuietTimeUnit))
+                            {
+                                //No fresh events received during quiet time for this path, 
+                                //so generate the events that were pent up
+                                for (PathWatchEvent p:pending.getEvents())
+                                {
+                                    notifiableEvents.add(p);
+                                }
+                                // remove from pending list
+                                pendingEvents.remove(path);
+                            }
+                        }
+                    }
+                }
+            }
+            catch (ClosedWatchServiceException e)
+            {
+                // Normal shutdown of watcher
+                return;
+            }
+            catch (InterruptedException e)
+            {
+                if (isRunning())
+                {
+                    LOG.warn(e);
+                }
+                else
+                {
+                    LOG.ignore(e);
+                }
+                return;
+            }
+
+            //If there was some new events to process
+            if (key != null)
+            {
+
+                Config config = keys.get(key);
+                if (config == null)
+                {
+                    if (LOG.isDebugEnabled())
+                    {
+                        LOG.debug("WatchKey not recognized: {}",key);
+                    }
+                    continue;
+                }
+
+                for (WatchEvent<?> event : key.pollEvents())
+                {
+                    @SuppressWarnings("unchecked")
+                    WatchEvent.Kind<Path> kind = (Kind<Path>)event.kind();
+                    WatchEvent<Path> ev = cast(event);
+                    Path name = ev.context();
+                    Path child = config.dir.resolve(name);
+
+                    if (kind == ENTRY_CREATE)
+                    {
+                        // handle special case for registering new directories
+                        // recursively
+                        if (Files.isDirectory(child,LinkOption.NOFOLLOW_LINKS))
+                        {
+                            try
+                            {
+                                prepareConfig(config.asSubConfig(child));
+                            }
+                            catch (IOException e)
+                            {
+                                LOG.warn(e);
+                            }
+                        }
+                        else if (config.matches(child))
+                        {
+                            addToPendingList(child, new PathWatchEvent(child,ev));
+                        }
+                    }
+                    else if (config.matches(child))
+                    {
+                        addToPendingList(child, new PathWatchEvent(child,ev));      
+                    }
+                }
+            }
+
+            //Send any notifications generated this pass
+            notifyOnPathWatchEvents(notifiableEvents);
+            notifiableEvents.clear();
+            
+            if (key != null && !key.reset())
+            {
+                keys.remove(key);
+                if (keys.isEmpty())
+                {
+                    return; // all done, no longer monitoring anything
+                }
+            }
+        }
+    }
+    
+    
+    /**
+     * Add an event reported by the WatchService to list of pending events
+     * that will be sent after their quiet time has expired.
+     * 
+     * @param path the path to add to the pending list
+     * @param event the pending event
+     */
+    public void addToPendingList (Path path, PathWatchEvent event)
+    {
+        PathPendingEvents pending = pendingEvents.get(path);
+        
+        //Are there already pending events for this path?
+        if (pending == null)
+        {
+            //No existing pending events, create pending list
+            pendingEvents.put(path,new PathPendingEvents(path, event));
+        }
+        else
+        {
+            //There are already some events pending for this path
+            pending.addEvent(event);
+        }
+    }
+    
+    
+    /**
+     * Whether or not to issue notifications for directories and files that
+     * already exist when the watcher starts.
+     * 
+     * @param notify true if existing paths should be notified or not
+     */
+    public void setNotifyExistingOnStart (boolean notify)
+    {
+        _notifyExistingOnStart = notify;
+    }
+    
+    public boolean isNotifyExistingOnStart ()
+    {
+        return _notifyExistingOnStart;
+    }
+
+    /**
+     * Set the quiet time.
+     * 
+     * @param duration the quiet time duration
+     * @param unit the quite time unit
+     */
+    public void setUpdateQuietTime(long duration, TimeUnit unit)
+    {
+        long desiredMillis = unit.toMillis(duration);
+        
+        if (watchService != null && !this.nativeWatchService && (desiredMillis < 5000))
+        {
+            LOG.warn("Quiet Time is too low for non-native WatchService [{}]: {} < 5000 ms (defaulting to 5000 ms)",watchService.getClass().getName(),desiredMillis);
+            this.updateQuietTimeDuration = 5000;
+            this.updateQuietTimeUnit = TimeUnit.MILLISECONDS;
+            return;
+        }
+
+        if (IS_WINDOWS && (desiredMillis < 1000))
+        {
+            LOG.warn("Quiet Time is too low for Microsoft Windows: {} < 1000 ms (defaulting to 1000 ms)",desiredMillis);
+            this.updateQuietTimeDuration = 1000;
+            this.updateQuietTimeUnit = TimeUnit.MILLISECONDS;
+            return;
+        }
+        
+        // All other OS and watch service combinations can use desired setting
+        this.updateQuietTimeDuration = duration;
+        this.updateQuietTimeUnit = unit;
+    }
+
+    @Override
+    public String toString()
+    {
+        StringBuilder s = new StringBuilder(this.getClass().getName());
+        appendConfigId(s);
+        return s.toString();
+    }
+}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/PatternMatcher.java b/jetty-util/src/main/java/org/eclipse/jetty/util/PatternMatcher.java
index 5030101..0d23f2f 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/PatternMatcher.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/PatternMatcher.java
@@ -53,7 +53,7 @@
      * @param pattern the pattern
      * @param uris the uris to test the pattern against
      * @param isNullInclusive if true, an empty pattern means all names match, if false, none match
-     * @throws Exception
+     * @throws Exception if fundamental error in pattern matching
      */
     public void match (Pattern pattern, URI[] uris, boolean isNullInclusive)
     throws Exception
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/QuotedStringTokenizer.java b/jetty-util/src/main/java/org/eclipse/jetty/util/QuotedStringTokenizer.java
index 7436c60..951a1b3 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/QuotedStringTokenizer.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/QuotedStringTokenizer.java
@@ -472,6 +472,7 @@
     /* ------------------------------------------------------------ */
     /** Unquote a string.
      * @param s The string to unquote.
+     * @param lenient true if unquoting should be lenient to escaped content, leaving some alone, false if string unescaping
      * @return quoted string
      */
     public static String unquote(String s, boolean lenient)
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/RegexSet.java b/jetty-util/src/main/java/org/eclipse/jetty/util/RegexSet.java
new file mode 100644
index 0000000..ff72b03
--- /dev/null
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/RegexSet.java
@@ -0,0 +1,106 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util;
+
+import java.util.AbstractSet;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.function.BiFunction;
+import java.util.regex.Pattern;
+
+
+/**
+ * A Set of Regular expressions strings.
+ * <p>
+ * Provides the efficient {@link #matches(String)} method to check for a match against all the combined Regex's
+ */
+public class RegexSet extends AbstractSet<String>
+{
+    public static final BiFunction<RegexSet,String,Boolean> MATCHER=(rs,p)->{return rs.matches(p);};
+    private final Set<String> _patterns=new HashSet<String>();
+    private final Set<String> _unmodifiable=Collections.unmodifiableSet(_patterns);
+    private Pattern _pattern;
+    
+    @Override
+    public Iterator<String> iterator()
+    {
+        return _unmodifiable.iterator();
+    }
+
+    @Override
+    public int size()
+    {
+        return _patterns.size();
+    }
+    
+    @Override
+    public boolean add(String pattern)
+    {
+        boolean added = _patterns.add(pattern);
+        if (added)
+            updatePattern();
+        return added;
+    }
+    
+    @Override
+    public boolean remove(Object pattern)
+    {
+        boolean removed = _patterns.remove(pattern);
+
+        if (removed)
+            updatePattern();
+        return removed;
+    }
+
+    @Override
+    public boolean isEmpty()
+    {
+        return _patterns.isEmpty();
+    }
+
+    @Override
+    public void clear()
+    {
+        _patterns.clear();
+        _pattern=null;
+    }
+
+    private void updatePattern()
+    {
+        StringBuilder builder = new StringBuilder();
+        builder.append("^(");
+        for (String pattern: _patterns)
+        {
+            if (builder.length()>2)
+                builder.append('|');
+            builder.append('(');
+            builder.append(pattern);
+            builder.append(')');
+        }
+        builder.append(")$");
+        _pattern = Pattern.compile(builder.toString());   
+    }
+
+    public boolean matches(String s)
+    {
+        return _pattern!=null && _pattern.matcher(s).matches();
+    }
+}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/RolloverFileOutputStream.java b/jetty-util/src/main/java/org/eclipse/jetty/util/RolloverFileOutputStream.java
index 8085f1e..1ff0b76 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/RolloverFileOutputStream.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/RolloverFileOutputStream.java
@@ -40,8 +40,6 @@
  * actual date when creating and rolling over the file.
  * 
  * Old files are retained for a number of days before being deleted.
- * 
- * 
  */
 public class RolloverFileOutputStream extends FilterOutputStream
 {
@@ -65,7 +63,7 @@
     /**
      * @param filename The filename must include the string "yyyy_mm_dd", 
      * which is replaced with the actual date when creating and rolling over the file.
-     * @throws IOException
+     * @throws IOException if unable to create output
      */
     public RolloverFileOutputStream(String filename)
         throws IOException
@@ -78,7 +76,7 @@
      * @param filename The filename must include the string "yyyy_mm_dd", 
      * which is replaced with the actual date when creating and rolling over the file.
      * @param append If true, existing files will be appended to.
-     * @throws IOException
+     * @throws IOException if unable to create output
      */
     public RolloverFileOutputStream(String filename, boolean append)
         throws IOException
@@ -92,7 +90,7 @@
      * which is replaced with the actual date when creating and rolling over the file.
      * @param append If true, existing files will be appended to.
      * @param retainDays The number of days to retain files before deleting them.  0 to retain forever.
-     * @throws IOException
+     * @throws IOException if unable to create output
      */
     public RolloverFileOutputStream(String filename,
                                     boolean append,
@@ -108,7 +106,8 @@
      * which is replaced with the actual date when creating and rolling over the file.
      * @param append If true, existing files will be appended to.
      * @param retainDays The number of days to retain files before deleting them. 0 to retain forever.
-     * @throws IOException
+     * @param zone the timezone for the output
+     * @throws IOException if unable to create output
      */
     public RolloverFileOutputStream(String filename,
                                     boolean append,
@@ -126,9 +125,10 @@
      * which is replaced with the actual date when creating and rolling over the file.
      * @param append If true, existing files will be appended to.
      * @param retainDays The number of days to retain files before deleting them. 0 to retain forever.
+     * @param zone the timezone for the output
      * @param dateFormat The format for the date file substitution. The default is "yyyy_MM_dd". 
      * @param backupFormat The format for the file extension of backup files. The default is "HHmmssSSS". 
-     * @throws IOException
+     * @throws IOException if unable to create output
      */
     public RolloverFileOutputStream(String filename,
                                     boolean append,
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/Scanner.java b/jetty-util/src/main/java/org/eclipse/jetty/util/Scanner.java
index fe974ea..24ae652 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/Scanner.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/Scanner.java
@@ -221,7 +221,7 @@
     /**
      * Apply a filter to files found in the scan directory.
      * Only files matching the filter will be reported as added/changed/removed.
-     * @param filter
+     * @param filter the filename filter to use
      */
     public void setFilenameFilter (FilenameFilter filter)
     {
@@ -257,7 +257,7 @@
     
     /* ------------------------------------------------------------ */
     /** Set if found directories should be reported.
-     * @param dirs
+     * @param dirs true to report directory changes as well
      */
     public void setReportDirs(boolean dirs)
     {
@@ -273,7 +273,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Add an added/removed/changed listener
-     * @param listener
+     * @param listener the listener to add
      */
     public synchronized void addListener (Listener listener)
     {
@@ -370,6 +370,7 @@
     }
 
     /**
+     * @param path tests if the path exists
      * @return true if the path exists in one of the scandirs
      */
     public boolean exists(String path)
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/SharedBlockingCallback.java b/jetty-util/src/main/java/org/eclipse/jetty/util/SharedBlockingCallback.java
index 01525b7..785d4ef 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/SharedBlockingCallback.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/SharedBlockingCallback.java
@@ -29,32 +29,26 @@
 
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.util.thread.NonBlockingThread;
 
-
-/* ------------------------------------------------------------ */
-/** Provides a reusable BlockingCallback.
+/**
+ * Provides a reusable {@link Callback} that can block the thread
+ * while waiting to be completed.
+ * <p>
  * A typical usage pattern is:
  * <pre>
  * void someBlockingCall(Object... args) throws IOException
  * {
- *   try(Blocker blocker=sharedBlockingCallback.acquire())
- *   {
- *     someAsyncCall(args,blocker);
- *     blocker.block();
- *   }
+ *     try(Blocker blocker = sharedBlockingCallback.acquire())
+ *     {
+ *         someAsyncCall(args, blocker);
+ *         blocker.block();
+ *     }
  * }
  * </pre>
  */
 public class SharedBlockingCallback
 {
     static final Logger LOG = Log.getLogger(SharedBlockingCallback.class);
-
-    final ReentrantLock _lock = new ReentrantLock();
-    final Condition _idle = _lock.newCondition();
-    final Condition _complete = _lock.newCondition();
-
-    
     private static Throwable IDLE = new Throwable()
     {
         @Override
@@ -63,7 +57,6 @@
             return "IDLE";
         }
     };
-
     private static Throwable SUCCEEDED = new Throwable()
     {
         @Override
@@ -72,7 +65,6 @@
             return "SUCCEEDED";
         }
     };
-    
     private static Throwable FAILED = new Throwable()
     {
         @Override
@@ -82,12 +74,10 @@
         }
     };
 
-    Blocker _blocker;
-    
-    public SharedBlockingCallback()
-    {
-        _blocker=new Blocker();
-    }
+    private final ReentrantLock _lock = new ReentrantLock();
+    private final Condition _idle = _lock.newCondition();
+    private final Condition _complete = _lock.newCondition();
+    private Blocker _blocker = new Blocker();
     
     protected long getIdleTimeout()
     {
@@ -131,18 +121,21 @@
             LOG.debug(new Throwable());
     }
     
-    /* ------------------------------------------------------------ */
-    /** A Closeable Callback.
+    /**
+     * A Closeable Callback.
      * Uses the auto close mechanism to check block has been called OK.
+     * <p>Implements {@link Callback.NonBlocking} because calls to this
+     * callback do not blocak, rather they wakeup the thread that is blocked
+     * in {@link #block()}
      */
-    public class Blocker implements Callback, Closeable
+    public class Blocker implements Callback.NonBlocking, Closeable
     {
-        Throwable _state = IDLE;
+        private Throwable _state = IDLE;
         
         protected Blocker()
         {
         }
-
+        
         @Override
         public void succeeded()
         {
@@ -198,9 +191,6 @@
          */
         public void block() throws IOException
         {
-            if (NonBlockingThread.isNonBlockingThread())
-                LOG.warn("Blocking a NonBlockingThread: ",new Throwable());
-            
             _lock.lock();
             long idle = getIdleTimeout();
             try
@@ -216,7 +206,9 @@
                             _state=new BlockerTimeoutException();
                     }
                     else
+                    {
                         _complete.await();
+                    }
                 }
 
                 if (_state == SUCCEEDED)
@@ -245,12 +237,9 @@
         
         /**
          * Check the Callback has succeeded or failed and after the return leave in the state to allow reuse.
-         * 
-         * @throws IOException
-         *             if exception was caught during blocking, or callback was cancelled
          */
         @Override
-        public void close() throws IOException
+        public void close()
         {
             _lock.lock();
             try
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/SocketAddressResolver.java b/jetty-util/src/main/java/org/eclipse/jetty/util/SocketAddressResolver.java
index 8a48716..a25c3d2 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/SocketAddressResolver.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/SocketAddressResolver.java
@@ -18,14 +18,19 @@
 
 package org.eclipse.jetty.util;
 
+import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
-import java.nio.channels.UnresolvedAddressException;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import org.eclipse.jetty.util.annotation.ManagedAttribute;
+import org.eclipse.jetty.util.annotation.ManagedObject;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.thread.Scheduler;
@@ -38,26 +43,31 @@
     /**
      * Resolves the given host and port, returning a {@link SocketAddress} through the given {@link Promise}
      * with the default timeout.
-     *
-     * @param host the host to resolve
+     *  @param host the host to resolve
      * @param port the port of the resulting socket address
      * @param promise the callback invoked when the resolution succeeds or fails
      */
-    public void resolve(String host, int port, Promise<SocketAddress> promise);
+    public void resolve(String host, int port, Promise<List<InetSocketAddress>> promise);
 
     /**
      * <p>Creates {@link SocketAddress} instances synchronously in the caller thread.</p>
      */
+    @ManagedObject("The synchronous address resolver")
     public static class Sync implements SocketAddressResolver
     {
         @Override
-        public void resolve(String host, int port, Promise<SocketAddress> promise)
+        public void resolve(String host, int port, Promise<List<InetSocketAddress>> promise)
         {
             try
             {
-                InetSocketAddress result = new InetSocketAddress(host, port);
-                if (result.isUnresolved())
-                    promise.failed(new UnresolvedAddressException());
+                InetAddress[] addresses = InetAddress.getAllByName(host);
+
+                List<InetSocketAddress> result = new ArrayList<>(addresses.length);
+                for (InetAddress address : addresses)
+                    result.add(new InetSocketAddress(address, port));
+
+                if (result.isEmpty())
+                    promise.failed(new UnknownHostException());
                 else
                     promise.succeeded(result);
             }
@@ -91,6 +101,7 @@
      * });
      * </pre>
      */
+    @ManagedObject("The asynchronous address resolver")
     public static class Async implements SocketAddressResolver
     {
         private static final Logger LOG = Log.getLogger(SocketAddressResolver.class);
@@ -124,65 +135,61 @@
             return scheduler;
         }
 
+        @ManagedAttribute(value = "The timeout, in milliseconds, to resolve an address", readonly = true)
         public long getTimeout()
         {
             return timeout;
         }
 
         @Override
-        public void resolve(final String host, final int port, final Promise<SocketAddress> promise)
+        public void resolve(final String host, final int port, final Promise<List<InetSocketAddress>> promise)
         {
-            executor.execute(new Runnable()
+            executor.execute(() ->
             {
-                @Override
-                public void run()
+                Scheduler.Task task = null;
+                final AtomicBoolean complete = new AtomicBoolean();
+                if (timeout > 0)
                 {
-                    Scheduler.Task task = null;
-                    final AtomicBoolean complete = new AtomicBoolean();
-                    if (timeout > 0)
+                    final Thread thread = Thread.currentThread();
+                    task = scheduler.schedule(() ->
                     {
-                        final Thread thread = Thread.currentThread();
-                        task = scheduler.schedule(new Runnable()
-                        {
-                            @Override
-                            public void run()
-                            {
-                                if (complete.compareAndSet(false, true))
-                                {
-                                    promise.failed(new TimeoutException());
-                                    thread.interrupt();
-                                }
-                            }
-                        }, timeout, TimeUnit.MILLISECONDS);
-                    }
-
-                    try
-                    {
-                        long start = System.nanoTime();
-                        InetSocketAddress result = new InetSocketAddress(host, port);
-                        long elapsed = System.nanoTime() - start;
-                        if (LOG.isDebugEnabled())
-                            LOG.debug("Resolved {} in {} ms", host, TimeUnit.NANOSECONDS.toMillis(elapsed));
                         if (complete.compareAndSet(false, true))
                         {
-                            if (result.isUnresolved())
-                                promise.failed(new UnresolvedAddressException());
-                            else
-                                promise.succeeded(result);
+                            promise.failed(new TimeoutException());
+                            thread.interrupt();
                         }
-                    }
-                    catch (Throwable x)
+                    }, timeout, TimeUnit.MILLISECONDS);
+                }
+
+                try
+                {
+                    long start = System.nanoTime();
+                    InetAddress[] addresses = InetAddress.getAllByName(host);
+                    long elapsed = System.nanoTime() - start;
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Resolved {} in {} ms", host, TimeUnit.NANOSECONDS.toMillis(elapsed));
+
+                    List<InetSocketAddress> result = new ArrayList<>(addresses.length);
+                    for (InetAddress address : addresses)
+                        result.add(new InetSocketAddress(address, port));
+
+                    if (complete.compareAndSet(false, true))
                     {
-                        if (complete.compareAndSet(false, true))
-                            promise.failed(x);
+                        if (result.isEmpty())
+                            promise.failed(new UnknownHostException());
+                        else
+                            promise.succeeded(result);
                     }
-                    finally
-                    {
-                        if (task != null)
-                            task.cancel();
-                        // Reset the interrupted status before releasing the thread to the pool
-                        Thread.interrupted();
-                    }
+                }
+                catch (Throwable x)
+                {
+                    if (complete.compareAndSet(false, true))
+                        promise.failed(x);
+                }
+                finally
+                {
+                    if (task != null)
+                        task.cancel();
                 }
             });
         }
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/StringUtil.java b/jetty-util/src/main/java/org/eclipse/jetty/util/StringUtil.java
index e82b8c9..4b28abe 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/StringUtil.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/StringUtil.java
@@ -19,8 +19,9 @@
 package org.eclipse.jetty.util;
 
 import java.io.UnsupportedEncodingException;
-import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
@@ -48,44 +49,25 @@
     @Deprecated
     public static final String __LINE_SEPARATOR = System.lineSeparator();
        
-    public static final String __ISO_8859_1="ISO-8859-1";
-    public final static String __UTF8="UTF-8";
-    public final static String __UTF16="UTF-16";
-
-    /**
-     * @deprecated Use {@link StandardCharsets#UTF_8}
-     */
-    @Deprecated
-    public final static Charset __UTF8_CHARSET=StandardCharsets.UTF_8;
-    /**
-     * @deprecated Use {@link StandardCharsets#ISO_8859_1}
-     */
-    @Deprecated
-    public final static Charset __ISO_8859_1_CHARSET=StandardCharsets.ISO_8859_1;
-    /**
-     * @deprecated Use {@link StandardCharsets#UTF_16}
-     */
-    @Deprecated
-    public final static Charset __UTF16_CHARSET=StandardCharsets.UTF_16;
-    /**
-     * @deprecated Use {@link StandardCharsets#US_ASCII}
-     */
-    @Deprecated
-    public final static Charset __US_ASCII_CHARSET=StandardCharsets.US_ASCII;
+    public static final String __ISO_8859_1="iso-8859-1";
+    public final static String __UTF8="utf-8";
+    public final static String __UTF16="utf-16";
     
     static
     {
-        CHARSETS.put("UTF-8",__UTF8);
-        CHARSETS.put("UTF8",__UTF8);
-        CHARSETS.put("UTF-16",__UTF16);
-        CHARSETS.put("UTF16",__UTF16);
-        CHARSETS.put("ISO-8859-1",__ISO_8859_1);
-        CHARSETS.put("ISO_8859_1",__ISO_8859_1);
+        CHARSETS.put("utf-8",__UTF8);
+        CHARSETS.put("utf8",__UTF8);
+        CHARSETS.put("utf-16",__UTF16);
+        CHARSETS.put("utf16",__UTF16);
+        CHARSETS.put("iso-8859-1",__ISO_8859_1);
+        CHARSETS.put("iso_8859_1",__ISO_8859_1);
     }
     
     /* ------------------------------------------------------------ */
     /** Convert alternate charset names (eg utf8) to normalized
      * name (eg UTF-8).
+     * @param s the charset to normalize
+     * @return the normalized charset (or null if normalized version not found)
      */
     public static String normalizeCharset(String s)
     {
@@ -96,6 +78,10 @@
     /* ------------------------------------------------------------ */
     /** Convert alternate charset names (eg utf8) to normalized
      * name (eg UTF-8).
+     * @param s the charset to normalize
+     * @param offset the offset in the charset
+     * @param length the length of the charset in the input param
+     * @return the normalized charset (or null if not found)
      */
     public static String normalizeCharset(String s,int offset,int length)
     {
@@ -221,6 +207,9 @@
     /* ------------------------------------------------------------ */
     /**
      * returns the next index of a character from the chars string
+     * @param s the input string to search
+     * @param chars the chars to look for
+     * @return the index of the character in the input stream found.
      */
     public static int indexFrom(String s,String chars)
     {
@@ -233,6 +222,10 @@
     /* ------------------------------------------------------------ */
     /**
      * replace substrings within string.
+     * @param s the input string
+     * @param sub the string to look for
+     * @param with the string to replace with
+     * @return the now replaced string
      */
     public static String replace(String s, String sub, String with)
     {
@@ -260,6 +253,8 @@
 
     /* ------------------------------------------------------------ */
     /** Remove single or double quotes.
+     * @param s the input string
+     * @return the string with quotes removed
      */
     public static String unquote(String s)
     {
@@ -295,6 +290,9 @@
     /* ------------------------------------------------------------ */
     /**
      * append hex digit
+     * @param buf the buffer to append to
+     * @param b the byte to append
+     * @param base the base of the hex output (almost always 16).
      * 
      */
     public static void append(StringBuilder buf,byte b,int base)
@@ -311,6 +309,12 @@
     }
 
     /* ------------------------------------------------------------ */
+    /**
+     * Append 2 digits (zero padded) to the StringBuffer
+     * 
+     * @param buf the buffer to append to
+     * @param i the value to append
+     */
     public static void append2digits(StringBuffer buf,int i)
     {
         if (i<100)
@@ -321,6 +325,12 @@
     }
     
     /* ------------------------------------------------------------ */
+    /**
+     * Append 2 digits (zero padded) to the StringBuilder
+     * 
+     * @param buf the buffer to append to
+     * @param i the value to append
+     */
     public static void append2digits(StringBuilder buf,int i)
     {
         if (i<100)
@@ -523,6 +533,8 @@
      * http://en.wikipedia.org/wiki/Security_Identifier
      * 
      * S-1-IdentifierAuthority-SubAuthority1-SubAuthority2-...-SubAuthorityn
+     * @param sidBytes the SID bytes to build from
+     * @return the string SID
      */
     public static String sidBytesToString(byte[] sidBytes)
     {
@@ -570,6 +582,8 @@
      * http://en.wikipedia.org/wiki/Security_Identifier
      * 
      * S-1-IdentifierAuthority-SubAuthority1-SubAuthority2-...-SubAuthorityn
+     * @param sidString the string SID
+     * @return the binary SID
      */
     public static byte[] sidStringToBytes( String sidString )
     {
@@ -624,17 +638,17 @@
     /**
      * Convert String to an integer. Parses up to the first non-numeric character. If no number is found an IllegalArgumentException is thrown
      * 
-     * @param string
-     *            A String containing an integer.
+     * @param string A String containing an integer.
+     * @param from The index to start parsing from
      * @return an int
      */
-    public static int toInt(String string)
+    public static int toInt(String string,int from)
     {
         int val = 0;
         boolean started = false;
         boolean minus = false;
 
-        for (int i = 0; i < string.length(); i++)
+        for (int i = from; i < string.length(); i++)
         {
             char b = string.charAt(i);
             if (b <= ' ')
@@ -659,7 +673,7 @@
             return minus?(-val):val;
         throw new NumberFormatException(string);
     }
-
+    
     /**
      * Convert String to an long. Parses up to the first non-numeric character. If no number is found an IllegalArgumentException is thrown
      * 
@@ -721,6 +735,11 @@
         return str.substring(0,maxSize);
     }
 
+    /**
+    * Parse the string representation of a list using {@link #csvSplit(List,String,int,int)}
+    * @param s The string to parse, expected to be enclosed as '[...]'
+    * @return An array of parsed values.
+    */
     public static String[] arrayFromString(String s) 
     {
         if (s==null)
@@ -731,9 +750,183 @@
         if (s.length()==2)
             return new String[]{};
 
-        return s.substring(1,s.length()-1).split(" *, *");
+        return csvSplit(s,1,s.length()-2);
     }
     
+    /**
+    * Parse a CSV string using {@link #csvSplit(List,String, int, int)}
+    * @param s The string to parse
+    * @return An array of parsed values.
+    */
+    public static String[] csvSplit(String s)
+    {
+        if (s==null)
+            return null;
+        return csvSplit(s,0,s.length());
+    }
+    
+    /**
+     * Parse a CSV string using {@link #csvSplit(List,String, int, int)}
+     * @param s The string to parse
+     * @param off The offset into the string to start parsing
+     * @param len The len in characters to parse
+     * @return An array of parsed values.
+     */
+    public static String[] csvSplit(String s, int off,int len)
+    {
+        if (s==null)
+            return null;
+        if (off<0 || len<0 || off>s.length())
+            throw new IllegalArgumentException();
+
+        List<String> list = new ArrayList<>();
+        csvSplit(list,s,off,len);
+        return list.toArray(new String[list.size()]);
+    }
+
+    enum CsvSplitState { PRE_DATA, QUOTE, SLOSH, DATA, WHITE, POST_DATA };
+
+    /** Split a quoted comma separated string to a list
+     * <p>Handle <a href="https://www.ietf.org/rfc/rfc4180.txt">rfc4180</a>-like 
+     * CSV strings, with the exceptions:<ul>
+     * <li>quoted values may contain double quotes escaped with back-slash
+     * <li>Non-quoted values are trimmed of leading trailing white space
+     * <li>trailing commas are ignored
+     * <li>double commas result in a empty string value
+     * </ul>  
+     * @param list The Collection to split to (or null to get a new list)
+     * @param s The string to parse
+     * @param off The offset into the string to start parsing
+     * @param len The len in characters to parse
+     * @return list containing the parsed list values
+     */
+    public static List<String> csvSplit(List<String> list,String s, int off,int len)
+    {
+        if (list==null)
+            list=new ArrayList<>();
+        CsvSplitState state = CsvSplitState.PRE_DATA;
+        StringBuilder out = new StringBuilder();
+        int last=-1;
+        while (len>0)
+        {
+            char ch = s.charAt(off++);
+            len--;
+            
+            switch(state)
+            {
+                case PRE_DATA:
+                    if (Character.isWhitespace(ch))
+                        continue;
+
+                    if ('"'==ch)
+                    {
+                        state=CsvSplitState.QUOTE;
+                        continue;
+                    }
+                    
+                    if (','==ch)
+                    {
+                        list.add("");
+                        continue;
+                    }
+
+                    state=CsvSplitState.DATA;
+                    out.append(ch);
+                    continue;
+
+                case DATA:
+                    if (Character.isWhitespace(ch))
+                    {
+                        last=out.length();
+                        out.append(ch);
+                        state=CsvSplitState.WHITE;
+                        continue;
+                    }
+                    
+                    if (','==ch)
+                    {
+                        list.add(out.toString());
+                        out.setLength(0);
+                        state=CsvSplitState.PRE_DATA;
+                        continue;
+                    }
+
+                    out.append(ch);
+                    continue;
+                    
+                case WHITE:
+                    if (Character.isWhitespace(ch))
+                    {
+                        out.append(ch);
+                        continue;
+                    }
+                    
+                    if (','==ch)
+                    {
+                        out.setLength(last);
+                        list.add(out.toString());
+                        out.setLength(0);
+                        state=CsvSplitState.PRE_DATA;
+                        continue;
+                    }
+                    
+                    state=CsvSplitState.DATA;
+                    out.append(ch);
+                    last=-1;
+                    continue;
+
+                case QUOTE:
+                    if ('\\'==ch)
+                    {
+                        state=CsvSplitState.SLOSH;
+                        continue;
+                    }
+                    if ('"'==ch)
+                    {
+                        list.add(out.toString());
+                        out.setLength(0);
+                        state=CsvSplitState.POST_DATA;
+                        continue;
+                    }
+                    out.append(ch);
+                    continue;
+                    
+                case SLOSH:
+                    out.append(ch);
+                    state=CsvSplitState.QUOTE;
+                    continue;
+                    
+                case POST_DATA:
+                    if (','==ch)
+                    {
+                        state=CsvSplitState.PRE_DATA;
+                        continue;
+                    }
+                    continue;
+            }
+        }
+
+        switch(state)
+        {
+            case PRE_DATA:
+            case POST_DATA:
+                break;
+
+            case DATA:
+            case QUOTE:
+            case SLOSH:
+                list.add(out.toString());
+                break;
+                
+            case WHITE:
+                out.setLength(last);
+                list.add(out.toString());
+                break;
+        }
+        
+        return list;
+    }
+
     public static String sanitizeXmlString(String html)
     {
         if (html==null)
@@ -801,5 +994,17 @@
         }
         return out.toString();
     }
+    
+    /* ------------------------------------------------------------ */
+    /** The String value of an Object
+     * <p>This method calls {@link String#valueOf(Object)} unless the object is null,
+     * in which case null is returned</p>
+     * @param object The object
+     * @return String value or null
+     */
+    public static String valueOf(Object object)
+    {
+        return object==null?null:String.valueOf(object);
+    }
 
 }
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/TreeTrie.java b/jetty-util/src/main/java/org/eclipse/jetty/util/TreeTrie.java
index 9114f33..cf86ffe 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/TreeTrie.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/TreeTrie.java
@@ -20,8 +20,8 @@
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -34,13 +34,13 @@
  * <p>This Trie is stored in a Tree and is unlimited in capacity</p>
  * 
  * <p>This Trie is not Threadsafe and contains no mutual exclusion 
- * or deliberate memory barriers.  It is intended for an ArrayTrie to be
+ * or deliberate memory barriers.  It is intended for an TreeTrie to be
  * built by a single thread and then used concurrently by multiple threads
  * and not mutated during that access.  If concurrent mutations of the
  * Trie is required external locks need to be applied.
  * </p>
  * 
- * @param <V>
+ * @param <V> the entry type
  */
 public class TreeTrie<V> extends AbstractTrie<V>
 {
@@ -75,6 +75,15 @@
         _nextIndex = new TreeTrie[INDEX];
         this._c=c;
     }
+    
+    @Override
+    public void clear()
+    {
+        Arrays.fill(_nextIndex,null);
+        _nextOther.clear();
+        _key=null;
+        _value=null;
+    }
 
     @Override
     public boolean put(String s, V v)
@@ -224,9 +233,43 @@
     @Override
     public V getBest(String s, int offset, int len)
     {
-        // TODO inefficient
-        byte[] b=s.substring(offset,offset+len).getBytes(StandardCharsets.ISO_8859_1);
-        return getBest(b,0,b.length);
+        TreeTrie<V> t = this;
+        for(int i=0; i < len; i++)
+        {
+            byte c=(byte)(0xff&s.charAt(offset+i));
+            int index=c>=0&&c<0x7f?__lookup[c]:-1;
+            if (index>=0)
+            {
+                if (t._nextIndex[index] == null) 
+                    break;
+                t = t._nextIndex[index];
+            }
+            else
+            {
+                TreeTrie<V> n=null;
+                for (int j=t._nextOther.size();j-->0;)
+                {
+                    n=t._nextOther.get(j);
+                    if (n._c==c)
+                        break;
+                    n=null;
+                }
+                if (n==null)
+                    break;
+                t=n;
+            }
+            
+            // Is the next Trie is a match
+            if (t._key!=null)
+            {
+                // Recurse so we can remember this possibility
+                V best=t.getBest(s,offset+i+1,len-i-1);
+                if (best!=null)
+                    return best;
+                break;
+            }
+        }
+        return t._value;
     }
     
     @Override
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/Trie.java b/jetty-util/src/main/java/org/eclipse/jetty/util/Trie.java
index 131e610..603f786 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/Trie.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/Trie.java
@@ -24,7 +24,7 @@
 
 /* ------------------------------------------------------------ */
 /** A Trie String lookup data structure.
- * @param <V>
+ * @param <V> the Trie entry type
  */
 public interface Trie<V>
 {
@@ -49,6 +49,7 @@
     /* ------------------------------------------------------------ */
     /** Get and exact match from a String key
      * @param s The key
+     * @return the value for the string key
      */
     public V get(String s);
 
@@ -57,6 +58,7 @@
      * @param s The key
      * @param offset The offset within the string of the key
      * @param len the length of the key
+     * @return the value for the string / offset / length
      */
     public V get(String s,int offset,int len);
 
@@ -121,4 +123,7 @@
     /* ------------------------------------------------------------ */
     public boolean isCaseInsensitive();
 
+    /* ------------------------------------------------------------ */
+    public void clear();
+
 }
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/TypeUtil.java b/jetty-util/src/main/java/org/eclipse/jetty/util/TypeUtil.java
index fc7a1a3..7e703c0 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/TypeUtil.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/TypeUtil.java
@@ -29,6 +29,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 import org.eclipse.jetty.util.annotation.Name;
 import org.eclipse.jetty.util.log.Log;
@@ -173,7 +174,9 @@
     /** Array to List.
      * <p>
      * Works like {@link Arrays#asList(Object...)}, but handles null arrays.
+     * @param a the array to convert to a list
      * @return a list backed by the array.
+     * @param <T> the array and list entry type
      */
     public static <T> List<T> asList(T[] a)
     {
@@ -362,6 +365,19 @@
      * @param c An ASCII encoded character 0-9 a-f A-F
      * @return The byte value of the character 0-16.
      */
+    public static int convertHexDigit( char c )
+    {
+        int d= ((c & 0x1f) + ((c >> 6) * 0x19) - 0x10);
+        if (d<0 || d>15)
+            throw new NumberFormatException("!hex "+c);
+        return d;
+    }
+    
+    /* ------------------------------------------------------------ */
+    /**
+     * @param c An ASCII encoded character 0-9 a-f A-F
+     * @return The byte value of the character 0-16.
+     */
     public static int convertHexDigit( int c )
     {
         int d= ((c & 0x1f) + ((c >> 6) * 0x19) - 0x10);
@@ -483,6 +499,13 @@
     public static Object call(Class<?> oClass, String methodName, Object obj, Object[] arg)
        throws InvocationTargetException, NoSuchMethodException
     {
+        Objects.requireNonNull(oClass,"Class cannot be null");
+        Objects.requireNonNull(methodName,"Method name cannot be null");
+        if (StringUtil.isBlank(methodName))
+        {
+            throw new IllegalArgumentException("Method name cannot be blank");
+        }
+        
         // Lets just try all methods for now
         for (Method method : oClass.getMethods())
         {
@@ -539,9 +562,17 @@
 
     public static Object construct(Class<?> klass, Object[] arguments) throws InvocationTargetException, NoSuchMethodException
     {
+        Objects.requireNonNull(klass,"Class cannot be null");
+        
         for (Constructor<?> constructor : klass.getConstructors())
         {
-            if (constructor.getParameterTypes().length != arguments.length)
+            if (arguments == null)
+            {
+                // null arguments in .newInstance() is allowed
+                if (constructor.getParameterTypes().length != 0)
+                    continue;
+            }
+            else if (constructor.getParameterTypes().length != arguments.length)
                 continue;
 
             try
@@ -558,20 +589,34 @@
     
     public static Object construct(Class<?> klass, Object[] arguments, Map<String, Object> namedArgMap) throws InvocationTargetException, NoSuchMethodException
     {
+        Objects.requireNonNull(klass,"Class cannot be null");
+        Objects.requireNonNull(namedArgMap,"Named Argument Map cannot be null");
+        
         for (Constructor<?> constructor : klass.getConstructors())
         {
-            if (constructor.getParameterTypes().length != arguments.length)
+            if (arguments == null)
+            {
+                // null arguments in .newInstance() is allowed
+                if (constructor.getParameterTypes().length != 0)
+                    continue;
+            }
+            else if (constructor.getParameterTypes().length != arguments.length)
                 continue;
 
             try
             {
                 Annotation[][] parameterAnnotations = constructor.getParameterAnnotations();
                 
-                // target has no annotations
-                if ( parameterAnnotations == null || parameterAnnotations.length == 0 )
+                if (arguments == null || arguments.length == 0)
                 {
                     if (LOG.isDebugEnabled())
-                        LOG.debug("Target has no parameter annotations");
+                        LOG.debug("Constructor has no arguments");
+                    return constructor.newInstance(arguments);
+                }
+                else if (parameterAnnotations == null || parameterAnnotations.length == 0)
+                {
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Constructor has no parameter annotations");
                     return constructor.newInstance(arguments);
                 }
                 else
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/URIUtil.java b/jetty-util/src/main/java/org/eclipse/jetty/util/URIUtil.java
index ca5260f..cf0f985 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/URIUtil.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/URIUtil.java
@@ -21,22 +21,29 @@
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 
+import org.eclipse.jetty.util.Utf8Appendable.NotUtf8Exception;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
 
-
-/* ------------------------------------------------------------ */
-/** URI Holder.
+/** 
+ * URI Utility methods.
+ * <p>
  * This class assists with the decoding and encoding or HTTP URI's.
  * It differs from the java.net.URL class as it does not provide
  * communications ability, but it does assist with query string
  * formatting.
- * <P>UTF-8 encoding is used by default for % encoded characters. This
+ * </p>
+ * <p>
+ * UTF-8 encoding is used by default for % encoded characters. This
  * may be overridden with the org.eclipse.jetty.util.URI.charset system property.
- * @see UrlEncoded
+ * </p>
  * 
+ * @see UrlEncoded
  */
 public class URIUtil
     implements Cloneable
 {
+    private static final Logger LOG = Log.getLogger(URIUtil.class);
     public static final String SLASH="/";
     public static final String HTTP="http";
     public static final String HTTP_COLON="http:";
@@ -44,13 +51,7 @@
     public static final String HTTPS_COLON="https:";
 
     // Use UTF-8 as per http://www.w3.org/TR/html40/appendix/notes.html#non-ascii-chars
-    public static final Charset __CHARSET;
-
-    static
-    {
-        String charset = System.getProperty("org.eclipse.jetty.util.URI.charset");
-        __CHARSET = charset == null ? StandardCharsets.UTF_8 : Charset.forName(charset);
-    }
+    public static final Charset __CHARSET=StandardCharsets.UTF_8 ;
 
     private URIUtil()
     {}
@@ -82,8 +83,7 @@
         byte[] bytes=null;
         if (buf==null)
         {
-        loop:
-            for (int i=0;i<path.length();i++)
+            loop: for (int i=0;i<path.length();i++)
             {
                 char c=path.charAt(i);
                 switch(c)
@@ -97,6 +97,8 @@
                     case '<':
                     case '>':
                     case ' ':
+                    case '[':
+                    case ']':
                         buf=new StringBuilder(path.length()*2);
                         break loop;
                     default:
@@ -106,103 +108,111 @@
                             buf=new StringBuilder(path.length()*2);
                             break loop;
                         }
-                       
                 }
             }
             if (buf==null)
                 return null;
         }
-        
-        synchronized(buf)
+
+        if (bytes!=null)
         {
-            if (bytes!=null)
+            for (int i=0;i<bytes.length;i++)
             {
-                for (int i=0;i<bytes.length;i++)
+                byte c=bytes[i];       
+                switch(c)
                 {
-                    byte c=bytes[i];       
-                    switch(c)
-                    {
-                      case '%':
-                          buf.append("%25");
-                          continue;
-                      case '?':
-                          buf.append("%3F");
-                          continue;
-                      case ';':
-                          buf.append("%3B");
-                          continue;
-                      case '#':
-                          buf.append("%23");
-                          continue;
-                      case '"':
-                          buf.append("%22");
-                          continue;
-                      case '\'':
-                          buf.append("%27");
-                          continue;
-                      case '<':
-                          buf.append("%3C");
-                          continue;
-                      case '>':
-                          buf.append("%3E");
-                          continue;
-                      case ' ':
-                          buf.append("%20");
-                          continue;
-                      default:
-                          if (c<0)
-                          {
-                              buf.append('%');
-                              TypeUtil.toHex(c,buf);
-                          }
-                          else
-                              buf.append((char)c);
-                          continue;
-                    }
-                }
-                
-            }
-            else
-            {
-                for (int i=0;i<path.length();i++)
-                {
-                    char c=path.charAt(i);       
-                    switch(c)
-                    {
-                        case '%':
-                            buf.append("%25");
-                            continue;
-                        case '?':
-                            buf.append("%3F");
-                            continue;
-                        case ';':
-                            buf.append("%3B");
-                            continue;
-                        case '#':
-                            buf.append("%23");
-                            continue;
-                        case '"':
-                            buf.append("%22");
-                            continue;
-                        case '\'':
-                            buf.append("%27");
-                            continue;
-                        case '<':
-                            buf.append("%3C");
-                            continue;
-                        case '>':
-                            buf.append("%3E");
-                            continue;
-                        case ' ':
-                            buf.append("%20");
-                            continue;
-                        default:
-                            buf.append(c);
-                            continue;
-                    }
+                    case '%':
+                        buf.append("%25");
+                        continue;
+                    case '?':
+                        buf.append("%3F");
+                        continue;
+                    case ';':
+                        buf.append("%3B");
+                        continue;
+                    case '#':
+                        buf.append("%23");
+                        continue;
+                    case '"':
+                        buf.append("%22");
+                        continue;
+                    case '\'':
+                        buf.append("%27");
+                        continue;
+                    case '<':
+                        buf.append("%3C");
+                        continue;
+                    case '>':
+                        buf.append("%3E");
+                        continue;
+                    case ' ':
+                        buf.append("%20");
+                        continue;
+                    case '[':
+                        buf.append("%5B");
+                        continue;
+                    case ']':
+                        buf.append("%5D");
+                        continue;
+                    default:
+                        if (c<0)
+                        {
+                            buf.append('%');
+                            TypeUtil.toHex(c,buf);
+                        }
+                        else
+                            buf.append((char)c);
+                        continue;
                 }
             }
         }
+        else
+        {
+            for (int i=0;i<path.length();i++)
+            {
+                char c=path.charAt(i);       
+                switch(c)
+                {
+                    case '%':
+                        buf.append("%25");
+                        continue;
+                    case '?':
+                        buf.append("%3F");
+                        continue;
+                    case ';':
+                        buf.append("%3B");
+                        continue;
+                    case '#':
+                        buf.append("%23");
+                        continue;
+                    case '"':
+                        buf.append("%22");
+                        continue;
+                    case '\'':
+                        buf.append("%27");
+                        continue;
+                    case '<':
+                        buf.append("%3C");
+                        continue;
+                    case '>':
+                        buf.append("%3E");
+                        continue;
+                    case ' ':
+                        buf.append("%20");
+                        continue;
+                    case '[':
+                        buf.append("%5B");
+                        continue;
+                    case ']':
+                        buf.append("%5D");
+                        continue;
+                    default:
+                        buf.append(c);
+                        continue;
+                }
+            }
+        }
+
 
         return buf;
     }
@@ -254,123 +264,163 @@
     
     /* ------------------------------------------------------------ */
     /* Decode a URI path and strip parameters
-     * @param path The path the encode
-     * @param buf StringBuilder to encode path into
      */
     public static String decodePath(String path)
     {
-        if (path==null)
-            return null;
-        // Array to hold all converted characters
-        char[] chars=null;
-        int n=0;
-        // Array to hold a sequence of %encodings
-        byte[] bytes=null;
-        int b=0;
-        
-        int len=path.length();
-        
-        for (int i=0;i<len;i++)
-        {
-            char c = path.charAt(i);
-
-            if (c=='%' && (i+2)<len)
-            {
-                if (chars==null)
-                {
-                    chars=new char[len];
-                    bytes=new byte[len];
-                    path.getChars(0,i,chars,0);
-                }
-                bytes[b++]=(byte)(0xff&TypeUtil.parseInt(path,i+1,2,16));
-                i+=2;
-                continue;
-            }
-            else if (c==';')
-            {
-                if (chars==null)
-                {
-                    chars=new char[len];
-                    path.getChars(0,i,chars,0);
-                    n=i;
-                }
-                break;
-            }
-            else if (bytes==null)
-            {
-                n++;
-                continue;
-            }
-            
-            // Do we have some bytes to convert?
-            if (b>0)
-            {
-                String s=new String(bytes,0,b,__CHARSET);
-                s.getChars(0,s.length(),chars,n);
-                n+=s.length();
-                b=0;
-            }
-            
-            chars[n++]=c;
-        }
-
-        if (chars==null)
-            return path;
-
-        // if we have a remaining sequence of bytes
-        if (b>0)
-        {
-            String s=new String(bytes,0,b,__CHARSET);
-            s.getChars(0,s.length(),chars,n);
-            n+=s.length();
-        }
-        
-        return new String(chars,0,n);
+        return decodePath(path,0,path.length());
     }
+
+    /* ------------------------------------------------------------ */
+    /* Decode a URI path and strip parameters of UTF-8 path
+     */
+    public static String decodePath(String path, int offset, int length)
+    {
+        try
+        {
+            Utf8StringBuilder builder=null;
+            int end=offset+length;
+            for (int i=offset;i<end;i++)
+            {
+                char c = path.charAt(i);
+                switch(c)
+                {
+                    case '%':
+                        if (builder==null)
+                        {
+                            builder=new Utf8StringBuilder(path.length());
+                            builder.append(path,offset,i-offset);
+                        }
+                        if ((i+2)<end)
+                        {
+                            char u=path.charAt(i+1);
+                            if (u=='u')
+                            {
+                                // TODO this is wrong. This is a codepoint not a char
+                                builder.append((char)(0xffff&TypeUtil.parseInt(path,i+2,4,16)));
+                                i+=5;
+                            }
+                            else
+                            {
+                                builder.append((byte)(0xff&(TypeUtil.convertHexDigit(u)*16+TypeUtil.convertHexDigit(path.charAt(i+2)))));
+                                i+=2;
+                            }
+                        }
+                        else
+                        {
+                            throw new IllegalArgumentException("Bad URI % encoding");
+                        }
+
+                        break;
+
+                    case ';':
+                        if (builder==null)
+                        {
+                            builder=new Utf8StringBuilder(path.length());
+                            builder.append(path,offset,i-offset);
+                        }
+                        
+                        while(++i<end)
+                        {
+                            if (path.charAt(i)=='/')
+                            {
+                                builder.append('/');
+                                break;
+                            }
+                        }
+                        
+                        break;
+
+                    default:
+                        if (builder!=null)
+                            builder.append(c);
+                        break;
+                }
+            }
+
+            if (builder!=null)
+                return builder.toString();
+            if (offset==0 && length==path.length())
+                return path;
+            return path.substring(offset,end);   
+        }
+        catch(NotUtf8Exception e)
+        {
+            LOG.warn(path.substring(offset,offset+length)+" "+e);
+            LOG.debug(e);
+            return decodeISO88591Path(path,offset,length);
+        }
+    }
+
     
     /* ------------------------------------------------------------ */
-    /* Decode a URI path and strip parameters.
-     * @param path The path the encode
-     * @param buf StringBuilder to encode path into
+    /* Decode a URI path and strip parameters of ISO-8859-1 path
      */
-    public static String decodePath(byte[] buf, int offset, int length)
+    private static String decodeISO88591Path(String path, int offset, int length)
     {
-        byte[] bytes=null;
-        int n=0;
-        
-        for (int i=0;i<length;i++)
+        StringBuilder builder=null;
+        int end=offset+length;
+        for (int i=offset;i<end;i++)
         {
-            byte b = buf[i + offset];
-            
-            if (b=='%' && (i+2)<length)
+            char c = path.charAt(i);
+            switch(c)
             {
-                b=(byte)(0xff&TypeUtil.parseInt(buf,i+offset+1,2,16));
-                i+=2;
+                case '%':
+                    if (builder==null)
+                    {
+                        builder=new StringBuilder(path.length());
+                        builder.append(path,offset,i-offset);
+                    }
+                    if ((i+2)<end)
+                    {
+                        char u=path.charAt(i+1);
+                        if (u=='u')
+                        {
+                            // TODO this is wrong. This is a codepoint not a char
+                            builder.append((char)(0xffff&TypeUtil.parseInt(path,i+2,4,16)));
+                            i+=5;
+                        }
+                        else
+                        {
+                            builder.append((byte)(0xff&(TypeUtil.convertHexDigit(u)*16+TypeUtil.convertHexDigit(path.charAt(i+2)))));
+                            i+=2;
+                        }
+                    }
+                    else
+                    {
+                        throw new IllegalArgumentException();
+                    }
+                    
+                    break;
+                    
+                case ';':
+                    if (builder==null)
+                    {
+                        builder=new StringBuilder(path.length());
+                        builder.append(path,offset,i-offset);
+                    }
+                    while(++i<end)
+                    {
+                        if (path.charAt(i)=='/')
+                        {
+                            builder.append('/');
+                            break;
+                        }
+                    }
+                    break;
+                    
+                    
+                default:
+                    if (builder!=null)
+                        builder.append(c);
+                    break;
             }
-            else if (b==';')
-            {
-                length=i;
-                break;
-            }
-            else if (bytes==null)
-            {
-                n++;
-                continue;
-            }
-            
-            if (bytes==null)
-            {
-                bytes=new byte[length];
-                for (int j=0;j<n;j++)
-                    bytes[j]=buf[j + offset];
-            }
-            
-            bytes[n++]=b;
         }
 
-        if (bytes==null)
-            return new String(buf,offset,length,__CHARSET);
-        return new String(bytes,0,n,__CHARSET);
+        if (builder!=null)
+            return builder.toString();
+        if (offset==0 && length==path.length())
+            return path;
+        return path.substring(offset,end);        
     }
 
     
@@ -431,6 +481,8 @@
     /* ------------------------------------------------------------ */
     /** Return the parent Path.
      * Treat a URI like a directory path and return the parent directory.
+     * @param p the path to return a parent reference to
+     * @return the parent path of the URI
      */
     public static String parentPath(String p)
     {
@@ -446,7 +498,7 @@
     /** Convert a path to a cananonical form.
      * All instances of "." and ".." are factored out.  Null is returned
      * if the path tries to .. above its root.
-     * @param path 
+     * @param path the path to convert
      * @return path or null.
      */
     public static String canonicalPath(String path)
@@ -580,8 +632,8 @@
     /* ------------------------------------------------------------ */
     /** Convert a path to a compact form.
      * All instances of "//" and "///" etc. are factored out to single "/" 
-     * @param path 
-     * @return path
+     * @param path the path to compact 
+     * @return the compacted path 
      */
     public static String compactPath(String path)
     {
@@ -667,11 +719,11 @@
     /* ------------------------------------------------------------ */
     /**
      * Create a new URI from the arguments, handling IPv6 host encoding and default ports
-     * @param scheme
-     * @param server
-     * @param port
-     * @param path
-     * @param query
+     * @param scheme the URI scheme
+     * @param server the URI server
+     * @param port the URI port
+     * @param path the URI path
+     * @param query the URI query
      * @return A String URI
      */
     public static String newURI(String scheme,String server, int port,String path,String query)
@@ -686,9 +738,9 @@
     /* ------------------------------------------------------------ */
     /**
      * Create a new URI StringBuilder from the arguments, handling IPv6 host encoding and default ports
-     * @param scheme
-     * @param server
-     * @param port
+     * @param scheme the URI scheme
+     * @param server the URI server
+     * @param port the URI port
      * @return a StringBuilder containing URI prefix
      */
     public static StringBuilder newURIBuilder(String scheme,String server, int port)
@@ -700,11 +752,11 @@
 
     /* ------------------------------------------------------------ */
     /** 
-     * Append scheme, host and port URI prefix, handling IPv6 address encoding and default ports</p>
+     * Append scheme, host and port URI prefix, handling IPv6 address encoding and default ports
      * @param url StringBuilder to append to
-     * @param scheme
-     * @param server
-     * @param port
+     * @param scheme the URI scheme
+     * @param server the URI server
+     * @param port the URI port
      */
     public static void appendSchemeHostPort(StringBuilder url,String scheme,String server, int port)
     {
@@ -735,11 +787,11 @@
     
     /* ------------------------------------------------------------ */
     /** 
-     * Append scheme, host and port URI prefix, handling IPv6 address encoding and default ports</p>
+     * Append scheme, host and port URI prefix, handling IPv6 address encoding and default ports
      * @param url StringBuffer to append to
-     * @param scheme
-     * @param server
-     * @param port
+     * @param scheme the URI scheme
+     * @param server the URI server
+     * @param port the URI port
      */
     public static void appendSchemeHostPort(StringBuffer url,String scheme,String server, int port)
     {
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/UrlEncoded.java b/jetty-util/src/main/java/org/eclipse/jetty/util/UrlEncoded.java
index bad3775..e776c9a 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/UrlEncoded.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/UrlEncoded.java
@@ -33,22 +33,26 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
-/* ------------------------------------------------------------ */
-/** Handles coding of MIME  "x-www-form-urlencoded".
+/** 
+ * Handles coding of MIME  "x-www-form-urlencoded".
  * <p>
  * This class handles the encoding and decoding for either
  * the query string of a URL or the _content of a POST HTTP request.
- *
- * <h4>Notes</h4>
+ * </p>
+ * <b>Notes</b>
+ * <p>
  * The UTF-8 charset is assumed, unless otherwise defined by either
  * passing a parameter or setting the "org.eclipse.jetty.util.UrlEncoding.charset"
  * System property.
+ * </p>
  * <p>
  * The hashtable either contains String single values, vectors
  * of String or arrays of Strings.
+ * </p>
  * <p>
  * This class is only partially synchronised.  In particular, simple
  * get operations are not protected from concurrent updates.
+ * </p>
  *
  * @see java.net.URLEncoder
  */
@@ -87,23 +91,24 @@
     
     public UrlEncoded(String query)
     {
-        decodeTo(query,this,ENCODING,-1);
+        decodeTo(query,this,ENCODING);
     }
 
     /* ----------------------------------------------------------------- */
     public void decode(String query)
     {
-        decodeTo(query,this,ENCODING,-1);
+        decodeTo(query,this,ENCODING);
     }
     
     /* ----------------------------------------------------------------- */
     public void decode(String query,Charset charset)
     {
-        decodeTo(query,this,charset,-1);
+        decodeTo(query,this,charset);
     }
     
     /* -------------------------------------------------------------- */
-    /** Encode Hashtable with % encoding.
+    /** Encode MultiMap with % encoding for UTF8 sequences.
+     * @return the MultiMap as a string with % encoding
      */
     public String encode()
     {
@@ -111,7 +116,9 @@
     }
     
     /* -------------------------------------------------------------- */
-    /** Encode Hashtable with % encoding.
+    /** Encode MultiMap with % encoding for arbitrary Charset sequences.
+     * @param charset the charset to use for encoding
+     * @return the MultiMap as a string encoded with % encodings
      */
     public String encode(Charset charset)
     {
@@ -119,9 +126,12 @@
     }
     
     /* -------------------------------------------------------------- */
-    /** Encode Hashtable with % encoding.
+    /** 
+     * Encode MultiMap with % encoding.
+     * @param charset the charset to encode with
      * @param equalsForNullValue if True, then an '=' is always used, even
-     * for parameters without a value. e.g. "blah?a=&b=&c=".
+     * for parameters without a value. e.g. <code>"blah?a=&amp;b=&amp;c="</code>.
+     * @return the MultiMap as a string encoded with % encodings
      */
     public synchronized String encode(Charset charset, boolean equalsForNullValue)
     {
@@ -129,9 +139,12 @@
     }
     
     /* -------------------------------------------------------------- */
-    /** Encode Hashtable with % encoding.
+    /** Encode MultiMap with % encoding.
+     * @param map the map to encode
+     * @param charset the charset to use for encoding (uses default encoding if null)
      * @param equalsForNullValue if True, then an '=' is always used, even
-     * for parameters without a value. e.g. "blah?a=&b=&c=".
+     * for parameters without a value. e.g. <code>"blah?a=&amp;b=&amp;c="</code>.
+     * @return the MultiMap as a string encoded with % encodings. 
      */
     public static String encode(MultiMap<String> map, Charset charset, boolean equalsForNullValue)
     {
@@ -190,21 +203,31 @@
     /* -------------------------------------------------------------- */
     /** Decoded parameters to Map.
      * @param content the string containing the encoded parameters
+     * @param map the MultiMap to put parsed query parameters into
+     * @param charset the charset to use for decoding
      */
-    public static void decodeTo(String content, MultiMap<String> map, String charset, int maxKeys)
+    public static void decodeTo(String content, MultiMap<String> map, String charset)
     {
-        decodeTo(content,map,charset==null?null:Charset.forName(charset),maxKeys);
+        decodeTo(content,map,charset==null?null:Charset.forName(charset));
     }
     
     /* -------------------------------------------------------------- */
     /** Decoded parameters to Map.
      * @param content the string containing the encoded parameters
+     * @param map the MultiMap to put parsed query parameters into
+     * @param charset the charset to use for decoding
      */
-    public static void decodeTo(String content, MultiMap<String> map, Charset charset, int maxKeys)
+    public static void decodeTo(String content, MultiMap<String> map, Charset charset)
     {
         if (charset==null)
             charset=ENCODING;
 
+        if (charset==StandardCharsets.UTF_8)
+        {
+            decodeUtf8To(content,0,content.length(),map);
+            return;
+        }
+        
         synchronized(map)
         {
             String key = null;
@@ -232,8 +255,6 @@
                       }
                       key = null;
                       value=null;
-                      if (maxKeys>0 && map.size()>maxKeys)
-                          throw new IllegalStateException("Form too many keys");
                       break;
                   case '=':
                       if (key!=null)
@@ -271,13 +292,19 @@
     }
 
     /* -------------------------------------------------------------- */
+    public static void decodeUtf8To(String query, MultiMap<String> map)
+    {
+        decodeUtf8To(query,0,query.length(),map);
+    }
+    
+    /* -------------------------------------------------------------- */
     /** Decoded parameters to Map.
-     * @param raw the byte[] containing the encoded parameters
+     * @param query the string containing the encoded parameters
      * @param offset the offset within raw to decode from
      * @param length the length of the section to decode
      * @param map the {@link MultiMap} to populate
      */
-    public static void decodeUtf8To(byte[] raw,int offset, int length, MultiMap<String> map)
+    public static void decodeUtf8To(String query,int offset, int length, MultiMap<String> map)
     {
         Utf8StringBuilder buffer = new Utf8StringBuilder();
         synchronized(map)
@@ -288,10 +315,10 @@
             int end=offset+length;
             for (int i=offset;i<end;i++)
             {
-                byte b=raw[i];
+                char c=query.charAt(i);
                 try
                 {
-                    switch ((char)(0xff&b))
+                    switch (c)
                     {
                         case '&':
                             value = buffer.toReplacedString();
@@ -311,7 +338,7 @@
                         case '=':
                             if (key!=null)
                             {
-                                buffer.append(b);
+                                buffer.append(c);
                                 break;
                             }
                             key = buffer.toReplacedString();
@@ -325,15 +352,15 @@
                         case '%':
                             if (i+2<end)
                             {
-                                if ('u'==raw[i+1])
+                                if ('u'==query.charAt(i+1))
                                 {
                                     i++;
                                     if (i+4<end)
                                     {
-                                        byte top=raw[++i];
-                                        byte hi=raw[++i];
-                                        byte lo=raw[++i];
-                                        byte bot=raw[++i];
+                                        char top=query.charAt(++i);
+                                        char hi=query.charAt(++i);
+                                        char lo=query.charAt(++i);
+                                        char bot=query.charAt(++i);
                                         buffer.getStringBuilder().append(Character.toChars((convertHexDigit(top)<<12) +(convertHexDigit(hi)<<8) + (convertHexDigit(lo)<<4) +convertHexDigit(bot)));
                                     }
                                     else
@@ -344,8 +371,8 @@
                                 }
                                 else
                                 {
-                                    byte hi=raw[++i];
-                                    byte lo=raw[++i];
+                                    char hi=query.charAt(++i);
+                                    char lo=query.charAt(++i);
                                     buffer.append((byte)((convertHexDigit(hi)<<4) + convertHexDigit(lo)));
                                 }
                             }
@@ -357,7 +384,7 @@
                             break;
                             
                         default:
-                            buffer.append(b);
+                            buffer.append(c);
                             break;
                     }
                 }
@@ -388,10 +415,13 @@
     }
 
     /* -------------------------------------------------------------- */
-    /** Decoded parameters to Map.
+    /** Decoded parameters to MultiMap, using ISO8859-1 encodings.
+     * 
      * @param in InputSteam to read
      * @param map MultiMap to add parameters to
-     * @param maxLength maximum number of keys to read or -1 for no limit
+     * @param maxLength maximum length of form to read
+     * @param maxKeys maximum number of keys to read or -1 for no limit
+     * @throws IOException if unable to decode inputstream as ISO8859-1
      */
     public static void decode88591To(InputStream in, MultiMap<String> map, int maxLength, int maxKeys)
     throws IOException
@@ -489,7 +519,9 @@
     /** Decoded parameters to Map.
      * @param in InputSteam to read
      * @param map MultiMap to add parameters to
-     * @param maxLength maximum number of keys to read or -1 for no limit
+     * @param maxLength maximum form length to decode
+     * @param maxKeys the maximum number of keys to read or -1 for no limit 
+     * @throws IOException if unable to decode input stream
      */
     public static void decodeUtf8To(InputStream in, MultiMap<String> map, int maxLength, int maxKeys)
     throws IOException
@@ -620,12 +652,18 @@
         StringWriter buf = new StringWriter(8192);
         IO.copy(input,buf,maxLength);
         
-        decodeTo(buf.getBuffer().toString(),map,StandardCharsets.UTF_16,maxKeys);
+        // TODO implement maxKeys
+        decodeTo(buf.getBuffer().toString(),map,StandardCharsets.UTF_16);
     }
 
     /* -------------------------------------------------------------- */
     /** Decoded parameters to Map.
      * @param in the stream containing the encoded parameters
+     * @param map the MultiMap to decode into
+     * @param charset the charset to use for decoding
+     * @param maxLength the maximum length of the form to decode
+     * @param maxKeys the maximum number of keys to decode
+     * @throws IOException if unable to decode input stream
      */
     public static void decodeTo(InputStream in, MultiMap<String> map, String charset, int maxLength, int maxKeys)
     throws IOException
@@ -650,6 +688,11 @@
     /* -------------------------------------------------------------- */
     /** Decoded parameters to Map.
      * @param in the stream containing the encoded parameters
+     * @param map the MultiMap to decode into
+     * @param charset the charset to use for decoding
+     * @param maxLength the maximum length of the form to decode
+     * @param maxKeys the maximum number of keys to decode
+     * @throws IOException if unable to decode input stream
      */
     public static void decodeTo(InputStream in, MultiMap<String> map, Charset charset, int maxLength, int maxKeys)
     throws IOException
@@ -769,11 +812,28 @@
             }
         }
     }
+
+    /* -------------------------------------------------------------- */
+    /** Decode String with % encoding.
+     * This method makes the assumption that the majority of calls
+     * will need no decoding.
+     * @param encoded the encoded string to decode
+     * @return the decoded string
+     */
+    public static String decodeString(String encoded)
+    {
+        return decodeString(encoded,0,encoded.length(),ENCODING);
+    }
     
     /* -------------------------------------------------------------- */
     /** Decode String with % encoding.
      * This method makes the assumption that the majority of calls
      * will need no decoding.
+     * @param encoded the encoded string to decode
+     * @param offset the offset in the encoded string to decode from
+     * @param length the length of characters in the encoded string to decode
+     * @param charset the charset to use for decoding
+     * @return the decoded string
      */
     public static String decodeString(String encoded,int offset,int length,Charset charset)
     {
@@ -991,7 +1051,7 @@
     
     /* ------------------------------------------------------------ */
     /** Perform URL encoding.
-     * @param string 
+     * @param string the string to encode
      * @return encoded string.
      */
     public static String encodeString(String string)
@@ -1001,7 +1061,8 @@
     
     /* ------------------------------------------------------------ */
     /** Perform URL encoding.
-     * @param string 
+     * @param string the string to encode
+     * @param charset the charset to use for encoding
      * @return encoded string.
      */
     public static String encodeString(String string,Charset charset)
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8Appendable.java b/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8Appendable.java
index 7a321ec..c0912e6 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8Appendable.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8Appendable.java
@@ -37,7 +37,7 @@
  *
  * License information for Bjoern Hoehrmann's code:
  *
- * Copyright (c) 2008-2009 Bjoern Hoehrmann <bjoern@hoehrmann.de>
+ * Copyright (c) 2008-2009 Bjoern Hoehrmann &lt;bjoern@hoehrmann.de&gt;
  * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal
  * in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
@@ -98,6 +98,58 @@
         _state = UTF8_ACCEPT;
     }
 
+    
+    private void checkCharAppend() throws IOException
+    {
+        if (_state != UTF8_ACCEPT)
+        {
+            _appendable.append(REPLACEMENT);
+            int state=_state;
+            _state=UTF8_ACCEPT;
+            throw new NotUtf8Exception("char appended in state "+state);
+        }
+    }
+    
+    public void append(char c)
+    {
+        try
+        {
+            checkCharAppend();
+            _appendable.append(c); 
+        }
+        catch (IOException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void append(String s)
+    {
+        try
+        {
+            checkCharAppend();
+            _appendable.append(s); 
+        }
+        catch (IOException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    public void append(String s,int offset,int length)
+    {
+        try
+        {
+            checkCharAppend();
+            _appendable.append(s,offset,offset+length); 
+        }
+        catch (IOException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+    
+    
     public void append(byte b)
     {
         try
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8LineParser.java b/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8LineParser.java
index a3da9f5..f4af14b 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8LineParser.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/Utf8LineParser.java
@@ -20,6 +20,8 @@
 
 import java.nio.ByteBuffer;
 
+import org.eclipse.jetty.util.Utf8Appendable.NotUtf8Exception;
+
 /**
  * Stateful parser for lines of UTF8 formatted text, looking for <code>"\n"</code> as a line termination character.
  * <p>
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/annotation/ManagedAttribute.java b/jetty-util/src/main/java/org/eclipse/jetty/util/annotation/ManagedAttribute.java
index 1422d7b..99e7454 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/annotation/ManagedAttribute.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/annotation/ManagedAttribute.java
@@ -25,14 +25,13 @@
 import java.lang.annotation.Target;
 
 /**
- * The @ManagedAttribute annotation is used to indicate that a given method 
+ * The <code>&#064;ManagedAttribute</code> annotation is used to indicate that a given method 
  * exposes a JMX attribute. This annotation is placed always on the reader 
  * method of a given attribute. Unless it is marked as read-only in the 
  * configuration of the annotation a corresponding setter is looked for 
  * following normal naming conventions. For example if this annotation is 
  * on a method called getFoo() then a method called setFoo() would be looked 
  * for and if found wired automatically into the jmx attribute.
- *
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
@@ -42,7 +41,7 @@
     /**
      * Description of the Managed Attribute
      * 
-     * @returngit checkout
+     * @return value
      */
     String value() default "Not Specified";
     
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/annotation/ManagedObject.java b/jetty-util/src/main/java/org/eclipse/jetty/util/annotation/ManagedObject.java
index 07d9688..c29b138 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/annotation/ManagedObject.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/annotation/ManagedObject.java
@@ -25,12 +25,11 @@
 import java.lang.annotation.Target;
 
 /**
- * The @ManagedObject annotation is used on a class at the top level to 
+ * The <code>&#064;ManagedObject</code> annotation is used on a class at the top level to 
  * indicate that it should be exposed as an mbean. It has only one attribute 
  * to it which is used as the description of the MBean. Should multiple 
- * @ManagedObject annotations be found in the chain of influence then the 
+ * <code>&#064;ManagedObject</code> annotations be found in the chain of influence then the 
  * first description is used.
- *
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
@@ -39,6 +38,7 @@
 {
     /**
      * Description of the Managed Object
+     * @return value
      */
     String value() default "Not Specified";
   
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/annotation/ManagedOperation.java b/jetty-util/src/main/java/org/eclipse/jetty/util/annotation/ManagedOperation.java
index ae3eb40..bdc789f 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/annotation/ManagedOperation.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/annotation/ManagedOperation.java
@@ -25,9 +25,8 @@
 import java.lang.annotation.Target;
 
 /**
- * The @ManagedOperation annotation is used to indicate that a given method 
+ * The <code>&#064;ManagedOperation</code> annotation is used to indicate that a given method 
  * should be considered a JMX operation.
- *
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
@@ -36,6 +35,7 @@
 {
     /**
      * Description of the Managed Object
+     * @return value
      */
     String value() default "Not Specified";
     
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/annotation/Name.java b/jetty-util/src/main/java/org/eclipse/jetty/util/annotation/Name.java
index c4c6787..aab349f 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/annotation/Name.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/annotation/Name.java
@@ -39,11 +39,13 @@
 {
     /**
      * the name of the parameter
+     * @return the value
      */
     String value();
     
     /**
      * the description of the parameter
+     * @return the description
      */
     String description() default "";
 }
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/component/AbstractLifeCycle.java b/jetty-util/src/main/java/org/eclipse/jetty/util/component/AbstractLifeCycle.java
index 591b28b..b885daf 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/component/AbstractLifeCycle.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/component/AbstractLifeCycle.java
@@ -209,7 +209,8 @@
     private void setFailed(Throwable th)
     {
         _state = __FAILED;
-        LOG.warn(FAILED+" " + this+": "+th,th);
+        if (LOG.isDebugEnabled())
+            LOG.warn(FAILED+" " + this+": "+th,th);
         for (Listener listener : _listeners)
             listener.lifeCycleFailure(this,th);
     }
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/component/Container.java b/jetty-util/src/main/java/org/eclipse/jetty/util/component/Container.java
index bbb95a6..a75d459 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/component/Container.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/component/Container.java
@@ -20,6 +20,9 @@
 
 import java.util.Collection;
 
+/**
+ * A Container
+ */
 public interface Container
 {
     /* ------------------------------------------------------------ */
@@ -39,6 +42,7 @@
     /**
      * @param clazz the class of the beans
      * @return the list of beans of the given class (or subclass)
+     * @param <T> the Bean type
      * @see #getBeans()
      */
     public <T> Collection<T> getBeans(Class<T> clazz);
@@ -46,12 +50,14 @@
     /**
      * @param clazz the class of the bean
      * @return the first bean of a specific class (or subclass), or null if no such bean exist
+     * @param <T> the Bean type 
      */
     public <T> T getBean(Class<T> clazz);
 
     /**
      * Removes the given bean.
      * If the bean is-a {@link Listener}, then also do an implicit {@link #removeEventListener(Listener)}.
+     * @param o the bean to remove
      * @return whether the bean was removed
      */
     public boolean removeBean(Object o);
@@ -59,14 +65,14 @@
     /**
      * Add an event listener. 
      * @see Container#addBean(Object)
-     * @param listener
+     * @param listener the listener to add
      */
     public void addEventListener(Listener listener);
     
     /**
      * Remove an event listener. 
      * @see Container#removeBean(Object)
-     * @param listener
+     * @param listener the listener to remove
      */
     public void removeEventListener(Listener listener);
 
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/component/ContainerLifeCycle.java b/jetty-util/src/main/java/org/eclipse/jetty/util/component/ContainerLifeCycle.java
index 772c03f..cb6cc2b 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/component/ContainerLifeCycle.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/component/ContainerLifeCycle.java
@@ -124,8 +124,8 @@
     /**
      * Starts the given lifecycle.
      *
-     * @param l
-     * @throws Exception
+     * @param l the lifecycle to start
+     * @throws Exception if unable to start lifecycle
      */
     protected void start(LifeCycle l) throws Exception
     {
@@ -135,8 +135,8 @@
     /**
      * Stops the given lifecycle.
      *
-     * @param l
-     * @throws Exception
+     * @param l the lifecycle to stop
+     * @throws Exception if unable to stop the lifecycle
      */
     protected void stop(LifeCycle l) throws Exception
     {
@@ -158,8 +158,7 @@
             if (b._managed==Managed.MANAGED && b._bean instanceof LifeCycle)
             {
                 LifeCycle l = (LifeCycle)b._bean;
-                if (l.isRunning())
-                    stop(l);
+                stop(l);
             }
         }
     }
@@ -329,11 +328,11 @@
     
     /* ------------------------------------------------------------ */
     /** Add a managed lifecycle.
-     * <p>This is a conveniance method that uses addBean(lifecycle,true)
+     * <p>This is a convenience method that uses addBean(lifecycle,true)
      * and then ensures that the added bean is started iff this container
      * is running.  Exception from nested calls to start are caught and 
      * wrapped as RuntimeExceptions
-     * @param lifecycle
+     * @param lifecycle the managed lifecycle to add
      */
     public void addManaged(LifeCycle lifecycle)
     {
@@ -777,6 +776,17 @@
                 addBean(newBean);
         }
     }
+    
+    public void updateBean(Object oldBean, final Object newBean, boolean managed)
+    {
+        if (newBean!=oldBean)
+        {
+            if (oldBean!=null)
+                removeBean(oldBean);
+            if (newBean!=null)
+                addBean(newBean,managed);
+        }
+    }
 
     public void updateBeans(Object[] oldBeans, final Object[] newBeans)
     {
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/component/DumpableCollection.java b/jetty-util/src/main/java/org/eclipse/jetty/util/component/DumpableCollection.java
new file mode 100644
index 0000000..b4c047b
--- /dev/null
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/component/DumpableCollection.java
@@ -0,0 +1,51 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util.component;
+
+import java.io.IOException;
+import java.util.Collection;
+
+import org.eclipse.jetty.util.component.ContainerLifeCycle;
+import org.eclipse.jetty.util.component.Dumpable;
+
+public class DumpableCollection implements Dumpable
+{
+    private final String _name;
+    private final Collection<?> _collection;
+
+    public DumpableCollection(String name,Collection<?> collection)
+    {
+        _name=name;
+        _collection=collection;
+    }
+
+    @Override
+    public String dump()
+    {
+        return ContainerLifeCycle.dump(this);
+    }
+
+    @Override
+    public void dump(Appendable out, String indent) throws IOException
+    {
+        out.append(_name).append("\n");
+        if (_collection!=null)
+            ContainerLifeCycle.dump(out,indent,_collection);
+    }
+}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/component/LifeCycle.java b/jetty-util/src/main/java/org/eclipse/jetty/util/component/LifeCycle.java
index 0713c6e..45c7bf0 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/component/LifeCycle.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/component/LifeCycle.java
@@ -26,7 +26,7 @@
 /* ------------------------------------------------------------ */
 /**
  * The lifecycle interface for generic components.
- * <br />
+ * <br>
  * Classes implementing this interface have a defined life cycle
  * defined by the methods of this interface.
  *
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/log/AbstractLogger.java b/jetty-util/src/main/java/org/eclipse/jetty/util/log/AbstractLogger.java
index 4ea4771..5571d63 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/log/AbstractLogger.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/log/AbstractLogger.java
@@ -18,6 +18,7 @@
 
 package org.eclipse.jetty.util.log;
 
+import java.util.Properties;
 
 /* ------------------------------------------------------------ */
 /** Abstract Logger.
@@ -25,6 +26,13 @@
  */
 public abstract class AbstractLogger implements Logger
 {
+    public static final int LEVEL_DEFAULT = -1;
+    public static final int LEVEL_ALL = 0;
+    public static final int LEVEL_DEBUG = 1;
+    public static final int LEVEL_INFO = 2;
+    public static final int LEVEL_WARN = 3;
+    public static final int LEVEL_OFF = 10;
+        
     @Override
     public final Logger getLogger(String name)
     {
@@ -76,6 +84,137 @@
         return true;
     }
     
+    /**
+     * Get the Logging Level for the provided log name. Using the FQCN first, then each package segment from longest to
+     * shortest.
+     *
+     * @param props
+     *            the properties to check
+     * @param name
+     *            the name to get log for
+     * @return the logging level
+     */
+    public static int lookupLoggingLevel(Properties props, final String name)
+    {
+        if ((props == null) || (props.isEmpty()) || name==null )
+            return LEVEL_DEFAULT;
+        
+        // Calculate the level this named logger should operate under.
+        // Checking with FQCN first, then each package segment from longest to shortest.
+        String nameSegment = name;
+    
+        while ((nameSegment != null) && (nameSegment.length() > 0))
+        {
+            String levelStr = props.getProperty(nameSegment + ".LEVEL");
+            // System.err.printf("[StdErrLog.CONFIG] Checking for property [%s.LEVEL] = %s%n",nameSegment,levelStr);
+            int level = getLevelId(nameSegment + ".LEVEL",levelStr);
+            if (level != (-1))
+            {
+                return level;
+            }
+    
+            // Trim and try again.
+            int idx = nameSegment.lastIndexOf('.');
+            if (idx >= 0)
+            {
+                nameSegment = nameSegment.substring(0,idx);
+            }
+            else
+            {
+                nameSegment = null;
+            }
+        }
+    
+        // Default Logging Level
+        return LEVEL_DEFAULT;
+    }
+
+
+    public static String getLoggingProperty(Properties props, String name, String property)
+    {
+        // Calculate the level this named logger should operate under.
+        // Checking with FQCN first, then each package segment from longest to shortest.
+        String nameSegment = name;
+    
+        while ((nameSegment != null) && (nameSegment.length() > 0))
+        {
+            String s = props.getProperty(nameSegment+"."+property);
+            if (s!=null)
+                return s;
+    
+            // Trim and try again.
+            int idx = nameSegment.lastIndexOf('.');
+            nameSegment = (idx >= 0)?nameSegment.substring(0,idx):null;
+        }
+    
+        return null;
+    }
+
+
+    protected static int getLevelId(String levelSegment, String levelName)
+    {
+        if (levelName == null)
+        {
+            return -1;
+        }
+        String levelStr = levelName.trim();
+        if ("ALL".equalsIgnoreCase(levelStr))
+        {
+            return LEVEL_ALL;
+        }
+        else if ("DEBUG".equalsIgnoreCase(levelStr))
+        {
+            return LEVEL_DEBUG;
+        }
+        else if ("INFO".equalsIgnoreCase(levelStr))
+        {
+            return LEVEL_INFO;
+        }
+        else if ("WARN".equalsIgnoreCase(levelStr))
+        {
+            return LEVEL_WARN;
+        }
+        else if ("OFF".equalsIgnoreCase(levelStr))
+        {
+            return LEVEL_OFF;
+        }
+    
+        System.err.println("Unknown StdErrLog level [" + levelSegment + "]=[" + levelStr + "], expecting only [ALL, DEBUG, INFO, WARN, OFF] as values.");
+        return -1;
+    }
+
+
+    /**
+     * Condenses a classname by stripping down the package name to just the first character of each package name
+     * segment.Configured
+     *
+     * <pre>
+     * Examples:
+     * "org.eclipse.jetty.test.FooTest"           = "oejt.FooTest"
+     * "org.eclipse.jetty.server.logging.LogTest" = "orjsl.LogTest"
+     * </pre>
+     *
+     * @param classname
+     *            the fully qualified class name
+     * @return the condensed name
+     */
+    protected static String condensePackageString(String classname)
+    {
+        String parts[] = classname.split("\\.");
+        StringBuilder dense = new StringBuilder();
+        for (int i = 0; i < (parts.length - 1); i++)
+        {
+            dense.append(parts[i].charAt(0));
+        }
+        if (dense.length() > 0)
+        {
+            dense.append('.');
+        }
+        dense.append(parts[parts.length - 1]);
+        return dense.toString();
+    }
+
+
     public void debug(String msg, long arg)
     {
         if (isDebugEnabled())
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/log/JavaUtilLog.java b/jetty-util/src/main/java/org/eclipse/jetty/util/log/JavaUtilLog.java
index c079fd4..57178cd 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/log/JavaUtilLog.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/log/JavaUtilLog.java
@@ -18,7 +18,14 @@
 
 package org.eclipse.jetty.util.log;
 
+import java.net.URL;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.logging.Level;
+import java.util.logging.LogManager;
+import java.util.logging.LogRecord;
+
+import org.eclipse.jetty.util.Loader;
 
 /**
  * <p>
@@ -26,27 +33,109 @@
  * </p>
  *
  * <p>
- * You can also set the logger level using <a href="http://java.sun.com/j2se/1.5.0/docs/guide/logging/overview.html">
+ * You can also set the logger level using <a href="http://docs.oracle.com/javase/8/docs/api/java/util/logging/package-summary.html">
  * standard java.util.logging configuration</a>.
  * </p>
+ * 
+ * Configuration Properties:
+ * <dl>
+ *   <dt>${name|hierarchy}.LEVEL=(ALL|DEBUG|INFO|WARN|OFF)</dt>
+ *   <dd>
+ *   Sets the level that the Logger should log at.<br>
+ *   Names can be a package name, or a fully qualified class name.<br>
+ *   Default: The default from the java.util.logging mechanism/configuration
+ *   <br>
+ *   <dt>org.eclipse.jetty.util.log.javautil.PROPERTIES=&lt;property-resource-name&gt;</dt>
+ *   <dd>If set, it is used as a classpath resource name to find a java.util.logging 
+ *   property file.
+ *   <br>
+ *   Default: null
+ *   </dd>
+ *   <dt>org.eclipse.jetty.util.log.javautil.SOURCE=(true|false)</dt>
+ *   <dd>Set the LogRecord source class and method for JavaUtilLog.<br>
+ *   Default: true
+ *   </dd>
+ *   <dt>org.eclipse.jetty.util.log.SOURCE=(true|false)</dt>
+ *   <dd>Set the LogRecord source class and method for all Loggers.<br>
+ *   Default: depends on Logger class
+ *   </dd>
+ * </dl>
  */
 public class JavaUtilLog extends AbstractLogger
 {
+    private final static String THIS_CLASS= JavaUtilLog.class.getName();
+    private final static boolean __source = 
+            Boolean.parseBoolean(Log.__props.getProperty("org.eclipse.jetty.util.log.SOURCE",
+            Log.__props.getProperty("org.eclipse.jetty.util.log.javautil.SOURCE","true")));
+    
+    private static boolean _initialized=false;
+    
     private Level configuredLevel;
     private java.util.logging.Logger _logger;
 
     public JavaUtilLog()
     {
-        this("org.eclipse.jetty.util.log");
+        this("org.eclipse.jetty.util.log.javautil");
     }
 
     public JavaUtilLog(String name)
     {
-        _logger = java.util.logging.Logger.getLogger(name);
-        if (Boolean.parseBoolean(Log.__props.getProperty("org.eclipse.jetty.util.log.DEBUG", "false")))
+        synchronized (JavaUtilLog.class)
         {
-            _logger.setLevel(Level.FINE);
+            if (!_initialized)
+            {
+                _initialized=true;
+
+                final String properties=Log.__props.getProperty("org.eclipse.jetty.util.log.javautil.PROPERTIES",null);
+                if (properties!=null)
+                {
+                    AccessController.doPrivileged(new PrivilegedAction<Object>()
+                    {
+                        public Object run()
+                        {
+                            try
+                            {
+                                URL props = Loader.getResource(JavaUtilLog.class,properties);
+                                if (props != null)
+                                    LogManager.getLogManager().readConfiguration(props.openStream());
+                            }
+                            catch(Throwable e)
+                            {
+                                System.err.println("[WARN] Error loading logging config: " + properties);
+                                e.printStackTrace(System.err);
+                            }
+                            
+                            return null;
+                        }
+                    });
+                }
+            }
         }
+        
+        _logger = java.util.logging.Logger.getLogger(name);
+        
+        switch(lookupLoggingLevel(Log.__props,name))
+        {
+            case LEVEL_ALL:
+                _logger.setLevel(Level.ALL);
+                break;
+            case LEVEL_DEBUG:
+                _logger.setLevel(Level.FINE);
+                break;
+            case LEVEL_INFO:
+                _logger.setLevel(Level.INFO);
+                break;
+            case LEVEL_WARN:
+                _logger.setLevel(Level.WARNING);
+                break;
+            case LEVEL_OFF:
+                _logger.setLevel(Level.OFF);
+                break;
+            case LEVEL_DEFAULT:
+            default:
+                break;
+        }
+        
         configuredLevel = _logger.getLevel();
     }
 
@@ -55,36 +144,63 @@
         return _logger.getName();
     }
 
+    protected void log(Level level,String msg,Throwable thrown)
+    {
+        LogRecord record = new LogRecord(level,msg);
+        if (thrown!=null)
+            record.setThrown(thrown);
+        record.setLoggerName(_logger.getName());
+        if (__source)
+        {
+            StackTraceElement[] stack = new Throwable().getStackTrace();
+            for (int i=0;i<stack.length;i++)
+            {
+                StackTraceElement e=stack[i];
+                if (!e.getClassName().equals(THIS_CLASS))
+                {
+                    record.setSourceClassName(e.getClassName());
+                    record.setSourceMethodName(e.getMethodName());
+                    break;
+                }
+            }
+        }
+        _logger.log(record);
+    }
+    
     public void warn(String msg, Object... args)
     {
         if (_logger.isLoggable(Level.WARNING))
-            _logger.log(Level.WARNING,format(msg,args));
+            log(Level.WARNING,format(msg,args),null);
     }
 
     public void warn(Throwable thrown)
     {
-        warn("", thrown);
+        if (_logger.isLoggable(Level.WARNING))
+            log(Level.WARNING,"",thrown);
     }
 
     public void warn(String msg, Throwable thrown)
     {
-        _logger.log(Level.WARNING, msg, thrown);
+        if (_logger.isLoggable(Level.WARNING))
+            log(Level.WARNING,msg,thrown);
     }
 
     public void info(String msg, Object... args)
     {
         if (_logger.isLoggable(Level.INFO))
-            _logger.log(Level.INFO, format(msg, args));
+            log(Level.INFO, format(msg, args),null);
     }
 
     public void info(Throwable thrown)
     {
-        info("", thrown);
+        if (_logger.isLoggable(Level.INFO))
+            log(Level.INFO, "",thrown);
     }
 
     public void info(String msg, Throwable thrown)
     {
-        _logger.log(Level.INFO, msg, thrown);
+        if (_logger.isLoggable(Level.INFO))
+            log(Level.INFO,msg,thrown);
     }
 
     public boolean isDebugEnabled()
@@ -108,23 +224,25 @@
     public void debug(String msg, Object... args)
     {
         if (_logger.isLoggable(Level.FINE))
-            _logger.log(Level.FINE,format(msg, args));
+            log(Level.FINE,format(msg, args),null);
     }
 
     public void debug(String msg, long arg)
     {
         if (_logger.isLoggable(Level.FINE))
-            _logger.log(Level.FINE,format(msg, arg));
+            log(Level.FINE,format(msg, arg),null);
     }
 
     public void debug(Throwable thrown)
     {
-        debug("", thrown);
+        if (_logger.isLoggable(Level.FINE))
+            log(Level.FINE,"",thrown);
     }
 
     public void debug(String msg, Throwable thrown)
     {
-        _logger.log(Level.FINE, msg, thrown);
+        if (_logger.isLoggable(Level.FINE))
+            log(Level.FINE,msg,thrown);
     }
 
     /**
@@ -137,10 +255,8 @@
 
     public void ignore(Throwable ignored)
     {
-        if (Log.isIgnored())
-        {
-            warn(Log.IGNORED, ignored);
-        }
+        if (_logger.isLoggable(Level.ALL))
+            log(Level.WARNING,Log.IGNORED,ignored);
     }
 
     private String format(String msg, Object... args)
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/log/JettyLogHandler.java b/jetty-util/src/main/java/org/eclipse/jetty/util/log/JettyLogHandler.java
new file mode 100644
index 0000000..fbb2210
--- /dev/null
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/log/JettyLogHandler.java
@@ -0,0 +1,198 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util.log;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.text.MessageFormat;
+import java.util.ResourceBundle;
+import java.util.logging.Level;
+import java.util.logging.LogManager;
+import java.util.logging.LogRecord;
+import java.util.regex.Pattern;
+
+/**
+ * Redirect java.util.logging events to Jetty Log
+ */
+public class JettyLogHandler extends java.util.logging.Handler
+{
+    public static void config()
+    {
+        ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        URL url = cl.getResource("logging.properties");
+        if (url != null)
+        {
+            System.err.printf("Initializing java.util.logging from %s%n",url);
+            try (InputStream in = url.openStream())
+            {
+                LogManager.getLogManager().readConfiguration(in);
+            }
+            catch (IOException e)
+            {
+                e.printStackTrace(System.err);
+            }
+        } 
+        else 
+        {
+            System.err.printf("WARNING: java.util.logging failed to initialize: logging.properties not found%n");
+        }
+
+        System.setProperty("org.apache.commons.logging.Log","org.apache.commons.logging.impl.Jdk14Logger");
+    }
+
+    public JettyLogHandler()
+    {
+        if (Boolean.parseBoolean(Log.__props.getProperty("org.eclipse.jetty.util.log.DEBUG","false")))
+        {
+            setLevel(Level.FINEST);
+        }
+
+        if (Boolean.parseBoolean(Log.__props.getProperty("org.eclipse.jetty.util.log.IGNORED","false")))
+        {
+            setLevel(Level.ALL);
+        }
+        
+        System.err.printf("%s Initialized at level [%s]%n",this.getClass().getName(),getLevel().getName());
+    }
+
+    private synchronized String formatMessage(LogRecord record)
+    {
+        String msg = getMessage(record);
+
+        try
+        {
+            Object params[] = record.getParameters();
+            if ((params == null) || (params.length == 0))
+            {
+                return msg;
+            }
+
+            if (Pattern.compile("\\{\\d+\\}").matcher(msg).find())
+            {
+                return MessageFormat.format(msg,params);
+            }
+
+            return msg;
+        }
+        catch (Exception ex)
+        {
+            return msg;
+        }
+    }
+
+    private String getMessage(LogRecord record)
+    {
+        ResourceBundle bundle = record.getResourceBundle();
+        if (bundle != null)
+        {
+            try
+            {
+                return bundle.getString(record.getMessage());
+            }
+            catch (java.util.MissingResourceException ex)
+            {
+            }
+        }
+
+        return record.getMessage();
+    }
+
+    @Override
+    public void publish(LogRecord record)
+    {
+        org.eclipse.jetty.util.log.Logger JLOG = getJettyLogger(record.getLoggerName());
+
+        int level = record.getLevel().intValue();
+        if (level >= Level.OFF.intValue())
+        {
+            // nothing to log, skip it.
+            return;
+        }
+
+        Throwable cause = record.getThrown();
+        String msg = formatMessage(record);
+
+        if (level >= Level.WARNING.intValue())
+        {
+            // log at warn
+            if (cause != null)
+            {
+                JLOG.warn(msg,cause);
+            }
+            else
+            {
+                JLOG.warn(msg);
+            }
+            return;
+        }
+
+        if (level >= Level.INFO.intValue())
+        {
+            // log at info
+            if (cause != null)
+            {
+                JLOG.info(msg,cause);
+            }
+            else
+            {
+                JLOG.info(msg);
+            }
+            return;
+        }
+
+        if (level >= Level.FINEST.intValue())
+        {
+            // log at debug
+            if (cause != null)
+            {
+                JLOG.debug(msg,cause);
+            }
+            else
+            {
+                JLOG.debug(msg);
+            }
+            return;
+        }
+
+        if (level >= Level.ALL.intValue())
+        {
+            // only corresponds with ignore (in jetty speak)
+            JLOG.ignore(cause);
+            return;
+        }
+    }
+
+    private Logger getJettyLogger(String loggerName)
+    {
+        return org.eclipse.jetty.util.log.Log.getLogger(loggerName);
+    }
+
+    @Override
+    public void flush()
+    {
+        // ignore
+    }
+
+    @Override
+    public void close() throws SecurityException
+    {
+        // ignore
+    }
+}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/log/Log.java b/jetty-util/src/main/java/org/eclipse/jetty/util/log/Log.java
index b1163e6..396b95b 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/log/Log.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/log/Log.java
@@ -130,7 +130,7 @@
         });
     }
     
-    private static void loadProperties(String resourceName, Properties props)
+    static void loadProperties(String resourceName, Properties props)
     {
         URL testProps = Loader.getResource(Log.class,resourceName);
         if (testProps != null)
@@ -169,8 +169,8 @@
 
             try
             {
-                Class<?> log_class = Loader.loadClass(Log.class, __logClass);
-                if (LOG == null || !LOG.getClass().equals(log_class))
+                Class<?> log_class = __logClass==null?null:Loader.loadClass(Log.class, __logClass);
+                if (LOG == null || (log_class!=null && !LOG.getClass().equals(log_class)))
                 {
                     LOG = (Logger)log_class.newInstance();
                     LOG.debug("Logging to {} via {}", LOG, log_class.getName());
@@ -209,9 +209,19 @@
         return LOG;
     }
 
+    /**
+     * Set the root logger.
+     * <p>
+     * Note that if any classes have statically obtained their logger instance prior to this call, their Logger will not
+     * be affected by this call.
+     * 
+     * @param log
+     *            the root logger implementation to set
+     */
     public static void setLog(Logger log)
     {
         Log.LOG = log;
+        __logClass=null;
     }
 
     /**
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/log/Logger.java b/jetty-util/src/main/java/org/eclipse/jetty/util/log/Logger.java
index 9da7788..65ec959 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/log/Logger.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/log/Logger.java
@@ -117,6 +117,7 @@
     /**
      * Ignore an exception.
      * <p>This should be used rather than an empty catch block.
+     * @param ignored the throwable to log as ignored
      */
     public void ignore(Throwable ignored); 
 }
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/log/StdErrLog.java b/jetty-util/src/main/java/org/eclipse/jetty/util/log/StdErrLog.java
index dfc9168..079e995 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/log/StdErrLog.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/log/StdErrLog.java
@@ -21,6 +21,7 @@
 import java.io.PrintStream;
 import java.security.AccessControlException;
 import java.util.Properties;
+import java.util.logging.Level;
 
 import org.eclipse.jetty.util.DateCache;
 import org.eclipse.jetty.util.annotation.ManagedAttribute;
@@ -37,10 +38,10 @@
  * <dl>
  *   <dt>${name|hierarchy}.LEVEL=(ALL|DEBUG|INFO|WARN|OFF)</dt>
  *   <dd>
- *   Sets the level that the Logger should log at.<br/>
- *   Names can be a package name, or a fully qualified class name.<br/>
- *   Default: INFO<br/>
- *   <br/>
+ *   Sets the level that the Logger should log at.<br>
+ *   Names can be a package name, or a fully qualified class name.<br>
+ *   Default: INFO<br>
+ *   <br>
  *   Examples:
  *   <dl>
  *   <dt>org.eclipse.jetty.LEVEL=WARN</dt>
@@ -56,35 +57,35 @@
  *   <dt>${name}.SOURCE=(true|false)</dt>
  *   <dd>
  *   Logger specific, attempt to print the java source file name and line number
- *   where the logging event originated from.<br/>
+ *   where the logging event originated from.<br>
  *   Name must be a fully qualified class name (package name hierarchy is not supported
- *   by this configurable)<br/>
- *   Warning: this is a slow operation and will have an impact on performance!<br/>
+ *   by this configurable)<br>
+ *   Warning: this is a slow operation and will have an impact on performance!<br>
  *   Default: false
  *   </dd>
  *   
  *   <dt>${name}.STACKS=(true|false)</dt>
  *   <dd>
- *   Logger specific, control the display of stacktraces.<br/>
+ *   Logger specific, control the display of stacktraces.<br>
  *   Name must be a fully qualified class name (package name hierarchy is not supported
- *   by this configurable)<br/>
+ *   by this configurable)<br>
  *   Default: true
  *   </dd>
  *   
  *   <dt>org.eclipse.jetty.util.log.stderr.SOURCE=(true|false)</dt>
  *   <dd>Special Global Configuration, attempt to print the java source file name and line number
- *   where the logging event originated from.<br/>
+ *   where the logging event originated from.<br>
  *   Default: false
  *   </dd>
  *   
  *   <dt>org.eclipse.jetty.util.log.stderr.LONG=(true|false)</dt>
  *   <dd>Special Global Configuration, when true, output logging events to STDERR using
- *   long form, fully qualified class names.  when false, use abbreviated package names<br/>
+ *   long form, fully qualified class names.  when false, use abbreviated package names<br>
  *   Default: false
  *   </dd>
  *   <dt>org.eclipse.jetty.util.log.stderr.ESCAPE=(true|false)</dt>
  *   <dd>Global Configuration, when true output logging events to STDERR are always
- *   escaped so that control characters are replaced with '?";  '\r' with '<' and '\n' replaced '|'<br/>
+ *   escaped so that control characters are replaced with '?";  '\r' with '&lt;' and '\n' replaced '|'<br>
  *   Default: true
  *   </dd>
  * </dl>
@@ -93,18 +94,17 @@
 public class StdErrLog extends AbstractLogger
 {
     private static final String EOL = System.getProperty("line.separator");
+    // Do not change output format lightly, people rely on this output format now.
+    private static int __tagpad = Integer.parseInt(Log.__props.getProperty("org.eclipse.jetty.util.log.StdErrLog.TAG_PAD","0"));
     private static DateCache _dateCache;
-    private static final Properties __props = new Properties();
 
     private final static boolean __source = Boolean.parseBoolean(Log.__props.getProperty("org.eclipse.jetty.util.log.SOURCE",
             Log.__props.getProperty("org.eclipse.jetty.util.log.stderr.SOURCE","false")));
     private final static boolean __long = Boolean.parseBoolean(Log.__props.getProperty("org.eclipse.jetty.util.log.stderr.LONG","false"));
     private final static boolean __escape = Boolean.parseBoolean(Log.__props.getProperty("org.eclipse.jetty.util.log.stderr.ESCAPE","true"));
-
+    
     static
     {
-        __props.putAll(Log.__props);
-
         String deprecatedProperties[] =
         { "DEBUG", "org.eclipse.jetty.util.log.DEBUG", "org.eclipse.jetty.util.log.stderr.DEBUG" };
 
@@ -127,11 +127,11 @@
         }
     }
 
-    public static final int LEVEL_ALL = 0;
-    public static final int LEVEL_DEBUG = 1;
-    public static final int LEVEL_INFO = 2;
-    public static final int LEVEL_WARN = 3;
-    public static final int LEVEL_OFF = 10;
+    public static void setTagPad(int pad)
+    {
+        __tagpad=pad;
+    }
+    
 
     private int _level = LEVEL_INFO;
     // Level that this Logger was configured as (remembered in special case of .setDebugEnabled())
@@ -146,6 +146,20 @@
     private final String _abbrevname;
     private boolean _hideStacks = false;
 
+    
+    public static int getLoggingLevel(Properties props,String name)
+    {
+        int level = lookupLoggingLevel(props,name);
+        if (level==LEVEL_DEFAULT)
+        {
+            level = lookupLoggingLevel(props,"log");
+            if (level==LEVEL_DEFAULT)
+                level=LEVEL_INFO;
+        }
+        return level;
+    }
+    
+    
     /**
      * Obtain a StdErrLog reference for the specified class, a convenience method used most often during testing to allow for control over a specific logger.
      * <p>
@@ -185,7 +199,7 @@
      */
     public StdErrLog(String name)
     {
-        this(name,__props);
+        this(name,null);
     }
 
     /**
@@ -198,16 +212,16 @@
      */
     public StdErrLog(String name, Properties props)
     {
-        if (props!=null && props!=__props)
-            __props.putAll(props);
-        this._name = name == null?"":name;
-        this._abbrevname = condensePackageString(this._name);
-        this._level = getLoggingLevel(props,this._name);
-        this._configuredLevel = this._level;
+        if (props!=null && props!=Log.__props)
+            Log.__props.putAll(props);
+        _name = name == null?"":name;
+        _abbrevname = condensePackageString(this._name);
+        _level = getLoggingLevel(Log.__props,this._name);
+        _configuredLevel = _level;
 
         try
         {
-            String source = getLoggingProperty(props,_name,"SOURCE");
+            String source = getLoggingProperty(Log.__props,_name,"SOURCE");
             _source = source==null?__source:Boolean.parseBoolean(source);
         }
         catch (AccessControlException ace)
@@ -218,7 +232,7 @@
         try
         {
             // allow stacktrace display to be controlled by properties as well
-            String stacks = getLoggingProperty(props,_name,"STACKS");
+            String stacks = getLoggingProperty(Log.__props,_name,"STACKS");
             _hideStacks = stacks==null?false:!Boolean.parseBoolean(stacks);
         }
         catch (AccessControlException ignore)
@@ -227,137 +241,6 @@
         }        
     }
 
-    /**
-     * Get the Logging Level for the provided log name. Using the FQCN first, then each package segment from longest to
-     * shortest.
-     *
-     * @param props
-     *            the properties to check
-     * @param name
-     *            the name to get log for
-     * @return the logging level
-     */
-    public static int getLoggingLevel(Properties props, final String name)
-    {
-        if ((props == null) || (props.isEmpty()))
-        {
-            // Default Logging Level
-            return getLevelId("log.LEVEL","INFO");
-        }
-        
-        // Calculate the level this named logger should operate under.
-        // Checking with FQCN first, then each package segment from longest to shortest.
-        String nameSegment = name;
-
-        while ((nameSegment != null) && (nameSegment.length() > 0))
-        {
-            String levelStr = props.getProperty(nameSegment + ".LEVEL");
-            // System.err.printf("[StdErrLog.CONFIG] Checking for property [%s.LEVEL] = %s%n",nameSegment,levelStr);
-            int level = getLevelId(nameSegment + ".LEVEL",levelStr);
-            if (level != (-1))
-            {
-                return level;
-            }
-
-            // Trim and try again.
-            int idx = nameSegment.lastIndexOf('.');
-            if (idx >= 0)
-            {
-                nameSegment = nameSegment.substring(0,idx);
-            }
-            else
-            {
-                nameSegment = null;
-            }
-        }
-
-        // Default Logging Level
-        return getLevelId("log.LEVEL",props.getProperty("log.LEVEL","INFO"));
-    }
-    
-    public static String getLoggingProperty(Properties props, String name, String property)
-    {
-        // Calculate the level this named logger should operate under.
-        // Checking with FQCN first, then each package segment from longest to shortest.
-        String nameSegment = name;
-
-        while ((nameSegment != null) && (nameSegment.length() > 0))
-        {
-            String s = props.getProperty(nameSegment+"."+property);
-            if (s!=null)
-                return s;
-
-            // Trim and try again.
-            int idx = nameSegment.lastIndexOf('.');
-            nameSegment = (idx >= 0)?nameSegment.substring(0,idx):null;
-        }
-
-        return null;
-    }
-
-    protected static int getLevelId(String levelSegment, String levelName)
-    {
-        if (levelName == null)
-        {
-            return -1;
-        }
-        String levelStr = levelName.trim();
-        if ("ALL".equalsIgnoreCase(levelStr))
-        {
-            return LEVEL_ALL;
-        }
-        else if ("DEBUG".equalsIgnoreCase(levelStr))
-        {
-            return LEVEL_DEBUG;
-        }
-        else if ("INFO".equalsIgnoreCase(levelStr))
-        {
-            return LEVEL_INFO;
-        }
-        else if ("WARN".equalsIgnoreCase(levelStr))
-        {
-            return LEVEL_WARN;
-        }
-        else if ("OFF".equalsIgnoreCase(levelStr))
-        {
-            return LEVEL_OFF;
-        }
-
-        System.err.println("Unknown StdErrLog level [" + levelSegment + "]=[" + levelStr + "], expecting only [ALL, DEBUG, INFO, WARN, OFF] as values.");
-        return -1;
-    }
-
-    /**
-     * Condenses a classname by stripping down the package name to just the first character of each package name
-     * segment.Configured
-     * <p>
-     *
-     * <pre>
-     * Examples:
-     * "org.eclipse.jetty.test.FooTest"           = "oejt.FooTest"
-     * "org.eclipse.jetty.server.logging.LogTest" = "orjsl.LogTest"
-     * </pre>
-     *
-     * @param classname
-     *            the fully qualified class name
-     * @return the condensed name
-     */
-    protected static String condensePackageString(String classname)
-    {
-        String parts[] = classname.split("\\.");
-        StringBuilder dense = new StringBuilder();
-        for (int i = 0; i < (parts.length - 1); i++)
-        {
-            dense.append(parts[i].charAt(0));
-        }
-        if (dense.length() > 0)
-        {
-            dense.append('.');
-        }
-        dense.append(parts[parts.length - 1]);
-        return dense.toString();
-    }
-
     public String getName()
     {
         return _name;
@@ -589,16 +472,26 @@
             buffer.append(".00");
         }
         buffer.append(ms).append(tag);
-        if (_printLongNames)
+        
+        String name=_printLongNames?_name:_abbrevname;
+        String tname=Thread.currentThread().getName();
+
+        int p=__tagpad>0?(name.length()+tname.length()-__tagpad):0;
+
+        if (p<0)
         {
-            buffer.append(_name);
+            buffer
+            .append(name)
+            .append(':')
+            .append("                                                  ",0,-p)
+            .append(tname);
         }
-        else
+        else if (p==0)
         {
-            buffer.append(_abbrevname);
+            buffer.append(name).append(':').append(tname);
         }
         buffer.append(':');
-        buffer.append(Thread.currentThread().getName()).append(": ");
+        
         if (_source)
         {
             Throwable source = new Throwable();
@@ -628,6 +521,8 @@
                 break;
             }
         }
+
+        buffer.append(' ');
     }
 
     private void format(StringBuilder builder, String msg, Object... args)
@@ -778,12 +673,6 @@
         return s.toString();
     }
 
-    public static void setProperties(Properties props)
-    {
-        __props.clear();
-        __props.putAll(props);
-    }
-
     public void ignore(Throwable ignored)
     {
         if (_level <= LEVEL_ALL)
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/FileResource.java b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/FileResource.java
index 1949f7a..1c20098 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/FileResource.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/FileResource.java
@@ -46,7 +46,9 @@
  * insensitivity).  By default this is turned on, or it can be controlled 
  * by calling the static method @see FileResource#setCheckAliases(boolean)
  * 
+ * @deprecated Use {@link PathResource}
  */
+@Deprecated
 public class FileResource extends Resource
 {
     private static final Logger LOG = Log.getLogger(FileResource.class);
@@ -117,7 +119,7 @@
     }
 
     /* -------------------------------------------------------- */
-    FileResource(File file)
+    public FileResource(File file)
     {
         _file=file;
         _uri=normalizeURI(_file,_file.toURI());
@@ -153,7 +155,8 @@
 
                 URI alias=new File(can).toURI();
                 // Have to encode the path as File.toURI does not!
-                return new URI("file://"+URIUtil.encodePath(alias.getPath()));  
+                String uri="file://"+URIUtil.encodePath(alias.getPath());
+                return new URI(uri);
             }
         }
         catch(Exception e)
@@ -177,7 +180,7 @@
     /* -------------------------------------------------------- */
     @Override
     public Resource addPath(String path)
-        throws IOException,MalformedURLException
+        throws IOException, MalformedURLException
     {
         path = org.eclipse.jetty.util.URIUtil.canonicalPath(path);
 
@@ -202,9 +205,14 @@
                 uri=new URI(_uri+path);
             }
         }
-        catch(final URISyntaxException e)
+        catch (final URISyntaxException e)
         {
-            throw new MalformedURLException(){{initCause(e);}};
+            throw new MalformedURLException(e.getMessage())
+            {
+                {
+                    initCause(e);
+                }
+            };
         }
 
         return new FileResource(uri);
@@ -343,7 +351,7 @@
     
     /* ------------------------------------------------------------ */
     /** 
-     * @param o
+     * @param o the object to compare against this instance
      * @return <code>true</code> of the object <code>o</code> is a {@link FileResource} pointing to the same file as this resource. 
      */
     @Override
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/JarFileResource.java b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/JarFileResource.java
index 7bb738a..7d426ff 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/JarFileResource.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/JarFileResource.java
@@ -55,13 +55,13 @@
     protected JarFileResource(URL url, boolean useCaches)
     {
         super(url, useCaches);
-    }
-   
+    }   
 
     /* ------------------------------------------------------------ */
     @Override
     public synchronized void close()
     {
+        _exists=false;
         _list=null;
         _entry=null;
         _file=null;
@@ -144,7 +144,6 @@
 
         if (_urlString.endsWith("!/"))
         {
-            
             String file_url=_urlString.substring(4,_urlString.length()-2);
             try{return newResource(file_url).exists();}
             catch(Exception e) {LOG.ignore(e); return false;}
@@ -179,40 +178,39 @@
                 }
                 catch(Exception e)
                 {
-                       LOG.ignore(e);
+                    LOG.ignore(e);
                 }
             }
 
             // Do we need to look more closely?
             if (jar_file!=null && _entry==null && !_directory)
             {
-                // OK - we have a JarFile, lets look at the entries for our path
-                Enumeration<JarEntry> e=jar_file.entries();
-                while(e.hasMoreElements())
+                // OK - we have a JarFile, lets look for the entry
+                JarEntry entry = jar_file.getJarEntry(_path);
+                if (entry == null) 
                 {
-                    JarEntry entry = e.nextElement();
-                    String name=entry.getName().replace('\\','/');
-                    
-                    // Do we have a match
-                    if (name.equals(_path))
+                    // the entry does not exist
+                    _exists = false;
+                } 
+                else if (entry.isDirectory()) 
+                {
+                    _directory = true;
+                    _entry = entry;
+                } 
+                else 
+                {
+                    // Let's confirm is a file
+                    JarEntry directory = jar_file.getJarEntry(_path + '/');
+                    if (directory != null) 
                     {
-                        _entry=entry;
-                        // Is the match a directory
-                        _directory=_path.endsWith("/");
-                        break;
-                    }
-                    else if (_path.endsWith("/"))
+                        _directory = true;
+                        _entry = directory;
+                    } 
+                    else 
                     {
-                        if (name.startsWith(_path))
-                        {
-                            _directory=true;
-                            break;
-                        }
-                    }
-                    else if (name.startsWith(_path) && name.length()>_path.length() && name.charAt(_path.length())=='/')
-                    {
-                        _directory=true;
-                        break;
+                        // OK is a file
+                      _directory = false;
+                      _entry = entry;
                     }
                 }
             }
@@ -228,7 +226,7 @@
                     LOG.ignore(ioe);
                 }
             }
-        }    
+        }
         
         _exists= ( _directory || _entry!=null);
         return _exists;
@@ -284,7 +282,7 @@
                 //So, do one retry to drop a connection and get a fresh JarFile
                 LOG.warn("Retrying list:"+e);
                 LOG.debug(e);
-                release();
+                close();
                 list = listEntries();
             }
 
@@ -382,7 +380,7 @@
     /**
      * Take a Resource that possibly might use URLConnection caching
      * and turn it into one that doesn't.
-     * @param resource
+     * @param resource the JarFileResource to obtain without URLConnection caching. 
      * @return the non-caching resource
      */
     public static Resource getNonCachingResource (Resource resource)
@@ -400,9 +398,9 @@
     /**
      * Check if this jar:file: resource is contained in the
      * named resource. Eg <code>jar:file:///a/b/c/foo.jar!/x.html</code> isContainedIn <code>file:///a/b/c/foo.jar</code>
-     * @param resource
+     * @param resource the resource to test for
      * @return true if resource is contained in the named resource
-     * @throws MalformedURLException
+     * @throws MalformedURLException if unable to process is contained due to invalid URL format
      */
     @Override
     public boolean isContainedIn (Resource resource) 
@@ -418,11 +416,3 @@
         return url.sameFile(resource.getURL());     
     }
 }
-
-
-
-
-
-
-
-
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/JarResource.java b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/JarResource.java
index 301ade8..4316fa1 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/JarResource.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/JarResource.java
@@ -26,6 +26,7 @@
 import java.io.OutputStream;
 import java.net.JarURLConnection;
 import java.net.URL;
+import java.net.URLConnection;
 import java.util.jar.JarEntry;
 import java.util.jar.JarInputStream;
 import java.util.jar.Manifest;
@@ -156,9 +157,10 @@
       
         if (LOG.isDebugEnabled()) 
             LOG.debug("Extracting entry = "+subEntryName+" from jar "+jarFileURL);
-        
-        try (InputStream is = jarFileURL.openConnection().getInputStream();
-                JarInputStream jin = new JarInputStream(is))
+        URLConnection c = jarFileURL.openConnection();
+        c.setUseCaches(false);
+        try (InputStream is = c.getInputStream();
+             JarInputStream jin = new JarInputStream(is))
         {
             JarEntry entry;
             boolean shouldExtract;
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/PathResource.java b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/PathResource.java
index 19c2f3c..b887478 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/PathResource.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/PathResource.java
@@ -33,12 +33,13 @@
 import java.nio.file.InvalidPathException;
 import java.nio.file.LinkOption;
 import java.nio.file.Path;
-import java.nio.file.StandardCopyOption;
 import java.nio.file.StandardOpenOption;
 import java.nio.file.attribute.FileTime;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.URIUtil;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
@@ -48,22 +49,134 @@
 public class PathResource extends Resource
 {
     private static final Logger LOG = Log.getLogger(PathResource.class);
-
+    private final static LinkOption NO_FOLLOW_LINKS[] = new LinkOption[] { LinkOption.NOFOLLOW_LINKS };
+    private final static LinkOption FOLLOW_LINKS[] = new LinkOption[] {};
+    
     private final Path path;
+    private final Path alias;
     private final URI uri;
-    private LinkOption linkOptions[] = new LinkOption[] { LinkOption.NOFOLLOW_LINKS };
+    
+    private static final Path checkAliasPath(final Path path)
+    {
+        Path abs = path;
+        if (!abs.isAbsolute())
+        {
+            abs = path.toAbsolutePath();
+        }
 
+        try
+        {
+            if (Files.isSymbolicLink(path))
+                return Files.readSymbolicLink(path);
+            if (Files.exists(path))
+            {
+                Path real = abs.toRealPath(FOLLOW_LINKS);
+                
+                /*
+                 * If the real path is not the same as the absolute path
+                 * then we know that the real path is the alias for the
+                 * provided path.
+                 *
+                 * For OS's that are case insensitive, this should
+                 * return the real (on-disk / case correct) version
+                 * of the path.
+                 *
+                 * We have to be careful on Windows and OSX.
+                 * 
+                 * Assume we have the following scenario
+                 *   Path a = new File("foo").toPath();
+                 *   Files.createFile(a);
+                 *   Path b = new File("FOO").toPath();
+                 * 
+                 * There now exists a file called "foo" on disk.
+                 * Using Windows or OSX, with a Path reference of
+                 * "FOO", "Foo", "fOO", etc.. means the following
+                 * 
+                 *                        |  OSX    |  Windows   |  Linux
+                 * -----------------------+---------+------------+---------
+                 * Files.exists(a)        |  True   |  True      |  True
+                 * Files.exists(b)        |  True   |  True      |  False
+                 * Files.isSameFile(a,b)  |  True   |  True      |  False
+                 * a.equals(b)            |  False  |  True      |  False
+                 * 
+                 * See the javadoc for Path.equals() for details about this FileSystem
+                 * behavior difference
+                 * 
+                 * We also cannot rely on a.compareTo(b) as this is roughly equivalent
+                 * in implementation to a.equals(b)
+                 */
+                
+                int absCount = abs.getNameCount();
+                int realCount = real.getNameCount();
+                if (absCount != realCount)
+                {
+                    // different number of segments
+                    return real;
+                }
+                
+                // compare each segment of path, backwards
+                for (int i = realCount-1; i >= 0; i--)
+                {
+                    if (!abs.getName(i).toString().equals(real.getName(i).toString()))
+                    {
+                        return real;
+                    }
+                }
+            }
+        }
+        catch (IOException e)
+        {
+            LOG.ignore(e);
+        }
+        catch (Exception e)
+        {
+            LOG.warn("bad alias ({} {}) for {}", e.getClass().getName(), e.getMessage(),path);
+        }
+        return null;
+    }
+
+    /**
+     * Construct a new PathResource from a File object.
+     * <p>
+     * An invocation of this convenience constructor of the form.
+     * </p>
+     * <pre>
+     * new PathResource(file);
+     * </pre>
+     * <p>
+     * behaves in exactly the same way as the expression
+     * </p>
+     * <pre>
+     * new PathResource(file.toPath());
+     * </pre>
+
+     * @param file the file to use
+     */
     public PathResource(File file)
     {
         this(file.toPath());
     }
 
+    /**
+     * Construct a new PathResource from a Path object.
+     * 
+     * @param path the path to use
+     */
     public PathResource(Path path)
     {
-        this.path = path;
+        this.path = path.toAbsolutePath();
         this.uri = this.path.toUri();
+        this.alias = checkAliasPath(path);
     }
 
+    /**
+     * Construct a new PathResource from a URI object.
+     * <p>
+     * Must be an absolute URI using the <code>file</code> scheme.
+     * 
+     * @param uri the URI to build this PathResource from.
+     * @throws IOException if unable to construct the PathResource from the URI.
+     */
     public PathResource(URI uri) throws IOException
     {
         if (!uri.isAbsolute())
@@ -95,19 +208,51 @@
             throw new IOException("Unable to build Path from: " + uri,e);
         }
 
-        this.path = path;
+        this.path = path.toAbsolutePath();
         this.uri = path.toUri();
+        this.alias = checkAliasPath(path);
     }
 
+    /**
+     * Create a new PathResource from a provided URL object.
+     * <p>
+     * An invocation of this convenience constructor of the form.
+     * </p>
+     * <pre>
+     * new PathResource(url);
+     * </pre>
+     * <p>
+     * behaves in exactly the same way as the expression
+     * </p>
+     * <pre>
+     * new PathResource(url.toURI());
+     * </pre>
+     * 
+     * @param url the url to attempt to create PathResource from
+     * @throws IOException if URL doesn't point to a location that can be transformed to a PathResource
+     * @throws URISyntaxException if the provided URL was malformed
+     */
     public PathResource(URL url) throws IOException, URISyntaxException
     {
         this(url.toURI());
     }
 
     @Override
-    public Resource addPath(String apath) throws IOException, MalformedURLException
+    public Resource addPath(final String subpath) throws IOException, MalformedURLException
     {
-        return new PathResource(this.path.getFileSystem().getPath(path.toString(), apath));
+        String cpath = URIUtil.canonicalPath(subpath);
+
+        if ((cpath == null) || (cpath.length() == 0))
+            throw new MalformedURLException();
+
+        if ("/".equals(cpath))
+            return this;
+
+        // subpaths are always under PathResource
+        // compensate for input subpaths like "/subdir"
+        // where default resolve behavior would be
+        // to treat that like an absolute path
+        return new PathResource(this.path.getFileSystem().getPath(path.toString(), subpath));
     }
 
     @Override
@@ -163,7 +308,7 @@
     @Override
     public boolean exists()
     {
-        return Files.exists(path,linkOptions);
+        return Files.exists(path,NO_FOLLOW_LINKS);
     }
 
     @Override
@@ -172,9 +317,12 @@
         return path.toFile();
     }
 
-    public boolean getFollowLinks()
+    /**
+     * @return the {@link Path} of the resource
+     */
+    public Path getPath()
     {
-        return (linkOptions != null) && (linkOptions.length > 0) && (linkOptions[0] == LinkOption.NOFOLLOW_LINKS);
+        return path;
     }
 
     @Override
@@ -233,7 +381,7 @@
     @Override
     public boolean isDirectory()
     {
-        return Files.isDirectory(path,linkOptions);
+        return Files.isDirectory(path,FOLLOW_LINKS);
     }
 
     @Override
@@ -241,7 +389,7 @@
     {
         try
         {
-            FileTime ft = Files.getLastModifiedTime(path,linkOptions);
+            FileTime ft = Files.getLastModifiedTime(path,FOLLOW_LINKS);
             return ft.toMillis();
         }
         catch (IOException e)
@@ -266,24 +414,25 @@
     }
 
     @Override
+    public boolean isAlias()
+    {
+        return this.alias!=null;
+    }
+    
+    /**
+     * The Alias as a Path.
+     * 
+     * @return the alias as a path.
+     */
+    public Path getAliasPath()
+    {
+        return this.alias;
+    }
+    
+    @Override
     public URI getAlias()
     {
-        if (Files.isSymbolicLink(path))
-        {
-            try
-            {
-                return path.toRealPath().toUri();
-            }
-            catch (IOException e)
-            {
-                LOG.debug(e);
-                return null;
-            }
-        }
-        else
-        {
-            return null;
-        }
+        return this.alias==null?null:this.alias.toUri();
     }
 
     @Override
@@ -325,8 +474,8 @@
             PathResource destRes = (PathResource)dest;
             try
             {
-                Path result = Files.move(path,destRes.path,StandardCopyOption.ATOMIC_MOVE);
-                return Files.exists(result,linkOptions);
+                Path result = Files.move(path,destRes.path);
+                return Files.exists(result,NO_FOLLOW_LINKS);
             }
             catch (IOException e)
             {
@@ -340,15 +489,22 @@
         }
     }
 
-    public void setFollowLinks(boolean followLinks)
+    @Override
+    public void copyTo(File destination) throws IOException
     {
-        if (followLinks)
+        if (isDirectory())
         {
-            linkOptions = new LinkOption[0];
+            IO.copyDir(this.path.toFile(),destination);
         }
         else
         {
-            linkOptions = new LinkOption[] { LinkOption.NOFOLLOW_LINKS };
+            Files.copy(this.path,destination.toPath());
         }
     }
+
+    @Override
+    public String toString()
+    {
+        return this.uri.toASCIIString();
+    }
 }
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/Resource.java b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/Resource.java
index 0730720..35e0cf5 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/Resource.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/Resource.java
@@ -39,6 +39,7 @@
 import org.eclipse.jetty.util.Loader;
 import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.URIUtil;
+import org.eclipse.jetty.util.UrlEncoded;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
@@ -61,7 +62,7 @@
     /**
      * Change the default setting for url connection caches.
      * Subsequent URLConnections will use this default.
-     * @param useCaches
+     * @param useCaches true to enable URL connection caches, false otherwise.
      */
     public static void setDefaultUseCaches (boolean useCaches)
     {
@@ -113,8 +114,7 @@
         {
             try
             {
-                FileResource fileResource= new FileResource(url);
-                return fileResource;
+                return new PathResource(url);
             }
             catch(Exception e)
             {
@@ -178,7 +178,7 @@
                         resource=resource.substring(2);
                     
                     File file=new File(resource).getCanonicalFile();
-                    return new FileResource(file);
+                    return new PathResource(file.toPath());
                 }
                 catch(Exception e2)
                 {
@@ -199,7 +199,7 @@
     /* ------------------------------------------------------------ */
     public static Resource newResource(File file)
     {
-        return new FileResource(file);
+        return new PathResource(file.toPath());
     }
 
     /* ------------------------------------------------------------ */
@@ -258,6 +258,8 @@
 
     /* ------------------------------------------------------------ */
     /** Find a classpath resource.
+     * @param resource the relative name of the resource
+     * @return Resource or null
      */
     public static Resource newClassPathResource(String resource)
     {
@@ -321,43 +323,52 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * Returns true if the respresened resource exists.
+     * @return true if the represented resource exists.
      */
     public abstract boolean exists();
     
 
     /* ------------------------------------------------------------ */
     /**
-     * Returns true if the respresenetd resource is a container/directory.
-     * If the resource is not a file, resources ending with "/" are
+     * @return true if the represented resource is a container/directory.
+     * if the resource is not a file, resources ending with "/" are
      * considered directories.
      */
     public abstract boolean isDirectory();
 
     /* ------------------------------------------------------------ */
     /**
-     * Returns the last modified time
+     * Time resource was last modified.
+     * 
+     * @return the last modified time as milliseconds since unix epoch
      */
     public abstract long lastModified();
 
 
     /* ------------------------------------------------------------ */
     /**
-     * Return the length of the resource
+     * Length of the resource.
+     * 
+     * @return the length of the resource
      */
     public abstract long length();
     
 
     /* ------------------------------------------------------------ */
     /**
-     * Returns an URL representing the given resource
+     * URL representing the resource.
+     * 
+     * @return an URL representing the given resource
+     * @deprecated use {{@link #getURI()}.toURL() instead.
      */
-    // TODO: should deprecate this one and only use getURI()
+    @Deprecated
     public abstract URL getURL();
 
     /* ------------------------------------------------------------ */
     /**
-     * Returns an URI representing the given resource
+     * URI representing the resource.
+     * 
+     * @return an URI representing the given resource
      */
     public URI getURI()
     {
@@ -374,8 +385,11 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * Returns an File representing the given resource or NULL if this
+     * File representing the given resource.
+     * 
+     * @return an File representing the given resource or NULL if this
      * is not possible.
+     * @throws IOException if unable to get the resource due to permissions 
      */
     public abstract File getFile()
         throws IOException;
@@ -383,47 +397,60 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * Returns the name of the resource
+     * The name of the resource.
+     * 
+     * @return the name of the resource
      */
     public abstract String getName();
     
 
     /* ------------------------------------------------------------ */
     /**
-     * Returns an input stream to the resource
+     * Input stream to the resource
+     * 
+     * @return an input stream to the resource
+     * @throws IOException if unable to open the input stream
      */
     public abstract InputStream getInputStream()
-        throws java.io.IOException;
+        throws IOException;
     
     /* ------------------------------------------------------------ */
     /**
-     * Returns an readable bytechannel to the resource or null if one is not available.
+     * Readable ByteChannel for the resource.
+     * 
+     * @return an readable bytechannel to the resource or null if one is not available.
+     * @throws IOException if unable to open the readable bytechannel for the resource.
      */
     public abstract ReadableByteChannel getReadableByteChannel()
-        throws java.io.IOException;
+        throws IOException;
 
     /* ------------------------------------------------------------ */
     /**
      * Deletes the given resource
+     * @return true if resource was found and successfully deleted, false if resource didn't exist or was unable to
+     * be deleted.
+     * @throws SecurityException if unable to delete due to permissions 
      */
-    // TODO: can throw IOException
     public abstract boolean delete()
         throws SecurityException;
     
     /* ------------------------------------------------------------ */
     /**
      * Rename the given resource
+     * @param dest the destination name for the resource
+     * @return true if the resource was renamed, false if the resource didn't exist or was unable to be renamed.
+     * @throws SecurityException if unable to rename due to permissions
      */
-    // TODO: can throw IOException
-    public abstract boolean renameTo( Resource dest)
+    public abstract boolean renameTo(Resource dest)
         throws SecurityException;
     
     /* ------------------------------------------------------------ */
     /**
-     * Returns a list of resource names contained in the given resource
-     * The resource names are not URL encoded.
+     * list of resource names contained in the given resource.
+     * 
+     * @return a list of resource names contained in the given resource.
+     * Note: The resource names are not URL encoded.
      */
-    // TODO: can throw IOException
     public abstract String[] list();
 
     /* ------------------------------------------------------------ */
@@ -431,6 +458,9 @@
      * Returns the resource contained inside the current resource with the
      * given name.
      * @param path The path segment to add, which is not encoded
+     * @return the Resource for the resolved path within this Resource.
+     * @throws IOException if unable to resolve the path
+     * @throws MalformedURLException if the resolution of the path fails because the input path parameter is malformed.
      */
     public abstract Resource addPath(String path)
         throws IOException,MalformedURLException;
@@ -458,24 +488,40 @@
 
     /* ------------------------------------------------------------ */
     /** 
-     * @deprecated
+     * @param uri the uri to encode
+     * @return null (this is deprecated)
+     * @deprecated use {@link URIUtil} or {@link UrlEncoded} instead
      */
+    @Deprecated
     public String encode(String uri)
     {
         return null;
     }
         
     /* ------------------------------------------------------------ */
+    // FIXME: this appears to not be used
+    @SuppressWarnings("javadoc")
     public Object getAssociate()
     {
         return _associate;
     }
 
     /* ------------------------------------------------------------ */
+    // FIXME: this appear to not be used
+    @SuppressWarnings("javadoc")
     public void setAssociate(Object o)
     {
         _associate=o;
     }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @return true if this Resource is an alias to another real Resource
+     */
+    public boolean isAlias()
+    {
+        return getAlias()!=null;
+    }
     
     /* ------------------------------------------------------------ */
     /**
@@ -491,6 +537,7 @@
      * @param base The base URL
      * @param parent True if the parent directory should be included
      * @return String of HTML
+     * @throws IOException if unable to get the list of resources as HTML
      */
     public String getListHTML(String base,boolean parent)
         throws IOException
@@ -618,9 +665,10 @@
     
     /* ------------------------------------------------------------ */
     /** 
-     * @param out 
+     * @param out the output stream to write to 
      * @param start First byte to write
      * @param count Bytes to write or -1 for all of them.
+     * @throws IOException if unable to copy the Resource to the output
      */
     public void writeTo(OutputStream out,long start,long count)
         throws IOException
@@ -636,11 +684,20 @@
     }    
     
     /* ------------------------------------------------------------ */
+    /**
+     * Copy the Resource to the new destination file.
+     * <p>
+     * Will not replace existing destination file.
+     * 
+     * @param destination the destination file to create
+     * @throws IOException if unable to copy the resource
+     */
     public void copyTo(File destination)
         throws IOException
     {
         if (destination.exists())
-            throw new IllegalArgumentException(destination+" exists");
+            throw new IllegalArgumentException(destination + " exists");
+        
         try (OutputStream out = new FileOutputStream(destination))
         {
             writeTo(out,0,-1);
@@ -648,8 +705,18 @@
     }
 
     /* ------------------------------------------------------------ */
+    /**
+     * Generate a weak ETag reference for this Resource.
+     * 
+     * @return the weak ETag reference for this resource.
+     */
     public String getWeakETag()
     {
+        return getWeakETag("");
+    }
+    
+    public String getWeakETag(String suffix)
+    {
         try
         {
             StringBuilder b = new StringBuilder(32);
@@ -663,6 +730,7 @@
             
             B64Code.encode(lastModified()^lhash,b);
             B64Code.encode(length()^lhash,b);
+            b.append(suffix);
             b.append('"');
             return b.toString();
         } 
@@ -704,7 +772,7 @@
     /** Generate a properly encoded URL from a {@link File} instance.
      * @param file Target file. 
      * @return URL of the target file.
-     * @throws MalformedURLException 
+     * @throws MalformedURLException if unable to convert File to URL
      */
     public static URL toURL(File file) throws MalformedURLException
     {
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/ResourceCollection.java b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/ResourceCollection.java
index 960956f..e72ddae 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/ResourceCollection.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/ResourceCollection.java
@@ -248,10 +248,10 @@
     
     /* ------------------------------------------------------------ */
     /**
-     * @param path
+     * @param path the path to look for
      * @return the resource(file) if found, returns a list of resource dirs if its a dir, else null.
-     * @throws IOException
-     * @throws MalformedURLException
+     * @throws IOException if unable to look for path
+     * @throws MalformedURLException if failed to look for path due to url issue
      */
     protected Object findResource(String path) throws IOException, MalformedURLException
     {        
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/URLResource.java b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/URLResource.java
index 793b4e0..a24364b 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/resource/URLResource.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/resource/URLResource.java
@@ -221,9 +221,11 @@
      * the url protocol. Eg JarURLConnection does not reuse inputstreams.
      * 
      * @param resetConnection if true the connection field is set to null
+     * @return the inputstream for this resource
+     * @throws IOException if unable to open the input stream
      */
     protected synchronized InputStream getInputStream(boolean resetConnection)
-        throws java.io.IOException
+        throws IOException
     {
         if (!checkConnection())
             throw new IOException( "Invalid resource");
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/security/CertificateUtils.java b/jetty-util/src/main/java/org/eclipse/jetty/util/security/CertificateUtils.java
index 1a65d75..632a099 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/security/CertificateUtils.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/security/CertificateUtils.java
@@ -29,37 +29,27 @@
 public class CertificateUtils
 {
     /* ------------------------------------------------------------ */
-    public static KeyStore getKeyStore(InputStream storeStream, String storePath, String storeType, String storeProvider, String storePassword) throws Exception
+    public static KeyStore getKeyStore(Resource store, String storeType, String storeProvider, String storePassword) throws Exception
     {
         KeyStore keystore = null;
 
-        if (storeStream != null || storePath != null)
+        if (store != null)
         {
-            InputStream inStream = storeStream;
-            try
+            if (storeProvider != null)
             {
-                if (inStream == null)
-                {
-                    inStream = Resource.newResource(storePath).getInputStream();
-                }
-                
-                if (storeProvider != null)
-                {
-                    keystore = KeyStore.getInstance(storeType, storeProvider);
-                }
-                else
-                {
-                    keystore = KeyStore.getInstance(storeType);
-                }
-    
-                keystore.load(inStream, storePassword == null ? null : storePassword.toCharArray());
+                keystore = KeyStore.getInstance(storeType, storeProvider);
             }
-            finally
+            else
             {
-                if (inStream != null)
-                {
-                    inStream.close();
-                }
+                keystore = KeyStore.getInstance(storeType);
+            }
+            
+            if (!store.exists())
+                throw new IllegalStateException("no valid keystore");
+            
+            try (InputStream inStream = store.getInputStream())
+            {
+                keystore.load(inStream, storePassword == null ? null : storePassword.toCharArray());
             }
         }
         
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/security/CertificateValidator.java b/jetty-util/src/main/java/org/eclipse/jetty/util/security/CertificateValidator.java
index cf4eeb3..22ffd77 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/security/CertificateValidator.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/security/CertificateValidator.java
@@ -72,8 +72,8 @@
     /**
      * creates an instance of the certificate validator 
      *
-     * @param trustStore 
-     * @param crls
+     * @param trustStore the truststore to use 
+     * @param crls the Certificate Revocation List to use 
      */
     public CertificateValidator(KeyStore trustStore, Collection<? extends CRL> crls)
     {
@@ -89,8 +89,8 @@
     /**
      * validates all aliases inside of a given keystore
      * 
-     * @param keyStore
-     * @throws CertificateException
+     * @param keyStore the keystore to validate
+     * @throws CertificateException if keystore error and unable to validate 
      */
     public void validate( KeyStore keyStore ) throws CertificateException
     {
@@ -116,10 +116,10 @@
     /**
      * validates a specific alias inside of the keystore being passed in
      * 
-     * @param keyStore
-     * @param keyAlias
+     * @param keyStore the keystore to validate
+     * @param keyAlias the keyalias in the keystore to valid with
      * @return the keyAlias if valid
-     * @throws CertificateException
+     * @throws CertificateException if keystore error and unable to validate
      */
     public String validate(KeyStore keyStore, String keyAlias) throws CertificateException
     {
@@ -146,9 +146,9 @@
     /**
      * validates a specific certificate inside of the keystore being passed in
      * 
-     * @param keyStore
-     * @param cert
-     * @throws CertificateException
+     * @param keyStore the keystore to validate against
+     * @param cert the certificate to validate
+     * @throws CertificateException if keystore error and unable to validate
      */
     public void validate(KeyStore keyStore, Certificate cert) throws CertificateException
     {
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/security/Constraint.java b/jetty-util/src/main/java/org/eclipse/jetty/util/security/Constraint.java
index f159ed5..72fb579 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/security/Constraint.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/security/Constraint.java
@@ -21,13 +21,10 @@
 import java.io.Serializable;
 import java.util.Arrays;
 
-/* ------------------------------------------------------------ */
 /**
  * Constraint
  * 
  * Describe an auth and/or data constraint.
- * 
- * 
  */
 public class Constraint implements Cloneable, Serializable
 {
@@ -93,10 +90,10 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * Conveniance Constructor.
+     * Convenience Constructor.
      * 
-     * @param name
-     * @param role
+     * @param name the name
+     * @param role the role
      */
     public Constraint(String name, String role)
     {
@@ -113,7 +110,7 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * @param name
+     * @param name the name
      */
     public void setName(String name)
     {
@@ -172,7 +169,7 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * @param role
+     * @param role the role
      * @return True if the constraint contains the role.
      */
     public boolean hasRole(String role)
@@ -212,7 +209,7 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * @param c Data constrain indicator: 0=DC+NONE, 1=DC_INTEGRAL &
+     * @param c Data constrain indicator: 0=DC+NONE, 1=DC_INTEGRAL &amp;
      *                2=DC_CONFIDENTIAL
      */
     public void setDataConstraint(int c)
@@ -223,7 +220,7 @@
 
     /* ------------------------------------------------------------ */
     /**
-     * @return Data constrain indicator: 0=DC+NONE, 1=DC_INTEGRAL &
+     * @return Data constrain indicator: 0=DC+NONE, 1=DC_INTEGRAL &amp;
      *         2=DC_CONFIDENTIAL
      */
     public int getDataConstraint()
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/security/Password.java b/jetty-util/src/main/java/org/eclipse/jetty/util/security/Password.java
index a443849..27a74f7 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/security/Password.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/security/Password.java
@@ -245,15 +245,11 @@
         return new Password(passwd);
     }
 
-    /* ------------------------------------------------------------ */
-    /**
-     * @param arg
-     */
     public static void main(String[] arg)
     {
         if (arg.length != 1 && arg.length != 2)
         {
-            System.err.println("Usage - java org.eclipse.jetty.security.Password [<user>] <password>");
+            System.err.println("Usage - java " + Password.class.getName() + " [<user>] <password>");
             System.err.println("If the password is ?, the user will be prompted for the password");
             System.exit(1);
         }
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/AliasedX509ExtendedKeyManager.java b/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/AliasedX509ExtendedKeyManager.java
index d56b123..380243c 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/AliasedX509ExtendedKeyManager.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/AliasedX509ExtendedKeyManager.java
@@ -25,106 +25,123 @@
 
 import javax.net.ssl.SSLEngine;
 import javax.net.ssl.X509ExtendedKeyManager;
-import javax.net.ssl.X509KeyManager;
 
-
-/* ------------------------------------------------------------ */
 /**
- * KeyManager to select a key with desired alias
- * while delegating processing to specified KeyManager
- * Can be used both with server and client sockets
+ * <p>An {@link X509ExtendedKeyManager} that select a key with desired alias,
+ * delegating other processing to a nested X509ExtendedKeyManager.</p>
+ * <p>Can be used both with server and client sockets.</p>
  */
 public class AliasedX509ExtendedKeyManager extends X509ExtendedKeyManager
 {
-    private String _keyAlias;
-    private X509KeyManager _keyManager;
+    private final String _alias;
+    private final X509ExtendedKeyManager _delegate;
 
-    /* ------------------------------------------------------------ */
-    /**
-     * Construct KeyManager instance
-     * @param keyAlias Alias of the key to be selected
-     * @param keyManager Instance of KeyManager to be wrapped
-     * @throws Exception
-     */
-    public AliasedX509ExtendedKeyManager(String keyAlias, X509KeyManager keyManager) throws Exception
+    public AliasedX509ExtendedKeyManager(X509ExtendedKeyManager keyManager, String keyAlias)
     {
-        _keyAlias = keyAlias;
-        _keyManager = keyManager;
+        _alias = keyAlias;
+        _delegate = keyManager;
     }
 
-    /* ------------------------------------------------------------ */
-    /**
-     * @see javax.net.ssl.X509KeyManager#chooseClientAlias(java.lang.String[], java.security.Principal[], java.net.Socket)
-     */
+    public X509ExtendedKeyManager getDelegate()
+    {
+        return _delegate;
+    }
+
+    @Override
     public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket)
     {
-        return _keyAlias == null ? _keyManager.chooseClientAlias(keyType, issuers, socket) : _keyAlias;
+        if (_alias==null)
+            return _delegate.chooseClientAlias(keyType,issuers,socket);
+
+        for (String kt : keyType)
+        {
+            String[] aliases = _delegate.getClientAliases(kt,issuers);
+            if (aliases!=null)
+            {
+                for (String a:aliases)
+                    if (_alias.equals(a))
+                        return _alias;
+            }
+        }
+
+        return null;
     }
 
-    /* ------------------------------------------------------------ */
-    /**
-     * @see javax.net.ssl.X509KeyManager#chooseServerAlias(java.lang.String, java.security.Principal[], java.net.Socket)
-     */
+    @Override
     public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket)
     {
-        return _keyAlias == null ? _keyManager.chooseServerAlias(keyType, issuers, socket) : _keyAlias;
+        if (_alias==null)
+            return _delegate.chooseServerAlias(keyType,issuers,socket);
+
+        String[] aliases = _delegate.getServerAliases(keyType,issuers);
+        if (aliases!=null)
+        {
+            for (String a:aliases)
+                if (_alias.equals(a))
+                    return _alias;
+        }
+
+        return null;
     }
 
-    /* ------------------------------------------------------------ */
-    /**
-     * @see javax.net.ssl.X509KeyManager#getClientAliases(java.lang.String, java.security.Principal[])
-     */
+    @Override
     public String[] getClientAliases(String keyType, Principal[] issuers)
     {
-        return _keyManager.getClientAliases(keyType, issuers);
+        return _delegate.getClientAliases(keyType, issuers);
     }
 
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see javax.net.ssl.X509KeyManager#getServerAliases(java.lang.String, java.security.Principal[])
-     */
+    @Override
     public String[] getServerAliases(String keyType, Principal[] issuers)
     {
-        return _keyManager.getServerAliases(keyType, issuers);
+        return _delegate.getServerAliases(keyType, issuers);
     }
 
-    /* ------------------------------------------------------------ */
-    /**
-     * @see javax.net.ssl.X509KeyManager#getCertificateChain(java.lang.String)
-     */
+    @Override
     public X509Certificate[] getCertificateChain(String alias)
     {
-        return _keyManager.getCertificateChain(alias);
+        return _delegate.getCertificateChain(alias);
     }
 
-    /* ------------------------------------------------------------ */
-    /**
-     * @see javax.net.ssl.X509KeyManager#getPrivateKey(java.lang.String)
-     */
+    @Override
     public PrivateKey getPrivateKey(String alias)
     {
-        return _keyManager.getPrivateKey(alias);
+        return _delegate.getPrivateKey(alias);
     }
 
-    /* ------------------------------------------------------------ */
-    /**
-     * @see javax.net.ssl.X509ExtendedKeyManager#chooseEngineServerAlias(java.lang.String, java.security.Principal[], javax.net.ssl.SSLEngine)
-     */
     @Override
     public String chooseEngineServerAlias(String keyType, Principal[] issuers, SSLEngine engine)
     {
-        return _keyAlias == null ? super.chooseEngineServerAlias(keyType,issuers,engine) : _keyAlias;
+        if (_alias==null)
+            return _delegate.chooseEngineServerAlias(keyType,issuers,engine);
+
+        String[] aliases = _delegate.getServerAliases(keyType,issuers);
+        if (aliases!=null)
+        {
+            for (String a:aliases)
+                if (_alias.equals(a))
+                    return _alias;
+        }
+
+        return null;
     }
 
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see javax.net.ssl.X509ExtendedKeyManager#chooseEngineClientAlias(String[], Principal[], SSLEngine)
-     */
     @Override
     public String chooseEngineClientAlias(String keyType[], Principal[] issuers, SSLEngine engine)
     {
-        return _keyAlias == null ? super.chooseEngineClientAlias(keyType,issuers,engine) : _keyAlias;
+        if (_alias==null)
+            return _delegate.chooseEngineClientAlias(keyType,issuers,engine);
+
+        for (String kt : keyType)
+        {
+            String[] aliases = _delegate.getClientAliases(kt,issuers);
+            if (aliases!=null)
+            {
+                for (String a:aliases)
+                    if (_alias.equals(a))
+                        return _alias;
+            }
+        }
+
+        return null;
     }
 }
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/AliasedX509KeyManager.java b/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/AliasedX509KeyManager.java
deleted file mode 100644
index 509f53e..0000000
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/AliasedX509KeyManager.java
+++ /dev/null
@@ -1,107 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.util.ssl;
-
-import java.net.Socket;
-import java.security.Principal;
-import java.security.PrivateKey;
-import java.security.cert.X509Certificate;
-
-import javax.net.ssl.X509KeyManager;
-
-
-/* ------------------------------------------------------------ */
-/**
- * KeyManager to select a key with desired alias
- * while delegating processing to specified KeyManager
- * Can be used both with server and client sockets
- */
-public class AliasedX509KeyManager implements X509KeyManager
-{
-    private String _keyAlias;
-    private X509KeyManager _keyManager;
-
-    /* ------------------------------------------------------------ */
-    /**
-     * Construct KeyManager instance
-     * @param keyAlias Alias of the key to be selected
-     * @param keyManager Instance of KeyManager to be wrapped
-     * @throws Exception
-     */
-    public AliasedX509KeyManager(String keyAlias, X509KeyManager keyManager) throws Exception
-    {
-        _keyAlias = keyAlias;
-        _keyManager = keyManager;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see javax.net.ssl.X509KeyManager#chooseClientAlias(java.lang.String[], java.security.Principal[], java.net.Socket)
-     */
-    public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket)
-    {
-        return _keyAlias == null ? _keyManager.chooseClientAlias(keyType, issuers, socket) : _keyAlias;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see javax.net.ssl.X509KeyManager#chooseServerAlias(java.lang.String, java.security.Principal[], java.net.Socket)
-     */
-    public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket)
-    {
-        return _keyAlias == null ?_keyManager.chooseServerAlias(keyType, issuers, socket) : _keyAlias;
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see javax.net.ssl.X509KeyManager#getClientAliases(java.lang.String, java.security.Principal[])
-     */
-    public String[] getClientAliases(String keyType, Principal[] issuers)
-    {
-        return _keyManager.getClientAliases(keyType, issuers);
-    }
-
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see javax.net.ssl.X509KeyManager#getServerAliases(java.lang.String, java.security.Principal[])
-     */
-    public String[] getServerAliases(String keyType, Principal[] issuers)
-    {
-        return _keyManager.getServerAliases(keyType, issuers);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see javax.net.ssl.X509KeyManager#getCertificateChain(java.lang.String)
-     */
-    public X509Certificate[] getCertificateChain(String alias)
-    {
-        return _keyManager.getCertificateChain(alias);
-    }
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @see javax.net.ssl.X509KeyManager#getPrivateKey(java.lang.String)
-     */
-    public PrivateKey getPrivateKey(String alias)
-    {
-        return _keyManager.getPrivateKey(alias);
-    }
-}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/SniX509ExtendedKeyManager.java b/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/SniX509ExtendedKeyManager.java
new file mode 100644
index 0000000..b5118eb
--- /dev/null
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/SniX509ExtendedKeyManager.java
@@ -0,0 +1,157 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util.ssl;
+
+import java.net.Socket;
+import java.security.Principal;
+import java.security.PrivateKey;
+import java.security.cert.X509Certificate;
+import java.util.Arrays;
+import java.util.Collection;
+
+import javax.net.ssl.SNIMatcher;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.X509ExtendedKeyManager;
+
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+/**
+ * <p>A {@link X509ExtendedKeyManager} that selects a key with an alias
+ * retrieved from SNI information, delegating other processing to a nested X509ExtendedKeyManager.</p>
+ * <p>Can only be used on server side.</p>
+ */
+public class SniX509ExtendedKeyManager extends X509ExtendedKeyManager
+{
+    public static final String SNI_X509 = "org.eclipse.jetty.util.ssl.snix509";
+    private static final String NO_MATCHERS = "no_matchers";
+    private static final Logger LOG = Log.getLogger(SniX509ExtendedKeyManager.class);
+
+    private final X509ExtendedKeyManager _delegate;
+
+    public SniX509ExtendedKeyManager(X509ExtendedKeyManager keyManager)
+    {
+        _delegate = keyManager;
+    }
+
+    @Override
+    public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket)
+    {
+        return _delegate.chooseClientAlias(keyType,issuers,socket);
+    }
+
+    @Override
+    public String chooseEngineClientAlias(String[] keyType, Principal[] issuers, SSLEngine engine)
+    {
+        return _delegate.chooseEngineClientAlias(keyType,issuers,engine);
+    }
+
+    protected String chooseServerAlias(String keyType, Principal[] issuers, Collection<SNIMatcher> matchers, SSLSession session)
+    {
+        // Look for the aliases that are suitable for the keytype and issuers
+        String[] aliases = _delegate.getServerAliases(keyType,issuers);
+        if (aliases==null || aliases.length==0)
+            return null;
+
+        // Look for the SNI information.
+        String host=null;
+        X509 x509=null;
+        if (matchers!=null)
+        {
+            for (SNIMatcher m : matchers)
+            {
+                if (m instanceof SslContextFactory.AliasSNIMatcher)
+                {
+                    SslContextFactory.AliasSNIMatcher matcher = (SslContextFactory.AliasSNIMatcher)m;
+                    host=matcher.getHost();
+                    x509=matcher.getX509();
+                    break;
+                }
+            }
+        }
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("Matched {} with {} from {}",host,x509,Arrays.asList(aliases));
+
+        // Check if the SNI selected alias is allowable
+        if (x509!=null)
+        {
+            for (String a:aliases)
+            {
+                if (a.equals(x509.getAlias()))
+                {
+                    session.putValue(SNI_X509,x509);
+                    return a;
+                }
+            }
+            return null;
+        }
+        return NO_MATCHERS;
+    }
+
+    @Override
+    public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket)
+    {
+        SSLSocket sslSocket = (SSLSocket)socket;
+
+        String alias = chooseServerAlias(keyType,issuers,sslSocket.getSSLParameters().getSNIMatchers(),sslSocket.getHandshakeSession());
+        if (alias==NO_MATCHERS)
+            alias=_delegate.chooseServerAlias(keyType,issuers,socket);
+        if (LOG.isDebugEnabled())
+            LOG.debug("Chose alias {}/{} on {}",alias,keyType,socket);
+        return alias;
+    }
+
+    @Override
+    public String chooseEngineServerAlias(String keyType, Principal[] issuers, SSLEngine engine)
+    {
+        String alias = chooseServerAlias(keyType,issuers,engine.getSSLParameters().getSNIMatchers(),engine.getHandshakeSession());
+        if (alias==NO_MATCHERS)
+            alias=_delegate.chooseEngineServerAlias(keyType,issuers,engine);
+        if (LOG.isDebugEnabled())
+            LOG.debug("Chose alias {}/{} on {}",alias,keyType,engine);
+        return alias;
+    }
+
+    @Override
+    public X509Certificate[] getCertificateChain(String alias)
+    {
+        return _delegate.getCertificateChain(alias);
+    }
+
+    @Override
+    public String[] getClientAliases(String keyType, Principal[] issuers)
+    {
+        return _delegate.getClientAliases(keyType,issuers);
+    }
+
+    @Override
+    public PrivateKey getPrivateKey(String alias)
+    {
+        return _delegate.getPrivateKey(alias);
+    }
+
+    @Override
+    public String[] getServerAliases(String keyType, Principal[] issuers)
+    {
+        return _delegate.getServerAliases(keyType,issuers);
+    }
+}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/SslContextFactory.java b/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/SslContextFactory.java
index cf2e2a7..0ed0dcd 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/SslContextFactory.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/SslContextFactory.java
@@ -19,12 +19,10 @@
 package org.eclipse.jetty.util.ssl;
 
 import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
-import java.security.InvalidParameterException;
+import java.net.MalformedURLException;
 import java.security.KeyStore;
 import java.security.SecureRandom;
 import java.security.Security;
@@ -35,19 +33,26 @@
 import java.security.cert.PKIXBuilderParameters;
 import java.security.cert.X509CertSelector;
 import java.security.cert.X509Certificate;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import javax.net.ssl.CertPathTrustManagerParameters;
 import javax.net.ssl.KeyManager;
 import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SNIHostName;
+import javax.net.ssl.SNIMatcher;
+import javax.net.ssl.SNIServerName;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLEngine;
 import javax.net.ssl.SSLParameters;
@@ -57,12 +62,13 @@
 import javax.net.ssl.SSLSession;
 import javax.net.ssl.SSLSocket;
 import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.StandardConstants;
 import javax.net.ssl.TrustManager;
 import javax.net.ssl.TrustManagerFactory;
-import javax.net.ssl.X509KeyManager;
+import javax.net.ssl.X509ExtendedKeyManager;
 import javax.net.ssl.X509TrustManager;
 
-import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.component.AbstractLifeCycle;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
@@ -78,6 +84,9 @@
  * creates SSL context based on these parameters to be
  * used by the SSL connectors.
  */
+
+/**
+ */
 public class SslContextFactory extends AbstractLifeCycle
 {
     public final static TrustManager[] TRUST_ALL_CERTS = new X509TrustManager[]{new X509TrustManager()
@@ -118,32 +127,41 @@
     /** Included protocols. */
     private final Set<String> _includeProtocols = new LinkedHashSet<>();
 
+    /** Selected protocols. */
+    private String[] _selectedProtocols;
+
     /** Excluded cipher suites. */
     private final Set<String> _excludeCipherSuites = new LinkedHashSet<>();
-    
+
     /** Included cipher suites. */
-    private final Set<String> _includeCipherSuites = new LinkedHashSet<>();
+    private final List<String> _includeCipherSuites = new ArrayList<>();
+    private boolean _useCipherSuitesOrder=true;
+
+    /** Cipher comparator for ordering ciphers */
+    Comparator<String> _cipherComparator;
+
+    /** Selected cipher suites. Combination of includes, excludes, available and ordering */
+    private String[] _selectedCipherSuites;
 
     /** Keystore path. */
-    private String _keyStorePath;
+    private Resource _keyStoreResource;
     /** Keystore provider name */
     private String _keyStoreProvider;
     /** Keystore type */
     private String _keyStoreType = "JKS";
-    /** Keystore input stream */
-    private InputStream _keyStoreInputStream;
 
     /** SSL certificate alias */
     private String _certAlias;
+    private final Map<String,X509> _aliasX509 = new HashMap<>();
+    private final Map<String,X509> _certHosts = new HashMap<>();
+    private final Map<String,X509> _certWilds = new HashMap<>();
 
     /** Truststore path */
-    private String _trustStorePath;
+    private Resource _trustStoreResource;
     /** Truststore provider name */
     private String _trustStoreProvider;
     /** Truststore type */
     private String _trustStoreType = "JKS";
-    /** Truststore input stream */
-    private InputStream _trustStoreInputStream;
 
     /** Set to true if client certificate authentication is required */
     private boolean _needClientAuth = false;
@@ -151,11 +169,11 @@
     private boolean _wantClientAuth = false;
 
     /** Keystore password */
-    private transient Password _keyStorePassword;
+    private Password _keyStorePassword;
     /** Key manager password */
-    private transient Password _keyManagerPassword;
+    private Password _keyManagerPassword;
     /** Truststore password */
-    private transient Password _trustStorePassword;
+    private Password _trustStorePassword;
 
     /** SSL provider name */
     private String _sslProvider;
@@ -185,9 +203,9 @@
     private String _ocspResponderURL;
 
     /** SSL keystore */
-    private KeyStore _keyStore;
+    private KeyStore _setKeyStore;
     /** SSL truststore */
-    private KeyStore _trustStore;
+    private KeyStore _setTrustStore;
     /** Set to true to enable SSL Session caching */
     private boolean _sessionCachingEnabled = true;
     /** SSL session cache size */
@@ -196,7 +214,7 @@
     private int _sslSessionTimeout;
 
     /** SSL context */
-    private SSLContext _context;
+    private SSLContext _setContext;
 
     /** EndpointIdentificationAlgorithm - when set to "HTTPS" hostname verification will be enabled */
     private String _endpointIdentificationAlgorithm = null;
@@ -207,6 +225,11 @@
     /** Whether TLS renegotiation is allowed */
     private boolean _renegotiationAllowed = true;
 
+    protected Factory _factory;
+
+
+
+
     /**
      * Construct an instance of SslContextFactory
      * Default constructor for use in XmlConfiguration files
@@ -226,7 +249,15 @@
     {
         setTrustAll(trustAll);
         addExcludeProtocols("SSL", "SSLv2", "SSLv2Hello", "SSLv3");
-    }
+        setExcludeCipherSuites(
+                "SSL_RSA_WITH_DES_CBC_SHA",
+                "SSL_DHE_RSA_WITH_DES_CBC_SHA",
+                "SSL_DHE_DSS_WITH_DES_CBC_SHA",
+                "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
+                "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
+                "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
+                "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA");
+}
 
     /**
      * Construct an instance of SslContextFactory
@@ -234,7 +265,39 @@
      */
     public SslContextFactory(String keyStorePath)
     {
-        _keyStorePath = keyStorePath;
+        setKeyStorePath(keyStorePath);
+    }
+
+    public String[] getSelectedProtocols()
+    {
+        return Arrays.copyOf(_selectedProtocols,_selectedProtocols.length);
+    }
+
+    public String[] getSelectedCipherSuites()
+    {
+        return Arrays.copyOf(_selectedCipherSuites,_selectedCipherSuites.length);
+    }
+
+    public Comparator<String> getCipherComparator()
+    {
+        return _cipherComparator;
+    }
+
+    public void setCipherComparator(Comparator<String> cipherComparator)
+    {
+        if (cipherComparator!=null)
+            setUseCipherSuitesOrder(true);
+        _cipherComparator = cipherComparator;
+    }
+
+    public Set<String> getAliases()
+    {
+        return Collections.unmodifiableSet(_aliasX509.keySet());
+    }
+
+    public X509 getX509(String alias)
+    {
+        return _aliasX509.get(alias);
     }
 
     /**
@@ -244,10 +307,14 @@
     @Override
     protected void doStart() throws Exception
     {
-        if (_context == null)
+        SSLContext context = _setContext;
+        KeyStore keyStore = _setKeyStore;
+        KeyStore trustStore = _setTrustStore;
+
+        if (context == null)
         {
-            if (_keyStore==null && _keyStoreInputStream == null && _keyStorePath == null &&
-                _trustStore==null && _trustStoreInputStream == null && _trustStorePath == null )
+            // Is this an empty factory?
+            if (keyStore==null && _keyStoreResource == null && trustStore==null && _trustStoreResource == null )
             {
                 TrustManager[] trust_managers=null;
 
@@ -260,66 +327,93 @@
                 }
 
                 SecureRandom secureRandom = (_secureRandomAlgorithm == null)?null:SecureRandom.getInstance(_secureRandomAlgorithm);
-                SSLContext context = _sslProvider == null ? SSLContext.getInstance(_sslProtocol) : SSLContext.getInstance(_sslProtocol, _sslProvider);
+                context = _sslProvider == null ? SSLContext.getInstance(_sslProtocol) : SSLContext.getInstance(_sslProtocol, _sslProvider);
                 context.init(null, trust_managers, secureRandom);
-                _context = context;
             }
             else
             {
-                // verify that keystore and truststore
-                // parameters are set up correctly
-                checkKeyStore();
-
-                KeyStore keyStore = loadKeyStore();
-                KeyStore trustStore = loadTrustStore();
+                if (keyStore==null)
+                    keyStore=loadKeyStore(_keyStoreResource);
+                if (trustStore==null)
+                    trustStore=loadTrustStore(_trustStoreResource);
 
                 Collection<? extends CRL> crls = loadCRL(_crlPath);
 
-                if (_validateCerts && keyStore != null)
+                // Look for X.509 certificates to create alias map
+                _certHosts.clear();
+                if (keyStore!=null)
                 {
-                    if (_certAlias == null)
+                    for (String alias : Collections.list(keyStore.aliases()))
                     {
-                        List<String> aliases = Collections.list(keyStore.aliases());
-                        _certAlias = aliases.size() == 1 ? aliases.get(0) : null;
-                    }
+                        Certificate certificate = keyStore.getCertificate(alias);
+                        if (certificate!=null && "X.509".equals(certificate.getType()))
+                        {
+                            X509Certificate x509C = (X509Certificate)certificate;
 
-                    Certificate cert = _certAlias == null?null:keyStore.getCertificate(_certAlias);
-                    if (cert == null)
-                    {
-                        throw new Exception("No certificate found in the keystore" + (_certAlias==null ? "":" for alias " + _certAlias));
-                    }
+                            // Exclude certificates with special uses
+                            if (X509.isCertSign(x509C))
+                            {
+                                if (LOG.isDebugEnabled())
+                                    LOG.debug("Skipping "+x509C);
+                                continue;
+                            }
+                            X509 x509 = new X509(alias,x509C);
+                            _aliasX509.put(alias,x509);
 
-                    CertificateValidator validator = new CertificateValidator(trustStore, crls);
-                    validator.setMaxCertPathLength(_maxCertPathLength);
-                    validator.setEnableCRLDP(_enableCRLDP);
-                    validator.setEnableOCSP(_enableOCSP);
-                    validator.setOcspResponderURL(_ocspResponderURL);
-                    validator.validate(keyStore, cert);
+                            if (_validateCerts)
+                            {
+                                CertificateValidator validator = new CertificateValidator(trustStore, crls);
+                                validator.setMaxCertPathLength(_maxCertPathLength);
+                                validator.setEnableCRLDP(_enableCRLDP);
+                                validator.setEnableOCSP(_enableOCSP);
+                                validator.setOcspResponderURL(_ocspResponderURL);
+                                validator.validate(keyStore, x509C); // TODO what about truststore?
+                            }
+
+                            LOG.info("x509={} for {}",x509,this);
+
+                            for (String h:x509.getHosts())
+                                _certHosts.put(h,x509);
+                            for (String w:x509.getWilds())
+                                _certWilds.put(w,x509);
+                        }
+                    }
                 }
 
+                // Instantiate key and trust managers
                 KeyManager[] keyManagers = getKeyManagers(keyStore);
                 TrustManager[] trustManagers = getTrustManagers(trustStore,crls);
 
+                // Initialize context
                 SecureRandom secureRandom = (_secureRandomAlgorithm == null)?null:SecureRandom.getInstance(_secureRandomAlgorithm);
-                SSLContext context = _sslProvider == null ? SSLContext.getInstance(_sslProtocol) : SSLContext.getInstance(_sslProtocol, _sslProvider);
+                context = _sslProvider == null ? SSLContext.getInstance(_sslProtocol) : SSLContext.getInstance(_sslProtocol, _sslProvider);
                 context.init(keyManagers,trustManagers,secureRandom);
-                _context = context;
             }
+        }
 
-            SSLEngine engine = newSSLEngine();
-            if (LOG.isDebugEnabled())
-            {
-                LOG.debug("Enabled Protocols {} of {}",Arrays.asList(engine.getEnabledProtocols()),Arrays.asList(engine.getSupportedProtocols()));
-                LOG.debug("Enabled Ciphers   {} of {}",Arrays.asList(engine.getEnabledCipherSuites()),Arrays.asList(engine.getSupportedCipherSuites()));
-            }
+        // select the protocols and ciphers
+        SSLEngine sslEngine=context.createSSLEngine();
+        selectCipherSuites(
+                sslEngine.getEnabledCipherSuites(),
+                sslEngine.getSupportedCipherSuites());
+        selectProtocols(sslEngine.getEnabledProtocols(),sslEngine.getSupportedProtocols());
+
+        _factory = new Factory(keyStore,trustStore,context);
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("Selected Protocols {} of {}",Arrays.asList(_selectedProtocols),Arrays.asList(sslEngine.getSupportedProtocols()));
+            LOG.debug("Selected Ciphers   {} of {}",Arrays.asList(_selectedCipherSuites),Arrays.asList(sslEngine.getSupportedCipherSuites()));
         }
     }
 
     @Override
     protected void doStop() throws Exception
     {
-        _context = null;
+        _factory = null;
         super.doStop();
+        _certHosts.clear();
+        _certWilds.clear();
+        _aliasX509.clear();
     }
 
     /**
@@ -426,12 +520,22 @@
         _includeCipherSuites.addAll(Arrays.asList(cipherSuites));
     }
 
+    public boolean isUseCipherSuitesOrder()
+    {
+        return _useCipherSuitesOrder;
+    }
+
+    public void setUseCipherSuitesOrder(boolean useCipherSuitesOrder)
+    {
+        _useCipherSuitesOrder = useCipherSuitesOrder;
+    }
+
     /**
      * @return The file or URL of the SSL Key store.
      */
     public String getKeyStorePath()
     {
-        return _keyStorePath;
+        return _keyStoreResource.toString();
     }
 
     /**
@@ -441,7 +545,14 @@
     public void setKeyStorePath(String keyStorePath)
     {
         checkNotStarted();
-        _keyStorePath = keyStorePath;
+        try
+        {
+            _keyStoreResource = Resource.newResource(keyStorePath);
+        }
+        catch (MalformedURLException e)
+        {
+            throw new IllegalArgumentException(e);
+        }
     }
 
     /**
@@ -489,6 +600,11 @@
     }
 
     /**
+     * Set the default certificate Alias.
+     * <p>This can be used if there are multiple non-SNI certificates
+     * to specify the certificate that should be used, or with SNI
+     * certificates to set a certificate to try if no others match
+     * </p>
      * @param certAlias
      *            Alias of SSL certificate for the connector
      */
@@ -499,21 +615,20 @@
     }
 
     /**
-     * @return The file name or URL of the trust store location
-     */
-    public String getTrustStore()
-    {
-        return _trustStorePath;
-    }
-
-    /**
      * @param trustStorePath
      *            The file name or URL of the trust store location
      */
     public void setTrustStorePath(String trustStorePath)
     {
         checkNotStarted();
-        _trustStorePath = trustStorePath;
+        try
+        {
+            _trustStoreResource = Resource.newResource(trustStorePath);
+        }
+        catch (MalformedURLException e)
+        {
+            throw new IllegalArgumentException(e);
+        }
     }
 
     /**
@@ -628,35 +743,70 @@
         _validatePeerCerts = validatePeerCerts;
     }
 
-
     /**
      * @param password
-     *            The password for the key store
+     *            The password for the key store.  If null is passed and
+     *            a keystore is set, then
+     *            the {@link Password#getPassword(String, String, String)} is used to
+     *            obtain a password either from the {@value #PASSWORD_PROPERTY}
+     *            System property or by prompting for manual entry.
      */
     public void setKeyStorePassword(String password)
     {
         checkNotStarted();
-        _keyStorePassword = Password.getPassword(PASSWORD_PROPERTY,password,null);
+        if (password==null)
+        {
+            if (_keyStoreResource!=null)
+                _keyStorePassword=Password.getPassword(PASSWORD_PROPERTY,null,null);
+            else
+                _keyStorePassword=null;
+        }
+        else
+            _keyStorePassword = new Password(password);
     }
 
     /**
      * @param password
-     *            The password (if any) for the specific key within the key store
+     *            The password (if any) for the specific key within the key store.
+     *            If null is passed and the {@value #KEYPASSWORD_PROPERTY} system property is set,
+     *            then the {@link Password#getPassword(String, String, String)} is used to
+     *            obtain a password from the {@value #KEYPASSWORD_PROPERTY}  system property.
      */
     public void setKeyManagerPassword(String password)
     {
         checkNotStarted();
-        _keyManagerPassword = Password.getPassword(KEYPASSWORD_PROPERTY,password,null);
+        if (password==null)
+        {
+            if (System.getProperty(KEYPASSWORD_PROPERTY)!=null)
+                _keyManagerPassword = Password.getPassword(KEYPASSWORD_PROPERTY,null,null);
+            else
+                _keyManagerPassword = null;
+        }
+        else
+            _keyManagerPassword = new Password(password);
     }
 
     /**
      * @param password
-     *            The password for the trust store
+     *            The password for the trust store. If null is passed and a truststore is set
+     *            that is different from the keystore, then
+     *            the {@link Password#getPassword(String, String, String)} is used to
+     *            obtain a password either from the {@value #PASSWORD_PROPERTY}
+     *            System property or by prompting for manual entry.
      */
     public void setTrustStorePassword(String password)
     {
         checkNotStarted();
-        _trustStorePassword = Password.getPassword(PASSWORD_PROPERTY,password,null);
+        if (password==null)
+        {
+            // Do we need a truststore password?
+            if (_trustStoreResource!=null && !_trustStoreResource.equals(_keyStoreResource))
+                _trustStorePassword = Password.getPassword(PASSWORD_PROPERTY,null,null);
+            else
+                _trustStorePassword = null;
+        }
+        else
+            _trustStorePassword=new Password(password);
     }
 
     /**
@@ -835,9 +985,7 @@
      */
     public SSLContext getSslContext()
     {
-        if (!isStarted())
-            throw new IllegalStateException(getState());
-        return _context;
+        return isStarted()?_factory._context:_setContext;
     }
 
     /**
@@ -847,7 +995,7 @@
     public void setSslContext(SSLContext sslContext)
     {
         checkNotStarted();
-        _context = sslContext;
+        _setContext = sslContext;
     }
 
     /**
@@ -863,27 +1011,39 @@
     /**
      * Override this method to provide alternate way to load a keystore.
      *
+     * @param resource the resource to load the keystore from
      * @return the key store instance
      * @throws Exception if the keystore cannot be loaded
      */
-    protected KeyStore loadKeyStore() throws Exception
+    protected KeyStore loadKeyStore(Resource resource) throws Exception
     {
-        return _keyStore != null ? _keyStore : CertificateUtils.getKeyStore(_keyStoreInputStream,
-                _keyStorePath, _keyStoreType, _keyStoreProvider,
-                _keyStorePassword==null? null: _keyStorePassword.toString());
+        return CertificateUtils.getKeyStore(resource, _keyStoreType, _keyStoreProvider,_keyStorePassword==null? null:_keyStorePassword.toString());
     }
 
     /**
      * Override this method to provide alternate way to load a truststore.
      *
+     * @param resource the resource to load the truststore from
      * @return the key store instance
      * @throws Exception if the truststore cannot be loaded
      */
-    protected KeyStore loadTrustStore() throws Exception
+    protected KeyStore loadTrustStore(Resource resource) throws Exception
     {
-        return _trustStore != null ? _trustStore : CertificateUtils.getKeyStore(_trustStoreInputStream,
-                _trustStorePath, _trustStoreType,  _trustStoreProvider,
-                _trustStorePassword==null? null: _trustStorePassword.toString());
+        String type=_trustStoreType;
+        String provider= _trustStoreProvider;
+        String passwd=_trustStorePassword==null? null:_trustStorePassword.toString();
+        if (resource==null || resource.equals(_keyStoreResource))
+        {
+            resource=_keyStoreResource;
+            if (type==null)
+                type=_keyStoreType;
+            if (provider==null)
+                provider= _keyStoreProvider;
+            if (passwd==null)
+                passwd=_keyStorePassword==null? null:_keyStorePassword.toString();
+        }
+
+        return CertificateUtils.getKeyStore(resource,type,provider,passwd);
     }
 
     /**
@@ -911,18 +1071,30 @@
             keyManagerFactory.init(keyStore,_keyManagerPassword == null?(_keyStorePassword == null?null:_keyStorePassword.toString().toCharArray()):_keyManagerPassword.toString().toCharArray());
             managers = keyManagerFactory.getKeyManagers();
 
-            if (_certAlias != null)
+            if (managers!=null)
             {
-                for (int idx = 0; idx < managers.length; idx++)
+                if (_certAlias != null)
                 {
-                    if (managers[idx] instanceof X509KeyManager)
+                    for (int idx = 0; idx < managers.length; idx++)
                     {
-                        managers[idx] = new AliasedX509ExtendedKeyManager(_certAlias,(X509KeyManager)managers[idx]);
+                        if (managers[idx] instanceof X509ExtendedKeyManager)
+                            managers[idx] = new AliasedX509ExtendedKeyManager((X509ExtendedKeyManager)managers[idx],_certAlias);
+                    }
+                }
+
+                if (!_certHosts.isEmpty() || !_certWilds.isEmpty())
+                {
+                    for (int idx = 0; idx < managers.length; idx++)
+                    {
+                        if (managers[idx] instanceof X509ExtendedKeyManager)
+                            managers[idx]=new SniX509ExtendedKeyManager((X509ExtendedKeyManager)managers[idx]);
                     }
                 }
             }
         }
 
+        LOG.debug("managers={} for {}",managers,this);
+
         return managers;
     }
 
@@ -983,60 +1155,13 @@
     }
 
     /**
-     * Check KeyStore Configuration. Ensures that if keystore has been
-     * configured but there's no truststore, that keystore is
-     * used as truststore.
-     * @throws IllegalStateException if SslContextFactory configuration can't be used.
-     */
-    public void checkKeyStore()
-    {
-        if (_context != null)
-            return;
-
-        if (_keyStore == null && _keyStoreInputStream == null && _keyStorePath == null)
-            throw new IllegalStateException("SSL doesn't have a valid keystore");
-
-        // if the keystore has been configured but there is no
-        // truststore configured, use the keystore as the truststore
-        if (_trustStore == null && _trustStoreInputStream == null && _trustStorePath == null)
-        {
-            _trustStore = _keyStore;
-            _trustStorePath = _keyStorePath;
-            _trustStoreInputStream = _keyStoreInputStream;
-            _trustStoreType = _keyStoreType;
-            _trustStoreProvider = _keyStoreProvider;
-            _trustStorePassword = _keyStorePassword;
-            _trustManagerFactoryAlgorithm = _keyManagerFactoryAlgorithm;
-        }
-
-        // It's the same stream we cannot read it twice, so read it once in memory
-        if (_keyStoreInputStream != null && _keyStoreInputStream == _trustStoreInputStream)
-        {
-            try
-            {
-                ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                IO.copy(_keyStoreInputStream, baos);
-                _keyStoreInputStream.close();
-
-                _keyStoreInputStream = new ByteArrayInputStream(baos.toByteArray());
-                _trustStoreInputStream = new ByteArrayInputStream(baos.toByteArray());
-            }
-            catch (Exception ex)
-            {
-                throw new IllegalStateException(ex);
-            }
-        }
-    }
-
-    /**
      * Select protocols to be used by the connector
      * based on configured inclusion and exclusion lists
      * as well as enabled and supported protocols.
      * @param enabledProtocols Array of enabled protocols
      * @param supportedProtocols Array of supported protocols
-     * @return Array of protocols to enable
      */
-    public String[] selectProtocols(String[] enabledProtocols, String[] supportedProtocols)
+    public void selectProtocols(String[] enabledProtocols, String[] supportedProtocols)
     {
         Set<String> selected_protocols = new LinkedHashSet<>();
 
@@ -1045,8 +1170,12 @@
         {
             // Use only the supported included protocols
             for (String protocol : _includeProtocols)
+            {
                 if(Arrays.asList(supportedProtocols).contains(protocol))
                     selected_protocols.add(protocol);
+                else
+                    LOG.info("Protocol {} not supported in {}",protocol,Arrays.asList(supportedProtocols));
+            }
         }
         else
             selected_protocols.addAll(Arrays.asList(enabledProtocols));
@@ -1055,7 +1184,14 @@
         // Remove any excluded protocols
         selected_protocols.removeAll(_excludeProtocols);
 
-        return selected_protocols.toArray(new String[selected_protocols.size()]);
+
+        if (selected_protocols.isEmpty())
+            LOG.warn("No selected protocols from {}",Arrays.asList(supportedProtocols));
+
+        _selectedProtocols = selected_protocols.toArray(new String[selected_protocols.size()]);
+
+
+
     }
 
     /**
@@ -1064,11 +1200,10 @@
      * as well as enabled and supported cipher suite lists.
      * @param enabledCipherSuites Array of enabled cipher suites
      * @param supportedCipherSuites Array of supported cipher suites
-     * @return Array of cipher suites to enable
      */
-    public String[] selectCipherSuites(String[] enabledCipherSuites, String[] supportedCipherSuites)
+    protected void selectCipherSuites(String[] enabledCipherSuites, String[] supportedCipherSuites)
     {
-        Set<String> selected_ciphers = new CopyOnWriteArraySet<>();
+        List<String> selected_ciphers = new ArrayList<>();
 
         // Set the starting ciphers - either from the included or enabled list
         if (_includeCipherSuites.isEmpty())
@@ -1078,33 +1213,51 @@
 
         removeExcludedCipherSuites(selected_ciphers);
 
-        return selected_ciphers.toArray(new String[selected_ciphers.size()]);
+        if (selected_ciphers.isEmpty())
+            LOG.warn("No supported ciphers from {}",Arrays.asList(supportedCipherSuites));
+
+        if (_cipherComparator!=null)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Sorting selected ciphers with {}",_cipherComparator);
+            Collections.sort(selected_ciphers,_cipherComparator);
+        }
+
+        _selectedCipherSuites=selected_ciphers.toArray(new String[selected_ciphers.size()]);
     }
 
-    protected void processIncludeCipherSuites(String[] supportedCipherSuites, Set<String> selected_ciphers)
+    protected void processIncludeCipherSuites(String[] supportedCipherSuites, List<String> selected_ciphers)
     {
         for (String cipherSuite : _includeCipherSuites)
         {
             Pattern p = Pattern.compile(cipherSuite);
+            boolean added=false;
             for (String supportedCipherSuite : supportedCipherSuites)
             {
                 Matcher m = p.matcher(supportedCipherSuite);
                 if (m.matches())
+                {
+                    added=true;
                     selected_ciphers.add(supportedCipherSuite);
+                }
+
             }
+            if (!added)
+                LOG.info("No Cipher matching '{}' is supported",cipherSuite);
         }
     }
 
-    protected void removeExcludedCipherSuites(Set<String> selected_ciphers)
+    protected void removeExcludedCipherSuites(List<String> selected_ciphers)
     {
         for (String excludeCipherSuite : _excludeCipherSuites)
         {
             Pattern excludeCipherPattern = Pattern.compile(excludeCipherSuite);
-            for (String selectedCipherSuite : selected_ciphers)
+            for (Iterator<String> i=selected_ciphers.iterator();i.hasNext();)
             {
+                String selectedCipherSuite = i.next();
                 Matcher m = excludeCipherPattern.matcher(selectedCipherSuite);
                 if (m.matches())
-                    selected_ciphers.remove(selectedCipherSuite);
+                    i.remove();
             }
         }
     }
@@ -1119,6 +1272,24 @@
     }
 
     /**
+     * Check if the lifecycle has been started and throw runtime exception
+     */
+    protected void checkIsStarted()
+    {
+        if (!isStarted())
+            throw new IllegalStateException("!STARTED: "+this);
+    }
+
+    /**
+     * Check if the lifecycle has been started and throw runtime exception
+     */
+    protected void checkIsRunning()
+    {
+        if (!isRunning())
+            throw new IllegalStateException("!RUNNING: "+this);
+    }
+
+    /**
      * @return true if CRL Distribution Points support is enabled
      */
     public boolean isEnableCRLDP()
@@ -1175,7 +1346,12 @@
     public void setKeyStore(KeyStore keyStore)
     {
         checkNotStarted();
-        _keyStore = keyStore;
+        _setKeyStore = keyStore;
+    }
+
+    public KeyStore getKeyStore()
+    {
+        return isStarted()?_factory._keyStore:_setKeyStore;
     }
 
     /** Set the trust store.
@@ -1184,7 +1360,12 @@
     public void setTrustStore(KeyStore trustStore)
     {
         checkNotStarted();
-        _trustStore = trustStore;
+        _setTrustStore = trustStore;
+    }
+
+    public KeyStore getTrustStore()
+    {
+        return isStarted()?_factory._trustStore:_setTrustStore;
     }
 
     /** Set the key store resource.
@@ -1193,15 +1374,12 @@
     public void setKeyStoreResource(Resource resource)
     {
         checkNotStarted();
-        try
-        {
-            _keyStoreInputStream = resource.getInputStream();
-        }
-        catch (IOException e)
-        {
-             throw new InvalidParameterException("Unable to get resource "+
-                     "input stream for resource "+resource.toString());
-        }
+        _keyStoreResource=resource;
+    }
+
+    public Resource getKeyStoreResource()
+    {
+        return _keyStoreResource;
     }
 
     /** Set the trust store resource.
@@ -1210,15 +1388,12 @@
     public void setTrustStoreResource(Resource resource)
     {
         checkNotStarted();
-        try
-        {
-            _trustStoreInputStream = resource.getInputStream();
-        }
-        catch (IOException e)
-        {
-             throw new InvalidParameterException("Unable to get resource "+
-                     "input stream for resource "+resource.toString());
-        }
+        _trustStoreResource=resource;
+    }
+
+    public Resource getTrustStoreResource()
+    {
+        return _trustStoreResource;
     }
 
     /**
@@ -1272,7 +1447,9 @@
 
     public SSLServerSocket newSslServerSocket(String host,int port,int backlog) throws IOException
     {
-        SSLServerSocketFactory factory = _context.getServerSocketFactory();
+        checkIsStarted();
+
+        SSLServerSocketFactory factory = _factory._context.getServerSocketFactory();
 
         SSLServerSocket socket =
             (SSLServerSocket) (host==null ?
@@ -1284,17 +1461,17 @@
         if (getNeedClientAuth())
             socket.setNeedClientAuth(getNeedClientAuth());
 
-        socket.setEnabledCipherSuites(selectCipherSuites(
-                                            socket.getEnabledCipherSuites(),
-                                            socket.getSupportedCipherSuites()));
-        socket.setEnabledProtocols(selectProtocols(socket.getEnabledProtocols(),socket.getSupportedProtocols()));
+        socket.setEnabledCipherSuites(_selectedCipherSuites);
+        socket.setEnabledProtocols(_selectedProtocols);
 
         return socket;
     }
 
     public SSLSocket newSslSocket() throws IOException
     {
-        SSLSocketFactory factory = _context.getSocketFactory();
+        checkIsStarted();
+
+        SSLSocketFactory factory = _factory._context.getSocketFactory();
 
         SSLSocket socket = (SSLSocket)factory.createSocket();
 
@@ -1303,10 +1480,8 @@
         if (getNeedClientAuth())
             socket.setNeedClientAuth(getNeedClientAuth());
 
-        socket.setEnabledCipherSuites(selectCipherSuites(
-                                            socket.getEnabledCipherSuites(),
-                                            socket.getSupportedCipherSuites()));
-        socket.setEnabledProtocols(selectProtocols(socket.getEnabledProtocols(),socket.getSupportedProtocols()));
+        socket.setEnabledCipherSuites(_selectedCipherSuites);
+        socket.setEnabledProtocols(_selectedProtocols);
 
         return socket;
     }
@@ -1314,7 +1489,7 @@
     /**
      * Factory method for "scratch" {@link SSLEngine}s, usually only used for retrieving configuration
      * information such as the application buffer size or the list of protocols/ciphers.
-     * <p />
+     * <p>
      * This method should not be used for creating {@link SSLEngine}s that are used in actual socket
      * communication.
      *
@@ -1322,9 +1497,8 @@
      */
     public SSLEngine newSSLEngine()
     {
-        if (!isRunning())
-            throw new IllegalStateException("!STARTED");
-        SSLEngine sslEngine=_context.createSSLEngine();
+        checkIsRunning();
+        SSLEngine sslEngine=_factory._context.createSSLEngine();
         customize(sslEngine);
         return sslEngine;
     }
@@ -1339,28 +1513,27 @@
      */
     public SSLEngine newSSLEngine(String host, int port)
     {
-        if (!isRunning())
-            throw new IllegalStateException("!STARTED");
+        checkIsStarted();
         SSLEngine sslEngine=isSessionCachingEnabled()
-            ? _context.createSSLEngine(host, port)
-            : _context.createSSLEngine();
+            ? _factory._context.createSSLEngine(host, port)
+            : _factory._context.createSSLEngine();
         customize(sslEngine);
         return sslEngine;
     }
 
     /**
      * Server-side only factory method for creating {@link SSLEngine}s.
-     * <p />
+     * <p>
      * If the given {@code address} is null, it is equivalent to {@link #newSSLEngine()}, otherwise
      * {@link #newSSLEngine(String, int)} is called.
-     * <p />
+     * <p>
      * If {@link #getNeedClientAuth()} is {@code true}, then the host name is passed to
      * {@link #newSSLEngine(String, int)}, possibly incurring in a reverse DNS lookup, which takes time
      * and may hang the selector (since this method is usually called by the selector thread).
-     * <p />
+     * <p>
      * Otherwise, the host address is passed to {@link #newSSLEngine(String, int)} without DNS lookup
      * penalties.
-     * <p />
+     * <p>
      * Clients that wish to create {@link SSLEngine} instances must use {@link #newSSLEngine(String, int)}.
      *
      * @param address the remote peer address
@@ -1378,20 +1551,27 @@
 
     public void customize(SSLEngine sslEngine)
     {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Customize {}",sslEngine);
+
         SSLParameters sslParams = sslEngine.getSSLParameters();
         sslParams.setEndpointIdentificationAlgorithm(_endpointIdentificationAlgorithm);
-        sslEngine.setSSLParameters(sslParams);
+        sslParams.setUseCipherSuitesOrder(_useCipherSuitesOrder);
+        if (!_certHosts.isEmpty() || !_certWilds.isEmpty())
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Enable SNI matching {}",sslEngine);
+            sslParams.setSNIMatchers(Collections.singletonList((SNIMatcher)new AliasSNIMatcher()));
+        }
+        sslParams.setCipherSuites(_selectedCipherSuites);
+        sslParams.setProtocols(_selectedProtocols);
 
         if (getWantClientAuth())
-            sslEngine.setWantClientAuth(getWantClientAuth());
+            sslParams.setWantClientAuth(true);
         if (getNeedClientAuth())
-            sslEngine.setNeedClientAuth(getNeedClientAuth());
+            sslParams.setNeedClientAuth(true);
 
-        sslEngine.setEnabledCipherSuites(selectCipherSuites(
-                sslEngine.getEnabledCipherSuites(),
-                sslEngine.getSupportedCipherSuites()));
-
-        sslEngine.setEnabledProtocols(selectProtocols(sslEngine.getEnabledProtocols(),sslEngine.getSupportedProtocols()));
+        sslEngine.setSSLParameters(sslParams);
     }
 
     public static X509Certificate[] getCertChain(SSLSession sslSession)
@@ -1485,7 +1665,95 @@
         return String.format("%s@%x(%s,%s)",
                 getClass().getSimpleName(),
                 hashCode(),
-                _keyStorePath,
-                _trustStorePath);
+                _keyStoreResource,
+                _trustStoreResource);
+    }
+
+    protected class Factory
+    {
+        final KeyStore _keyStore;
+        final KeyStore _trustStore;
+        final SSLContext _context;
+
+        public Factory(KeyStore keyStore, KeyStore trustStore, SSLContext context)
+        {
+            super();
+            _keyStore = keyStore;
+            _trustStore = trustStore;
+            _context = context;
+        }
+
+        @Override
+        public String toString()
+        {
+            return String.format("SslFactory@%x{%s}",System.identityHashCode(this),SslContextFactory.this);
+        }
+    }
+
+    class AliasSNIMatcher extends SNIMatcher
+    {
+        private String _host;
+        private X509 _x509;
+
+        AliasSNIMatcher()
+        {
+            super(StandardConstants.SNI_HOST_NAME);
+        }
+
+        @Override
+        public boolean matches(SNIServerName serverName)
+        {
+            if (LOG.isDebugEnabled())
+                LOG.debug("SNI matching for {}",serverName);
+
+            if (serverName instanceof SNIHostName)
+            {
+                String host = _host = ((SNIHostName)serverName).getAsciiName();
+                host=StringUtil.asciiToLowerCase(host);
+
+                // Try an exact match
+                _x509 = _certHosts.get(host);
+
+                // Else try an exact wild match
+                if (_x509==null)
+                {
+                    _x509 = _certWilds.get(host);
+
+                    // Else try an 1 deep wild match
+                    if (_x509==null)
+                    {
+                        int dot=host.indexOf('.');
+                        if (dot>=0)
+                        {
+                            String domain=host.substring(dot+1);
+                            _x509 = _certWilds.get(domain);
+                        }
+                    }
+                }
+
+                if (LOG.isDebugEnabled())
+                    LOG.debug("SNI matched {}->{}",host,_x509);
+            }
+            else
+            {
+                if (LOG.isDebugEnabled())
+                    LOG.debug("SNI no match for {}", serverName);
+            }
+
+            // Return true and allow the KeyManager to accept or reject when choosing a certificate.
+            // If we don't have a SNI host, or didn't see any certificate aliases,
+            // just say true as it will either somehow work or fail elsewhere.
+            return true;
+        }
+
+        public String getHost()
+        {
+            return _host;
+        }
+
+        public X509 getX509()
+        {
+            return _x509;
+        }
     }
 }
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/X509.java b/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/X509.java
new file mode 100644
index 0000000..1290432
--- /dev/null
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/X509.java
@@ -0,0 +1,163 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util.ssl;
+
+import java.security.cert.CertificateParsingException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.naming.InvalidNameException;
+import javax.naming.ldap.LdapName;
+import javax.naming.ldap.Rdn;
+import javax.security.auth.x500.X500Principal;
+
+import org.eclipse.jetty.util.StringUtil;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+public class X509
+{
+    private static final Logger LOG = Log.getLogger(X509.class);
+
+    /*
+     * @see {@link X509Certificate#getKeyUsage()}
+     */
+    private static final int KEY_USAGE__KEY_CERT_SIGN=5;
+
+    /*
+     *
+     * @see {@link X509Certificate#getSubjectAlternativeNames()}
+     */
+    private static final int SUBJECT_ALTERNATIVE_NAMES__DNS_NAME=2;
+
+    public static boolean isCertSign(X509Certificate x509)
+    {
+        boolean[] key_usage=x509.getKeyUsage();
+        return key_usage!=null && key_usage[KEY_USAGE__KEY_CERT_SIGN];
+    }
+
+    private final X509Certificate _x509;
+    private final String _alias;
+    private final List<String> _hosts=new ArrayList<>();
+    private final List<String> _wilds=new ArrayList<>();
+
+    public X509(String alias,X509Certificate x509) throws CertificateParsingException, InvalidNameException
+    {
+        _alias=alias;
+        _x509 = x509;
+
+        // Look for alternative name extensions
+        boolean named=false;
+        Collection<List<?>> altNames = x509.getSubjectAlternativeNames();
+        if (altNames!=null)
+        {
+            for (List<?> list : altNames)
+            {
+                if (((Number)list.get(0)).intValue() == SUBJECT_ALTERNATIVE_NAMES__DNS_NAME)
+                {
+                    String cn = list.get(1).toString();
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Certificate SAN alias={} CN={} in {}",alias,cn,this);
+                    if (cn!=null)
+                    {
+                        named=true;
+                        addName(cn);
+                    }
+                }
+            }
+        }
+
+        // If no names found, look up the CN from the subject
+        if (!named)
+        {
+            LdapName name=new LdapName(x509.getSubjectX500Principal().getName(X500Principal.RFC2253));
+            for (Rdn rdn : name.getRdns())
+            {
+                if (rdn.getType().equalsIgnoreCase("CN"))
+                {
+                    String cn = rdn.getValue().toString();
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("Certificate CN alias={} CN={} in {}",alias,cn,this);
+                    if (cn!=null && cn.contains(".") && !cn.contains(" "))
+                        addName(cn);
+                }
+            }
+        }
+    }
+
+    protected void addName(String cn)
+    {
+        cn=StringUtil.asciiToLowerCase(cn);
+        if (cn.startsWith("*."))
+            _wilds.add(cn.substring(2));
+        else
+            _hosts.add(cn);
+    }
+
+    public String getAlias()
+    {
+        return _alias;
+    }
+
+    public X509Certificate getCertificate()
+    {
+        return _x509;
+    }
+
+    public Set<String> getHosts()
+    {
+        return new HashSet<>(_hosts);
+    }
+
+    public Set<String> getWilds()
+    {
+        return new HashSet<>(_wilds);
+    }
+
+    public boolean matches(String host)
+    {
+        host=StringUtil.asciiToLowerCase(host);
+        if (_hosts.contains(host) || _wilds.contains(host))
+            return true;
+
+        int dot = host.indexOf('.');
+        if (dot>=0)
+        {
+            String domain=host.substring(dot+1);
+            if (_wilds.contains(domain))
+                return true;
+        }
+        return false;
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("%s@%x(%s,h=%s,w=%s)",
+                getClass().getSimpleName(),
+                hashCode(),
+                _alias,
+                _hosts,
+                _wilds);
+    }
+}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/statistic/CounterStatistic.java b/jetty-util/src/main/java/org/eclipse/jetty/util/statistic/CounterStatistic.java
index 23ce97e..e03338b 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/statistic/CounterStatistic.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/statistic/CounterStatistic.java
@@ -40,20 +40,30 @@
     /* ------------------------------------------------------------ */
     public void reset()
     {
-        reset(0);
+        _total.set(0);
+        _max.set(0);
+        long current=_curr.get();
+        _total.addAndGet(current);
+        Atomics.updateMax(_max,current);
     }
 
     /* ------------------------------------------------------------ */
     public void reset(final long value)
     {
-        _max.set(value);
+        _total.set(0);
+        _max.set(0);
         _curr.set(value);
-        _total.set(0); // total always set to 0 to properly calculate cumulative total
+        if (value>0)
+        {
+            _total.addAndGet(value);
+            Atomics.updateMax(_max,value);
+        }
     }
 
     /* ------------------------------------------------------------ */
     /**
      * @param delta the amount to add to the count
+     * @return the new value
      */
     public long add(final long delta)
     {
@@ -68,6 +78,8 @@
 
     /* ------------------------------------------------------------ */
     /**
+     * increment the value by one
+     * @return the new value, post increment
      */
     public long increment()
     {
@@ -76,6 +88,8 @@
 
     /* ------------------------------------------------------------ */
     /**
+     * decrement by 1
+     * @return the new value, post-decrement
      */
     public long decrement()
     {
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/statistic/SampleStatistic.java b/jetty-util/src/main/java/org/eclipse/jetty/util/statistic/SampleStatistic.java
index 2f106f7..4d44683 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/statistic/SampleStatistic.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/statistic/SampleStatistic.java
@@ -23,23 +23,20 @@
 import org.eclipse.jetty.util.Atomics;
 
 
-/* ------------------------------------------------------------ */
 /**
  * SampledStatistics
  * <p>
- * Provides max, total, mean, count, variance, and standard
- * deviation of continuous sequence of samples.
+ * Provides max, total, mean, count, variance, and standard deviation of continuous sequence of samples.
  * <p>
- * Calculates estimates of mean, variance, and standard deviation
- * characteristics of a sample using a non synchronized
- * approximation of the on-line algorithm presented
- * in Donald Knuth's Art of Computer Programming, Volume 2,
- * Seminumerical Algorithms, 3rd edition, page 232,
- * Boston: Addison-Wesley. that cites a 1962 paper by B.P. Welford
- * that can be found by following the link http://www.jstor.org/pss/1266577
+ * Calculates estimates of mean, variance, and standard deviation characteristics of a sample using a non synchronized
+ * approximation of the on-line algorithm presented in <cite>Donald Knuth's Art of Computer Programming, Volume 2,
+ * Seminumerical Algorithms, 3rd edition, page 232, Boston: Addison-Wesley</cite>. that cites a 1962 paper by B.P. Welford that
+ * can be found by following <a href="http://www.jstor.org/pss/1266577">Note on a Method for Calculating Corrected Sums
+ * of Squares and Products</a>
  * <p>
- * This algorithm is also described in Wikipedia at
- * http://en.wikipedia.org/w/index.php?title=Algorithms_for_calculating_variance&section=4#On-line_algorithm
+ * This algorithm is also described in Wikipedia at <a href=
+ * "http://en.wikipedia.org/w/index.php?title=Algorithms_for_calculating_variance&amp;section=4#On-line_algorithm">
+ * Algorithms for calculating variance </a>
  */
 public class SampleStatistic
 {
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ExecutionStrategy.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ExecutionStrategy.java
new file mode 100644
index 0000000..b576972
--- /dev/null
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ExecutionStrategy.java
@@ -0,0 +1,100 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util.thread;
+
+import java.lang.reflect.Constructor;
+import java.util.concurrent.Executor;
+
+import org.eclipse.jetty.util.Loader;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume;
+
+/**
+ * <p>An {@link ExecutionStrategy} executes {@link Runnable} tasks produced by a {@link Producer}.
+ * The strategy to execute the task may vary depending on the implementation; the task may be
+ * run in the calling thread, or in a new thread, etc.</p>
+ * <p>The strategy delegates the production of tasks to a {@link Producer}, and continues to
+ * execute tasks until the producer continues to produce them.</p>
+ */
+public interface ExecutionStrategy
+{
+    /**
+     * <p>Initiates (or resumes) the task production and execution.</p>
+     * <p>This method guarantees that the task is never run by the
+     * thread that called this method.</p>
+     *
+     * @see #execute()
+     */
+    public void dispatch();
+
+    /**
+     * <p>Initiates (or resumes) the task production and execution.</p>
+     * <p>The produced task may be run by the same thread that called
+     * this method.</p>
+     *
+     * @see #dispatch()
+     */
+    public void execute();
+
+    /**
+     * <p>A producer of {@link Runnable} tasks to run.</p>
+     * <p>The {@link ExecutionStrategy} will repeatedly invoke {@link #produce()} until
+     * the producer returns null, indicating that it has nothing more to produce.</p>
+     * <p>When no more tasks can be produced, implementations should arrange for the
+     * {@link ExecutionStrategy} to be invoked again in case an external event resumes
+     * the tasks production.</p>
+     */
+    public interface Producer
+    {
+        /**
+         * <p>Produces a task to be executed.</p>
+         *
+         * @return a task to executed or null if there are no more tasks to execute
+         */
+        Runnable produce();
+    }
+
+    public static class Factory
+    {
+        private static final Logger LOG = Log.getLogger(Factory.class);
+
+        public static ExecutionStrategy instanceFor(Producer producer, Executor executor)
+        {
+            // TODO remove this mechanism before release
+            String strategy = System.getProperty(producer.getClass().getName()+".ExecutionStrategy");
+            if (strategy!=null)
+            {
+                try
+                {
+                    Class<? extends ExecutionStrategy> c = Loader.loadClass(producer.getClass(),strategy);
+                    Constructor<? extends ExecutionStrategy> m = c.getConstructor(Producer.class,Executor.class);
+                    LOG.info("Use {} for {}",c.getSimpleName(),producer.getClass().getName());
+                    return  m.newInstance(producer,executor);
+                }
+                catch(Exception e)
+                {
+                    LOG.warn(e);
+                }
+            }
+            
+            return new ExecuteProduceConsume(producer,executor);
+        }
+    }
+}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ExecutorThreadPool.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ExecutorThreadPool.java
index 6f46db2..2ee3f58 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ExecutorThreadPool.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ExecutorThreadPool.java
@@ -65,7 +65,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Wraps an {@link ThreadPoolExecutor}.
-     * Max pool size is 256, pool thread timeout after 60 seconds, and core pool size is 32 when queueSize >= 0.
+     * Max pool size is 256, pool thread timeout after 60 seconds, and core pool size is 32 when queueSize &gt;= 0.
      * @param queueSize can be -1 for using an unbounded {@link LinkedBlockingQueue}, 0 for using a
      * {@link SynchronousQueue}, greater than 0 for using a {@link ArrayBlockingQueue} of the given size.
      */
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/Locker.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/Locker.java
new file mode 100644
index 0000000..ae025f2
--- /dev/null
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/Locker.java
@@ -0,0 +1,108 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util.thread;
+
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * <p>This is a lock designed to protect VERY short sections of
+ * critical code.  Threads attempting to take the lock will wait
+ * until the lock is available, thus it is important that
+ * the code protected by this lock is extremely simple and non
+ * blocking.</p>
+ * <pre>
+ * try(SpinLock.Lock lock = locker.lock())
+ * {
+ *   // something very quick and non blocking
+ * }
+ * </pre>
+ */
+public class Locker
+{
+    private static final boolean SPIN = Boolean.getBoolean(Locker.class.getName() + ".spin");
+
+    private final boolean _spin;
+    private final ReentrantLock _lock = new ReentrantLock();
+    private final AtomicReference<Thread> _spinLockState = new AtomicReference<>(null);
+    private final Lock _unlock = new Lock();
+
+    public Locker()
+    {
+        this(SPIN);
+    }
+
+    public Locker(boolean spin)
+    {
+        this._spin = spin;
+    }
+
+    public Lock lock()
+    {
+        if (_spin)
+            spinLock();
+        else
+            concLock();
+        return _unlock;
+    }
+
+    private void spinLock()
+    {
+        Thread current = Thread.currentThread();
+        while (true)
+        {
+            // Using test-and-test-and-set for better performance.
+            Thread locker = _spinLockState.get();
+            if (locker != null || !_spinLockState.compareAndSet(null, current))
+            {
+                if (locker == current)
+                    throw new IllegalStateException("Locker is not reentrant");
+                continue;
+            }
+            return;
+        }
+    }
+
+    private void concLock()
+    {
+        if (_lock.isHeldByCurrentThread())
+            throw new IllegalStateException("Locker is not reentrant");
+        _lock.lock();
+    }
+
+    public boolean isLocked()
+    {
+        if (_spin)
+            return _spinLockState.get() != null;
+        else
+            return _lock.isLocked();
+    }
+
+    public class Lock implements AutoCloseable
+    {
+        @Override
+        public void close()
+        {
+            if (_spin)
+                _spinLockState.set(null);
+            else
+                _lock.unlock();
+        }
+    }
+}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/NonBlockingThread.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/NonBlockingThread.java
deleted file mode 100644
index a8552ad..0000000
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/NonBlockingThread.java
+++ /dev/null
@@ -1,59 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.util.thread;
-
-/**
- * Marker that wraps a Runnable, indicating that it is running in a thread that must not be blocked.
- * <p />
- * Client code can use the thread-local {@link #isNonBlockingThread()} to detect whether they are
- * in the context of a non-blocking thread, and perform different actions if that's the case.
- */
-public class NonBlockingThread implements Runnable
-{
-    private final static ThreadLocal<Boolean> __nonBlockingThread = new ThreadLocal<>();
-
-    /**
-     * @return whether the current thread is a thread that must not block.
-     */
-    public static boolean isNonBlockingThread()
-    {
-        return Boolean.TRUE.equals(__nonBlockingThread.get());
-    }
-
-    private final Runnable delegate;
-
-    public NonBlockingThread(Runnable delegate)
-    {
-        this.delegate = delegate;
-    }
-
-    @Override
-    public void run()
-    {
-        try
-        {
-            __nonBlockingThread.set(Boolean.TRUE);
-            delegate.run();
-        }
-        finally
-        {
-            __nonBlockingThread.set(Boolean.FALSE);
-        }
-    }
-}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/QueuedThreadPool.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/QueuedThreadPool.java
old mode 100644
new mode 100755
index f8d2334..57aa7c5
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/QueuedThreadPool.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/QueuedThreadPool.java
@@ -54,6 +54,7 @@
     private final ConcurrentHashSet<Thread> _threads=new ConcurrentHashSet<Thread>();
     private final Object _joinLock = new Object();
     private final BlockingQueue<Runnable> _jobs;
+    private final ThreadGroup _threadGroup;
     private String _name = "qtp" + hashCode();
     private int _idleTimeout;
     private int _maxThreads;
@@ -84,6 +85,11 @@
 
     public QueuedThreadPool(@Name("maxThreads") int maxThreads, @Name("minThreads") int minThreads, @Name("idleTimeout") int idleTimeout, @Name("queue") BlockingQueue<Runnable> queue)
     {
+        this(maxThreads, minThreads, idleTimeout, queue, null);
+    }
+
+    public QueuedThreadPool(@Name("maxThreads") int maxThreads, @Name("minThreads") int minThreads, @Name("idleTimeout") int idleTimeout, @Name("queue") BlockingQueue<Runnable> queue, @Name("threadGroup") ThreadGroup threadGroup)
+    {
         setMinThreads(minThreads);
         setMaxThreads(maxThreads);
         setIdleTimeout(idleTimeout);
@@ -95,6 +101,7 @@
             queue=new BlockingArrayQueue<>(capacity, capacity);
         }
         _jobs=queue;
+        _threadGroup=threadGroup;
     }
 
     @Override
@@ -186,7 +193,10 @@
     }
 
     /**
-     * Delegated to the named or anonymous Pool.
+     * Thread Pool should use Daemon Threading. 
+     *
+     * @param daemon true to enable delegation
+     * @see Thread#setDaemon(boolean)
      */
     public void setDaemon(boolean daemon)
     {
@@ -335,7 +345,10 @@
     }
 
     /**
-     * Delegated to the named or anonymous Pool.
+     * Is thread pool using daemon threading
+     * 
+     * @return true if delegating to named or anonymous pool
+     * @see Thread#setDaemon(boolean)
      */
     @ManagedAttribute("thead pool using a daemon thread")
     public boolean isDaemon()
@@ -356,6 +369,8 @@
     @Override
     public void execute(Runnable job)
     {
+        if (LOG.isDebugEnabled())
+            LOG.debug("queue {}",job);
         if (!isRunning() || !_jobs.offer(job))
         {
             LOG.warn("{} rejected {}", this, job);
@@ -459,7 +474,7 @@
 
     protected Thread newThread(Runnable runnable)
     {
-        return new Thread(runnable);
+        return new Thread(_threadGroup, runnable);
     }
 
     @Override
@@ -552,7 +567,11 @@
                     // Job loop
                     while (job != null && isRunning())
                     {
+                        if (LOG.isDebugEnabled())
+                            LOG.debug("run {}",job);
                         runJob(job);
+                        if (LOG.isDebugEnabled())
+                            LOG.debug("ran {}",job);
                         if (Thread.interrupted())
                         {
                             ignore=true;
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ScheduledExecutorScheduler.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ScheduledExecutorScheduler.java
old mode 100644
new mode 100755
index 55496f4..26a8e42
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ScheduledExecutorScheduler.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ScheduledExecutorScheduler.java
@@ -32,7 +32,7 @@
 
 /**
  * Implementation of {@link Scheduler} based on JDK's {@link ScheduledThreadPoolExecutor}.
- * <p />
+ * <p>
  * While use of {@link ScheduledThreadPoolExecutor} creates futures that will not be used,
  * it has the advantage of allowing to set a property to remove cancelled tasks from its
  * queue even if the task did not fire, which provides a huge benefit in the performance
@@ -43,6 +43,7 @@
     private final String name;
     private final boolean daemon;
     private final ClassLoader classloader;
+    private final ThreadGroup threadGroup;
     private volatile ScheduledThreadPoolExecutor scheduler;
     private volatile Thread thread;
 
@@ -58,9 +59,15 @@
     
     public ScheduledExecutorScheduler(String name, boolean daemon, ClassLoader threadFactoryClassLoader)
     {
+        this(name, daemon, threadFactoryClassLoader, null);
+    }
+
+    public ScheduledExecutorScheduler(String name, boolean daemon, ClassLoader threadFactoryClassLoader, ThreadGroup threadGroup)
+    {
         this.name = name == null ? "Scheduler-" + hashCode() : name;
         this.daemon = daemon;
-        this.classloader = threadFactoryClassLoader;
+        this.classloader = threadFactoryClassLoader == null ? Thread.currentThread().getContextClassLoader() : threadFactoryClassLoader;
+        this.threadGroup = threadGroup;
     }
 
     @Override
@@ -71,7 +78,7 @@
             @Override
             public Thread newThread(Runnable r)
             {
-                Thread thread = ScheduledExecutorScheduler.this.thread = new Thread(r, name);
+                Thread thread = ScheduledExecutorScheduler.this.thread = new Thread(threadGroup, r, name);
                 thread.setDaemon(daemon);
                 thread.setContextClassLoader(classloader);
                 return thread;
@@ -123,11 +130,11 @@
         }
     }
 
-    private class ScheduledFutureTask implements Task
+    private static class ScheduledFutureTask implements Task
     {
         private final ScheduledFuture<?> scheduledFuture;
 
-        public ScheduledFutureTask(ScheduledFuture<?> scheduledFuture)
+        ScheduledFutureTask(ScheduledFuture<?> scheduledFuture)
         {
             this.scheduledFuture = scheduledFuture;
         }
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/SpinLock.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/SpinLock.java
deleted file mode 100644
index 6b1cc7f..0000000
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/SpinLock.java
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.util.thread;
-
-import java.util.concurrent.atomic.AtomicReference;
-
-/**
- * <p>This spin lock is a lock designed to protect VERY short sections
- * of critical code.  Threads attempting to take the lock will spin
- * forever until the lock is available, thus it is important that
- * the code protected by this lock is extremely simple and non
- * blocking. The reason for this lock is that it prevents a thread
- * from giving up a CPU core when contending for the lock.</p>
- * <pre>
- * try(SpinLock.Lock lock = spinlock.lock())
- * {
- *   // something very quick and non blocking
- * }
- * </pre>
- * <p>Further analysis however, shows that spin locks behave really
- * bad under heavy contention and where the number of threads
- * exceeds the number of cores, which are common scenarios for a
- * server, so this class was removed from usage, preferring
- * standard locks instead.</p>
- * @deprecated Do not use it anymore, prefer normal locks
- */
-@Deprecated
-public class SpinLock
-{
-    private final AtomicReference<Thread> _lock = new AtomicReference<>(null);
-    private final Lock _unlock = new Lock();
-
-    public Lock lock()
-    {
-        Thread thread = Thread.currentThread();
-        while(true)
-        {
-            if (!_lock.compareAndSet(null,thread))
-            {
-                if (_lock.get()==thread)
-                    throw new IllegalStateException("SpinLock is not reentrant");
-                continue;
-            }
-            return _unlock;
-        }
-    }
-
-    public boolean isLocked()
-    {
-        return _lock.get()!=null;
-    }
-
-    public boolean isLockedThread()
-    {
-        return _lock.get()==Thread.currentThread();
-    }
-
-    public class Lock implements AutoCloseable
-    {
-        @Override
-        public void close()
-        {
-            _lock.set(null);
-        }
-    }
-}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ThreadClassLoaderScope.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ThreadClassLoaderScope.java
new file mode 100644
index 0000000..a693846
--- /dev/null
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ThreadClassLoaderScope.java
@@ -0,0 +1,45 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util.thread;
+
+import java.io.Closeable;
+
+public class ThreadClassLoaderScope implements Closeable
+{
+    private final ClassLoader old;
+    private final ClassLoader scopedClassLoader;
+
+    public ThreadClassLoaderScope(ClassLoader cl)
+    {
+        old = Thread.currentThread().getContextClassLoader();
+        scopedClassLoader = cl;
+        Thread.currentThread().setContextClassLoader(scopedClassLoader);
+    }
+
+    @Override
+    public void close()
+    {
+        Thread.currentThread().setContextClassLoader(old);
+    }
+
+    public ClassLoader getScopedClassLoader()
+    {
+        return scopedClassLoader;
+    }
+}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ThreadPool.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ThreadPool.java
index f7b1275..8b1e17f 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ThreadPool.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ThreadPool.java
@@ -22,6 +22,7 @@
 
 import org.eclipse.jetty.util.annotation.ManagedAttribute;
 import org.eclipse.jetty.util.annotation.ManagedObject;
+import org.eclipse.jetty.util.component.LifeCycle;
 
 /* ------------------------------------------------------------ */
 /** ThreadPool.
@@ -36,6 +37,7 @@
     /* ------------------------------------------------------------ */
     /**
      * Blocks until the thread pool is {@link LifeCycle#stop stopped}.
+     * @throws InterruptedException if thread was interrupted
      */
     public void join() throws InterruptedException;
 
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/TimerScheduler.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/TimerScheduler.java
index 021218c..d15e718 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/TimerScheduler.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/TimerScheduler.java
@@ -113,7 +113,7 @@
             }
             catch (Throwable x)
             {
-                LOG.debug("Exception while executing task " + _task, x);
+                LOG.warn("Exception while executing task " + _task, x);
             }
         }
 
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/strategy/ExecuteProduceConsume.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/strategy/ExecuteProduceConsume.java
new file mode 100644
index 0000000..e03e0c9
--- /dev/null
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/strategy/ExecuteProduceConsume.java
@@ -0,0 +1,262 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util.thread.strategy;
+
+import java.util.concurrent.Executor;
+
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.ExecutionStrategy;
+import org.eclipse.jetty.util.thread.Locker;
+import org.eclipse.jetty.util.thread.Locker.Lock;
+import org.eclipse.jetty.util.thread.ThreadPool;
+
+/**
+ * <p>A strategy where the thread calls produce will always run the resulting task
+ * itself.  The strategy may dispatches another thread to continue production.
+ * </p>
+ * <p>The strategy is also known by the nickname 'eat what you kill', which comes from
+ * the hunting ethic that says a person should not kill anything he or she does not
+ * plan on eating. In this case, the phrase is used to mean that a thread should
+ * not produce a task that it does not intend to run. By making producers run the
+ * task that they have just produced avoids execution delays and avoids parallel slow
+ * down by running the task in the same core, with good chances of having a hot CPU
+ * cache. It also avoids the creation of a queue of produced tasks that the system
+ * does not yet have capacity to consume, which can save memory and exert back
+ * pressure on producers.
+ * </p>
+ */
+public class ExecuteProduceConsume implements ExecutionStrategy, Runnable
+{
+    private static final Logger LOG = Log.getLogger(ExecuteProduceConsume.class);
+    private final Locker _locker = new Locker();
+    private final Runnable _runExecute = new RunExecute();
+    private final Producer _producer;
+    private final Executor _executor;
+    private boolean _idle=true;
+    private boolean _execute;
+    private boolean _producing;
+    private boolean _pending;
+    private final ThreadPool _threadpool;
+    private final ExecutionStrategy _lowresources;
+
+    public ExecuteProduceConsume(Producer producer, Executor executor)
+    {
+        this(producer,executor,(executor instanceof ThreadPool)?new ProduceExecuteConsume(producer,executor):null);
+    }
+    
+    public ExecuteProduceConsume(Producer producer, Executor executor, ExecutionStrategy lowResourceStrategy)
+    {
+        this._producer = producer;
+        this._executor = executor;
+        _threadpool = (executor instanceof ThreadPool)?((ThreadPool)executor):null;
+        _lowresources = _threadpool==null?null:lowResourceStrategy;
+    }
+
+    @Override
+    public void execute()
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("{} execute",this);
+        
+        boolean produce=false;
+        try (Lock locked = _locker.lock())
+        {
+            // If we are idle and a thread is not producing
+            if (_idle)
+            {
+                if (_producing)
+                    throw new IllegalStateException();
+
+                // Then this thread will do the producing
+                produce=_producing=true;
+                // and we are no longer idle
+                _idle=false;
+            }
+            else
+            {
+                // Otherwise, lets tell the producing thread
+                // that it should call produce again before going idle
+                _execute=true;
+            }
+        }
+
+        if (produce)
+            produceAndRun();
+    }
+
+    @Override
+    public void dispatch()
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("{} spawning",this);
+        boolean dispatch=false;
+        try (Lock locked = _locker.lock())
+        {
+            if (_idle)
+                dispatch=true;
+            else
+                _execute=true;
+        }
+        if (dispatch)
+            _executor.execute(_runExecute);
+    }
+
+    @Override
+    public void run()
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("{} run",this);
+        boolean produce=false;
+        try (Lock locked = _locker.lock())
+        {
+            _pending=false;
+            if (!_idle && !_producing)
+            {
+                produce=_producing=true;
+            }
+        }
+
+        if (produce)
+        {
+            // If we are low on resources, then switch to PEC strategy which does not
+            // suffer as badly from thread starvation
+            while (_threadpool!=null && _threadpool.isLowOnThreads())
+            {
+                LOG.debug("EWYK low resources {}",this);
+                _lowresources.execute();
+            }
+            
+            // no longer low resources so produceAndRun normally
+            produceAndRun();
+        }
+    }
+
+    private void produceAndRun()
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("{} produce enter",this);
+
+        while (true)
+        {
+            // If we got here, then we are the thread that is producing.
+            if (LOG.isDebugEnabled())
+                LOG.debug("{} producing",this);
+
+            Runnable task = _producer.produce();
+
+            if (LOG.isDebugEnabled())
+                LOG.debug("{} produced {}",this,task);
+
+            boolean dispatch=false;
+            try (Lock locked = _locker.lock())
+            {
+                // Finished producing
+                _producing=false;
+
+                // Did we produced a task?
+                if (task == null)
+                {
+                    // There is no task.
+                    if (_execute)
+                    {
+                        _idle=false;
+                        _producing=true;
+                        _execute=false;
+                        continue;
+                    }
+
+                    // ... and no additional calls to execute, so we are idle
+                    _idle=true;
+                    break;
+                }
+
+                // We have a task, which we will run ourselves,
+                // so if we don't have another thread pending
+                if (!_pending)
+                {
+                    // dispatch one
+                    dispatch=_pending=true;
+                }
+
+                _execute=false;
+            }
+
+            // If we became pending
+            if (dispatch)
+            {
+                // Spawn a new thread to continue production by running the produce loop.
+                if (LOG.isDebugEnabled())
+                    LOG.debug("{} dispatch",this);
+                _executor.execute(this);
+            }
+
+            // Run the task.
+            if (LOG.isDebugEnabled())
+                LOG.debug("{} run {}",this,task);
+            task.run();
+            if (LOG.isDebugEnabled())
+                LOG.debug("{} ran {}",this,task);
+
+            // Once we have run the task, we can try producing again.
+            try (Lock locked = _locker.lock())
+            {
+                // Is another thread already producing or we are now idle?
+                if (_producing || _idle)
+                    break;
+                _producing=true;
+            }
+        }
+
+        if (LOG.isDebugEnabled())
+            LOG.debug("{} produce exit",this);
+    }
+
+    public Boolean isIdle()
+    {
+        try (Lock locked = _locker.lock())
+        {
+            return _idle;
+        }
+    }
+
+    public String toString()
+    {
+        StringBuilder builder = new StringBuilder();
+        builder.append("EPR ");
+        try (Lock locked = _locker.lock())
+        {
+            builder.append(_idle?"Idle/":"");
+            builder.append(_producing?"Prod/":"");
+            builder.append(_pending?"Pend/":"");
+            builder.append(_execute?"Exec/":"");
+        }
+        builder.append(_producer);
+        return builder.toString();
+    }
+
+    private class RunExecute implements Runnable
+    {
+        @Override
+        public void run()
+        {
+            execute();
+        }
+    }
+}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/strategy/ProduceConsume.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/strategy/ProduceConsume.java
new file mode 100644
index 0000000..cf6fe12
--- /dev/null
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/strategy/ProduceConsume.java
@@ -0,0 +1,68 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util.thread.strategy;
+
+import java.util.concurrent.Executor;
+
+import org.eclipse.jetty.util.thread.ExecutionStrategy;
+
+/**
+ * <p>A strategy where the caller thread iterates over task production, submitting each
+ * task to an {@link Executor} for execution.</p>
+ */
+public class ProduceConsume implements ExecutionStrategy, Runnable
+{
+    private final Producer _producer;
+    private final Executor _executor;
+
+    public ProduceConsume(Producer producer, Executor executor)
+    {
+        this._producer = producer;
+        this._executor = executor;
+    }
+
+    @Override
+    public void execute()
+    {
+        // Iterate until we are complete.
+        while (true)
+        {
+            // Produce a task.
+            Runnable task = _producer.produce();
+
+            if (task == null)
+                break;
+
+            // run the task.
+            task.run();
+        }
+    }
+
+    @Override
+    public void dispatch()
+    {
+        _executor.execute(this);
+    }
+
+    @Override
+    public void run()
+    {
+        execute();
+    }
+}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/strategy/ProduceExecuteConsume.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/strategy/ProduceExecuteConsume.java
new file mode 100644
index 0000000..b60a7f1
--- /dev/null
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/strategy/ProduceExecuteConsume.java
@@ -0,0 +1,67 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util.thread.strategy;
+
+import java.util.concurrent.Executor;
+
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.ExecutionStrategy;
+
+/**
+ * <p>A strategy where the caller thread iterates over task production, submitting each
+ * task to an {@link Executor} for execution.</p>
+ */
+public class ProduceExecuteConsume implements ExecutionStrategy
+{
+    private static final Logger LOG = Log.getLogger(ExecutionStrategy.class);
+    private final Producer _producer;
+    private final Executor _executor;
+
+    public ProduceExecuteConsume(Producer producer, Executor executor)
+    {
+        this._producer = producer;
+        this._executor = executor;
+    }
+
+    @Override
+    public void execute()
+    {
+        // Iterate until we are complete.
+        while (true)
+        {
+            // Produce a task.
+            Runnable task = _producer.produce();
+            if (LOG.isDebugEnabled())
+                LOG.debug("{} PER produced {}",_producer,task);
+
+            if (task == null)
+                break;
+
+            // Execute the task.
+            _executor.execute(task);
+        }
+    }
+
+    @Override
+    public void dispatch()
+    {
+        execute();
+    }
+}
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/IncludeExcludeTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/IncludeExcludeTest.java
new file mode 100644
index 0000000..8da30fd
--- /dev/null
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/IncludeExcludeTest.java
@@ -0,0 +1,153 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class IncludeExcludeTest
+{
+    @Test
+    public void testEmpty()
+    {
+        IncludeExclude<String> ie = new IncludeExclude<>();
+        
+        assertEquals(0,ie.size());
+        assertEquals(true,ie.matches("foo"));
+    }
+    
+    @Test
+    public void testIncludeOnly()
+    {
+        IncludeExclude<String> ie = new IncludeExclude<>();
+        ie.include("foo");
+        ie.include("bar");
+        
+        assertEquals(2,ie.size());
+        assertEquals(false,ie.matches(""));
+        assertEquals(true,ie.matches("foo"));
+        assertEquals(true,ie.matches("bar"));
+        assertEquals(false,ie.matches("foobar"));
+    }
+    
+    @Test
+    public void testExcludeOnly()
+    {
+        IncludeExclude<String> ie = new IncludeExclude<>();
+        ie.exclude("foo");
+        ie.exclude("bar");
+        
+        assertEquals(2,ie.size());
+        
+        assertEquals(false,ie.matches("foo"));
+        assertEquals(false,ie.matches("bar"));
+        assertEquals(true,ie.matches(""));
+        assertEquals(true,ie.matches("foobar"));
+        assertEquals(true,ie.matches("wibble"));
+    }
+    
+    @Test
+    public void testIncludeExclude()
+    {
+        IncludeExclude<String> ie = new IncludeExclude<>();
+        ie.include("foo");
+        ie.include("bar");
+        ie.exclude("bar");
+        ie.exclude("xxx");
+        
+        assertEquals(4,ie.size());
+        
+        assertEquals(true,ie.matches("foo"));
+        assertEquals(false,ie.matches("bar"));
+        assertEquals(false,ie.matches(""));
+        assertEquals(false,ie.matches("foobar"));
+        assertEquals(false,ie.matches("xxx"));
+    }
+    
+    
+
+    @Test
+    public void testEmptyRegex()
+    {
+        IncludeExclude<String> ie = new IncludeExclude<>(RegexSet.class,RegexSet.MATCHER);
+        
+        assertEquals(0,ie.size());
+        assertEquals(true,ie.matches("foo"));
+    }
+    
+    @Test
+    public void testIncludeRegex()
+    {
+        IncludeExclude<String> ie = new IncludeExclude<>(RegexSet.class,RegexSet.MATCHER);
+        ie.include("f..");
+        ie.include("b((ar)|(oo))");
+        
+        assertEquals(2,ie.size());
+        assertEquals(false,ie.matches(""));
+        assertEquals(true,ie.matches("foo"));
+        assertEquals(true,ie.matches("far"));
+        assertEquals(true,ie.matches("bar"));
+        assertEquals(true,ie.matches("boo"));
+        assertEquals(false,ie.matches("foobar"));
+        assertEquals(false,ie.matches("xxx"));
+    }
+    
+    @Test
+    public void testExcludeRegex()
+    {
+        IncludeExclude<String> ie = new IncludeExclude<>(RegexSet.class,RegexSet.MATCHER);
+        ie.exclude("f..");
+        ie.exclude("b((ar)|(oo))");
+        
+        assertEquals(2,ie.size());
+        
+        assertEquals(false,ie.matches("foo"));
+        assertEquals(false,ie.matches("far"));
+        assertEquals(false,ie.matches("bar"));
+        assertEquals(false,ie.matches("boo"));
+        assertEquals(true,ie.matches(""));
+        assertEquals(true,ie.matches("foobar"));
+        assertEquals(true,ie.matches("xxx"));
+    }
+    
+    @Test
+    public void testIncludeExcludeRegex()
+    {
+        IncludeExclude<String> ie = new IncludeExclude<>(RegexSet.class,RegexSet.MATCHER);
+        ie.include(".*[aeiou].*");
+        ie.include("[AEIOU].*");
+        ie.exclude("f..");
+        ie.exclude("b((ar)|(oo))");
+        
+        assertEquals(4,ie.size());
+        assertEquals(false,ie.matches("foo"));
+        assertEquals(false,ie.matches("far"));
+        assertEquals(false,ie.matches("bar"));
+        assertEquals(false,ie.matches("boo"));
+        assertEquals(false,ie.matches(""));
+        assertEquals(false,ie.matches("xxx"));
+
+        assertEquals(true,ie.matches("foobar"));
+        assertEquals(true,ie.matches("Ant"));
+        
+    }
+    
+    
+}
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/IteratingCallbackTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/IteratingCallbackTest.java
index cc57ea5..8375e36 100644
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/IteratingCallbackTest.java
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/IteratingCallbackTest.java
@@ -24,40 +24,40 @@
 
 import org.eclipse.jetty.util.thread.ScheduledExecutorScheduler;
 import org.eclipse.jetty.util.thread.Scheduler;
-import org.junit.AfterClass;
+import org.junit.After;
 import org.junit.Assert;
-import org.junit.BeforeClass;
+import org.junit.Before;
 import org.junit.Test;
 
 public class IteratingCallbackTest
 {
-    static Scheduler scheduler = new ScheduledExecutorScheduler();
-   
-    @BeforeClass
-    public static void beforeClass() throws Exception
+    private Scheduler scheduler;
+
+    @Before
+    public void prepare() throws Exception
     {
+        scheduler = new ScheduledExecutorScheduler();
         scheduler.start();
     }
-    
-    @AfterClass
-    public static void afterClass() throws Exception
+
+    @After
+    public void dispose() throws Exception
     {
         scheduler.stop();
     }
-    
+
     @Test
     public void testNonWaitingProcess() throws Exception
     {
-        
-        TestCB cb=new TestCB()
+        TestCB cb = new TestCB()
         {
-            int i=10;
-            
+            int i = 10;
+
             @Override
             protected Action process() throws Exception
             {
                 processed++;
-                if (i-->1)      
+                if (i-- > 1)
                 {
                     succeeded(); // fake a completed IO operation
                     return Action.SCHEDULED;
@@ -65,61 +65,59 @@
                 return Action.SUCCEEDED;
             }
         };
-        
+
         cb.iterate();
-        Assert.assertTrue(cb.waitForComplete()); 
-        Assert.assertEquals(10,cb.processed);
+        Assert.assertTrue(cb.waitForComplete());
+        Assert.assertEquals(10, cb.processed);
     }
 
-
-
     @Test
     public void testWaitingProcess() throws Exception
     {
-        TestCB cb=new TestCB()
+        TestCB cb = new TestCB()
         {
-            int i=4;
-            
+            int i = 4;
+
             @Override
             protected Action process() throws Exception
             {
                 processed++;
-                if (i-->1)      
+                if (i-- > 1)
                 {
-                    scheduler.schedule(successTask,50,TimeUnit.MILLISECONDS);
+                    scheduler.schedule(successTask, 50, TimeUnit.MILLISECONDS);
                     return Action.SCHEDULED;
                 }
                 return Action.SUCCEEDED;
             }
         };
-        
+
         cb.iterate();
-        
+
         Assert.assertTrue(cb.waitForComplete());
-         
-        Assert.assertEquals(4,cb.processed);
+
+        Assert.assertEquals(4, cb.processed);
     }
 
     @Test
-    public void testWaitingProcessSpuriousInterate() throws Exception
+    public void testWaitingProcessSpuriousIterate() throws Exception
     {
-        final TestCB cb=new TestCB()
+        final TestCB cb = new TestCB()
         {
-            int i=4;
-            
+            int i = 4;
+
             @Override
             protected Action process() throws Exception
             {
                 processed++;
-                if (i-->1)      
+                if (i-- > 1)
                 {
-                    scheduler.schedule(successTask,50,TimeUnit.MILLISECONDS);
+                    scheduler.schedule(successTask, 50, TimeUnit.MILLISECONDS);
                     return Action.SCHEDULED;
                 }
                 return Action.SUCCEEDED;
             }
         };
-        
+
         cb.iterate();
         scheduler.schedule(new Runnable()
         {
@@ -128,29 +126,29 @@
             {
                 cb.iterate();
                 if (!cb.isSucceeded())
-                    scheduler.schedule(this,50,TimeUnit.MILLISECONDS);
+                    scheduler.schedule(this, 50, TimeUnit.MILLISECONDS);
             }
-        },49,TimeUnit.MILLISECONDS);
-        
+        }, 49, TimeUnit.MILLISECONDS);
+
         Assert.assertTrue(cb.waitForComplete());
-         
-        Assert.assertEquals(4,cb.processed);
+
+        Assert.assertEquals(4, cb.processed);
     }
 
     @Test
     public void testNonWaitingProcessFailure() throws Exception
     {
-        TestCB cb=new TestCB()
+        TestCB cb = new TestCB()
         {
-            int i=10;
-            
+            int i = 10;
+
             @Override
             protected Action process() throws Exception
             {
                 processed++;
-                if (i-->1)      
+                if (i-- > 1)
                 {
-                    if (i>5)
+                    if (i > 5)
                         succeeded(); // fake a completed IO operation
                     else
                         failed(new Exception("testing"));
@@ -159,63 +157,63 @@
                 return Action.SUCCEEDED;
             }
         };
-        
+
         cb.iterate();
-        Assert.assertFalse(cb.waitForComplete()); 
-        Assert.assertEquals(5,cb.processed);
+        Assert.assertFalse(cb.waitForComplete());
+        Assert.assertEquals(5, cb.processed);
     }
 
     @Test
     public void testWaitingProcessFailure() throws Exception
     {
-        TestCB cb=new TestCB()
+        TestCB cb = new TestCB()
         {
-            int i=4;
-            
+            int i = 4;
+
             @Override
             protected Action process() throws Exception
             {
                 processed++;
-                if (i-->1)      
+                if (i-- > 1)
                 {
-                    scheduler.schedule(i>2?successTask:failTask,50,TimeUnit.MILLISECONDS);
+                    scheduler.schedule(i > 2 ? successTask : failTask, 50, TimeUnit.MILLISECONDS);
                     return Action.SCHEDULED;
                 }
                 return Action.SUCCEEDED;
             }
         };
-        
+
         cb.iterate();
-        
+
         Assert.assertFalse(cb.waitForComplete());
-        Assert.assertEquals(2,cb.processed);
+        Assert.assertEquals(2, cb.processed);
     }
-    
+
 
     @Test
     public void testIdleWaiting() throws Exception
     {
         final CountDownLatch idle = new CountDownLatch(1);
-        
-        TestCB cb=new TestCB()
+
+        TestCB cb = new TestCB()
         {
-            int i=5;
-            
+            int i = 5;
+
             @Override
             protected Action process()
             {
                 processed++;
-                
-                switch(i--)
+
+                switch (i--)
                 {
                     case 5:
                         succeeded();
                         return Action.SCHEDULED;
-                        
+
                     case 4:
-                        scheduler.schedule(successTask,5,TimeUnit.MILLISECONDS);
+                        scheduler.schedule(successTask, 5, TimeUnit.MILLISECONDS);
                         return Action.SCHEDULED;
-                        
+
                     case 3:
                         scheduler.schedule(new Runnable()
                         {
@@ -224,49 +222,99 @@
                             {
                                 idle.countDown();
                             }
-                        },5,TimeUnit.MILLISECONDS);
+                        }, 5, TimeUnit.MILLISECONDS);
                         return Action.IDLE;
 
                     case 2:
                         succeeded();
                         return Action.SCHEDULED;
-                        
+
                     case 1:
-                        scheduler.schedule(successTask,5,TimeUnit.MILLISECONDS);
+                        scheduler.schedule(successTask, 5, TimeUnit.MILLISECONDS);
                         return Action.SCHEDULED;
-                        
+
                     case 0:
                         return Action.SUCCEEDED;
-                        
-                    default: 
+
+                    default:
                         throw new IllegalStateException();
-                    
+
                 }
             }
         };
-        
+
         cb.iterate();
-        idle.await(10,TimeUnit.SECONDS);
+        idle.await(10, TimeUnit.SECONDS);
         Assert.assertTrue(cb.isIdle());
-        
+
         cb.iterate();
         Assert.assertTrue(cb.waitForComplete());
-        Assert.assertEquals(6,cb.processed);
+        Assert.assertEquals(6, cb.processed);
     }
-    
-    
-    
+
+    @Test
+    public void testCloseDuringProcessingReturningScheduled() throws Exception
+    {
+        testCloseDuringProcessing(IteratingCallback.Action.SCHEDULED);
+    }
+
+    @Test
+    public void testCloseDuringProcessingReturningSucceeded() throws Exception
+    {
+        testCloseDuringProcessing(IteratingCallback.Action.SUCCEEDED);
+    }
+
+    private void testCloseDuringProcessing(final IteratingCallback.Action action) throws Exception
+    {
+        final CountDownLatch failureLatch = new CountDownLatch(1);
+        IteratingCallback callback = new IteratingCallback()
+        {
+            @Override
+            protected Action process() throws Exception
+            {
+                close();
+                return action;
+            }
+
+            @Override
+            protected void onCompleteFailure(Throwable cause)
+            {
+                failureLatch.countDown();
+            }
+        };
+
+        callback.iterate();
+
+        Assert.assertTrue(failureLatch.await(5, TimeUnit.SECONDS));
+    }
+
     private abstract static class TestCB extends IteratingCallback
     {
-        CountDownLatch completed = new CountDownLatch(1);
-        int processed=0;
+        protected Runnable successTask = new Runnable()
+        {
+            @Override
+            public void run()
+            {
+                succeeded();
+            }
+        };
+        protected Runnable failTask = new Runnable()
+        {
+            @Override
+            public void run()
+            {
+                failed(new Exception("testing failure"));
+            }
+        };
+        protected CountDownLatch completed = new CountDownLatch(1);
+        protected int processed = 0;
 
         @Override
         protected void onCompleteSuccess()
         {
             completed.countDown();
         }
-        
+
         @Override
         public void onCompleteFailure(Throwable x)
         {
@@ -275,26 +323,8 @@
 
         boolean waitForComplete() throws InterruptedException
         {
-            completed.await(10,TimeUnit.SECONDS);
+            completed.await(10, TimeUnit.SECONDS);
             return isSucceeded();
         }
-        
-        Runnable successTask = new Runnable()
-        {
-            @Override
-            public void run()
-            {
-                succeeded();
-            }
-        };
-        Runnable failTask = new Runnable()
-        {
-            @Override
-            public void run()
-            {
-                failed(new Exception("testing failure"));
-            }
-        };
     }
-
 }
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/PathWatcherDemo.java b/jetty-util/src/test/java/org/eclipse/jetty/util/PathWatcherDemo.java
new file mode 100644
index 0000000..fe13a5b
--- /dev/null
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/PathWatcherDemo.java
@@ -0,0 +1,132 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jetty.util.PathWatcher.PathWatchEvent;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+
+public class PathWatcherDemo implements PathWatcher.Listener
+{
+    private static final Logger LOG = Log.getLogger(PathWatcherDemo.class);
+
+    public static void main(String[] args)
+    {
+        List<Path> paths = new ArrayList<>();
+        for (String arg : args)
+        {
+            paths.add(new File(arg).toPath());
+        }
+
+        if (paths.isEmpty())
+        {
+            LOG.warn("No paths specified on command line");
+            System.exit(-1);
+        }
+
+        PathWatcherDemo demo = new PathWatcherDemo();
+        try
+        {
+            demo.run(paths);
+        }
+        catch (Throwable t)
+        {
+            LOG.warn(t);
+        }
+    }
+
+    public void run(List<Path> paths) throws Exception
+    {
+        PathWatcher watcher = new PathWatcher();
+        //watcher.addListener(new PathWatcherDemo());
+        watcher.addListener (new PathWatcher.EventListListener(){
+
+            @Override
+            public void onPathWatchEvents(List<PathWatchEvent> events)
+            {
+               if (events == null)
+                   LOG.warn("Null events received");
+               if (events.isEmpty())
+                   LOG.warn("Empty events received");
+               
+               LOG.info("Bulk notification received");
+               for (PathWatchEvent e:events)
+                   onPathWatchEvent(e);
+                
+            }
+            
+        });
+        
+        watcher.setNotifyExistingOnStart(false);
+
+        List<String> excludes = new ArrayList<>();
+        excludes.add("glob:*.bak"); // ignore backup files
+        excludes.add("regex:^.*/\\~[^/]*$"); // ignore scratch files
+
+        for (Path path : paths)
+        {
+            if (Files.isDirectory(path))
+            {
+                PathWatcher.Config config = new PathWatcher.Config(path);
+                config.addExcludeHidden();
+                config.addExcludes(excludes);
+                config.setRecurseDepth(4);
+                watcher.watch(config);
+            }
+            else
+            {
+                watcher.watch(path);
+            }
+        }
+        watcher.start();
+        
+        Thread.currentThread().join();
+    }
+
+    @Override
+    public void onPathWatchEvent(PathWatchEvent event)
+    {
+        StringBuilder msg = new StringBuilder();
+        msg.append("onPathWatchEvent: [");
+        msg.append(event.getType());
+        msg.append("] ");
+        msg.append(event.getPath());
+        msg.append(" (count=").append(event.getCount()).append(")");
+        if (Files.isRegularFile(event.getPath()))
+        {
+            try
+            {
+                String fsize = String.format(" (filesize=%,d)",Files.size(event.getPath()));
+                msg.append(fsize);
+            }
+            catch (IOException e)
+            {
+                LOG.warn("Unable to get filesize",e);
+            }
+        }
+        LOG.info("{}",msg.toString());
+    }
+}
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/PathWatcherTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/PathWatcherTest.java
new file mode 100644
index 0000000..b0a168b
--- /dev/null
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/PathWatcherTest.java
@@ -0,0 +1,709 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util;
+
+import static org.eclipse.jetty.util.PathWatcher.PathWatchEventType.*;
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jetty.toolchain.test.OS;
+import org.eclipse.jetty.toolchain.test.TestingDir;
+import org.eclipse.jetty.util.PathWatcher.PathWatchEvent;
+import org.eclipse.jetty.util.PathWatcher.PathWatchEventType;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+
+@Ignore("Disabled due to behavioral differences in various FileSystems (hard to write a single testcase that works in all scenarios)")
+public class PathWatcherTest
+{
+    public static class PathWatchEventCapture implements PathWatcher.Listener
+    {
+        public final static String FINISH_TAG = "#finished#.tag";
+        private static final Logger LOG = Log.getLogger(PathWatcherTest.PathWatchEventCapture.class);
+        private final Path baseDir;
+
+        /**
+         * Map of relative paths seen, to their events seen (in order seen)
+         */
+        public Map<String, List<PathWatchEventType>> events = new HashMap<>();
+
+        public int latchCount = 1;
+        public CountDownLatch finishedLatch;
+        private PathWatchEventType triggerType;
+        private Path triggerPath;
+
+        public PathWatchEventCapture(Path baseDir)
+        {
+            this.baseDir = baseDir;
+        }
+        
+       public void reset()
+       {
+           finishedLatch = new CountDownLatch(latchCount);
+           events.clear();
+       }
+
+        @Override
+        public void onPathWatchEvent(PathWatchEvent event)
+        {
+            synchronized (events)
+            {
+                //if triggered by path
+                if (triggerPath != null)
+                {
+                   
+                    if (triggerPath.equals(event.getPath()) && (event.getType() == triggerType))
+                    {
+                        LOG.debug("Encountered finish trigger: {} on {}",event.getType(),event.getPath());
+                        finishedLatch.countDown();
+                    }
+                }
+                else if (finishedLatch != null)
+                {
+                    finishedLatch.countDown();
+                }
+                
+
+                Path relativePath = this.baseDir.relativize(event.getPath());
+                String key = relativePath.toString().replace(File.separatorChar,'/');
+
+                List<PathWatchEventType> types = this.events.get(key);
+                if (types == null)
+                {
+                    types = new ArrayList<>();
+                }
+                types.add(event.getType());
+                this.events.put(key,types);
+                LOG.debug("Captured Event: {} | {}",event.getType(),key);
+            }
+        }
+
+        /**
+         * Validate the events seen match expectations.
+         * <p>
+         * Note: order of events is only important when looking at a specific file or directory. Events for multiple
+         * files can overlap in ways that this assertion doesn't care about.
+         * 
+         * @param expectedEvents
+         *            the events expected
+         */
+        public void assertEvents(Map<String, PathWatchEventType[]> expectedEvents)
+        {
+            assertThat("Event match (file|diretory) count",this.events.size(),is(expectedEvents.size()));
+
+            for (Map.Entry<String, PathWatchEventType[]> entry : expectedEvents.entrySet())
+            {
+                String relativePath = entry.getKey();
+                PathWatchEventType[] expectedTypes = entry.getValue();
+                assertEvents(relativePath,expectedTypes);
+            }
+        }
+
+        /**
+         * Validate the events seen match expectations.
+         * <p>
+         * Note: order of events is only important when looking at a specific file or directory. Events for multiple
+         * files can overlap in ways that this assertion doesn't care about.
+         * 
+         * @param relativePath
+         *            the test relative path to look for
+         * 
+         * @param expectedEvents
+         *            the events expected
+         */
+        public void assertEvents(String relativePath, PathWatchEventType... expectedEvents)
+        {
+            synchronized (events)
+            {
+                List<PathWatchEventType> actualEvents = this.events.get(relativePath);
+                assertThat("Events for path [" + relativePath + "]",actualEvents,contains(expectedEvents));
+            }
+        }
+
+        /**
+         * Set the path and type that will trigger this capture to be finished
+         * 
+         * @param triggerPath
+         *            the trigger path we look for to know that the capture is complete
+         * @param triggerType
+         *            the trigger type we look for to know that the capture is complete
+         */
+        public void setFinishTrigger(Path triggerPath, PathWatchEventType triggerType)
+        {
+            this.triggerPath = triggerPath;
+            this.triggerType = triggerType;
+            this.latchCount = 1;
+            this.finishedLatch = new CountDownLatch(1);
+            LOG.debug("Setting finish trigger {} for path {}",triggerType,triggerPath);
+        }
+        
+        public void setFinishTrigger (int count)
+        {
+            latchCount = count;
+            finishedLatch = new CountDownLatch(latchCount);
+        }
+
+        /**
+         * Await the countdown latch on the finish trigger
+         * 
+         * @param pathWatcher
+         *            the watcher instance we are waiting on
+         * @throws IOException
+         *             if unable to create the finish tag file
+         * @throws InterruptedException
+         *             if unable to await the finish of the run
+         * @see #setFinishTrigger(Path, PathWatchEventType)
+         */
+        public void awaitFinish(PathWatcher pathWatcher) throws IOException, InterruptedException
+        {
+            //assertThat("Trigger Path must be set",triggerPath,notNullValue());
+            //assertThat("Trigger Type must be set",triggerType,notNullValue());
+            double multiplier = 25.0;
+            long awaitMillis = (long)((double)pathWatcher.getUpdateQuietTimeMillis() * multiplier);
+            LOG.debug("Waiting for finish ({} ms)",awaitMillis);
+            assertThat("Timed Out (" + awaitMillis + "ms) waiting for capture to finish",finishedLatch.await(awaitMillis,TimeUnit.MILLISECONDS),is(true));
+            LOG.debug("Finished capture");
+        }
+    }
+
+    private static void updateFile(Path path, String newContents) throws IOException
+    {
+        try (FileOutputStream out = new FileOutputStream(path.toFile()))
+        {
+            out.write(newContents.getBytes(StandardCharsets.UTF_8));
+            out.flush();
+            out.getChannel().force(true);
+            out.getFD().sync();
+        }
+    }
+
+    /**
+     * Update (optionally create) a file over time.
+     * <p>
+     * The file will be created in a slowed down fashion, over the time specified.
+     * 
+     * @param path
+     *            the file to update / create
+     * @param fileSize
+     *            the ultimate file size to create
+     * @param timeDuration
+     *            the time duration to take to create the file (approximate, not 100% accurate)
+     * @param timeUnit
+     *            the time unit to take to create the file
+     * @throws IOException
+     *             if unable to write file
+     * @throws InterruptedException
+     *             if sleep between writes was interrupted
+     */
+    private void updateFileOverTime(Path path, int fileSize, int timeDuration, TimeUnit timeUnit) throws IOException, InterruptedException
+    {
+        // how long to sleep between writes
+        int sleepMs = 100;
+
+        // how many millis to spend writing entire file size
+        long totalMs = timeUnit.toMillis(timeDuration);
+
+        // how many write chunks to write
+        int writeCount = (int)((int)totalMs / (int)sleepMs);
+
+        // average chunk buffer
+        int chunkBufLen = fileSize / writeCount;
+        byte chunkBuf[] = new byte[chunkBufLen];
+        Arrays.fill(chunkBuf,(byte)'x');
+
+        try (FileOutputStream out = new FileOutputStream(path.toFile()))
+        {
+            int left = fileSize;
+
+            while (left > 0)
+            {
+                int len = Math.min(left,chunkBufLen);
+                out.write(chunkBuf,0,len);
+                left -= chunkBufLen;
+                out.flush();
+                out.getChannel().force(true);
+                // Force file to actually write to disk.
+                // Skipping any sort of filesystem caching of the write
+                out.getFD().sync();
+                TimeUnit.MILLISECONDS.sleep(sleepMs);
+            }
+        }
+    }
+
+    /**
+     * Sleep longer than the quiet time.
+     * 
+     * @param pathWatcher
+     *            the path watcher to inspect for its quiet time
+     * @throws InterruptedException
+     *             if unable to sleep
+     */
+    private static void awaitQuietTime(PathWatcher pathWatcher) throws InterruptedException
+    {
+        double multiplier = 5.0;
+        if (OS.IS_WINDOWS)
+        {
+            // Microsoft Windows filesystem is too slow for a lower multiplier
+            multiplier = 6.0;
+        }
+        TimeUnit.MILLISECONDS.sleep((long)((double)pathWatcher.getUpdateQuietTimeMillis() * multiplier));
+    }
+
+    private static final int KB = 1024;
+    private static final int MB = KB * KB;
+
+    @Rule
+    public TestingDir testdir = new TestingDir();
+
+    @Test
+    public void testConfig_ShouldRecurse_0() throws IOException
+    {
+        Path dir = testdir.getEmptyDir().toPath();
+
+        // Create a few directories
+        Files.createDirectories(dir.resolve("a/b/c/d"));
+
+        PathWatcher.Config config = new PathWatcher.Config(dir);
+
+        config.setRecurseDepth(0);
+        assertThat("Config.recurse[0].shouldRecurse[./a/b]",config.shouldRecurseDirectory(dir.resolve("a/b")),is(false));
+        assertThat("Config.recurse[0].shouldRecurse[./a]",config.shouldRecurseDirectory(dir.resolve("a")),is(false));
+        assertThat("Config.recurse[0].shouldRecurse[./]",config.shouldRecurseDirectory(dir),is(false));
+    }
+
+    @Test
+    public void testConfig_ShouldRecurse_1() throws IOException
+    {
+        Path dir = testdir.getEmptyDir().toPath();
+
+        // Create a few directories
+        Files.createDirectories(dir.resolve("a/b/c/d"));
+
+        PathWatcher.Config config = new PathWatcher.Config(dir);
+
+        config.setRecurseDepth(1);
+        assertThat("Config.recurse[1].shouldRecurse[./a/b]",config.shouldRecurseDirectory(dir.resolve("a/b")),is(false));
+        assertThat("Config.recurse[1].shouldRecurse[./a]",config.shouldRecurseDirectory(dir.resolve("a")),is(true));
+        assertThat("Config.recurse[1].shouldRecurse[./]",config.shouldRecurseDirectory(dir),is(true));
+    }
+
+    @Test
+    public void testConfig_ShouldRecurse_2() throws IOException
+    {
+        Path dir = testdir.getEmptyDir().toPath();
+
+        // Create a few directories
+        Files.createDirectories(dir.resolve("a/b/c/d"));
+
+        PathWatcher.Config config = new PathWatcher.Config(dir);
+
+        config.setRecurseDepth(2);
+        assertThat("Config.recurse[1].shouldRecurse[./a/b/c]",config.shouldRecurseDirectory(dir.resolve("a/b/c")),is(false));
+        assertThat("Config.recurse[1].shouldRecurse[./a/b]",config.shouldRecurseDirectory(dir.resolve("a/b")),is(true));
+        assertThat("Config.recurse[1].shouldRecurse[./a]",config.shouldRecurseDirectory(dir.resolve("a")),is(true));
+        assertThat("Config.recurse[1].shouldRecurse[./]",config.shouldRecurseDirectory(dir),is(true));
+    }
+    
+    
+    @Test
+    public void testConfig_ShouldRecurse_3() throws IOException
+    {
+        Path dir = testdir.getEmptyDir().toPath();
+        
+        //Create some deep dirs
+        Files.createDirectories(dir.resolve("a/b/c/d/e/f/g"));
+        
+        PathWatcher.Config config = new PathWatcher.Config(dir);
+        config.setRecurseDepth(PathWatcher.Config.UNLIMITED_DEPTH);
+        assertThat("Config.recurse[1].shouldRecurse[./a/b/c/d/g]",config.shouldRecurseDirectory(dir.resolve("a/b/c/d/g")),is(true));
+        assertThat("Config.recurse[1].shouldRecurse[./a/b/c/d/f]",config.shouldRecurseDirectory(dir.resolve("a/b/c/d/f")),is(true));
+        assertThat("Config.recurse[1].shouldRecurse[./a/b/c/d/e]",config.shouldRecurseDirectory(dir.resolve("a/b/c/d/e")),is(true));
+        assertThat("Config.recurse[1].shouldRecurse[./a/b/c/d]",config.shouldRecurseDirectory(dir.resolve("a/b/c/d")),is(true));
+        assertThat("Config.recurse[1].shouldRecurse[./a/b/c]",config.shouldRecurseDirectory(dir.resolve("a/b/c")),is(true));
+        assertThat("Config.recurse[1].shouldRecurse[./a/b]",config.shouldRecurseDirectory(dir.resolve("a/b")),is(true));
+        assertThat("Config.recurse[1].shouldRecurse[./a]",config.shouldRecurseDirectory(dir.resolve("a")),is(true));
+        assertThat("Config.recurse[1].shouldRecurse[./]",config.shouldRecurseDirectory(dir),is(true));
+    }
+    
+    @Test
+    public void testRestart() throws Exception
+    {
+        Path dir = testdir.getEmptyDir().toPath();
+        Files.createDirectories(dir.resolve("b/c"));
+        Files.createFile(dir.resolve("a.txt"));
+        Files.createFile(dir.resolve("b.txt"));
+        
+        PathWatcher pathWatcher = new PathWatcher();
+        pathWatcher.setNotifyExistingOnStart(true);
+        pathWatcher.setUpdateQuietTime(500,TimeUnit.MILLISECONDS);
+        
+        // Add listener
+        PathWatchEventCapture capture = new PathWatchEventCapture(dir);
+        capture.setFinishTrigger(2);
+        pathWatcher.addListener(capture);
+
+      
+        PathWatcher.Config config = new PathWatcher.Config(dir);
+        config.setRecurseDepth(PathWatcher.Config.UNLIMITED_DEPTH);
+        config.addIncludeGlobRelative("*.txt");
+        pathWatcher.watch(config);
+        try
+        {
+            pathWatcher.start();
+
+            // Let quiet time do its thing
+            awaitQuietTime(pathWatcher);
+
+            Map<String, PathWatchEventType[]> expected = new HashMap<>();
+            
+         
+            expected.put("a.txt",new PathWatchEventType[] {ADDED});
+            expected.put("b.txt",new PathWatchEventType[] {ADDED});
+
+         
+            capture.assertEvents(expected);
+            
+            //stop it
+            pathWatcher.stop();
+            
+            capture.reset();
+            
+            Thread.currentThread().sleep(1000);
+            
+            pathWatcher.start();
+            
+            awaitQuietTime(pathWatcher);
+            
+            capture.assertEvents(expected);
+            
+        }
+        finally
+        {
+            pathWatcher.stop();
+        }
+    }
+
+    /**
+     * When starting up the PathWatcher, the events should occur
+     * indicating files that are of interest that already exist
+     * on the filesystem.
+     * 
+     * @throws Exception
+     *             on test failure
+     */
+    @Test
+    public void testStartupFindFiles() throws Exception
+    {
+        Path dir = testdir.getEmptyDir().toPath();
+
+        // Files we are interested in
+        Files.createFile(dir.resolve("foo.war"));
+        Files.createDirectories(dir.resolve("bar/WEB-INF"));
+        Files.createFile(dir.resolve("bar/WEB-INF/web.xml"));
+
+        // Files we don't care about
+        Files.createFile(dir.resolve("foo.war.backup"));
+        Files.createFile(dir.resolve(".hidden.war"));
+        Files.createDirectories(dir.resolve(".wat/WEB-INF"));
+        Files.createFile(dir.resolve(".wat/huh.war"));
+        Files.createFile(dir.resolve(".wat/WEB-INF/web.xml"));
+
+        PathWatcher pathWatcher = new PathWatcher();
+        pathWatcher.setUpdateQuietTime(300,TimeUnit.MILLISECONDS);
+
+        // Add listener
+        PathWatchEventCapture capture = new PathWatchEventCapture(dir);
+        pathWatcher.addListener(capture);
+
+        // Add test dir configuration
+        PathWatcher.Config baseDirConfig = new PathWatcher.Config(dir);
+        baseDirConfig.setRecurseDepth(2);
+        baseDirConfig.addExcludeHidden();
+        baseDirConfig.addIncludeGlobRelative("*.war");
+        baseDirConfig.addIncludeGlobRelative("*/WEB-INF/web.xml");
+        pathWatcher.watch(baseDirConfig);
+
+        try
+        {
+            pathWatcher.start();
+
+            // Let quiet time do its thing
+            awaitQuietTime(pathWatcher);
+
+            Map<String, PathWatchEventType[]> expected = new HashMap<>();
+
+            expected.put("bar/WEB-INF/web.xml",new PathWatchEventType[] { ADDED });
+            expected.put("foo.war",new PathWatchEventType[] { ADDED });
+
+            capture.assertEvents(expected);
+        }
+        finally
+        {
+            pathWatcher.stop();
+        }
+    }
+    
+    @Test
+    public void testGlobPattern () throws Exception
+    {
+        Path dir = testdir.getEmptyDir().toPath();
+
+        // Files we are interested in
+        Files.createFile(dir.resolve("a.txt"));
+        Files.createDirectories(dir.resolve("b/b.txt"));
+        Files.createDirectories(dir.resolve("c/d"));
+        Files.createFile(dir.resolve("c/d/d.txt"));
+        Files.createFile(dir.resolve(".foo.txt"));
+
+        // Files we don't care about
+        Files.createFile(dir.resolve("txt.foo"));
+        Files.createFile(dir.resolve("b/foo.xml"));
+    
+
+        PathWatcher pathWatcher = new PathWatcher();
+        pathWatcher.setUpdateQuietTime(300,TimeUnit.MILLISECONDS);
+
+        // Add listener
+        PathWatchEventCapture capture = new PathWatchEventCapture(dir);
+        capture.setFinishTrigger(3);
+        pathWatcher.addListener(capture);
+
+        // Add test dir configuration
+        PathWatcher.Config baseDirConfig = new PathWatcher.Config(dir);
+        baseDirConfig.setRecurseDepth(PathWatcher.Config.UNLIMITED_DEPTH);
+        baseDirConfig.addExcludeHidden();
+        baseDirConfig.addIncludeGlobRelative("**.txt");
+        pathWatcher.watch(baseDirConfig);
+
+        try
+        {
+            pathWatcher.start();
+
+            // Let quiet time do its thing
+            awaitQuietTime(pathWatcher);
+
+            Map<String, PathWatchEventType[]> expected = new HashMap<>();
+
+            expected.put("a.txt",new PathWatchEventType[] { ADDED });
+            expected.put("b/b.txt",new PathWatchEventType[] { ADDED });
+            expected.put("c/d/d.txt",new PathWatchEventType[] { ADDED });
+            capture.assertEvents(expected);
+        }
+        finally
+        {
+            pathWatcher.stop();
+        }
+    }
+
+    @Test
+    public void testDeployFiles_Update_Delete() throws Exception
+    {
+        Path dir = testdir.getEmptyDir().toPath();
+
+        // Files we are interested in
+        Files.createFile(dir.resolve("foo.war"));
+        Files.createDirectories(dir.resolve("bar/WEB-INF"));
+        Files.createFile(dir.resolve("bar/WEB-INF/web.xml"));
+
+        PathWatcher pathWatcher = new PathWatcher();
+        pathWatcher.setUpdateQuietTime(300,TimeUnit.MILLISECONDS);
+
+        // Add listener
+        PathWatchEventCapture capture = new PathWatchEventCapture(dir);
+        capture.setFinishTrigger(5);
+        pathWatcher.addListener(capture);
+
+        // Add test dir configuration
+        PathWatcher.Config baseDirConfig = new PathWatcher.Config(dir);
+        baseDirConfig.setRecurseDepth(2);
+        baseDirConfig.addExcludeHidden();
+        baseDirConfig.addIncludeGlobRelative("*.war");
+        baseDirConfig.addIncludeGlobRelative("*/WEB-INF/web.xml");
+        pathWatcher.watch(baseDirConfig);
+
+        try
+        {
+            pathWatcher.start();
+
+            // Pretend that startup occurred
+            awaitQuietTime(pathWatcher);
+
+            // Update web.xml
+            Path webFile = dir.resolve("bar/WEB-INF/web.xml");
+            //capture.setFinishTrigger(webFile,MODIFIED);
+            updateFile(webFile,"Hello Update");
+
+            // Delete war
+            Files.delete(dir.resolve("foo.war"));
+
+            // Add a another new war
+            Files.createFile(dir.resolve("bar.war"));
+
+            // Let capture complete
+            capture.awaitFinish(pathWatcher);
+
+            Map<String, PathWatchEventType[]> expected = new HashMap<>();
+
+            expected.put("bar/WEB-INF/web.xml",new PathWatchEventType[] { ADDED, MODIFIED });
+            expected.put("foo.war",new PathWatchEventType[] { ADDED, DELETED });
+            expected.put("bar.war",new PathWatchEventType[] { ADDED });
+
+            capture.assertEvents(expected);
+        }
+        finally
+        {
+            pathWatcher.stop();
+        }
+    }
+
+    @Test
+    public void testDeployFiles_NewWar() throws Exception
+    {
+        Path dir = testdir.getEmptyDir().toPath();
+
+        // Files we are interested in
+        Files.createFile(dir.resolve("foo.war"));
+        Files.createDirectories(dir.resolve("bar/WEB-INF"));
+        Files.createFile(dir.resolve("bar/WEB-INF/web.xml"));
+
+        PathWatcher pathWatcher = new PathWatcher();
+        pathWatcher.setUpdateQuietTime(300,TimeUnit.MILLISECONDS);
+
+        // Add listener
+        PathWatchEventCapture capture = new PathWatchEventCapture(dir);
+        pathWatcher.addListener(capture);
+
+        // Add test dir configuration
+        PathWatcher.Config baseDirConfig = new PathWatcher.Config(dir);
+        baseDirConfig.setRecurseDepth(2);
+        baseDirConfig.addExcludeHidden();
+        baseDirConfig.addIncludeGlobRelative("*.war");
+        baseDirConfig.addIncludeGlobRelative("*/WEB-INF/web.xml");
+        pathWatcher.watch(baseDirConfig);
+
+        try
+        {
+            pathWatcher.start();
+
+            // Pretend that startup occurred
+            awaitQuietTime(pathWatcher);
+
+            // New war added
+            Path warFile = dir.resolve("hello.war");
+            capture.setFinishTrigger(warFile,MODIFIED);
+            updateFile(warFile,"Hello Update");
+
+            // Let capture finish
+            capture.awaitFinish(pathWatcher);
+
+            Map<String, PathWatchEventType[]> expected = new HashMap<>();
+
+            expected.put("bar/WEB-INF/web.xml",new PathWatchEventType[] { ADDED });
+            expected.put("foo.war",new PathWatchEventType[] { ADDED });
+            expected.put("hello.war",new PathWatchEventType[] { ADDED, MODIFIED });
+
+            capture.assertEvents(expected);
+        }
+        finally
+        {
+            pathWatcher.stop();
+        }
+    }
+
+    /**
+     * Pretend to add a new war file that is large, and being copied into place
+     * using some sort of technique that is slow enough that it takes a while for
+     * the entire war file to exist in place.
+     * <p>
+     * This is to test the quiet time logic to ensure that only a single MODIFIED event occurs on this new war file
+     * 
+     * @throws Exception
+     *             on test failure
+     */
+    @Test
+    public void testDeployFiles_NewWar_LargeSlowCopy() throws Exception
+    {
+        Path dir = testdir.getEmptyDir().toPath();
+
+        // Files we are interested in
+        Files.createFile(dir.resolve("foo.war"));
+        Files.createDirectories(dir.resolve("bar/WEB-INF"));
+        Files.createFile(dir.resolve("bar/WEB-INF/web.xml"));
+
+        PathWatcher pathWatcher = new PathWatcher();
+        pathWatcher.setUpdateQuietTime(500,TimeUnit.MILLISECONDS);
+
+        // Add listener
+        PathWatchEventCapture capture = new PathWatchEventCapture(dir);
+        pathWatcher.addListener(capture);
+
+        // Add test dir configuration
+        PathWatcher.Config baseDirConfig = new PathWatcher.Config(dir);
+        baseDirConfig.setRecurseDepth(2);
+        baseDirConfig.addExcludeHidden();
+        baseDirConfig.addIncludeGlobRelative("*.war");
+        baseDirConfig.addIncludeGlobRelative("*/WEB-INF/web.xml");
+        pathWatcher.watch(baseDirConfig);
+
+        try
+        {
+            pathWatcher.start();
+
+            // Pretend that startup occurred
+            awaitQuietTime(pathWatcher);
+
+            // New war added (slowly)
+            Path warFile = dir.resolve("hello.war");
+            capture.setFinishTrigger(warFile,MODIFIED);
+            updateFileOverTime(warFile,50 * MB,3,TimeUnit.SECONDS);
+
+            // Let capture finish
+            capture.awaitFinish(pathWatcher);
+
+            Map<String, PathWatchEventType[]> expected = new HashMap<>();
+
+            expected.put("bar/WEB-INF/web.xml",new PathWatchEventType[] { ADDED });
+            expected.put("foo.war",new PathWatchEventType[] { ADDED });
+            expected.put("hello.war",new PathWatchEventType[] { ADDED, MODIFIED });
+
+            capture.assertEvents(expected);
+        }
+        finally
+        {
+            pathWatcher.stop();
+        }
+    }
+}
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/RegexSetTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/RegexSetTest.java
new file mode 100644
index 0000000..f80c2ed
--- /dev/null
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/RegexSetTest.java
@@ -0,0 +1,86 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util;
+
+import org.junit.Test;
+
+import org.junit.Assert;
+
+public class RegexSetTest
+{
+
+    @Test
+    public void testEmpty()
+    {
+        RegexSet set = new RegexSet();
+        
+        Assert.assertEquals(false,set.contains("foo"));
+        Assert.assertEquals(false,set.matches("foo"));
+        Assert.assertEquals(false,set.matches(""));
+        
+    }
+    
+    @Test
+    public void testSimple()
+    {
+        RegexSet set = new RegexSet();
+        set.add("foo.*");
+        
+        Assert.assertEquals(true,set.contains("foo.*"));
+        Assert.assertEquals(true,set.matches("foo"));
+        Assert.assertEquals(true,set.matches("foobar"));
+        Assert.assertEquals(false,set.matches("bar"));
+        Assert.assertEquals(false,set.matches(""));
+        
+    }
+    
+    @Test
+    public void testSimpleTerminated()
+    {
+        RegexSet set = new RegexSet();
+        set.add("^foo.*$");
+        
+        Assert.assertEquals(true,set.contains("^foo.*$"));
+        Assert.assertEquals(true,set.matches("foo"));
+        Assert.assertEquals(true,set.matches("foobar"));
+        Assert.assertEquals(false,set.matches("bar"));
+        Assert.assertEquals(false,set.matches(""));
+    }
+    
+    @Test
+    public void testCombined()
+    {
+        RegexSet set = new RegexSet();
+        set.add("^foo.*$");
+        set.add("bar");
+        set.add("[a-z][0-9][a-z][0-9]");
+        
+        Assert.assertEquals(true,set.contains("^foo.*$"));
+        Assert.assertEquals(true,set.matches("foo"));
+        Assert.assertEquals(true,set.matches("foobar"));
+        Assert.assertEquals(true,set.matches("bar"));
+        Assert.assertEquals(true,set.matches("c3p0"));
+        Assert.assertEquals(true,set.matches("r2d2"));
+
+        Assert.assertEquals(false,set.matches("wibble"));
+        Assert.assertEquals(false,set.matches("barfoo"));
+        Assert.assertEquals(false,set.matches("2b!b"));
+        Assert.assertEquals(false,set.matches(""));
+    }
+}
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/ScannerTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/ScannerTest.java
index db0a4cb..b405f99 100644
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/ScannerTest.java
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/ScannerTest.java
@@ -50,8 +50,12 @@
     @BeforeClass
     public static void setUpBeforeClass() throws Exception
     {
-        _directory = MavenTestingUtils.getTargetTestingDir(ScannerTest.class.getSimpleName());
-        FS.ensureEmpty(_directory);
+        File testDir = MavenTestingUtils.getTargetTestingDir(ScannerTest.class.getSimpleName());
+        FS.ensureEmpty(testDir);
+        
+        // Use full path, pointing to a real directory (for FileSystems that are case-insensitive, like Windows and OSX to use)
+        // This is only needed for the various comparisons below to make sense.
+        _directory = testDir.toPath().toRealPath().toFile();
 
         _scanner = new Scanner();
         _scanner.addScanDir(_directory);
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/SharedBlockingCallbackTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/SharedBlockingCallbackTest.java
index eba2e22..d437187 100644
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/SharedBlockingCallbackTest.java
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/SharedBlockingCallbackTest.java
@@ -201,7 +201,7 @@
 
             blocker.succeeded();
             blocker.block();
-        };
+        }
         Assert.assertThat(System.currentTimeMillis()-start,Matchers.lessThan(600L)); 
         Assert.assertEquals(0,notComplete.get());     
     }
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/StringUtilTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/StringUtilTest.java
index 8c4b05f..394d1f3 100644
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/StringUtilTest.java
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/StringUtilTest.java
@@ -18,12 +18,17 @@
 
 package org.eclipse.jetty.util;
 
+import static org.hamcrest.Matchers.arrayContaining;
+import static org.hamcrest.Matchers.emptyArray;
+import static org.hamcrest.Matchers.nullValue;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
 import java.nio.charset.StandardCharsets;
 
+import org.hamcrest.Matchers;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -241,4 +246,32 @@
         assertEquals("Hello &lt;Cruel&gt; World",StringUtil.sanitizeXmlString("Hello <Cruel> World"));
         assertEquals("Hello ? World",StringUtil.sanitizeXmlString("Hello \u0000 World"));
     }
+    
+    @Test
+    public void testSplit()
+    {
+        assertThat(StringUtil.csvSplit(null),nullValue());
+        assertThat(StringUtil.csvSplit(null),nullValue());
+        
+        assertThat(StringUtil.csvSplit(""),emptyArray());
+        assertThat(StringUtil.csvSplit(" \t\n"),emptyArray());
+        
+        assertThat(StringUtil.csvSplit("aaa"),arrayContaining("aaa"));
+        assertThat(StringUtil.csvSplit(" \taaa\n"),arrayContaining("aaa"));
+        assertThat(StringUtil.csvSplit(" \ta\n"),arrayContaining("a"));
+        assertThat(StringUtil.csvSplit(" \t\u1234\n"),arrayContaining("\u1234"));
+        
+        assertThat(StringUtil.csvSplit("aaa,bbb,ccc"),arrayContaining("aaa","bbb","ccc"));
+        assertThat(StringUtil.csvSplit("aaa,,ccc"),arrayContaining("aaa","","ccc"));
+        assertThat(StringUtil.csvSplit(",b b,"),arrayContaining("","b b"));
+        assertThat(StringUtil.csvSplit(",,bbb,,"),arrayContaining("","","bbb",""));
+        
+        assertThat(StringUtil.csvSplit(" aaa, bbb, ccc"),arrayContaining("aaa","bbb","ccc"));
+        assertThat(StringUtil.csvSplit("aaa,\t,ccc"),arrayContaining("aaa","","ccc"));
+        assertThat(StringUtil.csvSplit("  ,  b b  ,   "),arrayContaining("","b b"));
+        assertThat(StringUtil.csvSplit(" ,\n,bbb, , "),arrayContaining("","","bbb",""));
+        
+        assertThat(StringUtil.csvSplit("\"aaa\", \" b,\\\"\",\"\""),arrayContaining("aaa"," b,\"",""));
+    }
+    
 }
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/URIUtilTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/URIUtilTest.java
index 68409b9..d0eaf44 100644
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/URIUtilTest.java
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/URIUtilTest.java
@@ -60,8 +60,15 @@
     @Test
     public void testDecodePath()
     {
+        assertEquals("/foo/bar",URIUtil.decodePath("xx/foo/barxx",2,8));
+        assertEquals("/foo/bar",URIUtil.decodePath("/foo/bar"));
+        assertEquals("/f o/b r",URIUtil.decodePath("/f%20o/b%20r"));
+        assertEquals("/foo/bar",URIUtil.decodePath("/foo;ignore/bar;ignore"));
+        assertEquals("/fää/bar",URIUtil.decodePath("/fää;ignore/bar;ignore"));
+        assertEquals("/f\u0629\u0629%23/bar",URIUtil.decodePath("/f%d8%a9%d8%a9%2523;ignore/bar;ignore"));
+        
         assertEquals("foo%23;,:=b a r",URIUtil.decodePath("foo%2523%3b%2c:%3db%20a%20r;rubbish"));
-        assertEquals("foo%23;,:=b a r=",URIUtil.decodePath("xxxfoo%2523%3b%2c:%3db%20a%20r%3Dxxx;rubbish".getBytes(),3,30));
+        assertEquals("/foo/bar%23;,:=b a r=",URIUtil.decodePath("xxx/foo/bar%2523%3b%2c:%3db%20a%20r%3Dxxx;rubbish",3,35));
         assertEquals("fää%23;,:=b a r=",URIUtil.decodePath("fää%2523%3b%2c:%3db%20a%20r%3D"));
         assertEquals("f\u0629\u0629%23;,:=b a r",URIUtil.decodePath("f%d8%a9%d8%a9%2523%3b%2c:%3db%20a%20r"));
         
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/URLEncodedTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/URLEncodedTest.java
index 3cf9f0b..ca5e10c 100644
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/URLEncodedTest.java
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/URLEncodedTest.java
@@ -165,9 +165,9 @@
         assertEquals("encoded param size",1, url_encoded.size());
         assertEquals("encoded get", "xx\ufffdyy", url_encoded.getString("Name15"));
 
-        byte[] bad="Name=%FF%FF%FF".getBytes(StandardCharsets.UTF_8);
+        String bad="Name=%FF%FF%FF";
         MultiMap<String> map = new MultiMap<String>();
-        UrlEncoded.decodeUtf8To(bad,0,bad.length,map);
+        UrlEncoded.decodeUtf8To(bad,map);
         assertEquals("encoded param size",1, map.size());
         assertEquals("encoded get", "\ufffd\ufffd\ufffd", map.getString("Name"));
         
@@ -214,7 +214,7 @@
         {
             ByteArrayInputStream in = new ByteArrayInputStream(("name\n=value+"+charsets[i][2]+"&name1=&name2&n\u00e3me3=value+3").getBytes(charsets[i][0]));
             MultiMap<String> m = new MultiMap<>();
-            UrlEncoded.decodeTo(in, m, charsets[i][1]==null?null:Charset.forName(charsets[i][1]), -1,-1);
+            UrlEncoded.decodeTo(in, m, charsets[i][1]==null?null:Charset.forName(charsets[i][1]),-1,-1);
             assertEquals(charsets[i][1]+" stream length",4,m.size());
             assertEquals(charsets[i][1]+" stream name\\n","value 0",m.getString("name\n"));
             assertEquals(charsets[i][1]+" stream name1","",m.getString("name1"));
@@ -227,7 +227,7 @@
         {
             ByteArrayInputStream in2 = new ByteArrayInputStream("name=%83e%83X%83g".getBytes(StandardCharsets.ISO_8859_1));
             MultiMap<String> m2 = new MultiMap<>();
-            UrlEncoded.decodeTo(in2, m2, Charset.forName("Shift_JIS"), -1,-1);
+            UrlEncoded.decodeTo(in2, m2, Charset.forName("Shift_JIS"),-1,-1);
             assertEquals("stream length",1,m2.size());
             assertEquals("stream name","\u30c6\u30b9\u30c8",m2.getString("name"));
         }
@@ -279,12 +279,12 @@
 
         MultiMap<String> map = new MultiMap<>();
         UrlEncoded.LOG.info("EXPECT 4 Not Valid UTF8 warnings...");
-        UrlEncoded.decodeUtf8To(query.getBytes(StandardCharsets.ISO_8859_1),0,query.length(),map);
+        UrlEncoded.decodeUtf8To(query,0,query.length(),map);
         assertEquals("X"+Utf8Appendable.REPLACEMENT+Utf8Appendable.REPLACEMENT+"Z",map.getValue("name",0));
 
         map.clear();
 
-        UrlEncoded.decodeUtf8To(new ByteArrayInputStream(query.getBytes(StandardCharsets.ISO_8859_1)),map,100,2);
+        UrlEncoded.decodeUtf8To(new ByteArrayInputStream(query.getBytes(StandardCharsets.ISO_8859_1)),map,100,-1);
         assertEquals("X"+Utf8Appendable.REPLACEMENT+Utf8Appendable.REPLACEMENT+"Z",map.getValue("name",0));
     }
 }
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/UrlEncodedUtf8Test.java b/jetty-util/src/test/java/org/eclipse/jetty/util/UrlEncodedUtf8Test.java
index 9dee7fe..cae8821 100644
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/UrlEncodedUtf8Test.java
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/UrlEncodedUtf8Test.java
@@ -40,7 +40,7 @@
         String test=new String(bytes,StandardCharsets.UTF_8);
         String expected = "c"+Utf8Appendable.REPLACEMENT;
 
-        fromByteArray(test,bytes,"ab",expected,false);
+        fromString(test,test,"ab",expected,false);
         fromInputStream(test,bytes,"ab",expected,false);
     }
 
@@ -51,7 +51,7 @@
         String test=new String(bytes,StandardCharsets.UTF_8);
         String expected = ""+Utf8Appendable.REPLACEMENT;
 
-        fromByteArray(test,bytes,"ab",expected,false);
+        fromString(test,test,"ab",expected,false);
         fromInputStream(test,bytes,"ab",expected,false);
         
     }
@@ -64,7 +64,7 @@
         String name = "e"+Utf8Appendable.REPLACEMENT;
         String value = "fg";
 
-        fromByteArray(test,bytes,name,value,false);
+        fromString(test,test,name,value,false);
         fromInputStream(test,bytes,name,value,false);
     }
     
@@ -76,9 +76,8 @@
         String name = "ef";
         String value = "g"+Utf8Appendable.REPLACEMENT;
 
-        fromByteArray(test,bytes,name,value,false);
+        fromString(test,test,name,value,false);
         fromInputStream(test,bytes,name,value,false);
-        
     }
 
     @Test
@@ -90,9 +89,8 @@
         String name = "a";
         String value = "a";
 
-        fromByteArray(test,bytes,name,value,false);
+        fromString(test,test,name,value,false);
         fromInputStream(test,bytes,name,value,false);
-        
     }
     
     @Test
@@ -104,9 +102,8 @@
         String name = "a";
         String value = ""+Utf8Appendable.REPLACEMENT;
 
-        fromByteArray(test,bytes,name,value,false);
+        fromString(test,test,name,value,false);
         fromInputStream(test,bytes,name,value,false);
-        
     }
     
     @Test
@@ -118,18 +115,16 @@
         String name = "a";
         String value = ""+Utf8Appendable.REPLACEMENT;
 
-        fromByteArray(test,bytes,name,value,false);
+        fromString(test,test,name,value,false);
         fromInputStream(test,bytes,name,value,false);
-        
     }
 
-    static void fromByteArray(String test,byte[] b,String field,String expected,boolean thrown) throws Exception
+    static void fromString(String test,String s,String field,String expected,boolean thrown) throws Exception
     {
         MultiMap<String> values=new MultiMap<>();
         try
         {
-            //safeDecodeUtf8To(b, 0, b.length, values);
-            UrlEncoded.decodeUtf8To(b, 0, b.length, values);
+            UrlEncoded.decodeUtf8To(s, 0, s.length(), values);
             if (thrown)
                 Assert.fail();
             Assert.assertEquals(test, expected, values.getString(field));
@@ -148,8 +143,7 @@
         MultiMap<String> values=new MultiMap<>();
         try
         {
-            //safeDecodeUtf8To(is, values, 1000000, 10000000);
-            UrlEncoded.decodeUtf8To(is, values, 1000000, 10000000);
+            UrlEncoded.decodeUtf8To(is, values, 1000000,-1);
             if (thrown)
                 Assert.fail();
             Assert.assertEquals(test, expected, values.getString(field));
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/component/LifeCycleListenerNestedTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/component/LifeCycleListenerNestedTest.java
index 40e4b34..cd9e72b 100644
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/component/LifeCycleListenerNestedTest.java
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/component/LifeCycleListenerNestedTest.java
@@ -18,21 +18,27 @@
 
 package org.eclipse.jetty.util.component;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.hasItem;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
 
 import java.util.ArrayList;
 import java.util.List;
 
 import org.hamcrest.Matcher;
+import org.junit.Ignore;
 import org.junit.Test;
 
 /**
  * Testing for LifeCycleListener events on nested components
  * during runtime.
  */
+@Ignore
 public class LifeCycleListenerNestedTest
 {
+    // Set this true to use test-specific workaround.
+    private final boolean WORKAROUND = false;
+    
     public static class Foo extends ContainerLifeCycle
     {
         @Override
@@ -153,18 +159,18 @@
         @Override
         public void beanAdded(Container parent, Object child)
         {
-            if(child instanceof ContainerLifeCycle)
+            if(child instanceof LifeCycle)
             {
-                ((ContainerLifeCycle)child).addLifeCycleListener(this);
+                ((LifeCycle)child).addLifeCycleListener(this);
             }
         }
 
         @Override
         public void beanRemoved(Container parent, Object child)
         {
-            if(child instanceof ContainerLifeCycle)
+            if(child instanceof LifeCycle)
             {
-                ((ContainerLifeCycle)child).removeLifeCycleListener(this);
+                ((LifeCycle)child).removeLifeCycleListener(this);
             }
         }
     }
@@ -180,7 +186,8 @@
 
         CapturingListener listener = new CapturingListener();
         foo.addLifeCycleListener(listener);
-        foo.addEventListener(listener);
+        if(WORKAROUND)
+            foo.addEventListener(listener);
 
         try
         {
@@ -210,7 +217,8 @@
 
         CapturingListener listener = new CapturingListener();
         foo.addLifeCycleListener(listener);
-        foo.addEventListener(listener);
+        if(WORKAROUND)
+            foo.addEventListener(listener);
 
         Bar bara = new Bar("a");
         Bar barb = new Bar("b");
@@ -247,7 +255,8 @@
 
         CapturingListener listener = new CapturingListener();
         foo.addLifeCycleListener(listener);
-        foo.addEventListener(listener);
+        if(WORKAROUND)
+            foo.addEventListener(listener);
 
         try
         {
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/log/StdErrLogTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/log/StdErrLogTest.java
index 38fd37e..e80ed1a 100644
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/log/StdErrLogTest.java
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/log/StdErrLogTest.java
@@ -39,6 +39,11 @@
  */
 public class StdErrLogTest
 {
+    static
+    {
+        StdErrLog.setTagPad(0);
+    }
+    
     @Before
     public void before()
     {
@@ -156,6 +161,7 @@
 
     /**
      * Test to make sure that using a Null parameter on parameterized messages does not result in a NPE
+     * @throws NullPointerException failed test
      */
     @Test
     public void testParameterizedMessage_NullValues() throws NullPointerException
@@ -302,6 +308,7 @@
      * Tests StdErrLog.warn() methods with level filtering.
      * <p>
      * Should always see WARN level messages, regardless of set level.
+     * @throws UnsupportedEncodingException failed test
      */
     @Test
     public void testWarnFiltering() throws UnsupportedEncodingException
@@ -341,6 +348,7 @@
      * Tests StdErrLog.info() methods with level filtering.
      * <p>
      * Should only see INFO level messages when level is set to {@link StdErrLog#LEVEL_INFO} and below.
+     * @throws UnsupportedEncodingException failed test
      */
     @Test
     public void testInfoFiltering() throws UnsupportedEncodingException
@@ -386,6 +394,7 @@
 
     /**
      * Tests {@link StdErrLog#LEVEL_OFF} filtering.
+     * @throws UnsupportedEncodingException failed test
      */
     @Test
     public void testOffFiltering() throws UnsupportedEncodingException
@@ -413,6 +422,7 @@
      * Tests StdErrLog.debug() methods with level filtering.
      * <p>
      * Should only see DEBUG level messages when level is set to {@link StdErrLog#LEVEL_DEBUG} and below.
+     * @throws UnsupportedEncodingException failed test
      */
     @Test
     public void testDebugFiltering() throws UnsupportedEncodingException
@@ -461,6 +471,7 @@
      * Tests StdErrLog with {@link Logger#ignore(Throwable)} use.
      * <p>
      * Should only see IGNORED level messages when level is set to {@link StdErrLog#LEVEL_ALL}.
+     * @throws UnsupportedEncodingException failed test
      */
     @Test
     public void testIgnores() throws UnsupportedEncodingException
@@ -605,7 +616,7 @@
     @Test
     public void testGetChildLogger_NullParent()
     {
-        StdErrLog log = new StdErrLog(null,new Properties());
+        AbstractLogger log = new StdErrLog(null,new Properties());
 
         Assert.assertThat("Logger.name", log.getName(), is(""));
 
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/AbstractFSResourceTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/AbstractFSResourceTest.java
deleted file mode 100644
index 67cafac..0000000
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/AbstractFSResourceTest.java
+++ /dev/null
@@ -1,535 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.util.resource;
-
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
-import static org.junit.Assume.*;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.net.URI;
-import java.net.URL;
-import java.nio.ByteBuffer;
-import java.nio.channels.ReadableByteChannel;
-import java.nio.file.FileSystemException;
-import java.nio.file.Files;
-import java.nio.file.InvalidPathException;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.jetty.toolchain.test.FS;
-import org.eclipse.jetty.toolchain.test.IO;
-import org.eclipse.jetty.toolchain.test.OS;
-import org.eclipse.jetty.toolchain.test.TestingDir;
-import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.CollectionAssert;
-import org.junit.Assert;
-import org.junit.Rule;
-import org.junit.Test;
-
-public abstract class AbstractFSResourceTest
-{
-    @Rule
-    public TestingDir testdir = new TestingDir();
-
-    public abstract Resource newResource(URI uri) throws IOException;
-
-    public abstract Resource newResource(File file) throws IOException;
-
-    private URI createEmptyFile(String name) throws IOException
-    {
-        File file = testdir.getFile(name);
-        file.createNewFile();
-        return file.toURI();
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testNonAbsoluteURI() throws Exception
-    {
-        newResource(new URI("path/to/resource"));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testNotFileURI() throws Exception
-    {
-        newResource(new URI("http://www.eclipse.org/jetty/"));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testBogusFilename() throws Exception
-    {
-        if (OS.IS_UNIX)
-        {
-            // A windows path is invalid under unix
-            newResource(new URI("file://Z:/:"));
-        }
-        else if (OS.IS_WINDOWS)
-        {
-            // "CON" is a reserved name under windows
-            newResource(new URI("file://CON"));
-        }
-        else
-        {
-            assumeFalse("Unknown OS type",false);
-        }   
-    }
-
-    @Test
-    public void testIsContainedIn() throws Exception
-    {
-        createEmptyFile("foo");
-
-        try (Resource base = newResource(testdir.getDir()))
-        {
-            Resource res = base.addPath("foo");
-            assertThat("is contained in",res.isContainedIn(base),is(false));
-        }
-    }
-
-    @Test
-    public void testAddPath() throws Exception
-    {
-        File dir = testdir.getDir();
-        File subdir = new File(dir,"sub");
-        FS.ensureDirExists(subdir);
-
-        try (Resource base = newResource(testdir.getDir()))
-        {
-            Resource sub = base.addPath("sub");
-            assertThat("sub/.isDirectory",sub.isDirectory(),is(true));
-            
-            Resource tmp = sub.addPath("/tmp");
-            assertThat("No root",tmp.exists(),is(false));
-        }
-    }
-    
-    @Test
-    public void testIsDirectory() throws Exception
-    {
-        File dir = testdir.getDir();
-        createEmptyFile("foo");
-
-        File subdir = new File(dir,"sub");
-        FS.ensureDirExists(subdir);
-
-        try (Resource base = newResource(testdir.getDir()))
-        {
-            Resource res = base.addPath("foo");
-            assertThat("foo.isDirectory",res.isDirectory(),is(false));
-
-            Resource sub = base.addPath("sub");
-            assertThat("sub/.isDirectory",sub.isDirectory(),is(true));
-        }
-    }
-
-    @Test
-    public void testLastModified() throws Exception
-    {
-        File file = testdir.getFile("foo");
-        file.createNewFile();
-
-        long expected = file.lastModified();
-
-        try (Resource base = newResource(testdir.getDir()))
-        {
-            Resource res = base.addPath("foo");
-            assertThat("foo.lastModified",res.lastModified(),is(expected));
-        }
-    }
-
-    @Test
-    public void testLastModified_NotExists() throws Exception
-    {
-        try (Resource base = newResource(testdir.getDir()))
-        {
-            Resource res = base.addPath("foo");
-            assertThat("foo.lastModified",res.lastModified(),is(0L));
-        }
-    }
-
-    @Test
-    public void testLength() throws Exception
-    {
-        File file = testdir.getFile("foo");
-        file.createNewFile();
-
-        try (StringReader reader = new StringReader("foo"); FileWriter writer = new FileWriter(file))
-        {
-            IO.copy(reader,writer);
-        }
-
-        long expected = file.length();
-
-        try (Resource base = newResource(testdir.getDir()))
-        {
-            Resource res = base.addPath("foo");
-            assertThat("foo.length",res.length(),is(expected));
-        }
-    }
-
-    @Test
-    public void testLength_NotExists() throws Exception
-    {
-        try (Resource base = newResource(testdir.getDir()))
-        {
-            Resource res = base.addPath("foo");
-            assertThat("foo.length",res.length(),is(0L));
-        }
-    }
-
-    @Test
-    public void testDelete() throws Exception
-    {
-        File file = testdir.getFile("foo");
-        file.createNewFile();
-
-        try (Resource base = newResource(testdir.getDir()))
-        {
-            // Is it there?
-            Resource res = base.addPath("foo");
-            assertThat("foo.exists",res.exists(),is(true));
-            // delete it
-            assertThat("foo.delete",res.delete(),is(true));
-            // is it there?
-            assertThat("foo.exists",res.exists(),is(false));
-        }
-    }
-
-    @Test
-    public void testDelete_NotExists() throws Exception
-    {
-        try (Resource base = newResource(testdir.getDir()))
-        {
-            // Is it there?
-            Resource res = base.addPath("foo");
-            assertThat("foo.exists",res.exists(),is(false));
-            // delete it
-            assertThat("foo.delete",res.delete(),is(false));
-            // is it there?
-            assertThat("foo.exists",res.exists(),is(false));
-        }
-    }
-
-    @Test
-    public void testName() throws Exception
-    {
-        String expected = testdir.getDir().getAbsolutePath();
-
-        try (Resource base = newResource(testdir.getDir()))
-        {
-            assertThat("base.name",base.getName(),is(expected));
-        }
-    }
-
-    @Test
-    public void testInputStream() throws Exception
-    {
-        File file = testdir.getFile("foo");
-        file.createNewFile();
-
-        String content = "Foo is here";
-
-        try (StringReader reader = new StringReader(content); FileWriter writer = new FileWriter(file))
-        {
-            IO.copy(reader,writer);
-        }
-
-        try (Resource base = newResource(testdir.getDir()))
-        {
-            Resource foo = base.addPath("foo");
-            try (InputStream stream = foo.getInputStream(); InputStreamReader reader = new InputStreamReader(stream); StringWriter writer = new StringWriter())
-            {
-                IO.copy(reader,writer);
-                assertThat("Stream",writer.toString(),is(content));
-            }
-        }
-    }
-
-    @Test
-    public void testReadableByteChannel() throws Exception
-    {
-        File file = testdir.getFile("foo");
-        file.createNewFile();
-
-        String content = "Foo is here";
-
-        try (StringReader reader = new StringReader(content); FileWriter writer = new FileWriter(file))
-        {
-            IO.copy(reader,writer);
-        }
-
-        try (Resource base = newResource(testdir.getDir()))
-        {
-            Resource foo = base.addPath("foo");
-            try (ReadableByteChannel channel = foo.getReadableByteChannel())
-            {
-                ByteBuffer buf = ByteBuffer.allocate(256);
-                channel.read(buf);
-                buf.flip();
-                String actual = BufferUtil.toUTF8String(buf);
-                assertThat("ReadableByteChannel content",actual,is(content));
-            }
-        }
-    }
-    
-    @Test
-    public void testGetURI() throws Exception
-    {
-        File file = testdir.getFile("foo");
-        file.createNewFile();
-
-        URI expected = file.toURI();
-
-        try (Resource base = newResource(testdir.getDir()))
-        {
-            Resource foo = base.addPath("foo");
-            assertThat("getURI",foo.getURI(),is(expected));
-        }
-    }
-
-    @Test
-    public void testGetURL() throws Exception
-    {
-        File file = testdir.getFile("foo");
-        file.createNewFile();
-
-        URL expected = file.toURI().toURL();
-
-        try (Resource base = newResource(testdir.getDir()))
-        {
-            Resource foo = base.addPath("foo");
-            assertThat("getURL",foo.getURL(),is(expected));
-        }
-    }
-    
-    @Test
-    public void testList() throws Exception
-    {
-        File dir = testdir.getDir();
-        FS.touch(new File(dir, "foo"));
-        FS.touch(new File(dir, "bar"));
-        FS.ensureDirExists(new File(dir, "tick"));
-        FS.ensureDirExists(new File(dir, "tock"));
-        
-        List<String> expected = new ArrayList<>();
-        expected.add("foo");
-        expected.add("bar");
-        expected.add("tick/");
-        expected.add("tock/");
-
-        try (Resource base = newResource(testdir.getDir()))
-        {
-            String list[] = base.list();
-            List<String> actual = Arrays.asList(list);
-            
-            CollectionAssert.assertContainsUnordered("Resource Directory Listing",
-                    expected,actual);
-        }
-    }
-    
-    @Test
-    public void testSymlink() throws Exception
-    {
-        File dir = testdir.getDir();
-        
-        Path foo = new File(dir, "foo").toPath();
-        Path bar = new File(dir, "bar").toPath();
-        
-        try
-        {
-            Files.createFile(foo);
-            Files.createSymbolicLink(bar,foo);
-        }
-        catch (UnsupportedOperationException | FileSystemException e)
-        {
-            // if unable to create symlink, no point testing the rest
-            // this is the path that Microsoft Windows takes.
-            assumeNoException(e);
-        }
-        
-        try (Resource base = newResource(testdir.getDir()))
-        {
-            Resource resFoo = base.addPath("foo");
-            Resource resBar = base.addPath("bar");
-            
-            // Access to the same resource, but via a symlink means that they are not equivalent
-            assertThat("foo.equals(bar)", resFoo.equals(resBar), is(false));
-            
-            assertThat("foo.alias", resFoo.getAlias(), nullValue());
-            assertThat("bar.alias", resBar.getAlias(), is(foo.toUri()));
-        }
-    }
-    
-    @Test
-    public void testSemicolon() throws Exception
-    {
-        File dir = testdir.getDir();
-        
-        try
-        {
-            // attempt to create file
-            Path foo = new File(dir, "foo;").toPath();
-            Files.createFile(foo);
-        }
-        catch (Exception e)
-        {
-            // if unable to create file, no point testing the rest
-            // this is the path that Microsoft Windows takes.
-            assumeNoException(e);
-        }
-
-        try (Resource base = newResource(testdir.getDir()))
-        {
-            Resource res = base.addPath("foo;");
-            assertThat("Alias: " + res,res.getAlias(),nullValue());
-        }
-    }
-
-    @Test
-    public void testExist_Normal() throws Exception
-    {
-        createEmptyFile("a.jsp");
-
-        URI ref = testdir.getDir().toURI().resolve("a.jsp");
-        try (Resource fileres = newResource(ref))
-        {
-            assertThat("Resource: " + fileres,fileres.exists(),is(true));
-        }
-    }
-
-    @Test
-    public void testSingleQuoteInFileName() throws Exception
-    {
-        createEmptyFile("foo's.txt");
-        createEmptyFile("f o's.txt");
-
-        URI refQuoted = testdir.getDir().toURI().resolve("foo's.txt");
-
-        try (Resource fileres = newResource(refQuoted))
-        {
-            assertThat("Exists: " + refQuoted,fileres.exists(),is(true));
-            assertThat("Alias: " + refQuoted,fileres.getAlias(),nullValue());
-        }
-
-        URI refEncoded = testdir.getDir().toURI().resolve("foo%27s.txt");
-
-        try (Resource fileres = newResource(refEncoded))
-        {
-            assertThat("Exists: " + refEncoded,fileres.exists(),is(true));
-            assertThat("Alias: " + refEncoded,fileres.getAlias(),nullValue());
-        }
-
-        URI refQuoteSpace = testdir.getDir().toURI().resolve("f%20o's.txt");
-
-        try (Resource fileres = newResource(refQuoteSpace))
-        {
-            assertThat("Exists: " + refQuoteSpace,fileres.exists(),is(true));
-            assertThat("Alias: " + refQuoteSpace,fileres.getAlias(),nullValue());
-        }
-
-        URI refEncodedSpace = testdir.getDir().toURI().resolve("f%20o%27s.txt");
-
-        try (Resource fileres = newResource(refEncodedSpace))
-        {
-            assertThat("Exists: " + refEncodedSpace,fileres.exists(),is(true));
-            assertThat("Alias: " + refEncodedSpace,fileres.getAlias(),nullValue());
-        }
-
-        URI refA = testdir.getDir().toURI().resolve("foo's.txt");
-        URI refB = testdir.getDir().toURI().resolve("foo%27s.txt");
-
-        StringBuilder msg = new StringBuilder();
-        msg.append("URI[a].equals(URI[b])").append(System.lineSeparator());
-        msg.append("URI[a] = ").append(refA).append(System.lineSeparator());
-        msg.append("URI[b] = ").append(refB);
-
-        // show that simple URI.equals() doesn't work
-        assertThat(msg.toString(),refA.equals(refB),is(false));
-
-        // now show that Resource.equals() does work
-        try (Resource a = newResource(refA); Resource b = newResource(refB);)
-        {
-            assertThat("A.equals(B)",a.equals(b),is(true));
-        }
-    }
-
-    @Test
-    public void testExist_BadNull() throws Exception
-    {
-        createEmptyFile("a.jsp");
-
-        try
-        {
-            // request with null at end
-            URI ref = testdir.getDir().toURI().resolve("a.jsp%00");
-            assertThat("Null URI",ref,notNullValue());
-
-            newResource(ref);
-            fail("Should have thrown " + InvalidPathException.class);
-        }
-        catch (InvalidPathException e)
-        {
-            // Expected path
-        }
-    }
-
-    @Test
-    public void testExist_BadNullX() throws Exception
-    {
-        createEmptyFile("a.jsp");
-
-        try
-        {
-            // request with null and x at end
-            URI ref = testdir.getDir().toURI().resolve("a.jsp%00x");
-            assertThat("NullX URI",ref,notNullValue());
-
-            newResource(ref);
-            fail("Should have thrown " + InvalidPathException.class);
-        }
-        catch (InvalidPathException e)
-        {
-            // Expected path
-        }
-    }
-    
-    @Test
-    public void testUtf8Dir() throws Exception
-    {
-        File dir=new File(testdir.getDir(),"bãm");
-        dir.mkdir();
-        File file = new File(dir,"file.txt");
-        file.createNewFile();
-        
-        Resource base = newResource(dir);
-        Assert.assertNull(base.getAlias());
-        
-        Resource r = base.addPath("file.txt");
-        Assert.assertNull(r.getAlias());
-        
-    }
-}
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ClassPathResourceTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ClassPathResourceTest.java
new file mode 100644
index 0000000..d2d52d3
--- /dev/null
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ClassPathResourceTest.java
@@ -0,0 +1,112 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util.resource;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+
+import org.junit.Test;
+
+public class ClassPathResourceTest
+{
+    /**
+     * Test a class path resource for existence.
+     */
+    @Test
+    public void testClassPathResourceClassRelative()
+    {
+        final String classPathName="Resource.class";
+
+        try(Resource resource=Resource.newClassPathResource(classPathName);)
+        {
+            // A class path cannot be a directory
+            assertFalse("Class path cannot be a directory.",resource.isDirectory());
+
+            // A class path must exist
+            assertTrue("Class path resource does not exist.",resource.exists());
+        }
+    }
+
+    /**
+     * Test a class path resource for existence.
+     */
+    @Test
+    public void testClassPathResourceClassAbsolute()
+    {
+        final String classPathName="/org/eclipse/jetty/util/resource/Resource.class";
+
+        Resource resource=Resource.newClassPathResource(classPathName);
+
+        // A class path cannot be a directory
+        assertFalse("Class path cannot be a directory.",resource.isDirectory());
+
+        // A class path must exist
+        assertTrue("Class path resource does not exist.",resource.exists());
+    }
+
+    /**
+     * Test a class path resource for directories.
+     * @throws Exception failed test
+     */
+    @Test
+    public void testClassPathResourceDirectory() throws Exception
+    {
+        final String classPathName="/";
+
+        Resource resource=Resource.newClassPathResource(classPathName);
+
+        // A class path must be a directory
+        assertTrue("Class path must be a directory.",resource.isDirectory());
+
+        assertTrue("Class path returned file must be a directory.",resource.getFile().isDirectory());
+
+        // A class path must exist
+        assertTrue("Class path resource does not exist.",resource.exists());
+    }
+
+    /**
+     * Test a class path resource for a file.
+     * @throws Exception failed test
+     */
+    @Test
+    public void testClassPathResourceFile() throws Exception
+    {
+        final String fileName="resource.txt";
+        final String classPathName="/"+fileName;
+
+        // Will locate a resource in the class path
+        Resource resource=Resource.newClassPathResource(classPathName);
+
+        // A class path cannot be a directory
+        assertFalse("Class path must be a directory.",resource.isDirectory());
+
+        assertTrue(resource!=null);
+
+        File file=resource.getFile();
+
+        assertEquals("File name from class path is not equal.",fileName,file.getName());
+        assertTrue("File returned from class path should be a file.",file.isFile());
+
+        // A class path must exist
+        assertTrue("Class path resource does not exist.",resource.exists());
+    }
+}
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/FileResourceTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/FileResourceTest.java
deleted file mode 100644
index df5b159..0000000
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/FileResourceTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.util.resource;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-
-import org.junit.Ignore;
-import org.junit.Test;
-
-public class FileResourceTest extends AbstractFSResourceTest
-{
-    @Override
-    public Resource newResource(URI uri) throws IOException
-    {
-        return new FileResource(uri);
-    }
-    
-    @Override
-    public Resource newResource(File file) throws IOException
-    {
-        return new FileResource(file);
-    }
-    
-    @Ignore("Cannot get null to be seen by FileResource")
-    @Test
-    public void testExist_BadNull() throws Exception
-    {
-    }
-
-    @Ignore("Validation shouldn't be done in FileResource")
-    @Test
-    public void testExist_BadNullX() throws Exception
-    {
-    }
-}
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/FileSystemResourceTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/FileSystemResourceTest.java
new file mode 100644
index 0000000..b0de578
--- /dev/null
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/FileSystemResourceTest.java
@@ -0,0 +1,1212 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util.resource;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+import static org.junit.Assume.*;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.lang.reflect.InvocationTargetException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.nio.ByteBuffer;
+import java.nio.channels.ReadableByteChannel;
+import java.nio.file.DirectoryStream;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystemException;
+import java.nio.file.Files;
+import java.nio.file.InvalidPathException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.jetty.toolchain.test.FS;
+import org.eclipse.jetty.toolchain.test.IO;
+import org.eclipse.jetty.toolchain.test.OS;
+import org.eclipse.jetty.toolchain.test.TestingDir;
+import org.eclipse.jetty.util.BufferUtil;
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.Matchers;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class FileSystemResourceTest
+{
+    @Rule
+    public TestingDir testdir = new TestingDir();
+    
+    private final Class<? extends Resource> _class;
+
+    @SuppressWarnings("deprecation")
+    @Parameters(name="{0}")
+    public static Collection<Object[]> data() 
+    {
+        List<Object[]> data = new ArrayList<>();
+        data.add(new Class<?>[]{FileResource.class});
+        data.add(new Class<?>[]{PathResource.class});
+        return data;
+    }
+    
+    public FileSystemResourceTest(Class<? extends Resource> test)
+    {
+        _class=test;
+    }
+    
+    public Resource newResource(URI uri) throws Exception
+    {
+        try
+        {
+            return _class.getConstructor(URI.class).newInstance(uri);
+        }
+        catch(InvocationTargetException e)
+        {
+            try
+            {
+                throw e.getTargetException();
+            }
+            catch(Exception|Error ex)
+            {
+                throw ex;
+            }
+            catch(Throwable th)
+            {
+                throw new Error(th);
+            }
+        }
+    }
+
+    public Resource newResource(File file) throws Exception
+    {
+        try
+        {
+            return _class.getConstructor(File.class).newInstance(file); 
+        }
+        catch(InvocationTargetException e)
+        {
+            try
+            {
+                throw e.getTargetException();
+            }
+            catch(Exception|Error ex)
+            {
+                throw ex;
+            }
+            catch(Throwable th)
+            {
+                throw new Error(th);
+            }
+        }
+    }
+    
+    private Matcher<Resource> hasNoAlias()
+    {
+        return new BaseMatcher<Resource>()
+        {
+            @Override
+            public boolean matches(Object item)
+            {
+                final Resource res = (Resource)item;
+                return !res.isAlias();
+            }
+
+            @Override
+            public void describeTo(Description description)
+            {
+                description.appendText("getAlias should return null");
+            }
+            
+            @Override
+            public void describeMismatch(Object item, Description description)
+            {
+                description.appendText("was ").appendValue(((Resource)item).getAlias());
+            }
+        };
+    }
+    
+    private Matcher<Resource> isAliasFor(final Resource resource)
+    {
+        return new BaseMatcher<Resource>()
+        {
+            @Override
+            public boolean matches(Object item)
+            {
+                final Resource ritem = (Resource)item;
+                final URI alias = ritem.getAlias();
+                if (alias == null)
+                {
+                    return ritem == null;
+                }
+                else
+                {
+                    return alias.equals(resource.getURI());
+                }
+            }
+
+            @Override
+            public void describeTo(Description description)
+            {
+                description.appendText("getAlias should return ").appendValue(resource.getURI());
+            }
+            
+            @Override
+            public void describeMismatch(Object item, Description description)
+            {
+                description.appendText("was ").appendValue(((Resource)item).getAlias());
+            }
+        };
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testNonAbsoluteURI() throws Exception
+    {
+        newResource(new URI("path/to/resource"));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testNotFileURI() throws Exception
+    {
+        newResource(new URI("http://www.eclipse.org/jetty/"));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testBogusFilename() throws Exception
+    {
+        if (OS.IS_UNIX)
+        {
+            // A windows path is invalid under unix
+            newResource(new URI("file://Z:/:"));
+        }
+        else if (OS.IS_WINDOWS)
+        {
+            // "CON" is a reserved name under windows
+            newResource(new URI("file://CON"));
+        }
+        else
+        {
+            assumeFalse("Unknown OS type",false);
+        }   
+    }
+    
+    @Test
+    public void testAddPath() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        
+        Path subdir = dir.resolve("sub");
+        FS.ensureDirExists(subdir.toFile());
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource sub = base.addPath("sub");
+            assertThat("sub/.isDirectory",sub.isDirectory(),is(true));
+
+            Resource tmp = sub.addPath("/tmp");
+            assertThat("No root",tmp.exists(),is(false));
+        }
+    }
+
+    @Test
+    public void testAddRootPath() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Path subdir = dir.resolve("sub");
+        Files.createDirectories(subdir);
+
+        String readableRootDir = findRootDir(dir.getFileSystem());
+        assumeThat("Readable Root Dir found",readableRootDir,notNullValue());
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource sub = base.addPath("sub");
+            assertThat("sub",sub.isDirectory(),is(true));
+
+            try
+            {
+                Resource rrd = sub.addPath(readableRootDir);
+                // valid path for unix and OSX
+                assertThat("Readable Root Dir",rrd.exists(),is(false));
+            }
+            catch (MalformedURLException | InvalidPathException e)
+            {
+                // valid path on Windows
+            }
+        }
+    }
+
+    private String findRootDir(FileSystem fs) throws IOException
+    {
+        // look for a directory off of a root path
+        for (Path rootDir : fs.getRootDirectories())
+        {
+            try (DirectoryStream<Path> dir = Files.newDirectoryStream(rootDir))
+            {
+                for (Path entry : dir)
+                {
+                    if (Files.isDirectory(entry) && !Files.isHidden(entry))
+                    {
+                        return entry.toAbsolutePath().toString();
+                    }
+                }
+            }
+        }
+
+        return null;
+    }
+
+    @Test
+    public void testIsContainedIn() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        Path foo = dir.resolve("foo");
+        Files.createFile(foo);
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource res = base.addPath("foo");
+            assertThat("is contained in",res.isContainedIn(base),is(false));
+        }
+    }
+
+    @Test
+    public void testIsDirectory() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        Path foo = dir.resolve("foo");
+        Files.createFile(foo);
+
+        Path subdir = dir.resolve("sub");
+        Files.createDirectories(subdir);
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource res = base.addPath("foo");
+            assertThat("foo.isDirectory",res.isDirectory(),is(false));
+
+            Resource sub = base.addPath("sub");
+            assertThat("sub/.isDirectory",sub.isDirectory(),is(true));
+        }
+    }
+
+    @Test
+    public void testLastModified() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        File file = testdir.getFile("foo");
+        file.createNewFile();
+
+        long expected = file.lastModified();
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource res = base.addPath("foo");
+            assertThat("foo.lastModified",res.lastModified()/1000*1000, lessThanOrEqualTo(expected));
+        }
+    }
+
+    @Test
+    public void testLastModified_NotExists() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource res = base.addPath("foo");
+            assertThat("foo.lastModified",res.lastModified(),is(0L));
+        }
+    }
+
+    @Test
+    public void testLength() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        
+        Path file = dir.resolve("foo");
+
+        try (StringReader reader = new StringReader("foo");
+             BufferedWriter writer = Files.newBufferedWriter(file))
+        {
+            IO.copy(reader,writer);
+        }
+
+        long expected = Files.size(file);
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource res = base.addPath("foo");
+            assertThat("foo.length",res.length(),is(expected));
+        }
+    }
+
+    @Test
+    public void testLength_NotExists() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource res = base.addPath("foo");
+            assertThat("foo.length",res.length(),is(0L));
+        }
+    }
+
+    @Test
+    public void testDelete() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        Path file = dir.resolve("foo");
+        Files.createFile(file);
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            // Is it there?
+            Resource res = base.addPath("foo");
+            assertThat("foo.exists",res.exists(),is(true));
+            // delete it
+            assertThat("foo.delete",res.delete(),is(true));
+            // is it there?
+            assertThat("foo.exists",res.exists(),is(false));
+        }
+    }
+
+    @Test
+    public void testDelete_NotExists() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        
+        try (Resource base = newResource(dir.toFile()))
+        {
+            // Is it there?
+            Resource res = base.addPath("foo");
+            assertThat("foo.exists",res.exists(),is(false));
+            // delete it
+            assertThat("foo.delete",res.delete(),is(false));
+            // is it there?
+            assertThat("foo.exists",res.exists(),is(false));
+        }
+    }
+
+    @Test
+    public void testName() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        
+        String expected = dir.toAbsolutePath().toString();
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            assertThat("base.name",base.getName(),is(expected));
+        }
+    }
+
+    @Test
+    public void testInputStream() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        
+        Path file = dir.resolve("foo");
+        String content = "Foo is here";
+
+        try (StringReader reader = new StringReader(content);
+             BufferedWriter writer = Files.newBufferedWriter(file))
+        {
+            IO.copy(reader,writer);
+        }
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource foo = base.addPath("foo");
+            try (InputStream stream = foo.getInputStream(); InputStreamReader reader = new InputStreamReader(stream); StringWriter writer = new StringWriter())
+            {
+                IO.copy(reader,writer);
+                assertThat("Stream",writer.toString(),is(content));
+            }
+        }
+    }
+
+    @Test
+    public void testReadableByteChannel() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+
+        Path file = dir.resolve("foo");
+        String content = "Foo is here";
+
+        try (StringReader reader = new StringReader(content);
+             BufferedWriter writer = Files.newBufferedWriter(file))
+        {
+            IO.copy(reader,writer);
+        }
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource foo = base.addPath("foo");
+            try (ReadableByteChannel channel = foo.getReadableByteChannel())
+            {
+                ByteBuffer buf = ByteBuffer.allocate(256);
+                channel.read(buf);
+                buf.flip();
+                String actual = BufferUtil.toUTF8String(buf);
+                assertThat("ReadableByteChannel content",actual,is(content));
+            }
+        }
+    }
+    
+    @Test
+    public void testGetURI() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+
+        Path file = dir.resolve("foo");
+        Files.createFile(file);
+
+        URI expected = file.toUri();
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource foo = base.addPath("foo");
+            assertThat("getURI",foo.getURI(),is(expected));
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void testGetURL() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+
+        Path file = dir.resolve("foo");
+        Files.createFile(file);
+
+        URL expected = file.toUri().toURL();
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource foo = base.addPath("foo");
+            assertThat("getURL",foo.getURL(),is(expected));
+        }
+    }
+    
+    @Test
+    public void testList() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        
+        Files.createFile(dir.resolve("foo"));
+        Files.createFile(dir.resolve("bar"));
+        Files.createDirectories(dir.resolve("tick"));
+        Files.createDirectories(dir.resolve("tock"));
+        
+        List<String> expected = new ArrayList<>();
+        expected.add("foo");
+        expected.add("bar");
+        expected.add("tick/");
+        expected.add("tock/");
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            String list[] = base.list();
+            List<String> actual = Arrays.asList(list);
+            
+            assertEquals(expected.size(),actual.size());
+            for (String s : expected)
+                assertEquals(true,actual.contains(s));
+            
+        }
+    }
+    
+    @Test
+    public void testSymlink() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        
+        Path foo = dir.resolve("foo");
+        Path bar = dir.resolve("bar");
+        
+        try
+        {
+            Files.createFile(foo);
+            Files.createSymbolicLink(bar,foo);
+        }
+        catch (UnsupportedOperationException | FileSystemException e)
+        {
+            // if unable to create symlink, no point testing the rest
+            // this is the path that Microsoft Windows takes.
+            assumeNoException(e);
+        }
+        
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource resFoo = base.addPath("foo");
+            Resource resBar = base.addPath("bar");
+            
+            assertThat("resFoo.uri", resFoo.getURI(), is(foo.toUri()));
+            
+            // Access to the same resource, but via a symlink means that they are not equivalent
+            assertThat("foo.equals(bar)", resFoo.equals(resBar), is(false));
+            
+            assertThat("resource.alias", resFoo, hasNoAlias());
+            assertThat("resource.uri.alias", newResource(resFoo.getURI()), hasNoAlias());
+            assertThat("resource.file.alias", newResource(resFoo.getFile()), hasNoAlias());
+            
+            assertThat("alias", resBar, isAliasFor(resFoo));
+            assertThat("uri.alias", newResource(resBar.getURI()), isAliasFor(resFoo));
+            assertThat("file.alias", newResource(resBar.getFile()), isAliasFor(resFoo));
+        }
+    }
+
+    @Test
+    public void testNonExistantSymlink() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        
+        Path foo = dir.resolve("foo");
+        Path bar = dir.resolve("bar");
+        
+        try
+        {
+            Files.createSymbolicLink(bar,foo);
+        }
+        catch (UnsupportedOperationException | FileSystemException e)
+        {
+            // if unable to create symlink, no point testing the rest
+            // this is the path that Microsoft Windows takes.
+            assumeNoException(e);
+        }
+        
+        try (Resource base = newResource(dir.toFile()))
+        {
+            // FileResource does not pass this test!
+            assumeFalse(base instanceof FileResource);
+            
+            Resource resFoo = base.addPath("foo");
+            Resource resBar = base.addPath("bar");
+            
+            assertThat("resFoo.uri", resFoo.getURI(), is(foo.toUri()));
+            
+            // Access to the same resource, but via a symlink means that they are not equivalent
+            assertThat("foo.equals(bar)", resFoo.equals(resBar), is(false));
+            
+            assertThat("resource.alias", resFoo, hasNoAlias());
+            assertThat("resource.uri.alias", newResource(resFoo.getURI()), hasNoAlias());
+            assertThat("resource.file.alias", newResource(resFoo.getFile()), hasNoAlias());
+            
+            assertThat("alias", resBar, isAliasFor(resFoo));
+            assertThat("uri.alias", newResource(resBar.getURI()), isAliasFor(resFoo));
+            assertThat("file.alias", newResource(resBar.getFile()), isAliasFor(resFoo));
+        }
+    }
+
+    @Test
+    public void testCaseInsensitiveAlias() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        Path path = dir.resolve("file");
+        Files.createFile(path);
+        
+        try (Resource base = newResource(dir.toFile()))
+        {
+            // Reference to actual resource that exists
+            Resource resource = base.addPath("file");
+                        
+            assertThat("resource.alias", resource, hasNoAlias());
+            assertThat("resource.uri.alias", newResource(resource.getURI()), hasNoAlias());
+            assertThat("resource.file.alias", newResource(resource.getFile()), hasNoAlias());
+
+            // On some case insensitive file systems, lets see if an alternate
+            // case for the filename results in an alias reference
+            Resource alias = base.addPath("FILE");
+            if (alias.exists())
+            {
+                // If it exists, it must be an alias
+                assertThat("alias", alias, isAliasFor(resource));
+                assertThat("alias.uri", newResource(alias.getURI()), isAliasFor(resource));
+                assertThat("alias.file", newResource(alias.getFile()), isAliasFor(resource));
+            }
+        }
+    }
+
+    /**
+     * Test for Windows feature that exposes 8.3 filename references
+     * for long filenames.
+     * <p>
+     * See: http://support.microsoft.com/kb/142982
+     * @throws Exception failed test
+     */
+    @Test
+    public void testCase8dot3Alias() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        
+        Path path = dir.resolve("TextFile.Long.txt");
+        Files.createFile(path);
+        
+        try (Resource base = newResource(dir.toFile()))
+        {
+            // Long filename
+            Resource resource = base.addPath("TextFile.Long.txt");
+                        
+            assertThat("resource.alias", resource, hasNoAlias());
+            assertThat("resource.uri.alias", newResource(resource.getURI()), hasNoAlias());
+            assertThat("resource.file.alias", newResource(resource.getFile()), hasNoAlias());
+
+            // On some versions of Windows, the long filename can be referenced
+            // via a short 8.3 equivalent filename.
+            Resource alias = base.addPath("TEXTFI~1.TXT");
+            if (alias.exists())
+            {
+                // If it exists, it must be an alias
+                assertThat("alias", alias, isAliasFor(resource));
+                assertThat("alias.uri", newResource(alias.getURI()), isAliasFor(resource));
+                assertThat("alias.file", newResource(alias.getFile()), isAliasFor(resource));
+            }
+        }
+    }
+
+    /**
+     * NTFS Alternative Data / File Streams.
+     * <p>
+     * See: http://msdn.microsoft.com/en-us/library/windows/desktop/aa364404(v=vs.85).aspx
+     * @throws Exception failed test
+     */
+    @Test
+    public void testNTFSFileStreamAlias() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+
+        Path path = dir.resolve("testfile");
+        Files.createFile(path);
+        
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource resource = base.addPath("testfile");
+                        
+            assertThat("resource.alias", resource, hasNoAlias());
+            assertThat("resource.uri.alias", newResource(resource.getURI()), hasNoAlias());
+            assertThat("resource.file.alias", newResource(resource.getFile()), hasNoAlias());
+
+            try
+            {
+                // Attempt to reference same file, but via NTFS simple stream
+                Resource alias = base.addPath("testfile:stream");
+                if (alias.exists())
+                {
+                    // If it exists, it must be an alias
+                    assertThat("resource.alias",alias,isAliasFor(resource));
+                    assertThat("resource.uri.alias",newResource(alias.getURI()),isAliasFor(resource));
+                    assertThat("resource.file.alias",newResource(alias.getFile()),isAliasFor(resource));
+                }
+            }
+            catch (InvalidPathException e)
+            {
+                // NTFS filesystem streams are unsupported on some platforms.
+                assumeNoException(e);
+            }
+        }
+    }
+    
+    /**
+     * NTFS Alternative Data / File Streams.
+     * <p>
+     * See: http://msdn.microsoft.com/en-us/library/windows/desktop/aa364404(v=vs.85).aspx
+     * @throws Exception failed test
+     */
+    @Test
+    public void testNTFSFileDataStreamAlias() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+
+        Path path = dir.resolve("testfile");
+        Files.createFile(path);
+        
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource resource = base.addPath("testfile");
+                        
+            assertThat("resource.alias", resource, hasNoAlias());
+            assertThat("resource.uri.alias", newResource(resource.getURI()), hasNoAlias());
+            assertThat("resource.file.alias", newResource(resource.getFile()), hasNoAlias());
+
+            try
+            {
+                // Attempt to reference same file, but via NTFS DATA stream
+                Resource alias = base.addPath("testfile::$DATA");
+                if (alias.exists())
+                {
+                    assumeThat(alias.getURI().getScheme(), is("http"));
+                    
+                    // If it exists, it must be an alias
+                    assertThat("resource.alias",alias,isAliasFor(resource));
+                    assertThat("resource.uri.alias",newResource(alias.getURI()),isAliasFor(resource));
+                    assertThat("resource.file.alias",newResource(alias.getFile()),isAliasFor(resource));
+                }
+            }
+            catch (InvalidPathException e)
+            {
+                // NTFS filesystem streams are unsupported on some platforms.
+                assumeNoException(e);
+            }
+        }
+    }
+    
+    /**
+     * NTFS Alternative Data / File Streams.
+     * <p>
+     * See: http://msdn.microsoft.com/en-us/library/windows/desktop/aa364404(v=vs.85).aspx
+     * @throws Exception failed test
+     */
+    @Test
+    public void testNTFSFileEncodedDataStreamAlias() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+
+        Path path = dir.resolve("testfile");
+        Files.createFile(path);
+        
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource resource = base.addPath("testfile");
+                        
+            assertThat("resource.alias", resource, hasNoAlias());
+            assertThat("resource.uri.alias", newResource(resource.getURI()), hasNoAlias());
+            assertThat("resource.file.alias", newResource(resource.getFile()), hasNoAlias());
+
+            try
+            {
+                // Attempt to reference same file, but via NTFS DATA stream (encoded addPath version) 
+                Resource alias = base.addPath("testfile::%24DATA");
+                if (alias.exists())
+                {
+                    // If it exists, it must be an alias
+                    assertThat("resource.alias",alias,isAliasFor(resource));
+                    assertThat("resource.uri.alias",newResource(alias.getURI()),isAliasFor(resource));
+                    assertThat("resource.file.alias",newResource(alias.getFile()),isAliasFor(resource));
+                }
+            }
+            catch (InvalidPathException e)
+            {
+                // NTFS filesystem streams are unsupported on some platforms.
+                assumeNoException(e);
+            }
+        }
+    }
+    
+    @Test
+    public void testSemicolon() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        
+        try
+        {
+            // attempt to create file
+            Path foo = dir.resolve("foo;");
+            Files.createFile(foo);
+        }
+        catch (Exception e)
+        {
+            // if unable to create file, no point testing the rest.
+            // this is the path that Microsoft Windows takes.
+            assumeNoException(e);
+        }
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource res = base.addPath("foo;");
+            assertThat("Alias: " + res,res,hasNoAlias());
+        }
+    }
+    
+    @Test
+    public void testSingleQuote() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        
+        try
+        {
+            // attempt to create file
+            Path foo = dir.resolve("foo' bar");
+            Files.createFile(foo);
+        }
+        catch (Exception e)
+        {
+            // if unable to create file, no point testing the rest.
+            // this is the path that Microsoft Windows takes.
+            assumeNoException(e);
+        }
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource res = base.addPath("foo' bar");
+            assertThat("Alias: " + res,res.getAlias(),nullValue());
+        }
+    }
+    
+    @Test
+    public void testSingleBackTick() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        
+        try
+        {
+            // attempt to create file
+            Path foo = dir.resolve("foo` bar");
+            Files.createFile(foo);
+        }
+        catch (Exception e)
+        {
+            // if unable to create file, no point testing the rest.
+            // this is the path that Microsoft Windows takes.
+            assumeNoException(e);
+        }
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            // FileResource does not pass this test!
+            assumeFalse(base instanceof FileResource);
+
+            Resource res = base.addPath("foo` bar");
+            assertThat("Alias: " + res,res.getAlias(),nullValue());
+        }
+    }
+    
+    @Test
+    public void testBrackets() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        
+        try
+        {
+            // attempt to create file
+            Path foo = dir.resolve("foo[1]");
+            Files.createFile(foo);
+        }
+        catch (Exception e)
+        {
+            // if unable to create file, no point testing the rest.
+            // this is the path that Microsoft Windows takes.
+            assumeNoException(e);
+        }
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            Resource res = base.addPath("foo[1]");
+            assertThat("Alias: " + res,res.getAlias(),nullValue());
+        }
+    }
+    
+    @Test
+    public void testBraces() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        
+        try
+        {
+            // attempt to create file
+            Path foo = dir.resolve("foo.{bar}.txt");
+            Files.createFile(foo);
+        }
+        catch (Exception e)
+        {
+            // if unable to create file, no point testing the rest.
+            // this is the path that Microsoft Windows takes.
+            assumeNoException(e);
+        }
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            // FileResource does not pass this test!
+            assumeFalse(base instanceof FileResource);
+
+            Resource res = base.addPath("foo.{bar}.txt");
+            assertThat("Alias: " + res,res.getAlias(),nullValue());
+        }
+    }
+    
+    @Test
+    public void testCaret() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        
+        try
+        {
+            // attempt to create file
+            Path foo = dir.resolve("foo^3.txt");
+            Files.createFile(foo);
+        }
+        catch (Exception e)
+        {
+            // if unable to create file, no point testing the rest.
+            // this is the path that Microsoft Windows takes.
+            assumeNoException(e);
+        }
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            // FileResource does not pass this test!
+            assumeFalse(base instanceof FileResource);
+
+            Resource res = base.addPath("foo^3.txt");
+            assertThat("Alias: " + res,res.getAlias(),nullValue());
+        }
+    }
+    
+    @Test
+    public void testPipe() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        
+        try
+        {
+            // attempt to create file
+            Path foo = dir.resolve("foo|bar.txt");
+            Files.createFile(foo);
+        }
+        catch (Exception e)
+        {
+            // if unable to create file, no point testing the rest.
+            // this is the path that Microsoft Windows takes.
+            assumeNoException(e);
+        }
+
+        try (Resource base = newResource(dir.toFile()))
+        {
+            // FileResource does not pass this test!
+            assumeFalse(base instanceof FileResource);
+
+            Resource res = base.addPath("foo|bar.txt");
+            assertThat("Alias: " + res,res.getAlias(),nullValue());
+        }
+    }
+
+    /**
+     * The most basic access example
+     * @throws Exception failed test
+     */
+    @Test
+    public void testExist_Normal() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        
+        Path path = dir.resolve("a.jsp");
+        Files.createFile(path);
+
+        URI ref = testdir.getDir().toURI().resolve("a.jsp");
+        try (Resource fileres = newResource(ref))
+        {
+            assertThat("Resource: " + fileres,fileres.exists(),is(true));
+        }
+    }
+
+    @Test
+    public void testSingleQuoteInFileName() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        
+        Path fooA = dir.resolve("foo's.txt");
+        Path fooB = dir.resolve("f o's.txt");
+        
+        Files.createFile(fooA);
+        Files.createFile(fooB);
+        
+        URI refQuoted = dir.resolve("foo's.txt").toUri();
+
+        try (Resource fileres = newResource(refQuoted))
+        {
+            // This test does not pass on FileResource
+            assumeFalse(fileres instanceof FileResource);
+            
+            assertThat("Exists: " + refQuoted,fileres.exists(),is(true));
+            assertThat("Alias: " + refQuoted,fileres,hasNoAlias());
+        }
+
+        URI refEncoded = dir.toUri().resolve("foo%27s.txt");
+
+        try (Resource fileres = newResource(refEncoded))
+        {
+            assertThat("Exists: " + refEncoded,fileres.exists(),is(true));
+            assertThat("Alias: " + refEncoded,fileres,hasNoAlias());
+        }
+
+        URI refQuoteSpace = dir.toUri().resolve("f%20o's.txt");
+
+        try (Resource fileres = newResource(refQuoteSpace))
+        {
+            assertThat("Exists: " + refQuoteSpace,fileres.exists(),is(true));
+            assertThat("Alias: " + refQuoteSpace,fileres,hasNoAlias());
+        }
+
+        URI refEncodedSpace = dir.toUri().resolve("f%20o%27s.txt");
+
+        try (Resource fileres = newResource(refEncodedSpace))
+        {
+            assertThat("Exists: " + refEncodedSpace,fileres.exists(),is(true));
+            assertThat("Alias: " + refEncodedSpace,fileres,hasNoAlias());
+        }
+
+        URI refA = dir.toUri().resolve("foo's.txt");
+        URI refB = dir.toUri().resolve("foo%27s.txt");
+
+        StringBuilder msg = new StringBuilder();
+        msg.append("URI[a].equals(URI[b])").append(System.lineSeparator());
+        msg.append("URI[a] = ").append(refA).append(System.lineSeparator());
+        msg.append("URI[b] = ").append(refB);
+
+        // show that simple URI.equals() doesn't work
+        assertThat(msg.toString(),refA.equals(refB),is(false));
+
+        // now show that Resource.equals() does work
+        try (Resource a = newResource(refA); Resource b = newResource(refB);)
+        {
+            assertThat("A.equals(B)",a.equals(b),is(true));
+        }
+    }
+
+    @Test
+    public void testExist_BadURINull() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        
+        Path path = dir.resolve("a.jsp");
+        Files.createFile(path);
+
+        try
+        {
+            // request with null at end
+            URI uri = testdir.getDir().toURI().resolve("a.jsp%00");
+            assertThat("Null URI",uri,notNullValue());
+
+            Resource r = newResource(uri);
+            
+            // if we have r, then it better not exist
+            assertFalse(r.exists());
+        }
+        catch (InvalidPathException e)
+        {
+            // Exception is acceptable
+        }
+    }
+
+    @Test
+    public void testExist_BadURINullX() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+        
+        Path path = dir.resolve("a.jsp");
+        Files.createFile(path);
+
+        try
+        {
+            // request with null and x at end
+            URI uri = testdir.getDir().toURI().resolve("a.jsp%00x");
+            assertThat("NullX URI",uri,notNullValue());
+
+            Resource r = newResource(uri);
+            
+            // if we have r, then it better not exist
+            assertFalse(r.exists());
+        }
+        catch (InvalidPathException e)
+        {
+            // Exception is acceptable
+        }
+    }
+    
+    @Test
+    public void testEncoding() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Files.createDirectories(dir);
+
+        Path specials = dir.resolve("a file with,spe#ials");
+        Files.createFile(specials);
+        
+        try(Resource res = newResource(specials.toFile()))
+        {
+            assertThat("Specials URL", res.getURI().toASCIIString(), containsString("a%20file%20with,spe%23ials"));
+            assertThat("Specials Filename", res.getFile().toString(), containsString("a file with,spe#ials"));
+            
+            res.delete();
+            assertThat("File should have been deleted.",res.exists(),is(false));
+        }
+    }
+    
+    @Test
+    public void testUtf8Dir() throws Exception
+    {
+        Path dir = testdir.getDir().toPath().normalize().toRealPath();
+        Path utf8Dir = dir.resolve("bãm");
+        Files.createDirectories(utf8Dir);
+        
+        Path file = utf8Dir.resolve("file.txt");
+        Files.createFile(file);
+        
+        try (Resource base = newResource(utf8Dir.toFile()))
+        {
+            assertThat("Exists: " + utf8Dir,base.exists(),is(true));
+            assertThat("Alias: " + utf8Dir,base,hasNoAlias());
+
+            Resource r = base.addPath("file.txt");
+            assertThat("Exists: " + r,r.exists(),is(true));
+            assertThat("Alias: " + r,r,hasNoAlias());
+        }
+    }
+}
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/JarResourceTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/JarResourceTest.java
new file mode 100644
index 0000000..2754985
--- /dev/null
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/JarResourceTest.java
@@ -0,0 +1,205 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util.resource;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.zip.ZipFile;
+
+import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+import org.eclipse.jetty.util.IO;
+import org.junit.Test;
+
+public class JarResourceTest
+{
+    private String testResURI = MavenTestingUtils.getTestResourcesDir().getAbsoluteFile().toURI().toASCIIString();
+
+    @Test
+    public void testJarFile()
+    throws Exception
+    {
+        String s = "jar:"+testResURI+"TestData/test.zip!/subdir/";
+        Resource r = Resource.newResource(s);
+
+        Set<String> entries = new HashSet<>(Arrays.asList(r.list()));
+        assertEquals(3,entries.size());
+        assertTrue(entries.contains("alphabet"));
+        assertTrue(entries.contains("numbers"));
+        assertTrue(entries.contains("subsubdir/"));
+
+        File extract = File.createTempFile("extract", null);
+        if (extract.exists())
+            extract.delete();
+        extract.mkdir();
+        extract.deleteOnExit();
+
+        r.copyTo(extract);
+
+        Resource e = Resource.newResource(extract.getAbsolutePath());
+
+        entries = new HashSet<>(Arrays.asList(e.list()));
+        assertEquals(3,entries.size());
+        assertTrue(entries.contains("alphabet"));
+        assertTrue(entries.contains("numbers"));
+        assertTrue(entries.contains("subsubdir/"));
+        IO.delete(extract);
+
+        s = "jar:"+testResURI+"TestData/test.zip!/subdir/subsubdir/";
+        r = Resource.newResource(s);
+
+        entries = new HashSet<>(Arrays.asList(r.list()));
+        assertEquals(2,entries.size());
+        assertTrue(entries.contains("alphabet"));
+        assertTrue(entries.contains("numbers"));
+
+        extract = File.createTempFile("extract", null);
+        if (extract.exists())
+            extract.delete();
+        extract.mkdir();
+        extract.deleteOnExit();
+
+        r.copyTo(extract);
+
+        e = Resource.newResource(extract.getAbsolutePath());
+
+        entries = new HashSet<>(Arrays.asList(e.list()));
+        assertEquals(2,entries.size());
+        assertTrue(entries.contains("alphabet"));
+        assertTrue(entries.contains("numbers"));
+        IO.delete(extract);
+
+    }
+
+    /* ------------------------------------------------------------ */
+    @Test
+    public void testJarFileGetAllResoures()
+    throws Exception
+    {
+        String s = "jar:"+testResURI+"TestData/test.zip!/subdir/";
+        Resource r = Resource.newResource(s);
+        Collection<Resource> deep=r.getAllResources();
+        
+        assertEquals(4, deep.size());
+    }
+    
+    @Test
+    public void testJarFileIsContainedIn ()
+    throws Exception
+    {
+        String s = "jar:"+testResURI+"TestData/test.zip!/subdir/";
+        Resource r = Resource.newResource(s);
+        Resource container = Resource.newResource(testResURI+"TestData/test.zip");
+
+        assertTrue(r instanceof JarFileResource);
+        JarFileResource jarFileResource = (JarFileResource)r;
+
+        assertTrue(jarFileResource.isContainedIn(container));
+
+        container = Resource.newResource(testResURI+"TestData");
+        assertFalse(jarFileResource.isContainedIn(container));
+    }
+
+    /* ------------------------------------------------------------ */
+    @Test
+    public void testJarFileLastModified ()
+    throws Exception
+    {
+        String s = "jar:"+testResURI+"TestData/test.zip!/subdir/numbers";
+
+        try(ZipFile zf = new ZipFile(MavenTestingUtils.getTestResourceFile("TestData/test.zip")))
+        {
+            long last = zf.getEntry("subdir/numbers").getTime();
+
+            Resource r = Resource.newResource(s);
+            assertEquals(last,r.lastModified());
+        }
+    }
+    
+    /* ------------------------------------------------------------ */
+    @Test
+    public void testJarFileCopyToDirectoryTraversal () throws Exception
+    {
+        String s = "jar:"+testResURI+"TestData/extract.zip!/";
+        Resource r = Resource.newResource(s);
+
+        assertTrue(r instanceof JarResource);
+        JarResource jarResource = (JarResource)r;
+
+        File destParent = File.createTempFile("copyjar", null);
+        if (destParent.exists())
+            destParent.delete();
+        destParent.mkdir();
+        destParent.deleteOnExit();
+
+        File dest = new File(destParent.getCanonicalPath()+"/extract");
+        if(dest.exists())
+            dest.delete();
+        dest.mkdir();
+        dest.deleteOnExit();
+
+        jarResource.copyTo(dest);
+
+        // dest contains only the valid entry; dest.getParent() contains only the dest directory
+        assertEquals(1, dest.listFiles().length);
+        assertEquals(1, dest.getParentFile().listFiles().length);
+
+        FilenameFilter dotdotFilenameFilter = new FilenameFilter() {
+            @Override
+            public boolean accept(File directory, String name)
+            {
+                return name.equals("dotdot.txt");
+            }
+        };
+        assertEquals(0, dest.listFiles(dotdotFilenameFilter).length);
+        assertEquals(0, dest.getParentFile().listFiles(dotdotFilenameFilter).length);
+
+        FilenameFilter extractfileFilenameFilter = new FilenameFilter() {
+            @Override
+            public boolean accept(File directory, String name)
+            {
+                return name.equals("extract-filenotdir");
+            }
+        };
+        assertEquals(0, dest.listFiles(extractfileFilenameFilter).length);
+        assertEquals(0, dest.getParentFile().listFiles(extractfileFilenameFilter).length);
+
+        FilenameFilter currentDirectoryFilenameFilter = new FilenameFilter() {
+            @Override
+            public boolean accept(File directory, String name)
+            {
+                return name.equals("current.txt");
+            }
+        };
+        assertEquals(1, dest.listFiles(currentDirectoryFilenameFilter).length);
+        assertEquals(0, dest.getParentFile().listFiles(currentDirectoryFilenameFilter).length);
+
+        IO.delete(dest);
+        assertFalse(dest.exists());
+    }
+
+
+}
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/PathResourceTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/PathResourceTest.java
deleted file mode 100644
index 7027cae..0000000
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/PathResourceTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.util.resource;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-
-public class PathResourceTest extends AbstractFSResourceTest
-{
-    @Override
-    public Resource newResource(URI uri) throws IOException
-    {
-        return new PathResource(uri);
-    }
-
-    @Override
-    public Resource newResource(File file) throws IOException
-    {
-        return new PathResource(file);
-    }
-}
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java
index 121e314..89c600c 100644
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java
@@ -18,39 +18,34 @@
 
 package org.eclipse.jetty.util.resource;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeTrue;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.startsWith;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assume.assumeThat;
 
 import java.io.File;
-import java.io.FilePermission;
-import java.io.FilenameFilter;
 import java.io.InputStream;
 import java.net.URI;
 import java.net.URL;
-import java.util.Arrays;
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.zip.ZipFile;
 
+import org.eclipse.jetty.toolchain.test.FS;
 import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
 import org.eclipse.jetty.toolchain.test.OS;
 import org.eclipse.jetty.util.IO;
 import org.hamcrest.Matchers;
 import org.junit.Assert;
-import org.junit.BeforeClass;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
 
-
+@RunWith(Parameterized.class)
 public class ResourceTest
 {
-    public static String __userDir = System.getProperty("basedir", ".");
-    public static URL __userURL=null;
-    private static String __relDir="";
-    private static File tmpFile;
-
     private static final boolean DIR=true;
     private static final boolean EXISTS=true;
 
@@ -98,6 +93,24 @@
             this.dir=dir;
             resource=Resource.newResource(url);
         }
+        
+        Data(URI uri,boolean exists, boolean dir)
+                throws Exception
+        {
+            this.test=uri.toASCIIString();
+            this.exists=exists;
+            this.dir=dir;
+            resource=Resource.newResource(uri);
+        }
+        
+        Data(File file,boolean exists, boolean dir)
+                throws Exception
+        {
+            this.test=file.toString();
+            this.exists=exists;
+            this.dir=dir;
+            resource=Resource.newResource(file);
+        }
 
         Data(String url,boolean exists, boolean dir, String content)
             throws Exception
@@ -108,423 +121,169 @@
             this.content=content;
             resource=Resource.newResource(url);
         }
+        
+        @Override
+        public String toString()
+        {
+            return this.test;
+        }
     }
-
-    public static Data[] data;
-
-    /* ------------------------------------------------------------ */
-    @BeforeClass
-    public static void setUp()
-    throws Exception
+    
+    static class UseCases
     {
-        if (data!=null)
-            return;
-
-        File file = new File(__userDir);
-        file=new File(file.getCanonicalPath());
-        URI uri = file.toURI();
-        __userURL=uri.toURL();
+        final Collection<Data[]> data;
+        final File fileRef;
+        final URI uriRef;
+        final String relRef;
         
-        __userURL = MavenTestingUtils.getTestResourcesDir().toURI().toURL();
-        FilePermission perm = (FilePermission) __userURL.openConnection().getPermission();
-        __userDir = new File(perm.getName()).getCanonicalPath() + File.separatorChar;
-        __relDir = "src/test/resources/".replace('/', File.separatorChar);  
+        final Data[] baseCases;
         
-        //System.err.println("User Dir="+__userDir);
-        //System.err.println("Rel  Dir="+__relDir);
-        //System.err.println("User URL="+__userURL);
-
-        tmpFile=File.createTempFile("test",null).getCanonicalFile();
-        tmpFile.deleteOnExit();
-
-        data = new Data[50];
-        int i=0;
-
-        data[i++]=new Data(tmpFile.toString(),EXISTS,!DIR);
-
-        int rt=i;
-        data[i++]=new Data(__userURL,EXISTS,DIR);
-        data[i++]=new Data(__userDir,EXISTS,DIR);
-        data[i++]=new Data(__relDir,EXISTS,DIR);
-        data[i++]=new Data(__userURL+"resource.txt",EXISTS,!DIR);
-        data[i++]=new Data(__userDir+"resource.txt",EXISTS,!DIR);
-        data[i++]=new Data(__relDir+"resource.txt",EXISTS,!DIR);
-        data[i++]=new Data(__userURL+"NoName.txt",!EXISTS,!DIR);
-        data[i++]=new Data(__userDir+"NoName.txt",!EXISTS,!DIR);
-        data[i++]=new Data(__relDir+"NoName.txt",!EXISTS,!DIR);
-
-        data[i++]=new Data(data[rt],"resource.txt",EXISTS,!DIR);
-        data[i++]=new Data(data[rt],"/resource.txt",EXISTS,!DIR);
-        data[i++]=new Data(data[rt],"NoName.txt",!EXISTS,!DIR);
-        data[i++]=new Data(data[rt],"/NoName.txt",!EXISTS,!DIR);
-
-        int td=i;
-        data[i++]=new Data(data[rt],"TestData",EXISTS,DIR);
-        data[i++]=new Data(data[rt],"TestData/",EXISTS,DIR);
-        data[i++]=new Data(data[td],"alphabet.txt",EXISTS,!DIR,"ABCDEFGHIJKLMNOPQRSTUVWXYZ");
-
-        data[i++]=new Data("jar:file:/somejar.jar!/content/",!EXISTS,DIR);
-        data[i++]=new Data("jar:file:/somejar.jar!/",!EXISTS,DIR);
-
-        int tj=i;
-        data[i++]=new Data("jar:"+__userURL+"TestData/test.zip!/",EXISTS,DIR);
-        data[i++]=new Data(data[tj],"Unkown",!EXISTS,!DIR);
-        data[i++]=new Data(data[tj],"/Unkown/",!EXISTS,DIR);
-
-        data[i++]=new Data(data[tj],"subdir",EXISTS,DIR);
-        data[i++]=new Data(data[tj],"/subdir/",EXISTS,DIR);
-        data[i++]=new Data(data[tj],"alphabet",EXISTS,!DIR,
-                           "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
-        data[i++]=new Data(data[tj],"/subdir/alphabet",EXISTS,!DIR,
-                           "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
-
-        Resource base = Resource.newResource(__userDir);
-        Resource dir0 = base.addPath("TestData");
-        assertTrue(dir0.isDirectory());
-        assertTrue(dir0.toString().endsWith("/"));
-        assertTrue(dir0.getAlias()==null);
-        Resource dir1 = base.addPath("TestData/");
-        assertTrue(dir1.isDirectory());
-        assertTrue(dir1.toString().endsWith("/"));
-        assertTrue(dir1.getAlias()==null);
-
-
+        public UseCases(String ref) throws Exception {
+            this.data = new ArrayList<Data[]>();
+            // relative directory reference
+            this.relRef = OS.separators(ref);
+            // File object reference
+            this.fileRef = MavenTestingUtils.getProjectDir(relRef);
+            // URI reference
+            this.uriRef = fileRef.toURI();
+            
+            // create baseline cases
+            baseCases = new Data[] { 
+                new Data(relRef,EXISTS,DIR), 
+                new Data(uriRef,EXISTS,DIR), 
+                new Data(fileRef,EXISTS,DIR) 
+            };
+            
+            // add all baseline cases
+            for (Data bcase : baseCases)
+            {
+                addCase(bcase);
+            }
+        }
+        
+        public void addCase(Data ucase)
+        {
+            this.data.add(new Data[]{ ucase });
+        }
+        
+        public void addAllSimpleCases(String subpath, boolean exists, boolean dir) 
+            throws Exception
+        {
+            addCase(new Data(OS.separators(relRef + subpath), exists, dir));
+            addCase(new Data(uriRef.resolve(subpath).toURL(), exists, dir));
+            addCase(new Data(new File(fileRef,subpath),exists, dir));
+        }
+        
+        public Data addAllAddPathCases(String subpath, boolean exists, boolean dir) throws Exception
+        {
+            Data bdata = null;
+            
+            for (Data bcase : baseCases)
+            {
+                bdata = new Data(bcase, subpath, exists, dir);
+                addCase(bdata);
+            }
+            
+            return bdata;
+        }
     }
+    
 
-    /* ------------------------------------------------------------ */
+    @Parameters(name="{0}")
+    public static Collection<Data[]> data() throws Exception
+    {
+        UseCases cases = new UseCases("src/test/resources/");
+        
+        File testDir = MavenTestingUtils.getTargetTestingDir(ResourceTest.class.getName());
+        FS.ensureEmpty(testDir);
+        File tmpFile = File.createTempFile("test",null,testDir);
+        
+        cases.addCase(new Data(tmpFile.toString(),EXISTS,!DIR));
+        
+        // Some resource references.
+        cases.addAllSimpleCases("resource.txt",EXISTS,!DIR);
+        cases.addAllSimpleCases("NoName.txt",!EXISTS,!DIR);
+        
+        // Some addPath() forms
+        cases.addAllAddPathCases("resource.txt",EXISTS,!DIR);
+        cases.addAllAddPathCases("/resource.txt",EXISTS,!DIR);
+        cases.addAllAddPathCases("//resource.txt",EXISTS,!DIR);
+        cases.addAllAddPathCases("NoName.txt",!EXISTS,!DIR);
+        cases.addAllAddPathCases("/NoName.txt",!EXISTS,!DIR);
+        cases.addAllAddPathCases("//NoName.txt",!EXISTS,!DIR);
+
+        Data tdata1 = cases.addAllAddPathCases("TestData", EXISTS, DIR);
+        Data tdata2 = cases.addAllAddPathCases("TestData/", EXISTS, DIR);
+        
+        cases.addCase(new Data(tdata1, "alphabet.txt", EXISTS,!DIR,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
+        cases.addCase(new Data(tdata2, "alphabet.txt", EXISTS,!DIR,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
+
+        cases.addCase(new Data("jar:file:/somejar.jar!/content/",!EXISTS,DIR));
+        cases.addCase(new Data("jar:file:/somejar.jar!/",!EXISTS,DIR));
+
+        String urlRef = cases.uriRef.toASCIIString();
+        Data zdata = new Data("jar:"+urlRef +"TestData/test.zip!/",EXISTS,DIR);
+        cases.addCase(zdata);
+        cases.addCase(new Data(zdata,"Unkown",!EXISTS,!DIR));
+        cases.addCase(new Data(zdata,"/Unkown/",!EXISTS,DIR));
+
+        cases.addCase(new Data(zdata,"subdir",EXISTS,DIR));
+        cases.addCase(new Data(zdata,"/subdir/",EXISTS,DIR));
+        cases.addCase(new Data(zdata,"alphabet",EXISTS,!DIR,
+                           "ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
+        cases.addCase(new Data(zdata,"/subdir/alphabet",EXISTS,!DIR,
+                           "ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
+        
+        cases.addAllAddPathCases("/TestData/test/subdir/subsubdir/",EXISTS,DIR);
+        cases.addAllAddPathCases("//TestData/test/subdir/subsubdir/",EXISTS,DIR);
+        cases.addAllAddPathCases("/TestData//test/subdir/subsubdir/",EXISTS,DIR);
+        cases.addAllAddPathCases("/TestData/test//subdir/subsubdir/",EXISTS,DIR);
+        cases.addAllAddPathCases("/TestData/test/subdir//subsubdir/",EXISTS,DIR);
+        
+        cases.addAllAddPathCases("TestData/test/subdir/subsubdir/",EXISTS,DIR);
+        cases.addAllAddPathCases("TestData/test/subdir/subsubdir//",EXISTS,DIR);
+        cases.addAllAddPathCases("TestData/test/subdir//subsubdir/",EXISTS,DIR);
+        cases.addAllAddPathCases("TestData/test//subdir/subsubdir/",EXISTS,DIR);
+
+        cases.addAllAddPathCases("/TestData/../TestData/test/subdir/subsubdir/",EXISTS,DIR);
+
+        return cases.data;
+    }
+    
+    @Parameter(value=0)
+    public Data data;
+
     @Test
     public void testResourceExists()
     {
-        for (int i=0;i<data.length;i++)
-        {
-            if (data[i]==null)
-                continue;
-
-            assertEquals(""+i+":"+data[i].test,data[i].exists,data[i].resource.exists());
-        }
+        assertThat("Exists: " + data.resource.getName(), data.resource.exists(), equalTo(data.exists));
     }
 
-    /* ------------------------------------------------------------ */
     @Test
     public void testResourceDir()
     {
-        for (int i=0;i<data.length;i++)
-        {
-            if (data[i]==null)
-                continue;
-
-            assertEquals(""+i+":"+data[i].test,data[i].dir,data[i].resource.isDirectory());
-        }
+        assertThat("Is Directory: " + data.test, data.resource.isDirectory(),equalTo(data.dir));
     }
 
-    /* ------------------------------------------------------------ */
-    @Test
-    public void testResourceContent()
-        throws Exception
-    {
-        for (int i=0;i<data.length;i++)
-        {
-            if (data[i]==null || data[i].content==null)
-                continue;
-
-            InputStream in = data[i].resource.getInputStream();
-            String c=IO.toString(in);
-            assertTrue(""+i+":"+data[i].test,c.startsWith(data[i].content));
-        }
-    }
-
-    /* ------------------------------------------------------------ */
-    @Test
-    public void testEncoding() throws Exception
-    {
-        Resource r =Resource.newResource("/tmp/a file with,spe#ials/");
-        assertTrue(r.getURL().toString().indexOf("a%20file%20with,spe%23ials")>0);
-        assertTrue(r.getFile().toString().indexOf("a file with,spe#ials")>0);
-        r.delete();
-        assertFalse("File should have been deleted.",r.exists());
-    }
-
-    /* ------------------------------------------------------------ */
-    @Test
-    public void testJarFile()
-    throws Exception
-    {
-        String s = "jar:"+__userURL+"TestData/test.zip!/subdir/";
-        Resource r = Resource.newResource(s);
-
-        Set<String> entries = new HashSet<>(Arrays.asList(r.list()));
-        assertEquals(3,entries.size());
-        assertTrue(entries.contains("alphabet"));
-        assertTrue(entries.contains("numbers"));
-        assertTrue(entries.contains("subsubdir/"));
-
-        File extract = File.createTempFile("extract", null);
-        if (extract.exists())
-            extract.delete();
-        extract.mkdir();
-        extract.deleteOnExit();
-
-        r.copyTo(extract);
-
-        Resource e = Resource.newResource(extract.getAbsolutePath());
-
-        entries = new HashSet<>(Arrays.asList(e.list()));
-        assertEquals(3,entries.size());
-        assertTrue(entries.contains("alphabet"));
-        assertTrue(entries.contains("numbers"));
-        assertTrue(entries.contains("subsubdir/"));
-        IO.delete(extract);
-
-        s = "jar:"+__userURL+"TestData/test.zip!/subdir/subsubdir/";
-        r = Resource.newResource(s);
-
-        entries = new HashSet<>(Arrays.asList(r.list()));
-        assertEquals(2,entries.size());
-        assertTrue(entries.contains("alphabet"));
-        assertTrue(entries.contains("numbers"));
-
-        extract = File.createTempFile("extract", null);
-        if (extract.exists())
-            extract.delete();
-        extract.mkdir();
-        extract.deleteOnExit();
-
-        r.copyTo(extract);
-
-        e = Resource.newResource(extract.getAbsolutePath());
-
-        entries = new HashSet<>(Arrays.asList(e.list()));
-        assertEquals(2,entries.size());
-        assertTrue(entries.contains("alphabet"));
-        assertTrue(entries.contains("numbers"));
-        IO.delete(extract);
-
-    }
-
-    /* ------------------------------------------------------------ */
-    @Test
-    public void testJarFileGetAllResoures()
-    throws Exception
-    {
-        String s = "jar:"+__userURL+"TestData/test.zip!/subdir/";
-        Resource r = Resource.newResource(s);
-        Collection<Resource> deep=r.getAllResources();
-        
-        assertEquals(4, deep.size());
-    }
-    
-    @Test
-    public void testJarFileIsContainedIn ()
-    throws Exception
-    {
-        String s = "jar:"+__userURL+"TestData/test.zip!/subdir/";
-        Resource r = Resource.newResource(s);
-        Resource container = Resource.newResource(__userURL+"TestData/test.zip");
-
-        assertTrue(r instanceof JarFileResource);
-        JarFileResource jarFileResource = (JarFileResource)r;
-
-        assertTrue(jarFileResource.isContainedIn(container));
-
-        container = Resource.newResource(__userURL+"TestData");
-        assertFalse(jarFileResource.isContainedIn(container));
-    }
-
-    /* ------------------------------------------------------------ */
-    @Test
-    public void testJarFileLastModified ()
-    throws Exception
-    {
-        String s = "jar:"+__userURL+"TestData/test.zip!/subdir/numbers";
-
-        try(ZipFile zf = new ZipFile(MavenTestingUtils.getTestResourceFile("TestData/test.zip")))
-        {
-            long last = zf.getEntry("subdir/numbers").getTime();
-
-            Resource r = Resource.newResource(s);
-            assertEquals(last,r.lastModified());
-        }
-    }
-
-    /* ------------------------------------------------------------ */
     @Test
     public void testEncodeAddPath ()
     throws Exception
     {
-        Resource r;
-
-        r = Resource.newResource(__userURL+"TestData/").addPath("foo%/b r");
-        Assert.assertThat(r.getURI().toString(),Matchers.endsWith("/foo%25/b%20r"));
-        
-        r = Resource.newResource("jar:"+__userURL+"TestData/test.zip!/subdir/").addPath("foo%/b r");
-        Assert.assertThat(r.getURI().toString(),Matchers.endsWith("/foo%25/b%20r"));
-    }
-    
-    
-    /* ------------------------------------------------------------ */
-    @Test
-    public void testJarFileCopyToDirectoryTraversal () throws Exception
-    {
-        String s = "jar:"+__userURL+"TestData/extract.zip!/";
-        Resource r = Resource.newResource(s);
-
-        assertTrue(r instanceof JarResource);
-        JarResource jarResource = (JarResource)r;
-
-        File destParent = File.createTempFile("copyjar", null);
-        if (destParent.exists())
-            destParent.delete();
-        destParent.mkdir();
-        destParent.deleteOnExit();
-
-        File dest = new File(destParent.getCanonicalPath()+"/extract");
-        if(dest.exists())
-            dest.delete();
-        dest.mkdir();
-        dest.deleteOnExit();
-
-        jarResource.copyTo(dest);
-
-        // dest contains only the valid entry; dest.getParent() contains only the dest directory
-        assertEquals(1, dest.listFiles().length);
-        assertEquals(1, dest.getParentFile().listFiles().length);
-
-        FilenameFilter dotdotFilenameFilter = new FilenameFilter() {
-            @Override
-            public boolean accept(File directory, String name)
-            {
-                return name.equals("dotdot.txt");
-            }
-        };
-        assertEquals(0, dest.listFiles(dotdotFilenameFilter).length);
-        assertEquals(0, dest.getParentFile().listFiles(dotdotFilenameFilter).length);
-
-        FilenameFilter extractfileFilenameFilter = new FilenameFilter() {
-            @Override
-            public boolean accept(File directory, String name)
-            {
-                return name.equals("extract-filenotdir");
-            }
-        };
-        assertEquals(0, dest.listFiles(extractfileFilenameFilter).length);
-        assertEquals(0, dest.getParentFile().listFiles(extractfileFilenameFilter).length);
-
-        FilenameFilter currentDirectoryFilenameFilter = new FilenameFilter() {
-            @Override
-            public boolean accept(File directory, String name)
-            {
-                return name.equals("current.txt");
-            }
-        };
-        assertEquals(1, dest.listFiles(currentDirectoryFilenameFilter).length);
-        assertEquals(0, dest.getParentFile().listFiles(currentDirectoryFilenameFilter).length);
-
-        IO.delete(dest);
-        assertFalse(dest.exists());
-    }
-
-    /**
-     * Test a class path resource for existence.
-     */
-    @Test
-    public void testClassPathResourceClassRelative()
-    {
-        final String classPathName="Resource.class";
-
-        try(Resource resource=Resource.newClassPathResource(classPathName);)
+        if (data.dir)
         {
-            // A class path cannot be a directory
-            assertFalse("Class path cannot be a directory.",resource.isDirectory());
-
-            // A class path must exist
-            assertTrue("Class path resource does not exist.",resource.exists());
+            Resource r = data.resource.addPath("foo%/b r");
+            Assert.assertThat(r.getURI().toString(),Matchers.endsWith("/foo%25/b%20r"));
         }
     }
-
-    /**
-     * Test a class path resource for existence.
-     */
+    
     @Test
-    public void testClassPathResourceClassAbsolute()
+    public void testResourceContent()
+        throws Exception
     {
-        final String classPathName="/org/eclipse/jetty/util/resource/Resource.class";
-
-        Resource resource=Resource.newClassPathResource(classPathName);
-
-        // A class path cannot be a directory
-        assertFalse("Class path cannot be a directory.",resource.isDirectory());
-
-        // A class path must exist
-        assertTrue("Class path resource does not exist.",resource.exists());
-    }
-
-    /**
-     * Test a class path resource for directories.
-     */
-    @Test
-    public void testClassPathResourceDirectory() throws Exception
-    {
-        final String classPathName="/";
-
-        Resource resource=Resource.newClassPathResource(classPathName);
-
-        // A class path must be a directory
-        assertTrue("Class path must be a directory.",resource.isDirectory());
-
-        assertTrue("Class path returned file must be a directory.",resource.getFile().isDirectory());
-
-        // A class path must exist
-        assertTrue("Class path resource does not exist.",resource.exists());
-    }
-
-    /**
-     * Test a class path resource for a file.
-     */
-    @Test
-    public void testClassPathResourceFile() throws Exception
-    {
-        final String fileName="resource.txt";
-        final String classPathName="/"+fileName;
-
-        // Will locate a resource in the class path
-        Resource resource=Resource.newClassPathResource(classPathName);
-
-        // A class path cannot be a directory
-        assertFalse("Class path must be a directory.",resource.isDirectory());
-
-        assertTrue(resource!=null);
-
-        File file=resource.getFile();
-
-        assertEquals("File name from class path is not equal.",fileName,file.getName());
-        assertTrue("File returned from class path should be a file.",file.isFile());
-
-        // A class path must exist
-        assertTrue("Class path resource does not exist.",resource.exists());
-    }
-
-    @Test
-    public void testUncPathResourceFile() throws Exception
-    {
-        // This test is intended to run only on Windows platform
-        assumeTrue(OS.IS_WINDOWS);
-
-        String path = __userURL.toURI().getPath().replace('/','\\')+"resource.txt";
-        //System.err.println(path);
-
-        Resource resource = Resource.newResource(path, false);
-        //System.err.println(resource);
-        assertTrue(resource.exists());
-
-        /*
-
-        String uncPath = "\\\\127.0.0.1"+__userURL.toURI().getPath().replace('/','\\').replace(':','$')+"ResourceTest.java";
-        System.err.println(uncPath);
-
-        Resource uncResource = Resource.newResource(uncPath, false);
-        System.err.println(uncResource);
-        assertTrue(uncResource.exists());
-
-        */
+        assumeThat(data.content, notNullValue());
+        
+        InputStream in = data.resource.getInputStream();
+        String c = IO.toString(in);
+        assertThat("Content: " + data.test,c,startsWith(data.content));
     }
 }
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/ssl/SslContextFactoryTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/ssl/SslContextFactoryTest.java
index a59a4b3..898288d 100644
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/ssl/SslContextFactoryTest.java
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/ssl/SslContextFactoryTest.java
@@ -18,9 +18,10 @@
 
 package org.eclipse.jetty.util.ssl;
 
-import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.greaterThan;
-import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.containsInAnyOrder;
+import static org.hamcrest.Matchers.equalTo;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
@@ -35,6 +36,7 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.StdErrLog;
 import org.eclipse.jetty.util.resource.Resource;
+import org.hamcrest.Matchers;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -54,7 +56,6 @@
     @Test
     public void testNoTsFileKs() throws Exception
     {
-        String keystorePath = System.getProperty("basedir",".") + "/src/test/resources/keystore";
         cf.setKeyStorePassword("storepwd");
         cf.setKeyManagerPassword("keypwd");
 
@@ -101,6 +102,8 @@
         cf.setKeyStoreResource(keystoreResource);
         cf.setKeyStorePassword("storepwd");
         cf.setKeyManagerPassword("keypwd");
+        cf.setTrustStoreResource(keystoreResource);
+        cf.setTrustStorePassword(null);
 
         cf.start();
 
@@ -127,7 +130,6 @@
     @Test
     public void testResourceTsResourceKsWrongPW() throws Exception
     {
-        SslContextFactory.LOG.info("EXPECT SslContextFactory@????????(null,null): java.security.UnrecoverableKeyException: Cannot recover key...");
         Resource keystoreResource = Resource.newSystemResource("keystore");
         Resource truststoreResource = Resource.newSystemResource("keystore");
 
@@ -145,13 +147,13 @@
         }
         catch(java.security.UnrecoverableKeyException e)
         {
+            Assert.assertThat(e.toString(),Matchers.containsString("UnrecoverableKeyException"));
         }
     }
 
     @Test
     public void testResourceTsWrongPWResourceKs() throws Exception
     {
-        SslContextFactory.LOG.info("EXPECT SslContextFactory@????????(null,null): java.io.IOException: Keystore was tampered with ...");
         Resource keystoreResource = Resource.newSystemResource("keystore");
         Resource truststoreResource = Resource.newSystemResource("keystore");
 
@@ -169,6 +171,7 @@
         }
         catch(IOException e)
         {
+            Assert.assertThat(e.toString(),Matchers.containsString("java.io.IOException: Keystore was tampered with, or password was incorrect"));
         }
     }
 
@@ -177,7 +180,6 @@
     {
         try
         {
-            SslContextFactory.LOG.info("EXPECT SslContextFactory@????????(null,/foo): java.lang.IllegalStateException: SSL doesn't have a valid keystore...");
             ((StdErrLog)Log.getLogger(AbstractLifeCycle.class)).setHideStacks(true);
             cf.setTrustStorePath("/foo");
             cf.start();
@@ -185,11 +187,7 @@
         }
         catch (IllegalStateException e)
         {
-
-        }
-        catch (Exception e)
-        {
-            Assert.fail("Unexpected exception");
+            Assert.assertThat(e.toString(),Matchers.containsString("IllegalStateException: no valid keystore"));
         }
     }
 
@@ -202,43 +200,19 @@
         String[] enabledCipherSuites = sslEngine.getEnabledCipherSuites();
         assertThat("At least 1 cipherSuite is enabled", enabledCipherSuites.length, greaterThan(0));
         for (String enabledCipherSuite : enabledCipherSuites)
-            assertThat("CipherSuite does not contain RC4", enabledCipherSuite.contains("RC4"), is(false));
+            assertThat("CipherSuite does not contain RC4", enabledCipherSuite.contains("RC4"), equalTo(false));
     }
 
     @Test
     public void testSetIncludeCipherSuitesRegex() throws Exception
     {
-        cf.setIncludeCipherSuites(".*RC4.*");
+        cf.setIncludeCipherSuites(".*ECDHE.*",".*WIBBLE.*");
         cf.start();
         SSLEngine sslEngine = cf.newSSLEngine();
         String[] enabledCipherSuites = sslEngine.getEnabledCipherSuites();
-        assertThat("At least 1 cipherSuite is enabled", enabledCipherSuites.length, greaterThan(0));
+        assertThat("At least 1 cipherSuite is enabled", enabledCipherSuites.length, greaterThan(1));
         for (String enabledCipherSuite : enabledCipherSuites)
-            assertThat("CipherSuite contains RC4", enabledCipherSuite.contains("RC4"), is(true));
-    }
-
-    @Test
-    public void testSetIncludeCipherSuitesPreservesOrder()
-    {
-        String[] supportedCipherSuites = new String[]{"cipher4", "cipher2", "cipher1", "cipher3"};
-        String[] includeCipherSuites = {"cipher1", "cipher3", "cipher4"};
-
-        cf.setIncludeCipherSuites(includeCipherSuites);
-        String[] selectedCipherSuites = cf.selectCipherSuites(null, supportedCipherSuites);
-
-        assertSelectedMatchesIncluded(includeCipherSuites, selectedCipherSuites);
-    }
-
-    @Test
-    public void testSetIncludeProtocolsPreservesOrder()
-    {
-        String[] supportedProtocol = new String[]{"cipher4", "cipher2", "cipher1", "cipher3"};
-        String[] includeProtocol = {"cipher1", "cipher3", "cipher4"};
-
-        cf.setIncludeProtocols(includeProtocol);
-        String[] selectedProtocol = cf.selectProtocols(null, supportedProtocol);
-
-        assertSelectedMatchesIncluded(includeProtocol, selectedProtocol);
+            assertThat("CipherSuite contains ECDHE", enabledCipherSuite.contains("ECDHE"), equalTo(true));
     }
 
     @Test
@@ -250,11 +224,44 @@
     	assertNotNull(cf.getIncludeCipherSuites());
     }
     
-    private void assertSelectedMatchesIncluded(String[] includeStrings, String[] selectedStrings)
+    @Test
+    public void testSNICertificates() throws Exception
     {
-        assertThat(includeStrings.length + " strings are selected", selectedStrings.length, is(includeStrings.length));
-        assertThat("order from includeStrings is preserved", selectedStrings[0], equalTo(includeStrings[0]));
-        assertThat("order from includeStrings is preserved", selectedStrings[1], equalTo(includeStrings[1]));
-        assertThat("order from includeStrings is preserved", selectedStrings[2], equalTo(includeStrings[2]));
+        Resource keystoreResource = Resource.newSystemResource("snikeystore");
+
+        cf.setKeyStoreResource(keystoreResource);
+        cf.setKeyStorePassword("storepwd");
+        cf.setKeyManagerPassword("keypwd");
+        
+        cf.start();
+        
+        assertThat(cf.getAliases(),containsInAnyOrder("jetty","other","san","wild"));
+        
+        assertThat(cf.getX509("jetty").getHosts(),containsInAnyOrder("jetty.eclipse.org"));
+        assertTrue(cf.getX509("jetty").getWilds().isEmpty());
+        assertTrue(cf.getX509("jetty").matches("JETTY.Eclipse.Org"));
+        assertFalse(cf.getX509("jetty").matches("m.jetty.eclipse.org"));
+        assertFalse(cf.getX509("jetty").matches("eclipse.org"));
+        
+        assertThat(cf.getX509("other").getHosts(),containsInAnyOrder("www.example.com"));
+        assertTrue(cf.getX509("other").getWilds().isEmpty());
+        assertTrue(cf.getX509("other").matches("www.example.com"));
+        assertFalse(cf.getX509("other").matches("eclipse.org"));
+        
+        assertThat(cf.getX509("san").getHosts(),containsInAnyOrder("www.san.com","m.san.com"));
+        assertTrue(cf.getX509("san").getWilds().isEmpty());
+        assertTrue(cf.getX509("san").matches("www.san.com"));
+        assertTrue(cf.getX509("san").matches("m.san.com"));
+        assertFalse(cf.getX509("san").matches("other.san.com"));
+        assertFalse(cf.getX509("san").matches("san.com"));
+        assertFalse(cf.getX509("san").matches("eclipse.org"));
+        
+        assertTrue(cf.getX509("wild").getHosts().isEmpty());
+        assertThat(cf.getX509("wild").getWilds(),containsInAnyOrder("domain.com"));
+        assertTrue(cf.getX509("wild").matches("domain.com"));
+        assertTrue(cf.getX509("wild").matches("www.domain.com"));
+        assertTrue(cf.getX509("wild").matches("other.domain.com"));
+        assertFalse(cf.getX509("wild").matches("foo.bar.domain.com"));
+        assertFalse(cf.getX509("wild").matches("other.com"));
     }
 }
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/statistic/CounterStatisticTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/statistic/CounterStatisticTest.java
new file mode 100644
index 0000000..f04d39b
--- /dev/null
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/statistic/CounterStatisticTest.java
@@ -0,0 +1,80 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util.statistic;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.lessThan;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+/* ------------------------------------------------------------ */
+public class CounterStatisticTest
+{
+
+    @Test
+    public void testCounter()
+        throws Exception
+    {
+        CounterStatistic count = new CounterStatistic();
+        
+        assertThat(count.getCurrent(),equalTo(0L));
+        assertThat(count.getMax(),equalTo(0L));
+        assertThat(count.getTotal(),equalTo(0L));
+        
+        count.increment();
+        count.increment();
+        count.decrement();
+        count.add(4);
+        count.add(-2);
+
+        assertThat(count.getCurrent(),equalTo(3L));
+        assertThat(count.getMax(),equalTo(5L));
+        assertThat(count.getTotal(),equalTo(6L));
+        
+        count.reset();
+        assertThat(count.getCurrent(),equalTo(3L));
+        assertThat(count.getMax(),equalTo(3L));
+        assertThat(count.getTotal(),equalTo(3L));
+
+        count.increment();
+        count.decrement();
+        count.add(-2);
+        count.decrement();
+        assertThat(count.getCurrent(),equalTo(0L));
+        assertThat(count.getMax(),equalTo(4L));
+        assertThat(count.getTotal(),equalTo(4L));
+     
+        count.decrement();
+        assertThat(count.getCurrent(),equalTo(-1L));
+        assertThat(count.getMax(),equalTo(4L));
+        assertThat(count.getTotal(),equalTo(4L));
+
+        count.increment();
+        assertThat(count.getCurrent(),equalTo(0L));
+        assertThat(count.getMax(),equalTo(4L));
+        assertThat(count.getTotal(),equalTo(5L));
+    }
+
+}
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/thread/LockerTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/thread/LockerTest.java
new file mode 100644
index 0000000..b9a5c3d
--- /dev/null
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/thread/LockerTest.java
@@ -0,0 +1,155 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util.thread;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+@RunWith(Parameterized.class)
+public class LockerTest
+{
+    @Parameterized.Parameters
+    public static Collection<Object[]> parameters()
+    {
+        return Arrays.asList(new Object[]{true}, new Object[]{false});
+    }
+
+    private boolean spin;
+
+    public LockerTest(boolean spin)
+    {
+        this.spin = spin;
+    }
+
+    @Test
+    public void testLocked()
+    {
+        Locker lock = new Locker(spin);
+        assertFalse(lock.isLocked());
+
+        try(Locker.Lock l = lock.lock())
+        {
+            assertTrue(lock.isLocked());
+        }
+        finally
+        {
+            assertFalse(lock.isLocked());
+        }
+
+        assertFalse(lock.isLocked());
+    }
+
+    @Test
+    public void testLockedException()
+    {
+        Locker lock = new Locker(spin);
+        assertFalse(lock.isLocked());
+
+        try(Locker.Lock l = lock.lock())
+        {
+            assertTrue(lock.isLocked());
+            throw new Exception();
+        }
+        catch(Exception e)
+        {
+            assertFalse(lock.isLocked());
+        }
+        finally
+        {
+            assertFalse(lock.isLocked());
+        }
+
+        assertFalse(lock.isLocked());
+    }
+
+    @Test
+    public void testContend() throws Exception
+    {
+        final Locker lock = new Locker(spin);
+
+        final CountDownLatch held0 = new CountDownLatch(1);
+        final CountDownLatch hold0 = new CountDownLatch(1);
+
+        Thread thread0 = new Thread()
+        {
+            @Override
+            public void run()
+            {
+                try(Locker.Lock l = lock.lock())
+                {
+                    held0.countDown();
+                    hold0.await();
+                }
+                catch (InterruptedException e)
+                {
+                    e.printStackTrace();
+                }
+            }
+        };
+        thread0.start();
+        held0.await();
+
+        assertTrue(lock.isLocked());
+
+
+        final CountDownLatch held1 = new CountDownLatch(1);
+        final CountDownLatch hold1 = new CountDownLatch(1);
+        Thread thread1 = new Thread()
+        {
+            @Override
+            public void run()
+            {
+                try(Locker.Lock l = lock.lock())
+                {
+                    held1.countDown();
+                    hold1.await();
+                }
+                catch (InterruptedException e)
+                {
+                    e.printStackTrace();
+                }
+            }
+        };
+        thread1.start();
+        // thread1 will be spinning here
+        assertFalse(held1.await(100, TimeUnit.MILLISECONDS));
+
+        // Let thread0 complete
+        hold0.countDown();
+        thread0.join();
+
+        // thread1 can progress
+        held1.await();
+
+        // let thread1 complete
+        hold1.countDown();
+        thread1.join();
+
+        assertFalse(lock.isLocked());
+    }
+}
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/thread/QueuedThreadPoolTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/thread/QueuedThreadPoolTest.java
index 43d9e5b..7dc8938 100644
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/thread/QueuedThreadPoolTest.java
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/thread/QueuedThreadPoolTest.java
@@ -18,6 +18,11 @@
 
 package org.eclipse.jetty.util.thread;
 
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -30,11 +35,6 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import static org.hamcrest.Matchers.greaterThanOrEqualTo;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
 @RunWith(AdvancedRunner.class)
 public class QueuedThreadPoolTest
 {
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/thread/SchedulerTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/thread/SchedulerTest.java
index 6813c64..e18841e 100644
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/thread/SchedulerTest.java
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/thread/SchedulerTest.java
@@ -177,7 +177,7 @@
             @Override
             public void run()
             {
-                throw new RuntimeException();
+                throw new RuntimeException("Thrown by testTaskThrowsException");
             }
         }, delay, TimeUnit.MILLISECONDS);
 
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/thread/ThreadClassLoaderScopeTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/thread/ThreadClassLoaderScopeTest.java
new file mode 100644
index 0000000..f21af0d
--- /dev/null
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/thread/ThreadClassLoaderScopeTest.java
@@ -0,0 +1,79 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util.thread;
+
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.not;
+import static org.junit.Assert.assertThat;
+
+import java.net.URL;
+import java.net.URLClassLoader;
+
+import org.junit.Test;
+
+public class ThreadClassLoaderScopeTest
+{
+    private static class ClassLoaderFoo extends URLClassLoader
+    {
+        public ClassLoaderFoo()
+        {
+            super(new URL[0]);
+        }
+    }
+
+    private static class ClassLoaderBar extends URLClassLoader
+    {
+        public ClassLoaderBar()
+        {
+            super(new URL[0]);
+        }
+    }
+    
+    @Test
+    public void testNormal()
+    {
+        try (ThreadClassLoaderScope scope = new ThreadClassLoaderScope(new ClassLoaderFoo()))
+        {
+            assertThat("ClassLoader in scope",Thread.currentThread().getContextClassLoader(),instanceOf(ClassLoaderFoo.class));
+            assertThat("Scoped ClassLoader",scope.getScopedClassLoader(),instanceOf(ClassLoaderFoo.class));
+        }
+        assertThat("ClassLoader after scope",Thread.currentThread().getContextClassLoader(),not(instanceOf(ClassLoaderFoo.class)));
+    }
+
+    @Test
+    public void testWithException()
+    {
+        try (ThreadClassLoaderScope scope = new ThreadClassLoaderScope(new ClassLoaderBar()))
+        {
+            assertThat("ClassLoader in 'scope'",Thread.currentThread().getContextClassLoader(),instanceOf(ClassLoaderBar.class));
+            assertThat("Scoped ClassLoader",scope.getScopedClassLoader(),instanceOf(ClassLoaderBar.class));
+            try (ThreadClassLoaderScope inner = new ThreadClassLoaderScope(new ClassLoaderFoo()))
+            {
+                assertThat("ClassLoader in 'inner'",Thread.currentThread().getContextClassLoader(),instanceOf(ClassLoaderFoo.class));
+                assertThat("Scoped ClassLoader",scope.getScopedClassLoader(),instanceOf(ClassLoaderFoo.class));
+                throw new RuntimeException("Intention exception");
+            }
+        }
+        catch (Throwable ignore)
+        {
+            /* ignore */
+        }
+        assertThat("ClassLoader after 'scope'",Thread.currentThread().getContextClassLoader(),not(instanceOf(ClassLoaderBar.class)));
+    }
+}
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/thread/strategy/ExecuteProduceRunTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/thread/strategy/ExecuteProduceRunTest.java
new file mode 100644
index 0000000..e2699cb
--- /dev/null
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/thread/strategy/ExecuteProduceRunTest.java
@@ -0,0 +1,398 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.util.thread.strategy;
+
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import java.util.Queue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+
+import org.eclipse.jetty.util.BlockingArrayQueue;
+import org.eclipse.jetty.util.ConcurrentArrayQueue;
+import org.eclipse.jetty.util.thread.ExecutionStrategy.Producer;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ExecuteProduceRunTest
+{
+    private final Runnable NULLTASK = new Runnable()
+    {
+        @Override
+        public void run()
+        {            
+        }
+    };
+    
+    
+    ExecuteProduceConsume _ewyk;
+    final BlockingQueue<Runnable> _produce = new BlockingArrayQueue<>();
+    final Queue<Runnable> _executions = new ConcurrentArrayQueue<>();
+    volatile Thread _producer;
+    
+    @Before
+    public void before()
+    {
+        _executions.clear();
+        
+        Producer producer = new Producer()
+        {
+            @Override
+            public Runnable produce()
+            {
+                try
+                {
+                    _producer=Thread.currentThread();
+                    Runnable task= _produce.take();
+                    if (task==NULLTASK)
+                        return null;
+                    return task;
+                }
+                catch(InterruptedException e)
+                {
+                    e.printStackTrace();
+                    return null;
+                }
+                finally
+                {
+                    _producer=null;
+                }
+            }
+        };
+
+        Executor executor =  new Executor()
+        {
+            @Override
+            public void execute(Runnable task)
+            {
+                _executions.add(task);
+            }
+        };
+
+        _ewyk = new ExecuteProduceConsume(producer,executor);
+    }
+
+    @After
+    public void after()
+    {
+        // All done and checked
+        assertThat(_produce.size(),equalTo(0));
+        assertThat(_executions.size(),equalTo(0));
+    }
+    
+    @Test
+    public void testIdle()
+    {
+        _produce.add(NULLTASK);
+        _ewyk.execute();
+    }
+    
+    @Test
+    public void testProduceOneNonBlockingTask()
+    {
+        Task t0 = new Task();
+        _produce.add(t0);
+        _produce.add(NULLTASK);
+        _ewyk.execute();
+        assertThat(t0.hasRun(),equalTo(true));
+        Assert.assertEquals(_ewyk,_executions.poll());
+    }
+    
+    @Test
+    public void testProduceManyNonBlockingTask()
+    {
+        Task[] t = new Task[10];
+        for (int i=0;i<t.length;i++)
+        {
+            t[i]=new Task();
+            _produce.add(t[i]);
+        }
+        _produce.add(NULLTASK);
+        _ewyk.execute();
+
+        for (int i=0;i<t.length;i++)
+            assertThat(t[i].hasRun(),equalTo(true));
+        Assert.assertEquals(_ewyk,_executions.poll());
+
+    }
+
+    @Test
+    public void testProduceOneBlockingTaskIdleByDispatch() throws Exception
+    {
+        final Task t0 = new Task(true);
+        Thread thread = new Thread()
+        {
+            @Override
+            public void run()
+            {
+                _produce.add(t0);
+                _produce.add(NULLTASK);
+                _ewyk.execute();
+            }
+        };
+        thread.start();
+        
+        // wait for execute thread to block in 
+        t0.awaitRun();
+        assertEquals(thread,t0.getThread());
+        
+        // Should have dispatched only one helper 
+        assertEquals(_ewyk,_executions.poll());
+        // which is make us idle
+        _ewyk.run();
+        assertThat(_ewyk.isIdle(),equalTo(true));
+
+        
+        // unblock task
+        t0.unblock();
+        // will run to completion because are already idle
+        thread.join();
+    }
+
+    @Test
+    public void testProduceOneBlockingTaskIdleByTask() throws Exception
+    {
+        final Task t0 = new Task(true);
+        Thread thread = new Thread()
+        {
+            @Override
+            public void run()
+            {
+                _produce.add(t0);
+                _produce.add(NULLTASK);
+                _ewyk.execute();
+            }
+        };
+        thread.start();
+        
+        // wait for execute thread to block in 
+        t0.awaitRun();
+        
+        // Should have dispatched only one helper 
+        Assert.assertEquals(_ewyk,_executions.poll());
+               
+        // unblock task
+        t0.unblock();
+        // will run to completion because are become idle
+        thread.join();
+        assertThat(_ewyk.isIdle(),equalTo(true));
+
+        // because we are idle, dispatched thread is noop
+        _ewyk.run();
+    }
+
+    @Test
+    public void testBlockedInProduce() throws Exception
+    {
+        final Task t0 = new Task(true);
+        Thread thread0 = new Thread()
+        {
+            @Override
+            public void run()
+            {
+                _produce.add(t0);
+                _ewyk.execute();
+            }
+        };
+        thread0.start();
+        
+        // wait for execute thread to block in task
+        t0.awaitRun();
+        assertEquals(thread0,t0.getThread());
+
+        // Should have dispatched another helper 
+        Assert.assertEquals(_ewyk,_executions.poll());
+        
+        // dispatched thread will block in produce 
+        Thread thread1 = new Thread(_ewyk);
+        thread1.start();
+        
+        // Spin
+        while(_producer==null)
+            Thread.yield();
+        
+        // thread1 is blocked in producing
+        assertEquals(thread1,_producer);
+
+        // because we are producing, any other dispatched threads are noops
+        _ewyk.run();
+        
+        // ditto with execute
+        _ewyk.execute();
+        
+        // Now if unblock the production by the dispatched thread
+        final Task t1 = new Task(true);
+        _produce.add(t1);
+
+        // task will be run by thread1
+        t1.awaitRun();
+        assertEquals(thread1,t1.getThread());
+        
+        // and another thread will have been requested
+        Assert.assertEquals(_ewyk,_executions.poll());
+        
+        // If we unblock t1, it will overtake t0 and try to produce again!
+        t1.unblock();
+        
+        // Now thread1 is producing again
+        while(_producer==null)
+            Thread.yield();
+        assertEquals(thread1,_producer);
+        
+        // If we unblock t0, it will decide it is not needed
+        t0.unblock();
+        thread0.join();
+        
+        // If the requested extra thread turns up, it is also noop because we are producing
+        _ewyk.run();
+        
+        // Give the idle job
+        _produce.add(NULLTASK);
+        
+        // Which will eventually idle the producer
+        thread1.join();
+        assertEquals(null,_producer);
+    }
+
+    @Test
+    public void testExecuteWhileIdling() throws Exception
+    {
+        final Task t0 = new Task(true);
+        Thread thread0 = new Thread()
+        {
+            @Override
+            public void run()
+            {
+                _produce.add(t0);
+                _ewyk.execute();
+            }
+        };
+        thread0.start();
+        
+        // wait for execute thread to block in task
+        t0.awaitRun();
+        assertEquals(thread0,t0.getThread());
+
+        // Should have dispatched another helper 
+        Assert.assertEquals(_ewyk,_executions.poll());
+        
+        // We will go idle when we next produce
+        _produce.add(NULLTASK);
+        
+        // execute will return immediately because it did not yet see the idle.
+        _ewyk.execute();
+        
+        // When we unblock t0, thread1 will see the idle, 
+        t0.unblock();
+        
+        // but because there was a pending execute it will try producing again
+        while(_producer==null)
+            Thread.yield();
+        assertEquals(thread0,_producer);
+
+        // and will see new tasks 
+        final Task t1 = new Task(true);
+        _produce.add(t1);
+        t1.awaitRun();
+        assertThat(t1.getThread(),equalTo(thread0));
+
+        // Should NOT have dispatched another helper, because the last is still pending
+        assertThat(_executions.size(),equalTo(0));
+        
+        // When the dispatched thread turns up, it will see the second idle
+        _produce.add(NULLTASK);
+        _ewyk.run();
+        assertThat(_ewyk.isIdle(),equalTo(true));
+        
+        // So that when t1 completes it does not produce again.
+        t1.unblock();
+        thread0.join();
+    }
+    
+
+    public static class Task implements Runnable
+    {
+        final CountDownLatch _block = new CountDownLatch(1);
+        final CountDownLatch _run = new CountDownLatch(1);
+        volatile Thread _thread;
+
+        public Task()
+        {
+            this(false);
+        }
+        
+        public Task(boolean block)
+        {
+            if (!block)
+                _block.countDown();
+        }
+        
+        @Override
+        public void run()
+        {
+            try
+            {
+                _thread=Thread.currentThread();
+                _run.countDown();
+                _block.await();
+            }
+            catch (InterruptedException e)
+            {
+                throw new IllegalStateException(e);
+            }
+            finally
+            {
+                _thread=null;
+            }
+        }
+        
+        public boolean hasRun()
+        {
+            return _run.getCount()<=0;
+        }
+        
+        public void awaitRun()
+        {
+            try
+            {
+                _run.await();
+            }
+            catch (InterruptedException e)
+            {
+                throw new IllegalStateException(e);
+            }
+        }
+        
+        public void unblock()
+        {
+            _block.countDown();
+        }
+        
+        public Thread getThread()
+        {
+            return _thread;
+        }
+    }
+}
diff --git a/jetty-util/src/test/resources/jetty-logging.properties b/jetty-util/src/test/resources/jetty-logging.properties
index 3a0ce97..76035ea 100644
--- a/jetty-util/src/test/resources/jetty-logging.properties
+++ b/jetty-util/src/test/resources/jetty-logging.properties
@@ -1,3 +1,5 @@
 # Setup default logging implementation for during testing
 org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
 #org.eclipse.jetty.util.LEVEL=DEBUG
+
+#org.eclipse.jetty.util.PathWatcher.Noisy.LEVEL=OFF
diff --git a/jetty-util/src/test/resources/snikeystore b/jetty-util/src/test/resources/snikeystore
new file mode 100644
index 0000000..3c69266
--- /dev/null
+++ b/jetty-util/src/test/resources/snikeystore
Binary files differ
diff --git a/jetty-webapp/pom.xml b/jetty-webapp/pom.xml
index 1b40cfb..51ea6f7 100644
--- a/jetty-webapp/pom.xml
+++ b/jetty-webapp/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-webapp</artifactId>
@@ -28,60 +28,20 @@
     </resources>
     <plugins>
       <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-                <Import-Package>javax.servlet.*;version="[2.6.0,3.2]",*</Import-Package>
-              </instructions>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <!--
-        Required for OSGI
-        -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>
-              ${project.build.outputDirectory}/META-INF/MANIFEST.MF
-            </manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
         <configuration>
           <onlyAnalyze>org.eclipse.jetty.webapp.*</onlyAnalyze>
         </configuration>
       </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <forkCount>1</forkCount>
+          <reuseForks>false</reuseForks>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
   <dependencies>
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/CachingWebAppClassLoader.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/CachingWebAppClassLoader.java
new file mode 100644
index 0000000..b099a34
--- /dev/null
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/CachingWebAppClassLoader.java
@@ -0,0 +1,121 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.webapp;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.eclipse.jetty.util.ConcurrentHashSet;
+import org.eclipse.jetty.util.annotation.ManagedObject;
+import org.eclipse.jetty.util.annotation.ManagedOperation;
+
+
+/**
+ * A WebAppClassLoader that caches {@link #getResource(String)} results.
+ * Specifically this ClassLoader caches not found classes and resources,
+ * which can greatly increase performance for applications that search 
+ * for resources.
+ */
+@ManagedObject
+public class CachingWebAppClassLoader extends WebAppClassLoader
+{
+    private final ConcurrentHashSet<String> _notFound = new ConcurrentHashSet<>();
+    private final ConcurrentHashMap<String,URL> _cache = new ConcurrentHashMap<>();
+    
+    public CachingWebAppClassLoader(ClassLoader parent, Context context) throws IOException
+    {
+        super(parent,context);
+    }
+
+    public CachingWebAppClassLoader(Context context) throws IOException
+    {
+        super(context);
+    }
+
+    @Override
+    public URL getResource(String name)
+    {
+        if (_notFound.contains(name))
+            return null;
+        
+        URL url = _cache.get(name);
+        
+        if (name==null)
+        {
+            url = super.getResource(name);
+        
+            if (url==null)
+            {
+                _notFound.add(name);
+            }
+            else
+            {
+                _cache.putIfAbsent(name,url);
+            }
+        }
+        
+        return url;
+    }
+
+    @Override
+    protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
+    {
+        if (_notFound.contains(name))
+            throw new ClassNotFoundException(name+": in notfound cache");
+        try
+        {
+            return super.loadClass(name,resolve);
+        }
+        catch (ClassNotFoundException nfe)
+        {
+            _notFound.add(name);
+            throw nfe; 
+        }
+    }
+
+    @Override
+    protected Class<?> findClass(String name) throws ClassNotFoundException
+    {
+        if (_notFound.contains(name))
+            throw new ClassNotFoundException(name+": in notfound cache");
+        try
+        {
+            return super.findClass(name);
+        }
+        catch (ClassNotFoundException nfe)
+        {
+            _notFound.add(name);
+            throw nfe; 
+        }
+    }
+
+    @ManagedOperation
+    public void clearCache()
+    {
+        _cache.clear();
+        _notFound.clear();
+    }
+    
+    @Override
+    public String toString()
+    {
+        return "Caching["+super.toString()+"]";
+    }
+}
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/ClasspathPattern.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/ClasspathPattern.java
index 7389f7f..e30c4d5 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/ClasspathPattern.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/ClasspathPattern.java
@@ -19,33 +19,56 @@
 
 package org.eclipse.jetty.webapp;
 
+import java.util.AbstractList;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
-import java.util.StringTokenizer;
+import java.util.ListIterator;
 
+import org.eclipse.jetty.util.StringUtil;
 
 /* ------------------------------------------------------------ */
 /**
- * ClasspathPattern performs sequential pattern matching of a class name 
+ * Classpath classes list performs sequential pattern matching of a class name 
  * against an internal array of classpath pattern entries.
- * 
- * When an entry starts with '-' (minus), reverse matching is performed.
- * When an entry ends with '.' (period), prefix matching is performed.
- * 
+ * A class pattern is a string of one of the forms:<ul>
+ * <li>'org.package.SomeClass' will match a specific class
+ * <li>'org.package.' will match a specific package hierarchy
+ * <li>'-org.package.Classname' excludes a specific class
+ * <li>'-org.package.' excludes a specific package hierarchy
+ * <li>Nested classes must be specified with the '$' separator if they 
+ * are to be explicitly included or excluded (eg. org.example.MyClass$NestedClass).
+ * <li>Nested classes are matched by their containing class. (eg. -org.example.MyClass
+ * would exclude org.example.MyClass$AnyNestedClass)
+ * </ul>
  * When class is initialized from a classpath pattern string, entries 
  * in this string should be separated by ':' (semicolon) or ',' (comma).
  */
 
-public class ClasspathPattern
+public class ClasspathPattern extends AbstractList<String>
 {
     private static class Entry
     {
-        public String classpath = null;
-        public boolean result = false;
-        public boolean partial = false;      
+        public final String _pattern;
+        public final String _name;
+        public final boolean _inclusive;
+        public final boolean _package;     
+        
+        Entry(String pattern)
+        {
+            _pattern=pattern;
+            _inclusive = !pattern.startsWith("-");
+            _package = pattern.endsWith(".");
+            _name = _inclusive ? pattern : pattern.substring(1).trim();
+        }
+        
+        @Override
+        public String toString()
+        {
+            return _pattern;
+        }
     }
     
-    final private List<String> _patterns = new ArrayList<String>();
     final private List<Entry> _entries = new ArrayList<Entry>();
     
     /* ------------------------------------------------------------ */
@@ -56,160 +79,140 @@
     /* ------------------------------------------------------------ */
     public ClasspathPattern(String[] patterns)
     {
-        setPatterns(patterns);
+        setAll(patterns);
     }
     
     /* ------------------------------------------------------------ */
     public ClasspathPattern(String pattern)
     {
-        setPattern(pattern);
+        add(pattern);
     }
     
+    /* ------------------------------------------------------------ */
+    @Override
+    public String get(int index)
+    {
+        return _entries.get(index)._pattern;
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public String set(int index, String element)
+    {
+        Entry e = _entries.set(index,new Entry(element));
+        return e==null?null:e._pattern;
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public void add(int index, String element)
+    {
+        _entries.add(index,new Entry(element));
+    }
+
+    /* ------------------------------------------------------------ */
+    @Deprecated
+    public void addPattern(String element)
+    {
+        add(element);
+    }
+    
+    /* ------------------------------------------------------------ */
+    @Override
+    public String remove(int index)
+    {
+        Entry e = _entries.remove(index);
+        return e==null?null:e._pattern;
+    }
+    
+    /* ------------------------------------------------------------ */
+    public boolean remove(String pattern)
+    {
+        for (int i=_entries.size();i-->0;)
+        {
+            if (pattern.equals(_entries.get(i)._pattern))
+            {
+                _entries.remove(i);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /* ------------------------------------------------------------ */
+    @Override
+    public int size()
+    {
+        return _entries.size();
+    }
 
     /* ------------------------------------------------------------ */
     /**
      * Initialize the matcher by parsing each classpath pattern in an array
      * 
-     * @param patterns array of classpath patterns
+     * @param classes array of classpath patterns
      */
-    private void setPatterns(String[] patterns)
+    private void setAll(String[] classes)
     {
-        _patterns.clear();
         _entries.clear();
-        addPatterns(patterns);
+        addAll(classes);
     }
     
     /* ------------------------------------------------------------ */
     /**
-     * @param patterns array of classpath patterns
+     * @param classes array of classpath patterns
      */
-    private void addPatterns(String[] patterns)
+    private void addAll(String[] classes)
     {
-        if (patterns != null)
-        {
-            Entry entry = null; 
-            for (String pattern : patterns)
-            {
-                entry = createEntry(pattern);
-                if (entry != null) 
-                {
-                    _patterns.add(pattern);
-                    _entries.add(entry);
-                }
-            }
-        }
+        if (classes!=null)
+            addAll(Arrays.asList(classes));
     }
     
     /* ------------------------------------------------------------ */
     /**
-     * @param patterns array of classpath patterns
+     * @param classes array of classpath patterns
      */
-    private void prependPatterns(String[] patterns)
+    public void prepend(String[] classes)
     {
-        if (patterns != null)
+        if (classes != null)
         {
-            Entry entry = null;
             int i=0;
-            for (String pattern : patterns)
+            for (String c : classes)
             {
-                entry = createEntry(pattern);
-                if (entry != null) 
-                {
-                    _patterns.add(i,pattern);
-                    _entries.add(i,entry);
-                    i++;
-                }
+                add(i,c);
+                i++;
             }
         }
     }
-    
-    /* ------------------------------------------------------------ */
-    /**
-     * Create an entry object containing information about 
-     * a single classpath pattern
-     * 
-     * @param pattern single classpath pattern
-     * @return corresponding Entry object
-     */
-    private Entry createEntry(String pattern)
-    {
-        Entry entry = null;
-        
-        if (pattern != null)
-        {
-            String item = pattern.trim();
-            if (item.length() > 0)
-            {
-                entry = new Entry();
-                entry.result = !item.startsWith("-");
-                entry.partial = item.endsWith(".");
-                entry.classpath = entry.result ? item : item.substring(1).trim();
-            }
-        }
-        return entry;
-    }
-    
-    /* ------------------------------------------------------------ */
-    /**
-     * Initialize the matcher by parsing a classpath pattern string
-     * 
-     * @param pattern classpath pattern string
-     */
-    public void setPattern(String pattern)
-    {
-        _patterns.clear();
-        _entries.clear();
-        addPattern(pattern);
-    }
 
     /* ------------------------------------------------------------ */
-    /**
-     * Parse a classpath pattern string and appending the result
-     * to the existing configuration.
-     * 
-     * @param pattern classpath pattern string
-     */
-    public void addPattern(String pattern)
+    public void prependPattern(String pattern)
     {
-        ArrayList<String> patterns = new ArrayList<String>();
-        StringTokenizer entries = new StringTokenizer(pattern, ":,");
-        while (entries.hasMoreTokens())
-        {
-            patterns.add(entries.nextToken());
-        }
-        
-        addPatterns(patterns.toArray(new String[patterns.size()]));
-    }   
-    
-
-    /* ------------------------------------------------------------ */
-    public void prependPattern(String classOrPackage)
-    {
-        ArrayList<String> patterns = new ArrayList<String>();
-        StringTokenizer entries = new StringTokenizer(classOrPackage, ":,");
-        while (entries.hasMoreTokens())
-        {
-            patterns.add(entries.nextToken());
-        }
-        
-        prependPatterns(patterns.toArray(new String[patterns.size()]));
+        add(0,pattern);
     }
     
-    
     /* ------------------------------------------------------------ */
     /**
      * @return array of classpath patterns
      */
     public String[] getPatterns()
     {
-        String[] patterns = null;
-        
-        if (_patterns!=null && _patterns.size() > 0)
+        return toArray(new String[_entries.size()]);
+    }
+
+    /* ------------------------------------------------------------ */
+    /**
+     * @return List of classes excluded class exclusions and package patterns
+     */
+    public List<String> getClasses()
+    {
+        List<String> list = new ArrayList<>();
+        for (Entry e:_entries)
         {
-            patterns = _patterns.toArray(new String[_patterns.size()]);
+            if (e._inclusive && !e._package)
+                list.add(e._name);
         }
-        
-        return patterns;
+        return list;
     }
     
     /* ------------------------------------------------------------ */
@@ -221,48 +224,65 @@
      */
     public boolean match(String name)
     {       
-        boolean result=false;
+        name = name.replace('/','.');
 
-        if (_entries != null)
+        for (Entry entry : _entries)
         {
-            name = name.replace('/','.');
-
-            int startIndex = 0;
-
-            while(startIndex < name.length() && name.charAt(startIndex) == '.') {
-                startIndex++;
-            }
-
-            int dollar = name.indexOf("$");
-
-            int endIndex =  dollar != -1 ? dollar : name.length();
-
-            for (Entry entry : _entries)
+            if (entry==null)
+                continue;
+            if (entry._package)
             {
-                if (entry != null)
-                {               
-                    if (entry.partial)
-                    {
-                        if (name.regionMatches(startIndex, entry.classpath, 0, entry.classpath.length()))
-                        {
-                            result = entry.result;
-                            break;
-                        }
-                    }
-                    else
-                    {
-                        int regionLength = endIndex-startIndex;
-                        if (regionLength == entry.classpath.length()
-                                && name.regionMatches(startIndex, entry.classpath, 0, regionLength))
-                        {
-                            result = entry.result;
-                            break;
-                        }
-                    }
+                if (name.startsWith(entry._name))
+                    return entry._inclusive;
+            }
+            else
+            {
+                if (name.equals(entry._name))
+                    return entry._inclusive;
+                
+                if (name.length()>entry._name.length() && '$'==name.charAt(entry._name.length()) && name.startsWith(entry._name))
+                    return entry._inclusive;
+            }
+        }
+        return false;
+    }
+
+    public void addAfter(String afterPattern,String... patterns)
+    {
+        if (patterns!=null && afterPattern!=null)
+        {
+            ListIterator<String> iter = listIterator();
+            while (iter.hasNext())
+            {
+                String cc=iter.next();
+                if (afterPattern.equals(cc))
+                {
+                    for (int i=0;i<patterns.length;i++)
+                        iter.add(patterns[i]);
+                    return;
                 }
             }
         }
-        return result;
+        throw new IllegalArgumentException("after '"+afterPattern+"' not found in "+this);
     }
 
+    public void addBefore(String beforePattern,String... patterns)
+    {
+        if (patterns!=null && beforePattern!=null)
+        {
+            ListIterator<String> iter = listIterator();
+            while (iter.hasNext())
+            {
+                String cc=iter.next();
+                if (beforePattern.equals(cc))
+                {
+                    iter.previous();
+                    for (int i=0;i<patterns.length;i++)
+                        iter.add(patterns[i]);
+                    return;
+                }
+            }
+        }
+        throw new IllegalArgumentException("before '"+beforePattern+"' not found in "+this);
+    }
 }
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Configuration.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Configuration.java
index e67ff28..b0ba351 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Configuration.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Configuration.java
@@ -41,7 +41,7 @@
      * <p>
      * Typically this step discovers configuration resources
      * @param context The context to configure
-     * @throws Exception
+     * @throws Exception if unable to pre configure
      */
     public void preConfigure (WebAppContext context) throws Exception;
     
@@ -52,7 +52,7 @@
      * Typically this step applies the discovered configuration resources to
      * either the {@link WebAppContext} or the associated {@link MetaData}.
      * @param context The context to configure
-     * @throws Exception
+     * @throws Exception if unable to configure
      */
     public void configure (WebAppContext context) throws Exception;
     
@@ -60,7 +60,7 @@
     /* ------------------------------------------------------------------------------- */
     /** Clear down after configuration.
      * @param context The context to configure
-     * @throws Exception
+     * @throws Exception if unable to post configure
      */
     public void postConfigure (WebAppContext context) throws Exception;
     
@@ -69,7 +69,7 @@
      * This method is called to undo all configuration done. This is
      * called to allow the context to work correctly over a stop/start cycle
      * @param context The context to configure
-     * @throws Exception
+     * @throws Exception if unable to deconfigure
      */
     public void deconfigure (WebAppContext context) throws Exception;
 
@@ -78,7 +78,7 @@
      * This method is called to destroy a webappcontext. It is typically called when a context 
      * is removed from a server handler hierarchy by the deployer.
      * @param context The context to configure
-     * @throws Exception
+     * @throws Exception if unable to destroy
      */
     public void destroy (WebAppContext context) throws Exception;
     
@@ -90,7 +90,7 @@
      * has previously been configured by this Configuration.
      * @param template The template context
      * @param context The context to configure
-     * @throws Exception
+     * @throws Exception if unable to clone
      */
     public void cloneConfigure (WebAppContext template, WebAppContext context) throws Exception;
     
@@ -128,14 +128,18 @@
          */
         public static ClassList serverDefault(Server server)
         {
-            ClassList cl=server.getBean(ClassList.class);
-            if (cl!=null)
-                return new ClassList(cl);
-            Object attr = server.getAttribute(ATTR);
-            if (attr instanceof ClassList)
-                return new ClassList((ClassList)attr);
-            if (attr instanceof String[])
-                return new ClassList((String[])attr);
+            ClassList cl=null;
+            if (server!=null)
+            {
+                cl= server.getBean(ClassList.class);
+                if (cl!=null)
+                    return new ClassList(cl);
+                Object attr = server.getAttribute(ATTR);
+                if (attr instanceof ClassList)
+                    return new ClassList((ClassList)attr);
+                if (attr instanceof String[])
+                    return new ClassList((String[])attr);
+            }
             return new ClassList();
         }
         
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/FragmentConfiguration.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/FragmentConfiguration.java
index cf1b3ce..1a69259 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/FragmentConfiguration.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/FragmentConfiguration.java
@@ -25,9 +25,7 @@
 
 /**
  * FragmentConfiguration
- * 
- * 
- * 
+ * <p>
  * Process web-fragments in jars
  */
 public class FragmentConfiguration extends AbstractConfiguration
@@ -55,8 +53,10 @@
     /* ------------------------------------------------------------------------------- */
     /**
      * Look for any web-fragment.xml fragments in META-INF of jars in WEB-INF/lib
+     * @param context the web app context to look in
+     * @param metaData the metadata to populate with fragments
      * 
-     * @throws Exception
+     * @throws Exception if unable to find web fragments
      */
     public void findWebFragments (final WebAppContext context, final MetaData metaData) throws Exception
     {
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/IterativeDescriptorProcessor.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/IterativeDescriptorProcessor.java
index e3a45e5..cb71928 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/IterativeDescriptorProcessor.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/IterativeDescriptorProcessor.java
@@ -27,8 +27,6 @@
 
 /**
  * IterativeDescriptorProcessor
- *
- *
  */
 public abstract class IterativeDescriptorProcessor implements DescriptorProcessor
 {
@@ -41,8 +39,8 @@
      * Register a method to be called back when visiting the node with the given name.
      * The method must exist on a subclass of this class, and must have the signature:
      * public void method (Descriptor descriptor, XmlParser.Node node)
-     * @param nodeName
-     * @param m
+     * @param nodeName the node name
+     * @param m the method name
      */
     public void registerVisitor(String nodeName, Method m)
     {
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/JarScanner.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/JarScanner.java
index 72d9676..1c6ab46 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/JarScanner.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/JarScanner.java
@@ -48,7 +48,6 @@
 {
     private static final Logger LOG = Log.getLogger(JarScanner.class);
 
-
     public abstract void processEntry (URI jarUri, JarEntry entry);
     
     /**
@@ -73,10 +72,10 @@
      * Will iterate over the jar names, matching
      * all those starting with "aaa-" first, then "bbb-".
      *
-     * @param pattern
-     * @param uris
+     * @param pattern the pattern to use for jar matching
+     * @param uris the uris of the jars to scan
      * @param isNullInclusive if true, an empty pattern means all names match, if false, none match
-     * @throws Exception
+     * @throws Exception if unable to scan
      */
     public void scan (Pattern pattern, URI[] uris, boolean isNullInclusive)
     throws Exception
@@ -110,11 +109,11 @@
      * parent loader hierarchy. If false, it is only applied to the
      * classloader passed in.
      * 
-     * @param pattern
-     * @param loader
-     * @param isNullInclusive
-     * @param visitParent
-     * @throws Exception
+     * @param pattern the pattern to use for jar matching
+     * @param loader the class loader to look for jars in
+     * @param isNullInclusive if true, an empty pattern means all names match, if false, none match
+     * @param visitParent if true, visit parent classloaders too
+     * @throws Exception if unable to scan
      */
     public void scan (Pattern pattern, ClassLoader loader, boolean isNullInclusive, boolean visitParent)
     throws Exception
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaData.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaData.java
index 166c421..78088ac 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaData.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaData.java
@@ -32,9 +32,6 @@
 import org.eclipse.jetty.util.resource.EmptyResource;
 import org.eclipse.jetty.util.resource.Resource;
 
-
-
-
 /**
  * MetaData
  *
@@ -64,10 +61,6 @@
     protected Ordering _ordering;//can be set to RelativeOrdering by web-default.xml, web.xml, web-override.xml
     protected boolean allowDuplicateFragmentNames = false;
 
-
-
-
-
     public static class OriginInfo
     {
         private final String name;
@@ -263,7 +256,7 @@
      *
      * @param jarResource the jar the fragment is contained in
      * @param xmlResource the resource representing the xml file
-     * @throws Exception
+     * @throws Exception if unable to add fragment
      */
     public void addFragment (Resource jarResource, Resource xmlResource)
     throws Exception
@@ -304,7 +297,7 @@
     /**
      * Annotations not associated with a WEB-INF/lib fragment jar.
      * These are from WEB-INF/classes or the ??container path??
-     * @param annotations
+     * @param annotations the list of discovered annotations to add
      */
     public void addDiscoveredAnnotations(List<DiscoveredAnnotation> annotations)
     {
@@ -324,7 +317,7 @@
      * This method is synchronized as it is anticipated that it may be called by many threads
      * during the annotation scanning phase.
      * 
-     * @param annotation
+     * @param annotation the discovered annotation
      */
     public synchronized void addDiscoveredAnnotation (DiscoveredAnnotation annotation)
     {
@@ -368,7 +361,9 @@
 
     /**
      * Resolve all servlet/filter/listener metadata from all sources: descriptors and annotations.
-     *
+     * 
+     * @param context the context to resolve servlets / filters / listeners metadata from 
+     * @throws Exception if unable to resolve metadata
      */
     public void resolve (WebAppContext context)
     throws Exception
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaInfConfiguration.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaInfConfiguration.java
index 0c0d80e..1f4994f 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaInfConfiguration.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaInfConfiguration.java
@@ -19,14 +19,21 @@
 package org.eclipse.jetty.webapp;
 
 
+import java.io.File;
+import java.io.IOException;
+import java.net.JarURLConnection;
 import java.net.URI;
 import java.net.URL;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
 
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
@@ -35,12 +42,13 @@
 
 /**
  * MetaInfConfiguration
+ * <p>
  *
  * Scan META-INF of jars to find:
  * <ul>
- * <li>tlds
- * <li>web-fragment.xml
- * <li>resources
+ * <li>tlds</li>
+ * <li>web-fragment.xml</li>
+ * <li>resources</li>
  * </ul>
  * 
  * The jars which are scanned are:
@@ -91,10 +99,10 @@
      * cache the info discovered indexed by the jar in which it was discovered: this speeds
      * up subsequent context deployments.
      * 
-     * @param context
-     * @param jars
-     * @param useCaches
-     * @throws Exception
+     * @param context the context for the scan
+     * @param jars the jars resources to scan
+     * @param useCaches if true, cache the info discovered
+     * @throws Exception if unable to scan the jars
      */
     public void scanJars (final WebAppContext context, Collection<Resource> jars, boolean useCaches)
     throws Exception
@@ -140,10 +148,10 @@
     /**
      * Scan for META-INF/resources dir in the given jar.
      * 
-     * @param context
-     * @param target
-     * @param cache
-     * @throws Exception
+     * @param context the context for the scan
+     * @param target the target resource to scan for
+     * @param cache the resource cache
+     * @throws Exception if unable to scan for resources
      */
     public void scanForResources (WebAppContext context, Resource target, ConcurrentHashMap<Resource,Resource> cache)
     throws Exception
@@ -175,8 +183,12 @@
                 URI uri = target.getURI();
                 resourcesDir = Resource.newResource("jar:"+uri+"!/META-INF/resources");
             }
+            
             if (!resourcesDir.exists() || !resourcesDir.isDirectory())
+            {
+                resourcesDir.close();
                 resourcesDir = EmptyResource.INSTANCE;
+            }
 
             if (cache != null)
             {               
@@ -188,7 +200,9 @@
             }
 
             if (resourcesDir == EmptyResource.INSTANCE)
+            {
                 return;
+            }
         }
 
         //add it to the meta inf resources for this context
@@ -199,16 +213,17 @@
             context.setAttribute(METAINF_RESOURCES, dirs);
         }
         if (LOG.isDebugEnabled()) LOG.debug(resourcesDir+" added to context");
+
         dirs.add(resourcesDir);
     }
     
     /**
      * Scan for META-INF/web-fragment.xml file in the given jar.
      * 
-     * @param context
-     * @param jar
-     * @param cache
-     * @throws Exception
+     * @param context the context for the scan
+     * @param jar the jar resource to scan for fragements in
+     * @param cache the resource cache
+     * @throws Exception if unable to scan for fragments
      */
     public void scanForFragment (WebAppContext context, Resource jar, ConcurrentHashMap<Resource,Resource> cache)
     throws Exception
@@ -240,7 +255,10 @@
                 webFrag = Resource.newResource("jar:"+uri+"!/META-INF/web-fragment.xml");
             }
             if (!webFrag.exists() || webFrag.isDirectory())
+            {
+                webFrag.close();
                 webFrag = EmptyResource.INSTANCE;
+            }
             
             if (cache != null)
             {
@@ -270,10 +288,10 @@
     /**
      * Discover META-INF/*.tld files in the given jar
      * 
-     * @param context
-     * @param jar
-     * @param cache
-     * @throws Exception
+     * @param context the context for the scan
+     * @param jar the jar resources to scan tlds for
+     * @param cache the resource cache
+     * @throws Exception if unable to scan for tlds
      */
     public void scanForTlds (WebAppContext context, Resource jar, ConcurrentHashMap<Resource, Collection<URL>> cache)
     throws Exception
@@ -297,30 +315,17 @@
         else
         {
             //not using caches or not in the cache so find all tlds
-            Resource metaInfDir = null;
+            tlds = new HashSet<URL>();  
             if (jar.isDirectory())
             {
-                //TODO ??????
-                metaInfDir = jar.addPath("/META-INF/");
+                tlds.addAll(getTlds(jar.getFile()));
             }
             else
             {
                 URI uri = jar.getURI();
-                metaInfDir = Resource.newResource("jar:"+uri+"!/META-INF/");
+                tlds.addAll(getTlds(uri));
             }
 
-            //find any *.tld files inside META-INF or subdirs
-            tlds = new HashSet<URL>();      
-            Collection<Resource> resources = metaInfDir.getAllResources();
-            for (Resource t:resources)
-            {
-                String name = t.toString();
-                if (name.endsWith(".tld"))
-                {
-                    if (LOG.isDebugEnabled()) LOG.debug(t+" tld discovered");
-                    tlds.add(t.getURL());
-                }
-            }
             if (cache != null)
             {  
                 if (LOG.isDebugEnabled()) LOG.debug(jar+" tld cache updated");
@@ -333,13 +338,13 @@
                 return;
         }
 
-        Collection<URL> tld_resources=(Collection<URL>)context.getAttribute(METAINF_TLDS);
-        if (tld_resources == null)
+        Collection<URL> metaInfTlds = (Collection<URL>)context.getAttribute(METAINF_TLDS);
+        if (metaInfTlds == null)
         {
-            tld_resources = new HashSet<URL>();
-            context.setAttribute(METAINF_TLDS, tld_resources);
+            metaInfTlds = new HashSet<URL>();
+            context.setAttribute(METAINF_TLDS, metaInfTlds);
         }
-        tld_resources.addAll(tlds);  
+        metaInfTlds.addAll(tlds);  
         if (LOG.isDebugEnabled()) LOG.debug("tlds added to context");
     }
     
@@ -347,8 +352,72 @@
     @Override
     public void postConfigure(WebAppContext context) throws Exception
     {
-        context.setAttribute(METAINF_FRAGMENTS, null); 
         context.setAttribute(METAINF_RESOURCES, null);
+
+        context.setAttribute(METAINF_FRAGMENTS, null); 
+   
         context.setAttribute(METAINF_TLDS, null);
     }
+    
+    /**
+     * Find all .tld files in all subdirs of the given dir.
+     * 
+     * @param dir the directory to scan
+     * @return the list of tlds found
+     * @throws IOException if unable to scan the directory
+     */
+    public Collection<URL>  getTlds (File dir) throws IOException
+    {
+        if (dir == null || !dir.isDirectory())
+            return Collections.emptySet();
+        
+        HashSet<URL> tlds = new HashSet<URL>();
+        
+        File[] files = dir.listFiles();
+        if (files != null)
+        {
+            for (File f:files)
+            {
+                if (f.isDirectory())
+                    tlds.addAll(getTlds(f));
+                else
+                {
+                    String name = f.getCanonicalPath();
+                    if (name.contains("META-INF") && name.endsWith(".tld"))
+                        tlds.add(f.toURI().toURL());
+                }
+            }
+        }
+        return tlds;  
+    }
+    
+    /**
+     * Find all .tld files in the given jar.
+     * 
+     * @param uri the uri to jar file
+     * @return the collection of tlds as url references  
+     * @throws IOException if unable to scan the jar file
+     */
+    public Collection<URL> getTlds (URI uri) throws IOException
+    {
+        HashSet<URL> tlds = new HashSet<URL>();
+        
+        URL url = new URL("jar:"+uri+"!/");
+        JarURLConnection jarConn = (JarURLConnection) url.openConnection();
+        jarConn.setUseCaches(Resource.getDefaultUseCaches());
+        JarFile jarFile = jarConn.getJarFile();
+        Enumeration<JarEntry> entries = jarFile.entries();
+        while (entries.hasMoreElements())
+        {
+            JarEntry e = entries.nextElement();
+            String name = e.getName();
+            if (name.startsWith("META-INF") && name.endsWith(".tld"))
+            {
+                tlds.add(new URL("jar:"+uri+"!/"+name));
+            }
+        }
+        if (!Resource.getDefaultUseCaches())
+            jarFile.close();
+        return tlds;
+    }
 }
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Ordering.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Ordering.java
index 3f9b41a..5ee01be 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Ordering.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Ordering.java
@@ -29,18 +29,14 @@
 
 
 /**
- * Ordering
- *
  * Ordering options for jars in WEB-INF lib.
  */
 public interface Ordering
 {  
-
     public List<Resource> order(List<Resource> fragments);
     public boolean isAbsolute ();
     public boolean hasOther();
 
-
     /**
      * AbsoluteOrdering
      *
@@ -150,6 +146,10 @@
         @Override
         public List<Resource> order(List<Resource> jars)
         {         
+            _beforeOthers.clear();
+            _afterOthers.clear();
+            _noOthers.clear();
+
             //for each jar, put it into the ordering according to the fragment ordering
             for (Resource jar:jars)
             {
@@ -161,17 +161,17 @@
                     {
                         case None:
                         {
-                            ((RelativeOrdering)_metaData.getOrdering()).addNoOthers(jar);
+                            addNoOthers(jar);
                             break;
                         }
                         case Before:
                         { 
-                            ((RelativeOrdering)_metaData.getOrdering()).addBeforeOthers(jar);
+                            addBeforeOthers(jar);
                             break;
                         }
                         case After:
                         {
-                            ((RelativeOrdering)_metaData.getOrdering()).addAfterOthers(jar);
+                            addAfterOthers(jar);
                             break;
                         }
                     } 
@@ -179,7 +179,7 @@
                 else
                 {
                     //jar fragment has no descriptor, but there is a relative ordering in place, so it must be part of the others
-                    ((RelativeOrdering)_metaData.getOrdering()).addNoOthers(jar);
+                    addNoOthers(jar);
                 }
             }            
                 
@@ -350,9 +350,10 @@
     
        /**
         * Is fragment with name a before fragment with name b?
-        * @param list
-        * @param fragNameA
-        * @param fragNameB
+        * 
+        * @param list the list of resources
+        * @param fragNameA the first fragment
+        * @param fragNameB the second fragment
         * @return true if fragment name A is before fragment name B 
         */
        protected boolean isBefore (List<Resource> list, String fragNameA, String fragNameB)
@@ -397,9 +398,10 @@
     
        /**
         * Is fragment name "a" after fragment name "b"?
-        * @param list
-        * @param fragNameA
-        * @param fragNameB
+        * 
+        * @param list the list of resources
+        * @param fragNameA the first fragment
+        * @param fragNameB the second fragment
         * @return true if fragment name A is after fragment name B
         */
        protected boolean isAfter(List<Resource> list, String fragNameA, String fragNameB)
@@ -441,9 +443,9 @@
         * Insert the resource matching the fragName into the list of resources
         * at the location indicated by index.
         * 
-        * @param list
-        * @param index
-        * @param fragName
+        * @param list the list of resources
+        * @param index the index to insert into
+        * @param fragName the fragment name to insert
         */
        protected void insert(List<Resource> list, int index, String fragName)
        {
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/StandardDescriptorProcessor.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/StandardDescriptorProcessor.java
index 6c42b7e..b2dc458 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/StandardDescriptorProcessor.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/StandardDescriptorProcessor.java
@@ -51,6 +51,7 @@
 import org.eclipse.jetty.servlet.ServletMapping;
 import org.eclipse.jetty.util.ArrayUtil;
 import org.eclipse.jetty.util.Loader;
+import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.security.Constraint;
@@ -58,9 +59,9 @@
 import org.eclipse.jetty.xml.XmlParser.Node;
 
 /**
- * StandardDescriptorProcessor
- *
- * Process a web.xml, web-defaults.xml, web-overrides.xml, web-fragment.xml.
+ * StandardDescriptorProcessor.
+ * <p>
+ * Process the web.xml, web-defaults.xml, web-overrides.xml, and web-fragment.xml descriptors.
  */
 public class StandardDescriptorProcessor extends IterativeDescriptorProcessor
 {
@@ -148,11 +149,6 @@
         _servletMappings.clear();
     }
 
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     */
     public void visitContextParam (WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
         String name = node.getString("param-name", false, true);
@@ -196,13 +192,6 @@
 
     }
 
-
-    /* ------------------------------------------------------------ */
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     */
     public void visitDisplayName(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
         //Servlet Spec 3.0 p. 74 Ignore from web-fragments
@@ -213,12 +202,6 @@
         }
     }
 
-
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     */
     public void visitServlet(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
         String id = node.getAttribute("id");
@@ -621,13 +604,6 @@
         }
     }
 
-
-
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     */
     public void visitServletMapping(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
         //Servlet Spec 3.0, p74
@@ -669,12 +645,6 @@
         }
     }
 
-
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     */
     public void visitSessionConfig(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
         XmlParser.Node tNode = node.get("session-timeout");
@@ -997,13 +967,6 @@
         }
     }
 
-
-
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     */
     public void visitMimeMapping(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
         String extension = node.getString("extension", false, true);
@@ -1046,11 +1009,6 @@
         }
     }
 
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     */
     public void visitWelcomeFileList(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
         switch (context.getMetaData().getOrigin("welcome-file-list"))
@@ -1095,11 +1053,6 @@
         }
     }
 
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     */
     public void visitLocaleEncodingList(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
         Iterator<XmlParser.Node> iter = node.iterator("locale-encoding-mapping");
@@ -1146,11 +1099,6 @@
         }
     }
 
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     */
     public void visitErrorPage(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
         String error = node.getString("error-code", false, true);
@@ -1212,10 +1160,6 @@
 
     }
 
-    /**
-     * @param context
-     * @param node
-     */
     public void addWelcomeFiles(WebAppContext context, XmlParser.Node node)
     {
         Iterator<XmlParser.Node> iter = node.iterator("welcome-file");
@@ -1230,12 +1174,6 @@
         }
     }
 
-
-    /**
-     * @param servletName
-     * @param node
-     * @param context
-     */
     public ServletMapping addServletMapping (String servletName, XmlParser.Node node, WebAppContext context, Descriptor descriptor)
     {
         ServletMapping mapping = new ServletMapping();
@@ -1249,8 +1187,7 @@
             String p = iter.next().toString(false, true);
             p = normalizePattern(p);
             
-            //check if there is already a mapping for this path, and if there is && it is from a defaultdescriptor
-            //remove it in favour of the new one      
+            //check if there is already a mapping for this path
             ListIterator<ServletMapping> listItor = _servletMappings.listIterator();
             boolean found = false;
             while (listItor.hasNext() && !found)
@@ -1260,21 +1197,30 @@
                 {
                     for (String ps:sm.getPathSpecs())
                     {
-                        if (p.equals(ps) && sm.isDefault())
+                        //The same path has been mapped multiple times, either to a different servlet or the same servlet.
+                        //If its a different servlet, this is only valid to do if the old mapping was from a default descriptor.
+                        if (p.equals(ps) && (sm.isDefault() || servletName.equals(sm.getServletName())))
                         {
-                            if (LOG.isDebugEnabled()) LOG.debug("{} in mapping {} from defaults descriptor is overridden by ",ps,sm,servletName);
+                            if (sm.isDefault())
+                            {
+                                if (LOG.isDebugEnabled()) LOG.debug("{} in mapping {} from defaults descriptor is overridden by ",ps,sm,servletName);
+                            }
+                            else
+                                LOG.warn("Duplicate mapping from {} to {}", p, servletName);
+
                             //remove ps from the path specs on the existing mapping
                             //if the mapping now has no pathspecs, remove it
                             String[] updatedPaths = ArrayUtil.removeFromArray(sm.getPathSpecs(), ps);
+                            
                             if (updatedPaths == null || updatedPaths.length == 0)
-                            { 
-                                if (LOG.isDebugEnabled()) LOG.debug("Removed mapping {} from defaults descriptor",sm);
+                            {
+                                if (LOG.isDebugEnabled()) LOG.debug("Removed empty mapping {}",sm);
                                 listItor.remove();
                             }
                             else 
                             {
                                 sm.setPathSpecs(updatedPaths);
-                                if (LOG.isDebugEnabled()) LOG.debug("Removed path {} from mapping {} from defaults descriptor ", p,sm);
+                                if (LOG.isDebugEnabled()) LOG.debug("Removed path {} from mapping {}", p,sm);
                             }
                             found = true;
                             break;
@@ -1282,24 +1228,17 @@
                     }
                 }
             }
-            
+
             paths.add(p);
             context.getMetaData().setOrigin(servletName+".servlet.mapping."+p, descriptor);
         }
+
         mapping.setPathSpecs((String[]) paths.toArray(new String[paths.size()]));
         if (LOG.isDebugEnabled()) LOG.debug("Added mapping {} ",mapping);
-        
-      
-      
         _servletMappings.add(mapping);
         return mapping;
     }
 
-    /**
-     * @param filterName
-     * @param node
-     * @param context
-     */
     public void addFilterMapping (String filterName, XmlParser.Node node, WebAppContext context, Descriptor descriptor)
     {
         FilterMapping mapping = new FilterMapping();
@@ -1340,12 +1279,6 @@
         _filterMappings.add(mapping);
     }
 
-
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     */
     public void visitTagLib(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
         //Additive across web.xml and web-fragment.xml
@@ -1367,11 +1300,6 @@
         config.addTaglibDescriptor(tl);
     }
 
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     */
     public void visitJspConfig(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
         //Additive across web.xml and web-fragment.xml
@@ -1441,18 +1369,55 @@
         //add mappings to the jsp servlet from the property-group mappings
         if (paths.size() > 0)
         {
-            ServletMapping mapping = new ServletMapping();
-            mapping.setServletName("jsp");
-            mapping.setPathSpecs(paths.toArray(new String[paths.size()]));
-            _servletMappings.add(mapping);
+            ServletMapping jspMapping = null;
+            for (ServletMapping m: _servletMappings)
+            {
+                if (m.getServletName().equals("jsp"))
+                {
+                    jspMapping = m;
+                    break;
+                }
+            }
+            if (jspMapping != null)
+            {
+                if (jspMapping.getPathSpecs() == null)
+                {
+                    //no paths in jsp servlet mapping, we will add all of ours
+                    if (LOG.isDebugEnabled()) LOG.debug("Adding all paths from jsp-config to jsp servlet mapping");
+                    jspMapping.setPathSpecs(paths.toArray(new String[paths.size()]));
+                }
+                else
+                {
+                    //check if each of our paths is already present in existing mapping
+                    ListIterator<String> piterator = paths.listIterator();
+                    while (piterator.hasNext())
+                    {
+                        String p = piterator.next();
+                        if (jspMapping.containsPathSpec(p))
+                            piterator.remove();
+                    }
+                    
+                    //any remaining paths, add to the jspMapping
+                    if (paths.size() > 0)
+                    {
+                        for (String p:jspMapping.getPathSpecs())
+                            paths.add(p);
+                        if (LOG.isDebugEnabled()) LOG.debug("Adding extra paths from jsp-config to jsp servlet mapping");
+                        jspMapping.setPathSpecs((String[])paths.toArray(new String[paths.size()]));
+                    }
+                }
+            }
+            else
+            {
+                //no mapping for jsp yet, make one
+                ServletMapping mapping = new ServletMapping();
+                mapping.setServletName("jsp");
+                mapping.setPathSpecs(paths.toArray(new String[paths.size()]));
+                _servletMappings.add(mapping);
+            }
         }
     }
 
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     */
     public void visitSecurityConstraint(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
         Constraint scBase = new Constraint();
@@ -1562,12 +1527,6 @@
         }
     }
 
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     * @throws Exception
-     */
     public void visitLoginConfig(WebAppContext context, Descriptor descriptor, XmlParser.Node node) throws Exception
     {
         //ServletSpec 3.0 p74 says elements present 0/1 time if specified in web.xml take
@@ -1732,11 +1691,6 @@
         }
     }
 
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     */
     public void visitSecurityRole(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
         //ServletSpec 3.0, p74 elements with multiplicity >1 are additive when merged
@@ -1745,12 +1699,6 @@
         ((ConstraintAware)context.getSecurityHandler()).addRole(role);
     }
 
-
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     */
     public void visitFilter(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
         String name = node.getString("filter-name", false, true);
@@ -1882,11 +1830,6 @@
         }
     }
 
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     */
     public void visitFilterMapping(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
         //Servlet Spec 3.0, p74
@@ -1925,12 +1868,6 @@
         }
     }
 
-
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     */
     public void visitListener(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
         String className = node.getString("listener-class", false, true);
@@ -1972,11 +1909,6 @@
         }
     }
 
-    /**
-     * @param context
-     * @param descriptor
-     * @param node
-     */
     public void visitDistributable(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
         // the element has no content, so its simple presence
@@ -1989,25 +1921,18 @@
     /**
      * Servlet spec 3.1. When present in web.xml, this means that http methods that are
      * not covered by security constraints should have access denied.
-     * 
+     * <p>
      * See section 13.8.4, pg 145
-     * @param context
-     * @param descriptor
-     * @param node
+     * 
+     * @param context the of the processing
+     * @param descriptor the descriptor
+     * @param node the xml node
      */
     public void visitDenyUncoveredHttpMethods(WebAppContext context, Descriptor descriptor, XmlParser.Node node)
     {
         ((ConstraintAware)context.getSecurityHandler()).setDenyUncoveredHttpMethods(true);
     }
 
-    /**
-     * @param context
-     * @param clazz
-     * @return the new event listener
-     * @throws ServletException
-     * @throws InstantiationException
-     * @throws IllegalAccessException
-     */
     public EventListener newListenerInstance(WebAppContext context,Class<? extends EventListener> clazz) throws Exception
     {
         ListenerHolder h = context.getServletHandler().newListenerHolder(Source.DESCRIPTOR);
@@ -2018,15 +1943,9 @@
 
     }
 
-    /**
-     * @param p
-     * @return the normalized pattern
-     */
     public String normalizePattern(String p)
     {
         if (p != null && p.length() > 0 && !p.startsWith("/") && !p.startsWith("*")) return "/" + p;
         return p;
     }
-
-
 }
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppClassLoader.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppClassLoader.java
index fa30de5..b4c684a 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppClassLoader.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppClassLoader.java
@@ -23,7 +23,6 @@
 import java.io.InputStream;
 import java.lang.instrument.ClassFileTransformer;
 import java.lang.instrument.IllegalClassFormatException;
-import java.lang.instrument.Instrumentation;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.security.CodeSource;
@@ -46,11 +45,12 @@
 import org.eclipse.jetty.util.resource.ResourceCollection;
 
 
-/* ------------------------------------------------------------ */
-/** ClassLoader for HttpContext.
+/** 
+ * ClassLoader for HttpContext.
+ * <p>
  * Specializes URLClassLoader with some utility and file mapping
  * methods.
- *
+ * <p>
  * This loader defaults to the 2.3 servlet spec behavior where non
  * system classes are loaded from the classpath in preference to the
  * parent loader.  Java2 compliant loading, where the parent loader
@@ -58,14 +58,18 @@
  * {@link org.eclipse.jetty.webapp.WebAppContext#setParentLoaderPriority(boolean)} 
  * method and influenced with {@link WebAppContext#isServerClass(String)} and 
  * {@link WebAppContext#isSystemClass(String)}.
- *
+ * <p>
  * If no parent class loader is provided, then the current thread 
  * context classloader will be used.  If that is null then the 
  * classloader that loaded this class is used as the parent.
- * 
  */
 public class WebAppClassLoader extends URLClassLoader
 {
+    static
+    {
+        registerAsParallelCapable();
+    }
+
     private static final Logger LOG = Log.getLogger(WebAppClassLoader.class);
 
     private final Context _context;
@@ -131,7 +135,10 @@
     }
     
     /* ------------------------------------------------------------ */
-    /** Constructor.
+    /** 
+     * Constructor.
+     * @param context the context for this classloader
+     * @throws IOException if unable to initialize from context
      */
     public WebAppClassLoader(Context context)
         throws IOException
@@ -140,7 +147,12 @@
     }
     
     /* ------------------------------------------------------------ */
-    /** Constructor.
+    /** 
+     * Constructor.
+     * 
+     * @param parent the parent classloader 
+     * @param context the context for this classloader
+     * @throws IOException if unable to initialize classloader
      */
     public WebAppClassLoader(ClassLoader parent, Context context)
         throws IOException
@@ -200,6 +212,7 @@
      * @param resource Comma or semicolon separated path of filenames or URLs
      * pointing to directories or jar files. Directories should end
      * with '/'.
+     * @throws IOException if unable to add classpath from resource
      */
     public void addClassPath(Resource resource)
         throws IOException
@@ -220,6 +233,7 @@
      * @param classPath Comma or semicolon separated path of filenames or URLs
      * pointing to directories or jar files. Directories should end
      * with '/'.
+     * @throws IOException if unable to add classpath
      */
     public void addClassPath(String classPath)
         throws IOException
@@ -243,11 +257,13 @@
                 File file= resource.getFile();
                 if (file != null)
                 {
-                    URL url= resource.getURL();
+                    URL url= resource.getURI().toURL();
                     addURL(url);
                 }
                 else if (resource.isDirectory())
-                    addURL(resource.getURL());
+                {
+                    addURL(resource.getURI().toURL());
+                }
                 else
                 {
                     if (LOG.isDebugEnabled())
@@ -283,6 +299,8 @@
                 try 
                 {
                     Resource fn=lib.addPath(files[f]);
+                    if(LOG.isDebugEnabled())
+                        LOG.debug("addJar - {}", fn);
                     String fnlc=fn.getName().toLowerCase(Locale.ENGLISH);
                     // don't check if this is a directory, see Bug 353165
                     if (isFileSupported(fnlc))
@@ -356,42 +374,49 @@
         String tmp = name;
         if (tmp != null && tmp.endsWith(".class"))
             tmp = tmp.substring(0, tmp.length()-6);
-      
+        
         boolean system_class=_context.isSystemClass(tmp);
         boolean server_class=_context.isServerClass(tmp);
         
+        if (LOG.isDebugEnabled())
+            LOG.debug("getResource({}) system={} server={} cl={}",name,system_class,server_class,this);
+        
         if (system_class && server_class)
             return null;
         
+        ClassLoader source=null;
+        
         if (_parent!=null &&(_context.isParentLoaderPriority() || system_class ) && !server_class)
         {
             tried_parent= true;
             
             if (_parent!=null)
-                url= _parent.getResource(name);
+            {
+                source=_parent;
+                url=_parent.getResource(name);
+            }
         }
 
         if (url == null)
         {
             url= this.findResource(name);
-
+            source=this;
             if (url == null && name.startsWith("/"))
-            {
-                if (LOG.isDebugEnabled())
-                    LOG.debug("HACK leading / off " + name);
                 url= this.findResource(name.substring(1));
-            }
         }
 
         if (url == null && !tried_parent && !server_class )
         {
             if (_parent!=null)
+            {
+                tried_parent=true;
+                source=_parent;
                 url= _parent.getResource(name);
+            }
         }
 
-        if (url != null)
-            if (LOG.isDebugEnabled())
-                LOG.debug("getResource("+name+")=" + url);
+        if (LOG.isDebugEnabled())
+            LOG.debug("gotResource({})=={} from={} tried_parent={}",name,url,source,tried_parent);
 
         return url;
     }
@@ -405,67 +430,85 @@
 
     /* ------------------------------------------------------------ */
     @Override
-    protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
+    protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
     {
-        Class<?> c= findLoadedClass(name);
-        ClassNotFoundException ex= null;
-        boolean tried_parent= false;
-        
-        boolean system_class=_context.isSystemClass(name);
-        boolean server_class=_context.isServerClass(name);
-        
-        if (system_class && server_class)
+        synchronized (getClassLoadingLock(name))
         {
-            return null;
-        }
-        
-        if (c == null && _parent!=null && (_context.isParentLoaderPriority() || system_class) && !server_class)
-        {
-            tried_parent= true;
-            try
+            Class<?> c= findLoadedClass(name);
+            ClassNotFoundException ex= null;
+            boolean tried_parent= false;
+
+            boolean system_class=_context.isSystemClass(name);
+            boolean server_class=_context.isServerClass(name);
+
+            if (LOG.isDebugEnabled())
+                LOG.debug("loadClass({}) system={} server={} cl={}",name,system_class,server_class,this);
+            
+            ClassLoader source=null;
+            
+            if (system_class && server_class)
             {
+                return null;
+            }
+
+            if (c == null && _parent!=null && (_context.isParentLoaderPriority() || system_class) && !server_class)
+            {
+                tried_parent= true;
+                source=_parent;
+                try
+                {
+                    c= _parent.loadClass(name);
+                    if (LOG.isDebugEnabled())
+                        LOG.debug("loaded " + c);
+                }
+                catch (ClassNotFoundException e)
+                {
+                    ex= e;
+                }
+            }
+
+            if (c == null)
+            {
+                try
+                {
+                    source=this;
+                    c= this.findClass(name);
+                }
+                catch (ClassNotFoundException e)
+                {
+                    ex= e;
+                }
+            }
+
+            if (c == null && _parent!=null && !tried_parent && !server_class )
+            {
+                tried_parent=true;
+                source=_parent;
                 c= _parent.loadClass(name);
-                if (LOG.isDebugEnabled())
-                    LOG.debug("loaded " + c);
             }
-            catch (ClassNotFoundException e)
+
+            if (c == null && ex!=null)
             {
-                ex= e;
+                LOG.debug("!loadedClass({}) from={} tried_parent={}",name,this,tried_parent);
+                throw ex;
             }
+
+            if (LOG.isDebugEnabled())
+                LOG.debug("loadedClass({})=={} from={} tried_parent={}",name,c,source,tried_parent);
+            
+            if (resolve)
+                resolveClass(c);
+
+            return c;
         }
-
-        if (c == null)
-        {
-            try
-            {
-                c= this.findClass(name);
-            }
-            catch (ClassNotFoundException e)
-            {
-                ex= e;
-            }
-        }
-
-        if (c == null && _parent!=null && !tried_parent && !server_class )
-            c= _parent.loadClass(name);
-
-        if (c == null && ex!=null)
-            throw ex;
-
-        if (resolve)
-            resolveClass(c);
-
-        if (LOG.isDebugEnabled())
-            LOG.debug("loaded {} from {}",c,c==null?null:c.getClassLoader());
-        
-        return c;
     }
 
     /* ------------------------------------------------------------ */
     /**
-     * @see addTransformer
-     * @deprecated
+     * @param transformer the transformer to add
+     * @deprecated {@link #addTransformer(ClassFileTransformer)} instead
      */
+    @Deprecated
     public void addClassFileTransformer(ClassFileTransformer transformer)
     {
         _transformers.add(transformer);
@@ -473,27 +516,23 @@
     
     /* ------------------------------------------------------------ */
     /**
-     * @see removeTransformer
-     * @deprecated
+     * @param transformer the transformer to remove
+     * @return true if transformer was removed
+     * @deprecated use {@link #removeTransformer(ClassFileTransformer)} instead
      */
+    @Deprecated
     public boolean removeClassFileTransformer(ClassFileTransformer transformer)
     {
         return _transformers.remove(transformer);
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * @see addClassFileTransformer
-     */
     public void addTransformer(ClassFileTransformer transformer)
     {
         _transformers.add(transformer);
     }
     
     /* ------------------------------------------------------------ */
-    /**
-     * @see removeClassFileTransformer
-     */
     public boolean removeTransformer(ClassFileTransformer transformer)
     {
         return _transformers.remove(transformer);
@@ -520,7 +559,10 @@
             {
                 content = url.openStream();
                 byte[] bytes = IO.readBytes(content);
-                    
+
+                if (LOG.isDebugEnabled())
+                    LOG.debug("foundClass({}) url={} cl={}",name,url,this);
+                
                 for (ClassFileTransformer transformer : _transformers)
                 {
                     byte[] tmp = transformer.transform(this,name,null,null,bytes);
@@ -557,6 +599,13 @@
         return clazz;
     }
     
+    
+    @Override
+    public void close() throws IOException
+    {
+        super.close();
+    }
+
     /* ------------------------------------------------------------ */
     @Override
     public String toString()
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java
index 15bae85..f899d98 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java
@@ -22,6 +22,7 @@
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.net.URLClassLoader;
 import java.security.PermissionCollection;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -47,6 +48,7 @@
 import org.eclipse.jetty.security.ConstraintMapping;
 import org.eclipse.jetty.security.ConstraintSecurityHandler;
 import org.eclipse.jetty.security.SecurityHandler;
+import org.eclipse.jetty.server.ClassLoaderDump;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.HandlerContainer;
 import org.eclipse.jetty.server.Server;
@@ -56,18 +58,21 @@
 import org.eclipse.jetty.servlet.ErrorPageErrorHandler;
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.servlet.ServletHandler;
+import org.eclipse.jetty.util.AttributesMap;
 import org.eclipse.jetty.util.Loader;
 import org.eclipse.jetty.util.MultiException;
 import org.eclipse.jetty.util.URIUtil;
 import org.eclipse.jetty.util.annotation.ManagedAttribute;
 import org.eclipse.jetty.util.annotation.ManagedObject;
+import org.eclipse.jetty.util.component.DumpableCollection;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.resource.Resource;
 import org.eclipse.jetty.util.resource.ResourceCollection;
 
-/* ------------------------------------------------------------ */
-/** Web Application Context Handler.
+/** 
+ * Web Application Context Handler.
+ * <p>
  * The WebAppContext handler is an extension of ContextHandler that
  * coordinates the construction and configuration of nested handlers:
  * {@link org.eclipse.jetty.security.ConstraintSecurityHandler}, {@link org.eclipse.jetty.server.session.SessionHandler}
@@ -76,8 +81,6 @@
  * the default being  {@link org.eclipse.jetty.webapp.WebXmlConfiguration} and
  * {@link org.eclipse.jetty.webapp.JettyWebXmlConfiguration}.
  *
- * @org.apache.xbean.XBean description="Creates a servlet web application at a given context from a resource base"
- *
  */
 @ManagedObject("Web Application ContextHandler")
 public class WebAppContext extends ServletContextHandler implements WebAppClassLoader.Context
@@ -105,6 +108,8 @@
     // System classes are classes that cannot be replaced by
     // the web application, and they are *always* loaded via
     // system classloader.
+    // TODO This centrally managed list of features that are exposed/hidden needs to be replaced
+    // with a more automatic distributed mechanism
     public final static String[] __dftSystemClasses =
     {
         "java.",                            // Java SE classes (per servlet spec v2.5 / SRV.9.7.2)
@@ -118,16 +123,17 @@
         "org.eclipse.jetty.jaas.",          // webapp cannot change jaas classes
         "org.eclipse.jetty.websocket.",     // webapp cannot change / replace websocket classes
         "org.eclipse.jetty.util.log.",      // webapp should use server log
-        "org.eclipse.jetty.servlet.ServletContextHandler.Decorator", // for CDI / weld use
         "org.eclipse.jetty.servlet.DefaultServlet", // webapp cannot change default servlets
         "org.eclipse.jetty.jsp.JettyJspServlet", //webapp cannot change jetty jsp servlet
-        "org.eclipse.jetty.servlets.AsyncGzipFilter" // special case for AsyncGzipFilter
+        "org.eclipse.jetty.servlets.PushCacheFilter" //must be loaded by container classpath
     } ;
 
     // Server classes are classes that are hidden from being
     // loaded by the web application using system classloader,
     // so if web application needs to load any of such classes,
     // it has to include them in its distribution.
+    // TODO This centrally managed list of features that are exposed/hidden needs to be replaced
+    // with a more automatic distributed mechanism
     public final static String[] __dftServerClasses =
     {
         "-org.eclipse.jetty.jmx.",          // don't hide jmx classes
@@ -142,7 +148,7 @@
         "-org.eclipse.jetty.websocket.",    // don't hide websocket classes from webapps (allow webapp to use ones from system classloader)
         "-org.eclipse.jetty.apache.",       // don't hide jetty apache impls
         "-org.eclipse.jetty.util.log.",     // don't hide server log 
-        "-org.eclipse.jetty.servlet.ServletContextHandler.Decorator", // don't hide CDI / weld interface  
+        "-org.eclipse.jetty.alpn.",         // don't hide ALPN
         "org.objectweb.asm.",               // hide asm used by jetty
         "org.eclipse.jdt.",                 // hide jdt used by jetty
         "org.eclipse.jetty."                // hide other jetty classes
@@ -242,11 +248,14 @@
     /* ------------------------------------------------------------ */
     /**
      * This constructor is used in the geronimo integration.
-     *
+     * 
+     * @param parent the parent handler 
+     * @param contextPath the context path
      * @param sessionHandler SessionHandler for this web app
      * @param securityHandler SecurityHandler for this web app
      * @param servletHandler ServletHandler for this web app
      * @param errorHandler ErrorHandler for this web app
+     * @param options the options ({@link ServletContextHandler#SESSIONS} and/or {@link ServletContextHandler#SECURITY}) 
      */
     public WebAppContext(HandlerContainer parent, String contextPath, SessionHandler sessionHandler, SecurityHandler securityHandler, ServletHandler servletHandler, ErrorHandler errorHandler,int options) 
     {
@@ -280,12 +289,13 @@
 
 
     /* ------------------------------------------------------------ */
-    /** Set Resource Alias.
+    /** 
+     * Set Resource Alias.
      * Resource aliases map resource uri's within a context.
      * They may optionally be used by a handler when looking for
      * a resource.
-     * @param alias
-     * @param uri
+     * @param alias the alias for a resource
+     * @param uri the uri for the resource
      */
     public void setResourceAlias(String alias, String uri)
     {
@@ -345,13 +355,12 @@
     {
         super.setClassLoader(classLoader);
 
-//        if ( !(classLoader instanceof WebAppClassLoader) )
-//        {
-//            LOG.info("NOTE: detected a classloader which is not an instance of WebAppClassLoader being set on WebAppContext, some typical class and resource locations may be missing on: " + toString() );
-//        }
-
+        String name = getDisplayName();
+        if (name==null) 
+            name=getContextPath();
+        
         if (classLoader!=null && classLoader instanceof WebAppClassLoader && getDisplayName()!=null)
-            ((WebAppClassLoader)classLoader).setName(getDisplayName());
+            ((WebAppClassLoader)classLoader).setName(name);
     }
 
     /* ------------------------------------------------------------ */
@@ -415,11 +424,13 @@
     }
 
     /* ------------------------------------------------------------ */
-    /** Pre configure the web application.
+    /** 
+     * Pre configure the web application.
      * <p>
      * The method is normally called from {@link #start()}. It performs
      * the discovery of the configurations to be applied to this context,
-     * specifically:<ul>
+     * specifically:
+     * <ul>
      * <li>Instantiate the {@link Configuration} instances with a call to {@link #loadConfigurations()}.
      * <li>Setup the default System classes by calling {@link #loadSystemClasses()}
      * <li>Setup the default Server classes by calling <code>loadServerClasses()</code>
@@ -427,7 +438,7 @@
      * <li>Calls the {@link Configuration#preConfigure(WebAppContext)} method of all
      * Configuration instances.
      * </ul>
-     * @throws Exception
+     * @throws Exception if unable to pre configure
      */
     public void preConfigure() throws Exception
     {
@@ -527,25 +538,6 @@
     protected void doStop() throws Exception
     {
         super.doStop();
-
-        try
-        {
-            for (int i=_configurations.size();i-->0;)
-                _configurations.get(i).deconfigure(this);
-
-            if (_metadata != null)
-                _metadata.clear();
-            _metadata=new MetaData();
-
-        }
-        finally
-        {
-            if (_ownClassLoader)
-                setClassLoader(null);
-
-            setAvailable(true);
-            _unavailableException=null;
-        }
     }
 
     /* ------------------------------------------------------------ */
@@ -683,7 +675,7 @@
         if (_serverClasses == null)
             loadServerClasses();
 
-        _serverClasses.addPattern(classOrPackage);
+        _serverClasses.add(classOrPackage);
     }
 
     /* ------------------------------------------------------------ */
@@ -733,7 +725,7 @@
         if (_systemClasses == null)
             loadSystemClasses();
 
-        _systemClasses.addPattern(classOrPackage);
+        _systemClasses.add(classOrPackage);
     }
 
 
@@ -947,7 +939,22 @@
         }
         return super.toString();
     }
-
+    
+    /* ------------------------------------------------------------ */
+    @Override
+    public void dump(Appendable out, String indent) throws IOException
+    {
+        dumpBeans(out,indent,
+            Collections.singletonList(new ClassLoaderDump(getClassLoader())),
+            Collections.singletonList(new DumpableCollection("Systemclasses "+this,_systemClasses)),
+            Collections.singletonList(new DumpableCollection("Serverclasses "+this,_serverClasses)),
+            Collections.singletonList(new DumpableCollection("Configurations "+this,_configurations)),
+            Collections.singletonList(new DumpableCollection("Handler attributes "+this,((AttributesMap)getAttributes()).getAttributeEntrySet())),
+            Collections.singletonList(new DumpableCollection("Context attributes "+this,((Context)getServletContext()).getAttributeEntrySet())),
+            Collections.singletonList(new DumpableCollection("Initparams "+this,getInitParams().entrySet()))
+            );
+    }
+    
     /* ------------------------------------------------------------ */
     /**
      * @param configurations The configuration class names.  If setConfigurations is not called
@@ -1064,7 +1071,7 @@
     /* ------------------------------------------------------------ */
     /** Add EventListener
      * Convenience method that calls {@link #setEventListeners(EventListener[])}
-     * @param listener
+     * @param listener the listener to add
      */
     @Override
     public void addEventListener(EventListener listener)
@@ -1152,9 +1159,10 @@
      *
      * In certain circumstances you want may want to deny access of one webapp from another
      * when you may not fully trust the webapp.  Setting this white list will enable a
-     * check when a servlet called getContext(String), validating that the uriInPath
+     * check when a servlet called {@link org.eclipse.jetty.servlet.ServletContextHandler.Context#getContext(String)}, validating that the uriInPath
      * for the given webapp has been declaratively allows access to the context.
-     * @param contextWhiteList
+     * 
+     * @param contextWhiteList the whitelist of contexts for {@link org.eclipse.jetty.servlet.ServletContextHandler.Context#getContext(String)} 
      */
     public void setContextWhiteList(String[] contextWhiteList)
     {
@@ -1168,12 +1176,7 @@
      * Server classes/packages are classes used to implement the server and are hidden
      * from the context.  If the context needs to load these classes, it must have its
      * own copy of them in WEB-INF/lib or WEB-INF/classes.
-     * A class pattern is a string of one of the forms:<dl>
-     * <dt>org.package.Classname</dt><dd>Match a specific class</dd>
-     * <dt>org.package.</dt><dd>Match a specific package hierarchy</dd>
-     * <dt>-org.package.Classname</dt><dd>Exclude a specific class</dd>
-     * <dt>-org.package.</dt><dd>Exclude a specific package hierarchy</dd>
-     * </dl>
+     * A {@link ClasspathPattern} is used to match the server classes.
      * @param serverClasses The serverClasses to set.
      */
     public void setServerClasses(String[] serverClasses)
@@ -1188,12 +1191,7 @@
      * System classes/packages are classes provided by the JVM and that
      * cannot be replaced by classes of the same name from WEB-INF,
      * regardless of the value of {@link #setParentLoaderPriority(boolean)}.
-     * A class pattern is a string of one of the forms:<dl>
-     * <dt>org.package.Classname</dt><dd>Match a specific class</dd>
-     * <dt>org.package.</dt><dd>Match a specific package hierarchy</dd>
-     * <dt>-org.package.Classname</dt><dd>Exclude a specific class</dd>
-     * <dt>-org.package.</dt><dd>Exclude a specific package hierarchy</dd>
-     * </dl>
+     * A {@link ClasspathPattern} is used to match the system classes.
      * @param systemClasses The systemClasses to set.
      */
     public void setSystemClasses(String[] systemClasses)
@@ -1234,7 +1232,7 @@
      * webapp will be kept when the webapp stops. Otherwise,
      * it will be deleted.
      * 
-     * @param delete
+     * @param persist true to persist the temp directory on shutdown / exit of the webapp
      */
     public void setPersistTempDirectory(boolean persist)
     {
@@ -1242,7 +1240,7 @@
     }
     
     /**
-     * @return
+     * @return true if tmp directory will persist between startups of the webapp
      */
     public boolean isPersistTempDirectory()
     {
@@ -1341,6 +1339,37 @@
 
         startWebapp();
     }
+    
+    
+    /* ------------------------------------------------------------ */
+    @Override
+    protected void stopContext() throws Exception
+    {
+        stopWebapp();
+        try
+        {
+            for (int i=_configurations.size();i-->0;)
+                _configurations.get(i).deconfigure(this);
+
+            if (_metadata != null)
+                _metadata.clear();
+            _metadata=new MetaData();
+
+        }
+        finally
+        {
+            if (_ownClassLoader)
+            {
+                ClassLoader loader = getClassLoader();
+                if (loader != null && loader instanceof URLClassLoader)
+                    ((URLClassLoader)loader).close(); 
+                setClassLoader(null);
+            }
+
+            setAvailable(true);
+            _unavailableException=null;
+        }
+    }
 
     /* ------------------------------------------------------------ */
     protected void startWebapp()
@@ -1349,6 +1378,11 @@
         super.startContext();
     }
     
+    /* ------------------------------------------------------------ */
+    protected void stopWebapp() throws Exception
+    {
+        super.stopContext();
+    }
     /* ------------------------------------------------------------ */    
     @Override
     public Set<String> setServletSecurity(Dynamic registration, ServletSecurityElement servletSecurityElement)
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebInfConfiguration.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebInfConfiguration.java
index 74056ba..095d109 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebInfConfiguration.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebInfConfiguration.java
@@ -192,15 +192,17 @@
         //if we're not persisting the temp dir contents delete it
         if (!context.isPersistTempDirectory())
         {
-            IO.delete(context.getTempDirectory());
+           IO.delete(context.getTempDirectory());
         }
         
         //if it wasn't explicitly configured by the user, then unset it
-        Boolean tmpdirConfigured = (Boolean)context.getAttribute(TEMPDIR_CONFIGURED);
+       Boolean tmpdirConfigured = (Boolean)context.getAttribute(TEMPDIR_CONFIGURED);
         if (tmpdirConfigured != null && !tmpdirConfigured) 
             context.setTempDirectory(null);
 
         //reset the base resource back to what it was before we did any unpacking of resources
+        if (context.getBaseResource() != null)
+            context.getBaseResource().close();
         context.setBaseResource(_preUnpackBaseResource);
     }
 
@@ -227,8 +229,8 @@
      * Get a temporary directory in which to unpack the war etc etc.
      * The algorithm for determining this is to check these alternatives
      * in the order shown:
-     *
-     * <p>A. Try to use an explicit directory specifically for this webapp:</p>
+     * <p>
+     * A. Try to use an explicit directory specifically for this webapp:
      * <ol>
      * <li>
      * Iff an explicit directory is set for this webapp, use it. Set delete on
@@ -236,19 +238,21 @@
      * </li>
      * <li>
      * Iff javax.servlet.context.tempdir context attribute is set for
-     * this webapp && exists && writeable, then use it. Set delete on exit depends on
+     * this webapp &amp;&amp; exists &amp;&amp; writeable, then use it. Set delete on exit depends on
      * value of persistTempDirectory.
      * </li>
      * </ol>
      *
-     * <p>B. Create a directory based on global settings. The new directory
-     * will be called "Jetty-"+host+"-"+port+"__"+context+"-"+virtualhost+"-"+randomdigits+".dir"
-     * </p>
+     * <p>
+     * B. Create a directory based on global settings. The new directory
+     * will be called <code>"Jetty-"+host+"-"+port+"__"+context+"-"+virtualhost+"-"+randomdigits+".dir"</code>
      * <p>
      * If the user has specified the context attribute org.eclipse.jetty.webapp.basetempdir, the
      * directory specified by this attribute will be the parent of the temp dir created. Otherwise,
-     * the parent dir is $(java.io.tmpdir). Set delete on exit depends on value of persistTempDirectory. 
-     * </p>
+     * the parent dir is <code>${java.io.tmpdir}</code>. Set delete on exit depends on value of persistTempDirectory.
+     *  
+     * @param context the context to resolve the temp directory from
+     * @throws Exception if unable to resolve the temp directory
      */
     public void resolveTempDirectory (WebAppContext context)
     throws Exception
@@ -402,7 +406,7 @@
                 throw new IllegalStateException("No resourceBase or war set for context");
 
             // Accept aliases for WAR files
-            if (web_app.getAlias() != null)
+            if (web_app.isAlias())
             {
                 LOG.debug(web_app + " anti-aliased to " + web_app.getAlias());
                 web_app = context.newResource(web_app.getAlias());
@@ -546,18 +550,18 @@
         }
     }
 
-
-
-
     /**
      * Create a canonical name for a webapp temp directory.
+     * <p>
      * The form of the name is:
-     *  <code>"jetty-"+host+"-"+port+"-"+resourceBase+"-_"+context+"-"+virtualhost+"-"+randomdigits+".dir"</code>
+     * 
+     * <pre>"jetty-"+host+"-"+port+"-"+resourceBase+"-_"+context+"-"+virtualhost+"-"+randomdigits+".dir"</pre>
      *
      *  host and port uniquely identify the server
      *  context and virtual host uniquely identify the webapp
      *  randomdigits ensure every tmp directory is unique
      *  
+     * @param context the context to get the canonical name from 
      * @return the canonical name for the webapp temp directory
      */
     public static String getCanonicalNameForWebAppTmpDir (WebAppContext context)
@@ -598,7 +602,6 @@
             }
         }
 
-
         //Resource  base
         try
         {
@@ -678,9 +681,9 @@
     /**
      * Look for jars that should be treated as if they are in WEB-INF/lib
      * 
-     * @param context
+     * @param context the context to find the jars in
      * @return the list of jar resources found within context
-     * @throws Exception
+     * @throws Exception if unable to find the jars
      */
     protected List<Resource> findJars (WebAppContext context)
     throws Exception
@@ -696,11 +699,11 @@
     }
     
     /**
-     *  Look for jars in WEB-INF/lib
+     * Look for jars in <code>WEB-INF/lib</code>
      *  
-     * @param context
-     * @return
-     * @throws Exception
+     * @param context the context to find the lib jars in
+     * @return the list of jars as {@link Resource}
+     * @throws Exception if unable to scan for lib jars
      */
     protected List<Resource> findWebInfLibJars(WebAppContext context)
     throws Exception
@@ -741,9 +744,9 @@
     /**
      * Get jars from WebAppContext.getExtraClasspath as resources
      * 
-     * @param context
-     * @return
-     * @throws Exception
+     * @param context the context to find extra classpath jars in
+     * @return the list of Resources with the extra classpath, or null if not found
+     * @throws Exception if unable to find the extra classpath jars
      */
     protected List<Resource>  findExtraClasspathJars(WebAppContext context)
     throws Exception
@@ -769,11 +772,11 @@
     }
     
     /**
-     * Get WEB-INF/classes dir
+     * Get <code>WEB-INF/classes</code> dir
      * 
-     * @param context
-     * @return
-     * @throws Exception
+     * @param context the context to look for the <code>WEB-INF/classes</code> directory
+     * @return the Resource for the <code>WEB-INF/classes</code> directory
+     * @throws Exception if unable to find the <code>WEB-INF/classes</code> directory
      */
     protected Resource findWebInfClassesDir (WebAppContext context)
     throws Exception
@@ -798,9 +801,9 @@
     /**
      * Get class dirs from WebAppContext.getExtraClasspath as resources
      * 
-     * @param context
-     * @return
-     * @throws Exception
+     * @param context the context to look for extra classpaths in
+     * @return the list of Resources to the extra classpath 
+     * @throws Exception if unable to find the extra classpaths
      */
     protected List<Resource>  findExtraClasspathDirs(WebAppContext context)
     throws Exception
diff --git a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/ClasspathPatternTest.java b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/ClasspathPatternTest.java
new file mode 100644
index 0000000..1b41bc9
--- /dev/null
+++ b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/ClasspathPatternTest.java
@@ -0,0 +1,109 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.webapp;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class ClasspathPatternTest
+{
+    private final ClasspathPattern pattern = new ClasspathPattern();
+    
+    @Before
+    public void before()
+    {
+        pattern.clear();
+        pattern.add("org.package.");
+        pattern.add("-org.excluded.");
+        pattern.add("org.example.FooBar");
+        pattern.add("-org.example.Excluded");
+        pattern.addAll(Arrays.asList(new String[]{"-org.example.Nested$Minus","org.example.Nested","org.example.Nested$Something"}));
+    }
+    
+    @Test
+    public void testClassMatch()
+    {
+        assertTrue(pattern.match("org.example.FooBar"));
+        assertTrue(pattern.match("org.example.Nested"));
+        
+        assertFalse(pattern.match("org.example.Unknown"));
+        assertFalse(pattern.match("org.example.FooBar.Unknown"));
+    }
+    
+    @Test
+    public void testPackageMatch()
+    {
+        assertTrue(pattern.match("org.package.Something"));
+        assertTrue(pattern.match("org.package.other.Something"));
+        
+        assertFalse(pattern.match("org.example.Unknown"));
+        assertFalse(pattern.match("org.example.FooBar.Unknown"));
+        assertFalse(pattern.match("org.example.FooBarElse"));
+    }
+
+    @Test
+    public void testExplicitNestedMatch()
+    {
+        assertTrue(pattern.match("org.example.Nested$Something"));
+        
+        assertFalse(pattern.match("org.example.Nested$Minus"));
+    }
+
+    @Test
+    public void testImplicitNestedMatch()
+    {
+        assertTrue(pattern.match("org.example.FooBar$Other"));
+        assertTrue(pattern.match("org.example.Nested$Other"));
+    }
+    
+    @Test
+    public void testAddBefore()
+    {
+        pattern.addBefore("-org.excluded.","org.excluded.ExceptionOne","org.excluded.ExceptionTwo");
+
+        assertTrue(pattern.match("org.excluded.ExceptionOne"));
+        assertTrue(pattern.match("org.excluded.ExceptionTwo"));
+        
+        assertFalse(pattern.match("org.example.Unknown"));
+    }
+    
+    @Test
+    public void testAddAfter()
+    {
+        pattern.addAfter("org.package.","org.excluded.ExceptionOne","org.excluded.ExceptionTwo");
+
+        assertTrue(pattern.match("org.excluded.ExceptionOne"));
+        assertTrue(pattern.match("org.excluded.ExceptionTwo"));
+        
+        assertFalse(pattern.match("org.example.Unknown"));
+    }
+
+    @Test
+    public void testDoubledNested()
+    {
+        assertTrue(pattern.match("org.example.Nested$Something$Else"));
+        
+        assertFalse(pattern.match("org.example.Nested$Minus$Else"));
+    }
+}
diff --git a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/OrderingTest.java b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/OrderingTest.java
index e54a4a2..7aca0ea 100644
--- a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/OrderingTest.java
+++ b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/OrderingTest.java
@@ -18,6 +18,7 @@
 
 package org.eclipse.jetty.webapp;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -37,8 +38,6 @@
 
 /**
  * OrderingTest
- *
- *
  */
 public class OrderingTest
 {
@@ -111,9 +110,6 @@
             return _name;
         }
         
-        /**
-         * @see org.eclipse.jetty.util.resource.Resource#getURL()
-         */
         @Override
         public URL getURL()
         {
@@ -510,6 +506,22 @@
     }
 
     @Test
+    public void testOrderFragments() throws Exception 
+    {
+        final MetaData metadata = new MetaData();
+        final Resource jarResource = new TestResource("A");
+
+        metadata.setOrdering(new Ordering.RelativeOrdering(metadata));
+        metadata.addWebInfJar(jarResource);
+        metadata.orderFragments();
+        assertEquals(1, metadata.getOrderedWebInfJars().size());
+        metadata.orderFragments();
+        assertEquals(1, metadata.getOrderedWebInfJars().size());
+    }
+
+
+
+    @Test
     public void testCircular1 ()
     throws Exception
     {
diff --git a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppClassLoaderTest.java b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppClassLoaderTest.java
index 49011ab..60a6904 100644
--- a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppClassLoaderTest.java
+++ b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppClassLoaderTest.java
@@ -18,33 +18,45 @@
 
 package org.eclipse.jetty.webapp;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static org.eclipse.jetty.toolchain.test.ExtraMatchers.*; 
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
 
 import java.lang.instrument.ClassFileTransformer;
 import java.lang.instrument.IllegalClassFormatException;
+import java.net.URI;
 import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.Path;
 import java.security.ProtectionDomain;
 import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Iterator;
+import java.util.Collections;
 import java.util.List;
 
+import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
+import org.eclipse.jetty.util.resource.PathResource;
 import org.eclipse.jetty.util.resource.Resource;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.ExpectedException;
 
 public class WebAppClassLoaderTest
 {
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    private Path testWebappDir;
     private WebAppContext _context;
     private WebAppClassLoader _loader;
 
     @Before
     public void init() throws Exception
     {
-        Resource webapp = Resource.newResource("./src/test/webapp");
+        this.testWebappDir = MavenTestingUtils.getProjectDirPath("src/test/webapp");
+        Resource webapp = new PathResource(testWebappDir);
+        
+        System.err.printf("testWebappDir = %s%n", testWebappDir);
 
         _context = new WebAppContext();
         _context.setBaseResource(webapp);
@@ -55,16 +67,39 @@
         _loader.addClassPath(webapp.addPath("WEB-INF/classes"));
         _loader.setName("test");
     }
+    
+    public void assertCanLoadClass(String clazz) throws ClassNotFoundException
+    {
+        assertThat("Can Load Class ["+clazz+"]", _loader.loadClass(clazz), notNullValue());
+    }
+    
+    public void assertCanLoadResource(String res) throws ClassNotFoundException
+    {
+        assertThat("Can Load Resource ["+res+"]", _loader.getResource(res), notNullValue());
+    }
+    
+    public void assertCantLoadClass(String clazz)
+    {
+        try
+        {
+            assertThat("Can't Load Class ["+clazz+"]", _loader.loadClass(clazz), nullValue());
+        }
+        catch (ClassNotFoundException e)
+        {
+            // Valid path
+        }
+    }
 
     @Test
     public void testParentLoad() throws Exception
     {
         _context.setParentLoaderPriority(true);
-        assertTrue(canLoadClass("org.acme.webapp.ClassInJarA"));
-        assertTrue(canLoadClass("org.acme.webapp.ClassInJarB"));
-        assertTrue(canLoadClass("org.acme.other.ClassInClassesC"));
+        
+        assertCanLoadClass("org.acme.webapp.ClassInJarA");
+        assertCanLoadClass("org.acme.webapp.ClassInJarB");
+        assertCanLoadClass("org.acme.other.ClassInClassesC");
 
-        assertTrue(cantLoadClass("org.eclipse.jetty.webapp.Configuration"));
+        assertCantLoadClass("org.eclipse.jetty.webapp.Configuration");
 
         Class<?> clazzA = _loader.loadClass("org.acme.webapp.ClassInJarA");
         assertTrue(clazzA.getField("FROM_PARENT")!=null);
@@ -74,22 +109,15 @@
     public void testWebAppLoad() throws Exception
     {
         _context.setParentLoaderPriority(false);
-        assertTrue(canLoadClass("org.acme.webapp.ClassInJarA"));
-        assertTrue(canLoadClass("org.acme.webapp.ClassInJarB"));
-        assertTrue(canLoadClass("org.acme.other.ClassInClassesC"));
+        assertCanLoadClass("org.acme.webapp.ClassInJarA");
+        assertCanLoadClass("org.acme.webapp.ClassInJarB");
+        assertCanLoadClass("org.acme.other.ClassInClassesC");
 
-        assertTrue(cantLoadClass("org.eclipse.jetty.webapp.Configuration"));
+        assertCantLoadClass("org.eclipse.jetty.webapp.Configuration");
 
         Class<?> clazzA = _loader.loadClass("org.acme.webapp.ClassInJarA");
-        try
-        {
-            clazzA.getField("FROM_PARENT");
-            assertTrue(false);
-        }
-        catch(NoSuchFieldException e)
-        {
-            assertTrue(true);
-        }
+        expectedException.expect(NoSuchFieldException.class);
+        clazzA.getField("FROM_PARENT");
     }
     
     @Test
@@ -123,20 +151,20 @@
         });
         
         _context.setParentLoaderPriority(false);
-        assertTrue(canLoadClass("org.acme.webapp.ClassInJarA"));
-        assertTrue(canLoadClass("org.acme.webapp.ClassInJarB"));
-        assertTrue(canLoadClass("org.acme.other.ClassInClassesC"));
-        assertTrue(canLoadClass("java.lang.String"));
-        assertTrue(cantLoadClass("org.eclipse.jetty.webapp.Configuration"));
         
-        Iterator<Object> iter = results.iterator();
-        assertEquals(_loader,iter.next());
-        assertEquals("org.acme.webapp.ClassInJarA",iter.next());
-        assertEquals(_loader,iter.next());
-        assertEquals("org.acme.webapp.ClassInJarB",iter.next());
-        assertEquals(_loader,iter.next());
-        assertEquals("org.acme.other.ClassInClassesC",iter.next());
-        assertFalse(iter.hasNext());
+        assertCanLoadClass("org.acme.webapp.ClassInJarA");
+        assertCanLoadClass("org.acme.webapp.ClassInJarB");
+        assertCanLoadClass("org.acme.other.ClassInClassesC");
+        assertCanLoadClass("java.lang.String");
+        assertCantLoadClass("org.eclipse.jetty.webapp.Configuration");
+        
+        assertThat("Classname Results", results, contains(
+                _loader,
+                "org.acme.webapp.ClassInJarA",
+                _loader,
+                "org.acme.webapp.ClassInJarB",
+                _loader,
+                "org.acme.other.ClassInClassesC"));
     }
     
     @Test
@@ -151,8 +179,7 @@
             }
         });
         
-        
-        assertTrue(canLoadClass("org.acme.webapp.ClassInJarA"));
+        assertCanLoadClass("org.acme.webapp.ClassInJarA");
     }
 
     @Test
@@ -164,12 +191,12 @@
         System.arraycopy(oldSC,0,newSC,1,oldSC.length);
         _context.setServerClasses(newSC);
 
-        assertTrue(canLoadClass("org.acme.webapp.ClassInJarA"));
-        assertTrue(canLoadClass("org.acme.webapp.ClassInJarB"));
-        assertTrue(canLoadClass("org.acme.other.ClassInClassesC"));
+        assertCanLoadClass("org.acme.webapp.ClassInJarA");
+        assertCanLoadClass("org.acme.webapp.ClassInJarB");
+        assertCanLoadClass("org.acme.other.ClassInClassesC");
 
-        assertTrue(canLoadClass("org.eclipse.jetty.webapp.Configuration"));
-        assertTrue(cantLoadClass("org.eclipse.jetty.webapp.JarScanner"));
+        assertCanLoadClass("org.eclipse.jetty.webapp.Configuration");
+        assertCantLoadClass("org.eclipse.jetty.webapp.JarScanner");
     }
 
     @Test
@@ -187,11 +214,11 @@
         System.arraycopy(oldSysC,0,newSysC,1,oldSysC.length);
         _context.setSystemClasses(newSysC);
 
-        assertTrue(canLoadClass("org.acme.webapp.ClassInJarA"));
-        assertTrue(canLoadClass("org.acme.webapp.ClassInJarB"));
-        assertTrue(canLoadClass("org.acme.other.ClassInClassesC"));
-        assertTrue(cantLoadClass("org.eclipse.jetty.webapp.Configuration"));
-        assertTrue(cantLoadClass("org.eclipse.jetty.webapp.JarScanner"));
+        assertCanLoadClass("org.acme.webapp.ClassInJarA");
+        assertCanLoadClass("org.acme.webapp.ClassInJarB");
+        assertCanLoadClass("org.acme.other.ClassInClassesC");
+        assertCantLoadClass("org.eclipse.jetty.webapp.Configuration");
+        assertCantLoadClass("org.eclipse.jetty.webapp.JarScanner");
 
         oldSysC=_context.getSystemClasses();
         newSysC=new String[oldSysC.length+1];
@@ -199,7 +226,7 @@
         System.arraycopy(oldSysC,0,newSysC,1,oldSysC.length);
         _context.setSystemClasses(newSysC);
 
-        assertNotNull(_loader.getResource("org/acme/webapp/ClassInJarA.class"));
+        assertCanLoadResource("org/acme/webapp/ClassInJarA.class");
         _context.setSystemClasses(oldSysC);
 
         oldServC=_context.getServerClasses();
@@ -207,27 +234,54 @@
         newServC[0]="org.acme.webapp.ClassInJarA";
         System.arraycopy(oldServC,0,newServC,1,oldServC.length);
         _context.setServerClasses(newServC);
-        assertNotNull(_loader.getResource("org/acme/webapp/ClassInJarA.class"));
+        assertCanLoadResource("org/acme/webapp/ClassInJarA.class");
     }
 
     @Test
     public void testResources() throws Exception
     {
+        List<URL> expected = new ArrayList<>();
         List<URL> resources;
+        
+        // Expected Locations
+        URL webappWebInfLibAcme = new URI("jar:" + testWebappDir.resolve("WEB-INF/lib/acme.jar").toUri().toASCIIString() + "!/org/acme/resource.txt").toURL();
+        URL webappWebInfClasses = testWebappDir.resolve("WEB-INF/classes/org/acme/resource.txt").toUri().toURL();
+        // (from parent classloader)
+        URL targetTestClasses = this.getClass().getClassLoader().getResource("org/acme/resource.txt");
 
         _context.setParentLoaderPriority(false);
-        resources =toList( _loader.getResources("org/acme/resource.txt"));
-        assertEquals(3,resources.size());
-        assertEquals(0,resources.get(0).toString().indexOf("jar:file:"));
-        assertEquals(-1,resources.get(1).toString().indexOf("test-classes"));
-        assertEquals(0,resources.get(2).toString().indexOf("file:"));
+        dump(_context);
+        resources =Collections.list(_loader.getResources("org/acme/resource.txt"));
+        
+        expected.clear();
+        expected.add(webappWebInfLibAcme);
+        expected.add(webappWebInfClasses);
+        expected.add(targetTestClasses);
+        
+        assertThat("Resources Found (Parent Loader Priority == false)",resources,ordered(expected));
+        
+//        dump(resources);
+//        assertEquals(3,resources.size());
+//        assertEquals(0,resources.get(0).toString().indexOf("jar:file:"));
+//        assertEquals(-1,resources.get(1).toString().indexOf("test-classes"));
+//        assertEquals(0,resources.get(2).toString().indexOf("file:"));
 
         _context.setParentLoaderPriority(true);
-        resources =toList( _loader.getResources("org/acme/resource.txt"));
-        assertEquals(3,resources.size());
-        assertEquals(0,resources.get(0).toString().indexOf("file:"));
-        assertEquals(0,resources.get(1).toString().indexOf("jar:file:"));
-        assertEquals(-1,resources.get(2).toString().indexOf("test-classes"));
+        // dump(_context);
+        resources =Collections.list(_loader.getResources("org/acme/resource.txt"));
+        
+        expected.clear();
+        expected.add(targetTestClasses);
+        expected.add(webappWebInfLibAcme);
+        expected.add(webappWebInfClasses);
+        
+        assertThat("Resources Found (Parent Loader Priority == true)",resources,ordered(expected));
+        
+//        dump(resources);
+//        assertEquals(3,resources.size());
+//        assertEquals(0,resources.get(0).toString().indexOf("file:"));
+//        assertEquals(0,resources.get(1).toString().indexOf("jar:file:"));
+//        assertEquals(-1,resources.get(2).toString().indexOf("test-classes"));
 
         String[] oldServC=_context.getServerClasses();
         String[] newServC=new String[oldServC.length+1];
@@ -236,10 +290,19 @@
         _context.setServerClasses(newServC);
 
         _context.setParentLoaderPriority(true);
-        resources =toList( _loader.getResources("org/acme/resource.txt"));
-        assertEquals(2,resources.size());
-        assertEquals(0,resources.get(0).toString().indexOf("jar:file:"));
-        assertEquals(0,resources.get(1).toString().indexOf("file:"));
+        // dump(_context);
+        resources =Collections.list(_loader.getResources("org/acme/resource.txt"));
+        
+        expected.clear();
+        expected.add(webappWebInfLibAcme);
+        expected.add(webappWebInfClasses);
+        
+        assertThat("Resources Found (Parent Loader Priority == true) (with serverClasses filtering)",resources,ordered(expected));
+        
+//        dump(resources);
+//        assertEquals(2,resources.size());
+//        assertEquals(0,resources.get(0).toString().indexOf("jar:file:"));
+//        assertEquals(0,resources.get(1).toString().indexOf("file:"));
 
         _context.setServerClasses(oldServC);
         String[] oldSysC=_context.getSystemClasses();
@@ -249,33 +312,57 @@
         _context.setSystemClasses(newSysC);
 
         _context.setParentLoaderPriority(true);
-        resources =toList( _loader.getResources("org/acme/resource.txt"));
-        assertEquals(1,resources.size());
-        assertEquals(0,resources.get(0).toString().indexOf("file:"));
+        // dump(_context);
+        resources =Collections.list(_loader.getResources("org/acme/resource.txt"));
+        
+        expected.clear();
+        expected.add(targetTestClasses);
+        
+        assertThat("Resources Found (Parent Loader Priority == true) (with systemClasses filtering)",resources,ordered(expected));
+        
+//        dump(resources);
+//        assertEquals(1,resources.size());
+//        assertEquals(0,resources.get(0).toString().indexOf("file:"));
     }
 
-    private List<URL> toList(Enumeration<URL> e)
+    private void dump(WebAppContext wac)
     {
-        List<URL> list = new ArrayList<URL>();
-        while (e!=null && e.hasMoreElements())
-            list.add(e.nextElement());
-        return list;
+        System.err.println("--Dump WebAppContext - " + wac);
+        System.err.printf("  context.getClass().getClassLoader() = %s%n",wac.getClass().getClassLoader());
+        dumpClassLoaderHierarchy("  ",wac.getClass().getClassLoader());
+        System.err.printf("  context.getClassLoader() = %s%n",wac.getClassLoader());
+        dumpClassLoaderHierarchy("  ",wac.getClassLoader());
     }
 
-    private boolean canLoadClass(String clazz) throws ClassNotFoundException
+    private void dumpClassLoaderHierarchy(String indent, ClassLoader classLoader)
     {
-        return _loader.loadClass(clazz)!=null;
-    }
-
-    private boolean cantLoadClass(String clazz)
-    {
-        try
+        if (classLoader != null)
         {
-            return _loader.loadClass(clazz)==null;
+            if(classLoader instanceof URLClassLoader)
+            {
+                URLClassLoader urlCL = (URLClassLoader)classLoader;
+                URL urls[] = urlCL.getURLs();
+                for (URL url : urls)
+                {
+                    System.err.printf("%s url[] = %s%n",indent,url);
+                }
+            }
+            
+            ClassLoader parent = classLoader.getParent();
+            if (parent != null)
+            {
+                System.err.printf("%s .parent = %s%n",indent,parent);
+                dumpClassLoaderHierarchy(indent + "  ",parent);
+            }
         }
-        catch(ClassNotFoundException e)
+    }
+
+    private void dump(List<URL> resources)
+    {
+        System.err.println("--Dump--");
+        for(URL url: resources)
         {
-            return true;
+            System.err.printf(" \"%s\"%n",url);
         }
     }
 }
diff --git a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextTest.java b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextTest.java
index d19fae9..ce5b104 100644
--- a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextTest.java
+++ b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextTest.java
@@ -18,6 +18,7 @@
 
 package org.eclipse.jetty.webapp;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
@@ -32,8 +33,6 @@
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 
-import junit.framework.Assert;
-
 import org.eclipse.jetty.server.LocalConnector;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
@@ -41,6 +40,7 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.resource.Resource;
 import org.eclipse.jetty.util.resource.ResourceCollection;
+import org.junit.Assert;
 import org.junit.Test;
 
 public class WebAppContextTest
@@ -51,7 +51,7 @@
         Server server = new Server();
         //test if no classnames set, its the defaults
         WebAppContext wac = new WebAppContext();
-        Assert.assertEquals(0,wac.getConfigurations().length);
+        assertEquals(0,wac.getConfigurations().length);
         String[] classNames = wac.getConfigurationClasses();
         assertNotNull(classNames);
 
@@ -123,7 +123,7 @@
     /**
      * tests that the servlet context white list works
      *
-     * @throws Exception
+     * @throws Exception on test failure
      */
     @Test
     public void testContextWhiteList() throws Exception
diff --git a/jetty-webapp/src/test/resources/jetty-logging.properties b/jetty-webapp/src/test/resources/jetty-logging.properties
new file mode 100644
index 0000000..4c4c7f8
--- /dev/null
+++ b/jetty-webapp/src/test/resources/jetty-logging.properties
@@ -0,0 +1,6 @@
+# Setup default logging implementation for during testing
+org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
+org.eclipse.jetty.LEVEL=INFO
+# org.eclipse.jetty.webapp.WebAppClassLoader.LEVEL=DEBUG
+# org.eclipse.jetty.util.LEVEL=DEBUG
+# org.eclipse.jetty.util.PathWatcher.Noisy.LEVEL=OFF
diff --git a/jetty-websocket/javax-websocket-client-impl/pom.xml b/jetty-websocket/javax-websocket-client-impl/pom.xml
index 688db73..98288ef 100644
--- a/jetty-websocket/javax-websocket-client-impl/pom.xml
+++ b/jetty-websocket/javax-websocket-client-impl/pom.xml
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.eclipse.jetty.websocket</groupId>
     <artifactId>websocket-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
 
   <modelVersion>4.0.0</modelVersion>
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/AbstractJsrRemote.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/AbstractJsrRemote.java
index aed0f25..00a77bc 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/AbstractJsrRemote.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/AbstractJsrRemote.java
@@ -21,6 +21,7 @@
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.concurrent.Future;
+
 import javax.websocket.EncodeException;
 import javax.websocket.Encoder;
 import javax.websocket.RemoteEndpoint;
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/ClientContainer.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/ClientContainer.java
index b6366c3..d693d1d 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/ClientContainer.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/ClientContainer.java
@@ -30,6 +30,7 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Future;
+
 import javax.websocket.ClientEndpoint;
 import javax.websocket.ClientEndpointConfig;
 import javax.websocket.DeploymentException;
@@ -39,18 +40,24 @@
 import javax.websocket.Session;
 import javax.websocket.WebSocketContainer;
 
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.util.DecoratedObjectFactory;
 import org.eclipse.jetty.util.component.ContainerLifeCycle;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
 import org.eclipse.jetty.util.thread.ShutdownThread;
 import org.eclipse.jetty.websocket.api.InvalidWebSocketException;
+import org.eclipse.jetty.websocket.api.WebSocketPolicy;
 import org.eclipse.jetty.websocket.api.extensions.ExtensionFactory;
 import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
 import org.eclipse.jetty.websocket.client.WebSocketClient;
 import org.eclipse.jetty.websocket.client.io.UpgradeListener;
+import org.eclipse.jetty.websocket.common.SessionFactory;
 import org.eclipse.jetty.websocket.common.SessionListener;
 import org.eclipse.jetty.websocket.common.WebSocketSession;
+import org.eclipse.jetty.websocket.common.scopes.SimpleContainerScope;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 import org.eclipse.jetty.websocket.jsr356.annotations.AnnotatedEndpointScanner;
 import org.eclipse.jetty.websocket.jsr356.client.AnnotatedClientEndpointMetadata;
 import org.eclipse.jetty.websocket.jsr356.client.EmptyClientEndpointConfig;
@@ -66,10 +73,12 @@
  * <p>
  * This should be specific to a JVM if run in a standalone mode. or specific to a WebAppContext if running on the Jetty server.
  */
-public class ClientContainer extends ContainerLifeCycle implements WebSocketContainer, SessionListener
+public class ClientContainer extends ContainerLifeCycle implements WebSocketContainer, WebSocketContainerScope, SessionListener
 {
     private static final Logger LOG = Log.getLogger(ClientContainer.class);
     
+    /** The delegated Container Scope */
+    private final WebSocketContainerScope scopeDelegate;
     /** Tracking all primitive decoders for the container */
     private final DecoderFactory decoderFactory;
     /** Tracking all primitive encoders for the container */
@@ -85,30 +94,28 @@
     public ClientContainer()
     {
         // This constructor is used with Standalone JSR Client usage.
-        this(null);
+        this(new SimpleContainerScope(WebSocketPolicy.newClientPolicy()));
         client.setDaemon(true);
     }
     
-    public ClientContainer(Executor executor)
+    public ClientContainer(WebSocketContainerScope scope)
     {
-        endpointClientMetadataCache = new ConcurrentHashMap<>();
-        decoderFactory = new DecoderFactory(PrimitiveDecoderMetadataSet.INSTANCE);
-        encoderFactory = new EncoderFactory(PrimitiveEncoderMetadataSet.INSTANCE);
-
-        EmptyClientEndpointConfig empty = new EmptyClientEndpointConfig();
-        decoderFactory.init(empty);
-        encoderFactory.init(empty);
-
         boolean trustAll = Boolean.getBoolean("org.eclipse.jetty.websocket.jsr356.ssl-trust-all");
         
-        client = new WebSocketClient(new SslContextFactory(trustAll), executor);
+        this.scopeDelegate = scope;
+        client = new WebSocketClient(scope, new SslContextFactory(trustAll));
         client.setEventDriverFactory(new JsrEventDriverFactory(client.getPolicy()));
-        client.setSessionFactory(new JsrSessionFactory(this,this,client));
+        SessionFactory sessionFactory = new JsrSessionFactory(this,this,client);
+        client.setSessionFactory(sessionFactory);
         addBean(client);
 
+        this.endpointClientMetadataCache = new ConcurrentHashMap<>();
+        this.decoderFactory = new DecoderFactory(this,PrimitiveDecoderMetadataSet.INSTANCE);
+        this.encoderFactory = new EncoderFactory(this,PrimitiveEncoderMetadataSet.INSTANCE);
+
         ShutdownThread.register(this);
     }
-
+    
     private Session connect(EndpointInstance instance, URI path) throws IOException
     {
         Objects.requireNonNull(instance,"EndpointInstance cannot be null");
@@ -186,7 +193,18 @@
         EndpointInstance instance = newClientEndpointInstance(endpoint,null);
         return connect(instance,path);
     }
-
+    
+    @Override
+    protected void doStart() throws Exception
+    {
+        super.doStart();
+        
+        // Initialize the default decoder / encoder factories
+        EmptyClientEndpointConfig empty = new EmptyClientEndpointConfig();
+        this.decoderFactory.init(empty);
+        this.encoderFactory.init(empty);
+    }
+    
     @Override
     protected void doStop() throws Exception
     {
@@ -195,6 +213,12 @@
         super.doStop();
     }
 
+    @Override
+    public ByteBufferPool getBufferPool()
+    {
+        return scopeDelegate.getBufferPool();
+    }
+
     public WebSocketClient getClient()
     {
         return client;
@@ -279,6 +303,12 @@
     }
 
     @Override
+    public Executor getExecutor()
+    {
+        return scopeDelegate.getExecutor();
+    }
+
+    @Override
     public Set<Extension> getInstalledExtensions()
     {
         Set<Extension> ret = new HashSet<>();
@@ -292,14 +322,33 @@
         return ret;
     }
 
+    @Override
+    public DecoratedObjectFactory getObjectFactory()
+    {
+        return scopeDelegate.getObjectFactory();
+    }
+
     /**
      * Used in {@link Session#getOpenSessions()}
+     * @return the set of open sessions
      */
     public Set<Session> getOpenSessions()
     {
         return Collections.unmodifiableSet(this.openSessions);
     }
 
+    @Override
+    public WebSocketPolicy getPolicy()
+    {
+        return scopeDelegate.getPolicy();
+    }
+    
+    @Override
+    public SslContextFactory getSslContextFactory()
+    {
+        return scopeDelegate.getSslContextFactory();
+    }
+
     private EndpointInstance newClientEndpointInstance(Class<?> endpointClass, ClientEndpointConfig config)
     {
         try
@@ -357,7 +406,7 @@
                     Session.class.getName());
         }
     }
-
+    
     @Override
     public void setAsyncSendTimeout(long ms)
     {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/DecoderFactory.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/DecoderFactory.java
index 4554b14..71a3af7 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/DecoderFactory.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/DecoderFactory.java
@@ -19,12 +19,16 @@
 package org.eclipse.jetty.websocket.jsr356;
 
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
+
 import javax.websocket.Decoder;
 import javax.websocket.EndpointConfig;
 
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketSessionScope;
 import org.eclipse.jetty.websocket.jsr356.metadata.DecoderMetadata;
 import org.eclipse.jetty.websocket.jsr356.metadata.DecoderMetadataSet;
 
@@ -71,18 +75,26 @@
     private static final Logger LOG = Log.getLogger(DecoderFactory.class);
 
     private final DecoderMetadataSet metadatas;
+    private final WebSocketContainerScope containerScope;
     private DecoderFactory parentFactory;
     private Map<Class<?>, Wrapper> activeWrappers;
 
-    public DecoderFactory(DecoderMetadataSet metadatas)
+    public DecoderFactory(WebSocketContainerScope containerScope, DecoderMetadataSet metadatas)
     {
-        this.metadatas = metadatas;
-        this.activeWrappers = new ConcurrentHashMap<>();
+        this(containerScope,metadatas,null);
+    }
+    
+    public DecoderFactory(WebSocketSessionScope sessionScope, DecoderMetadataSet metadatas, DecoderFactory parentFactory)
+    {
+        this(sessionScope.getContainerScope(),metadatas,parentFactory);
     }
 
-    public DecoderFactory(DecoderMetadataSet metadatas, DecoderFactory parentFactory)
+    protected DecoderFactory(WebSocketContainerScope containerScope, DecoderMetadataSet metadatas, DecoderFactory parentFactory)
     {
-        this(metadatas);
+        Objects.requireNonNull(containerScope,"Container Scope cannot be null");
+        this.containerScope = containerScope;
+        this.metadatas = metadatas;
+        this.activeWrappers = new ConcurrentHashMap<>();
         this.parentFactory = parentFactory;
     }
 
@@ -102,6 +114,7 @@
         {
             LOG.debug("getMetadataFor({})",type);
         }
+        
         DecoderMetadata metadata = metadatas.getMetadataByType(type);
 
         if (metadata != null)
@@ -172,7 +185,7 @@
         Class<? extends Decoder> decoderClass = metadata.getCoderClass();
         try
         {
-            Decoder decoder = decoderClass.newInstance();
+            Decoder decoder = containerScope.getObjectFactory().createInstance(decoderClass);
             return new Wrapper(decoder,metadata);
         }
         catch (InstantiationException | IllegalAccessException e)
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/EncoderFactory.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/EncoderFactory.java
index 29fedec..d5165d4 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/EncoderFactory.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/EncoderFactory.java
@@ -19,12 +19,16 @@
 package org.eclipse.jetty.websocket.jsr356;
 
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
+
 import javax.websocket.Encoder;
 import javax.websocket.EndpointConfig;
 
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketSessionScope;
 import org.eclipse.jetty.websocket.jsr356.metadata.EncoderMetadata;
 import org.eclipse.jetty.websocket.jsr356.metadata.EncoderMetadataSet;
 
@@ -64,18 +68,26 @@
     private static final Logger LOG = Log.getLogger(EncoderFactory.class);
 
     private final EncoderMetadataSet metadatas;
+    private final WebSocketContainerScope containerScope;
     private EncoderFactory parentFactory;
     private Map<Class<?>, Wrapper> activeWrappers;
 
-    public EncoderFactory(EncoderMetadataSet metadatas)
+    public EncoderFactory(WebSocketContainerScope containerScope, EncoderMetadataSet metadatas)
     {
-        this.metadatas = metadatas;
-        this.activeWrappers = new ConcurrentHashMap<>();
+        this(containerScope,metadatas,null);
     }
 
-    public EncoderFactory(EncoderMetadataSet metadatas, EncoderFactory parentFactory)
+    public EncoderFactory(WebSocketSessionScope sessionScope, EncoderMetadataSet metadatas, EncoderFactory parentFactory)
     {
-        this(metadatas);
+        this(sessionScope.getContainerScope(),metadatas,parentFactory);
+    }
+
+    protected EncoderFactory(WebSocketContainerScope containerScope, EncoderMetadataSet metadatas, EncoderFactory parentFactory)
+    {
+        Objects.requireNonNull(containerScope,"Container Scope cannot be null");
+        this.containerScope = containerScope;
+        this.metadatas = metadatas;
+        this.activeWrappers = new ConcurrentHashMap<>();
         this.parentFactory = parentFactory;
     }
 
@@ -166,7 +178,7 @@
         Class<? extends Encoder> encoderClass = metadata.getCoderClass();
         try
         {
-            Encoder encoder = encoderClass.newInstance();
+            Encoder encoder = containerScope.getObjectFactory().createInstance(encoderClass);
             return new Wrapper(encoder,metadata);
         }
         catch (InstantiationException | IllegalAccessException e)
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JettyClientContainerProvider.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JettyClientContainerProvider.java
index eb043bc..3fafe70 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JettyClientContainerProvider.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JettyClientContainerProvider.java
@@ -22,16 +22,24 @@
 import javax.websocket.WebSocketContainer;
 
 /**
- * Client {@link ContainerProvider} implementation
+ * Client {@link ContainerProvider} implementation.
+ * <p>
+ * Created by a {@link java.util.ServiceLoader} call in the
+ * {@link javax.websocket.ContainerProvider#getWebSocketContainer()} call.
  */
 public class JettyClientContainerProvider extends ContainerProvider
 {
+    /**
+     * Used by {@link ContainerProvider#getWebSocketContainer()} to get a new instance
+     * of the Client {@link WebSocketContainer}.
+     */
     @Override
     protected WebSocketContainer getContainer()
     {
         ClientContainer container = new ClientContainer();
         try
         {
+            // We need to start this container properly.
             container.start();
             return container;
         }
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrExtension.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrExtension.java
index 49814ab..f07d70f 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrExtension.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrExtension.java
@@ -58,6 +58,7 @@
 
     /**
      * A configured extension
+     * @param cfg the configuration for the extension 
      */
     public JsrExtension(ExtensionConfig cfg)
     {
@@ -73,6 +74,7 @@
 
     /**
      * A potential (unconfigured) extension
+     * @param name the name of the extension
      */
     public JsrExtension(String name)
     {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSession.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSession.java
index a1988cf..c1fa532 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSession.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSession.java
@@ -29,6 +29,7 @@
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
+
 import javax.websocket.CloseReason;
 import javax.websocket.EndpointConfig;
 import javax.websocket.Extension;
@@ -73,9 +74,9 @@
     private JsrAsyncRemote asyncRemote;
     private JsrBasicRemote basicRemote;
 
-    public JsrSession(URI requestURI, EventDriver websocket, LogicalConnection connection, ClientContainer container, String id, SessionListener... sessionListeners)
+    public JsrSession(ClientContainer container, String id, URI requestURI, EventDriver websocket, LogicalConnection connection, SessionListener... sessionListeners)
     {
-        super(requestURI, websocket, connection, sessionListeners);
+        super(container, requestURI, websocket, connection, sessionListeners);
         if (!(websocket instanceof AbstractJsrEventDriver))
         {
             throw new IllegalArgumentException("Cannot use, not a JSR WebSocket: " + websocket);
@@ -85,8 +86,8 @@
         this.metadata = jsr.getMetadata();
         this.container = container;
         this.id = id;
-        this.decoderFactory = new DecoderFactory(metadata.getDecoders(),container.getDecoderFactory());
-        this.encoderFactory = new EncoderFactory(metadata.getEncoders(),container.getEncoderFactory());
+        this.decoderFactory = new DecoderFactory(this,metadata.getDecoders(),container.getDecoderFactory());
+        this.encoderFactory = new EncoderFactory(this,metadata.getEncoders(),container.getEncoderFactory());
         this.messageHandlerFactory = new MessageHandlerFactory();
         this.wrappers = new MessageHandlerWrapper[MessageType.values().length];
         this.messageHandlerSet = new HashSet<>();
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSessionFactory.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSessionFactory.java
index 3893a4c..26e0c86 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSessionFactory.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSessionFactory.java
@@ -43,7 +43,7 @@
     @Override
     public WebSocketSession createSession(URI requestURI, EventDriver websocket, LogicalConnection connection)
     {
-        return new JsrSession(requestURI,websocket,connection,container,getNextId(),listeners);
+        return new JsrSession(container,getNextId(),requestURI,websocket,connection,listeners);
     }
 
     public String getNextId()
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrUpgradeListener.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrUpgradeListener.java
index e711a3a..d57d71a 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrUpgradeListener.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrUpgradeListener.java
@@ -21,6 +21,7 @@
 import java.net.HttpCookie;
 import java.util.List;
 import java.util.Map;
+
 import javax.websocket.ClientEndpointConfig.Configurator;
 
 import org.eclipse.jetty.websocket.api.UpgradeRequest;
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/MessageHandlerFactory.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/MessageHandlerFactory.java
index f715c1b..4db4ec1 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/MessageHandlerFactory.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/MessageHandlerFactory.java
@@ -22,6 +22,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+
 import javax.websocket.MessageHandler;
 
 import org.eclipse.jetty.util.log.Log;
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/MessageHandlerWrapper.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/MessageHandlerWrapper.java
index d0e0ff5..aef7ea2 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/MessageHandlerWrapper.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/MessageHandlerWrapper.java
@@ -19,6 +19,8 @@
 package org.eclipse.jetty.websocket.jsr356;
 
 import javax.websocket.MessageHandler;
+import javax.websocket.MessageHandler.Partial;
+import javax.websocket.MessageHandler.Whole;
 
 import org.eclipse.jetty.websocket.jsr356.metadata.MessageHandlerMetadata;
 
@@ -71,7 +73,7 @@
     }
 
     /**
-     * Flag for a onMessage() method that wants MessageHandler.{@link Whole} with a Decoder that is based on {@link TextStream} or {@link BinaryStream}
+     * Flag for a onMessage() method that wants MessageHandler.{@link Whole} with a Decoder that is based on {@link javax.websocket.Decoder.TextStream} or {@link javax.websocket.Decoder.BinaryStream}
      * 
      * @return true for Streaming based Decoder, false for normal decoder for whole messages.
      */
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/AnnotatedEndpointMetadata.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/AnnotatedEndpointMetadata.java
index 253f88c..f3304ec 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/AnnotatedEndpointMetadata.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/AnnotatedEndpointMetadata.java
@@ -22,6 +22,10 @@
 import java.util.LinkedList;
 
 import javax.websocket.EndpointConfig;
+import javax.websocket.OnClose;
+import javax.websocket.OnError;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
 
 import org.eclipse.jetty.websocket.jsr356.metadata.DecoderMetadata;
 import org.eclipse.jetty.websocket.jsr356.metadata.DecoderMetadataSet;
@@ -33,6 +37,8 @@
  * 
  * @param <T>
  *            the annotation this metadata is based off of
+ * @param <C>
+ *            the endpoint configuration this is based off of
  */
 public abstract class AnnotatedEndpointMetadata<T extends Annotation, C extends EndpointConfig> implements EndpointMetadata
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/AnnotatedEndpointScanner.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/AnnotatedEndpointScanner.java
index f710ed2..63e189b 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/AnnotatedEndpointScanner.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/AnnotatedEndpointScanner.java
@@ -22,6 +22,7 @@
 import java.lang.reflect.Method;
 import java.util.LinkedList;
 import java.util.List;
+
 import javax.websocket.EndpointConfig;
 import javax.websocket.OnClose;
 import javax.websocket.OnError;
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/IJsrMethod.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/IJsrMethod.java
index 2e03113..4172535 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/IJsrMethod.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/IJsrMethod.java
@@ -21,6 +21,7 @@
 import java.lang.reflect.Method;
 
 import javax.websocket.Decoder;
+import javax.websocket.OnMessage;
 
 import org.eclipse.jetty.websocket.jsr356.MessageType;
 
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrCallable.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrCallable.java
index c22af6d..e78620e 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrCallable.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrCallable.java
@@ -57,6 +57,7 @@
 
     /**
      * Copy Constructor
+     * @param copy the JsrCallable to copy from 
      */
     public JsrCallable(JsrCallable copy)
     {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrEvents.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrEvents.java
index 745daab..76670a8 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrEvents.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrEvents.java
@@ -24,9 +24,14 @@
 import java.lang.annotation.Annotation;
 import java.nio.ByteBuffer;
 import java.util.Map;
+
 import javax.websocket.CloseReason;
 import javax.websocket.DecodeException;
 import javax.websocket.EndpointConfig;
+import javax.websocket.OnClose;
+import javax.websocket.OnError;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
 import javax.websocket.RemoteEndpoint;
 
 import org.eclipse.jetty.util.log.Log;
@@ -35,6 +40,8 @@
 
 /**
  * The live event methods found for a specific Annotated Endpoint
+ * @param <T> the annotation type
+ * @param <C> the endpoint config type
  */
 public class JsrEvents<T extends Annotation, C extends EndpointConfig>
 {
@@ -148,6 +155,7 @@
     {
         if (onError == null)
         {
+            LOG.warn("Unable to report throwable to websocket (no @OnError handler declared): " + websocket.getClass().getName(), cause);
             return;
         }
         onError.call(websocket,cause);
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdBinary.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdBinary.java
index 42c7597..e157583 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdBinary.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdBinary.java
@@ -21,6 +21,8 @@
 import java.io.InputStream;
 import java.nio.ByteBuffer;
 
+import javax.websocket.OnMessage;
+
 import org.eclipse.jetty.websocket.common.events.annotated.InvalidSignatureException;
 import org.eclipse.jetty.websocket.jsr356.annotations.Param.Role;
 import org.eclipse.jetty.websocket.jsr356.decoders.ByteArrayDecoder;
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdDecoder.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdDecoder.java
index 81d237f..a56343b 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdDecoder.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdDecoder.java
@@ -18,12 +18,14 @@
 
 package org.eclipse.jetty.websocket.jsr356.annotations;
 
+import javax.websocket.OnMessage;
+
 import org.eclipse.jetty.websocket.common.events.annotated.InvalidSignatureException;
 import org.eclipse.jetty.websocket.jsr356.annotations.Param.Role;
 import org.eclipse.jetty.websocket.jsr356.metadata.DecoderMetadata;
 
 /**
- * Param handling for Text or Binary &#064;{@link OnMessage} parameters declared as {@link Decoder}s
+ * Param handling for Text or Binary &#064;{@link OnMessage} parameters declared as {@link javax.websocket.Decoder}s
  */
 public class JsrParamIdDecoder extends JsrParamIdOnMessage implements IJsrParamId
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdOnClose.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdOnClose.java
index e52e8d1..0b6b4b6 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdOnClose.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdOnClose.java
@@ -19,6 +19,7 @@
 package org.eclipse.jetty.websocket.jsr356.annotations;
 
 import javax.websocket.CloseReason;
+import javax.websocket.OnClose;
 
 import org.eclipse.jetty.websocket.common.events.annotated.InvalidSignatureException;
 import org.eclipse.jetty.websocket.jsr356.annotations.Param.Role;
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdOnError.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdOnError.java
index db9d200..6db14df 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdOnError.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdOnError.java
@@ -18,6 +18,8 @@
 
 package org.eclipse.jetty.websocket.jsr356.annotations;
 
+import javax.websocket.OnError;
+
 import org.eclipse.jetty.websocket.common.events.annotated.InvalidSignatureException;
 import org.eclipse.jetty.websocket.jsr356.annotations.Param.Role;
 
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdOnOpen.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdOnOpen.java
index d0b096f..d7391ab 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdOnOpen.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdOnOpen.java
@@ -19,6 +19,7 @@
 package org.eclipse.jetty.websocket.jsr356.annotations;
 
 import javax.websocket.EndpointConfig;
+import javax.websocket.OnOpen;
 
 import org.eclipse.jetty.websocket.common.events.annotated.InvalidSignatureException;
 import org.eclipse.jetty.websocket.jsr356.annotations.Param.Role;
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdText.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdText.java
index 9973cc8..acf1bd7 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdText.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/JsrParamIdText.java
@@ -20,6 +20,8 @@
 
 import java.io.Reader;
 
+import javax.websocket.OnMessage;
+
 import org.eclipse.jetty.websocket.common.events.annotated.InvalidSignatureException;
 import org.eclipse.jetty.websocket.jsr356.annotations.Param.Role;
 import org.eclipse.jetty.websocket.jsr356.decoders.BooleanDecoder;
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnCloseCallable.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnCloseCallable.java
index 9f989fd..501580f 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnCloseCallable.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnCloseCallable.java
@@ -23,6 +23,7 @@
 import javax.websocket.CloseReason;
 import javax.websocket.CloseReason.CloseCodes;
 import javax.websocket.Decoder;
+import javax.websocket.OnClose;
 
 import org.eclipse.jetty.websocket.common.CloseInfo;
 import org.eclipse.jetty.websocket.jsr356.JsrSession;
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnErrorCallable.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnErrorCallable.java
index 9b9a109..18a6130 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnErrorCallable.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnErrorCallable.java
@@ -21,6 +21,7 @@
 import java.lang.reflect.Method;
 
 import javax.websocket.Decoder;
+import javax.websocket.OnError;
 
 import org.eclipse.jetty.websocket.jsr356.JsrSession;
 
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageBinaryCallable.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageBinaryCallable.java
index d6dba84..d7a281c 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageBinaryCallable.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageBinaryCallable.java
@@ -23,6 +23,7 @@
 
 import javax.websocket.DecodeException;
 import javax.websocket.Decoder;
+import javax.websocket.OnMessage;
 
 import org.eclipse.jetty.websocket.jsr356.JsrSession;
 import org.eclipse.jetty.websocket.jsr356.annotations.Param.Role;
@@ -30,9 +31,9 @@
 /**
  * Callable for {@link OnMessage} annotated methods with a whole or partial binary messages.
  * <p>
- * Not for use with {@link InputStream} based {@link OnMessage} method objects.
+ * Not for use with {@link java.io.InputStream} based {@link OnMessage} method objects.
  * 
- * @see Binary
+ * @see javax.websocket.Decoder.Binary
  */
 public class OnMessageBinaryCallable extends OnMessageCallable
 {
@@ -45,6 +46,7 @@
 
     /**
      * Copy Constructor
+     * @param copy the callable to copy
      */
     public OnMessageBinaryCallable(OnMessageCallable copy)
     {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageBinaryStreamCallable.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageBinaryStreamCallable.java
index 428c179..41f8c1b 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageBinaryStreamCallable.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageBinaryStreamCallable.java
@@ -25,6 +25,7 @@
 
 import javax.websocket.DecodeException;
 import javax.websocket.Decoder;
+import javax.websocket.OnMessage;
 
 import org.eclipse.jetty.websocket.jsr356.JsrSession;
 import org.eclipse.jetty.websocket.jsr356.annotations.Param.Role;
@@ -32,7 +33,7 @@
 /**
  * Callable for {@link OnMessage} annotated methods for {@link InputStream} based binary message objects
  * 
- * @see BinaryStream
+ * @see javax.websocket.Decoder.BinaryStream
  */
 public class OnMessageBinaryStreamCallable extends OnMessageCallable
 {
@@ -45,6 +46,7 @@
 
     /**
      * Copy Constructor
+     * @param copy the callable to copy from
      */
     public OnMessageBinaryStreamCallable(OnMessageCallable copy)
     {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessagePongCallable.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessagePongCallable.java
index 8da5597..4b9cb63 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessagePongCallable.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessagePongCallable.java
@@ -21,6 +21,9 @@
 import java.lang.reflect.Method;
 import java.nio.ByteBuffer;
 
+import javax.websocket.OnMessage;
+import javax.websocket.PongMessage;
+
 import org.eclipse.jetty.websocket.jsr356.JsrPongMessage;
 import org.eclipse.jetty.websocket.jsr356.JsrSession;
 import org.eclipse.jetty.websocket.jsr356.annotations.Param.Role;
@@ -37,6 +40,7 @@
 
     /**
      * Copy Constructor
+     * @param copy the callable to copy from
      */
     public OnMessagePongCallable(OnMessageCallable copy)
     {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageTextCallable.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageTextCallable.java
index a9bfb92..4944f82 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageTextCallable.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageTextCallable.java
@@ -18,10 +18,12 @@
 
 package org.eclipse.jetty.websocket.jsr356.annotations;
 
+import java.io.Reader;
 import java.lang.reflect.Method;
 
 import javax.websocket.DecodeException;
 import javax.websocket.Decoder;
+import javax.websocket.OnMessage;
 
 import org.eclipse.jetty.websocket.jsr356.JsrSession;
 import org.eclipse.jetty.websocket.jsr356.annotations.Param.Role;
@@ -31,7 +33,7 @@
  * <p>
  * Not for use with {@link Reader} based {@link OnMessage} method objects.
  * 
- * @see Text
+ * @see javax.websocket.Decoder.Text
  */
 public class OnMessageTextCallable extends OnMessageCallable
 {
@@ -44,6 +46,7 @@
 
     /**
      * Copy Constructor
+     * @param copy the callable to copy from
      */
     public OnMessageTextCallable(OnMessageCallable copy)
     {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageTextStreamCallable.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageTextStreamCallable.java
index 67312d7..fb9ef17 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageTextStreamCallable.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnMessageTextStreamCallable.java
@@ -24,6 +24,7 @@
 
 import javax.websocket.DecodeException;
 import javax.websocket.Decoder;
+import javax.websocket.OnMessage;
 
 import org.eclipse.jetty.websocket.jsr356.JsrSession;
 import org.eclipse.jetty.websocket.jsr356.annotations.Param.Role;
@@ -31,7 +32,7 @@
 /**
  * Callable for {@link OnMessage} annotated methods for {@link Reader} based text message objects
  * 
- * @see TextStream
+ * @see javax.websocket.Decoder.TextStream
  */
 public class OnMessageTextStreamCallable extends OnMessageCallable
 {
@@ -44,6 +45,7 @@
 
     /**
      * Copy Constructor
+     * @param copy the callable to copy from
      */
     public OnMessageTextStreamCallable(OnMessageCallable copy)
     {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnOpenCallable.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnOpenCallable.java
index 9c9414a..617ea33 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnOpenCallable.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/annotations/OnOpenCallable.java
@@ -22,6 +22,7 @@
 
 import javax.websocket.Decoder;
 import javax.websocket.EndpointConfig;
+import javax.websocket.OnOpen;
 
 import org.eclipse.jetty.websocket.jsr356.JsrSession;
 import org.eclipse.jetty.websocket.jsr356.annotations.Param.Role;
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/BooleanDecoder.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/BooleanDecoder.java
index c18c566..4ee6f3f 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/BooleanDecoder.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/BooleanDecoder.java
@@ -23,7 +23,7 @@
 
 
 /**
- * Default implementation of the {@link Text} Message to {@link Boolean} decoder.
+ * Default implementation of the {@link javax.websocket.Decoder.Text} Message to {@link Boolean} decoder.
  * <p>
  * Note: delegates to {@link Boolean#parseBoolean(String)} and will only support "true" and "false" as boolean values.
  */
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/ByteDecoder.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/ByteDecoder.java
index 5bdd8d6..74f931c 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/ByteDecoder.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/ByteDecoder.java
@@ -23,7 +23,7 @@
 
 
 /**
- * Default implementation of the {@link Text} Message to {@link Byte} decoder
+ * Default implementation of the {@link javax.websocket.Decoder.Text} Message to {@link Byte} decoder
  */
 public class ByteDecoder extends AbstractDecoder implements Decoder.Text<Byte>
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/CharacterDecoder.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/CharacterDecoder.java
index b092fcb..53b3a93 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/CharacterDecoder.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/CharacterDecoder.java
@@ -23,7 +23,7 @@
 
 
 /**
- * Default implementation of the {@link Text} Message to {@link Character} decoder
+ * Default implementation of the {@link javax.websocket.Decoder.Text} Message to {@link Character} decoder
  */
 public class CharacterDecoder extends AbstractDecoder implements Decoder.Text<Character>
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/DoubleDecoder.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/DoubleDecoder.java
index 1bb9c6f..ee2662f 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/DoubleDecoder.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/DoubleDecoder.java
@@ -23,7 +23,7 @@
 
 
 /**
- * Default implementation of the {@link Text} Message to {@link Double} to decoder
+ * Default implementation of the {@link javax.websocket.Decoder.Text} Message to {@link Double} to decoder
  */
 public class DoubleDecoder extends AbstractDecoder implements Decoder.Text<Double>
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/IntegerDecoder.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/IntegerDecoder.java
index 0cee891..6cc4026 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/IntegerDecoder.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/IntegerDecoder.java
@@ -23,7 +23,7 @@
 
 
 /**
- * Default implementation of the {@link Text} Message to {@link Integer} decoder
+ * Default implementation of the {@link javax.websocket.Decoder.Text} Message to {@link Integer} decoder
  */
 public class IntegerDecoder extends AbstractDecoder implements Decoder.Text<Integer>
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/ShortDecoder.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/ShortDecoder.java
index 95133a3..66e4e45 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/ShortDecoder.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/ShortDecoder.java
@@ -23,7 +23,7 @@
 
 
 /**
- * Default implementation of the {@link Text} Message to {@link Short} decoder
+ * Default implementation of the {@link javax.websocket.Decoder.Text} Message to {@link Short} decoder
  */
 public class ShortDecoder extends AbstractDecoder implements Decoder.Text<Short>
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/StringDecoder.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/StringDecoder.java
index 94bf773..e99780c 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/StringDecoder.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/decoders/StringDecoder.java
@@ -23,7 +23,7 @@
 
 
 /**
- * Default implementation of the {@link Text} Message to {@link String} decoder
+ * Default implementation of the {@link javax.websocket.Decoder.Text} Message to {@link String} decoder
  */
 public class StringDecoder extends AbstractDecoder implements Decoder.Text<String>
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/BooleanEncoder.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/BooleanEncoder.java
index c4f22d2..9b9f68b 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/BooleanEncoder.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/BooleanEncoder.java
@@ -22,7 +22,7 @@
 import javax.websocket.Encoder;
 
 /**
- * Default encoder for {@link Boolean} to {@link Text} Message encoder
+ * Default encoder for {@link Boolean} to {@link javax.websocket.Encoder.Text} Message encoder
  */
 public class BooleanEncoder extends AbstractEncoder implements Encoder.Text<Boolean>
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/ByteEncoder.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/ByteEncoder.java
index 3963d05..4fa090a 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/ByteEncoder.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/ByteEncoder.java
@@ -22,7 +22,7 @@
 import javax.websocket.Encoder;
 
 /**
- * Default encoder for {@link Byte} to {@link Text} Message encoder
+ * Default encoder for {@link Byte} to {@link javax.websocket.Encoder.Text} Message encoder
  */
 public class ByteEncoder extends AbstractEncoder implements Encoder.Text<Byte>
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/CharacterEncoder.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/CharacterEncoder.java
index 87d1fa3..ba828fa 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/CharacterEncoder.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/CharacterEncoder.java
@@ -22,7 +22,7 @@
 import javax.websocket.Encoder;
 
 /**
- * Default encoder for {@link Character} to {@link Text} Message encoder
+ * Default encoder for {@link Character} to {@link javax.websocket.Encoder.Text} Message encoder
  */
 public class CharacterEncoder extends AbstractEncoder implements Encoder.Text<Character>
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/DoubleEncoder.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/DoubleEncoder.java
index bc97d22..0831b8b 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/DoubleEncoder.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/DoubleEncoder.java
@@ -22,7 +22,7 @@
 import javax.websocket.Encoder;
 
 /**
- * Default encoder for {@link Double} to {@link Text} Message encoder
+ * Default encoder for {@link Double} to {@link javax.websocket.Encoder.Text} Message encoder
  */
 public class DoubleEncoder extends AbstractEncoder implements Encoder.Text<Double>
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/FloatEncoder.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/FloatEncoder.java
index a9df32a..b5dda8d 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/FloatEncoder.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/FloatEncoder.java
@@ -21,7 +21,7 @@
 import javax.websocket.EncodeException;
 import javax.websocket.Encoder;
 /**
- * Default encoder for {@link Float} to {@link Text} Message encoder
+ * Default encoder for {@link Float} to {@link javax.websocket.Encoder.Text} Message encoder
  */
 public class FloatEncoder extends AbstractEncoder implements Encoder.Text<Float>
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/IntegerEncoder.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/IntegerEncoder.java
index 124c840..067227c 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/IntegerEncoder.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/IntegerEncoder.java
@@ -22,7 +22,7 @@
 import javax.websocket.Encoder;
 
 /**
- * Default encoder for {@link Integer} to {@link Text} Message encoder
+ * Default encoder for {@link Integer} to {@link javax.websocket.Encoder.Text} Message encoder
  */
 public class IntegerEncoder extends AbstractEncoder implements Encoder.Text<Integer>
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/LongEncoder.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/LongEncoder.java
index f41a570..1b38774 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/LongEncoder.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/LongEncoder.java
@@ -22,7 +22,7 @@
 import javax.websocket.Encoder;
 
 /**
- * Default encoder for {@link Long} to {@link Text} Message encoder
+ * Default encoder for {@link Long} to {@link javax.websocket.Encoder.Text} Message encoder
  */
 public class LongEncoder extends AbstractEncoder implements Encoder.Text<Long>
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/ShortEncoder.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/ShortEncoder.java
index c2b55af..e82eb6d 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/ShortEncoder.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/ShortEncoder.java
@@ -22,7 +22,7 @@
 import javax.websocket.Encoder;
 
 /**
- * Default encoder for {@link Short} to {@link Text} Message encoder
+ * Default encoder for {@link Short} to {@link javax.websocket.Encoder.Text} Message encoder
  */
 public class ShortEncoder extends AbstractEncoder implements Encoder.Text<Short>
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/StringEncoder.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/StringEncoder.java
index 701d53b..66f7071 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/StringEncoder.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/encoders/StringEncoder.java
@@ -22,7 +22,7 @@
 import javax.websocket.Encoder;
 
 /**
- * Default encoder for {@link String} to {@link Text} Message encoder
+ * Default encoder for {@link String} to {@link javax.websocket.Encoder.Text} Message encoder
  */
 public class StringEncoder extends AbstractEncoder implements Encoder.Text<String>
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/endpoints/JsrAnnotatedEventDriver.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/endpoints/JsrAnnotatedEventDriver.java
index 8ec9efb..3d4dde1 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/endpoints/JsrAnnotatedEventDriver.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/endpoints/JsrAnnotatedEventDriver.java
@@ -26,6 +26,7 @@
 
 import javax.websocket.CloseReason;
 import javax.websocket.DecodeException;
+import javax.websocket.MessageHandler.Whole;
 
 import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.util.log.Log;
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/BinaryPartialOnMessage.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/BinaryPartialOnMessage.java
index d738242..68332ad 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/BinaryPartialOnMessage.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/BinaryPartialOnMessage.java
@@ -21,6 +21,8 @@
 import java.io.IOException;
 import java.nio.ByteBuffer;
 
+import javax.websocket.OnMessage;
+
 import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.websocket.common.message.MessageAppender;
 import org.eclipse.jetty.websocket.jsr356.endpoints.JsrAnnotatedEventDriver;
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/TextPartialMessage.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/TextPartialMessage.java
index 21d06b5..9768919 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/TextPartialMessage.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/TextPartialMessage.java
@@ -24,8 +24,8 @@
 import javax.websocket.MessageHandler;
 import javax.websocket.MessageHandler.Partial;
 
-import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.websocket.common.message.MessageAppender;
+import org.eclipse.jetty.websocket.common.util.Utf8PartialBuilder;
 import org.eclipse.jetty.websocket.jsr356.MessageHandlerWrapper;
 
 /**
@@ -36,19 +36,22 @@
     @SuppressWarnings("unused")
     private final MessageHandlerWrapper msgWrapper;
     private final MessageHandler.Partial<String> partialHandler;
+    private final Utf8PartialBuilder utf8Partial;
 
     @SuppressWarnings("unchecked")
     public TextPartialMessage(MessageHandlerWrapper wrapper)
     {
         this.msgWrapper = wrapper;
         this.partialHandler = (Partial<String>)wrapper.getHandler();
+        this.utf8Partial = new Utf8PartialBuilder();
     }
 
     @Override
     public void appendFrame(ByteBuffer payload, boolean isLast) throws IOException
     {
+        String partialText = utf8Partial.toPartialString(payload);
         // No decoders for Partial messages per JSR-356 (PFD1 spec)
-        partialHandler.onMessage(BufferUtil.toUTF8String(payload.slice()),isLast);
+        partialHandler.onMessage(partialText,isLast);
     }
 
     @Override
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/TextPartialOnMessage.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/TextPartialOnMessage.java
index 69d830e..24fd0bb 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/TextPartialOnMessage.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/TextPartialOnMessage.java
@@ -21,8 +21,10 @@
 import java.io.IOException;
 import java.nio.ByteBuffer;
 
-import org.eclipse.jetty.util.BufferUtil;
+import javax.websocket.OnMessage;
+
 import org.eclipse.jetty.websocket.common.message.MessageAppender;
+import org.eclipse.jetty.websocket.common.util.Utf8PartialBuilder;
 import org.eclipse.jetty.websocket.jsr356.endpoints.JsrAnnotatedEventDriver;
 
 /**
@@ -31,12 +33,14 @@
 public class TextPartialOnMessage implements MessageAppender
 {
     private final JsrAnnotatedEventDriver driver;
+    private final Utf8PartialBuilder utf8Partial;
     private boolean finished;
 
     public TextPartialOnMessage(JsrAnnotatedEventDriver driver)
     {
         this.driver = driver;
         this.finished = false;
+        this.utf8Partial = new Utf8PartialBuilder();
     }
 
     @Override
@@ -46,15 +50,9 @@
         {
             throw new IOException("Cannot append to finished buffer");
         }
-        if (payload == null)
-        {
-            driver.onPartialTextMessage("",isLast);
-        }
-        else
-        {
-            String text = BufferUtil.toUTF8String(payload);
-            driver.onPartialTextMessage(text,isLast);
-        }
+        
+        String text = utf8Partial.toPartialString(payload);
+        driver.onPartialTextMessage(text,isLast);
     }
 
     @Override
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/metadata/CoderMetadata.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/metadata/CoderMetadata.java
index 6333315..38ac535 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/metadata/CoderMetadata.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/metadata/CoderMetadata.java
@@ -21,10 +21,10 @@
 import org.eclipse.jetty.websocket.jsr356.MessageType;
 
 /**
- * The immutable base metadata for a coder ({@link Decoder} or {@link Encoder}
+ * The immutable base metadata for a coder ({@link javax.websocket.Decoder} or {@link javax.websocket.Encoder}
  * 
  * @param <T>
- *            the specific type of coder ({@link Decoder} or {@link Encoder}
+ *            the specific type of coder ({@link javax.websocket.Decoder} or {@link javax.websocket.Encoder}
  */
 public abstract class CoderMetadata<T>
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/metadata/CoderMetadataSet.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/metadata/CoderMetadataSet.java
index 38a962d..ded8201 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/metadata/CoderMetadataSet.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/metadata/CoderMetadataSet.java
@@ -24,13 +24,15 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.eclipse.jetty.websocket.api.InvalidWebSocketException;
+
 /**
  * An durable collection of {@link CoderMetadata}.
  * <p>
  * This is a write-only collection, and cannot be modified once initialized.
  * 
  * @param <T>
- *            The type of coder ({@link Decoder} or {@link Encoder}
+ *            The type of coder ({@link javax.websocket.Decoder} or {@link javax.websocket.Encoder}
  * @param <M>
  *            The metadata for the coder
  */
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/metadata/DuplicateCoderException.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/metadata/DuplicateCoderException.java
index 331cc31..c7cbe13 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/metadata/DuplicateCoderException.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/metadata/DuplicateCoderException.java
@@ -21,7 +21,7 @@
 import org.eclipse.jetty.websocket.api.InvalidWebSocketException;
 
 /**
- * Thrown when a duplicate coder is encountered when attempting to identify a Endpoint's metadata ( {@link Decoder} or {@link Encoder})
+ * Thrown when a duplicate coder is encountered when attempting to identify a Endpoint's metadata ({@link javax.websocket.Decoder} or {@link javax.websocket.Encoder})
  */
 public class DuplicateCoderException extends InvalidWebSocketException
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/AnnotatedEndpointConfigTest.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/AnnotatedEndpointConfigTest.java
index bd3fd2c..cbfe8d4 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/AnnotatedEndpointConfigTest.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/AnnotatedEndpointConfigTest.java
@@ -18,7 +18,10 @@
 
 package org.eclipse.jetty.websocket.jsr356;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
 
 import java.net.URI;
 import java.util.List;
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/ConfiguratorTest.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/ConfiguratorTest.java
index bbea2d8..2980580 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/ConfiguratorTest.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/ConfiguratorTest.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.websocket.jsr356;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.notNullValue;
 
 import java.net.URI;
 import java.util.List;
@@ -40,7 +40,7 @@
 import org.junit.Test;
 
 /**
- * Tests of {@link Configurator}
+ * Tests of {@link javax.websocket.ClientEndpointConfig.Configurator}
  */
 public class ConfiguratorTest
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/CookiesTest.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/CookiesTest.java
index 3597cca..cf835f1 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/CookiesTest.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/CookiesTest.java
@@ -23,6 +23,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+
 import javax.websocket.ClientEndpointConfig;
 import javax.websocket.ContainerProvider;
 import javax.websocket.Endpoint;
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/DecoderFactoryTest.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/DecoderFactoryTest.java
index 07bc9ab..ccdafb4 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/DecoderFactoryTest.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/DecoderFactoryTest.java
@@ -25,6 +25,9 @@
 
 import javax.websocket.Decoder;
 
+import org.eclipse.jetty.websocket.api.WebSocketPolicy;
+import org.eclipse.jetty.websocket.common.scopes.SimpleContainerScope;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 import org.eclipse.jetty.websocket.jsr356.decoders.ByteArrayDecoder;
 import org.eclipse.jetty.websocket.jsr356.decoders.ByteBufferDecoder;
 import org.eclipse.jetty.websocket.jsr356.decoders.DateDecoder;
@@ -56,9 +59,11 @@
     @Before
     public void initDecoderFactory()
     {
-        DecoderFactory primitivesFactory = new DecoderFactory(PrimitiveDecoderMetadataSet.INSTANCE);
+        WebSocketContainerScope containerScope = new SimpleContainerScope(WebSocketPolicy.newClientPolicy());
+        
+        DecoderFactory primitivesFactory = new DecoderFactory(containerScope,PrimitiveDecoderMetadataSet.INSTANCE);
         metadatas = new DecoderMetadataSet();
-        factory = new DecoderFactory(metadatas,primitivesFactory);
+        factory = new DecoderFactory(containerScope,metadatas,primitivesFactory);
     }
 
     @Test
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/DecoderReaderManySmallTest.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/DecoderReaderManySmallTest.java
index ec1d09c..f4bd99f 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/DecoderReaderManySmallTest.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/DecoderReaderManySmallTest.java
@@ -42,13 +42,15 @@
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.websocket.common.frames.TextFrame;
 import org.eclipse.jetty.websocket.common.test.BlockheadServer;
-import org.eclipse.jetty.websocket.common.test.BlockheadServer.ServerConnection;
+import org.eclipse.jetty.websocket.common.test.IBlockheadServerConnection;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 
+@Ignore("Not working atm")
 public class DecoderReaderManySmallTest
 {
     public static class EventId
@@ -111,7 +113,7 @@
     private static class EventIdServer implements Runnable
     {
         private BlockheadServer server;
-        private ServerConnection sconnection;
+        private IBlockheadServerConnection sconnection;
         private CountDownLatch connectLatch = new CountDownLatch(1);
 
         public EventIdServer(BlockheadServer server)
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/DecoderReaderTest.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/DecoderReaderTest.java
index c031b99..abb3e89 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/DecoderReaderTest.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/DecoderReaderTest.java
@@ -50,7 +50,7 @@
 import org.eclipse.jetty.websocket.common.frames.ContinuationFrame;
 import org.eclipse.jetty.websocket.common.frames.TextFrame;
 import org.eclipse.jetty.websocket.common.test.BlockheadServer;
-import org.eclipse.jetty.websocket.common.test.BlockheadServer.ServerConnection;
+import org.eclipse.jetty.websocket.common.test.IBlockheadServerConnection;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -135,13 +135,14 @@
         }
 
         @OnMessage
-        public void onMessage(Quotes msg)
+        public synchronized void onMessage(Quotes msg)
         {
+            Integer h=hashCode();
             messageQueue.add(msg);
-            System.out.printf("Quotes from: %s%n",msg.author);
+            System.out.printf("%x: Quotes from: %s%n",h,msg.author);
             for (String quote : msg.quotes)
             {
-                System.out.printf(" - %s%n",quote);
+                System.out.printf("%x: - %s%n",h,quote);
             }
         }
 
@@ -154,7 +155,7 @@
     private static class QuoteServer implements Runnable
     {
         private BlockheadServer server;
-        private ServerConnection sconnection;
+        private IBlockheadServerConnection sconnection;
         private CountDownLatch connectLatch = new CountDownLatch(1);
 
         public QuoteServer(BlockheadServer server)
@@ -271,8 +272,8 @@
     }
 
     // TODO analyse and fix 
-    @Ignore
     @Test
+    @Ignore ("Quotes appear to be able to arrive in any order?")
     public void testTwoQuotes() throws Exception
     {
         QuotesSocket quoter = new QuotesSocket();
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/EncoderFactoryTest.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/EncoderFactoryTest.java
index dca75c2..86a691b 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/EncoderFactoryTest.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/EncoderFactoryTest.java
@@ -22,6 +22,9 @@
 
 import javax.websocket.Encoder;
 
+import org.eclipse.jetty.websocket.api.WebSocketPolicy;
+import org.eclipse.jetty.websocket.common.scopes.SimpleContainerScope;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 import org.eclipse.jetty.websocket.jsr356.encoders.IntegerEncoder;
 import org.eclipse.jetty.websocket.jsr356.encoders.LongEncoder;
 import org.eclipse.jetty.websocket.jsr356.encoders.PrimitiveEncoderMetadataSet;
@@ -53,9 +56,11 @@
     @Before
     public void initEncoderFactory()
     {
-        EncoderFactory primitivesFactory = new EncoderFactory(PrimitiveEncoderMetadataSet.INSTANCE);
+        WebSocketContainerScope containerScope = new SimpleContainerScope(WebSocketPolicy.newClientPolicy());
+        
+        EncoderFactory primitivesFactory = new EncoderFactory(containerScope,PrimitiveEncoderMetadataSet.INSTANCE);
         metadatas = new EncoderMetadataSet();
-        factory = new EncoderFactory(metadatas,primitivesFactory);
+        factory = new EncoderFactory(containerScope,metadatas,primitivesFactory);
     }
 
     @Test
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/EncoderTest.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/EncoderTest.java
index 7ce1381..b29691a 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/EncoderTest.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/EncoderTest.java
@@ -18,6 +18,8 @@
 
 package org.eclipse.jetty.websocket.jsr356;
 
+import static org.hamcrest.Matchers.containsString;
+
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
@@ -26,6 +28,7 @@
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+
 import javax.websocket.ClientEndpointConfig;
 import javax.websocket.ContainerProvider;
 import javax.websocket.EncodeException;
@@ -42,22 +45,20 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.websocket.common.test.BlockheadServer;
-import org.eclipse.jetty.websocket.common.test.BlockheadServer.ServerConnection;
+import org.eclipse.jetty.websocket.common.test.IBlockheadServerConnection;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
-import static org.hamcrest.Matchers.containsString;
-
 public class EncoderTest
 {
     private static class EchoServer implements Runnable
     {
         private Thread thread;
         private BlockheadServer server;
-        private ServerConnection sconnection;
+        private IBlockheadServerConnection sconnection;
         private CountDownLatch connectLatch = new CountDownLatch(1);
 
         public EchoServer(BlockheadServer server)
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/EndpointEchoClient.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/EndpointEchoClient.java
index 0728b42..9b74af5 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/EndpointEchoClient.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/EndpointEchoClient.java
@@ -18,7 +18,10 @@
 
 package org.eclipse.jetty.websocket.jsr356;
 
+import static org.hamcrest.Matchers.notNullValue;
+
 import java.io.IOException;
+
 import javax.websocket.CloseReason;
 import javax.websocket.Endpoint;
 import javax.websocket.EndpointConfig;
@@ -28,8 +31,6 @@
 import org.eclipse.jetty.util.log.Logger;
 import org.junit.Assert;
 
-import static org.hamcrest.Matchers.notNullValue;
-
 /**
  * Basic Echo Client from extended Endpoint
  */
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/EndpointEchoTest.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/EndpointEchoTest.java
index 82b47b2..9149033 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/EndpointEchoTest.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/EndpointEchoTest.java
@@ -18,8 +18,11 @@
 
 package org.eclipse.jetty.websocket.jsr356;
 
+import static org.hamcrest.Matchers.instanceOf;
+
 import java.net.URI;
 import java.util.concurrent.TimeUnit;
+
 import javax.websocket.ContainerProvider;
 import javax.websocket.Session;
 import javax.websocket.WebSocketContainer;
@@ -35,8 +38,6 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import static org.hamcrest.Matchers.instanceOf;
-
 public class EndpointEchoTest
 {
     private static final Logger LOG = Log.getLogger(EndpointEchoTest.class);
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/JsrSessionTest.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/JsrSessionTest.java
index a342ca1..773198c 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/JsrSessionTest.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/JsrSessionTest.java
@@ -18,14 +18,18 @@
 
 package org.eclipse.jetty.websocket.jsr356;
 
+import static org.hamcrest.Matchers.*;
+
 import java.net.URI;
 import java.nio.ByteBuffer;
+
 import javax.websocket.ClientEndpointConfig;
 import javax.websocket.DeploymentException;
 import javax.websocket.MessageHandler;
 
 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
 import org.eclipse.jetty.websocket.common.events.EventDriver;
+import org.eclipse.jetty.websocket.common.test.DummyConnection;
 import org.eclipse.jetty.websocket.jsr356.client.EmptyClientEndpointConfig;
 import org.eclipse.jetty.websocket.jsr356.client.SimpleEndpointMetadata;
 import org.eclipse.jetty.websocket.jsr356.endpoints.EndpointInstance;
@@ -34,14 +38,11 @@
 import org.eclipse.jetty.websocket.jsr356.handlers.ByteBufferPartialHandler;
 import org.eclipse.jetty.websocket.jsr356.handlers.LongMessageHandler;
 import org.eclipse.jetty.websocket.jsr356.handlers.StringWholeHandler;
-import org.eclipse.jetty.websocket.jsr356.samples.DummyConnection;
 import org.eclipse.jetty.websocket.jsr356.samples.DummyEndpoint;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
-import static org.hamcrest.Matchers.instanceOf;
-
 public class JsrSessionTest
 {
     private ClientContainer container;
@@ -60,10 +61,10 @@
         // Executor executor = null;
 
         EndpointInstance ei = new EndpointInstance(websocket,config,metadata);
-
+        
         EventDriver driver = new JsrEndpointEventDriver(policy,ei);
         DummyConnection connection = new DummyConnection();
-        session = new JsrSession(requestURI,driver,connection,container,id);
+        session = new JsrSession(container,id,requestURI,driver,connection);
     }
 
     @Test
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/MessageHandlerFactoryTest.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/MessageHandlerFactoryTest.java
index 5ec7b31..609612b 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/MessageHandlerFactoryTest.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/MessageHandlerFactoryTest.java
@@ -25,6 +25,9 @@
 
 import javax.websocket.DeploymentException;
 
+import org.eclipse.jetty.websocket.api.WebSocketPolicy;
+import org.eclipse.jetty.websocket.common.scopes.SimpleContainerScope;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 import org.eclipse.jetty.websocket.jsr356.decoders.PrimitiveDecoderMetadataSet;
 import org.eclipse.jetty.websocket.jsr356.handlers.ByteArrayPartialHandler;
 import org.eclipse.jetty.websocket.jsr356.handlers.StringPartialHandler;
@@ -44,9 +47,11 @@
     @Before
     public void init() throws DeploymentException
     {
-        DecoderFactory primitivesFactory = new DecoderFactory(PrimitiveDecoderMetadataSet.INSTANCE);
+        WebSocketContainerScope containerScope = new SimpleContainerScope(WebSocketPolicy.newClientPolicy());
+        
+        DecoderFactory primitivesFactory = new DecoderFactory(containerScope,PrimitiveDecoderMetadataSet.INSTANCE);
         metadatas = new DecoderMetadataSet();
-        decoders = new DecoderFactory(metadatas,primitivesFactory);
+        decoders = new DecoderFactory(containerScope,metadatas,primitivesFactory);
         factory = new MessageHandlerFactory();
     }
 
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/ClientAnnotatedEndpointScanner_InvalidSignaturesTest.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/ClientAnnotatedEndpointScanner_InvalidSignaturesTest.java
index b5e8fb1..6db77fa 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/ClientAnnotatedEndpointScanner_InvalidSignaturesTest.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/ClientAnnotatedEndpointScanner_InvalidSignaturesTest.java
@@ -18,10 +18,13 @@
 
 package org.eclipse.jetty.websocket.jsr356.endpoints;
 
+import static org.hamcrest.Matchers.containsString;
+
 import java.lang.annotation.Annotation;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+
 import javax.websocket.ClientEndpoint;
 import javax.websocket.ClientEndpointConfig;
 import javax.websocket.DeploymentException;
@@ -48,8 +51,6 @@
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
-import static org.hamcrest.Matchers.containsString;
-
 /**
  * Test {@link AnnotatedEndpointScanner} against various simple, 1 method, {@link ClientEndpoint} annotated classes with invalid signatures.
  */
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/TrackingSocket.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/TrackingSocket.java
index c6f13c1..c1877cf 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/TrackingSocket.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/TrackingSocket.java
@@ -18,8 +18,13 @@
 
 package org.eclipse.jetty.websocket.jsr356.endpoints;
 
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+
 import javax.websocket.CloseReason;
 import javax.websocket.CloseReason.CloseCode;
 
@@ -28,10 +33,6 @@
 import org.eclipse.jetty.util.log.Logger;
 import org.junit.Assert;
 
-import static org.hamcrest.Matchers.greaterThanOrEqualTo;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-
 /**
  * Abstract base socket used for tracking state and events within the socket for testing reasons.
  */
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidCloseIntSocket.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidCloseIntSocket.java
index 63faaec..52c5dc1 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidCloseIntSocket.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidCloseIntSocket.java
@@ -28,6 +28,7 @@
 {
     /**
      * Invalid Close Method Declaration (parameter type int)
+     * @param statusCode the status code
      */
     @OnClose
     public void onClose(int statusCode)
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidErrorErrorSocket.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidErrorErrorSocket.java
index 65550ea..2b30078 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidErrorErrorSocket.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidErrorErrorSocket.java
@@ -28,6 +28,7 @@
 {
     /**
      * Invalid Error Method Declaration (parameter type Error)
+     * @param error the error
      */
     @OnError
     public void onError(Error error)
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidErrorExceptionSocket.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidErrorExceptionSocket.java
index 8899e5b..bd191bd 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidErrorExceptionSocket.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidErrorExceptionSocket.java
@@ -28,6 +28,7 @@
 {
     /**
      * Invalid Error Method Declaration (parameter type Exception)
+     * @param e the extension
      */
     @OnError
     public void onError(Exception e)
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidErrorIntSocket.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidErrorIntSocket.java
index ab29ef4..6e23ee6 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidErrorIntSocket.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidErrorIntSocket.java
@@ -28,6 +28,7 @@
 {
     /**
      * Invalid Error Method Declaration (parameter type int)
+     * @param errorCount the error count
      */
     @OnError
     public void onError(int errorCount)
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidOpenCloseReasonSocket.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidOpenCloseReasonSocket.java
index 702a221..8fd202a 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidOpenCloseReasonSocket.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidOpenCloseReasonSocket.java
@@ -29,6 +29,7 @@
 {
     /**
      * Invalid Open Method Declaration (parameter type CloseReason)
+     * @param reason the close reason
      */
     @OnOpen
     public void onOpen(CloseReason reason)
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidOpenIntSocket.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidOpenIntSocket.java
index c528074..6abef15 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidOpenIntSocket.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidOpenIntSocket.java
@@ -28,6 +28,7 @@
 {
     /**
      * Invalid Open Method Declaration (parameter type int)
+     * @param value the open value
      */
     @OnOpen
     public void onOpen(int value)
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidOpenSessionIntSocket.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidOpenSessionIntSocket.java
index bb73ed4..737fb05 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidOpenSessionIntSocket.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/endpoints/samples/InvalidOpenSessionIntSocket.java
@@ -29,6 +29,8 @@
 {
     /**
      * Invalid Open Method Declaration (parameter of type int)
+     * @param session the session for the open
+     * @param count the open count
      */
     @OnOpen
     public void onOpen(Session session, int count)
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/misbehaving/MisbehavingClassTest.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/misbehaving/MisbehavingClassTest.java
index ce00648..a37cf51 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/misbehaving/MisbehavingClassTest.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/misbehaving/MisbehavingClassTest.java
@@ -18,8 +18,9 @@
 
 package org.eclipse.jetty.websocket.jsr356.misbehaving;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
 
 import java.net.URI;
 import java.util.concurrent.TimeUnit;
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/samples/DummyConnection.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/samples/DummyConnection.java
deleted file mode 100644
index 9a18951..0000000
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/samples/DummyConnection.java
+++ /dev/null
@@ -1,156 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.websocket.jsr356.samples;
-
-import java.net.InetSocketAddress;
-import java.util.concurrent.Executor;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.websocket.api.BatchMode;
-import org.eclipse.jetty.websocket.api.SuspendToken;
-import org.eclipse.jetty.websocket.api.WebSocketPolicy;
-import org.eclipse.jetty.websocket.api.WriteCallback;
-import org.eclipse.jetty.websocket.api.extensions.Frame;
-import org.eclipse.jetty.websocket.api.extensions.IncomingFrames;
-import org.eclipse.jetty.websocket.common.LogicalConnection;
-import org.eclipse.jetty.websocket.common.WebSocketSession;
-import org.eclipse.jetty.websocket.common.io.IOState;
-
-public class DummyConnection implements LogicalConnection
-{
-    private IOState iostate;
-
-    public DummyConnection()
-    {
-        this.iostate = new IOState();
-    }
-
-    @Override
-    public void close()
-    {
-    }
-
-    @Override
-    public void close(int statusCode, String reason)
-    {
-    }
-
-    @Override
-    public void disconnect()
-    {
-    }
-
-    @Override
-    public ByteBufferPool getBufferPool()
-    {
-        return null;
-    }
-
-    @Override
-    public Executor getExecutor()
-    {
-        return null;
-    }
-
-    @Override
-    public long getIdleTimeout()
-    {
-        return 0;
-    }
-
-    @Override
-    public IOState getIOState()
-    {
-        return this.iostate;
-    }
-
-    @Override
-    public InetSocketAddress getLocalAddress()
-    {
-        return null;
-    }
-
-    @Override
-    public long getMaxIdleTimeout()
-    {
-        return 0;
-    }
-
-    @Override
-    public WebSocketPolicy getPolicy()
-    {
-        return null;
-    }
-
-    @Override
-    public InetSocketAddress getRemoteAddress()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public WebSocketSession getSession()
-    {
-        return null;
-    }
-
-    @Override
-    public boolean isOpen()
-    {
-        return false;
-    }
-
-    @Override
-    public boolean isReading()
-    {
-        return false;
-    }
-
-    @Override
-    public void outgoingFrame(Frame frame, WriteCallback callback, BatchMode batchMode)
-    {
-    }
-
-    @Override
-    public void resume()
-    {
-    }
-
-    @Override
-    public void setMaxIdleTimeout(long ms)
-    {
-    }
-
-    @Override
-    public void setNextIncomingFrames(IncomingFrames incoming)
-    {
-    }
-
-    @Override
-    public void setSession(WebSocketSession session)
-    {
-    }
-
-    @Override
-    public SuspendToken suspend()
-    {
-        return null;
-    }
-}
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/samples/ExtDecoder.java b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/samples/ExtDecoder.java
index 65b9426..ad7f452 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/samples/ExtDecoder.java
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/samples/ExtDecoder.java
@@ -22,6 +22,7 @@
 
 /**
  * Testing scenario of an extended Decoder interface
+ * @param <T> the decoder type
  */
 public interface ExtDecoder<T> extends Decoder.Text<T>
 {
diff --git a/jetty-websocket/javax-websocket-client-impl/src/test/resources/jetty-logging.properties b/jetty-websocket/javax-websocket-client-impl/src/test/resources/jetty-logging.properties
index 6c5baae..3acadb6 100644
--- a/jetty-websocket/javax-websocket-client-impl/src/test/resources/jetty-logging.properties
+++ b/jetty-websocket/javax-websocket-client-impl/src/test/resources/jetty-logging.properties
@@ -1,5 +1,6 @@
 org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
 org.eclipse.jetty.LEVEL=WARN
 
-# org.eclipse.jetty.websocket.LEVEL=WARN
+# org.eclipse.jetty.websocket.LEVEL=INFO
+# org.eclipse.jetty.websocket.LEVEL=ALL
 # org.eclipse.jetty.websocket.jsr356.LEVEL=DEBUG
diff --git a/jetty-websocket/javax-websocket-server-impl/pom.xml b/jetty-websocket/javax-websocket-server-impl/pom.xml
index f44666f..83553db 100644
--- a/jetty-websocket/javax-websocket-server-impl/pom.xml
+++ b/jetty-websocket/javax-websocket-server-impl/pom.xml
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.eclipse.jetty.websocket</groupId>
     <artifactId>websocket-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
 
   <modelVersion>4.0.0</modelVersion>
@@ -70,23 +70,6 @@
               </execution>
           </executions>
       </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-            <configuration>
-              <descriptorRefs>
-                <descriptorRef>config</descriptorRef>
-              </descriptorRefs>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
     </plugins>
   </build>
 </project>
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointConfig.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointConfig.java
index ebc6ff9..3dc1476 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointConfig.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointConfig.java
@@ -32,6 +32,8 @@
 import javax.websocket.server.ServerEndpoint;
 import javax.websocket.server.ServerEndpointConfig;
 
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
+
 public class AnnotatedServerEndpointConfig implements ServerEndpointConfig
 {
     private final Class<?> endpointClass;
@@ -44,12 +46,12 @@
     private Map<String, Object> userProperties;
     private List<Extension> extensions;
 
-    public AnnotatedServerEndpointConfig(Class<?> endpointClass, ServerEndpoint anno) throws DeploymentException
+    public AnnotatedServerEndpointConfig(WebSocketContainerScope containerScope, Class<?> endpointClass, ServerEndpoint anno) throws DeploymentException
     {
-        this(endpointClass,anno,null);
+        this(containerScope,endpointClass,anno,null);
     }
 
-    public AnnotatedServerEndpointConfig(Class<?> endpointClass, ServerEndpoint anno, ServerEndpointConfig baseConfig) throws DeploymentException
+    public AnnotatedServerEndpointConfig(WebSocketContainerScope containerScope, Class<?> endpointClass, ServerEndpoint anno, ServerEndpointConfig baseConfig) throws DeploymentException
     {
         ServerEndpointConfig.Configurator configr = null;
 
@@ -109,23 +111,25 @@
         {
             userProperties.putAll(baseConfig.getUserProperties());
         }
+        
+        ServerEndpointConfig.Configurator cfgr;
 
         if (anno.configurator() == ServerEndpointConfig.Configurator.class)
         {
             if (configr != null)
             {
-                this.configurator = configr;
+                cfgr = configr;
             }
             else
             {
-                this.configurator = BasicServerEndpointConfigurator.INSTANCE;
+                cfgr = new ContainerDefaultConfigurator();
             }
         }
         else
         {
             try
             {
-                this.configurator = anno.configurator().newInstance();
+                cfgr = anno.configurator().newInstance();
             }
             catch (InstantiationException | IllegalAccessException e)
             {
@@ -137,6 +141,9 @@
                 throw new DeploymentException(err.toString(),e);
             }
         }
+        
+        // Make sure all Configurators obtained are decorated
+        this.configurator = containerScope.getObjectFactory().decorate(cfgr);
     }
 
     @Override
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointMetadata.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointMetadata.java
index b5deb90..5e0f82b 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointMetadata.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointMetadata.java
@@ -25,6 +25,7 @@
 import javax.websocket.server.ServerEndpointConfig;
 
 import org.eclipse.jetty.websocket.api.InvalidWebSocketException;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 import org.eclipse.jetty.websocket.jsr356.annotations.AnnotatedEndpointMetadata;
 import org.eclipse.jetty.websocket.jsr356.annotations.IJsrParamId;
 
@@ -33,7 +34,7 @@
     private final ServerEndpoint endpoint;
     private final AnnotatedServerEndpointConfig config;
 
-    protected AnnotatedServerEndpointMetadata(Class<?> websocket, ServerEndpointConfig baseConfig) throws DeploymentException
+    protected AnnotatedServerEndpointMetadata(WebSocketContainerScope containerScope, Class<?> websocket, ServerEndpointConfig baseConfig) throws DeploymentException
     {
         super(websocket);
 
@@ -44,9 +45,9 @@
         }
 
         this.endpoint = anno;
-        this.config = new AnnotatedServerEndpointConfig(websocket,anno,baseConfig);
+        this.config = new AnnotatedServerEndpointConfig(containerScope,websocket,anno,baseConfig);
         
-        getDecoders().addAll(anno.decoders());
+        getDecoders().addAll(anno.decoders());  
         getEncoders().addAll(anno.encoders());
     }
 
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/BasicServerEndpointConfig.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/BasicServerEndpointConfig.java
index 5b9bb70..1156917 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/BasicServerEndpointConfig.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/BasicServerEndpointConfig.java
@@ -28,6 +28,8 @@
 import javax.websocket.Extension;
 import javax.websocket.server.ServerEndpointConfig;
 
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
+
 public class BasicServerEndpointConfig implements ServerEndpointConfig
 {
     private final List<Class<? extends Decoder>> decoders;
@@ -39,7 +41,7 @@
     private final String path;
     private Map<String, Object> userProperties;
 
-    public BasicServerEndpointConfig(Class<?> endpointClass, String path)
+    public BasicServerEndpointConfig(WebSocketContainerScope containerScope, Class<?> endpointClass, String path)
     {
         this.endpointClass = endpointClass;
         this.path = path;
@@ -49,10 +51,10 @@
         this.subprotocols = new ArrayList<>();
         this.extensions = new ArrayList<>();
         this.userProperties = new HashMap<>();
-        this.configurator = BasicServerEndpointConfigurator.INSTANCE;
+        this.configurator = new ContainerDefaultConfigurator();
     }
 
-    public BasicServerEndpointConfig(ServerEndpointConfig copy)
+    public BasicServerEndpointConfig(WebSocketContainerScope containerScope, ServerEndpointConfig copy)
     {
         // immutable concepts
         this.endpointClass = copy.getEndpointClass();
@@ -62,15 +64,21 @@
         this.encoders = copy.getEncoders();
         this.subprotocols = copy.getSubprotocols();
         this.extensions = copy.getExtensions();
+
+        ServerEndpointConfig.Configurator cfgr;
+
         if (copy.getConfigurator() != null)
         {
-            this.configurator = copy.getConfigurator();
+            cfgr = copy.getConfigurator();
         }
         else
         {
-            this.configurator = BasicServerEndpointConfigurator.INSTANCE;
+            cfgr = new ContainerDefaultConfigurator();
         }
 
+        // Make sure all Configurators obtained are decorated
+        this.configurator = containerScope.getObjectFactory().decorate(cfgr);
+
         // mutable concepts
         this.userProperties = new HashMap<>(copy.getUserProperties());
     }
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/BasicServerEndpointConfigurator.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/BasicServerEndpointConfigurator.java
deleted file mode 100644
index fc7d7fd..0000000
--- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/BasicServerEndpointConfigurator.java
+++ /dev/null
@@ -1,108 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.websocket.jsr356.server;
-
-import java.util.List;
-import javax.websocket.Extension;
-import javax.websocket.HandshakeResponse;
-import javax.websocket.server.HandshakeRequest;
-import javax.websocket.server.ServerEndpointConfig;
-
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.websocket.api.util.QuoteUtil;
-
-public class BasicServerEndpointConfigurator extends ServerEndpointConfig.Configurator
-{
-    private static final Logger LOG = Log.getLogger(BasicServerEndpointConfigurator.class);
-    private static final String NO_SUBPROTOCOL = "";
-    public static final ServerEndpointConfig.Configurator INSTANCE = new BasicServerEndpointConfigurator();
-
-    @Override
-    public boolean checkOrigin(String originHeaderValue)
-    {
-        return true;
-    }
-
-    @Override
-    public <T> T getEndpointInstance(Class<T> endpointClass) throws InstantiationException
-    {
-        if (LOG.isDebugEnabled())
-        {
-            LOG.debug(".getEndpointInstance({})",endpointClass);
-        }
-        try
-        {
-            return endpointClass.newInstance();
-        }
-        catch (IllegalAccessException e)
-        {
-            throw new InstantiationException(String.format("%s: %s",e.getClass().getName(),e.getMessage()));
-        }
-    }
-
-    @Override
-    public List<Extension> getNegotiatedExtensions(List<Extension> installed, List<Extension> requested)
-    {
-        return requested;
-    }
-
-    @Override
-    public String getNegotiatedSubprotocol(List<String> supported, List<String> requested)
-    {
-        if ((requested == null) || (requested.size() == 0))
-        {
-            // nothing requested, don't return anything
-            return NO_SUBPROTOCOL;
-        }
-
-        // Nothing specifically called out as being supported by the endpoint
-        if ((supported == null) || (supported.isEmpty()))
-        {
-            // Just return the first hit in this case
-            LOG.warn("Client requested Subprotocols on endpoint with none supported: {}",QuoteUtil.join(requested,","));
-            return NO_SUBPROTOCOL;
-        }
-
-        // Return the first matching hit from the list of supported protocols.
-        for (String possible : requested)
-        {
-            if (possible == null)
-            {
-                // skip null
-                continue;
-            }
-
-            if (supported.contains(possible))
-            {
-                return possible;
-            }
-        }
-
-        LOG.warn("Client requested subprotocols {} do not match any endpoint supported subprotocols {}",QuoteUtil.join(requested,","),
-                QuoteUtil.join(supported,","));
-        return NO_SUBPROTOCOL;
-    }
-
-    @Override
-    public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response)
-    {
-        /* do nothing */
-    }
-}
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ContainerDefaultConfigurator.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ContainerDefaultConfigurator.java
new file mode 100644
index 0000000..dd20bf1
--- /dev/null
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ContainerDefaultConfigurator.java
@@ -0,0 +1,128 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.jsr356.server;
+
+import java.util.List;
+import java.util.ServiceLoader;
+
+import javax.websocket.Extension;
+import javax.websocket.HandshakeResponse;
+import javax.websocket.server.HandshakeRequest;
+import javax.websocket.server.ServerEndpointConfig;
+import javax.websocket.server.ServerEndpointConfig.Configurator;
+
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.websocket.api.util.QuoteUtil;
+
+/**
+ * The "Container Default Configurator" per the JSR-356 spec.
+ * 
+ * @see ServiceLoader behavior of {@link javax.websocket.server.ServerEndpointConfig.Configurator}
+ */
+public final class ContainerDefaultConfigurator extends Configurator
+{
+    private static final Logger LOG = Log.getLogger(ContainerDefaultConfigurator.class);
+    private static final String NO_SUBPROTOCOL = "";
+    
+    /**
+     * Default Constructor required, as
+     * javax.websocket.server.ServerEndpointConfig$Configurator.fetchContainerDefaultConfigurator()
+     * will be the one that instantiates this class in most cases.
+     */
+    public ContainerDefaultConfigurator()
+    {
+        super();
+    }
+
+    @Override
+    public boolean checkOrigin(String originHeaderValue)
+    {
+        return true;
+    }
+
+    @Override
+    public <T> T getEndpointInstance(Class<T> endpointClass) throws InstantiationException
+    {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug(".getEndpointInstance({})",endpointClass);
+        }
+        
+        try
+        {
+            // Since this is started via a ServiceLoader, this class has no Scope or context
+            // that can be used to obtain a ObjectFactory from.
+            return endpointClass.newInstance();
+        }
+        catch (IllegalAccessException e)
+        {
+            throw new InstantiationException(String.format("%s: %s",e.getClass().getName(),e.getMessage()));
+        }
+    }
+
+    @Override
+    public List<Extension> getNegotiatedExtensions(List<Extension> installed, List<Extension> requested)
+    {
+        return requested;
+    }
+
+    @Override
+    public String getNegotiatedSubprotocol(List<String> supported, List<String> requested)
+    {
+        if ((requested == null) || (requested.size() == 0))
+        {
+            // nothing requested, don't return anything
+            return NO_SUBPROTOCOL;
+        }
+
+        // Nothing specifically called out as being supported by the endpoint
+        if ((supported == null) || (supported.isEmpty()))
+        {
+            // Just return the first hit in this case
+            LOG.warn("Client requested Subprotocols on endpoint with none supported: {}",QuoteUtil.join(requested,","));
+            return NO_SUBPROTOCOL;
+        }
+
+        // Return the first matching hit from the list of supported protocols.
+        for (String possible : requested)
+        {
+            if (possible == null)
+            {
+                // skip null
+                continue;
+            }
+
+            if (supported.contains(possible))
+            {
+                return possible;
+            }
+        }
+
+        LOG.warn("Client requested subprotocols {} do not match any endpoint supported subprotocols {}",QuoteUtil.join(requested,","),
+                QuoteUtil.join(supported,","));
+        return NO_SUBPROTOCOL;
+    }
+
+    @Override
+    public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response)
+    {
+        /* do nothing */
+    }
+}
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrCreator.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrCreator.java
index 1c43be3..c2f9575 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrCreator.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrCreator.java
@@ -25,12 +25,14 @@
 import javax.websocket.Extension;
 import javax.websocket.Extension.Parameter;
 import javax.websocket.server.ServerEndpointConfig;
+import javax.websocket.server.ServerEndpointConfig.Configurator;
 
 import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
 import org.eclipse.jetty.websocket.api.extensions.ExtensionFactory;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 import org.eclipse.jetty.websocket.jsr356.JsrExtension;
 import org.eclipse.jetty.websocket.jsr356.endpoints.EndpointInstance;
 import org.eclipse.jetty.websocket.jsr356.server.pathmap.WebSocketPathSpec;
@@ -44,11 +46,13 @@
     public static final String PROP_REMOTE_ADDRESS = "javax.websocket.endpoint.remoteAddress";
     public static final String PROP_LOCAL_ADDRESS = "javax.websocket.endpoint.localAddress";
     private static final Logger LOG = Log.getLogger(JsrCreator.class);
+    private final WebSocketContainerScope containerScope;
     private final ServerEndpointMetadata metadata;
     private final ExtensionFactory extensionFactory;
 
-    public JsrCreator(ServerEndpointMetadata metadata, ExtensionFactory extensionFactory)
+    public JsrCreator(WebSocketContainerScope containerScope, ServerEndpointMetadata metadata, ExtensionFactory extensionFactory)
     {
+        this.containerScope = containerScope;
         this.metadata = metadata;
         this.extensionFactory = extensionFactory;
     }
@@ -64,7 +68,7 @@
         
         // Establish a copy of the config, so that the UserProperties are unique
         // per upgrade request.
-        config = new BasicServerEndpointConfig(config);
+        config = new BasicServerEndpointConfig(containerScope, config);
         
         // Bug 444617 - Expose localAddress and remoteAddress for jsr modify handshake to use
         // This is being implemented as an optional set of userProperties so that
@@ -134,7 +138,10 @@
         try
         {
             Class<?> endpointClass = config.getEndpointClass();
-            Object endpoint = config.getConfigurator().getEndpointInstance(endpointClass);
+            Configurator configr = config.getConfigurator();
+            Object endpoint = configr.getEndpointInstance(endpointClass);
+            // Do not decorate here (let the Connection and Session start first)
+            // This will allow CDI to see Session for injection into Endpoint classes.
             PathSpec pathSpec = hsreq.getRequestPathSpec();
             if (pathSpec instanceof WebSocketPathSpec)
             {
@@ -142,7 +149,7 @@
                 WebSocketPathSpec wspathSpec = (WebSocketPathSpec)pathSpec;
                 String requestPath = req.getRequestPath();
                 // Wrap the config with the path spec information
-                config = new PathParamServerEndpointConfig(config,wspathSpec,requestPath);
+                config = new PathParamServerEndpointConfig(containerScope,config,wspathSpec,requestPath);
             }
             return new EndpointInstance(endpoint,config,metadata);
         }
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/PathParamServerEndpointConfig.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/PathParamServerEndpointConfig.java
index d5a906d..d709a00 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/PathParamServerEndpointConfig.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/PathParamServerEndpointConfig.java
@@ -23,6 +23,7 @@
 
 import javax.websocket.server.ServerEndpointConfig;
 
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 import org.eclipse.jetty.websocket.jsr356.server.pathmap.WebSocketPathSpec;
 
 /**
@@ -32,9 +33,9 @@
 {
     private final Map<String, String> pathParamMap;
 
-    public PathParamServerEndpointConfig(ServerEndpointConfig config, WebSocketPathSpec pathSpec, String requestPath)
+    public PathParamServerEndpointConfig(WebSocketContainerScope containerScope, ServerEndpointConfig config, WebSocketPathSpec pathSpec, String requestPath)
     {
-        super(config);
+        super(containerScope, config);
 
         Map<String, String> pathMap = pathSpec.getPathParams(requestPath);
         pathParamMap = new HashMap<String, String>();
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ServerContainer.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ServerContainer.java
index f8829ee..7fdba04 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ServerContainer.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/ServerContainer.java
@@ -18,6 +18,8 @@
 
 package org.eclipse.jetty.websocket.jsr356.server;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.Executor;
 
 import javax.websocket.DeploymentException;
@@ -43,16 +45,19 @@
 
     private final MappedWebSocketCreator mappedCreator;
     private final WebSocketServerFactory webSocketServerFactory;
+    private List<Class<?>> deferredEndpointClasses;
+    private List<ServerEndpointConfig> deferredEndpointConfigs;
 
     public ServerContainer(MappedWebSocketCreator creator, WebSocketServerFactory factory, Executor executor)
     {
-        super(executor);
+        super(factory);
         this.mappedCreator = creator;
         this.webSocketServerFactory = factory;
         EventDriverFactory eventDriverFactory = this.webSocketServerFactory.getEventDriverFactory();
         eventDriverFactory.addImplementation(new JsrServerEndpointImpl());
         eventDriverFactory.addImplementation(new JsrServerExtendsEndpointImpl());
         this.webSocketServerFactory.addSessionFactory(new JsrSessionFactory(this,this));
+        addBean(webSocketServerFactory);
     }
     
     public EndpointInstance newClientEndpointInstance(Object endpoint, ServerEndpointConfig config, String path)
@@ -67,7 +72,7 @@
             }
             else
             {
-                cec = new BasicServerEndpointConfig(endpoint.getClass(),path);
+                cec = new BasicServerEndpointConfig(this,endpoint.getClass(),path);
             }
         }
         return new EndpointInstance(endpoint,cec,metadata);
@@ -76,25 +81,73 @@
     @Override
     public void addEndpoint(Class<?> endpointClass) throws DeploymentException
     {
-        ServerEndpointMetadata metadata = getServerEndpointMetadata(endpointClass,null);
-        addEndpoint(metadata);
+        if (isStarted() || isStarting())
+        {
+            ServerEndpointMetadata metadata = getServerEndpointMetadata(endpointClass,null);
+            addEndpoint(metadata);
+        }
+        else
+        {
+            if (deferredEndpointClasses == null)
+            {
+                deferredEndpointClasses = new ArrayList<Class<?>>();
+            }
+            deferredEndpointClasses.add(endpointClass);
+        }
     }
 
-    public void addEndpoint(ServerEndpointMetadata metadata) throws DeploymentException
+    private void addEndpoint(ServerEndpointMetadata metadata) throws DeploymentException
     {
-        JsrCreator creator = new JsrCreator(metadata,webSocketServerFactory.getExtensionFactory());
+        JsrCreator creator = new JsrCreator(this,metadata,webSocketServerFactory.getExtensionFactory());
         mappedCreator.addMapping(new WebSocketPathSpec(metadata.getPath()),creator);
     }
 
     @Override
     public void addEndpoint(ServerEndpointConfig config) throws DeploymentException
     {
-        if (LOG.isDebugEnabled())
+        if (isStarted() || isStarting())
         {
-            LOG.debug("addEndpoint({}) path={} endpoint={}",config,config.getPath(),config.getEndpointClass());
+            if (LOG.isDebugEnabled())
+            {
+                LOG.debug("addEndpoint({}) path={} endpoint={}",config,config.getPath(),config.getEndpointClass());
+            }
+            ServerEndpointMetadata metadata = getServerEndpointMetadata(config.getEndpointClass(),config);
+            addEndpoint(metadata);
         }
-        ServerEndpointMetadata metadata = getServerEndpointMetadata(config.getEndpointClass(),config);
-        addEndpoint(metadata);
+        else
+        {
+            if (deferredEndpointConfigs == null)
+            {
+                deferredEndpointConfigs = new ArrayList<ServerEndpointConfig>();
+            }
+            deferredEndpointConfigs.add(config);
+        }
+    }
+    
+    @Override
+    protected void doStart() throws Exception
+    {
+        // Proceed with Normal Startup
+        super.doStart();
+        
+        // Process Deferred Endpoints
+        if (deferredEndpointClasses != null)
+        {
+            for (Class<?> endpointClass : deferredEndpointClasses)
+            {
+                addEndpoint(endpointClass);
+            }
+            deferredEndpointClasses.clear();
+        }
+        
+        if (deferredEndpointConfigs != null)
+        {
+            for (ServerEndpointConfig config : deferredEndpointConfigs)
+            {
+                addEndpoint(config);
+            }
+            deferredEndpointConfigs.clear();
+        }
     }
 
     public ServerEndpointMetadata getServerEndpointMetadata(final Class<?> endpoint, final ServerEndpointConfig config) throws DeploymentException
@@ -105,7 +158,7 @@
         if (anno != null)
         {
             // Annotated takes precedence here
-            AnnotatedServerEndpointMetadata ametadata = new AnnotatedServerEndpointMetadata(endpoint,config);
+            AnnotatedServerEndpointMetadata ametadata = new AnnotatedServerEndpointMetadata(this,endpoint,config);
             AnnotatedEndpointScanner<ServerEndpoint, ServerEndpointConfig> scanner = new AnnotatedEndpointScanner<>(ametadata);
             metadata = ametadata;
             scanner.scan();
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer.java
index 708d946..7592c46 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer.java
@@ -20,6 +20,7 @@
 
 import java.util.HashSet;
 import java.util.Set;
+
 import javax.servlet.ServletContainerInitializer;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
@@ -32,6 +33,7 @@
 
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.util.DecoratedObjectFactory;
 import org.eclipse.jetty.util.TypeUtil;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
@@ -49,6 +51,10 @@
      * Jetty Native approach.
      * <p>
      * Note: this will add the Upgrade filter to the existing list, with no regard for order.  It will just be tacked onto the end of the list.
+     * 
+     * @param context the servlet context handler
+     * @return the created websocket server container
+     * @throws ServletException if unable to create the websocket server container
      */
     public static ServerContainer configureContext(ServletContextHandler context) throws ServletException
     {
@@ -69,6 +75,11 @@
      * Servlet 3.1 approach.
      * <p>
      * This will use Servlet 3.1 techniques on the {@link ServletContext} to add a filter at the start of the filter chain.
+     * 
+     * @param context the servlet context
+     * @param jettyContext the jetty servlet context handler
+     * @return the created websocket server container
+     * @throws ServletException if unable to create the websocket server container
      */
     public static ServerContainer configureContext(ServletContext context, ServletContextHandler jettyContext) throws ServletException
     {
@@ -163,7 +174,16 @@
 
             // Store a reference to the ServerContainer per javax.websocket spec 1.0 final section 6.4 Programmatic Server Deployment
             context.setAttribute(javax.websocket.server.ServerContainer.class.getName(),jettyContainer);
-
+            
+            // Establish the DecoratedObjectFactory thread local 
+            // for various ServiceLoader initiated components to use.
+            DecoratedObjectFactory instantiator = (DecoratedObjectFactory)context.getAttribute(DecoratedObjectFactory.ATTR);
+            if (instantiator == null)
+            {
+                LOG.info("Using WebSocket local DecoratedObjectFactory - none found in ServletContext");
+                instantiator = new DecoratedObjectFactory();
+            }
+            
             if (LOG.isDebugEnabled())
             {
                 LOG.debug("Found {} classes",c.size());
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/WebSocketPathSpec.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/WebSocketPathSpec.java
index bddf581..014466a 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/WebSocketPathSpec.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/WebSocketPathSpec.java
@@ -29,6 +29,9 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+
 import org.eclipse.jetty.util.TypeUtil;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/resources/META-INF/services/javax.websocket.server.ServerEndpointConfig$Configurator b/jetty-websocket/javax-websocket-server-impl/src/main/resources/META-INF/services/javax.websocket.server.ServerEndpointConfig$Configurator
index 57e3ef3..7f67aa0 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/main/resources/META-INF/services/javax.websocket.server.ServerEndpointConfig$Configurator
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/resources/META-INF/services/javax.websocket.server.ServerEndpointConfig$Configurator
@@ -1 +1 @@
-org.eclipse.jetty.websocket.jsr356.server.BasicServerEndpointConfigurator
\ No newline at end of file
+org.eclipse.jetty.websocket.jsr356.server.ContainerDefaultConfigurator
\ No newline at end of file
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointTest.java
index 2c510e5..17de44c 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointTest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/AnnotatedServerEndpointTest.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.websocket.jsr356.server;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.containsString;
 
 import java.io.File;
 import java.net.URI;
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/BasicEndpointTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/BasicEndpointTest.java
index 05f7284..001448f 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/BasicEndpointTest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/BasicEndpointTest.java
@@ -35,7 +35,7 @@
 import org.junit.Test;
 
 /**
- * Example of an {@link Endpoint} extended echo server added programmatically via the
+ * Example of an {@link javax.websocket.Endpoint} extended echo server added programmatically via the
  * {@link ServerContainer#addEndpoint(javax.websocket.server.ServerEndpointConfig)}
  */
 public class BasicEndpointTest
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/BinaryStreamTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/BinaryStreamTest.java
index 790c0cf..05c330a 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/BinaryStreamTest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/BinaryStreamTest.java
@@ -26,6 +26,7 @@
 import java.util.Random;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+
 import javax.websocket.ClientEndpoint;
 import javax.websocket.ContainerProvider;
 import javax.websocket.OnMessage;
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ConfiguratorTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ConfiguratorTest.java
index 0678367..8cccdab 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ConfiguratorTest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ConfiguratorTest.java
@@ -18,7 +18,8 @@
 
 package org.eclipse.jetty.websocket.jsr356.server;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.nullValue;
 
 import java.io.PrintWriter;
 import java.io.StringWriter;
@@ -50,6 +51,7 @@
 import org.eclipse.jetty.websocket.common.frames.TextFrame;
 import org.eclipse.jetty.websocket.common.test.BlockheadClient;
 import org.eclipse.jetty.websocket.common.test.HttpResponse;
+import org.eclipse.jetty.websocket.common.test.IBlockheadClient;
 import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
 import org.junit.AfterClass;
 import org.junit.Assert;
@@ -302,7 +304,7 @@
     {
         URI uri = baseServerUri.resolve("/empty");
 
-        try (BlockheadClient client = new BlockheadClient(uri))
+        try (IBlockheadClient client = new BlockheadClient(uri))
         {
             client.addExtensions("identity");
             client.connect();
@@ -317,7 +319,7 @@
     {
         URI uri = baseServerUri.resolve("/no-extensions");
 
-        try (BlockheadClient client = new BlockheadClient(uri))
+        try (IBlockheadClient client = new BlockheadClient(uri))
         {
             client.addExtensions("identity");
             client.connect();
@@ -332,7 +334,7 @@
     {
         URI uri = baseServerUri.resolve("/capture-request-headers");
 
-        try (BlockheadClient client = new BlockheadClient(uri))
+        try (IBlockheadClient client = new BlockheadClient(uri))
         {
             client.addHeader("X-Dummy: Bogus\r\n");
             client.connect();
@@ -352,7 +354,7 @@
         URI uri = baseServerUri.resolve("/unique-user-props");
 
         // First request
-        try (BlockheadClient client = new BlockheadClient(uri))
+        try (IBlockheadClient client = new BlockheadClient(uri))
         {
             client.connect();
             client.sendStandardRequest();
@@ -365,7 +367,7 @@
         }
         
         // Second request
-        try (BlockheadClient client = new BlockheadClient(uri))
+        try (IBlockheadClient client = new BlockheadClient(uri))
         {
             client.connect();
             client.sendStandardRequest();
@@ -389,7 +391,7 @@
         URI uri = baseServerUri.resolve("/addr");
 
         // First request
-        try (BlockheadClient client = new BlockheadClient(uri))
+        try (IBlockheadClient client = new BlockheadClient(uri))
         {
             client.connect();
             client.sendStandardRequest();
@@ -416,6 +418,7 @@
     
     /**
      * Test of Sec-WebSocket-Protocol, as seen in RFC-6455, 1 protocol
+     * @throws Exception on test failure
      */
     @Test
     public void testProtocol_Single() throws Exception
@@ -423,7 +426,7 @@
         URI uri = baseServerUri.resolve("/protocols");
         ProtocolsConfigurator.seenProtocols.set(null);
 
-        try (BlockheadClient client = new BlockheadClient(uri))
+        try (IBlockheadClient client = new BlockheadClient(uri))
         {
             client.addHeader("Sec-WebSocket-Protocol: echo\r\n");
             client.connect();
@@ -439,6 +442,7 @@
     
     /**
      * Test of Sec-WebSocket-Protocol, as seen in RFC-6455, 3 protocols
+     * @throws Exception on test failure
      */
     @Test
     public void testProtocol_Triple() throws Exception
@@ -446,7 +450,7 @@
         URI uri = baseServerUri.resolve("/protocols");
         ProtocolsConfigurator.seenProtocols.set(null);
 
-        try (BlockheadClient client = new BlockheadClient(uri))
+        try (IBlockheadClient client = new BlockheadClient(uri))
         {
             client.addHeader("Sec-WebSocket-Protocol: echo, chat, status\r\n");
             client.connect();
@@ -462,6 +466,7 @@
     
     /**
      * Test of Sec-WebSocket-Protocol, using all lowercase header
+     * @throws Exception on test failure
      */
     @Test
     public void testProtocol_LowercaseHeader() throws Exception
@@ -469,7 +474,7 @@
         URI uri = baseServerUri.resolve("/protocols");
         ProtocolsConfigurator.seenProtocols.set(null);
 
-        try (BlockheadClient client = new BlockheadClient(uri))
+        try (IBlockheadClient client = new BlockheadClient(uri))
         {
             client.addHeader("sec-websocket-protocol: echo, chat, status\r\n");
             client.connect();
@@ -485,6 +490,7 @@
     
     /**
      * Test of Sec-WebSocket-Protocol, using non-spec case header
+     * @throws Exception on test failure
      */
     @Test
     public void testProtocol_AltHeaderCase() throws Exception
@@ -492,7 +498,7 @@
         URI uri = baseServerUri.resolve("/protocols");
         ProtocolsConfigurator.seenProtocols.set(null);
 
-        try (BlockheadClient client = new BlockheadClient(uri))
+        try (IBlockheadClient client = new BlockheadClient(uri))
         {
             client.addHeader("Sec-Websocket-Protocol: echo, chat, status\r\n");
             client.connect();
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/DummyConnection.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/DummyConnection.java
deleted file mode 100644
index dc03d2a..0000000
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/DummyConnection.java
+++ /dev/null
@@ -1,162 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.websocket.jsr356.server;
-
-import java.net.InetSocketAddress;
-import java.util.concurrent.Executor;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.websocket.api.BatchMode;
-import org.eclipse.jetty.websocket.api.SuspendToken;
-import org.eclipse.jetty.websocket.api.WebSocketPolicy;
-import org.eclipse.jetty.websocket.api.WriteCallback;
-import org.eclipse.jetty.websocket.api.extensions.Frame;
-import org.eclipse.jetty.websocket.api.extensions.IncomingFrames;
-import org.eclipse.jetty.websocket.common.LogicalConnection;
-import org.eclipse.jetty.websocket.common.WebSocketSession;
-import org.eclipse.jetty.websocket.common.io.IOState;
-
-public class DummyConnection implements LogicalConnection
-{
-    private static final Logger LOG = Log.getLogger(DummyConnection.class);
-    private IOState iostate;
-
-    public DummyConnection()
-    {
-        this.iostate = new IOState();
-    }
-
-    @Override
-    public void close()
-    {
-    }
-
-    @Override
-    public void close(int statusCode, String reason)
-    {
-    }
-
-    @Override
-    public void disconnect()
-    {
-    }
-
-    @Override
-    public ByteBufferPool getBufferPool()
-    {
-        return null;
-    }
-
-    @Override
-    public Executor getExecutor()
-    {
-        return null;
-    }
-
-    @Override
-    public long getIdleTimeout()
-    {
-        return 0;
-    }
-
-    @Override
-    public IOState getIOState()
-    {
-        return this.iostate;
-    }
-
-    @Override
-    public InetSocketAddress getLocalAddress()
-    {
-        return null;
-    }
-
-    @Override
-    public long getMaxIdleTimeout()
-    {
-        return 0;
-    }
-
-    @Override
-    public WebSocketPolicy getPolicy()
-    {
-        return null;
-    }
-
-    @Override
-    public InetSocketAddress getRemoteAddress()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public WebSocketSession getSession()
-    {
-        return null;
-    }
-
-    @Override
-    public boolean isOpen()
-    {
-        return false;
-    }
-
-    @Override
-    public boolean isReading()
-    {
-        return false;
-    }
-
-    @Override
-    public void outgoingFrame(Frame frame, WriteCallback callback, BatchMode batchMode)
-    {
-        callback.writeSuccess();
-    }
-
-    @Override
-    public void resume()
-    {
-    }
-
-    @Override
-    public void setMaxIdleTimeout(long ms)
-    {
-    }
-
-    @Override
-    public void setNextIncomingFrames(IncomingFrames incoming)
-    {
-        if (LOG.isDebugEnabled())
-            LOG.debug("setNextIncomingFrames({})",incoming);
-    }
-
-    @Override
-    public void setSession(WebSocketSession session)
-    {
-    }
-
-    @Override
-    public SuspendToken suspend()
-    {
-        return null;
-    }
-}
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/IdleTimeoutTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/IdleTimeoutTest.java
index 101ddfb..42d7ce0 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/IdleTimeoutTest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/IdleTimeoutTest.java
@@ -18,6 +18,10 @@
 
 package org.eclipse.jetty.websocket.jsr356.server;
 
+import static org.hamcrest.Matchers.empty;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
 import java.io.IOException;
 import java.net.URI;
 import java.util.Queue;
@@ -42,10 +46,6 @@
 import org.junit.Rule;
 import org.junit.Test;
 
-import static org.hamcrest.Matchers.empty;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
 public class IdleTimeoutTest
 {
     private static final Logger LOG = Log.getLogger(IdleTimeoutTest.class);
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/JettyServerEndpointConfiguratorTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/JettyServerEndpointConfiguratorTest.java
index 2f1dba9..1890524 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/JettyServerEndpointConfiguratorTest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/JettyServerEndpointConfiguratorTest.java
@@ -48,6 +48,6 @@
 
         ServerEndpointConfig.Configurator configr = iter.next();
         assertThat("Configurator",configr,notNullValue());
-        assertThat("COnfigurator type",configr,instanceOf(BasicServerEndpointConfigurator.class));
+        assertThat("Configurator type",configr,instanceOf(ContainerDefaultConfigurator.class));
     }
 }
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/JsrBatchModeTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/JsrBatchModeTest.java
index bf92e70..c03d3c9 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/JsrBatchModeTest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/JsrBatchModeTest.java
@@ -22,6 +22,7 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
+
 import javax.websocket.ClientEndpointConfig;
 import javax.websocket.ContainerProvider;
 import javax.websocket.Endpoint;
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/MemoryUsageTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/MemoryUsageTest.java
index 854f28e..ccf9beb 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/MemoryUsageTest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/MemoryUsageTest.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.websocket.jsr356.server;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.lessThan;
 
 import java.lang.management.ManagementFactory;
 import java.lang.management.MemoryMXBean;
@@ -114,8 +114,8 @@
         long heapUsed = heapAfter.getUsed() - heapBefore.getUsed();
         long nonHeapUsed = nonHeapAfter.getUsed() - nonHeapBefore.getUsed();
 
-//        System.out.println("heapUsed = " + heapUsed);
-//        System.out.println("nonHeapUsed = " + nonHeapUsed);
+        System.out.println("heapUsed = " + heapUsed);
+        System.out.println("nonHeapUsed = " + nonHeapUsed);
 //        new CountDownLatch(1).await();
 
         // Assume no more than 25 KiB per session pair (client and server).
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/OnPartialTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/OnPartialTest.java
index 3f1affd..30d4549 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/OnPartialTest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/OnPartialTest.java
@@ -18,9 +18,13 @@
 
 package org.eclipse.jetty.websocket.jsr356.server;
 
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
+
 import javax.websocket.server.ServerEndpoint;
 import javax.websocket.server.ServerEndpointConfig;
 
@@ -31,6 +35,9 @@
 import org.eclipse.jetty.websocket.common.events.EventDriverImpl;
 import org.eclipse.jetty.websocket.common.frames.ContinuationFrame;
 import org.eclipse.jetty.websocket.common.frames.TextFrame;
+import org.eclipse.jetty.websocket.common.scopes.SimpleContainerScope;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
+import org.eclipse.jetty.websocket.common.test.DummyConnection;
 import org.eclipse.jetty.websocket.jsr356.ClientContainer;
 import org.eclipse.jetty.websocket.jsr356.JsrSession;
 import org.eclipse.jetty.websocket.jsr356.annotations.AnnotatedEndpointScanner;
@@ -41,9 +48,6 @@
 import org.junit.Test;
 import org.junit.rules.TestName;
 
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-
 public class OnPartialTest
 {
     @Rule
@@ -65,8 +69,11 @@
         Class<?> endpoint = websocket.getClass();
         ServerEndpoint anno = endpoint.getAnnotation(ServerEndpoint.class);
         Assert.assertThat("Endpoint: " + endpoint + " should be annotated with @ServerEndpoint",anno,notNullValue());
-        ServerEndpointConfig config = new BasicServerEndpointConfig(endpoint,"/");
-        AnnotatedServerEndpointMetadata metadata = new AnnotatedServerEndpointMetadata(endpoint,config);
+        
+        WebSocketContainerScope containerScope = new SimpleContainerScope(policy);
+        
+        ServerEndpointConfig config = new BasicServerEndpointConfig(containerScope,endpoint,"/");
+        AnnotatedServerEndpointMetadata metadata = new AnnotatedServerEndpointMetadata(containerScope,endpoint,config);
         AnnotatedEndpointScanner<ServerEndpoint, ServerEndpointConfig> scanner = new AnnotatedEndpointScanner<>(metadata);
         scanner.scan();
         EndpointInstance ei = new EndpointInstance(websocket,config,metadata);
@@ -79,7 +86,7 @@
         DummyConnection connection = new DummyConnection();
         ClientContainer container = new ClientContainer();
         @SuppressWarnings("resource")
-        JsrSession session = new JsrSession(requestURI,driver,connection,container,id);
+        JsrSession session = new JsrSession(container,id,requestURI,driver,connection);
         session.setPolicy(policy);
         session.open();
         return driver;
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/PingPongTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/PingPongTest.java
index 5ed1cbb..70c5f5e 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/PingPongTest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/PingPongTest.java
@@ -18,7 +18,8 @@
 
 package org.eclipse.jetty.websocket.jsr356.server;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.containsString;
 
 import java.io.File;
 import java.net.URI;
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ServerAnnotatedEndpointScanner_GoodSignaturesTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ServerAnnotatedEndpointScanner_GoodSignaturesTest.java
index 2718f42..09e7fdb 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ServerAnnotatedEndpointScanner_GoodSignaturesTest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ServerAnnotatedEndpointScanner_GoodSignaturesTest.java
@@ -34,6 +34,9 @@
 import javax.websocket.server.ServerEndpoint;
 import javax.websocket.server.ServerEndpointConfig;
 
+import org.eclipse.jetty.websocket.api.WebSocketPolicy;
+import org.eclipse.jetty.websocket.common.scopes.SimpleContainerScope;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 import org.eclipse.jetty.websocket.jsr356.annotations.AnnotatedEndpointScanner;
 import org.eclipse.jetty.websocket.jsr356.annotations.JsrCallable;
 import org.eclipse.jetty.websocket.jsr356.server.samples.BasicBinaryMessageByteBufferSocket;
@@ -182,7 +185,8 @@
     @Test
     public void testScan_Basic() throws Exception
     {
-        AnnotatedServerEndpointMetadata metadata = new AnnotatedServerEndpointMetadata(testcase.pojo,null);
+        WebSocketContainerScope container = new SimpleContainerScope(WebSocketPolicy.newClientPolicy());
+        AnnotatedServerEndpointMetadata metadata = new AnnotatedServerEndpointMetadata(container,testcase.pojo,null);
         AnnotatedEndpointScanner<ServerEndpoint, ServerEndpointConfig> scanner = new AnnotatedEndpointScanner<>(metadata);
         scanner.scan();
 
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ServerAnnotatedEndpointScanner_InvalidSignaturesTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ServerAnnotatedEndpointScanner_InvalidSignaturesTest.java
index c01f316..aa9f032 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ServerAnnotatedEndpointScanner_InvalidSignaturesTest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ServerAnnotatedEndpointScanner_InvalidSignaturesTest.java
@@ -18,10 +18,13 @@
 
 package org.eclipse.jetty.websocket.jsr356.server;
 
+import static org.hamcrest.Matchers.containsString;
+
 import java.lang.annotation.Annotation;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+
 import javax.websocket.DeploymentException;
 import javax.websocket.OnClose;
 import javax.websocket.OnError;
@@ -31,7 +34,10 @@
 
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.websocket.api.WebSocketPolicy;
 import org.eclipse.jetty.websocket.common.events.annotated.InvalidSignatureException;
+import org.eclipse.jetty.websocket.common.scopes.SimpleContainerScope;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 import org.eclipse.jetty.websocket.jsr356.annotations.AnnotatedEndpointScanner;
 import org.eclipse.jetty.websocket.jsr356.server.samples.InvalidCloseIntSocket;
 import org.eclipse.jetty.websocket.jsr356.server.samples.InvalidErrorErrorSocket;
@@ -46,8 +52,6 @@
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
-import static org.hamcrest.Matchers.containsString;
-
 /**
  * Test {@link AnnotatedEndpointScanner} against various simple, 1 method {@link ServerEndpoint} annotated classes with invalid signatures.
  */
@@ -93,7 +97,8 @@
     @Test
     public void testScan_InvalidSignature() throws DeploymentException
     {
-        AnnotatedServerEndpointMetadata metadata = new AnnotatedServerEndpointMetadata(pojo,null);
+        WebSocketContainerScope container = new SimpleContainerScope(WebSocketPolicy.newClientPolicy());
+        AnnotatedServerEndpointMetadata metadata = new AnnotatedServerEndpointMetadata(container,pojo,null);
         AnnotatedEndpointScanner<ServerEndpoint,ServerEndpointConfig> scanner = new AnnotatedEndpointScanner<>(metadata);
 
         try
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/SessionTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/SessionTest.java
index 06a4600..7458723 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/SessionTest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/SessionTest.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.websocket.jsr356.server;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.is;
 
 import java.net.URI;
 import java.util.ArrayList;
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/StreamTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/StreamTest.java
index ff96561..ca51ec5 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/StreamTest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/StreamTest.java
@@ -18,6 +18,9 @@
 
 package org.eclipse.jetty.websocket.jsr356.server;
 
+import static org.hamcrest.Matchers.equalToIgnoringCase;
+import static org.hamcrest.Matchers.is;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
@@ -68,9 +71,6 @@
 import org.junit.Rule;
 import org.junit.Test;
 
-import static org.hamcrest.Matchers.equalToIgnoringCase;
-import static org.hamcrest.Matchers.is;
-
 public class StreamTest
 {
     private static final Logger LOG = Log.getLogger(StreamTest.class);
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/TextStreamTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/TextStreamTest.java
index ecc948a..11f5a0d 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/TextStreamTest.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/TextStreamTest.java
@@ -25,6 +25,7 @@
 import java.util.Random;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+
 import javax.websocket.ClientEndpoint;
 import javax.websocket.ContainerProvider;
 import javax.websocket.OnMessage;
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/TrackingSocket.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/TrackingSocket.java
index 981884c..8683d53 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/TrackingSocket.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/TrackingSocket.java
@@ -18,8 +18,13 @@
 
 package org.eclipse.jetty.websocket.jsr356.server;
 
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+
 import javax.websocket.CloseReason;
 import javax.websocket.CloseReason.CloseCode;
 
@@ -28,10 +33,6 @@
 import org.eclipse.jetty.util.log.Logger;
 import org.junit.Assert;
 
-import static org.hamcrest.Matchers.greaterThanOrEqualTo;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-
 /**
  * Abstract base socket used for tracking state and events within the socket for testing reasons.
  */
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/WSServer.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/WSServer.java
index dedd13f..b8bbd85 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/WSServer.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/WSServer.java
@@ -18,6 +18,8 @@
 
 package org.eclipse.jetty.websocket.jsr356.server;
 
+import static org.hamcrest.Matchers.notNullValue;
+
 import java.io.File;
 import java.io.IOException;
 import java.net.MalformedURLException;
@@ -47,8 +49,6 @@
 import org.eclipse.jetty.webapp.WebXmlConfiguration;
 import org.junit.Assert;
 
-import static org.hamcrest.Matchers.notNullValue;
-
 /**
  * Utility to build out exploded directory WebApps, in the /target/tests/ directory, for testing out servers that use javax.websocket endpoints.
  * <p>
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/browser/JsrBrowserSocket.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/browser/JsrBrowserSocket.java
index ace05d8..d3b5df2 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/browser/JsrBrowserSocket.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/browser/JsrBrowserSocket.java
@@ -23,6 +23,7 @@
 import java.util.Calendar;
 import java.util.Locale;
 import java.util.Random;
+
 import javax.websocket.CloseReason;
 import javax.websocket.OnClose;
 import javax.websocket.OnMessage;
@@ -132,7 +133,7 @@
                 }
                 case "many":
                 {
-                    String parts[] = val.split(",");
+                    String parts[] = StringUtil.csvSplit(val);
                     int size = Integer.parseInt(parts[0]);
                     int count = Integer.parseInt(parts[1]);
 
@@ -141,7 +142,7 @@
                 }
                 case "manythreads":
                 {
-                    String parts[] = val.split(",");
+                    String parts[] = StringUtil.csvSplit(val);
                     int threadCount = Integer.parseInt(parts[0]);
                     int size = Integer.parseInt(parts[1]);
                     int count = Integer.parseInt(parts[2]);
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidCloseIntSocket.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidCloseIntSocket.java
index 956d3f4..af20c58 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidCloseIntSocket.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidCloseIntSocket.java
@@ -28,6 +28,7 @@
 {
     /**
      * Invalid Close Method Declaration (parameter type int)
+     * @param statusCode the status code
      */
     @OnClose
     public void onClose(int statusCode)
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidErrorErrorSocket.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidErrorErrorSocket.java
index 1f38f40..a3fe92c 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidErrorErrorSocket.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidErrorErrorSocket.java
@@ -28,6 +28,7 @@
 {
     /**
      * Invalid Error Method Declaration (parameter type Error)
+     * @param error the error
      */
     @OnError
     public void onError(Error error)
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidErrorExceptionSocket.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidErrorExceptionSocket.java
index c2ec17a..dce13d4 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidErrorExceptionSocket.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidErrorExceptionSocket.java
@@ -28,6 +28,7 @@
 {
     /**
      * Invalid Error Method Declaration (parameter type Exception)
+     * @param e the exception
      */
     @OnError
     public void onError(Exception e)
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidErrorIntSocket.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidErrorIntSocket.java
index f6c2a34..48f45a3 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidErrorIntSocket.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidErrorIntSocket.java
@@ -28,6 +28,7 @@
 {
     /**
      * Invalid Error Method Declaration (parameter type int)
+     * @param errorCount the error count
      */
     @OnError
     public void onError(int errorCount)
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidOpenCloseReasonSocket.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidOpenCloseReasonSocket.java
index 4181359..0e97246 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidOpenCloseReasonSocket.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidOpenCloseReasonSocket.java
@@ -29,6 +29,7 @@
 {
     /**
      * Invalid Open Method Declaration (parameter type CloseReason)
+     * @param reason the close reason
      */
     @OnOpen
     public void onOpen(CloseReason reason)
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidOpenIntSocket.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidOpenIntSocket.java
index fa87b65..91fabea 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidOpenIntSocket.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidOpenIntSocket.java
@@ -28,6 +28,7 @@
 {
     /**
      * Invalid Open Method Declaration (parameter type int)
+     * @param value the value
      */
     @OnOpen
     public void onOpen(int value)
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidOpenSessionIntSocket.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidOpenSessionIntSocket.java
index 9739b97..bed3f8f 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidOpenSessionIntSocket.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/InvalidOpenSessionIntSocket.java
@@ -29,6 +29,8 @@
 {
     /**
      * Invalid Open Method Declaration (parameter of type int)
+     * @param session the sesion
+     * @param count the count
      */
     @OnOpen
     public void onOpen(Session session, int count)
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoEndpointConfigContextListener.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoEndpointConfigContextListener.java
index fac2bff..94f58be 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoEndpointConfigContextListener.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoEndpointConfigContextListener.java
@@ -25,7 +25,7 @@
 import javax.websocket.server.ServerEndpointConfig;
 
 /**
- * Example of adding a server WebSocket (extending {@link Endpoint}) programmatically via config
+ * Example of adding a server WebSocket (extending {@link javax.websocket.Endpoint}) programmatically via config
  */
 public class BasicEchoEndpointConfigContextListener implements ServletContextListener
 {
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoEndpointContextListener.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoEndpointContextListener.java
index 89281e9..3ac5f5c 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoEndpointContextListener.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoEndpointContextListener.java
@@ -27,7 +27,7 @@
 import org.eclipse.jetty.websocket.jsr356.server.samples.pong.PongMessageEndpoint;
 
 /**
- * Example of adding a server WebSocket (extending {@link Endpoint}) programmatically directly.
+ * Example of adding a server WebSocket (extending {@link javax.websocket.Endpoint}) programmatically directly.
  * <p>
  * NOTE: this shouldn't work as the endpoint has no path associated with it.
  */
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoSocketConfigContextListener.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoSocketConfigContextListener.java
index 13185bc..a6c9fb5 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoSocketConfigContextListener.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoSocketConfigContextListener.java
@@ -25,7 +25,7 @@
 import javax.websocket.server.ServerEndpointConfig;
 
 /**
- * Example of adding a server socket (which extends {@link Endpoint}) programmatically via the {@link ServerContainer#addEndpoint(ServerEndpointConfig)}
+ * Example of adding a server socket (which extends {@link javax.websocket.Endpoint}) programmatically via the {@link ServerContainer#addEndpoint(ServerEndpointConfig)}
  */
 public class BasicEchoSocketConfigContextListener implements ServletContextListener
 {
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/LargeEchoDefaultSocket.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/LargeEchoDefaultSocket.java
index 6364b6c..13415b1 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/LargeEchoDefaultSocket.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/LargeEchoDefaultSocket.java
@@ -20,6 +20,7 @@
 
 import javax.websocket.OnMessage;
 import javax.websocket.Session;
+import javax.websocket.WebSocketContainer;
 import javax.websocket.server.ServerEndpoint;
 
 /**
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/idletimeout/IdleTimeoutContextListener.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/idletimeout/IdleTimeoutContextListener.java
index dd2194a..5dbc69c 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/idletimeout/IdleTimeoutContextListener.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/idletimeout/IdleTimeoutContextListener.java
@@ -25,7 +25,7 @@
 import javax.websocket.server.ServerEndpointConfig;
 
 /**
- * Example of adding a server WebSocket (extending {@link Endpoint}) programmatically via config
+ * Example of adding a server WebSocket (extending {@link javax.websocket.Endpoint}) programmatically via config
  */
 public class IdleTimeoutContextListener implements ServletContextListener
 {
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/pong/PongSocket.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/pong/PongSocket.java
index 013908f..06de346 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/pong/PongSocket.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/pong/PongSocket.java
@@ -19,6 +19,7 @@
 package org.eclipse.jetty.websocket.jsr356.server.samples.pong;
 
 import java.nio.charset.StandardCharsets;
+
 import javax.websocket.EndpointConfig;
 import javax.websocket.OnMessage;
 import javax.websocket.OnOpen;
diff --git a/jetty-websocket/pom.xml b/jetty-websocket/pom.xml
index 5637948..465e5ea 100644
--- a/jetty-websocket/pom.xml
+++ b/jetty-websocket/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <artifactId>jetty-project</artifactId>
         <groupId>org.eclipse.jetty</groupId>
-        <version>9.2.14-SNAPSHOT</version>
+        <version>9.3.6-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
@@ -33,34 +33,6 @@
                 </configuration>
             </plugin>
             <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>manifest</goal>
-                        </goals>
-                        <configuration>
-                            <instructions>
-                                <Export-Package>${bundle-symbolic-name}.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"</Export-Package>
-                                <Import-Package>javax.servlet.*;version="[3.1,4.0)",org.eclipse.jetty.*;version="[9.0,10.0)",*</Import-Package>
-                                <_nouses>true</_nouses>
-                            </instructions>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <configuration>
-                    <archive>
-                        <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-                    </archive>
-                </configuration>
-            </plugin>
-            <plugin>
                 <groupId>org.codehaus.mojo</groupId>
                 <artifactId>clirr-maven-plugin</artifactId>
                 <version>2.5</version>
diff --git a/jetty-websocket/websocket-api/pom.xml b/jetty-websocket/websocket-api/pom.xml
index 9e4e1e3..968fb7c 100644
--- a/jetty-websocket/websocket-api/pom.xml
+++ b/jetty-websocket/websocket-api/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <groupId>org.eclipse.jetty.websocket</groupId>
         <artifactId>websocket-parent</artifactId>
-        <version>9.2.14-SNAPSHOT</version>
+        <version>9.3.6-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/BatchMode.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/BatchMode.java
index c92c776..530cb0b 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/BatchMode.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/BatchMode.java
@@ -18,8 +18,10 @@
 
 package org.eclipse.jetty.websocket.api;
 
+import org.eclipse.jetty.websocket.api.extensions.OutgoingFrames;
+
 /**
- * The possible batch modes when invoking {@link OutgoingFrames#outgoingFrame(Frame, WriteCallback, BatchMode)}.
+ * The possible batch modes when invoking {@link OutgoingFrames#outgoingFrame(org.eclipse.jetty.websocket.api.extensions.Frame, WriteCallback, BatchMode)}.
  */
 public enum BatchMode
 {
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/InvalidWebSocketException.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/InvalidWebSocketException.java
index 2dfeb85..f6bb061 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/InvalidWebSocketException.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/InvalidWebSocketException.java
@@ -18,6 +18,8 @@
 
 package org.eclipse.jetty.websocket.api;
 
+import org.eclipse.jetty.websocket.api.annotations.WebSocket;
+
 /**
  * Indicating that the provided Class is not a valid WebSocket as defined by the API.
  * <p>
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/RemoteEndpoint.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/RemoteEndpoint.java
index bbf9655..990253f 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/RemoteEndpoint.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/RemoteEndpoint.java
@@ -31,11 +31,14 @@
      * 
      * @param data
      *            the message to be sent
+     * @throws IOException
+     *             if unable to send the bytes
      */
     void sendBytes(ByteBuffer data) throws IOException;
 
     /**
-     * Initiates the asynchronous transmission of a binary message. This method returns before the message is transmitted. Developers may use the returned
+     * Initiates the asynchronous transmission of a binary message. This method returns before the message is
+     * transmitted. Developers may use the returned
      * Future object to track progress of the transmission.
      * 
      * @param data
@@ -45,7 +48,8 @@
     Future<Void> sendBytesByFuture(ByteBuffer data);
 
     /**
-     * Initiates the asynchronous transmission of a binary message. This method returns before the message is transmitted. Developers may provide a callback to
+     * Initiates the asynchronous transmission of a binary message. This method returns before the message is
+     * transmitted. Developers may provide a callback to
      * be notified when the message has been transmitted or resulted in an error.
      * 
      * @param data
@@ -56,38 +60,54 @@
     void sendBytes(ByteBuffer data, WriteCallback callback);
 
     /**
-     * Send a binary message in pieces, blocking until all of the message has been transmitted. The runtime reads the message in order. Non-final pieces are
+     * Send a binary message in pieces, blocking until all of the message has been transmitted. The runtime reads the
+     * message in order. Non-final pieces are
      * sent with isLast set to false. The final piece must be sent with isLast set to true.
      * 
      * @param fragment
      *            the piece of the message being sent
+     * @param isLast
+     *            true if this is the last piece of the partial bytes
+     * @throws IOException
+     *             if unable to send the partial bytes
      */
     void sendPartialBytes(ByteBuffer fragment, boolean isLast) throws IOException;
 
     /**
-     * Send a text message in pieces, blocking until all of the message has been transmitted. The runtime reads the message in order. Non-final pieces are sent
+     * Send a text message in pieces, blocking until all of the message has been transmitted. The runtime reads the
+     * message in order. Non-final pieces are sent
      * with isLast set to false. The final piece must be sent with isLast set to true.
      * 
      * @param fragment
      *            the piece of the message being sent
+     * @param isLast
+     *            true if this is the last piece of the partial bytes
+     * @throws IOException
+     *             if unable to send the partial bytes
      */
     void sendPartialString(String fragment, boolean isLast) throws IOException;
 
     /**
-     * Send a Ping message containing the given application data to the remote endpoint. The corresponding Pong message may be picked up using the
+     * Send a Ping message containing the given application data to the remote endpoint. The corresponding Pong message
+     * may be picked up using the
      * MessageHandler.Pong handler.
      * 
      * @param applicationData
      *            the data to be carried in the ping request
+     * @throws IOException
+     *             if unable to send the ping
      */
     void sendPing(ByteBuffer applicationData) throws IOException;
 
     /**
-     * Allows the developer to send an unsolicited Pong message containing the given application data in order to serve as a unidirectional heartbeat for the
+     * Allows the developer to send an unsolicited Pong message containing the given application data in order to serve
+     * as a unidirectional heartbeat for the
      * session.
      * 
      * @param applicationData
      *            the application data to be carried in the pong response.
+     * @throws IOException
+     *             if unable to send the pong
      */
     void sendPong(ByteBuffer applicationData) throws IOException;
 
@@ -98,11 +118,14 @@
      * 
      * @param text
      *            the message to be sent
+     * @throws IOException
+     *             if unable to send the text message
      */
     void sendString(String text) throws IOException;
 
     /**
-     * Initiates the asynchronous transmission of a text message. This method may return before the message is transmitted. Developers may use the returned
+     * Initiates the asynchronous transmission of a text message. This method may return before the message is
+     * transmitted. Developers may use the returned
      * Future object to track progress of the transmission.
      * 
      * @param text
@@ -112,7 +135,8 @@
     Future<Void> sendStringByFuture(String text);
 
     /**
-     * Initiates the asynchronous transmission of a text message. This method may return before the message is transmitted. Developers may provide a callback to
+     * Initiates the asynchronous transmission of a text message. This method may return before the message is
+     * transmitted. Developers may provide a callback to
      * be notified when the message has been transmitted or resulted in an error.
      * 
      * @param text
@@ -139,7 +163,9 @@
     
     /**
      * Flushes messages that may have been batched by the implementation.
-     * @throws IOException if the flush fails
+     * 
+     * @throws IOException
+     *             if the flush fails
      * @see #getBatchMode()
      */
     void flush() throws IOException;
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/Session.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/Session.java
index f9daa0e..3d28ecb 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/Session.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/Session.java
@@ -22,9 +22,10 @@
 import java.io.IOException;
 import java.net.InetSocketAddress;
 
+import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
+
 /**
  * Session represents an active link of communications with a Remote WebSocket Endpoint.
- * <p>
  */
 public interface Session extends Closeable
 {
@@ -80,7 +81,11 @@
      * Once called, any read/write activity on the websocket from this point will be indeterminate.
      * <p>
      * Once the underlying connection has been determined to be closed, the various onClose() events (either
-     * {@link WebSocketListener#onWebSocketClose(int, String)} or {@link OnWebSocketClose}) will be called on your websocket.
+     * {@link WebSocketListener#onWebSocketClose(int, String)} or {@link OnWebSocketClose}) will be called on your
+     * websocket.
+     * 
+     * @throws IOException
+     *             if unable to disconnect
      * 
      * @see #close()
      * @see #close(CloseStatus)
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/UpgradeResponse.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/UpgradeResponse.java
index a98a6f3..91df0d7 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/UpgradeResponse.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/UpgradeResponse.java
@@ -136,13 +136,15 @@
     /**
      * Issue a forbidden upgrade response.
      * <p>
-     * This means that the websocket endpoint was valid, but the conditions to use a WebSocket resulted in a forbidden access.
+     * This means that the websocket endpoint was valid, but the conditions to use a WebSocket resulted in a forbidden
+     * access.
      * <p>
      * Use this when the origin or authentication is invalid.
      * 
      * @param message
      *            the short 1 line detail message about the forbidden response
      * @throws IOException
+     *             if unable to send the forbidden
      */
     public void sendForbidden(String message) throws IOException
     {
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketConnectionListener.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketConnectionListener.java
new file mode 100644
index 0000000..dc75fe6
--- /dev/null
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketConnectionListener.java
@@ -0,0 +1,61 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.api;
+
+/**
+ * Core WebSocket Connection Listener
+ */
+public interface WebSocketConnectionListener
+{
+    /**
+     * A Close Event was received.
+     * <p>
+     * The underlying Connection will be considered closed at this point.
+     * 
+     * @param statusCode
+     *            the close status code. (See {@link StatusCode})
+     * @param reason
+     *            the optional reason for the close.
+     */
+    void onWebSocketClose(int statusCode, String reason);
+
+    /**
+     * A WebSocket {@link Session} has connected successfully and is ready to be used.
+     * <p>
+     * Note: It is a good idea to track this session as a field in your object so that you can write messages back via the {@link RemoteEndpoint}
+     * 
+     * @param session
+     *            the websocket session.
+     */
+    void onWebSocketConnect(Session session);
+
+    /**
+     * A WebSocket exception has occurred.
+     * <p>
+     * This is a way for the internal implementation to notify of exceptions occured during the processing of websocket.
+     * <p>
+     * Usually this occurs from bad / malformed incoming packets. (example: bad UTF8 data, frames that are too big, violations of the spec)
+     * <p>
+     * This will result in the {@link Session} being closed by the implementing side.
+     * 
+     * @param cause
+     *            the error that occurred.
+     */
+    void onWebSocketError(Throwable cause);
+}
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketFrameListener.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketFrameListener.java
new file mode 100644
index 0000000..2f30b79
--- /dev/null
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketFrameListener.java
@@ -0,0 +1,34 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.api;
+
+import org.eclipse.jetty.websocket.api.extensions.Frame;
+
+/**
+ * WebSocket Frame Listener interface for incoming WebSocket frames.
+ */
+public interface WebSocketFrameListener extends WebSocketConnectionListener
+{
+    /**
+     * A WebSocket frame has been received.
+     * 
+     * @param frame the immutable frame received
+     */
+    void onWebSocketFrame(Frame frame);
+}
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketListener.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketListener.java
index b860951..9bb12c4 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketListener.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketListener.java
@@ -19,9 +19,9 @@
 package org.eclipse.jetty.websocket.api;
 
 /**
- * Basic WebSocket Listener interface for incoming WebSocket events.
+ * Basic WebSocket Listener interface for incoming WebSocket message events.
  */
-public interface WebSocketListener
+public interface WebSocketListener extends WebSocketConnectionListener
 {
     /**
      * A WebSocket binary frame has been received.
@@ -36,45 +36,9 @@
     void onWebSocketBinary(byte payload[], int offset, int len);
 
     /**
-     * A Close Event was received.
-     * <p>
-     * The underlying Connection will be considered closed at this point.
-     * 
-     * @param statusCode
-     *            the close status code. (See {@link StatusCode})
-     * @param reason
-     *            the optional reason for the close.
-     */
-    void onWebSocketClose(int statusCode, String reason);
-
-    /**
-     * A WebSocket {@link Session} has connected successfully and is ready to be used.
-     * <p>
-     * Note: It is a good idea to track this session as a field in your object so that you can write messages back via the {@link RemoteEndpoint}
-     * 
-     * @param session
-     *            the websocket session.
-     */
-    void onWebSocketConnect(Session session);
-
-    /**
-     * A WebSocket exception has occurred.
-     * <p>
-     * This is a way for the internal implementation to notify of exceptions occured during the processing of websocket.
-     * <p>
-     * Usually this occurs from bad / malformed incoming packets. (example: bad UTF8 data, frames that are too big, violations of the spec)
-     * <p>
-     * This will result in the {@link Session} being closed by the implementing side.
-     * 
-     * @param error
-     *            the error that occurred.
-     */
-    void onWebSocketError(Throwable cause);
-
-    /**
      * A WebSocket Text frame was received.
      * 
-     * @param message
+     * @param message the message
      */
     void onWebSocketText(String message);
 }
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketPartialListener.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketPartialListener.java
new file mode 100644
index 0000000..a9d03cd
--- /dev/null
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketPartialListener.java
@@ -0,0 +1,58 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.api;
+
+import java.nio.ByteBuffer;
+
+/**
+ * WebSocket Partial Message Listener interface for incoming WebSocket TEXT/BINARY/CONTINUATION frames.
+ */
+public interface WebSocketPartialListener extends WebSocketConnectionListener
+{
+    /**
+     * A WebSocket BINARY (or associated CONTINUATION) frame has been received.
+     * <p>
+     * <b>Important Note</b>: The payload <code>ByteBuffer</code> cannot be modified, and the ByteBuffer object itself
+     * will be recycled on completion of this method call, make a copy of the data contained within if you want to
+     * retain it between calls.
+     * 
+     * @param payload
+     *            the binary message frame payload
+     * @param fin
+     *            true if this is the final frame, false otherwise
+     */
+    void onWebSocketPartialBinary(ByteBuffer payload, boolean fin);
+
+    /**
+     * A WebSocket TEXT (or associated CONTINUATION) frame has been received.
+     * 
+     * @param payload
+     *            the text message payload
+     *            <p>
+     *            Note that due to framing, there is a above average chance of any UTF8 sequences being split on the
+     *            border between two frames will result in either the previous frame, or the next frame having an
+     *            invalid UTF8 sequence, but the combined frames having a valid UTF8 sequence.
+     *            <p>
+     *            The String being provided here will not end in a split UTF8 sequence. Instead this partial sequence
+     *            will be held over until the next frame is received.
+     * @param fin
+     *            true if this is the final frame, false otherwise
+     */
+    void onWebSocketPartialText(String payload, boolean fin);
+}
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketPingPongListener.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketPingPongListener.java
new file mode 100644
index 0000000..fa74c33
--- /dev/null
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketPingPongListener.java
@@ -0,0 +1,43 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.api;
+
+import java.nio.ByteBuffer;
+
+/**
+ * WebSocket PING/PONG Listener interface for incoming WebSocket PING/PONG frames.
+ */
+public interface WebSocketPingPongListener extends WebSocketConnectionListener
+{
+    /**
+     * A WebSocket PING has been received.
+     * 
+     * @param payload
+     *            the ping payload
+     */
+    void onWebSocketPing(ByteBuffer payload);
+
+    /**
+     * A WebSocket PONG has been received.
+     * 
+     * @param payload
+     *            the pong payload
+     */
+    void onWebSocketPong(ByteBuffer payload);
+}
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketClose.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketClose.java
index a29fab3..461663b 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketClose.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketClose.java
@@ -24,6 +24,8 @@
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import org.eclipse.jetty.websocket.api.Session;
+
 /**
  * Annotation for tagging methods to receive connection close events.
  * <p>
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketConnect.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketConnect.java
index 89690f3..f74b3c6 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketConnect.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketConnect.java
@@ -24,6 +24,8 @@
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import org.eclipse.jetty.websocket.api.Session;
+
 /**
  * Annotation for tagging methods to receive connection open events.
  * <p>
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketError.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketError.java
index 1fb9e6b..5ef8caa 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketError.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketError.java
@@ -24,12 +24,13 @@
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import org.eclipse.jetty.websocket.api.Session;
+
 /**
  * Annotation for receiving websocket errors (exceptions) that have occurred internally in the websocket implementation.
  * <p>
  * Acceptable method patterns.<br>
  * Note: <code>methodName</code> can be any name you want to use.
- * <p>
  * <ol>
  * <li><code>public void methodName({@link Throwable} error)</code></li>
  * <li><code>public void methodName({@link Session} session, {@link Throwable} error)</code></li>
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketFrame.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketFrame.java
index f3bcd0d..7dcae23 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketFrame.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketFrame.java
@@ -24,14 +24,16 @@
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import org.eclipse.jetty.websocket.api.Session;
+
 /**
  * (ADVANCED) Annotation for tagging methods to receive frame events.
  * <p>
  * Acceptable method patterns.<br>
  * Note: <code>methodName</code> can be any name you want to use.
  * <ol>
- * <li><code>public void methodName({@link Frame} frame)</code></li>
- * <li><code>public void methodName({@link Session} session, {@link Frame} frame)</code></li>
+ * <li><code>public void methodName({@link org.eclipse.jetty.websocket.api.extensions.Frame} frame)</code></li>
+ * <li><code>public void methodName({@link Session} session, {@link org.eclipse.jetty.websocket.api.extensions.Frame} frame)</code></li>
  * </ol>
  */
 @Documented
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketMessage.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketMessage.java
index 74f687b..eb96580 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketMessage.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/OnWebSocketMessage.java
@@ -18,12 +18,15 @@
 
 package org.eclipse.jetty.websocket.api.annotations;
 
+import java.io.Reader;
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import org.eclipse.jetty.websocket.api.Session;
+
 /**
  * Annotation for tagging methods to receive Binary or Text Message events.
  * <p>
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/extensions/Extension.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/extensions/Extension.java
index ebcb7da..4cee100 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/extensions/Extension.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/extensions/Extension.java
@@ -36,6 +36,7 @@
      * The <code>Sec-WebSocket-Extensions</code> name for this extension.
      * <p>
      * Also known as the <a href="https://tools.ietf.org/html/rfc6455#section-9.1"><code>extension-token</code> per Section 9.1. Negotiating Extensions</a>.
+     * @return the name of the extension
      */
     public String getName();
 
@@ -81,9 +82,4 @@
      *            the next outgoing extension
      */
     public void setNextOutgoingFrames(OutgoingFrames nextOutgoing);
-    
-    // TODO: Extension should indicate if it requires boundary of fragments to be preserved
-    
-    // TODO: Extension should indicate if it uses the Extension data field of frame for its own reasons.
-    
 }
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/extensions/ExtensionConfig.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/extensions/ExtensionConfig.java
index 1041bc5..5036eb7 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/extensions/ExtensionConfig.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/extensions/ExtensionConfig.java
@@ -128,6 +128,7 @@
 
     /**
      * Copy constructor
+     * @param copy the extension config to copy
      */
     public ExtensionConfig(ExtensionConfig copy)
     {
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/extensions/Frame.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/extensions/Frame.java
index 3dec2fa..ecce110 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/extensions/Frame.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/extensions/Frame.java
@@ -103,8 +103,9 @@
      * Same as {@link #isFin()}
      * 
      * @return true if final frame.
+     * @deprecated use {@link #isFin()} instead
      */
-    // FIXME: remove
+    @Deprecated
     public boolean isLast();
 
     public boolean isMasked();
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/extensions/OutgoingFrames.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/extensions/OutgoingFrames.java
index 2f6cea3..9476cff 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/extensions/OutgoingFrames.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/extensions/OutgoingFrames.java
@@ -28,10 +28,10 @@
 {
     /**
      * A frame, and optional callback, intended for the network layer.
-     * <p/>
+     * <p>
      * Note: the frame can undergo many transformations in the various
      * layers and extensions present in the implementation.
-     * <p/>
+     * <p>
      * If you are implementing a mutation, you are obliged to handle
      * the incoming WriteCallback appropriately.
      *
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/util/QuoteUtil.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/util/QuoteUtil.java
index faf9674..f8d1f90 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/util/QuoteUtil.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/util/QuoteUtil.java
@@ -27,7 +27,6 @@
  * Provide some consistent Http header value and Extension configuration parameter quoting support.
  * <p>
  * While QuotedStringTokenizer exists in jetty-util, and works great with http header values, using it in websocket-api is undesired.
- * <p>
  * <ul>
  * <li>Using QuotedStringTokenizer would introduce a dependency to jetty-util that would need to be exposed via the WebAppContext classloader</li>
  * <li>ABNF defined extension parameter parsing requirements of RFC-6455 (WebSocket) ABNF, is slightly different than the ABNF parsing defined in RFC-2616
@@ -48,8 +47,6 @@
             QUOTE_DOUBLE
         }
 
-        private static final boolean DEBUG = false;
-
         private final String input;
         private final String delims;
         private StringBuilder token;
@@ -84,14 +81,6 @@
             }
         }
 
-        private void debug(String format, Object... args)
-        {
-            if (DEBUG)
-            {
-                System.out.printf(format,args);
-            }
-        }
-
         @Override
         public boolean hasNext()
         {
@@ -134,7 +123,7 @@
                     {
                         if (delims.indexOf(c) >= 0)
                         {
-                            debug("hasNext/t: %b [%s]%n",hasToken,token);
+                            // System.out.printf("hasNext/t: %b [%s]%n",hasToken,token);
                             return hasToken;
                         }
                         else if (c == '\'')
@@ -193,10 +182,9 @@
                         break;
                     }
                 }
-                debug("%s <%s> : [%s]%n",state,c,token);
+                // System.out.printf("%s <%s> : [%s]%n",state,c,token);
             }
-
-            debug("hasNext/e: %b [%s]%n",hasToken,token);
+            // System.out.printf("hasNext/e: %b [%s]%n",hasToken,token);
             return hasToken;
         }
 
diff --git a/jetty-websocket/websocket-api/src/test/java/org/eclipse/jetty/websocket/api/util/QuoteUtilTest.java b/jetty-websocket/websocket-api/src/test/java/org/eclipse/jetty/websocket/api/util/QuoteUtilTest.java
index d475ec0..c3d8606 100644
--- a/jetty-websocket/websocket-api/src/test/java/org/eclipse/jetty/websocket/api/util/QuoteUtilTest.java
+++ b/jetty-websocket/websocket-api/src/test/java/org/eclipse/jetty/websocket/api/util/QuoteUtilTest.java
@@ -18,8 +18,8 @@
 
 package org.eclipse.jetty.websocket.api.util;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
 
 import java.util.Iterator;
 import java.util.NoSuchElementException;
diff --git a/jetty-websocket/websocket-client/pom.xml b/jetty-websocket/websocket-client/pom.xml
index d6f24c7..73d3eb3 100644
--- a/jetty-websocket/websocket-client/pom.xml
+++ b/jetty-websocket/websocket-client/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <groupId>org.eclipse.jetty.websocket</groupId>
         <artifactId>websocket-parent</artifactId>
-        <version>9.2.14-SNAPSHOT</version>
+        <version>9.3.6-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
diff --git a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/ClientUpgradeRequest.java b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/ClientUpgradeRequest.java
index ac5873d..67e00c0 100644
--- a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/ClientUpgradeRequest.java
+++ b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/ClientUpgradeRequest.java
@@ -46,7 +46,6 @@
 public class ClientUpgradeRequest extends UpgradeRequest
 {
     private static final Logger LOG = Log.getLogger(ClientUpgradeRequest.class);
-    private static final int MAX_KEYS = -1; // maximum number of parameter keys to decode
     private static final Set<String> FORBIDDEN_HEADERS;
 
     static
@@ -249,7 +248,7 @@
         if (StringUtil.isNotBlank(query))
         {
             MultiMap<String> params = new MultiMap<String>();
-            UrlEncoded.decodeTo(uri.getQuery(),params,StandardCharsets.UTF_8,MAX_KEYS);
+            UrlEncoded.decodeTo(uri.getQuery(),params,StandardCharsets.UTF_8);
 
             for (String key : params.keySet())
             {
diff --git a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/ClientUpgradeResponse.java b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/ClientUpgradeResponse.java
index 0c46876..10dfc96 100644
--- a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/ClientUpgradeResponse.java
+++ b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/ClientUpgradeResponse.java
@@ -21,11 +21,15 @@
 import java.io.IOException;
 import java.nio.ByteBuffer;
 
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.websocket.api.UpgradeResponse;
 import org.eclipse.jetty.websocket.common.io.http.HttpResponseHeaderParseListener;
 
 public class ClientUpgradeResponse extends UpgradeResponse implements HttpResponseHeaderParseListener
 {
+    private static final Logger LOG = Log.getLogger(ClientUpgradeResponse.class);
     private ByteBuffer remainingBuffer;
 
     public ClientUpgradeResponse()
@@ -47,6 +51,10 @@
     @Override
     public void setRemainingBuffer(ByteBuffer remainingBuffer)
     {
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("Saving remaining header: {}",BufferUtil.toDetailString(remainingBuffer));
+        }
         this.remainingBuffer = remainingBuffer;
     }
 }
diff --git a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/WebSocketClient.java b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/WebSocketClient.java
index 3320d57..59a4d61 100644
--- a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/WebSocketClient.java
+++ b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/WebSocketClient.java
@@ -22,9 +22,8 @@
 import java.net.CookieStore;
 import java.net.SocketAddress;
 import java.net.URI;
-import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Locale;
 import java.util.Set;
 import java.util.concurrent.Executor;
@@ -33,6 +32,7 @@
 import org.eclipse.jetty.io.ByteBufferPool;
 import org.eclipse.jetty.io.MappedByteBufferPool;
 import org.eclipse.jetty.io.SelectorManager;
+import org.eclipse.jetty.util.DecoratedObjectFactory;
 import org.eclipse.jetty.util.HttpCookieStore;
 import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.component.ContainerLifeCycle;
@@ -45,7 +45,6 @@
 import org.eclipse.jetty.util.thread.ShutdownThread;
 import org.eclipse.jetty.websocket.api.Session;
 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
-import org.eclipse.jetty.websocket.api.extensions.Extension;
 import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
 import org.eclipse.jetty.websocket.api.extensions.ExtensionFactory;
 import org.eclipse.jetty.websocket.client.io.ConnectPromise;
@@ -60,15 +59,16 @@
 import org.eclipse.jetty.websocket.common.events.EventDriver;
 import org.eclipse.jetty.websocket.common.events.EventDriverFactory;
 import org.eclipse.jetty.websocket.common.extensions.WebSocketExtensionFactory;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 
 /**
  * WebSocketClient provides a means of establishing connections to remote websocket endpoints.
  */
-public class WebSocketClient extends ContainerLifeCycle implements SessionListener
+public class WebSocketClient extends ContainerLifeCycle implements SessionListener, WebSocketContainerScope
 {
     private static final Logger LOG = Log.getLogger(WebSocketClient.class);
 
-    private final WebSocketPolicy policy;
+    private final WebSocketPolicy policy = WebSocketPolicy.newClientPolicy();
     private final SslContextFactory sslContextFactory;
     private final WebSocketExtensionFactory extensionRegistry;
     private boolean daemon = false;
@@ -76,18 +76,20 @@
     private SessionFactory sessionFactory;
     private ByteBufferPool bufferPool;
     private Executor executor;
+    private DecoratedObjectFactory objectFactory;
     private Scheduler scheduler;
     private CookieStore cookieStore;
     private ConnectionManager connectionManager;
     private Masker masker;
     private SocketAddress bindAddress;
     private long connectTimeout = SelectorManager.DEFAULT_CONNECT_TIMEOUT;
+    private boolean dispatchIO = true;
 
     public WebSocketClient()
     {
-        this(null,null);
+        this((SslContextFactory)null,null);
     }
-
+    
     public WebSocketClient(Executor executor)
     {
         this(null,executor);
@@ -108,28 +110,37 @@
         this(sslContextFactory,executor,new MappedByteBufferPool());
     }
     
+    public WebSocketClient(WebSocketContainerScope scope)
+    {
+        this(scope.getSslContextFactory(), scope.getExecutor(), scope.getBufferPool(), scope.getObjectFactory());
+    }
+    
+    public WebSocketClient(WebSocketContainerScope scope, SslContextFactory sslContextFactory)
+    {
+        this(sslContextFactory, scope.getExecutor(), scope.getBufferPool(), scope.getObjectFactory());
+    }
+
     public WebSocketClient(SslContextFactory sslContextFactory, Executor executor, ByteBufferPool bufferPool)
     {
+        this(sslContextFactory, executor, bufferPool, new DecoratedObjectFactory());
+    }
+
+    public WebSocketClient(SslContextFactory sslContextFactory, Executor executor, ByteBufferPool bufferPool, DecoratedObjectFactory objectFactory)
+    {
         this.executor = executor;
         this.sslContextFactory = sslContextFactory;
-        this.policy = WebSocketPolicy.newClientPolicy();
         this.bufferPool = bufferPool;
-        this.extensionRegistry = new WebSocketExtensionFactory(policy,bufferPool);
-        
-        // Bug #431459 - unregistering compression extensions till they are more stable
-        this.extensionRegistry.unregister("deflate-frame");
-        this.extensionRegistry.unregister("permessage-deflate");
-        this.extensionRegistry.unregister("x-webkit-deflate-frame");
+        this.objectFactory = objectFactory;
+        this.extensionRegistry = new WebSocketExtensionFactory(this);
         
         this.masker = new RandomMasker();
         this.eventDriverFactory = new EventDriverFactory(policy);
-        this.sessionFactory = new WebSocketSessionFactory(this);
         
         addBean(this.executor);
         addBean(this.sslContextFactory);
         addBean(this.bufferPool);
     }
-
+    
     public Future<Session> connect(Object websocket, URI toUri) throws IOException
     {
         ClientUpgradeRequest request = new ClientUpgradeRequest(toUri);
@@ -184,7 +195,7 @@
             LOG.debug("connect websocket {} to {}",websocket,toUri);
 
         // Grab Connection Manager
-        initialiseClient();
+        initializeClient();
         ConnectionManager manager = getConnectionManager();
 
         // Setup Driver for user provided websocket
@@ -253,8 +264,18 @@
             cookieStore = new HttpCookieStore.Empty();
         }
 
-        super.doStart();
+        if(this.sessionFactory == null)
+        {
+            this.sessionFactory = new WebSocketSessionFactory(this);
+        }
+        
+        if(this.objectFactory == null)
+        {
+            this.objectFactory = new DecoratedObjectFactory();
+        }
 
+        super.doStart();
+        
         if (LOG.isDebugEnabled())
             LOG.debug("Started {}",this);
     }
@@ -277,11 +298,16 @@
         }
 
         super.doStop();
-
+        
         if (LOG.isDebugEnabled())
             LOG.debug("Stopped {}",this);
     }
 
+    public boolean isDispatchIO()
+    {
+        return dispatchIO;
+    }
+
     /**
      * Return the number of milliseconds for a timeout of an attempted write operation.
      * 
@@ -387,9 +413,15 @@
         return this.policy.getMaxTextMessageSize();
     }
 
+    @Override
+    public DecoratedObjectFactory getObjectFactory()
+    {
+        return this.objectFactory;
+    }
+
     public Set<WebSocketSession> getOpenSessions()
     {
-        return new HashSet<>(getBeans(WebSocketSession.class));
+        return Collections.unmodifiableSet(new HashSet<>(getBeans(WebSocketSession.class)));
     }
 
     public WebSocketPolicy getPolicy()
@@ -401,7 +433,7 @@
     {
         return scheduler;
     }
-
+    
     public SessionFactory getSessionFactory()
     {
         return sessionFactory;
@@ -416,29 +448,7 @@
         return sslContextFactory;
     }
 
-    public List<Extension> initExtensions(List<ExtensionConfig> requested)
-    {
-        List<Extension> extensions = new ArrayList<Extension>();
-
-        for (ExtensionConfig cfg : requested)
-        {
-            Extension extension = extensionRegistry.newInstance(cfg);
-
-            if (extension == null)
-            {
-                continue;
-            }
-
-            if (LOG.isDebugEnabled())
-                LOG.debug("added {}",extension);
-            extensions.add(extension);
-        }
-        if (LOG.isDebugEnabled())
-            LOG.debug("extensions={}",extensions);
-        return extensions;
-    }
-
-    private synchronized void initialiseClient() throws IOException
+    private synchronized void initializeClient() throws IOException
     {
         if (!ShutdownThread.isRegistered(this))
         {
@@ -489,15 +499,26 @@
     {
         if (LOG.isDebugEnabled())
             LOG.debug("Session Opened: {}",session);
+        addManaged(session);
     }
-
+    
     public void setAsyncWriteTimeout(long ms)
     {
         this.policy.setAsyncWriteTimeout(ms);
     }
 
+    /**
+     * @param bindAddress the address to bind to
+     * @deprecated use {@link #setBindAddress(SocketAddress)} instead
+     */
+    @Deprecated
     public void setBindAdddress(SocketAddress bindAddress)
     {
+        setBindAddress(bindAddress);
+    }
+
+    public void setBindAddress(SocketAddress bindAddress)
+    {
         this.bindAddress = bindAddress;
     }
 
@@ -531,6 +552,11 @@
         this.daemon = daemon;
     }
 
+    public void setDispatchIO(boolean dispatchIO)
+    {
+        this.dispatchIO = dispatchIO;
+    }
+
     public void setEventDriverFactory(EventDriverFactory factory)
     {
         this.eventDriverFactory = factory;
diff --git a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/ConnectPromise.java b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/ConnectPromise.java
index 9230b6a..ef1a585 100644
--- a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/ConnectPromise.java
+++ b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/ConnectPromise.java
@@ -19,6 +19,8 @@
 package org.eclipse.jetty.websocket.client.io;
 
 import org.eclipse.jetty.util.FuturePromise;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.websocket.api.Session;
 import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
 import org.eclipse.jetty.websocket.client.ClientUpgradeResponse;
@@ -32,12 +34,14 @@
  */
 public abstract class ConnectPromise extends FuturePromise<Session> implements Runnable
 {
+    private static final Logger LOG = Log.getLogger(ConnectPromise.class);
     private final WebSocketClient client;
     private final EventDriver driver;
     private final ClientUpgradeRequest request;
     private final Masker masker;
     private UpgradeListener upgradeListener;
     private ClientUpgradeResponse response;
+    private WebSocketSession session;
 
     public ConnectPromise(WebSocketClient client, EventDriver driver, ClientUpgradeRequest request)
     {
@@ -97,11 +101,18 @@
         this.upgradeListener = upgradeListener;
     }
 
-    public void succeeded(WebSocketSession session)
+    public void succeeded()
     {
+        if(LOG.isDebugEnabled())
+            LOG.debug("{}.succeeded()",this.getClass().getSimpleName());
         session.setUpgradeRequest(request);
         session.setUpgradeResponse(response);
-        session.open();
+        // session.open();
         super.succeeded(session);
     }
+
+    public void setSession(WebSocketSession session)
+    {
+        this.session = session;
+    }
 }
diff --git a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/ConnectionManager.java b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/ConnectionManager.java
index 1aae226..fb00e8f 100644
--- a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/ConnectionManager.java
+++ b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/ConnectionManager.java
@@ -23,20 +23,13 @@
 import java.net.SocketAddress;
 import java.net.URI;
 import java.nio.channels.SocketChannel;
-import java.util.Collection;
-import java.util.Collections;
 import java.util.Locale;
-import java.util.Queue;
-import java.util.concurrent.ConcurrentLinkedQueue;
 
 import org.eclipse.jetty.util.component.ContainerLifeCycle;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.websocket.api.StatusCode;
-import org.eclipse.jetty.websocket.api.WebSocketException;
 import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
 import org.eclipse.jetty.websocket.client.WebSocketClient;
-import org.eclipse.jetty.websocket.common.WebSocketSession;
 import org.eclipse.jetty.websocket.common.events.EventDriver;
 
 /**
@@ -104,20 +97,6 @@
         }
     }
 
-    private class VirtualConnect extends ConnectPromise
-    {
-        public VirtualConnect(WebSocketClient client, EventDriver driver, ClientUpgradeRequest request)
-        {
-            super(client,driver,request);
-        }
-
-        @Override
-        public void run()
-        {
-            failed(new WebSocketException("MUX Not yet supported"));
-        }
-    }
-
     private static final Logger LOG = Log.getLogger(ConnectionManager.class);
 
     public static InetSocketAddress toSocketAddress(URI uri)
@@ -151,7 +130,6 @@
         return new InetSocketAddress(uri.getHost(),port);
     }
 
-    private final Queue<WebSocketSession> sessions = new ConcurrentLinkedQueue<>();
     private final WebSocketClient client;
     private WebSocketClientSelectorManager selector;
 
@@ -160,41 +138,8 @@
         this.client = client;
     }
 
-    public void addSession(WebSocketSession session)
-    {
-        sessions.add(session);
-    }
-
-    private void shutdownAllConnections()
-    {
-        for (WebSocketSession session : sessions)
-        {
-            if (session.getConnection() != null)
-            {
-                try
-                {
-                    session.getConnection().close(
-                            StatusCode.SHUTDOWN,
-                            "Shutdown");
-                }
-                catch (Throwable t)
-                {
-                    LOG.debug("During Shutdown All Connections",t);
-                }
-            }
-        }
-    }
-
     public ConnectPromise connect(WebSocketClient client, EventDriver driver, ClientUpgradeRequest request)
     {
-        URI toUri = request.getRequestURI();
-        String hostname = toUri.getHost();
-
-        if (isVirtualConnectionPossibleTo(hostname))
-        {
-            return new VirtualConnect(client,driver,request);
-        }
-
         return new PhysicalConnect(client,driver,request);
     }
 
@@ -212,8 +157,6 @@
     @Override
     protected void doStop() throws Exception
     {
-        shutdownAllConnections();
-        sessions.clear();
         super.doStop();
         removeBean(selector);
     }
@@ -223,17 +166,6 @@
         return selector;
     }
 
-    public Collection<WebSocketSession> getSessions()
-    {
-        return Collections.unmodifiableCollection(sessions);
-    }
-
-    public boolean isVirtualConnectionPossibleTo(String hostname)
-    {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
     /**
      * Factory method for new WebSocketClientSelectorManager (used by other projects like cometd)
      * 
@@ -245,9 +177,4 @@
     {
         return new WebSocketClientSelectorManager(client);
     }
-
-    public void removeSession(WebSocketSession session)
-    {
-        sessions.remove(session);
-    }
 }
diff --git a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/UpgradeConnection.java b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/UpgradeConnection.java
index d4c4a75..dbe4fae 100644
--- a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/UpgradeConnection.java
+++ b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/UpgradeConnection.java
@@ -29,6 +29,7 @@
 
 import org.eclipse.jetty.io.AbstractConnection;
 import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.Connection;
 import org.eclipse.jetty.io.EndPoint;
 import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.util.FutureCallback;
@@ -49,14 +50,18 @@
 import org.eclipse.jetty.websocket.common.io.http.HttpResponseHeaderParser.ParseException;
 
 /**
- * This is the initial connection handling that exists immediately after physical connection is established to destination server.
+ * This is the initial connection handling that exists immediately after physical connection is established to
+ * destination server.
  * <p>
- * Eventually, upon successful Upgrade request/response, this connection swaps itself out for the WebSocektClientConnection handler.
+ * Eventually, upon successful Upgrade request/response, this connection swaps itself out for the
+ * WebSocektClientConnection handler.
  */
-public class UpgradeConnection extends AbstractConnection
+public class UpgradeConnection extends AbstractConnection implements Connection.UpgradeFrom
 {
     public class SendUpgradeRequest extends FutureCallback implements Runnable
     {
+        private final Logger LOG = Log.getLogger(UpgradeConnection.SendUpgradeRequest.class);
+        
         @Override
         public void run()
         {
@@ -71,16 +76,20 @@
 
             String rawRequest = request.generate();
 
-            ByteBuffer buf = BufferUtil.toBuffer(rawRequest, StandardCharsets.UTF_8);
+            ByteBuffer buf = BufferUtil.toBuffer(rawRequest,StandardCharsets.UTF_8);
             getEndPoint().write(this,buf);
         }
 
         @Override
         public void succeeded()
         {
-            LOG.debug("Upgrade Request Write Success");
+            if (LOG.isDebugEnabled())
+            {
+                LOG.debug("Upgrade Request Write Success");
+            }
             // Writing the request header is complete.
             super.succeeded();
+            state = State.RESPONSE;
             // start the interest in fill
             fillInterested();
         }
@@ -88,8 +97,12 @@
         @Override
         public void failed(Throwable cause)
         {
-            LOG.warn("Upgrade Request Write Failure", cause);
+            if (LOG.isDebugEnabled())
+            {
+                LOG.debug("Upgrade Request Write Failure",cause);
+            }
             super.failed(cause);
+            state = State.FAILURE;
             // Fail the connect promise when a fundamental exception during connect occurs.
             connectPromise.failed(cause);
         }
@@ -98,11 +111,21 @@
     /** HTTP Response Code: 101 Switching Protocols */
     private static final int SWITCHING_PROTOCOLS = 101;
 
+    private enum State
+    {
+        REQUEST,
+        RESPONSE,
+        FAILURE,
+        UPGRADE
+    }
+
     private static final Logger LOG = Log.getLogger(UpgradeConnection.class);
     private final ByteBufferPool bufferPool;
     private final ConnectPromise connectPromise;
     private final HttpResponseHeaderParser parser;
+    private State state = State.REQUEST;
     private ClientUpgradeRequest request;
+    private ClientUpgradeResponse response;
 
     public UpgradeConnection(EndPoint endp, Executor executor, ConnectPromise connectPromise)
     {
@@ -121,12 +144,17 @@
         // We need to gently close first, to allow
         // SSL close alerts to be sent by Jetty
         if (LOG.isDebugEnabled())
+        {
             LOG.debug("Shutting down output {}",endPoint);
+        }
+        
         endPoint.shutdownOutput();
         if (!onlyOutput)
         {
             if (LOG.isDebugEnabled())
+            {
                 LOG.debug("Closing {}",endPoint);
+            }
             endPoint.close();
         }
     }
@@ -147,6 +175,12 @@
             handshakeListener.onHandshakeResponse(response);
         }
     }
+    
+    @Override
+    public ByteBuffer onUpgradeFrom()
+    {
+        return connectPromise.getResponse().getRemainingBuffer();
+    }
 
     @Override
     public void onFillable()
@@ -157,20 +191,25 @@
         }
         ByteBuffer buffer = bufferPool.acquire(getInputBufferSize(),false);
         BufferUtil.clear(buffer);
-        boolean readMore = false;
         try
         {
-            readMore = read(buffer);
+            read(buffer);
         }
         finally
         {
             bufferPool.release(buffer);
         }
 
-        if (readMore)
+        if (state == State.RESPONSE)
         {
+            // Continue Reading
             fillInterested();
         }
+        else if (state == State.UPGRADE)
+        {
+            // Stop Reading, upgrade the connection now
+            upgradeConnection(response);
+        }
     }
 
     @Override
@@ -179,27 +218,27 @@
         super.onOpen();
         getExecutor().execute(new SendUpgradeRequest());
     }
-    
+
     @Override
     public void onClose()
     {
         if (LOG.isDebugEnabled())
         {
-            LOG.warn("Closed connection {}",this);
+            LOG.debug("Closed connection {}",this);
         }
         super.onClose();
     }
-    
+
     @Override
     protected boolean onReadTimeout()
     {
         if (LOG.isDebugEnabled())
         {
-            LOG.warn("Timeout on connection {}",this);
+            LOG.debug("Timeout on connection {}",this);
         }
-        
+
         failUpgrade(new IOException("Timeout while performing WebSocket Upgrade"));
-        
+
         return super.onReadTimeout();
     }
 
@@ -208,9 +247,8 @@
      * 
      * @param buffer
      *            the buffer to fill into from the endpoint
-     * @return true if there is more to read, false if reading should stop
      */
-    private boolean read(ByteBuffer buffer)
+    private void read(ByteBuffer buffer)
     {
         EndPoint endPoint = getEndPoint();
         try
@@ -220,13 +258,14 @@
                 int filled = endPoint.fill(buffer);
                 if (filled == 0)
                 {
-                    return true;
+                    return;
                 }
                 else if (filled < 0)
                 {
                     LOG.warn("read - EOF Reached");
+                    state = State.FAILURE;
                     failUpgrade(new EOFException("Reading WebSocket Upgrade response"));
-                    return false;
+                    return;
                 }
                 else
                 {
@@ -234,34 +273,32 @@
                     {
                         LOG.debug("Filled {} bytes - {}",filled,BufferUtil.toDetailString(buffer));
                     }
-                    ClientUpgradeResponse resp = (ClientUpgradeResponse)parser.parse(buffer);
-                    if (resp != null)
+                    response = (ClientUpgradeResponse)parser.parse(buffer);
+                    if (response != null)
                     {
                         // Got a response!
-                        validateResponse(resp);
-                        notifyConnect(resp);
-                        upgradeConnection(resp);
-                        if (buffer.hasRemaining())
-                        {
-                            LOG.debug("Has remaining client bytebuffer of {}",buffer.remaining());
-                        }
-                        return false; // do no more reading
+                        validateResponse(response);
+                        notifyConnect(response);
+                        state = State.UPGRADE;
+                        return; // do no more reading
                     }
                 }
             }
         }
         catch (IOException | ParseException e)
         {
+            LOG.ignore(e);
+            state = State.FAILURE;
             UpgradeException ue = new UpgradeException(request.getRequestURI(),e);
             connectPromise.failed(ue);
             disconnect(false);
-            return false;
         }
         catch (UpgradeException e)
         {
+            LOG.ignore(e);
+            state = State.FAILURE;
             connectPromise.failed(e);
             disconnect(false);
-            return false;
         }
     }
 
@@ -269,7 +306,7 @@
     {
         EndPoint endp = getEndPoint();
         Executor executor = getExecutor();
-        
+
         EventDriver websocket = connectPromise.getDriver();
         WebSocketPolicy policy = websocket.getPolicy();
 
@@ -278,9 +315,10 @@
         SessionFactory sessionFactory = connectPromise.getClient().getSessionFactory();
         WebSocketSession session = sessionFactory.createSession(request.getRequestURI(),websocket,connection);
         session.setPolicy(policy);
+        session.setUpgradeRequest(request);
         session.setUpgradeResponse(response);
-
-        connection.setSession(session);
+        connection.addListener(session);
+        connectPromise.setSession(session);
 
         // Initialize / Negotiate Extensions
         ExtensionStack extensionStack = new ExtensionStack(connectPromise.getClient().getExtensionFactory());
@@ -297,13 +335,11 @@
         session.setOutgoingHandler(extensionStack);
         extensionStack.setNextOutgoing(connection);
 
-        session.addBean(extensionStack);
+        session.addManaged(extensionStack);
         connectPromise.getClient().addManaged(session);
 
         // Now swap out the connection
-        // TODO use endp.upgrade ???
-        endp.setConnection(connection);
-        connection.onOpen();
+        endp.upgrade(connection);
     }
 
     private void validateResponse(ClientUpgradeResponse response)
@@ -311,7 +347,9 @@
         // Validate Response Status Code
         if (response.getStatusCode() != SWITCHING_PROTOCOLS)
         {
-            throw new UpgradeException(request.getRequestURI(),response.getStatusCode(),"Didn't switch protocols");
+            // TODO: use jetty-http and org.eclipse.jetty.http.HttpStatus for more meaningful exception messages 
+            throw new UpgradeException(request.getRequestURI(),response.getStatusCode(),"Didn't switch protocols, expected status <" + SWITCHING_PROTOCOLS
+                    + ">, but got <" + response.getStatusCode() + ">");
         }
 
         // Validate Connection header
diff --git a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/WebSocketClientConnection.java b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/WebSocketClientConnection.java
index 4ee106c..0aecca9 100644
--- a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/WebSocketClientConnection.java
+++ b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/WebSocketClientConnection.java
@@ -19,13 +19,10 @@
 package org.eclipse.jetty.websocket.client.io;
 
 import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.websocket.api.BatchMode;
 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
 import org.eclipse.jetty.websocket.api.WriteCallback;
@@ -33,7 +30,6 @@
 import org.eclipse.jetty.websocket.api.extensions.IncomingFrames;
 import org.eclipse.jetty.websocket.client.masks.Masker;
 import org.eclipse.jetty.websocket.common.WebSocketFrame;
-import org.eclipse.jetty.websocket.common.WebSocketSession;
 import org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection;
 
 /**
@@ -41,7 +37,6 @@
  */
 public class WebSocketClientConnection extends AbstractWebSocketConnection
 {
-    private static final Logger LOG = Log.getLogger(WebSocketClientConnection.class);
     private final ConnectPromise connectPromise;
     private final Masker masker;
     private final AtomicBoolean opened = new AtomicBoolean(false);
@@ -67,32 +62,14 @@
     }
 
     @Override
-    public void onClose()
-    {
-        super.onClose();
-        ConnectionManager connectionManager = connectPromise.getClient().getConnectionManager();
-        connectionManager.removeSession(getSession());
-    }
-
-    @Override
     public void onOpen()
     {
+        super.onOpen();
         boolean beenOpened = opened.getAndSet(true);
         if (!beenOpened)
         {
-            WebSocketSession session = getSession();
-            ConnectionManager connectionManager = connectPromise.getClient().getConnectionManager();
-            connectionManager.addSession(session);
-            connectPromise.succeeded(session);
-
-            ByteBuffer extraBuf = connectPromise.getResponse().getRemainingBuffer();
-            if (extraBuf.hasRemaining())
-            {
-                LOG.debug("Parsing extra remaining buffer from UpgradeConnection");
-                getParser().parse(extraBuf);
-            }
+            connectPromise.succeeded();
         }
-        super.onOpen();
     }
 
     /**
diff --git a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/WebSocketClientSelectorManager.java b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/WebSocketClientSelectorManager.java
index 15597e3..35180c4 100644
--- a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/WebSocketClientSelectorManager.java
+++ b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/io/WebSocketClientSelectorManager.java
@@ -22,11 +22,13 @@
 import java.nio.channels.SelectionKey;
 import java.nio.channels.SocketChannel;
 import java.util.concurrent.Executor;
+
 import javax.net.ssl.SSLEngine;
 
 import org.eclipse.jetty.io.ByteBufferPool;
 import org.eclipse.jetty.io.Connection;
 import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.ManagedSelector;
 import org.eclipse.jetty.io.SelectChannelEndPoint;
 import org.eclipse.jetty.io.SelectorManager;
 import org.eclipse.jetty.io.ssl.SslConnection;
diff --git a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/package-info.java b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/package-info.java
index 22d4366..6c0087b 100644
--- a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/package-info.java
+++ b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/package-info.java
@@ -20,14 +20,15 @@
  * Jetty WebSocket Client API
  * <p>
  * The core class is {@link org.eclipse.jetty.websocket.client.WebSocketClient}, which acts as a central configuration object (for example
- * for {@link org.eclipse.jetty.websocket.client.WebSocketClient#setConnectTimeout(int) connect timeouts}, {@link WebSocketClient#setCookieStore(CookieStore)
- * request cookie store}, etc.) and as a factory for WebSocket {@link org.eclipse.jetty.websocket.api.Session} objects.
+ * for {@link org.eclipse.jetty.websocket.client.WebSocketClient#setConnectTimeout(long)}, 
+ * {@link org.eclipse.jetty.websocket.client.WebSocketClient#setCookieStore(java.net.CookieStore)}, 
+ * etc.) and as a factory for WebSocket {@link org.eclipse.jetty.websocket.api.Session} objects.
  * <p>
  * The <a href="https://tools.ietf.org/html/rfc6455">WebSocket protocol</a> is based on a framing protocol built
  * around an upgraded HTTP connection.  It is primarily focused on the sending of messages (text or binary), with an
  * occasional control frame (close, ping, pong) that this implementation uses.  
- * <p />
- * {@link org.eclipse.jetty.websocket.client.WebSocketClient} holds a number of {@link org.eclipse.jetty.websocket.api.Session Sessions}, which in turn
+ * <p>
+ * {@link org.eclipse.jetty.websocket.client.WebSocketClient} holds a number of {@link org.eclipse.jetty.websocket.api.Session}, which in turn
  * is used to manage physical vs virtual connection handling (mux extension).
  */
 package org.eclipse.jetty.websocket.client;
diff --git a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/BadNetworkTest.java b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/BadNetworkTest.java
index 4aa4c63..24b3619 100644
--- a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/BadNetworkTest.java
+++ b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/BadNetworkTest.java
@@ -26,7 +26,7 @@
 import org.eclipse.jetty.websocket.api.Session;
 import org.eclipse.jetty.websocket.api.StatusCode;
 import org.eclipse.jetty.websocket.common.test.BlockheadServer;
-import org.eclipse.jetty.websocket.common.test.BlockheadServer.ServerConnection;
+import org.eclipse.jetty.websocket.common.test.IBlockheadServerConnection;
 import org.eclipse.jetty.websocket.common.test.LeakTrackingBufferPoolRule;
 import org.junit.After;
 import org.junit.Before;
@@ -82,7 +82,7 @@
         URI wsUri = server.getWsUri();
         Future<Session> future = client.connect(wsocket,wsUri);
 
-        ServerConnection ssocket = server.accept();
+        IBlockheadServerConnection ssocket = server.accept();
         ssocket.upgrade();
 
         // Validate that we are connected
@@ -110,7 +110,7 @@
         URI wsUri = server.getWsUri();
         Future<Session> future = client.connect(wsocket,wsUri);
 
-        ServerConnection ssocket = server.accept();
+        IBlockheadServerConnection ssocket = server.accept();
         ssocket.upgrade();
 
         // Validate that we are connected
diff --git a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/ClientCloseTest.java b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/ClientCloseTest.java
index 01ca91b..2cbc3ab 100644
--- a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/ClientCloseTest.java
+++ b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/ClientCloseTest.java
@@ -35,8 +35,8 @@
 
 import org.eclipse.jetty.io.EndPoint;
 import org.eclipse.jetty.io.EofException;
+import org.eclipse.jetty.io.ManagedSelector;
 import org.eclipse.jetty.io.SelectChannelEndPoint;
-import org.eclipse.jetty.io.SelectorManager.ManagedSelector;
 import org.eclipse.jetty.toolchain.test.EventQueue;
 import org.eclipse.jetty.toolchain.test.TestTracker;
 import org.eclipse.jetty.util.BufferUtil;
@@ -58,7 +58,7 @@
 import org.eclipse.jetty.websocket.common.frames.TextFrame;
 import org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection;
 import org.eclipse.jetty.websocket.common.test.BlockheadServer;
-import org.eclipse.jetty.websocket.common.test.BlockheadServer.ServerConnection;
+import org.eclipse.jetty.websocket.common.test.IBlockheadServerConnection;
 import org.eclipse.jetty.websocket.common.test.IncomingFramesCapture;
 import org.eclipse.jetty.websocket.common.test.RawFrameBuilder;
 import org.hamcrest.Matcher;
@@ -187,7 +187,7 @@
     private BlockheadServer server;
     private WebSocketClient client;
 
-    private void confirmConnection(CloseTrackingSocket clientSocket, Future<Session> clientFuture, ServerConnection serverConn) throws Exception
+    private void confirmConnection(CloseTrackingSocket clientSocket, Future<Session> clientFuture, IBlockheadServerConnection serverConns) throws Exception
     {
         // Wait for client connect on via future
         clientFuture.get(500,TimeUnit.MILLISECONDS);
@@ -205,7 +205,7 @@
             testFut.get(500,TimeUnit.MILLISECONDS);
 
             // Read Frame on server side
-            IncomingFramesCapture serverCapture = serverConn.readFrames(1,500,TimeUnit.MILLISECONDS);
+            IncomingFramesCapture serverCapture = serverConns.readFrames(1,500,TimeUnit.MILLISECONDS);
             serverCapture.assertNoErrors();
             serverCapture.assertFrameCount(1);
             WebSocketFrame frame = serverCapture.getFrames().poll();
@@ -213,7 +213,7 @@
             Assert.assertThat("Server received frame payload",frame.getPayloadAsUTF8(),is(echoMsg));
 
             // Server send echo reply
-            serverConn.write(new TextFrame().setPayload(echoMsg));
+            serverConns.write(new TextFrame().setPayload(echoMsg));
 
             // Wait for received echo
             clientSocket.messageQueue.awaitEventCount(1,1,TimeUnit.SECONDS);
@@ -231,7 +231,7 @@
         }
     }
 
-    private void confirmServerReceivedCloseFrame(ServerConnection serverConn, int expectedCloseCode, Matcher<String> closeReasonMatcher) throws IOException,
+    private void confirmServerReceivedCloseFrame(IBlockheadServerConnection serverConn, int expectedCloseCode, Matcher<String> closeReasonMatcher) throws IOException,
             TimeoutException
     {
         IncomingFramesCapture serverCapture = serverConn.readFrames(1,500,TimeUnit.MILLISECONDS);
@@ -348,7 +348,7 @@
         Future<Session> clientConnectFuture = client.connect(clientSocket,server.getWsUri());
 
         // Server accepts connect
-        ServerConnection serverConn = server.accept();
+        IBlockheadServerConnection serverConn = server.accept();
         serverConn.upgrade();
 
         // client confirms connection via echo
@@ -397,7 +397,7 @@
         Future<Session> clientConnectFuture = client.connect(clientSocket,server.getWsUri());
 
         // Server accepts connect
-        ServerConnection serverConn = server.accept();
+        IBlockheadServerConnection serverConn = server.accept();
         serverConn.upgrade();
 
         // client confirms connection via echo
@@ -448,7 +448,7 @@
         Future<Session> clientConnectFuture = client.connect(clientSocket,server.getWsUri());
 
         // Server accepts connect
-        ServerConnection serverConn = server.accept();
+        IBlockheadServerConnection serverConn = server.accept();
         serverConn.upgrade();
 
         // client confirms connection via echo
@@ -496,7 +496,7 @@
         Future<Session> clientConnectFuture = client.connect(clientSocket,server.getWsUri());
 
         // Server accepts connect
-        ServerConnection serverConn = server.accept();
+        IBlockheadServerConnection serverConn = server.accept();
         serverConn.upgrade();
 
         // client confirms connection via echo
@@ -532,7 +532,7 @@
         Future<Session> clientConnectFuture = client.connect(clientSocket,server.getWsUri());
 
         // Server accepts connect
-        ServerConnection serverConn = server.accept();
+        IBlockheadServerConnection serverConn = server.accept();
         serverConn.upgrade();
 
         // client confirms connection via echo
@@ -564,7 +564,7 @@
 
         int clientCount = 3;
         CloseTrackingSocket clientSockets[] = new CloseTrackingSocket[clientCount];
-        ServerConnection serverConns[] = new ServerConnection[clientCount];
+        IBlockheadServerConnection serverConns[] = new IBlockheadServerConnection[clientCount];
 
         // Connect Multiple Clients
         for (int i = 0; i < clientCount; i++)
@@ -610,7 +610,7 @@
         Future<Session> clientConnectFuture = client.connect(clientSocket,server.getWsUri());
 
         // Server accepts connect
-        ServerConnection serverConn = server.accept();
+        IBlockheadServerConnection serverConn = server.accept();
         serverConn.upgrade();
 
         // client confirms connection via echo
diff --git a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/ClientConnectTest.java b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/ClientConnectTest.java
index 3801c03..6f4110e 100644
--- a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/ClientConnectTest.java
+++ b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/ClientConnectTest.java
@@ -19,6 +19,7 @@
 package org.eclipse.jetty.websocket.client;
 
 import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
 
 import java.io.IOException;
 import java.net.ConnectException;
@@ -36,7 +37,7 @@
 import org.eclipse.jetty.websocket.api.UpgradeException;
 import org.eclipse.jetty.websocket.common.AcceptHash;
 import org.eclipse.jetty.websocket.common.test.BlockheadServer;
-import org.eclipse.jetty.websocket.common.test.BlockheadServer.ServerConnection;
+import org.eclipse.jetty.websocket.common.test.IBlockheadServerConnection;
 import org.eclipse.jetty.websocket.common.test.LeakTrackingBufferPoolRule;
 import org.junit.After;
 import org.junit.Assert;
@@ -111,6 +112,25 @@
     }
 
     @Test
+    public void testUpgradeRequest() throws Exception
+    {
+        JettyTrackingSocket wsocket = new JettyTrackingSocket();
+
+        URI wsUri = server.getWsUri();
+        Future<Session> future = client.connect(wsocket,wsUri);
+
+        IBlockheadServerConnection connection = server.accept();
+        connection.upgrade();
+
+        Session sess = future.get(500,TimeUnit.MILLISECONDS);
+        
+        sess.close();
+        
+        assertThat("Connect.UpgradeRequest", wsocket.connectUpgradeRequest, notNullValue());
+        assertThat("Connect.UpgradeResponse", wsocket.connectUpgradeResponse, notNullValue());
+    }
+
+    @Test
     public void testBadHandshake() throws Exception
     {
         JettyTrackingSocket wsocket = new JettyTrackingSocket();
@@ -118,7 +138,7 @@
         URI wsUri = server.getWsUri();
         Future<Session> future = client.connect(wsocket,wsUri);
 
-        ServerConnection connection = server.accept();
+        IBlockheadServerConnection connection = server.accept();
         connection.readRequest();
         // no upgrade, just fail with a 404 error
         connection.respond("HTTP/1.1 404 NOT FOUND\r\n\r\n");
@@ -147,7 +167,7 @@
         URI wsUri = server.getWsUri();
         Future<Session> future = client.connect(wsocket,wsUri);
 
-        ServerConnection connection = server.accept();
+        IBlockheadServerConnection connection = server.accept();
         connection.readRequest();
         // Send OK to GET but not upgrade
         connection.respond("HTTP/1.1 200 OK\r\n\r\n");
@@ -176,7 +196,7 @@
         URI wsUri = server.getWsUri();
         Future<Session> future = client.connect(wsocket,wsUri);
 
-        ServerConnection connection = server.accept();
+        IBlockheadServerConnection connection = server.accept();
         List<String> requestLines = connection.readRequestLines();
         String key = connection.parseWebSocketKey(requestLines);
 
@@ -212,7 +232,7 @@
         URI wsUri = server.getWsUri();
         Future<Session> future = client.connect(wsocket,wsUri);
 
-        ServerConnection connection = server.accept();
+        IBlockheadServerConnection connection = server.accept();
         List<String> requestLines = connection.readRequestLines();
         String key = connection.parseWebSocketKey(requestLines);
 
@@ -248,7 +268,7 @@
         URI wsUri = server.getWsUri();
         Future<Session> future = client.connect(wsocket,wsUri);
 
-        ServerConnection connection = server.accept();
+        IBlockheadServerConnection connection = server.accept();
         List<String> requestLines = connection.readRequestLines();
         String key = connection.parseWebSocketKey(requestLines);
 
@@ -284,7 +304,7 @@
         URI wsUri = server.getWsUri();
         Future<Session> future = client.connect(wsocket,wsUri);
 
-        ServerConnection connection = server.accept();
+        IBlockheadServerConnection connection = server.accept();
         connection.readRequest();
         // Upgrade badly
         connection.respond("HTTP/1.1 101 Upgrade\r\n" + "Sec-WebSocket-Accept: rubbish\r\n" + "\r\n");
@@ -378,7 +398,7 @@
         URI wsUri = server.getWsUri();
         Future<Session> future = client.connect(wsocket,wsUri);
 
-        ServerConnection ssocket = server.accept();
+        IBlockheadServerConnection ssocket = server.accept();
         Assert.assertNotNull(ssocket);
         // Intentionally don't upgrade
         // ssocket.upgrade();
diff --git a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/CookieTest.java b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/CookieTest.java
index a68c245..02843ea 100644
--- a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/CookieTest.java
+++ b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/CookieTest.java
@@ -37,7 +37,7 @@
 import org.eclipse.jetty.websocket.api.util.QuoteUtil;
 import org.eclipse.jetty.websocket.common.frames.TextFrame;
 import org.eclipse.jetty.websocket.common.test.BlockheadServer;
-import org.eclipse.jetty.websocket.common.test.BlockheadServer.ServerConnection;
+import org.eclipse.jetty.websocket.common.test.IBlockheadServerConnection;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -119,7 +119,7 @@
         Future<Session> clientConnectFuture = client.connect(clientSocket,server.getWsUri());
 
         // Server accepts connect
-        ServerConnection serverConn = server.accept();
+        IBlockheadServerConnection serverConn = server.accept();
 
         // client confirms upgrade and receipt of frame
         String serverCookies = confirmClientUpgradeAndCookies(clientSocket,clientConnectFuture,serverConn);
@@ -144,7 +144,7 @@
         Future<Session> clientConnectFuture = client.connect(clientSocket,server.getWsUri(),request);
 
         // Server accepts connect
-        ServerConnection serverConn = server.accept();
+        IBlockheadServerConnection serverConn = server.accept();
 
         // client confirms upgrade and receipt of frame
         String serverCookies = confirmClientUpgradeAndCookies(clientSocket,clientConnectFuture,serverConn);
@@ -152,7 +152,7 @@
         Assert.assertThat("Cookies seen at server side",serverCookies,containsString("hello=\"world\""));
     }
 
-    private String confirmClientUpgradeAndCookies(CookieTrackingSocket clientSocket, Future<Session> clientConnectFuture, ServerConnection serverConn)
+    private String confirmClientUpgradeAndCookies(CookieTrackingSocket clientSocket, Future<Session> clientConnectFuture, IBlockheadServerConnection serverConn)
             throws Exception
     {
         // Server upgrades
diff --git a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/JettyTrackingSocket.java b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/JettyTrackingSocket.java
index cbb5e59..bb14d87 100644
--- a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/JettyTrackingSocket.java
+++ b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/JettyTrackingSocket.java
@@ -30,6 +30,8 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.api.UpgradeRequest;
+import org.eclipse.jetty.websocket.api.UpgradeResponse;
 import org.eclipse.jetty.websocket.api.WebSocketAdapter;
 import org.junit.Assert;
 
@@ -42,6 +44,8 @@
 
     public int closeCode = -1;
     public Exchanger<String> messageExchanger;
+    public UpgradeRequest connectUpgradeRequest;
+    public UpgradeResponse connectUpgradeResponse;
     public StringBuilder closeMessage = new StringBuilder();
     public CountDownLatch openLatch = new CountDownLatch(1);
     public CountDownLatch closeLatch = new CountDownLatch(1);
@@ -124,6 +128,8 @@
     public void onWebSocketConnect(Session session)
     {
         super.onWebSocketConnect(session);
+        connectUpgradeRequest = session.getUpgradeRequest();
+        connectUpgradeResponse = session.getUpgradeResponse();
         openLatch.countDown();
     }
 
diff --git a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/ServerReadThread.java b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/ServerReadThread.java
index 6bfcd39..f09f1c1 100644
--- a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/ServerReadThread.java
+++ b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/ServerReadThread.java
@@ -18,6 +18,8 @@
 
 package org.eclipse.jetty.websocket.client;
 
+import static org.hamcrest.Matchers.*;
+
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Queue;
@@ -32,24 +34,22 @@
 import org.eclipse.jetty.websocket.common.CloseInfo;
 import org.eclipse.jetty.websocket.common.OpCode;
 import org.eclipse.jetty.websocket.common.WebSocketFrame;
-import org.eclipse.jetty.websocket.common.test.BlockheadServer.ServerConnection;
+import org.eclipse.jetty.websocket.common.test.IBlockheadServerConnection;
 import org.junit.Assert;
 
-import static org.hamcrest.Matchers.is;
-
 public class ServerReadThread extends Thread
 {
     private static final int BUFFER_SIZE = 8192;
     private static final Logger LOG = Log.getLogger(ServerReadThread.class);
-    private final ServerConnection conn;
+    private final IBlockheadServerConnection conn;
     private boolean active = true;
     private int slowness = -1; // disabled is default
     private final AtomicInteger frameCount = new AtomicInteger();
     private final CountDownLatch expectedMessageCount;
 
-    public ServerReadThread(ServerConnection conn, int expectedMessages)
+    public ServerReadThread(IBlockheadServerConnection sconnection, int expectedMessages)
     {
-        this.conn = conn;
+        this.conn = sconnection;
         this.expectedMessageCount = new CountDownLatch(expectedMessages);
     }
 
diff --git a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/ServerWriteThread.java b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/ServerWriteThread.java
index b9f02ee..9f7647e 100644
--- a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/ServerWriteThread.java
+++ b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/ServerWriteThread.java
@@ -25,17 +25,17 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.websocket.common.frames.TextFrame;
-import org.eclipse.jetty.websocket.common.test.BlockheadServer.ServerConnection;
+import org.eclipse.jetty.websocket.common.test.IBlockheadServerConnection;
 
 public class ServerWriteThread extends Thread
 {
     private static final Logger LOG = Log.getLogger(ServerWriteThread.class);
-    private final ServerConnection conn;
+    private final IBlockheadServerConnection conn;
     private int slowness = -1;
     private int messageCount = 100;
     private String message = "Hello";
 
-    public ServerWriteThread(ServerConnection conn)
+    public ServerWriteThread(IBlockheadServerConnection conn)
     {
         this.conn = conn;
     }
diff --git a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/SessionTest.java b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/SessionTest.java
index 011dc0b..c1b9729 100644
--- a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/SessionTest.java
+++ b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/SessionTest.java
@@ -18,7 +18,10 @@
 
 package org.eclipse.jetty.websocket.client;
 
+import static org.hamcrest.Matchers.*;
+
 import java.net.URI;
+import java.util.Collection;
 import java.util.Set;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
@@ -28,15 +31,12 @@
 import org.eclipse.jetty.websocket.api.Session;
 import org.eclipse.jetty.websocket.common.WebSocketSession;
 import org.eclipse.jetty.websocket.common.test.BlockheadServer;
-import org.eclipse.jetty.websocket.common.test.BlockheadServer.ServerConnection;
+import org.eclipse.jetty.websocket.common.test.IBlockheadServerConnection;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-
 public class SessionTest
 {
     private BlockheadServer server;
@@ -70,7 +70,7 @@
             request.setSubProtocols("echo");
             Future<Session> future = client.connect(cliSock,wsUri,request);
 
-            final ServerConnection srvSock = server.accept();
+            final IBlockheadServerConnection srvSock = server.accept();
             srvSock.upgrade();
 
             Session sess = future.get(500,TimeUnit.MILLISECONDS);
@@ -82,18 +82,21 @@
             cliSock.assertWasOpened();
             cliSock.assertNotClosed();
 
-            Assert.assertThat("client.connectionManager.sessions.size",client.getConnectionManager().getSessions().size(),is(1));
+            Collection<WebSocketSession> sessions = client.getBeans(WebSocketSession.class);
+            Assert.assertThat("client.connectionManager.sessions.size",sessions.size(),is(1));
 
             RemoteEndpoint remote = cliSock.getSession().getRemote();
             remote.sendStringByFuture("Hello World!");
             if (remote.getBatchMode() == BatchMode.ON)
+            {
                 remote.flush();
+            }
             srvSock.echoMessage(1,500,TimeUnit.MILLISECONDS);
             // wait for response from server
             cliSock.waitForMessage(500,TimeUnit.MILLISECONDS);
             
             Set<WebSocketSession> open = client.getOpenSessions();
-            Assert.assertThat("Open Sessions.size", open.size(), is(1));
+            Assert.assertThat("(Before Close) Open Sessions.size", open.size(), is(1));
 
             cliSock.assertMessage("Hello World!");
             cliSock.close();
@@ -101,7 +104,7 @@
             
             cliSock.waitForClose(500,TimeUnit.MILLISECONDS);
             open = client.getOpenSessions();
-            Assert.assertThat("Open Sessions.size", open.size(), is(0));
+            Assert.assertThat("(After Close) Open Sessions.size", open.size(), is(0));
         }
         finally
         {
diff --git a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/SlowClientTest.java b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/SlowClientTest.java
index 5647597..ef23cd1 100644
--- a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/SlowClientTest.java
+++ b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/SlowClientTest.java
@@ -18,6 +18,8 @@
 
 package org.eclipse.jetty.websocket.client;
 
+import static org.hamcrest.Matchers.*;
+
 import java.net.URI;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
@@ -27,15 +29,13 @@
 import org.eclipse.jetty.websocket.api.Session;
 import org.eclipse.jetty.websocket.api.StatusCode;
 import org.eclipse.jetty.websocket.common.test.BlockheadServer;
-import org.eclipse.jetty.websocket.common.test.BlockheadServer.ServerConnection;
+import org.eclipse.jetty.websocket.common.test.IBlockheadServerConnection;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
-import static org.hamcrest.Matchers.is;
-
 public class SlowClientTest
 {
     @Rule
@@ -81,7 +81,7 @@
         URI wsUri = server.getWsUri();
         Future<Session> future = client.connect(tsocket, wsUri);
 
-        ServerConnection sconnection = server.accept();
+        IBlockheadServerConnection sconnection = server.accept();
         sconnection.setSoTimeout(60000);
         sconnection.upgrade();
 
diff --git a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/SlowServerTest.java b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/SlowServerTest.java
index c6b426a..bd936de 100644
--- a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/SlowServerTest.java
+++ b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/SlowServerTest.java
@@ -18,6 +18,8 @@
 
 package org.eclipse.jetty.websocket.client;
 
+import static org.hamcrest.Matchers.*;
+
 import java.net.URI;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
@@ -28,15 +30,13 @@
 import org.eclipse.jetty.websocket.api.StatusCode;
 import org.eclipse.jetty.websocket.client.masks.ZeroMasker;
 import org.eclipse.jetty.websocket.common.test.BlockheadServer;
-import org.eclipse.jetty.websocket.common.test.BlockheadServer.ServerConnection;
+import org.eclipse.jetty.websocket.common.test.IBlockheadServerConnection;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
-import static org.hamcrest.Matchers.is;
-
 public class SlowServerTest
 {
     @Rule
@@ -83,7 +83,7 @@
         URI wsUri = server.getWsUri();
         Future<Session> future = client.connect(tsocket,wsUri);
 
-        ServerConnection sconnection = server.accept();
+        IBlockheadServerConnection sconnection = server.accept();
         sconnection.setSoTimeout(60000);
         sconnection.upgrade();
 
@@ -130,7 +130,7 @@
         URI wsUri = server.getWsUri();
         Future<Session> clientConnectFuture = client.connect(clientSocket,wsUri);
 
-        ServerConnection serverConn = server.accept();
+        IBlockheadServerConnection serverConn = server.accept();
         serverConn.setSoTimeout(60000);
         serverConn.upgrade();
 
diff --git a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/TomcatServerQuirksTest.java b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/TomcatServerQuirksTest.java
index a3e2ae9..c81dd2f 100644
--- a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/TomcatServerQuirksTest.java
+++ b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/TomcatServerQuirksTest.java
@@ -28,7 +28,7 @@
 import org.eclipse.jetty.websocket.api.Session;
 import org.eclipse.jetty.websocket.api.WebSocketAdapter;
 import org.eclipse.jetty.websocket.common.test.BlockheadServer;
-import org.eclipse.jetty.websocket.common.test.BlockheadServer.ServerConnection;
+import org.eclipse.jetty.websocket.common.test.IBlockheadServerConnection;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -66,7 +66,7 @@
      * <li><a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=54067">Apache Tomcat Bug #54067</a></li>
      * </ul>
      * 
-     * @throws IOException
+     * @throws Exception on test failure
      */
     @Test
     public void testTomcat7_0_32_WithTransferEncoding() throws Exception
@@ -91,7 +91,7 @@
             client.connect(websocket,wsURI);
 
             // Accept incoming connection
-            ServerConnection socket = server.accept();
+            IBlockheadServerConnection socket = server.accept();
             socket.setSoTimeout(2000); // timeout
 
             // Issue upgrade
@@ -113,8 +113,7 @@
             serverFrame.put((byte)(payload.length & 0xFF)); // second length byte
             serverFrame.put(payload);
             BufferUtil.flipToFlush(serverFrame,0);
-            byte buf[] = BufferUtil.toArray(serverFrame);
-            socket.write(buf,0,buf.length);
+            socket.write(serverFrame);
             socket.flush();
 
             Assert.assertTrue(websocket.dataLatch.await(1000,TimeUnit.SECONDS));
diff --git a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/WebSocketClientTest.java b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/WebSocketClientTest.java
index 56975a0..c2653ed 100644
--- a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/WebSocketClientTest.java
+++ b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/WebSocketClientTest.java
@@ -18,9 +18,12 @@
 
 package org.eclipse.jetty.websocket.client;
 
+import static org.hamcrest.Matchers.*;
+
 import java.net.InetSocketAddress;
 import java.net.URI;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Future;
@@ -32,21 +35,17 @@
 import org.eclipse.jetty.websocket.api.RemoteEndpoint;
 import org.eclipse.jetty.websocket.api.Session;
 import org.eclipse.jetty.websocket.api.UpgradeRequest;
+import org.eclipse.jetty.websocket.common.WebSocketSession;
 import org.eclipse.jetty.websocket.common.frames.TextFrame;
 import org.eclipse.jetty.websocket.common.io.FutureWriteCallback;
 import org.eclipse.jetty.websocket.common.test.BlockheadServer;
-import org.eclipse.jetty.websocket.common.test.BlockheadServer.ServerConnection;
+import org.eclipse.jetty.websocket.common.test.IBlockheadServerConnection;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import static org.hamcrest.Matchers.greaterThan;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.hamcrest.Matchers.nullValue;
-
 @RunWith(AdvancedRunner.class)
 public class WebSocketClientTest
 {
@@ -106,7 +105,7 @@
             request.setSubProtocols("echo");
             Future<Session> future = client.connect(cliSock,wsUri,request);
 
-            final ServerConnection srvSock = server.accept();
+            final IBlockheadServerConnection srvSock = server.accept();
             srvSock.upgrade();
 
             Session sess = future.get(500,TimeUnit.MILLISECONDS);
@@ -118,7 +117,8 @@
             cliSock.assertWasOpened();
             cliSock.assertNotClosed();
 
-            Assert.assertThat("client.connectionManager.sessions.size",client.getConnectionManager().getSessions().size(),is(1));
+            Collection<WebSocketSession> sessions = client.getBeans(WebSocketSession.class);
+            Assert.assertThat("client.connectionManager.sessions.size",sessions.size(),is(1));
 
             RemoteEndpoint remote = cliSock.getSession().getRemote();
             remote.sendStringByFuture("Hello World!");
@@ -152,7 +152,7 @@
             request.setSubProtocols("echo");
             Future<Session> future = client.connect(cliSock,wsUri,request);
 
-            final ServerConnection srvSock = server.accept();
+            final IBlockheadServerConnection srvSock = server.accept();
             srvSock.upgrade();
 
             Session sess = future.get(500,TimeUnit.MILLISECONDS);
@@ -164,7 +164,8 @@
             cliSock.assertWasOpened();
             cliSock.assertNotClosed();
 
-            Assert.assertThat("client.connectionManager.sessions.size",client.getConnectionManager().getSessions().size(),is(1));
+            Collection<WebSocketSession> sessions = client.getBeans(WebSocketSession.class);
+            Assert.assertThat("client.connectionManager.sessions.size",sessions.size(),is(1));
 
             FutureWriteCallback callback = new FutureWriteCallback();
 
@@ -188,7 +189,7 @@
             Future<Session> future = client.connect(wsocket,server.getWsUri());
 
             // Server
-            final ServerConnection srvSock = server.accept();
+            final IBlockheadServerConnection srvSock = server.accept();
             srvSock.upgrade();
 
             // Validate connect
@@ -226,7 +227,7 @@
             URI wsUri = server.getWsUri();
             Future<Session> future = fact.connect(wsocket,wsUri);
 
-            ServerConnection ssocket = server.accept();
+            IBlockheadServerConnection ssocket = server.accept();
             ssocket.upgrade();
 
             future.get(500,TimeUnit.MILLISECONDS);
@@ -266,7 +267,7 @@
             URI wsUri = server.getWsUri();
             Future<Session> future = factSmall.connect(wsocket,wsUri);
 
-            ServerConnection ssocket = server.accept();
+            IBlockheadServerConnection ssocket = server.accept();
             ssocket.upgrade();
 
             future.get(500,TimeUnit.MILLISECONDS);
@@ -304,7 +305,7 @@
             URI wsUri = server.getWsUri();
             Future<Session> future = client.connect(wsocket,wsUri);
 
-            ServerConnection ssocket = server.accept();
+            IBlockheadServerConnection ssocket = server.accept();
             ssocket.upgrade();
 
             wsocket.awaitConnect(1,TimeUnit.SECONDS);
@@ -346,7 +347,7 @@
             URI wsUri = server.getWsUri().resolve("/test?snack=cashews&amount=handful&brand=off");
             Future<Session> future = fact.connect(wsocket,wsUri);
 
-            ServerConnection ssocket = server.accept();
+            IBlockheadServerConnection ssocket = server.accept();
             ssocket.upgrade();
 
             future.get(500,TimeUnit.MILLISECONDS);
diff --git a/jetty-websocket/websocket-common/pom.xml b/jetty-websocket/websocket-common/pom.xml
index 9d548b7..ab9863a 100644
--- a/jetty-websocket/websocket-common/pom.xml
+++ b/jetty-websocket/websocket-common/pom.xml
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.eclipse.jetty.websocket</groupId>
     <artifactId>websocket-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
 
   <modelVersion>4.0.0</modelVersion>
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/BlockingWriteCallback.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/BlockingWriteCallback.java
index 0909a3f..7e0e320 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/BlockingWriteCallback.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/BlockingWriteCallback.java
@@ -24,9 +24,8 @@
 import org.eclipse.jetty.util.SharedBlockingCallback;
 import org.eclipse.jetty.websocket.api.WriteCallback;
 
-
-/* ------------------------------------------------------------ */
-/** extend a SharedlBlockingCallback to an websocket WriteCallback
+/**
+ * Extends a {@link SharedBlockingCallback} to a WebSocket {@link WriteCallback}
  */
 public class BlockingWriteCallback extends SharedBlockingCallback
 {
@@ -39,11 +38,11 @@
         return new WriteBlocker(acquire());
     }
     
-    public static class WriteBlocker implements WriteCallback, Callback, AutoCloseable
+    public static class WriteBlocker implements WriteCallback, Callback.NonBlocking, AutoCloseable
     {
-        Blocker blocker;
+        private final Blocker blocker;
         
-        WriteBlocker(Blocker blocker)
+        protected WriteBlocker(Blocker blocker)
         {
             this.blocker=blocker;
         }
@@ -73,7 +72,7 @@
         }
         
         @Override
-        public void close() throws IOException
+        public void close()
         {
             blocker.close();
         }
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/ConnectionState.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/ConnectionState.java
index ae94f7e..95293ce 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/ConnectionState.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/ConnectionState.java
@@ -18,6 +18,9 @@
 
 package org.eclipse.jetty.websocket.common;
 
+import org.eclipse.jetty.websocket.common.io.IOState;
+import org.eclipse.jetty.websocket.common.io.IOState.ConnectionStateListener;
+
 /**
  * Connection states as outlined in <a href="https://tools.ietf.org/html/rfc6455">RFC6455</a>.
  */
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/LogicalConnection.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/LogicalConnection.java
index df0dfb3..ebbd2ca 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/LogicalConnection.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/LogicalConnection.java
@@ -22,6 +22,7 @@
 import java.util.concurrent.Executor;
 
 import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.websocket.api.StatusCode;
 import org.eclipse.jetty.websocket.api.SuspendToken;
 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
 import org.eclipse.jetty.websocket.api.extensions.IncomingFrames;
@@ -60,11 +61,13 @@
 
     /**
      * Get the ByteBufferPool in use by the connection
+     * @return the buffer pool
      */
     ByteBufferPool getBufferPool();
     
     /**
      * Get the Executor used by this connection.
+     * @return the executor
      */
     Executor getExecutor();
 
@@ -113,13 +116,6 @@
     InetSocketAddress getRemoteAddress();
 
     /**
-     * Get the Session for this connection
-     * 
-     * @return the Session for this connection
-     */
-    WebSocketSession getSession();
-
-    /**
      * Test if logical connection is still open
      * 
      *  @return true if connection is open
@@ -155,15 +151,8 @@
     void setNextIncomingFrames(IncomingFrames incoming);
 
     /**
-     * Set the session associated with this connection
-     * 
-     * @param session
-     *            the session
-     */
-    void setSession(WebSocketSession session);
-
-    /**
      * Suspend a the incoming read events on the connection.
+     * @return the suspend token
      */
     SuspendToken suspend();
 }
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/OpCode.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/OpCode.java
index a4f5018..19d5df5 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/OpCode.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/OpCode.java
@@ -99,7 +99,8 @@
                 return "CONTINUATION";
             case TEXT:
                 return "TEXT";
-            case BINARY: return "BINARY";
+            case BINARY:
+                return "BINARY";
             case CLOSE:
                 return "CLOSE";
             case PING:
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/Parser.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/Parser.java
index a9a2c18..74d50d1 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/Parser.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/Parser.java
@@ -248,8 +248,6 @@
         }
         try
         {
-            // TODO: create DebugBuffer
-
             // parse through all the frames in the buffer
             while (parseFrame(buffer))
             {
@@ -332,9 +330,9 @@
                                 policy.getBehavior(),
                                 OpCode.name(opcode),
                                 fin,
-                                (isRsv1InUse()?'1':'.'),
-                                (isRsv2InUse()?'1':'.'),
-                                (isRsv3InUse()?'1':'.'));
+                                (((b & 0x40) != 0)?'1':'.'),
+                                (((b & 0x20) != 0)?'1':'.'),
+                                (((b & 0x10) != 0)?'1':'.'));
 
                     // base framing flags
                     switch(opcode)
@@ -653,7 +651,7 @@
         builder.append(",c=").append(cursor);
         builder.append(",len=").append(payloadLength);
         builder.append(",f=").append(frame);
-        builder.append(",p=").append(policy);
+        // builder.append(",p=").append(policy);
         builder.append("]");
         return builder.toString();
     }
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketFrame.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketFrame.java
index be64a68..ad61202 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketFrame.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketFrame.java
@@ -96,7 +96,6 @@
 
     /**
      * Combined FIN + RSV1 + RSV2 + RSV3 + OpCode byte.
-     * <p>
      * 
      * <pre>
      *   1000_0000 (0x80) = fin
@@ -119,6 +118,7 @@
 
     /**
      * Construct form opcode
+     * @param opcode the opcode the frame is based on
      */
     protected WebSocketFrame(byte opcode)
     {
@@ -341,6 +341,7 @@
      * 
      * @param buf
      *            the bytebuffer to set
+     * @return the frame itself
      */
     public WebSocketFrame setPayload(ByteBuffer buf)
     {
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketSession.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketSession.java
index e0e2c91..7e4bb33 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketSession.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketSession.java
@@ -24,16 +24,20 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.Executor;
 
 import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.Connection;
 import org.eclipse.jetty.util.annotation.ManagedAttribute;
 import org.eclipse.jetty.util.annotation.ManagedObject;
 import org.eclipse.jetty.util.component.ContainerLifeCycle;
 import org.eclipse.jetty.util.component.Dumpable;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.thread.ThreadClassLoaderScope;
 import org.eclipse.jetty.websocket.api.BatchMode;
+import org.eclipse.jetty.websocket.api.CloseException;
 import org.eclipse.jetty.websocket.api.CloseStatus;
 import org.eclipse.jetty.websocket.api.RemoteEndpoint;
 import org.eclipse.jetty.websocket.api.Session;
@@ -51,14 +55,18 @@
 import org.eclipse.jetty.websocket.common.events.EventDriver;
 import org.eclipse.jetty.websocket.common.io.IOState;
 import org.eclipse.jetty.websocket.common.io.IOState.ConnectionStateListener;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketSessionScope;
 
 @ManagedObject("A Jetty WebSocket Session")
-public class WebSocketSession extends ContainerLifeCycle implements Session, IncomingFrames, ConnectionStateListener
+public class WebSocketSession extends ContainerLifeCycle implements Session, WebSocketSessionScope, IncomingFrames, Connection.Listener, ConnectionStateListener
 {
     private static final Logger LOG = Log.getLogger(WebSocketSession.class);
+    private static final Logger LOG_OPEN = Log.getLogger(WebSocketSession.class.getName() + "_OPEN");
+    private final WebSocketContainerScope containerScope;
     private final URI requestURI;
-    private final EventDriver websocket;
     private final LogicalConnection connection;
+    private final EventDriver websocket;
     private final SessionListener[] sessionListeners;
     private final Executor executor;
     private ClassLoader classLoader;
@@ -71,16 +79,14 @@
     private WebSocketPolicy policy;
     private UpgradeRequest upgradeRequest;
     private UpgradeResponse upgradeResponse;
-    private BatchMode batchMode = BatchMode.AUTO;
 
-    public WebSocketSession(URI requestURI, EventDriver websocket, LogicalConnection connection, SessionListener... sessionListeners)
+    public WebSocketSession(WebSocketContainerScope containerScope, URI requestURI, EventDriver websocket, LogicalConnection connection, SessionListener... sessionListeners)
     {
-        if (requestURI == null)
-        {
-            throw new RuntimeException("Request URI cannot be null");
-        }
+        Objects.requireNonNull(containerScope,"Container Scope cannot be null");
+        Objects.requireNonNull(requestURI,"Request URI cannot be null");
 
         this.classLoader = Thread.currentThread().getContextClassLoader();
+        this.containerScope = containerScope;
         this.requestURI = requestURI;
         this.websocket = websocket;
         this.connection = connection;
@@ -89,6 +95,9 @@
         this.outgoingHandler = connection;
         this.incomingHandler = websocket;
         this.connection.getIOState().addListener(this);
+        
+        addBean(this.connection);
+        addBean(this.websocket);
     }
 
     @Override
@@ -125,7 +134,36 @@
     {
         executor.execute(runnable);
     }
+    
+    @Override
+    protected void doStart() throws Exception
+    {
+        if(LOG.isDebugEnabled())
+            LOG.debug("starting - {}",this);
 
+        super.doStart();
+    }
+    
+    @Override
+    protected void doStop() throws Exception
+    {
+        if(LOG.isDebugEnabled())
+            LOG.debug("stopping - {}",this);
+        
+        if (getConnection() != null)
+        {
+            try
+            {
+                getConnection().close(StatusCode.SHUTDOWN,"Shutdown");
+            }
+            catch (Throwable t)
+            {
+                LOG.debug("During Connection Shutdown",t);
+            }
+        }
+        super.doStop();
+    }
+    
     @Override
     public void dump(Appendable out, String indent) throws IOException
     {
@@ -196,6 +234,12 @@
         return connection;
     }
 
+    @Override
+    public WebSocketContainerScope getContainerScope()
+    {
+        return this.containerScope;
+    }
+
     public ExtensionFactory getExtensionFactory()
     {
         return extensionFactory;
@@ -243,12 +287,16 @@
     @Override
     public RemoteEndpoint getRemote()
     {
-        if (connection.getIOState().isOutputAvailable())
+        if(LOG_OPEN.isDebugEnabled())
+            LOG_OPEN.debug("[{}] {}.getRemote()",policy.getBehavior(),this.getClass().getSimpleName());
+        ConnectionState state = connection.getIOState().getConnectionState();
+
+        if ((state == ConnectionState.OPEN) || (state == ConnectionState.CONNECTED))
         {
             return remote;
         }
 
-        throw new WebSocketException("RemoteEndpoint unavailable, outgoing connection not open");
+        throw new WebSocketException("RemoteEndpoint unavailable, current state [" + state + "], expecting [OPEN or CONNECTED]");
     }
 
     @Override
@@ -273,6 +321,13 @@
     {
         return this.upgradeResponse;
     }
+    
+
+    @Override
+    public WebSocketSession getWebSocketSession()
+    {
+        return this;
+    }
 
     @Override
     public int hashCode()
@@ -302,10 +357,19 @@
     @Override
     public void incomingFrame(Frame frame)
     {
-        if (connection.getIOState().isInputAvailable())
+        ClassLoader old = Thread.currentThread().getContextClassLoader();
+        try
         {
-            // Forward Frames Through Extension List
-            incomingHandler.incomingFrame(frame);
+            Thread.currentThread().setContextClassLoader(classLoader);
+            if (connection.getIOState().isInputAvailable())
+            {
+                // Forward Frames Through Extension List
+                incomingHandler.incomingFrame(frame);
+            }
+        }
+        finally
+        {
+            Thread.currentThread().setContextClassLoader(old);
         }
     }
 
@@ -345,6 +409,19 @@
     {
         incomingError(cause);
     }
+    
+    @Override
+    public void onClosed(Connection connection)
+    {
+    }
+    
+    @Override
+    public void onOpened(Connection connection)
+    {
+        if(LOG_OPEN.isDebugEnabled())
+            LOG_OPEN.debug("[{}] {}.onOpened()",policy.getBehavior(),this.getClass().getSimpleName());
+        open();
+    }
 
     @SuppressWarnings("incomplete-switch")
     @Override
@@ -353,6 +430,11 @@
         switch (state)
         {
             case CLOSED:
+                IOState ioState = this.connection.getIOState();
+                CloseInfo close = ioState.getCloseInfo();
+                // confirmed close of local endpoint
+                notifyClose(close.getStatusCode(),close.getReason());
+                
                 // notify session listeners
                 for (SessionListener listener : sessionListeners)
                 {
@@ -367,17 +449,15 @@
                         LOG.ignore(t);
                     }
                 }
-                IOState ioState = this.connection.getIOState();
-                CloseInfo close = ioState.getCloseInfo();
-                // confirmed close of local endpoint
-                notifyClose(close.getStatusCode(),close.getReason());
                 break;
-            case OPEN:
+            case CONNECTED:
                 // notify session listeners
                 for (SessionListener listener : sessionListeners)
                 {
                     try
                     {
+                        if (LOG.isDebugEnabled())
+                            LOG.debug("{}.onSessionOpen()", listener.getClass().getSimpleName());
                         listener.onSessionOpened(this);
                     }
                     catch (Throwable t)
@@ -388,34 +468,31 @@
                 break;
         }
     }
-
+    
     /**
      * Open/Activate the session
      */
     public void open()
     {
+        if(LOG_OPEN.isDebugEnabled())
+            LOG_OPEN.debug("[{}] {}.open()",policy.getBehavior(),this.getClass().getSimpleName());
+
         if (remote != null)
         {
             // already opened
             return;
         }
         
-        ClassLoader old = Thread.currentThread().getContextClassLoader();
-        try 
+        try(ThreadClassLoaderScope scope = new ThreadClassLoaderScope(classLoader)) 
         {
-            Thread.currentThread().setContextClassLoader(classLoader);
-
             // Upgrade success
             connection.getIOState().onConnected();
-            
+    
             // Connect remote
-            BatchMode endpointBatchMode = websocket.getBatchMode();
-            if (endpointBatchMode == null)
-            {
-                endpointBatchMode = this.getBatchMode();
-            }
-            remote = new WebSocketRemoteEndpoint(connection,outgoingHandler,endpointBatchMode);
-
+            remote = new WebSocketRemoteEndpoint(connection,outgoingHandler,getBatchMode());
+            if(LOG_OPEN.isDebugEnabled())
+                LOG_OPEN.debug("[{}] {}.open() remote={}",policy.getBehavior(),this.getClass().getSimpleName(),remote);
+            
             // Open WebSocket
             websocket.openSession(this);
 
@@ -427,8 +504,14 @@
                 LOG.debug("open -> {}",dump());
             }
         }
+        catch (CloseException ce)
+        {
+            LOG.warn(ce);
+            close(ce.getStatusCode(),ce.getMessage());
+        }
         catch (Throwable t)
         {
+            LOG.warn(t);
             // Exception on end-user WS-Endpoint.
             // Fast-fail & close connection with reason.
             int statusCode = StatusCode.SERVER_ERROR;
@@ -436,15 +519,10 @@
             {
                 statusCode = StatusCode.POLICY_VIOLATION;
             }
-            
             close(statusCode,t.getMessage());
         }
-        finally
-        {
-            Thread.currentThread().setContextClassLoader(old);
-        }
     }
-
+    
     public void setExtensionFactory(ExtensionFactory extensionFactory)
     {
         this.extensionFactory = extensionFactory;
@@ -503,20 +581,11 @@
     }
 
     /**
-     * @return the batching mode default for RemoteEndpoint behavior
+     * @return the default (initial) value for the batching mode.
      */
     public BatchMode getBatchMode()
     {
-        return batchMode;
-    }
-    
-    /**
-     * Set the batch mode default for the RemoteEndpoint behavior.
-     * @param mode the batching mode.
-     */
-    public void setBatchMode(BatchMode mode)
-    {
-        this.batchMode = mode;
+        return BatchMode.AUTO;
     }
 
     @Override
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketSessionFactory.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketSessionFactory.java
index 24887cf..1f9b026 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketSessionFactory.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketSessionFactory.java
@@ -23,18 +23,35 @@
 import org.eclipse.jetty.websocket.common.events.EventDriver;
 import org.eclipse.jetty.websocket.common.events.JettyAnnotatedEventDriver;
 import org.eclipse.jetty.websocket.common.events.JettyListenerEventDriver;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 
 /**
  * Default Session factory, creating WebSocketSession objects.
  */
 public class WebSocketSessionFactory implements SessionFactory
 {
+    private final WebSocketContainerScope containerScope;
     private final SessionListener[] listeners;
 
-    public WebSocketSessionFactory(SessionListener... sessionListeners)
+    public WebSocketSessionFactory(WebSocketContainerScope containerScope, SessionListener... sessionListeners)
     {
-        listeners = sessionListeners;
-    }
+        this.containerScope = containerScope;
+        if ((sessionListeners != null) && (sessionListeners.length > 0))
+        {
+            this.listeners = sessionListeners;
+        }
+        else
+        {
+            if (this.containerScope instanceof SessionListener)
+            {
+                this.listeners = new SessionListener[] { (SessionListener)containerScope };
+            }
+            else
+            {
+                this.listeners = new SessionListener[0];
+            }
+        }
+   }
 
     @Override
     public boolean supports(EventDriver websocket)
@@ -45,6 +62,6 @@
     @Override
     public WebSocketSession createSession(URI requestURI, EventDriver websocket, LogicalConnection connection)
     {
-        return new WebSocketSession(requestURI,websocket,connection,listeners);
+        return new WebSocketSession(containerScope, requestURI,websocket,connection,listeners);
     }
 }
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/AbstractEventDriver.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/AbstractEventDriver.java
index df26e7e..8ccce72 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/AbstractEventDriver.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/AbstractEventDriver.java
@@ -23,6 +23,7 @@
 
 import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.util.Utf8Appendable.NotUtf8Exception;
+import org.eclipse.jetty.util.component.AbstractLifeCycle;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.websocket.api.BatchMode;
@@ -40,11 +41,11 @@
 /**
  * EventDriver is the main interface between the User's WebSocket POJO and the internal jetty implementation of WebSocket.
  */
-public abstract class AbstractEventDriver implements IncomingFrames, EventDriver
+public abstract class AbstractEventDriver extends AbstractLifeCycle implements IncomingFrames, EventDriver
 {
     private static final Logger LOG = Log.getLogger(AbstractEventDriver.class);
     protected final Logger TARGET_LOG;
-    protected final WebSocketPolicy policy;
+    protected WebSocketPolicy policy;
     protected final Object websocket;
     protected WebSocketSession session;
     protected MessageAppender activeMessage;
@@ -222,6 +223,7 @@
         if (LOG.isDebugEnabled())
             LOG.debug("openSession({})",session);
         this.session = session;
+        this.session.getContainerScope().getObjectFactory().decorate(this.websocket);
         try
         {
             this.onConnect();
@@ -232,6 +234,12 @@
             throw t;
         }
     }
+    
+    @Override
+    protected void doStop() throws Exception
+    {
+        session = null;
+    }
 
     protected void terminateConnection(int statusCode, String rawreason)
     {
@@ -244,6 +252,12 @@
     {
         TARGET_LOG.warn("Unhandled Error (closing connection)",t);
         onError(t);
+        
+        if (t instanceof CloseException)
+        {
+            terminateConnection(((CloseException)t).getStatusCode(),t.getClass().getSimpleName());
+            return;
+        }
 
         // Unhandled Error, close the connection.
         switch (policy.getBehavior())
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/EventDriverFactory.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/EventDriverFactory.java
index fa33843..352115e 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/EventDriverFactory.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/EventDriverFactory.java
@@ -24,7 +24,9 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.websocket.api.InvalidWebSocketException;
+import org.eclipse.jetty.websocket.api.WebSocketListener;
 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
+import org.eclipse.jetty.websocket.api.annotations.WebSocket;
 
 /**
  * Create EventDriver implementations.
@@ -99,7 +101,7 @@
      * Wrap the given WebSocket object instance in a suitable EventDriver
      * 
      * @param websocket
-     *            the websocket instance to wrap. Must either implement {@link WebSocketListener} or be annotated with {@link WebSocket &#064WebSocket}
+     *            the websocket instance to wrap. Must either implement {@link WebSocketListener} or be annotated with {@link WebSocket &#064;WebSocket}
      * @return appropriate EventDriver for this websocket instance.
      */
     public EventDriver wrap(Object websocket)
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/JettyListenerEventDriver.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/JettyListenerEventDriver.java
index 376a1ce..9d5e8a5 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/JettyListenerEventDriver.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/JettyListenerEventDriver.java
@@ -25,12 +25,19 @@
 
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.websocket.api.WebSocketConnectionListener;
+import org.eclipse.jetty.websocket.api.WebSocketFrameListener;
 import org.eclipse.jetty.websocket.api.WebSocketListener;
+import org.eclipse.jetty.websocket.api.WebSocketPartialListener;
+import org.eclipse.jetty.websocket.api.WebSocketPingPongListener;
 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
 import org.eclipse.jetty.websocket.api.extensions.Frame;
+import org.eclipse.jetty.websocket.api.extensions.Frame.Type;
 import org.eclipse.jetty.websocket.common.CloseInfo;
+import org.eclipse.jetty.websocket.common.frames.ReadOnlyDelegatedFrame;
 import org.eclipse.jetty.websocket.common.message.SimpleBinaryMessage;
 import org.eclipse.jetty.websocket.common.message.SimpleTextMessage;
+import org.eclipse.jetty.websocket.common.util.Utf8PartialBuilder;
 
 /**
  * Handler for {@link WebSocketListener} based User WebSocket implementations.
@@ -38,10 +45,11 @@
 public class JettyListenerEventDriver extends AbstractEventDriver
 {
     private static final Logger LOG = Log.getLogger(JettyListenerEventDriver.class);
-    private final WebSocketListener listener;
+    private final WebSocketConnectionListener listener;
+    private Utf8PartialBuilder utf8Partial;
     private boolean hasCloseBeenCalled = false;
 
-    public JettyListenerEventDriver(WebSocketPolicy policy, WebSocketListener listener)
+    public JettyListenerEventDriver(WebSocketPolicy policy, WebSocketConnectionListener listener)
     {
         super(policy,listener);
         this.listener = listener;
@@ -50,18 +58,29 @@
     @Override
     public void onBinaryFrame(ByteBuffer buffer, boolean fin) throws IOException
     {
-        if (activeMessage == null)
+        if (listener instanceof WebSocketListener)
         {
-            activeMessage = new SimpleBinaryMessage(this);
+            if (activeMessage == null)
+            {
+                activeMessage = new SimpleBinaryMessage(this);
+            }
+
+            appendMessage(buffer,fin);
         }
 
-        appendMessage(buffer,fin);
+        if (listener instanceof WebSocketPartialListener)
+        {
+            ((WebSocketPartialListener)listener).onWebSocketPartialBinary(buffer.slice().asReadOnlyBuffer(),fin);
+        }
     }
 
     @Override
     public void onBinaryMessage(byte[] data)
     {
-        listener.onWebSocketBinary(data,0,data.length);
+        if (listener instanceof WebSocketListener)
+        {
+            ((WebSocketListener)listener).onWebSocketBinary(data,0,data.length);
+        }
     }
 
     @Override
@@ -96,7 +115,22 @@
     @Override
     public void onFrame(Frame frame)
     {
-        /* ignore, not supported by WebSocketListener */
+        if (listener instanceof WebSocketFrameListener)
+        {
+            ((WebSocketFrameListener)listener).onWebSocketFrame(new ReadOnlyDelegatedFrame(frame));
+        }
+
+        if (listener instanceof WebSocketPingPongListener)
+        {
+            if (frame.getType() == Type.PING)
+            {
+                ((WebSocketPingPongListener)listener).onWebSocketPing(frame.getPayload().asReadOnlyBuffer());
+            }
+            else if (frame.getType() == Type.PONG)
+            {
+                ((WebSocketPingPongListener)listener).onWebSocketPong(frame.getPayload().asReadOnlyBuffer());
+            }
+        }
     }
 
     @Override
@@ -114,18 +148,46 @@
     @Override
     public void onTextFrame(ByteBuffer buffer, boolean fin) throws IOException
     {
-        if (activeMessage == null)
+        if (listener instanceof WebSocketListener)
         {
-            activeMessage = new SimpleTextMessage(this);
+            if (activeMessage == null)
+            {
+                activeMessage = new SimpleTextMessage(this);
+            }
+
+            appendMessage(buffer,fin);
         }
 
-        appendMessage(buffer,fin);
+        if (listener instanceof WebSocketPartialListener)
+        {
+            if (utf8Partial == null)
+            {
+                utf8Partial = new Utf8PartialBuilder();
+            }
+            
+            String partial = utf8Partial.toPartialString(buffer);
+            
+            ((WebSocketPartialListener)listener).onWebSocketPartialText(partial,fin);
+            
+            if (fin)
+            {
+                partial = null;
+            }
+        }
     }
 
+    /**
+     * Whole Message event.
+     * 
+     * @param message the whole message
+     */
     @Override
     public void onTextMessage(String message)
     {
-        listener.onWebSocketText(message);
+        if (listener instanceof WebSocketListener)
+        {
+            ((WebSocketListener)listener).onWebSocketText(message);
+        }
     }
 
     @Override
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/JettyListenerImpl.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/JettyListenerImpl.java
index 720864a..0da6075 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/JettyListenerImpl.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/JettyListenerImpl.java
@@ -18,6 +18,7 @@
 
 package org.eclipse.jetty.websocket.common.events;
 
+import org.eclipse.jetty.websocket.api.WebSocketConnectionListener;
 import org.eclipse.jetty.websocket.api.WebSocketListener;
 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
 
@@ -26,7 +27,7 @@
     @Override
     public EventDriver create(Object websocket, WebSocketPolicy policy)
     {
-        WebSocketListener listener = (WebSocketListener)websocket;
+        WebSocketConnectionListener listener = (WebSocketConnectionListener)websocket;
         return new JettyListenerEventDriver(policy,listener);
     }
 
@@ -39,6 +40,6 @@
     @Override
     public boolean supports(Object websocket)
     {
-        return (websocket instanceof WebSocketListener);
+        return (websocket instanceof WebSocketConnectionListener);
     }
 }
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/annotated/AbstractMethodAnnotationScanner.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/annotated/AbstractMethodAnnotationScanner.java
index 480e10b..18300b3 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/annotated/AbstractMethodAnnotationScanner.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/annotated/AbstractMethodAnnotationScanner.java
@@ -27,6 +27,7 @@
 
 /**
  * Basic scanner for Annotated Methods
+ * @param <T> The type of metadata
  */
 public abstract class AbstractMethodAnnotationScanner<T>
 {
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/annotated/CallableMethod.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/annotated/CallableMethod.java
index 69b97c6..c44496a 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/annotated/CallableMethod.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/annotated/CallableMethod.java
@@ -55,7 +55,8 @@
 
         if (obj == null)
         {
-            LOG.warn("Cannot call {} on null object",this.method);
+            String err = String.format("Cannot call %s on null object", this.method);
+            LOG.warn(new RuntimeException(err));            
             return null;
         }
 
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/AbstractExtension.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/AbstractExtension.java
index c35fe8f..93519e6 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/AbstractExtension.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/AbstractExtension.java
@@ -35,6 +35,7 @@
 import org.eclipse.jetty.websocket.api.extensions.IncomingFrames;
 import org.eclipse.jetty.websocket.api.extensions.OutgoingFrames;
 import org.eclipse.jetty.websocket.common.LogicalConnection;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 
 @ManagedObject("Abstract Extension")
 public abstract class AbstractExtension extends ContainerLifeCycle implements Extension
@@ -67,6 +68,12 @@
         out.append(heading).append(" : ");
         out.append(bean.toString());
     }
+    
+    public void init(WebSocketContainerScope container)
+    {
+        this.policy = container.getPolicy();
+        this.bufferPool = container.getBufferPool();
+    }
 
     public ByteBufferPool getBufferPool()
     {
@@ -183,7 +190,7 @@
     {
         this.connection = connection;
     }
-
+    
     @Override
     public void setNextIncomingFrames(IncomingFrames nextIncoming)
     {
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/FrameCaptureExtension.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/FrameCaptureExtension.java
new file mode 100644
index 0000000..c4a43e4
--- /dev/null
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/FrameCaptureExtension.java
@@ -0,0 +1,187 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.common.extensions;
+
+import static java.nio.file.StandardOpenOption.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.SeekableByteChannel;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Calendar;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.StringUtil;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.websocket.api.BatchMode;
+import org.eclipse.jetty.websocket.api.WebSocketPolicy;
+import org.eclipse.jetty.websocket.api.WriteCallback;
+import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
+import org.eclipse.jetty.websocket.api.extensions.Frame;
+import org.eclipse.jetty.websocket.common.Generator;
+import org.eclipse.jetty.websocket.common.WebSocketFrame;
+
+public class FrameCaptureExtension extends AbstractExtension
+{
+    private static final Logger LOG = Log.getLogger(FrameCaptureExtension.class);
+
+    private static final int BUFSIZE = 32768;
+    private Generator generator;
+    private Path outputDir;
+    private String prefix = "frame";
+    private Path incomingFramesPath;
+    private Path outgoingFramesPath;
+    
+    private AtomicInteger incomingCount = new AtomicInteger(0);
+    private AtomicInteger outgoingCount = new AtomicInteger(0);
+
+    private SeekableByteChannel incomingChannel;
+    private SeekableByteChannel outgoingChannel;
+
+    @Override
+    public String getName()
+    {
+        return "@frame-capture";
+    }
+
+    @Override
+    public void incomingFrame(Frame frame)
+    {
+        saveFrame(frame,false);
+        try
+        {
+            nextIncomingFrame(frame);
+        }
+        catch (Throwable t)
+        {
+            IO.close(incomingChannel);
+            incomingChannel = null;
+            throw t;
+        }
+    }
+
+    @Override
+    public void outgoingFrame(Frame frame, WriteCallback callback, BatchMode batchMode)
+    {
+        saveFrame(frame,true);
+        try
+        {
+            nextOutgoingFrame(frame,callback,batchMode);
+        }
+        catch (Throwable t)
+        {
+            IO.close(outgoingChannel);
+            outgoingChannel = null;
+            throw t;
+        }
+    }
+
+    private void saveFrame(Frame frame, boolean outgoing)
+    {
+        if (outputDir == null || generator == null)
+        {
+            return;
+        }
+
+        @SuppressWarnings("resource")
+        SeekableByteChannel channel = (outgoing) ? outgoingChannel : incomingChannel;
+        
+        if (channel == null)
+        {
+            return;
+        }
+
+        ByteBuffer buf = getBufferPool().acquire(BUFSIZE,false);
+
+        try
+        {
+            WebSocketFrame f = WebSocketFrame.copy(frame);
+            f.setMasked(false);
+            generator.generateHeaderBytes(f,buf);
+            channel.write(buf);
+            if (frame.hasPayload())
+            {
+                channel.write(frame.getPayload().slice());
+            }
+            if (LOG.isDebugEnabled())
+                LOG.debug("Saved {} frame #{}",(outgoing) ? "outgoing" : "incoming",
+                        (outgoing) ? outgoingCount.incrementAndGet() : incomingCount.incrementAndGet());
+        }
+        catch (IOException e)
+        {
+            LOG.warn("Unable to save frame: " + frame,e);
+        }
+        finally
+        {
+            getBufferPool().release(buf);
+        }
+    }
+
+    @Override
+    public void setConfig(ExtensionConfig config)
+    {
+        super.setConfig(config);
+
+        String cfgOutputDir = config.getParameter("output-dir",null);
+        if (StringUtil.isNotBlank(cfgOutputDir))
+        {
+            Path path = new File(cfgOutputDir).toPath();
+            if (Files.isDirectory(path) && Files.exists(path) && Files.isWritable(path))
+            {
+                this.outputDir = path;
+            }
+            else
+            {
+                LOG.warn("Unable to configure {}: not a valid output directory",path.toAbsolutePath().toString());
+            }
+        }
+
+        String cfgPrefix = config.getParameter("prefix","frame");
+        if (StringUtil.isNotBlank(cfgPrefix))
+        {
+            this.prefix = cfgPrefix;
+        }
+
+        if (this.outputDir != null)
+        {
+            try
+            {
+                Path dir = this.outputDir.toRealPath();
+
+                // create a non-validating, read-only generator
+                String tstamp = String.format("%1$tY%1$tm%1$td-%1$tH%1$tM%1$tS",Calendar.getInstance());
+                incomingFramesPath = dir.resolve(String.format("%s-%s-incoming.dat",this.prefix,tstamp));
+                outgoingFramesPath = dir.resolve(String.format("%s-%s-outgoing.dat",this.prefix,tstamp));
+
+                incomingChannel = Files.newByteChannel(incomingFramesPath,CREATE,WRITE);
+                outgoingChannel = Files.newByteChannel(outgoingFramesPath,CREATE,WRITE);
+
+                this.generator = new Generator(WebSocketPolicy.newServerPolicy(),getBufferPool(),false,true);
+            }
+            catch (IOException e)
+            {
+                LOG.warn("Unable to create capture file(s)",e);
+            }
+        }
+    }
+}
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/FrameDebugExtension.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/FrameDebugExtension.java
deleted file mode 100644
index d9b540a..0000000
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/FrameDebugExtension.java
+++ /dev/null
@@ -1,142 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.websocket.common.extensions;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.channels.SeekableByteChannel;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.StandardOpenOption;
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.eclipse.jetty.util.StringUtil;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.websocket.api.BatchMode;
-import org.eclipse.jetty.websocket.api.WriteCallback;
-import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
-import org.eclipse.jetty.websocket.api.extensions.Frame;
-import org.eclipse.jetty.websocket.common.Generator;
-
-public class FrameDebugExtension extends AbstractExtension
-{
-    private static final Logger LOG = Log.getLogger(FrameDebugExtension.class);
-
-    private static final int BUFSIZE = 32768;
-    private Generator generator;
-    private Path outputDir;
-    private String prefix = "frame";
-    private AtomicLong incomingId = new AtomicLong(0);
-    private AtomicLong outgoingId = new AtomicLong(0);
-
-    @Override
-    public String getName()
-    {
-        return "@frame-debug";
-    }
-
-    @Override
-    public void incomingFrame(Frame frame)
-    {
-        saveFrame(frame,false);
-        nextIncomingFrame(frame);
-    }
-
-    @Override
-    public void outgoingFrame(Frame frame, WriteCallback callback, BatchMode batchMode)
-    {
-        saveFrame(frame,true);
-        nextOutgoingFrame(frame,callback,batchMode);
-    }
-
-    private void saveFrame(Frame frame, boolean outgoing)
-    {
-        if (outputDir == null || generator == null)
-        {
-            return;
-        }
-
-        StringBuilder filename = new StringBuilder();
-        filename.append(prefix);
-        if (outgoing)
-        {
-            filename.append(String.format("-outgoing-%05d",outgoingId.getAndIncrement()));
-        }
-        else
-        {
-            filename.append(String.format("-incoming-%05d",incomingId.getAndIncrement()));
-        }
-        filename.append(".dat");
-
-        Path outputFile = outputDir.resolve(filename.toString());
-        ByteBuffer buf = getBufferPool().acquire(BUFSIZE,false);
-        try (SeekableByteChannel channel = Files.newByteChannel(outputFile,StandardOpenOption.CREATE,StandardOpenOption.WRITE))
-        {
-            generator.generateHeaderBytes(frame,buf);
-            channel.write(buf);
-            if (frame.hasPayload())
-            {
-                channel.write(frame.getPayload().slice());
-            }
-            LOG.debug("Saved raw frame: {}",outputFile.toString());
-        }
-        catch (IOException e)
-        {
-            LOG.warn("Unable to save frame: " + filename.toString(),e);
-        }
-        finally
-        {
-            getBufferPool().release(buf);
-        }
-    }
-
-    @Override
-    public void setConfig(ExtensionConfig config)
-    {
-        super.setConfig(config);
-
-        String cfgOutputDir = config.getParameter("output-dir",null);
-        if (StringUtil.isNotBlank(cfgOutputDir))
-        {
-            Path path = new File(cfgOutputDir).toPath();
-            if (Files.isDirectory(path) && Files.exists(path) && Files.isWritable(path))
-            {
-                this.outputDir = path;
-            }
-            else
-            {
-                LOG.warn("Unable to configure {}: not a valid output directory",path.toAbsolutePath().toString());
-            }
-        }
-
-        String cfgPrefix = config.getParameter("prefix","frame");
-        if (StringUtil.isNotBlank(cfgPrefix))
-        {
-            this.prefix = cfgPrefix;
-        }
-
-        if (this.outputDir != null)
-        {
-            // create a non-validating, read-only generator
-            this.generator = new Generator(getPolicy(),getBufferPool(),false,true);
-        }
-    }
-}
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/WebSocketExtensionFactory.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/WebSocketExtensionFactory.java
index 8bec446..0b2d8a8 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/WebSocketExtensionFactory.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/WebSocketExtensionFactory.java
@@ -18,24 +18,21 @@
 
 package org.eclipse.jetty.websocket.common.extensions;
 
-import org.eclipse.jetty.io.ByteBufferPool;
 import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.websocket.api.WebSocketException;
-import org.eclipse.jetty.websocket.api.WebSocketPolicy;
 import org.eclipse.jetty.websocket.api.extensions.Extension;
 import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
 import org.eclipse.jetty.websocket.api.extensions.ExtensionFactory;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 
 public class WebSocketExtensionFactory extends ExtensionFactory
 {
-    private WebSocketPolicy policy;
-    private ByteBufferPool bufferPool;
+    private WebSocketContainerScope container;
 
-    public WebSocketExtensionFactory(WebSocketPolicy policy, ByteBufferPool bufferPool)
+    public WebSocketExtensionFactory(WebSocketContainerScope container)
     {
         super();
-        this.policy = policy;
-        this.bufferPool = bufferPool;
+        this.container = container;
     }
 
     @Override
@@ -60,12 +57,11 @@
 
         try
         {
-            Extension ext = extClass.newInstance();
+            Extension ext = container.getObjectFactory().createInstance(extClass);
             if (ext instanceof AbstractExtension)
             {
                 AbstractExtension aext = (AbstractExtension)ext;
-                aext.setPolicy(policy);
-                aext.setBufferPool(bufferPool);
+                aext.init(container);
                 aext.setConfig(config);
             }
             return ext;
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/compress/PerMessageDeflateExtension.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/compress/PerMessageDeflateExtension.java
index fe97e57..9d73f1f 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/compress/PerMessageDeflateExtension.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/compress/PerMessageDeflateExtension.java
@@ -32,7 +32,7 @@
 
 /**
  * Per Message Deflate Compression extension for WebSocket.
- * <p/>
+ * <p>
  * Attempts to follow <a href="https://tools.ietf.org/html/draft-ietf-hybi-permessage-compression-12">draft-ietf-hybi-permessage-compression-12</a>
  */
 public class PerMessageDeflateExtension extends CompressExtension
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/frames/DataFrame.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/frames/DataFrame.java
index 0f6f79c..5fe357c 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/frames/DataFrame.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/frames/DataFrame.java
@@ -36,6 +36,7 @@
      * Construct new DataFrame based on headers of provided frame.
      * <p>
      * Useful for when working in extensions and a new frame needs to be created.
+     * @param basedOn the frame this one is based on
      */
     public DataFrame(Frame basedOn)
     {
@@ -46,6 +47,8 @@
      * Construct new DataFrame based on headers of provided frame, overriding for continuations if needed.
      * <p>
      * Useful for when working in extensions and a new frame needs to be created.
+     * @param basedOn the frame this one is based on
+     * @param continuation true if this is a continuation frame
      */
     public DataFrame(Frame basedOn, boolean continuation)
     {
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/frames/ReadOnlyDelegatedFrame.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/frames/ReadOnlyDelegatedFrame.java
new file mode 100644
index 0000000..706e8cf
--- /dev/null
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/frames/ReadOnlyDelegatedFrame.java
@@ -0,0 +1,112 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.common.frames;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.websocket.api.extensions.Frame;
+
+/**
+ * Immutable, Read-only, Frame implementation.
+ */
+public class ReadOnlyDelegatedFrame implements Frame
+{
+    private final Frame delegate;
+    
+    public ReadOnlyDelegatedFrame(Frame frame)
+    {
+        this.delegate = frame;
+    }
+
+    @Override
+    public byte[] getMask()
+    {
+        return delegate.getMask();
+    }
+
+    @Override
+    public byte getOpCode()
+    {
+        return delegate.getOpCode();
+    }
+
+    @Override
+    public ByteBuffer getPayload()
+    {
+        if(!delegate.hasPayload()) {
+            return null;
+        }
+        return delegate.getPayload().asReadOnlyBuffer();
+    }
+
+    @Override
+    public int getPayloadLength()
+    {
+        return delegate.getPayloadLength();
+    }
+
+    @Override
+    public Type getType()
+    {
+        return delegate.getType();
+    }
+
+    @Override
+    public boolean hasPayload()
+    {
+        return delegate.hasPayload();
+    }
+
+    @Override
+    public boolean isFin()
+    {
+        return delegate.isFin();
+    }
+
+    @Override
+    @Deprecated
+    public boolean isLast()
+    {
+        return delegate.isLast();
+    }
+
+    @Override
+    public boolean isMasked()
+    {
+        return delegate.isMasked();
+    }
+
+    @Override
+    public boolean isRsv1()
+    {
+        return delegate.isRsv1();
+    }
+
+    @Override
+    public boolean isRsv2()
+    {
+        return delegate.isRsv2();
+    }
+
+    @Override
+    public boolean isRsv3()
+    {
+        return delegate.isRsv3();
+    }
+}
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/AbstractWebSocketConnection.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/AbstractWebSocketConnection.java
index 4e51713..7366457 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/AbstractWebSocketConnection.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/AbstractWebSocketConnection.java
@@ -32,6 +32,7 @@
 
 import org.eclipse.jetty.io.AbstractConnection;
 import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.Connection;
 import org.eclipse.jetty.io.EndPoint;
 import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.util.component.ContainerLifeCycle;
@@ -52,13 +53,12 @@
 import org.eclipse.jetty.websocket.common.Generator;
 import org.eclipse.jetty.websocket.common.LogicalConnection;
 import org.eclipse.jetty.websocket.common.Parser;
-import org.eclipse.jetty.websocket.common.WebSocketSession;
 import org.eclipse.jetty.websocket.common.io.IOState.ConnectionStateListener;
 
 /**
- * Provides the implementation of {@link LogicalConnection} within the framework of the new {@link Connection} framework of {@code jetty-io}.
+ * Provides the implementation of {@link LogicalConnection} within the framework of the new {@link org.eclipse.jetty.io.Connection} framework of {@code jetty-io}.
  */
-public abstract class AbstractWebSocketConnection extends AbstractConnection implements LogicalConnection, ConnectionStateListener, Dumpable
+public abstract class AbstractWebSocketConnection extends AbstractConnection implements LogicalConnection, Connection.UpgradeTo, ConnectionStateListener, Dumpable 
 {
     private class Flusher extends FrameFlusher
     {
@@ -70,7 +70,7 @@
         @Override
         protected void onFailure(Throwable x)
         {
-            session.notifyError(x);
+            notifyError(x);
 
             if (ioState.wasAbnormalClose())
             {
@@ -156,8 +156,8 @@
 
         private void onLocalClose()
         {
-            if (LOG.isDebugEnabled())
-                LOG.debug("Local Close Confirmed {}",close);
+            if (LOG_CLOSE.isDebugEnabled())
+                LOG_CLOSE.debug("Local Close Confirmed {}",close);
             if (close.isAbnormal())
             {
                 ioState.onAbnormalClose(close);
@@ -199,6 +199,8 @@
     }
 
     private static final Logger LOG = Log.getLogger(AbstractWebSocketConnection.class);
+    private static final Logger LOG_OPEN = Log.getLogger(AbstractWebSocketConnection.class.getName() + "_OPEN");
+    private static final Logger LOG_CLOSE = Log.getLogger(AbstractWebSocketConnection.class.getName() + "_CLOSE");
 
     /**
      * Minimum size of a buffer is the determined to be what would be the maximum framing header size (not including payload)
@@ -212,17 +214,16 @@
     private final WebSocketPolicy policy;
     private final AtomicBoolean suspendToken;
     private final FrameFlusher flusher;
-    private WebSocketSession session;
     private List<ExtensionConfig> extensions;
     private boolean isFilling;
-    private ByteBuffer buffer;
+    private ByteBuffer prefillBuffer;
     private ReadMode readMode = ReadMode.PARSE;
     private IOState ioState;
     private Stats stats = new Stats();
 
     public AbstractWebSocketConnection(EndPoint endp, Executor executor, Scheduler scheduler, WebSocketPolicy policy, ByteBufferPool bufferPool)
     {
-        super(endp,executor,EXECUTE_ONFILLABLE); // TODO review if this is best. Specifically with MUX
+        super(endp,executor);
         this.policy = policy;
         this.bufferPool = bufferPool;
         this.generator = new Generator(policy,bufferPool);
@@ -249,6 +250,8 @@
     @Override
     public void close()
     {
+        if(LOG_CLOSE.isDebugEnabled())
+            LOG_CLOSE.debug(".close()");
         CloseInfo close = new CloseInfo();
         this.outgoingFrame(close.asFrame(),new OnCloseLocalCallback(close),BatchMode.OFF);
     }
@@ -268,8 +271,8 @@
     @Override
     public void close(int statusCode, String reason)
     {
-        if (LOG.isDebugEnabled())
-            LOG.debug("close({},{})",statusCode,reason);
+        if (LOG_CLOSE.isDebugEnabled())
+            LOG_CLOSE.debug("close({},{})",statusCode,reason);
         CloseInfo close = new CloseInfo(statusCode,reason);
         this.outgoingFrame(close.asFrame(),new OnCloseLocalCallback(close),BatchMode.OFF);
     }
@@ -277,24 +280,27 @@
     @Override
     public void disconnect()
     {
+        if (LOG_CLOSE.isDebugEnabled())
+            LOG_CLOSE.debug("{} disconnect()",policy.getBehavior());
         disconnect(false);
     }
 
     private void disconnect(boolean onlyOutput)
     {
-        if (LOG.isDebugEnabled())
-            LOG.debug("{} disconnect({})",policy.getBehavior(),onlyOutput?"outputOnly":"both");
+        if (LOG_CLOSE.isDebugEnabled())
+            LOG_CLOSE.debug("{} disconnect({})",policy.getBehavior(),onlyOutput?"outputOnly":"both");
         // close FrameFlusher, we cannot write anymore at this point.
         flusher.close();
         EndPoint endPoint = getEndPoint();
         // We need to gently close first, to allow
         // SSL close alerts to be sent by Jetty
-        if (LOG.isDebugEnabled())
-            LOG.debug("Shutting down output {}",endPoint);
+        if (LOG_CLOSE.isDebugEnabled())
+            LOG_CLOSE.debug("Shutting down output {}",endPoint);
         endPoint.shutdownOutput();
         if (!onlyOutput)
         {
-            LOG.debug("Closing {}",endPoint);
+            if (LOG_CLOSE.isDebugEnabled())
+                LOG_CLOSE.debug("Closing {}",endPoint);
             endPoint.close();
         }
     }
@@ -382,12 +388,6 @@
         return scheduler;
     }
 
-    @Override
-    public WebSocketSession getSession()
-    {
-        return session;
-    }
-
     public Stats getStats()
     {
         return stats;
@@ -423,21 +423,31 @@
     @Override
     public void onConnectionStateChange(ConnectionState state)
     {
-        if (LOG.isDebugEnabled())
-            LOG.debug("{} Connection State Change: {}",policy.getBehavior(),state);
+        if (LOG_CLOSE.isDebugEnabled())
+            LOG_CLOSE.debug("{} Connection State Change: {}",policy.getBehavior(),state);
+        
         switch (state)
         {
             case OPEN:
-                if (BufferUtil.isEmpty(buffer))
+                if (BufferUtil.hasContent(prefillBuffer))
                 {
                     if (LOG.isDebugEnabled())
-                        LOG.debug("fillInterested");
-                    fillInterested();
+                    {
+                        LOG.debug("Parsing Upgrade prefill buffer ({} remaining)",prefillBuffer.remaining());
+                    }
+                    parser.parse(prefillBuffer);
                 }
-                else
-                    onFillable();
+                if (LOG.isDebugEnabled())
+                {
+                    LOG.debug("OPEN: normal fillInterested");
+                }
+                // TODO: investigate what happens if a failure occurs during prefill, and an attempt to write close fails,
+                // should a fill interested occur? or just a quick disconnect?
+                fillInterested();
                 break;
             case CLOSED:
+                if (LOG_CLOSE.isDebugEnabled())
+                    LOG_CLOSE.debug("CLOSED - wasAbnormalClose: {}", ioState.wasAbnormalClose());
                 if (ioState.wasAbnormalClose())
                 {
                     // Fire out a close frame, indicating abnormal shutdown, then disconnect
@@ -451,6 +461,8 @@
                 }
                 break;
             case CLOSING:
+                if (LOG_CLOSE.isDebugEnabled())
+                    LOG_CLOSE.debug("CLOSING - wasRemoteCloseInitiated: {}", ioState.wasRemoteCloseInitiated());
                 // First occurrence of .onCloseLocal or .onCloseRemote use
                 if (ioState.wasRemoteCloseInitiated())
                 {
@@ -469,8 +481,9 @@
         if (LOG.isDebugEnabled())
             LOG.debug("{} onFillable()",policy.getBehavior());
         stats.countOnFillableEvents.incrementAndGet();
-        if (buffer==null)
-            buffer = bufferPool.acquire(getInputBufferSize(),true);
+        
+        ByteBuffer buffer = bufferPool.acquire(getInputBufferSize(),true);
+        
         try
         {
             isFilling = true;
@@ -487,7 +500,6 @@
         finally
         {
             bufferPool.release(buffer);
-            buffer=null;
         }
 
         if ((readMode != ReadMode.EOF) && (suspendToken.get() == false))
@@ -510,14 +522,31 @@
         super.onFillInterestedFailed(cause);
     }
 
-    protected void prefill(ByteBuffer prefilled)
+    /**
+     * Extra bytes from the initial HTTP upgrade that need to
+     * be processed by the websocket parser before starting
+     * to read bytes from the connection
+     * @param prefilled the bytes of prefilled content encountered during upgrade
+     */
+    protected void setInitialBuffer(ByteBuffer prefilled)
     {
-        buffer=prefilled;
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("set Initial Buffer - {}",BufferUtil.toDetailString(prefilled));
+        }
+        prefillBuffer = prefilled;
+    }
+    
+    private void notifyError(Throwable t)
+    {
+        getParser().getIncomingFramesHandler().incomingError(t);
     }
     
     @Override
     public void onOpen()
     {
+        if(LOG_OPEN.isDebugEnabled())
+            LOG_OPEN.debug("[{}] {}.onOpened()",policy.getBehavior(),this.getClass().getSimpleName());
         super.onOpen();
         this.ioState.onOpened();
     }
@@ -530,11 +559,13 @@
     {
         IOState state = getIOState();
         ConnectionState cstate = state.getConnectionState();
-        if (LOG.isDebugEnabled())
-            LOG.debug("{} Read Timeout - {}",policy.getBehavior(),cstate);
+        if (LOG_CLOSE.isDebugEnabled())
+            LOG_CLOSE.debug("{} Read Timeout - {}",policy.getBehavior(),cstate);
 
         if (cstate == ConnectionState.CLOSED)
         {
+            if (LOG_CLOSE.isDebugEnabled())
+                LOG_CLOSE.debug("onReadTimeout - Connection Already CLOSED");
             // close already completed, extra timeouts not relevant
             // allow underlying connection and endpoint to disconnect on its own
             return true;
@@ -542,7 +573,7 @@
 
         try
         {
-            session.notifyError(new SocketTimeoutException("Timeout on Read"));
+            notifyError(new SocketTimeoutException("Timeout on Read"));
         }
         finally
         {
@@ -581,15 +612,14 @@
                 }
                 else if (filled < 0)
                 {
-                    LOG.debug("read - EOF Reached (remote: {})",getRemoteAddress());
+                    if (LOG_CLOSE.isDebugEnabled())
+                        LOG_CLOSE.debug("read - EOF Reached (remote: {})",getRemoteAddress());
                     return ReadMode.EOF;
                 }
                 else
                 {
-                    if (LOG.isDebugEnabled())
-                    {
-                        LOG.debug("Discarded {} bytes - {}",filled,BufferUtil.toDetailString(buffer));
-                    }
+                    if (LOG_CLOSE.isDebugEnabled())
+                        LOG_CLOSE.debug("Discarded {} bytes - {}",filled,BufferUtil.toDetailString(buffer));
                 }
             }
         }
@@ -610,27 +640,27 @@
         EndPoint endPoint = getEndPoint();
         try
         {
-            while (true) // TODO: should this honor the LogicalConnection.suspend() ?
+            // Process the content from the Endpoint next
+            while(true)  // TODO: should this honor the LogicalConnection.suspend() ?
             {
                 int filled = endPoint.fill(buffer);
-                if (filled == 0)
-                {
-                    return ReadMode.PARSE;
-                }
-                else if (filled < 0)
+                if (filled < 0)
                 {
                     LOG.debug("read - EOF Reached (remote: {})",getRemoteAddress());
                     ioState.onReadFailure(new EOFException("Remote Read EOF"));
                     return ReadMode.EOF;
                 }
-                else
+                else if (filled == 0)
                 {
-                    if (LOG.isDebugEnabled())
-                    {
-                        LOG.debug("Filled {} bytes - {}",filled,BufferUtil.toDetailString(buffer));
-                    }
-                    parser.parse(buffer);
+                    // Done reading, wait for next onFillable
+                    return ReadMode.PARSE;
                 }
+                
+                if (LOG.isDebugEnabled())
+                {
+                    LOG.debug("Filled {} bytes - {}",filled,BufferUtil.toDetailString(buffer));
+                }
+                parser.parse(buffer);
             }
         }
         catch (IOException e)
@@ -653,7 +683,7 @@
             return ReadMode.DISCARD;
         }
     }
-
+    
     @Override
     public void resume()
     {
@@ -693,12 +723,6 @@
     }
 
     @Override
-    public void setSession(WebSocketSession session)
-    {
-        this.session = session;
-    }
-
-    @Override
     public SuspendToken suspend()
     {
         suspendToken.set(true);
@@ -720,7 +744,17 @@
     @Override
     public String toString()
     {
-        return String.format("%s{f=%s,g=%s,p=%s}",super.toString(),flusher,generator,parser);
+        return String.format("%s@%X{endp=%s,ios=%s,f=%s,g=%s,p=%s}",getClass().getSimpleName(),hashCode(),getEndPoint(),ioState,flusher,generator,parser);
     }
 
+    /**
+     * Extra bytes from the initial HTTP upgrade that need to
+     * be processed by the websocket parser before starting
+     * to read bytes from the connection
+     */
+    @Override
+    public void onUpgradeTo(ByteBuffer prefilled)
+    {
+        setInitialBuffer(prefilled);
+    }
 }
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/FrameFlusher.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/FrameFlusher.java
index fb9d35f..8c4bc39 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/FrameFlusher.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/FrameFlusher.java
@@ -40,7 +40,7 @@
 import org.eclipse.jetty.websocket.common.frames.BinaryFrame;
 
 /**
- * Interface for working with bytes destined for {@link EndPoint#write(Callback, ByteBuffer...)}
+ * Interface for working with bytes destined for {@link EndPoint#write(org.eclipse.jetty.util.Callback, ByteBuffer...)}
  */
 public class FrameFlusher
 {
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/FutureWriteCallback.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/FutureWriteCallback.java
index d67e1fb..a0509e5 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/FutureWriteCallback.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/FutureWriteCallback.java
@@ -18,6 +18,8 @@
 
 package org.eclipse.jetty.websocket.common.io;
 
+import java.util.concurrent.Future;
+
 import org.eclipse.jetty.util.FutureCallback;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/IOState.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/IOState.java
index 5ba0eb9..6c6de10 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/IOState.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/IOState.java
@@ -189,6 +189,7 @@
      * A websocket connection has been disconnected for abnormal close reasons.
      * <p>
      * This is the low level disconnect of the socket. It could be the result of a normal close operation, from an IO error, or even from a timeout.
+     * @param close the close information
      */
     public void onAbnormalClose(CloseInfo close)
     {
@@ -220,6 +221,7 @@
 
     /**
      * A close handshake has been issued from the local endpoint
+     * @param close the close information
      */
     public void onCloseLocal(CloseInfo close)
     {
@@ -248,6 +250,9 @@
         synchronized (this)
         {
             closeInfo = close;
+            
+            // Turn off further output
+            outputAvailable = false;
 
             boolean in = inputAvailable;
             boolean out = outputAvailable;
@@ -255,9 +260,7 @@
             {
                 closeHandshakeSource = CloseHandshakeSource.LOCAL;
             }
-            out = false;
-            outputAvailable = false;
-
+            
             LOG.debug("onCloseLocal(), input={}, output={}",in,out);
 
             if (!in && !out)
@@ -301,6 +304,7 @@
 
     /**
      * A close handshake has been received from the remote endpoint
+     * @param close the close information
      */
     public void onCloseRemote(CloseInfo close)
     {
@@ -316,6 +320,9 @@
             }
 
             closeInfo = close;
+            
+            // turn off further input
+            inputAvailable = false;
 
             boolean in = inputAvailable;
             boolean out = outputAvailable;
@@ -323,8 +330,6 @@
             {
                 closeHandshakeSource = CloseHandshakeSource.REMOTE;
             }
-            in = false;
-            inputAvailable = false;
 
             if (LOG.isDebugEnabled())
                 LOG.debug("onCloseRemote(), input={}, output={}",in,out);
@@ -399,6 +404,9 @@
      */
     public void onOpened()
     {
+        if(LOG.isDebugEnabled())
+            LOG.debug(" onOpened()");
+        
         ConnectionState event = null;
         synchronized (this)
         {
@@ -426,6 +434,7 @@
      * The local endpoint has reached a read failure.
      * <p>
      * This could be a normal result after a proper close handshake, or even a premature close due to a connection disconnect.
+     * @param t the read failure
      */
     public void onReadFailure(Throwable t)
     {
@@ -476,6 +485,7 @@
      * The local endpoint has reached a write failure.
      * <p>
      * A low level I/O failure, or even a jetty side EndPoint close (from idle timeout) are a few scenarios
+     * @param t the throwable that caused the write failure
      */
     public void onWriteFailure(Throwable t)
     {
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/http/HttpResponseHeaderParser.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/http/HttpResponseHeaderParser.java
index d7c7847..2b72738 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/http/HttpResponseHeaderParser.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/http/HttpResponseHeaderParser.java
@@ -80,7 +80,9 @@
             {
                 if (parseHeader(line))
                 {
-                    // Finished parsing entire header
+                    // Now finished with parsing the entire response header
+                    // Save the remaining bytes for WebSocket to process.
+                    
                     ByteBuffer copy = ByteBuffer.allocate(buf.remaining());
                     BufferUtil.put(buf,copy);
                     BufferUtil.flipToFlush(copy,0);
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/payload/PayloadProcessor.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/payload/PayloadProcessor.java
index dc9cc95..67ade06 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/payload/PayloadProcessor.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/payload/PayloadProcessor.java
@@ -20,6 +20,7 @@
 
 import java.nio.ByteBuffer;
 
+import org.eclipse.jetty.websocket.api.BadPayloadException;
 import org.eclipse.jetty.websocket.api.extensions.Frame;
 
 /**
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageInputStream.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageInputStream.java
index 7bd35a1..2c5d5a7 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageInputStream.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageInputStream.java
@@ -32,7 +32,7 @@
 
 /**
  * Support class for reading a (single) WebSocket BINARY message via a InputStream.
- * <p/>
+ * <p>
  * An InputStream that can access a queue of ByteBuffer payloads, along with expected InputStream blocking behavior.
  */
 public class MessageInputStream extends InputStream implements MessageAppender
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageReader.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageReader.java
index 100152f..b416301 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageReader.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageReader.java
@@ -21,11 +21,12 @@
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 
 /**
  * Support class for reading a (single) WebSocket TEXT message via a Reader.
- * <p/>
+ * <p>
  * In compliance to the WebSocket spec, this reader always uses the UTF8 {@link Charset}.
  */
 public class MessageReader extends InputStreamReader implements MessageAppender
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageWriter.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageWriter.java
index 8272cea..44367ed 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageWriter.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageWriter.java
@@ -36,7 +36,7 @@
 
 /**
  * Support for writing a single WebSocket TEXT message via a {@link Writer}
- * <p/>
+ * <p>
  * Note: Per WebSocket spec, all WebSocket TEXT messages must be encoded in UTF-8
  */
 public class MessageWriter extends Writer
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/package-info.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/package-info.java
index 197cadc..f28f1e3 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/package-info.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/package-info.java
@@ -21,7 +21,7 @@
  * <p>
  * A core set of internal implementation classes for the Jetty WebSocket API.
  * <p>
- * Note: do not reference or use classes present in this package space in your code. <br />
+ * Note: do not reference or use classes present in this package space in your code. <br>
  * Restrict your usage to the Jetty WebSocket API classes, the Jetty WebSocket Client API,
  * or the Jetty WebSocket Servlet API.
  */
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/scopes/SimpleContainerScope.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/scopes/SimpleContainerScope.java
new file mode 100644
index 0000000..f407f8b
--- /dev/null
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/scopes/SimpleContainerScope.java
@@ -0,0 +1,108 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.common.scopes;
+
+import java.util.concurrent.Executor;
+
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.MappedByteBufferPool;
+import org.eclipse.jetty.util.DecoratedObjectFactory;
+import org.eclipse.jetty.util.component.ContainerLifeCycle;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.eclipse.jetty.websocket.api.WebSocketPolicy;
+
+public class SimpleContainerScope extends ContainerLifeCycle implements WebSocketContainerScope
+{
+    private final ByteBufferPool bufferPool;
+    private final DecoratedObjectFactory objectFactory;
+    private final WebSocketPolicy policy;
+    private Executor executor;
+    private SslContextFactory sslContextFactory;
+
+    public SimpleContainerScope(WebSocketPolicy policy)
+    {
+        this(policy,new MappedByteBufferPool(),new DecoratedObjectFactory());
+    }
+
+    public SimpleContainerScope(WebSocketPolicy policy, ByteBufferPool bufferPool)
+    {
+        this(policy,bufferPool,new DecoratedObjectFactory());
+    }
+
+    public SimpleContainerScope(WebSocketPolicy policy, ByteBufferPool bufferPool, DecoratedObjectFactory objectFactory)
+    {
+        this.policy = policy;
+        this.bufferPool = bufferPool;
+        this.objectFactory = objectFactory;
+
+        QueuedThreadPool threadPool = new QueuedThreadPool();
+        String name = "WebSocketSimpleContainer@" + hashCode();
+        threadPool.setName(name);
+        threadPool.setDaemon(true);
+        this.executor = threadPool;
+    }
+
+    @Override
+    protected void doStart() throws Exception
+    {
+        super.doStart();
+    }
+
+    @Override
+    protected void doStop() throws Exception
+    {
+        super.doStop();
+    }
+
+    @Override
+    public ByteBufferPool getBufferPool()
+    {
+        return this.bufferPool;
+    }
+
+    @Override
+    public Executor getExecutor()
+    {
+        return this.executor;
+    }
+
+    @Override
+    public DecoratedObjectFactory getObjectFactory()
+    {
+        return this.objectFactory;
+    }
+
+    @Override
+    public WebSocketPolicy getPolicy()
+    {
+        return this.policy;
+    }
+
+    @Override
+    public SslContextFactory getSslContextFactory()
+    {
+        return this.sslContextFactory;
+    }
+
+    public void setSslContextFactory(SslContextFactory sslContextFactory)
+    {
+        this.sslContextFactory = sslContextFactory;
+    }
+}
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/scopes/WebSocketContainerScope.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/scopes/WebSocketContainerScope.java
new file mode 100644
index 0000000..acc611f
--- /dev/null
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/scopes/WebSocketContainerScope.java
@@ -0,0 +1,67 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.common.scopes;
+
+import java.util.concurrent.Executor;
+
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.util.DecoratedObjectFactory;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.eclipse.jetty.websocket.api.WebSocketPolicy;
+
+/**
+ * Defined Scope for a WebSocketContainer.
+ */
+public interface WebSocketContainerScope
+{
+    /**
+     * The configured Container Buffer Pool.
+     * 
+     * @return the buffer pool (never null)
+     */
+    public ByteBufferPool getBufferPool();
+
+    /**
+     * Executor in use by the container.
+     * 
+     * @return the Executor in use by the container.
+     */
+    public Executor getExecutor();
+
+    /**
+     * Object Factory used to create objects.
+     * 
+     * @return Object Factory used to create instances of objects.
+     */
+    public DecoratedObjectFactory getObjectFactory();
+
+    /**
+     * The policy the container is running on.
+     * 
+     * @return the websocket policy
+     */
+    public WebSocketPolicy getPolicy();
+
+    /**
+     * The SslContextFactory in use by the container.
+     * 
+     * @return the SslContextFactory in use by the container (can be null if no SSL context is defined)
+     */
+    public SslContextFactory getSslContextFactory();
+}
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/scopes/WebSocketSessionScope.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/scopes/WebSocketSessionScope.java
new file mode 100644
index 0000000..1e59094
--- /dev/null
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/scopes/WebSocketSessionScope.java
@@ -0,0 +1,39 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.common.scopes;
+
+import org.eclipse.jetty.websocket.common.WebSocketSession;
+
+/**
+ * Defined Scope for a WebSocketSession (active connection)
+ */
+public interface WebSocketSessionScope
+{
+    /**
+     * Active {@link WebSocketSession} associated with this scope.
+     * @return the websocket session
+     */
+    WebSocketSession getWebSocketSession();
+
+    /**
+     * The parent {@link WebSocketContainerScope} for this session scope.
+     * @return the websocket container scope
+     */
+    WebSocketContainerScope getContainerScope();
+}
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/util/TextUtil.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/util/TextUtil.java
index 414529a..651c8c9 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/util/TextUtil.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/util/TextUtil.java
@@ -43,7 +43,6 @@
 
     /**
      * Smash a long string to fit within the max string length, by taking the middle section of the string and replacing them with an ellipsis "..."
-     * <p>
      * 
      * <pre>
      * Examples:
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/util/Utf8PartialBuilder.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/util/Utf8PartialBuilder.java
new file mode 100644
index 0000000..7245f59
--- /dev/null
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/util/Utf8PartialBuilder.java
@@ -0,0 +1,63 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.common.util;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.util.Utf8Appendable;
+import org.eclipse.jetty.util.Utf8StringBuilder;
+
+/**
+ * Similar in scope to the {@link Utf8StringBuilder}, but allowing partially constructed Strings without throwing
+ * Exceptions for incomplete UTF8 sequences.
+ * <p>
+ * A call to {@link #toPartialString(ByteBuffer)} will return the section of the String from the start to the last
+ * completed UTF8 sequence. Leaving incomplete sequences for a subsequent call to complete.
+ */
+public class Utf8PartialBuilder
+{
+    private final StringBuilder str;
+    private final Utf8Appendable utf8;
+
+    public Utf8PartialBuilder()
+    {
+        this.str = new StringBuilder();
+        this.utf8 = new Utf8Appendable(str)
+        {
+            @Override
+            public int length()
+            {
+                return str.length();
+            }
+        };
+    }
+
+    public String toPartialString(ByteBuffer buf)
+    {
+        if (buf == null)
+        {
+            // no change, return empty
+            return "";
+        }
+        utf8.append(buf);
+        String ret = str.toString();
+        str.setLength(0);
+        return ret;
+    }
+}
diff --git a/jetty-websocket/websocket-common/src/test/java/examples/ListenerFrameSocket.java b/jetty-websocket/websocket-common/src/test/java/examples/ListenerFrameSocket.java
new file mode 100644
index 0000000..ca329d5
--- /dev/null
+++ b/jetty-websocket/websocket-common/src/test/java/examples/ListenerFrameSocket.java
@@ -0,0 +1,53 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package examples;
+
+import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.api.WebSocketFrameListener;
+import org.eclipse.jetty.websocket.api.extensions.Frame;
+import org.eclipse.jetty.websocket.common.events.EventCapture;
+
+public class ListenerFrameSocket implements WebSocketFrameListener
+{
+    public EventCapture capture = new EventCapture();
+
+    @Override
+    public void onWebSocketClose(int statusCode, String reason)
+    {
+        capture.add("onWebSocketClose(%d, %s)",statusCode,capture.q(reason));
+    }
+
+    @Override
+    public void onWebSocketConnect(Session session)
+    {
+        capture.add("onWebSocketConnect(%s)",session);
+    }
+
+    @Override
+    public void onWebSocketError(Throwable cause)
+    {
+        capture.add("onWebSocketError((%s) %s)",cause.getClass().getSimpleName(),cause.getMessage());
+    }
+    
+    @Override
+    public void onWebSocketFrame(Frame frame)
+    {
+        capture.add("onWebSocketFrame(%s, %d, %b)", frame.getType(), frame.getPayload().remaining(), frame.isFin());
+    }
+}
diff --git a/jetty-websocket/websocket-common/src/test/java/examples/ListenerPartialSocket.java b/jetty-websocket/websocket-common/src/test/java/examples/ListenerPartialSocket.java
new file mode 100644
index 0000000..d48cca8
--- /dev/null
+++ b/jetty-websocket/websocket-common/src/test/java/examples/ListenerPartialSocket.java
@@ -0,0 +1,60 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package examples;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.api.WebSocketPartialListener;
+import org.eclipse.jetty.websocket.common.events.EventCapture;
+
+public class ListenerPartialSocket implements WebSocketPartialListener
+{
+    public EventCapture capture = new EventCapture();
+
+    @Override
+    public void onWebSocketClose(int statusCode, String reason)
+    {
+        capture.add("onWebSocketClose(%d, %s)",statusCode,capture.q(reason));
+    }
+
+    @Override
+    public void onWebSocketConnect(Session session)
+    {
+        capture.add("onWebSocketConnect(%s)",session);
+    }
+
+    @Override
+    public void onWebSocketError(Throwable cause)
+    {
+        capture.add("onWebSocketError((%s) %s)",cause.getClass().getSimpleName(),cause.getMessage());
+    }
+    
+    @Override
+    public void onWebSocketPartialText(String payload, boolean fin)
+    {
+        capture.add("onWebSocketPartialText('%s', %b)",payload,fin);
+    }
+    
+    @Override
+    public void onWebSocketPartialBinary(ByteBuffer payload, boolean fin)
+    {
+        capture.add("onWebSocketPartialBinary(%s [%d], %b)",payload,payload.remaining(),fin);
+    }
+}
diff --git a/jetty-websocket/websocket-common/src/test/java/examples/ListenerPingPongSocket.java b/jetty-websocket/websocket-common/src/test/java/examples/ListenerPingPongSocket.java
new file mode 100644
index 0000000..e9481af
--- /dev/null
+++ b/jetty-websocket/websocket-common/src/test/java/examples/ListenerPingPongSocket.java
@@ -0,0 +1,60 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package examples;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.api.WebSocketPingPongListener;
+import org.eclipse.jetty.websocket.common.events.EventCapture;
+
+public class ListenerPingPongSocket implements WebSocketPingPongListener
+{
+    public EventCapture capture = new EventCapture();
+
+    @Override
+    public void onWebSocketClose(int statusCode, String reason)
+    {
+        capture.add("onWebSocketClose(%d, %s)",statusCode,capture.q(reason));
+    }
+
+    @Override
+    public void onWebSocketConnect(Session session)
+    {
+        capture.add("onWebSocketConnect(%s)",session);
+    }
+
+    @Override
+    public void onWebSocketError(Throwable cause)
+    {
+        capture.add("onWebSocketError((%s) %s)",cause.getClass().getSimpleName(),cause.getMessage());
+    }
+
+    @Override
+    public void onWebSocketPing(ByteBuffer payload)
+    {
+        capture.add("onWebSocketPing(%d)",payload.remaining());
+    }
+
+    @Override
+    public void onWebSocketPong(ByteBuffer payload)
+    {
+        capture.add("onWebSocketPong(%d)",payload.remaining());
+    }
+}
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/CloseInfoTest.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/CloseInfoTest.java
index eefe04c..afdca52 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/CloseInfoTest.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/CloseInfoTest.java
@@ -18,9 +18,15 @@
 
 package org.eclipse.jetty.websocket.common;
 
-import static org.eclipse.jetty.websocket.api.StatusCode.*;
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.eclipse.jetty.websocket.api.StatusCode.FAILED_TLS_HANDSHAKE;
+import static org.eclipse.jetty.websocket.api.StatusCode.NORMAL;
+import static org.eclipse.jetty.websocket.api.StatusCode.NO_CLOSE;
+import static org.eclipse.jetty.websocket.api.StatusCode.NO_CODE;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.nullValue;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
 
 import java.nio.ByteBuffer;
 
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/GeneratorParserRoundtripTest.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/GeneratorParserRoundtripTest.java
index e9ff59e..9f9f30b 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/GeneratorParserRoundtripTest.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/GeneratorParserRoundtripTest.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.websocket.common;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.is;
 
 import java.nio.ByteBuffer;
 import java.util.Arrays;
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/GeneratorTest.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/GeneratorTest.java
index a13b2ec..c38f753 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/GeneratorTest.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/GeneratorTest.java
@@ -18,6 +18,8 @@
 
 package org.eclipse.jetty.websocket.common;
 
+import static org.hamcrest.Matchers.is;
+
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 
@@ -39,8 +41,6 @@
 import org.junit.Assert;
 import org.junit.Test;
 
-import static org.hamcrest.Matchers.is;
-
 public class GeneratorTest
 {
     private static final Logger LOG = Log.getLogger(GeneratorTest.WindowHelper.class);
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/WebSocketFrameTest.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/WebSocketFrameTest.java
index 0240021..863377f 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/WebSocketFrameTest.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/WebSocketFrameTest.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.websocket.common;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.is;
 
 import java.nio.ByteBuffer;
 
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/WebSocketRemoteEndpointTest.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/WebSocketRemoteEndpointTest.java
index 258c2b2..2c15025 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/WebSocketRemoteEndpointTest.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/WebSocketRemoteEndpointTest.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.websocket.common;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.containsString;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase1_1.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase1_1.java
index 580fd25..6d300cd 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase1_1.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase1_1.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.websocket.common.ab;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.is;
 
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
@@ -27,6 +27,7 @@
 import org.eclipse.jetty.websocket.api.WebSocketBehavior;
 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
 import org.eclipse.jetty.websocket.api.extensions.Frame;
+import org.eclipse.jetty.websocket.common.Generator;
 import org.eclipse.jetty.websocket.common.OpCode;
 import org.eclipse.jetty.websocket.common.Parser;
 import org.eclipse.jetty.websocket.common.WebSocketFrame;
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase1_2.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase1_2.java
index 9440d8d..63ab2fb 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase1_2.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase1_2.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.websocket.common.ab;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.is;
 
 import java.nio.ByteBuffer;
 
@@ -26,6 +26,7 @@
 import org.eclipse.jetty.websocket.api.WebSocketBehavior;
 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
 import org.eclipse.jetty.websocket.api.extensions.Frame;
+import org.eclipse.jetty.websocket.common.Generator;
 import org.eclipse.jetty.websocket.common.OpCode;
 import org.eclipse.jetty.websocket.common.Parser;
 import org.eclipse.jetty.websocket.common.WebSocketFrame;
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase2.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase2.java
index 2bfdc66..b9ce79d 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase2.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase2.java
@@ -18,6 +18,8 @@
 
 package org.eclipse.jetty.websocket.common.ab;
 
+import static org.hamcrest.Matchers.is;
+
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 
@@ -39,8 +41,6 @@
 import org.junit.Assert;
 import org.junit.Test;
 
-import static org.hamcrest.Matchers.is;
-
 public class TestABCase2
 {
     WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.CLIENT);
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/BadBinarySignatureSocket.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/BadBinarySignatureSocket.java
index bc202e3..d0633b8 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/BadBinarySignatureSocket.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/BadBinarySignatureSocket.java
@@ -30,6 +30,11 @@
 {
     /**
      * Declaring a non-void return type
+     * @param session  the session
+     * @param buf the buffer
+     * @param offset the offset
+     * @param len the length
+     * @return the response boolean
      */
     @OnWebSocketMessage
     public boolean onBinary(Session session, byte buf[], int offset, int len)
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/BadDuplicateBinarySocket.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/BadDuplicateBinarySocket.java
index 9de8780..9441cb8 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/BadDuplicateBinarySocket.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/BadDuplicateBinarySocket.java
@@ -31,6 +31,9 @@
 {
     /**
      * First method
+     * @param payload the payload
+     * @param offset the offset
+     * @param len the len
      */
     @OnWebSocketMessage
     public void binMe(byte[] payload, int offset, int len)
@@ -40,6 +43,7 @@
 
     /**
      * Second method
+     * @param stream the input stream
      */
     @OnWebSocketMessage
     public void streamMe(InputStream stream)
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/BadDuplicateFrameSocket.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/BadDuplicateFrameSocket.java
index 743ed62..991e9c5 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/BadDuplicateFrameSocket.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/BadDuplicateFrameSocket.java
@@ -27,6 +27,7 @@
 {
     /**
      * The get a frame
+     * @param frame the frame
      */
     @OnWebSocketFrame
     public void frameMe(Frame frame)
@@ -36,6 +37,7 @@
 
     /**
      * This is a duplicate frame type (should throw an exception attempting to use)
+     * @param frame the frame
      */
     @OnWebSocketFrame
     public void watchMe(Frame frame)
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/BadTextSignatureSocket.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/BadTextSignatureSocket.java
index 43449cd..6e16f0d 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/BadTextSignatureSocket.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/BadTextSignatureSocket.java
@@ -30,6 +30,8 @@
 {
     /**
      * Declaring a static method
+     * @param session the session
+     * @param text the text message
      */
     @OnWebSocketMessage
     public static void onText(Session session, String text)
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/FrameSocket.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/FrameSocket.java
index f0bb100..006b04d 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/FrameSocket.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/annotations/FrameSocket.java
@@ -27,6 +27,7 @@
 {
     /**
      * A frame
+     * @param frame the frame
      */
     @OnWebSocketFrame
     public void frameMe(Frame frame)
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/events/EventCapture.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/events/EventCapture.java
index 4ddd6b9..932d392 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/events/EventCapture.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/events/EventCapture.java
@@ -18,6 +18,10 @@
 
 package org.eclipse.jetty.websocket.common.events;
 
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.startsWith;
+
 import java.util.regex.Pattern;
 
 import org.eclipse.jetty.toolchain.test.EventQueue;
@@ -25,10 +29,6 @@
 import org.eclipse.jetty.util.log.Logger;
 import org.junit.Assert;
 
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.startsWith;
-
 @SuppressWarnings("serial")
 public class EventCapture extends EventQueue<String>
 {
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/events/EventDriverTest.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/events/EventDriverTest.java
index e027614..006f2d6 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/events/EventDriverTest.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/events/EventDriverTest.java
@@ -30,7 +30,10 @@
 import org.eclipse.jetty.websocket.common.frames.PingFrame;
 import org.eclipse.jetty.websocket.common.frames.TextFrame;
 import org.eclipse.jetty.websocket.common.io.LocalWebSocketSession;
+import org.eclipse.jetty.websocket.common.scopes.SimpleContainerScope;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 import org.eclipse.jetty.websocket.common.test.LeakTrackingBufferPoolRule;
+import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TestName;
@@ -49,6 +52,14 @@
 
     @Rule
     public LeakTrackingBufferPoolRule bufferPool = new LeakTrackingBufferPoolRule("Test");
+    
+    private WebSocketContainerScope container;
+    
+    @Before
+    public void initContainer()
+    {
+        this.container = new SimpleContainerScope(WebSocketPolicy.newClientPolicy());
+    }
 
     private Frame makeBinaryFrame(String content, boolean fin)
     {
@@ -61,7 +72,7 @@
         AdapterConnectCloseSocket socket = new AdapterConnectCloseSocket();
         EventDriver driver = wrap(socket);
 
-        try (LocalWebSocketSession conn = new LocalWebSocketSession(testname,driver,bufferPool))
+        try (LocalWebSocketSession conn = new LocalWebSocketSession(container,testname,driver))
         {
             conn.open();
             driver.incomingFrame(new CloseInfo(StatusCode.NORMAL).asFrame());
@@ -78,7 +89,7 @@
         AnnotatedBinaryArraySocket socket = new AnnotatedBinaryArraySocket();
         EventDriver driver = wrap(socket);
 
-        try (LocalWebSocketSession conn = new LocalWebSocketSession(testname,driver,bufferPool))
+        try (LocalWebSocketSession conn = new LocalWebSocketSession(container,testname,driver))
         {
             conn.open();
             driver.incomingFrame(makeBinaryFrame("Hello World",true));
@@ -97,7 +108,7 @@
         AnnotatedTextSocket socket = new AnnotatedTextSocket();
         EventDriver driver = wrap(socket);
 
-        try (LocalWebSocketSession conn = new LocalWebSocketSession(testname,driver,bufferPool))
+        try (LocalWebSocketSession conn = new LocalWebSocketSession(container,testname,driver))
         {
             conn.open();
             driver.incomingError(new WebSocketException("oof"));
@@ -116,7 +127,7 @@
         AnnotatedFramesSocket socket = new AnnotatedFramesSocket();
         EventDriver driver = wrap(socket);
 
-        try (LocalWebSocketSession conn = new LocalWebSocketSession(testname,driver,bufferPool))
+        try (LocalWebSocketSession conn = new LocalWebSocketSession(container,testname,driver))
         {
             conn.open();
             driver.incomingFrame(new PingFrame().setPayload("PING"));
@@ -140,7 +151,7 @@
         AnnotatedBinaryStreamSocket socket = new AnnotatedBinaryStreamSocket();
         EventDriver driver = wrap(socket);
 
-        try (LocalWebSocketSession conn = new LocalWebSocketSession(testname,driver,bufferPool))
+        try (LocalWebSocketSession conn = new LocalWebSocketSession(container,testname,driver))
         {
             conn.open();
             driver.incomingFrame(makeBinaryFrame("Hello World",true));
@@ -154,12 +165,12 @@
     }
 
     @Test
-    public void testListener_Text() throws Exception
+    public void testListenerBasic_Text() throws Exception
     {
         ListenerBasicSocket socket = new ListenerBasicSocket();
         EventDriver driver = wrap(socket);
 
-        try (LocalWebSocketSession conn = new LocalWebSocketSession(testname,driver,bufferPool))
+        try (LocalWebSocketSession conn = new LocalWebSocketSession(container,testname,driver))
         {
             conn.start();
             conn.open();
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/ExtensionStackTest.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/ExtensionStackTest.java
index 18bdb4d..3a69e83 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/ExtensionStackTest.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/ExtensionStackTest.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.websocket.common.extensions;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.is;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -28,8 +28,9 @@
 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
 import org.eclipse.jetty.websocket.api.extensions.Extension;
 import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
-import org.eclipse.jetty.websocket.api.extensions.ExtensionFactory;
 import org.eclipse.jetty.websocket.common.extensions.identity.IdentityExtension;
+import org.eclipse.jetty.websocket.common.scopes.SimpleContainerScope;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 import org.eclipse.jetty.websocket.common.test.LeakTrackingBufferPoolRule;
 import org.junit.Assert;
 import org.junit.Rule;
@@ -56,7 +57,9 @@
     private ExtensionStack createExtensionStack()
     {
         WebSocketPolicy policy = WebSocketPolicy.newClientPolicy();
-        ExtensionFactory factory = new WebSocketExtensionFactory(policy,bufferPool);
+        WebSocketContainerScope container = new SimpleContainerScope(policy,bufferPool);
+        
+        WebSocketExtensionFactory factory = new WebSocketExtensionFactory(container);
         return new ExtensionStack(factory);
     }
 
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/ExtensionTool.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/ExtensionTool.java
index 4e17cc9..082604a 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/ExtensionTool.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/ExtensionTool.java
@@ -18,7 +18,8 @@
 
 package org.eclipse.jetty.websocket.common.extensions;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
 
 import java.nio.ByteBuffer;
 import java.util.Collections;
@@ -33,6 +34,8 @@
 import org.eclipse.jetty.websocket.common.Parser;
 import org.eclipse.jetty.websocket.common.WebSocketFrame;
 import org.eclipse.jetty.websocket.common.frames.TextFrame;
+import org.eclipse.jetty.websocket.common.scopes.SimpleContainerScope;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 import org.eclipse.jetty.websocket.common.test.ByteBufferAssert;
 import org.eclipse.jetty.websocket.common.test.IncomingFramesCapture;
 import org.eclipse.jetty.websocket.common.test.UnitParser;
@@ -126,7 +129,9 @@
     public ExtensionTool(WebSocketPolicy policy, ByteBufferPool bufferPool)
     {
         this.policy = policy;
-        this.factory = new WebSocketExtensionFactory(policy,bufferPool);
+        WebSocketContainerScope container = new SimpleContainerScope(policy, bufferPool);
+        WebSocketExtensionFactory extFactory = new WebSocketExtensionFactory(container);
+        this.factory = extFactory;
     }
 
     public Tester newTester(String parameterizedExtension)
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/FragmentExtensionTest.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/FragmentExtensionTest.java
index 4274cb3..b245c91 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/FragmentExtensionTest.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/FragmentExtensionTest.java
@@ -18,6 +18,8 @@
 
 package org.eclipse.jetty.websocket.common.extensions;
 
+import static org.hamcrest.Matchers.is;
+
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
@@ -44,8 +46,6 @@
 import org.junit.Rule;
 import org.junit.Test;
 
-import static org.hamcrest.Matchers.is;
-
 public class FragmentExtensionTest
 {
     @Rule
@@ -140,6 +140,7 @@
 
     /**
      * Verify that outgoing text frames are fragmented by the maxLength configuration.
+     * @throws IOException on test failure
      */
     @Test
     public void testOutgoingFramesByMaxLength() throws IOException
@@ -212,6 +213,7 @@
 
     /**
      * Verify that outgoing text frames are fragmented by default configuration
+     * @throws IOException on test failure
      */
     @Test
     public void testOutgoingFramesDefaultConfig() throws IOException
@@ -276,6 +278,7 @@
 
     /**
      * Outgoing PING (Control Frame) should pass through extension unmodified
+     * @throws IOException on test failure
      */
     @Test
     public void testOutgoingPing() throws IOException
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/IdentityExtensionTest.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/IdentityExtensionTest.java
index df581b4..7cdc070 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/IdentityExtensionTest.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/IdentityExtensionTest.java
@@ -18,6 +18,8 @@
 
 package org.eclipse.jetty.websocket.common.extensions;
 
+import static org.hamcrest.Matchers.is;
+
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
@@ -36,8 +38,6 @@
 import org.junit.Assert;
 import org.junit.Test;
 
-import static org.hamcrest.Matchers.is;
-
 public class IdentityExtensionTest
 {
     /**
@@ -71,6 +71,7 @@
 
     /**
      * Verify that outgoing frames are unmodified
+     * @throws IOException on test failure
      */
     @Test
     public void testOutgoingFrames() throws IOException
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/compress/PerMessageDeflateExtensionTest.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/compress/PerMessageDeflateExtensionTest.java
index b39d4c8..3d80f7e 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/compress/PerMessageDeflateExtensionTest.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/extensions/compress/PerMessageDeflateExtensionTest.java
@@ -18,6 +18,9 @@
 
 package org.eclipse.jetty.websocket.common.extensions.compress;
 
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.*;
+
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
@@ -25,6 +28,7 @@
 import java.util.List;
 
 import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.TypeUtil;
 import org.eclipse.jetty.websocket.api.BatchMode;
 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
 import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
@@ -44,83 +48,61 @@
 import org.junit.Rule;
 import org.junit.Test;
 
-import static org.hamcrest.Matchers.is;
-
 /**
  * Client side behavioral tests for permessage-deflate extension.
- * <p/>
+ * <p>
  * See: http://tools.ietf.org/html/draft-ietf-hybi-permessage-compression-15
  */
 public class PerMessageDeflateExtensionTest extends AbstractExtensionTest
 {
     @Rule
     public LeakTrackingBufferPoolRule bufferPool = new LeakTrackingBufferPoolRule("Test");
-
-    /**
-     * Decode payload example as seen in draft-ietf-hybi-permessage-compression-15.
-     * <p/>
-     * Section 8.2.3.4: Using a DEFLATE Block with BFINAL Set to 1
-     */
-    @Test
-    public void testDraft15_DeflateBlockWithBFinal1()
+    
+    private void assertEndsWithTail(String hexStr, boolean expectedResult)
     {
-        Tester tester = clientExtensions.newTester("permessage-deflate");
-
-        tester.assertNegotiated("permessage-deflate");
-
-        tester.parseIncomingHex(// 1 message
-                "0xc1 0x08", // header
-                "0xf3 0x48 0xcd 0xc9 0xc9 0x07 0x00 0x00" // example payload 
-        );
-
-        tester.assertHasFrames("Hello");
+        ByteBuffer buf = ByteBuffer.wrap(TypeUtil.fromHexString(hexStr));
+        assertThat("endsWithTail([" + hexStr + "])",CompressExtension.endsWithTail(buf),is(expectedResult));
+    }
+    
+    @Test
+    public void testEndsWithTailBytes()
+    {
+        assertEndsWithTail("11223344",false);
+        assertEndsWithTail("00",false);
+        assertEndsWithTail("0000",false);
+        assertEndsWithTail("FFFF0000",false);
+        assertEndsWithTail("880000FFFF",true);
+        assertEndsWithTail("0000FFFF",true);
     }
 
     /**
-     * Decode payload example as seen in draft-ietf-hybi-permessage-compression-15.
-     * <p/>
-     * Section 8.2.3.3: Using a DEFLATE Block with No Compression
-     */
-    @Test
-    public void testDraft15_DeflateBlockWithNoCompression()
-    {
-        Tester tester = clientExtensions.newTester("permessage-deflate");
-
-        tester.assertNegotiated("permessage-deflate");
-
-        tester.parseIncomingHex(// 1 message / no compression
-                "0xc1 0x0b 0x00 0x05 0x00 0xfa 0xff 0x48 0x65 0x6c 0x6c 0x6f 0x00" // example frame
-        );
-
-        tester.assertHasFrames("Hello");
-    }
-
-    /**
-     * Decode payload example as seen in draft-ietf-hybi-permessage-compression-15.
-     * <p/>
+     * Decode payload example as seen in draft-ietf-hybi-permessage-compression-21.
+     * <p>
      * Section 8.2.3.1: A message compressed using 1 compressed DEFLATE block
      */
     @Test
-    public void testDraft15_Hello_UnCompressedBlock()
+    public void testDraft21_Hello_UnCompressedBlock()
     {
         Tester tester = clientExtensions.newTester("permessage-deflate");
 
         tester.assertNegotiated("permessage-deflate");
 
-        tester.parseIncomingHex(//basic, 1 block, compressed with 0 compression level (aka, uncompressed).
-                "0xc1 0x07 0xf2 0x48 0xcd 0xc9 0xc9 0x07 0x00" // example frame
+        tester.parseIncomingHex(
+                // basic, 1 block, compressed with 0 compression level (aka, uncompressed).
+                "0xc1 0x07",  // (HEADER added for this test)
+                "0xf2 0x48 0xcd 0xc9 0xc9 0x07 0x00" // example frame from RFC
         );
 
         tester.assertHasFrames("Hello");
     }
 
     /**
-     * Decode payload example as seen in draft-ietf-hybi-permessage-compression-15.
-     * <p/>
+     * Decode payload example as seen in draft-ietf-hybi-permessage-compression-21.
+     * <p>
      * Section 8.2.3.1: A message compressed using 1 compressed DEFLATE block (with fragmentation)
      */
     @Test
-    public void testDraft15_Hello_UnCompressedBlock_Fragmented()
+    public void testDraft21_Hello_UnCompressedBlock_Fragmented()
     {
         Tester tester = clientExtensions.newTester("permessage-deflate");
 
@@ -138,12 +120,12 @@
     }
 
     /**
-     * Decode payload example as seen in draft-ietf-hybi-permessage-compression-15.
-     * <p/>
+     * Decode payload example as seen in draft-ietf-hybi-permessage-compression-21.
+     * <p>
      * Section 8.2.3.2: Sharing LZ77 Sliding Window
      */
     @Test
-    public void testDraft15_SharingL77SlidingWindow_ContextTakeover()
+    public void testDraft21_SharingL77SlidingWindow_ContextTakeover()
     {
         Tester tester = clientExtensions.newTester("permessage-deflate");
 
@@ -161,12 +143,12 @@
     }
 
     /**
-     * Decode payload example as seen in draft-ietf-hybi-permessage-compression-15.
-     * <p/>
+     * Decode payload example as seen in draft-ietf-hybi-permessage-compression-21.
+     * <p>
      * Section 8.2.3.2: Sharing LZ77 Sliding Window
      */
     @Test
-    public void testDraft15_SharingL77SlidingWindow_NoContextTakeover()
+    public void testDraft21_SharingL77SlidingWindow_NoContextTakeover()
     {
         Tester tester = clientExtensions.newTester("permessage-deflate");
 
@@ -185,12 +167,51 @@
     }
 
     /**
-     * Decode payload example as seen in draft-ietf-hybi-permessage-compression-15.
-     * <p/>
+     * Decode payload example as seen in draft-ietf-hybi-permessage-compression-21.
+     * <p>
+     * Section 8.2.3.3: Using a DEFLATE Block with No Compression
+     */
+    @Test
+    public void testDraft21_DeflateBlockWithNoCompression()
+    {
+        Tester tester = clientExtensions.newTester("permessage-deflate");
+
+        tester.assertNegotiated("permessage-deflate");
+
+        tester.parseIncomingHex(// 1 message / no compression
+                "0xc1 0x0b 0x00 0x05 0x00 0xfa 0xff 0x48 0x65 0x6c 0x6c 0x6f 0x00" // example frame
+        );
+
+        tester.assertHasFrames("Hello");
+    }
+
+    /**
+     * Decode payload example as seen in draft-ietf-hybi-permessage-compression-21.
+     * <p>
+     * Section 8.2.3.4: Using a DEFLATE Block with BFINAL Set to 1
+     */
+    @Test
+    public void testDraft21_DeflateBlockWithBFinal1()
+    {
+        Tester tester = clientExtensions.newTester("permessage-deflate");
+
+        tester.assertNegotiated("permessage-deflate");
+
+        tester.parseIncomingHex(// 1 message
+                "0xc1 0x08", // header
+                "0xf3 0x48 0xcd 0xc9 0xc9 0x07 0x00 0x00" // example payload 
+        );
+
+        tester.assertHasFrames("Hello");
+    }
+
+    /**
+     * Decode payload example as seen in draft-ietf-hybi-permessage-compression-21.
+     * <p>
      * Section 8.2.3.5: Two DEFLATE Blocks in 1 Message
      */
     @Test
-    public void testDraft15_TwoDeflateBlocksOneMessage()
+    public void testDraft21_TwoDeflateBlocksOneMessage()
     {
         Tester tester = clientExtensions.newTester("permessage-deflate");
 
@@ -298,6 +319,7 @@
 
     /**
      * Outgoing PING (Control Frame) should pass through extension unmodified
+     * @throws IOException on test failure
      */
     @Test
     public void testOutgoingPing() throws IOException
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/io/LocalWebSocketConnection.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/io/LocalWebSocketConnection.java
index 5321d1a..3fa82c6 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/io/LocalWebSocketConnection.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/io/LocalWebSocketConnection.java
@@ -35,7 +35,6 @@
 import org.eclipse.jetty.websocket.common.CloseInfo;
 import org.eclipse.jetty.websocket.common.ConnectionState;
 import org.eclipse.jetty.websocket.common.LogicalConnection;
-import org.eclipse.jetty.websocket.common.WebSocketSession;
 import org.eclipse.jetty.websocket.common.io.IOState.ConnectionStateListener;
 import org.junit.rules.TestName;
 
@@ -150,12 +149,6 @@
     }
 
     @Override
-    public WebSocketSession getSession()
-    {
-        return null;
-    }
-
-    @Override
     public void incomingError(Throwable e)
     {
         incoming.incomingError(e);
@@ -236,11 +229,6 @@
     }
 
     @Override
-    public void setSession(WebSocketSession session)
-    {
-    }
-
-    @Override
     public SuspendToken suspend()
     {
         return null;
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/io/LocalWebSocketSession.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/io/LocalWebSocketSession.java
index 843c64e..18f49f3 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/io/LocalWebSocketSession.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/io/LocalWebSocketSession.java
@@ -20,9 +20,9 @@
 
 import java.net.URI;
 
-import org.eclipse.jetty.io.ByteBufferPool;
 import org.eclipse.jetty.websocket.common.WebSocketSession;
 import org.eclipse.jetty.websocket.common.events.EventDriver;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 import org.eclipse.jetty.websocket.common.test.OutgoingFramesCapture;
 import org.junit.rules.TestName;
 
@@ -31,9 +31,10 @@
     private String id;
     private OutgoingFramesCapture outgoingCapture;
 
-    public LocalWebSocketSession(TestName testname, EventDriver driver, ByteBufferPool bufferPool)
+    public LocalWebSocketSession(WebSocketContainerScope containerScope, TestName testname, EventDriver driver)
     {
-        super(URI.create("ws://localhost/LocalWebSocketSesssion/" + testname.getMethodName()),driver,new LocalWebSocketConnection(testname,bufferPool));
+        super(containerScope,URI.create("ws://localhost/LocalWebSocketSesssion/" + testname.getMethodName()),driver,
+                new LocalWebSocketConnection(testname,containerScope.getBufferPool()));
         this.id = testname.getMethodName();
         outgoingCapture = new OutgoingFramesCapture();
         setOutgoingHandler(outgoingCapture);
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/MessageInputStreamTest.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/MessageInputStreamTest.java
index 54de967..57e8db6 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/MessageInputStreamTest.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/MessageInputStreamTest.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.websocket.common.message;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.is;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
@@ -49,7 +49,6 @@
         {
             // Append a single message (simple, short)
             ByteBuffer payload = BufferUtil.toBuffer("Hello World",StandardCharsets.UTF_8);
-            System.out.printf("payload = %s%n",BufferUtil.toDetailString(payload));
             boolean fin = true;
             stream.appendFrame(payload,fin);
 
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/MessageOutputStreamTest.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/MessageOutputStreamTest.java
index 868a20d..2d49891 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/MessageOutputStreamTest.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/MessageOutputStreamTest.java
@@ -33,6 +33,8 @@
 import org.eclipse.jetty.websocket.common.events.EventDriverFactory;
 import org.eclipse.jetty.websocket.common.io.FramePipes;
 import org.eclipse.jetty.websocket.common.io.LocalWebSocketSession;
+import org.eclipse.jetty.websocket.common.scopes.SimpleContainerScope;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 import org.eclipse.jetty.websocket.common.test.LeakTrackingBufferPoolRule;
 import org.junit.After;
 import org.junit.Assert;
@@ -73,6 +75,9 @@
 
         // Event Driver factory
         EventDriverFactory factory = new EventDriverFactory(policy);
+        
+        // Container
+        WebSocketContainerScope containerScope = new SimpleContainerScope(policy,bufferPool);
 
         // local socket
         EventDriver driver = factory.wrap(new TrackingSocket("local"));
@@ -81,7 +86,7 @@
         socket = new TrackingSocket("remote");
         OutgoingFrames socketPipe = FramePipes.to(factory.wrap(socket));
 
-        session = new LocalWebSocketSession(testname,driver,bufferPool);
+        session = new LocalWebSocketSession(containerScope,testname,driver);
 
         session.setPolicy(policy);
         // talk to our remote socket
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/MessageWriterTest.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/MessageWriterTest.java
index 7b0dac0..62ee150 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/MessageWriterTest.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/MessageWriterTest.java
@@ -18,6 +18,8 @@
 
 package org.eclipse.jetty.websocket.common.message;
 
+import static org.hamcrest.Matchers.is;
+
 import java.util.Arrays;
 
 import org.eclipse.jetty.toolchain.test.TestTracker;
@@ -29,6 +31,8 @@
 import org.eclipse.jetty.websocket.common.events.EventDriverFactory;
 import org.eclipse.jetty.websocket.common.io.FramePipes;
 import org.eclipse.jetty.websocket.common.io.LocalWebSocketSession;
+import org.eclipse.jetty.websocket.common.scopes.SimpleContainerScope;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 import org.eclipse.jetty.websocket.common.test.LeakTrackingBufferPoolRule;
 import org.junit.After;
 import org.junit.Assert;
@@ -37,8 +41,6 @@
 import org.junit.Test;
 import org.junit.rules.TestName;
 
-import static org.hamcrest.Matchers.is;
-
 public class MessageWriterTest
 {
     private static final Logger LOG = Log.getLogger(MessageWriterTest.class);
@@ -72,6 +74,9 @@
         // Event Driver factory
         EventDriverFactory factory = new EventDriverFactory(policy);
 
+        // Container
+        WebSocketContainerScope containerScope = new SimpleContainerScope(policy,bufferPool);
+
         // local socket
         EventDriver driver = factory.wrap(new TrackingSocket("local"));
 
@@ -79,7 +84,7 @@
         socket = new TrackingSocket("remote");
         OutgoingFrames socketPipe = FramePipes.to(factory.wrap(socket));
 
-        session = new LocalWebSocketSession(testname,driver,bufferPool);
+        session = new LocalWebSocketSession(containerScope,testname,driver);
 
         session.setPolicy(policy);
         // talk to our remote socket
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/TrackingInputStreamSocket.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/TrackingInputStreamSocket.java
index ca1b5cd..561bfa3 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/TrackingInputStreamSocket.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/TrackingInputStreamSocket.java
@@ -18,6 +18,8 @@
 
 package org.eclipse.jetty.websocket.common.message;
 
+import static org.hamcrest.Matchers.is;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.concurrent.CountDownLatch;
@@ -33,8 +35,6 @@
 import org.eclipse.jetty.websocket.api.annotations.WebSocket;
 import org.junit.Assert;
 
-import static org.hamcrest.Matchers.is;
-
 @WebSocket
 public class TrackingInputStreamSocket
 {
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/Utf8CharBufferTest.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/Utf8CharBufferTest.java
index 8fd4ccc..28d0e6b 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/Utf8CharBufferTest.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/message/Utf8CharBufferTest.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.websocket.common.message;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.is;
 
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/BlockheadClient.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/BlockheadClient.java
index 65eea4c..6662421 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/BlockheadClient.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/BlockheadClient.java
@@ -18,12 +18,15 @@
 
 package org.eclipse.jetty.websocket.common.test;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.anyOf;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
 
 import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.net.HttpURLConnection;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.Socket;
@@ -40,6 +43,8 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 
+import javax.net.ssl.HttpsURLConnection;
+
 import org.eclipse.jetty.io.ByteBufferPool;
 import org.eclipse.jetty.io.MappedByteBufferPool;
 import org.eclipse.jetty.toolchain.test.EventQueue;
@@ -68,6 +73,7 @@
 import org.eclipse.jetty.websocket.common.io.IOState;
 import org.eclipse.jetty.websocket.common.io.IOState.ConnectionStateListener;
 import org.eclipse.jetty.websocket.common.io.http.HttpResponseHeaderParser;
+import org.eclipse.jetty.websocket.common.scopes.SimpleContainerScope;
 import org.junit.Assert;
 
 /**
@@ -82,7 +88,7 @@
  * with regards to basic IO behavior, a write should work as expected, a read should work as expected, but <u>what</u> byte it sends or reads is not within its
  * scope.
  */
-public class BlockheadClient implements OutgoingFrames, ConnectionStateListener, AutoCloseable
+public class BlockheadClient implements OutgoingFrames, ConnectionStateListener, AutoCloseable, IBlockheadClient
 {
     private class FrameReadingThread extends Thread implements Runnable, IncomingFrames
     {
@@ -227,21 +233,33 @@
         this.generator = new Generator(policy,bufferPool);
         this.parser = new Parser(policy,bufferPool);
 
-        this.extensionFactory = new WebSocketExtensionFactory(policy,bufferPool);
+        this.extensionFactory = new WebSocketExtensionFactory(new SimpleContainerScope(policy,bufferPool));
         this.ioState = new IOState();
         this.ioState.addListener(this);
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadClient#addExtensions(java.lang.String)
+     */
+    @Override
     public void addExtensions(String xtension)
     {
         this.extensions.add(xtension);
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadClient#addHeader(java.lang.String)
+     */
+    @Override
     public void addHeader(String header)
     {
         this.headers.add(header);
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadClient#awaitDisconnect(long, java.util.concurrent.TimeUnit)
+     */
+    @Override
     public boolean awaitDisconnect(long timeout, TimeUnit unit) throws InterruptedException
     {
         return disconnectedLatch.await(timeout,unit);
@@ -257,6 +275,9 @@
         extensions.clear();
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadClient#close()
+     */
     @Override
     public void close()
     {
@@ -264,6 +285,10 @@
         close(-1,null);
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadClient#close(int, java.lang.String)
+     */
+    @Override
     public void close(int statusCode, String message)
     {
         LOG.debug("close({},{})",statusCode,message);
@@ -279,6 +304,10 @@
         }
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadClient#connect()
+     */
+    @Override
     public void connect() throws IOException
     {
         InetAddress destAddr = InetAddress.getByName(destHttpURI.getHost());
@@ -317,6 +346,10 @@
         }
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadClient#expectServerDisconnect()
+     */
+    @Override
     public void expectServerDisconnect()
     {
         if (eof)
@@ -347,6 +380,10 @@
         }
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadClient#expectUpgradeResponse()
+     */
+    @Override
     public HttpResponse expectUpgradeResponse() throws IOException
     {
         HttpResponse response = readResponseHeader();
@@ -460,6 +497,10 @@
         return ioState;
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadClient#getProtocols()
+     */
+    @Override
     public String getProtocols()
     {
         return protocols;
@@ -591,6 +632,10 @@
         return frameReader.frames;
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadClient#readResponseHeader()
+     */
+    @Override
     public HttpResponse readResponseHeader() throws IOException
     {
         HttpResponse response = new HttpResponse();
@@ -626,6 +671,10 @@
         return response;
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadClient#sendStandardRequest()
+     */
+    @Override
     public void sendStandardRequest() throws IOException
     {
         StringBuilder req = generateUpgradeRequest();
@@ -670,11 +719,19 @@
         this.executor = executor;
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadClient#setProtocols(java.lang.String)
+     */
+    @Override
     public void setProtocols(String protocols)
     {
         this.protocols = protocols;
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadClient#setTimeout(int, java.util.concurrent.TimeUnit)
+     */
+    @Override
     public void setTimeout(int duration, TimeUnit unit)
     {
         this.timeout = (int)TimeUnit.MILLISECONDS.convert(duration,unit);
@@ -719,6 +776,10 @@
         LOG.info("Waking up from sleep");
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadClient#write(org.eclipse.jetty.websocket.common.WebSocketFrame)
+     */
+    @Override
     public void write(WebSocketFrame frame) throws IOException
     {
         if (!ioState.isOpen())
@@ -738,12 +799,20 @@
         extensionStack.outgoingFrame(frame,null,BatchMode.OFF);
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadClient#writeRaw(java.nio.ByteBuffer)
+     */
+    @Override
     public void writeRaw(ByteBuffer buf) throws IOException
     {
         LOG.debug("write(ByteBuffer) {}",BufferUtil.toDetailString(buf));
         BufferUtil.writeTo(buf,out);
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadClient#writeRaw(java.nio.ByteBuffer, int)
+     */
+    @Override
     public void writeRaw(ByteBuffer buf, int numBytes) throws IOException
     {
         int len = Math.min(numBytes,buf.remaining());
@@ -752,12 +821,20 @@
         out.write(arr);
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadClient#writeRaw(java.lang.String)
+     */
+    @Override
     public void writeRaw(String str) throws IOException
     {
         LOG.debug("write((String)[{}]){}{})",str.length(),'\n',str);
         out.write(str.getBytes(StandardCharsets.ISO_8859_1));
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadClient#writeRawSlowly(java.nio.ByteBuffer, int)
+     */
+    @Override
     public void writeRawSlowly(ByteBuffer buf, int segmentSize) throws IOException
     {
         while (buf.remaining() > 0)
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/BlockheadServer.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/BlockheadServer.java
index 7a2c32d..8d4d614 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/BlockheadServer.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/BlockheadServer.java
@@ -20,52 +20,15 @@
 
 import static org.hamcrest.Matchers.*;
 
-import java.io.BufferedReader;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.ServerSocket;
 import java.net.Socket;
-import java.net.SocketException;
 import java.net.URI;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.IO;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.websocket.api.BatchMode;
-import org.eclipse.jetty.websocket.api.WebSocketPolicy;
-import org.eclipse.jetty.websocket.api.WriteCallback;
-import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
-import org.eclipse.jetty.websocket.api.extensions.Frame;
-import org.eclipse.jetty.websocket.api.extensions.Frame.Type;
-import org.eclipse.jetty.websocket.api.extensions.IncomingFrames;
-import org.eclipse.jetty.websocket.api.extensions.OutgoingFrames;
-import org.eclipse.jetty.websocket.common.AcceptHash;
-import org.eclipse.jetty.websocket.common.CloseInfo;
-import org.eclipse.jetty.websocket.common.Generator;
-import org.eclipse.jetty.websocket.common.OpCode;
-import org.eclipse.jetty.websocket.common.Parser;
-import org.eclipse.jetty.websocket.common.WebSocketFrame;
-import org.eclipse.jetty.websocket.common.extensions.ExtensionStack;
-import org.eclipse.jetty.websocket.common.extensions.WebSocketExtensionFactory;
-import org.eclipse.jetty.websocket.common.frames.CloseFrame;
 import org.junit.Assert;
 
 /**
@@ -75,548 +38,16 @@
  */
 public class BlockheadServer
 {
-    public static class ServerConnection implements IncomingFrames, OutgoingFrames, Runnable
-    {
-        private final int BUFFER_SIZE = 8192;
-        private final Socket socket;
-        private final ByteBufferPool bufferPool;
-        private final WebSocketPolicy policy;
-        private final IncomingFramesCapture incomingFrames;
-        private final Parser parser;
-        private final Generator generator;
-        private final AtomicInteger parseCount;
-        private final WebSocketExtensionFactory extensionRegistry;
-        private final AtomicBoolean echoing = new AtomicBoolean(false);
-        private Thread echoThread;
-
-        /** Set to true to disable timeouts (for debugging reasons) */
-        private boolean debug = false;
-        private OutputStream out;
-        private InputStream in;
-
-        private Map<String, String> extraResponseHeaders = new HashMap<>();
-        private OutgoingFrames outgoing = this;
-
-        public ServerConnection(Socket socket)
-        {
-            this.socket = socket;
-            this.incomingFrames = new IncomingFramesCapture();
-            this.policy = WebSocketPolicy.newServerPolicy();
-            this.policy.setMaxBinaryMessageSize(100000);
-            this.policy.setMaxTextMessageSize(100000);
-            // This is a blockhead server connection, no point tracking leaks on this object.
-            this.bufferPool = new MappedByteBufferPool(BUFFER_SIZE);
-            this.parser = new Parser(policy,bufferPool);
-            this.parseCount = new AtomicInteger(0);
-            this.generator = new Generator(policy,bufferPool,false);
-            this.extensionRegistry = new WebSocketExtensionFactory(policy,bufferPool);
-        }
-
-        /**
-         * Add an extra header for the upgrade response (from the server). No extra work is done to ensure the key and value are sane for http.
-         */
-        public void addResponseHeader(String rawkey, String rawvalue)
-        {
-            extraResponseHeaders.put(rawkey,rawvalue);
-        }
-
-        public void close() throws IOException
-        {
-            write(new CloseFrame());
-            flush();
-        }
-
-        public void close(int statusCode) throws IOException
-        {
-            CloseInfo close = new CloseInfo(statusCode);
-            write(close.asFrame());
-            flush();
-        }
-
-        public void disconnect()
-        {
-            LOG.debug("disconnect");
-            IO.close(in);
-            IO.close(out);
-            if (socket != null)
-            {
-                try
-                {
-                    socket.close();
-                }
-                catch (IOException ignore)
-                {
-                    /* ignore */
-                }
-            }
-        }
-
-        public void echoMessage(int expectedFrames, int timeoutDuration, TimeUnit timeoutUnit) throws IOException, TimeoutException
-        {
-            LOG.debug("Echo Frames [expecting {}]",expectedFrames);
-            IncomingFramesCapture cap = readFrames(expectedFrames,timeoutDuration,timeoutUnit);
-            // now echo them back.
-            for (Frame frame : cap.getFrames())
-            {
-                write(WebSocketFrame.copy(frame).setMasked(false));
-            }
-        }
-
-        public void flush() throws IOException
-        {
-            getOutputStream().flush();
-        }
-
-        public ByteBufferPool getBufferPool()
-        {
-            return bufferPool;
-        }
-
-        public IncomingFramesCapture getIncomingFrames()
-        {
-            return incomingFrames;
-        }
-
-        public InputStream getInputStream() throws IOException
-        {
-            if (in == null)
-            {
-                in = socket.getInputStream();
-            }
-            return in;
-        }
-
-        private OutputStream getOutputStream() throws IOException
-        {
-            if (out == null)
-            {
-                out = socket.getOutputStream();
-            }
-            return out;
-        }
-
-        public Parser getParser()
-        {
-            return parser;
-        }
-
-        public WebSocketPolicy getPolicy()
-        {
-            return policy;
-        }
-
-        @Override
-        public void incomingError(Throwable e)
-        {
-            incomingFrames.incomingError(e);
-        }
-
-        @Override
-        public void incomingFrame(Frame frame)
-        {
-            LOG.debug("incoming({})",frame);
-            int count = parseCount.incrementAndGet();
-            if ((count % 10) == 0)
-            {
-                LOG.info("Server parsed {} frames",count);
-            }
-            incomingFrames.incomingFrame(WebSocketFrame.copy(frame));
-
-            if (frame.getOpCode() == OpCode.CLOSE)
-            {
-                CloseInfo close = new CloseInfo(frame);
-                LOG.debug("Close frame: {}",close);
-            }
-
-            Type type = frame.getType();
-            if (echoing.get() && (type.isData() || type.isContinuation()))
-            {
-                try
-                {
-                    write(WebSocketFrame.copy(frame).setMasked(false));
-                }
-                catch (IOException e)
-                {
-                    LOG.warn(e);
-                }
-            }
-        }
-
-        @Override
-        public void outgoingFrame(Frame frame, WriteCallback callback, BatchMode batchMode)
-        {
-            ByteBuffer headerBuf = generator.generateHeaderBytes(frame);
-            if (LOG.isDebugEnabled())
-            {
-                LOG.debug("writing out: {}",BufferUtil.toDetailString(headerBuf));
-            }
-
-            try
-            {
-                BufferUtil.writeTo(headerBuf,out);
-                if (frame.hasPayload())
-                    BufferUtil.writeTo(frame.getPayload(),out);
-                out.flush();
-                if (callback != null)
-                {
-                    callback.writeSuccess();
-                }
-
-                if (frame.getOpCode() == OpCode.CLOSE)
-                {
-                    disconnect();
-                }
-            }
-            catch (Throwable t)
-            {
-                if (callback != null)
-                {
-                    callback.writeFailed(t);
-                }
-            }
-        }
-
-        public List<ExtensionConfig> parseExtensions(List<String> requestLines)
-        {
-            List<ExtensionConfig> extensionConfigs = new ArrayList<>();
-            
-            List<String> hits = regexFind(requestLines, "^Sec-WebSocket-Extensions: (.*)$");
-
-            for (String econf : hits)
-            {
-                // found extensions
-                ExtensionConfig config = ExtensionConfig.parse(econf);
-                extensionConfigs.add(config);
-            }
-
-            return extensionConfigs;
-        }
-
-        public String parseWebSocketKey(List<String> requestLines)
-        {
-            List<String> hits = regexFind(requestLines,"^Sec-WebSocket-Key: (.*)$");
-            if (hits.size() <= 0)
-            {
-                return null;
-            }
-            
-            Assert.assertThat("Number of Sec-WebSocket-Key headers", hits.size(), is(1));
-            
-            String key = hits.get(0);
-            return key;
-        }
-
-        public int read(ByteBuffer buf) throws IOException
-        {
-            int len = 0;
-            while ((in.available() > 0) && (buf.remaining() > 0))
-            {
-                buf.put((byte)in.read());
-                len++;
-            }
-            return len;
-        }
-
-        public IncomingFramesCapture readFrames(int expectedCount, int timeoutDuration, TimeUnit timeoutUnit) throws IOException, TimeoutException
-        {
-            LOG.debug("Read: waiting for {} frame(s) from client",expectedCount);
-            int startCount = incomingFrames.size();
-
-            ByteBuffer buf = bufferPool.acquire(BUFFER_SIZE,false);
-            BufferUtil.clearToFill(buf);
-            try
-            {
-                long msDur = TimeUnit.MILLISECONDS.convert(timeoutDuration,timeoutUnit);
-                long now = System.currentTimeMillis();
-                long expireOn = now + msDur;
-                LOG.debug("Now: {} - expireOn: {} ({} ms)",now,expireOn,msDur);
-
-                int len = 0;
-                while (incomingFrames.size() < (startCount + expectedCount))
-                {
-                    BufferUtil.clearToFill(buf);
-                    len = read(buf);
-                    if (len > 0)
-                    {
-                        LOG.debug("Read {} bytes",len);
-                        BufferUtil.flipToFlush(buf,0);
-                        parser.parse(buf);
-                    }
-                    try
-                    {
-                        TimeUnit.MILLISECONDS.sleep(20);
-                    }
-                    catch (InterruptedException gnore)
-                    {
-                        /* ignore */
-                    }
-                    if (!debug && (System.currentTimeMillis() > expireOn))
-                    {
-                        incomingFrames.dump();
-                        throw new TimeoutException(String.format("Timeout reading all %d expected frames. (managed to only read %d frame(s))",expectedCount,
-                                incomingFrames.size()));
-                    }
-                }
-            }
-            finally
-            {
-                bufferPool.release(buf);
-            }
-
-            return incomingFrames;
-        }
-
-        public String readRequest() throws IOException
-        {
-            LOG.debug("Reading client request");
-            StringBuilder request = new StringBuilder();
-            BufferedReader in = new BufferedReader(new InputStreamReader(getInputStream()));
-            for (String line = in.readLine(); line != null; line = in.readLine())
-            {
-                if (line.length() == 0)
-                {
-                    break;
-                }
-                request.append(line).append("\r\n");
-                LOG.debug("read line: {}",line);
-            }
-
-            LOG.debug("Client Request:{}{}","\n",request);
-            return request.toString();
-        }
-
-        public List<String> readRequestLines() throws IOException
-        {
-            LOG.debug("Reading client request header");
-            List<String> lines = new ArrayList<>();
-
-            BufferedReader in = new BufferedReader(new InputStreamReader(getInputStream()));
-            for (String line = in.readLine(); line != null; line = in.readLine())
-            {
-                if (line.length() == 0)
-                {
-                    break;
-                }
-                lines.add(line);
-            }
-
-            return lines;
-        }
-
-        public List<String> regexFind(List<String> lines, String pattern)
-        {
-            List<String> hits = new ArrayList<>();
-
-            Pattern patKey = Pattern.compile(pattern,Pattern.CASE_INSENSITIVE);
-
-            Matcher mat;
-            for (String line : lines)
-            {
-                mat = patKey.matcher(line);
-                if (mat.matches())
-                {
-                    if (mat.groupCount() >= 1)
-                    {
-                        hits.add(mat.group(1));
-                    }
-                    else
-                    {
-                        hits.add(mat.group(0));
-                    }
-                }
-            }
-
-            return hits;
-        }
-
-        public void respond(String rawstr) throws IOException
-        {
-            LOG.debug("respond(){}{}","\n",rawstr);
-            getOutputStream().write(rawstr.getBytes());
-            flush();
-        }
-
-        @Override
-        public void run()
-        {
-            LOG.debug("Entering echo thread");
-
-            ByteBuffer buf = bufferPool.acquire(BUFFER_SIZE,false);
-            BufferUtil.clearToFill(buf);
-            long readBytes = 0;
-            try
-            {
-                while (echoing.get())
-                {
-                    BufferUtil.clearToFill(buf);
-                    long len = read(buf);
-                    if (len > 0)
-                    {
-                        readBytes += len;
-                        LOG.debug("Read {} bytes",len);
-                        BufferUtil.flipToFlush(buf,0);
-                        parser.parse(buf);
-                    }
-
-                    try
-                    {
-                        TimeUnit.MILLISECONDS.sleep(20);
-                    }
-                    catch (InterruptedException gnore)
-                    {
-                        /* ignore */
-                    }
-                }
-            }
-            catch (IOException e)
-            {
-                LOG.debug("Exception during echo loop",e);
-            }
-            finally
-            {
-                LOG.debug("Read {} bytes",readBytes);
-                bufferPool.release(buf);
-            }
-        }
-
-        public void setSoTimeout(int ms) throws SocketException
-        {
-            socket.setSoTimeout(ms);
-        }
-
-        public void startEcho()
-        {
-            if (echoThread != null)
-            {
-                throw new IllegalStateException("Echo thread already declared!");
-            }
-            echoThread = new Thread(this,"BlockheadServer/Echo");
-            echoing.set(true);
-            echoThread.start();
-        }
-
-        public void stopEcho()
-        {
-            echoing.set(false);
-        }
-
-        public List<String> upgrade() throws IOException
-        {
-            List<String> requestLines = readRequestLines();
-            List<ExtensionConfig> extensionConfigs = parseExtensions(requestLines);
-            String key = parseWebSocketKey(requestLines);
-
-            LOG.debug("Client Request Extensions: {}",extensionConfigs);
-            LOG.debug("Client Request Key: {}",key);
-
-            Assert.assertThat("Request: Sec-WebSocket-Key",key,notNullValue());
-
-            // collect extensions configured in response header
-            ExtensionStack extensionStack = new ExtensionStack(extensionRegistry);
-            extensionStack.negotiate(extensionConfigs);
-
-            // Start with default routing
-            extensionStack.setNextIncoming(this);
-            extensionStack.setNextOutgoing(this);
-
-            // Configure Parser / Generator
-            extensionStack.configure(parser);
-            extensionStack.configure(generator);
-
-            // Start Stack
-            try
-            {
-                extensionStack.start();
-            }
-            catch (Exception e)
-            {
-                throw new IOException("Unable to start Extension Stack");
-            }
-
-            // Configure Parser
-            parser.setIncomingFramesHandler(extensionStack);
-
-            // Setup Response
-            StringBuilder resp = new StringBuilder();
-            resp.append("HTTP/1.1 101 Upgrade\r\n");
-            resp.append("Connection: upgrade\r\n");
-            resp.append("Sec-WebSocket-Accept: ");
-            resp.append(AcceptHash.hashKey(key)).append("\r\n");
-            if (extensionStack.hasNegotiatedExtensions())
-            {
-                // Respond to used extensions
-                resp.append("Sec-WebSocket-Extensions: ");
-                boolean delim = false;
-                for (ExtensionConfig ext : extensionStack.getNegotiatedExtensions())
-                {
-                    if (delim)
-                    {
-                        resp.append(", ");
-                    }
-                    resp.append(ext.getParameterizedName());
-                    delim = true;
-                }
-                resp.append("\r\n");
-            }
-            if (extraResponseHeaders.size() > 0)
-            {
-                for (Map.Entry<String, String> xheader : extraResponseHeaders.entrySet())
-                {
-                    resp.append(xheader.getKey());
-                    resp.append(": ");
-                    resp.append(xheader.getValue());
-                    resp.append("\r\n");
-                }
-            }
-            resp.append("\r\n");
-
-            // Write Response
-            LOG.debug("Response: {}",resp.toString());
-            write(resp.toString().getBytes());
-            return requestLines;
-        }
-
-        private void write(byte[] bytes) throws IOException
-        {
-            getOutputStream().write(bytes);
-        }
-
-        public void write(byte[] buf, int offset, int length) throws IOException
-        {
-            getOutputStream().write(buf,offset,length);
-        }
-
-        public void write(Frame frame) throws IOException
-        {
-            LOG.debug("write(Frame->{}) to {}",frame,outgoing);
-            outgoing.outgoingFrame(frame,null,BatchMode.OFF);
-        }
-
-        public void write(int b) throws IOException
-        {
-            getOutputStream().write(b);
-        }
-
-        public void write(ByteBuffer buf) throws IOException
-        {
-            byte arr[] = BufferUtil.toArray(buf);
-            if ((arr != null) && (arr.length > 0))
-            {
-                getOutputStream().write(arr);
-            }
-        }
-    }
-
     private static final Logger LOG = Log.getLogger(BlockheadServer.class);
     private ServerSocket serverSocket;
     private URI wsUri;
 
-    public ServerConnection accept() throws IOException
+    public IBlockheadServerConnection accept() throws IOException
     {
         LOG.debug(".accept()");
         assertIsStarted();
         Socket socket = serverSocket.accept();
-        return new ServerConnection(socket);
+        return new BlockheadServerConnection(socket);
     }
 
     private void assertIsStarted()
@@ -633,42 +64,6 @@
         return wsUri;
     }
 
-    public void respondToClient(Socket connection, String serverResponse) throws IOException
-    {
-        InputStream in = null;
-        InputStreamReader isr = null;
-        BufferedReader buf = null;
-        OutputStream out = null;
-        try
-        {
-            in = connection.getInputStream();
-            isr = new InputStreamReader(in);
-            buf = new BufferedReader(isr);
-            String line;
-            while ((line = buf.readLine()) != null)
-            {
-                // System.err.println(line);
-                if (line.length() == 0)
-                {
-                    // Got the "\r\n" line.
-                    break;
-                }
-            }
-
-            // System.out.println("[Server-Out] " + serverResponse);
-            out = connection.getOutputStream();
-            out.write(serverResponse.getBytes());
-            out.flush();
-        }
-        finally
-        {
-            IO.close(buf);
-            IO.close(isr);
-            IO.close(in);
-            IO.close(out);
-        }
-    }
-
     public void start() throws IOException
     {
         InetAddress addr = InetAddress.getByName("localhost");
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/BlockheadServerConnection.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/BlockheadServerConnection.java
new file mode 100644
index 0000000..e54e664
--- /dev/null
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/BlockheadServerConnection.java
@@ -0,0 +1,614 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.common.test;
+
+import static org.hamcrest.Matchers.*;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.net.SocketException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.MappedByteBufferPool;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.websocket.api.BatchMode;
+import org.eclipse.jetty.websocket.api.WebSocketPolicy;
+import org.eclipse.jetty.websocket.api.WriteCallback;
+import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
+import org.eclipse.jetty.websocket.api.extensions.Frame;
+import org.eclipse.jetty.websocket.api.extensions.IncomingFrames;
+import org.eclipse.jetty.websocket.api.extensions.OutgoingFrames;
+import org.eclipse.jetty.websocket.api.extensions.Frame.Type;
+import org.eclipse.jetty.websocket.common.AcceptHash;
+import org.eclipse.jetty.websocket.common.CloseInfo;
+import org.eclipse.jetty.websocket.common.Generator;
+import org.eclipse.jetty.websocket.common.OpCode;
+import org.eclipse.jetty.websocket.common.Parser;
+import org.eclipse.jetty.websocket.common.WebSocketFrame;
+import org.eclipse.jetty.websocket.common.extensions.ExtensionStack;
+import org.eclipse.jetty.websocket.common.extensions.WebSocketExtensionFactory;
+import org.eclipse.jetty.websocket.common.frames.CloseFrame;
+import org.eclipse.jetty.websocket.common.scopes.SimpleContainerScope;
+import org.junit.Assert;
+
+public class BlockheadServerConnection implements IncomingFrames, OutgoingFrames, Runnable, IBlockheadServerConnection
+{
+    private static final Logger LOG = Log.getLogger(BlockheadServerConnection.class);
+    
+    private final int BUFFER_SIZE = 8192;
+    private final Socket socket;
+    private final ByteBufferPool bufferPool;
+    private final WebSocketPolicy policy;
+    private final IncomingFramesCapture incomingFrames;
+    private final Parser parser;
+    private final Generator generator;
+    private final AtomicInteger parseCount;
+    private final WebSocketExtensionFactory extensionRegistry;
+    private final AtomicBoolean echoing = new AtomicBoolean(false);
+    private Thread echoThread;
+
+    /** Set to true to disable timeouts (for debugging reasons) */
+    private boolean debug = false;
+    private OutputStream out;
+    private InputStream in;
+
+    private Map<String, String> extraResponseHeaders = new HashMap<>();
+    private OutgoingFrames outgoing = this;
+
+    public BlockheadServerConnection(Socket socket)
+    {
+        this.socket = socket;
+        this.incomingFrames = new IncomingFramesCapture();
+        this.policy = WebSocketPolicy.newServerPolicy();
+        this.policy.setMaxBinaryMessageSize(100000);
+        this.policy.setMaxTextMessageSize(100000);
+        // This is a blockhead server connection, no point tracking leaks on this object.
+        this.bufferPool = new MappedByteBufferPool(BUFFER_SIZE);
+        this.parser = new Parser(policy,bufferPool);
+        this.parseCount = new AtomicInteger(0);
+        this.generator = new Generator(policy,bufferPool,false);
+        this.extensionRegistry = new WebSocketExtensionFactory(new SimpleContainerScope(policy,bufferPool));
+    }
+
+    /**
+     * Add an extra header for the upgrade response (from the server). No extra work is done to ensure the key and value are sane for http.
+     * @param rawkey the raw key
+     * @param rawvalue the raw value
+     */
+    public void addResponseHeader(String rawkey, String rawvalue)
+    {
+        extraResponseHeaders.put(rawkey,rawvalue);
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadServerConnection#close()
+     */
+    @Override
+    public void close() throws IOException
+    {
+        write(new CloseFrame());
+        flush();
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadServerConnection#close(int)
+     */
+    @Override
+    public void close(int statusCode) throws IOException
+    {
+        CloseInfo close = new CloseInfo(statusCode);
+        write(close.asFrame());
+        flush();
+    }
+
+    public void disconnect()
+    {
+        LOG.debug("disconnect");
+        IO.close(in);
+        IO.close(out);
+        if (socket != null)
+        {
+            try
+            {
+                socket.close();
+            }
+            catch (IOException ignore)
+            {
+                /* ignore */
+            }
+        }
+    }
+
+    public void echoMessage(int expectedFrames, int timeoutDuration, TimeUnit timeoutUnit) throws IOException, TimeoutException
+    {
+        LOG.debug("Echo Frames [expecting {}]",expectedFrames);
+        IncomingFramesCapture cap = readFrames(expectedFrames,timeoutDuration,timeoutUnit);
+        // now echo them back.
+        for (Frame frame : cap.getFrames())
+        {
+            write(WebSocketFrame.copy(frame).setMasked(false));
+        }
+    }
+
+    public void flush() throws IOException
+    {
+        getOutputStream().flush();
+    }
+
+    public ByteBufferPool getBufferPool()
+    {
+        return bufferPool;
+    }
+
+    public IncomingFramesCapture getIncomingFrames()
+    {
+        return incomingFrames;
+    }
+
+    public InputStream getInputStream() throws IOException
+    {
+        if (in == null)
+        {
+            in = socket.getInputStream();
+        }
+        return in;
+    }
+
+    private OutputStream getOutputStream() throws IOException
+    {
+        if (out == null)
+        {
+            out = socket.getOutputStream();
+        }
+        return out;
+    }
+
+    public Parser getParser()
+    {
+        return parser;
+    }
+
+    public WebSocketPolicy getPolicy()
+    {
+        return policy;
+    }
+
+    @Override
+    public void incomingError(Throwable e)
+    {
+        incomingFrames.incomingError(e);
+    }
+
+    @Override
+    public void incomingFrame(Frame frame)
+    {
+        LOG.debug("incoming({})",frame);
+        int count = parseCount.incrementAndGet();
+        if ((count % 10) == 0)
+        {
+            LOG.info("Server parsed {} frames",count);
+        }
+        incomingFrames.incomingFrame(WebSocketFrame.copy(frame));
+
+        if (frame.getOpCode() == OpCode.CLOSE)
+        {
+            CloseInfo close = new CloseInfo(frame);
+            LOG.debug("Close frame: {}",close);
+        }
+
+        Type type = frame.getType();
+        if (echoing.get() && (type.isData() || type.isContinuation()))
+        {
+            try
+            {
+                write(WebSocketFrame.copy(frame).setMasked(false));
+            }
+            catch (IOException e)
+            {
+                LOG.warn(e);
+            }
+        }
+    }
+
+    @Override
+    public void outgoingFrame(Frame frame, WriteCallback callback, BatchMode batchMode)
+    {
+        ByteBuffer headerBuf = generator.generateHeaderBytes(frame);
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("writing out: {}",BufferUtil.toDetailString(headerBuf));
+        }
+
+        try
+        {
+            BufferUtil.writeTo(headerBuf,out);
+            if (frame.hasPayload())
+                BufferUtil.writeTo(frame.getPayload(),out);
+            out.flush();
+            if (callback != null)
+            {
+                callback.writeSuccess();
+            }
+
+            if (frame.getOpCode() == OpCode.CLOSE)
+            {
+                disconnect();
+            }
+        }
+        catch (Throwable t)
+        {
+            if (callback != null)
+            {
+                callback.writeFailed(t);
+            }
+        }
+    }
+
+    public List<ExtensionConfig> parseExtensions(List<String> requestLines)
+    {
+        List<ExtensionConfig> extensionConfigs = new ArrayList<>();
+        
+        List<String> hits = regexFind(requestLines, "^Sec-WebSocket-Extensions: (.*)$");
+
+        for (String econf : hits)
+        {
+            // found extensions
+            ExtensionConfig config = ExtensionConfig.parse(econf);
+            extensionConfigs.add(config);
+        }
+
+        return extensionConfigs;
+    }
+
+    public String parseWebSocketKey(List<String> requestLines)
+    {
+        List<String> hits = regexFind(requestLines,"^Sec-WebSocket-Key: (.*)$");
+        if (hits.size() <= 0)
+        {
+            return null;
+        }
+        
+        Assert.assertThat("Number of Sec-WebSocket-Key headers", hits.size(), is(1));
+        
+        String key = hits.get(0);
+        return key;
+    }
+
+    public int read(ByteBuffer buf) throws IOException
+    {
+        int len = 0;
+        while ((in.available() > 0) && (buf.remaining() > 0))
+        {
+            buf.put((byte)in.read());
+            len++;
+        }
+        return len;
+    }
+
+    public IncomingFramesCapture readFrames(int expectedCount, int timeoutDuration, TimeUnit timeoutUnit) throws IOException, TimeoutException
+    {
+        LOG.debug("Read: waiting for {} frame(s) from client",expectedCount);
+        int startCount = incomingFrames.size();
+
+        ByteBuffer buf = bufferPool.acquire(BUFFER_SIZE,false);
+        BufferUtil.clearToFill(buf);
+        try
+        {
+            long msDur = TimeUnit.MILLISECONDS.convert(timeoutDuration,timeoutUnit);
+            long now = System.currentTimeMillis();
+            long expireOn = now + msDur;
+            LOG.debug("Now: {} - expireOn: {} ({} ms)",now,expireOn,msDur);
+
+            int len = 0;
+            while (incomingFrames.size() < (startCount + expectedCount))
+            {
+                BufferUtil.clearToFill(buf);
+                len = read(buf);
+                if (len > 0)
+                {
+                    LOG.debug("Read {} bytes",len);
+                    BufferUtil.flipToFlush(buf,0);
+                    parser.parse(buf);
+                }
+                try
+                {
+                    TimeUnit.MILLISECONDS.sleep(20);
+                }
+                catch (InterruptedException gnore)
+                {
+                    /* ignore */
+                }
+                if (!debug && (System.currentTimeMillis() > expireOn))
+                {
+                    incomingFrames.dump();
+                    throw new TimeoutException(String.format("Timeout reading all %d expected frames. (managed to only read %d frame(s))",expectedCount,
+                            incomingFrames.size()));
+                }
+            }
+        }
+        finally
+        {
+            bufferPool.release(buf);
+        }
+
+        return incomingFrames;
+    }
+
+    public String readRequest() throws IOException
+    {
+        LOG.debug("Reading client request");
+        StringBuilder request = new StringBuilder();
+        BufferedReader in = new BufferedReader(new InputStreamReader(getInputStream()));
+        for (String line = in.readLine(); line != null; line = in.readLine())
+        {
+            if (line.length() == 0)
+            {
+                break;
+            }
+            request.append(line).append("\r\n");
+            LOG.debug("read line: {}",line);
+        }
+
+        LOG.debug("Client Request:{}{}","\n",request);
+        return request.toString();
+    }
+
+    public List<String> readRequestLines() throws IOException
+    {
+        LOG.debug("Reading client request header");
+        List<String> lines = new ArrayList<>();
+
+        BufferedReader in = new BufferedReader(new InputStreamReader(getInputStream()));
+        for (String line = in.readLine(); line != null; line = in.readLine())
+        {
+            if (line.length() == 0)
+            {
+                break;
+            }
+            lines.add(line);
+        }
+
+        return lines;
+    }
+
+    public List<String> regexFind(List<String> lines, String pattern)
+    {
+        List<String> hits = new ArrayList<>();
+
+        Pattern patKey = Pattern.compile(pattern,Pattern.CASE_INSENSITIVE);
+
+        Matcher mat;
+        for (String line : lines)
+        {
+            mat = patKey.matcher(line);
+            if (mat.matches())
+            {
+                if (mat.groupCount() >= 1)
+                {
+                    hits.add(mat.group(1));
+                }
+                else
+                {
+                    hits.add(mat.group(0));
+                }
+            }
+        }
+
+        return hits;
+    }
+
+    public void respond(String rawstr) throws IOException
+    {
+        LOG.debug("respond(){}{}","\n",rawstr);
+        getOutputStream().write(rawstr.getBytes());
+        flush();
+    }
+
+    @Override
+    public void run()
+    {
+        LOG.debug("Entering echo thread");
+
+        ByteBuffer buf = bufferPool.acquire(BUFFER_SIZE,false);
+        BufferUtil.clearToFill(buf);
+        long readBytes = 0;
+        try
+        {
+            while (echoing.get())
+            {
+                BufferUtil.clearToFill(buf);
+                long len = read(buf);
+                if (len > 0)
+                {
+                    readBytes += len;
+                    LOG.debug("Read {} bytes",len);
+                    BufferUtil.flipToFlush(buf,0);
+                    parser.parse(buf);
+                }
+
+                try
+                {
+                    TimeUnit.MILLISECONDS.sleep(20);
+                }
+                catch (InterruptedException gnore)
+                {
+                    /* ignore */
+                }
+            }
+        }
+        catch (IOException e)
+        {
+            LOG.debug("Exception during echo loop",e);
+        }
+        finally
+        {
+            LOG.debug("Read {} bytes",readBytes);
+            bufferPool.release(buf);
+        }
+    }
+
+    public void setSoTimeout(int ms) throws SocketException
+    {
+        socket.setSoTimeout(ms);
+    }
+
+    public void startEcho()
+    {
+        if (echoThread != null)
+        {
+            throw new IllegalStateException("Echo thread already declared!");
+        }
+        echoThread = new Thread(this,"BlockheadServer/Echo");
+        echoing.set(true);
+        echoThread.start();
+    }
+
+    public void stopEcho()
+    {
+        echoing.set(false);
+    }
+
+    public List<String> upgrade() throws IOException
+    {
+        List<String> requestLines = readRequestLines();
+        List<ExtensionConfig> extensionConfigs = parseExtensions(requestLines);
+        String key = parseWebSocketKey(requestLines);
+
+        LOG.debug("Client Request Extensions: {}",extensionConfigs);
+        LOG.debug("Client Request Key: {}",key);
+
+        Assert.assertThat("Request: Sec-WebSocket-Key",key,notNullValue());
+
+        // collect extensions configured in response header
+        ExtensionStack extensionStack = new ExtensionStack(extensionRegistry);
+        extensionStack.negotiate(extensionConfigs);
+
+        // Start with default routing
+        extensionStack.setNextIncoming(this);
+        extensionStack.setNextOutgoing(this);
+
+        // Configure Parser / Generator
+        extensionStack.configure(parser);
+        extensionStack.configure(generator);
+
+        // Start Stack
+        try
+        {
+            extensionStack.start();
+        }
+        catch (Exception e)
+        {
+            throw new IOException("Unable to start Extension Stack");
+        }
+
+        // Configure Parser
+        parser.setIncomingFramesHandler(extensionStack);
+
+        // Setup Response
+        StringBuilder resp = new StringBuilder();
+        resp.append("HTTP/1.1 101 Upgrade\r\n");
+        resp.append("Connection: upgrade\r\n");
+        resp.append("Sec-WebSocket-Accept: ");
+        resp.append(AcceptHash.hashKey(key)).append("\r\n");
+        if (extensionStack.hasNegotiatedExtensions())
+        {
+            // Respond to used extensions
+            resp.append("Sec-WebSocket-Extensions: ");
+            boolean delim = false;
+            for (ExtensionConfig ext : extensionStack.getNegotiatedExtensions())
+            {
+                if (delim)
+                {
+                    resp.append(", ");
+                }
+                resp.append(ext.getParameterizedName());
+                delim = true;
+            }
+            resp.append("\r\n");
+        }
+        if (extraResponseHeaders.size() > 0)
+        {
+            for (Map.Entry<String, String> xheader : extraResponseHeaders.entrySet())
+            {
+                resp.append(xheader.getKey());
+                resp.append(": ");
+                resp.append(xheader.getValue());
+                resp.append("\r\n");
+            }
+        }
+        resp.append("\r\n");
+
+        // Write Response
+        LOG.debug("Response: {}",resp.toString());
+        write(resp.toString().getBytes());
+        return requestLines;
+    }
+
+    private void write(byte[] bytes) throws IOException
+    {
+        getOutputStream().write(bytes);
+    }
+
+    public void write(byte[] buf, int offset, int length) throws IOException
+    {
+        getOutputStream().write(buf,offset,length);
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.websocket.common.test.IBlockheadServerConnection#write(org.eclipse.jetty.websocket.api.extensions.Frame)
+     */
+    @Override
+    public void write(Frame frame) throws IOException
+    {
+        LOG.debug("write(Frame->{}) to {}",frame,outgoing);
+        outgoing.outgoingFrame(frame,null,BatchMode.OFF);
+    }
+
+    public void write(int b) throws IOException
+    {
+        getOutputStream().write(b);
+    }
+
+    public void write(ByteBuffer buf) throws IOException
+    {
+        byte arr[] = BufferUtil.toArray(buf);
+        if ((arr != null) && (arr.length > 0))
+        {
+            getOutputStream().write(arr);
+        }
+    }
+}
\ No newline at end of file
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/ByteBufferAssert.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/ByteBufferAssert.java
index 9c0e02f..4709069 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/ByteBufferAssert.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/ByteBufferAssert.java
@@ -18,8 +18,9 @@
 
 package org.eclipse.jetty.websocket.common.test;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.nullValue;
+import static org.junit.Assert.assertThat;
 
 import java.nio.ByteBuffer;
 
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/DummyConnection.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/DummyConnection.java
new file mode 100644
index 0000000..012fd78
--- /dev/null
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/DummyConnection.java
@@ -0,0 +1,149 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.common.test;
+
+import java.net.InetSocketAddress;
+import java.util.concurrent.Executor;
+
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.websocket.api.BatchMode;
+import org.eclipse.jetty.websocket.api.SuspendToken;
+import org.eclipse.jetty.websocket.api.WebSocketPolicy;
+import org.eclipse.jetty.websocket.api.WriteCallback;
+import org.eclipse.jetty.websocket.api.extensions.Frame;
+import org.eclipse.jetty.websocket.api.extensions.IncomingFrames;
+import org.eclipse.jetty.websocket.common.LogicalConnection;
+import org.eclipse.jetty.websocket.common.io.IOState;
+
+public class DummyConnection implements LogicalConnection
+{
+    private static final Logger LOG = Log.getLogger(DummyConnection.class);
+    private IOState iostate;
+
+    public DummyConnection()
+    {
+        this.iostate = new IOState();
+    }
+
+    @Override
+    public void close()
+    {
+    }
+
+    @Override
+    public void close(int statusCode, String reason)
+    {
+    }
+
+    @Override
+    public void disconnect()
+    {
+    }
+
+    @Override
+    public ByteBufferPool getBufferPool()
+    {
+        return null;
+    }
+
+    @Override
+    public Executor getExecutor()
+    {
+        return null;
+    }
+
+    @Override
+    public long getIdleTimeout()
+    {
+        return 0;
+    }
+
+    @Override
+    public IOState getIOState()
+    {
+        return this.iostate;
+    }
+
+    @Override
+    public InetSocketAddress getLocalAddress()
+    {
+        return null;
+    }
+
+    @Override
+    public long getMaxIdleTimeout()
+    {
+        return 0;
+    }
+
+    @Override
+    public WebSocketPolicy getPolicy()
+    {
+        return null;
+    }
+
+    @Override
+    public InetSocketAddress getRemoteAddress()
+    {
+        return null;
+    }
+
+    @Override
+    public boolean isOpen()
+    {
+        return false;
+    }
+
+    @Override
+    public boolean isReading()
+    {
+        return false;
+    }
+
+    @Override
+    public void outgoingFrame(Frame frame, WriteCallback callback, BatchMode batchMode)
+    {
+        callback.writeSuccess();
+    }
+
+    @Override
+    public void resume()
+    {
+    }
+
+    @Override
+    public void setMaxIdleTimeout(long ms)
+    {
+    }
+
+    @Override
+    public void setNextIncomingFrames(IncomingFrames incoming)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("setNextIncomingFrames({})",incoming);
+    }
+
+    @Override
+    public SuspendToken suspend()
+    {
+        return null;
+    }
+}
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/Fuzzer.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/Fuzzer.java
index d1dcd3c..78f925f 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/Fuzzer.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/Fuzzer.java
@@ -18,7 +18,8 @@
 
 package org.eclipse.jetty.websocket.common.test;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
 
 import java.io.IOException;
 import java.net.SocketException;
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/IBlockheadClient.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/IBlockheadClient.java
new file mode 100644
index 0000000..9afea76
--- /dev/null
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/IBlockheadClient.java
@@ -0,0 +1,79 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.common.test;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jetty.toolchain.test.EventQueue;
+import org.eclipse.jetty.websocket.common.WebSocketFrame;
+
+/**
+ * Interface for BlockheadClient.
+ */
+public interface IBlockheadClient extends AutoCloseable
+{
+    public void addExtensions(String xtension);
+
+    public void addHeader(String header);
+
+    public boolean awaitDisconnect(long timeout, TimeUnit unit) throws InterruptedException;
+
+    public void close();
+
+    public void close(int statusCode, String message);
+
+    public void connect() throws IOException;
+
+    public void disconnect();
+
+    public void expectServerDisconnect();
+
+    public HttpResponse expectUpgradeResponse() throws IOException;
+
+    public InetSocketAddress getLocalSocketAddress();
+
+    public String getProtocols();
+
+    public InetSocketAddress getRemoteSocketAddress();
+
+    public EventQueue<WebSocketFrame> readFrames(int expectedFrameCount, int timeoutDuration, TimeUnit timeoutUnit) throws Exception;
+
+    public HttpResponse readResponseHeader() throws IOException;
+
+    public void sendStandardRequest() throws IOException;
+
+    public void setConnectionValue(String connectionValue);
+
+    public void setProtocols(String protocols);
+
+    public void setTimeout(int duration, TimeUnit unit);
+
+    public void write(WebSocketFrame frame) throws IOException;
+
+    public void writeRaw(ByteBuffer buf) throws IOException;
+
+    public void writeRaw(ByteBuffer buf, int numBytes) throws IOException;
+
+    public void writeRaw(String str) throws IOException;
+
+    public void writeRawSlowly(ByteBuffer buf, int segmentSize) throws IOException;
+}
\ No newline at end of file
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/IBlockheadServerConnection.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/IBlockheadServerConnection.java
new file mode 100644
index 0000000..dc3c5a7
--- /dev/null
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/IBlockheadServerConnection.java
@@ -0,0 +1,68 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.common.test;
+
+import java.io.IOException;
+import java.net.SocketException;
+import java.nio.ByteBuffer;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.websocket.api.extensions.Frame;
+import org.eclipse.jetty.websocket.common.Parser;
+
+public interface IBlockheadServerConnection
+{
+    public void close() throws IOException;
+
+    public void close(int statusCode) throws IOException;
+
+    public void write(Frame frame) throws IOException;
+
+    public List<String> upgrade() throws IOException;
+
+    public void disconnect();
+
+    public IncomingFramesCapture readFrames(int expectedCount, int timeoutDuration, TimeUnit timeoutUnit) throws IOException, TimeoutException;
+    public void write(ByteBuffer buf) throws IOException;
+    public List<String> readRequestLines() throws IOException;
+    public String parseWebSocketKey(List<String> requestLines);
+    public void respond(String rawstr) throws IOException;
+    public String readRequest() throws IOException;
+    public List<String> regexFind(List<String> lines, String pattern);
+    public void echoMessage(int expectedFrames, int timeoutDuration, TimeUnit timeoutUnit) throws IOException, TimeoutException;
+    public void setSoTimeout(int ms) throws SocketException;
+    public ByteBufferPool getBufferPool();
+    public int read(ByteBuffer buf) throws IOException;
+    public Parser getParser();
+    public IncomingFramesCapture getIncomingFrames();
+    public void flush() throws IOException;
+    public void write(int b) throws IOException;
+    public void startEcho();
+    public void stopEcho();
+    
+    /**
+     * Add an extra header for the upgrade response (from the server). No extra work is done to ensure the key and value are sane for http.
+     * @param rawkey the raw key
+     * @param rawvalue the raw value
+     */
+    public void addResponseHeader(String rawkey, String rawvalue);
+}
\ No newline at end of file
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/IncomingFramesCapture.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/IncomingFramesCapture.java
index 5fc94ac..9d62aaf 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/IncomingFramesCapture.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/IncomingFramesCapture.java
@@ -18,7 +18,8 @@
 
 package org.eclipse.jetty.websocket.common.test;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.is;
 
 import java.util.Queue;
 
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/LeakTrackingBufferPoolRule.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/LeakTrackingBufferPoolRule.java
index 49224ed..fc982d8 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/LeakTrackingBufferPoolRule.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/LeakTrackingBufferPoolRule.java
@@ -18,15 +18,15 @@
 
 package org.eclipse.jetty.websocket.common.test;
 
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
 import org.eclipse.jetty.io.LeakTrackingByteBufferPool;
 import org.eclipse.jetty.io.MappedByteBufferPool;
 import org.junit.rules.TestRule;
 import org.junit.runner.Description;
 import org.junit.runners.model.Statement;
 
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
 public class LeakTrackingBufferPoolRule extends LeakTrackingByteBufferPool implements TestRule
 {
     private final String id;
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/OutgoingFramesCapture.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/OutgoingFramesCapture.java
index 2ed9db7..1850882 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/OutgoingFramesCapture.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/OutgoingFramesCapture.java
@@ -18,6 +18,9 @@
 
 package org.eclipse.jetty.websocket.common.test;
 
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.is;
+
 import java.util.LinkedList;
 
 import org.eclipse.jetty.util.BufferUtil;
@@ -29,9 +32,6 @@
 import org.eclipse.jetty.websocket.common.WebSocketFrame;
 import org.junit.Assert;
 
-import static org.hamcrest.Matchers.greaterThanOrEqualTo;
-import static org.hamcrest.Matchers.is;
-
 public class OutgoingFramesCapture implements OutgoingFrames
 {
     private LinkedList<WebSocketFrame> frames = new LinkedList<>();
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/OutgoingNetworkBytesCapture.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/OutgoingNetworkBytesCapture.java
index ee7ae9f..b96518f 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/OutgoingNetworkBytesCapture.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/OutgoingNetworkBytesCapture.java
@@ -18,6 +18,9 @@
 
 package org.eclipse.jetty.websocket.common.test;
 
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.lessThan;
+
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
@@ -32,9 +35,6 @@
 import org.eclipse.jetty.websocket.common.Generator;
 import org.junit.Assert;
 
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.lessThan;
-
 /**
  * Capture outgoing network bytes.
  */
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/RawFrameBuilder.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/RawFrameBuilder.java
index 3f814b5..5e69fb6 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/RawFrameBuilder.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/RawFrameBuilder.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.websocket.common.test;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.is;
 
 import java.nio.ByteBuffer;
 
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/UnitGenerator.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/UnitGenerator.java
index df9f841..f92d29e 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/UnitGenerator.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/UnitGenerator.java
@@ -83,6 +83,8 @@
 
     /**
      * Generate a single giant buffer of all provided frames Not appropriate for production code, but useful for testing.
+     * @param frames the list of frames to generate from
+     * @return the bytebuffer representing all of the generated frames
      */
     public static ByteBuffer generate(List<WebSocketFrame> frames)
     {
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/UnitParser.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/UnitParser.java
index b93776c..9f924d2 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/UnitParser.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/test/UnitParser.java
@@ -50,6 +50,7 @@
      * Parse a buffer, but do so in a quiet fashion, squelching stacktraces if encountered.
      * <p>
      * Use if you know the parse will cause an exception and just don't wnat to make the test console all noisy.
+     * @param buf the buffer to parse
      */
     public void parseQuietly(ByteBuffer buf)
     {
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/util/Utf8PartialBuilderTest.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/util/Utf8PartialBuilderTest.java
new file mode 100644
index 0000000..dc5ad28
--- /dev/null
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/util/Utf8PartialBuilderTest.java
@@ -0,0 +1,86 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.common.util;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+
+import org.eclipse.jetty.util.BufferUtil;
+import org.junit.Test;
+
+/**
+ * Test partial UTF8 String sequence building.
+ */
+public class Utf8PartialBuilderTest
+{
+    private ByteBuffer toByteBuffer(String hexStr)
+    {
+        return ByteBuffer.wrap(Hex.asByteArray(hexStr));
+    }
+    
+    @Test
+    public void testPartial_UnsplitCodepoint()
+    {
+        Utf8PartialBuilder utf8 = new Utf8PartialBuilder();
+
+        String seq1 = "Hello-\uC2B5@\uC39F\uC3A4";
+        String seq2 = "\uC3BC\uC3A0\uC3A1-UTF-8!!";
+
+        String ret1 = utf8.toPartialString(BufferUtil.toBuffer(seq1,StandardCharsets.UTF_8));
+        String ret2 = utf8.toPartialString(BufferUtil.toBuffer(seq2,StandardCharsets.UTF_8));
+
+        assertThat("Seq1",ret1,is(seq1));
+        assertThat("Seq2",ret2,is(seq2));
+    }
+    
+    @Test
+    public void testPartial_SplitCodepoint()
+    {
+        Utf8PartialBuilder utf8 = new Utf8PartialBuilder();
+
+        String seq1 = "48656C6C6F2DEC8AB540EC8E9FEC8E";
+        String seq2 = "A4EC8EBCEC8EA0EC8EA12D5554462D382121";
+        
+        String ret1 = utf8.toPartialString(toByteBuffer(seq1));
+        String ret2 = utf8.toPartialString(toByteBuffer(seq2));
+
+        assertThat("Seq1",ret1,is("Hello-\uC2B5@\uC39F"));
+        assertThat("Seq2",ret2,is("\uC3A4\uC3BC\uC3A0\uC3A1-UTF-8!!"));
+    }
+    
+    @Test
+    public void testPartial_SplitCodepoint_WithNoBuf()
+    {
+        Utf8PartialBuilder utf8 = new Utf8PartialBuilder();
+
+        String seq1 = "48656C6C6F2DEC8AB540EC8E9FEC8E";
+        String seq2 = "A4EC8EBCEC8EA0EC8EA12D5554462D382121";
+        
+        String ret1 = utf8.toPartialString(toByteBuffer(seq1));
+        String ret2 = utf8.toPartialString(BufferUtil.EMPTY_BUFFER);
+        String ret3 = utf8.toPartialString(toByteBuffer(seq2));
+
+        assertThat("Seq1",ret1,is("Hello-\uC2B5@\uC39F"));
+        assertThat("Seq2",ret2,is(""));
+        assertThat("Seq3",ret3,is("\uC3A4\uC3BC\uC3A0\uC3A1-UTF-8!!"));
+    }
+}
diff --git a/jetty-websocket/websocket-server/pom.xml b/jetty-websocket/websocket-server/pom.xml
index d6f636d..632bded 100644
--- a/jetty-websocket/websocket-server/pom.xml
+++ b/jetty-websocket/websocket-server/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <groupId>org.eclipse.jetty.websocket</groupId>
         <artifactId>websocket-parent</artifactId>
-        <version>9.2.14-SNAPSHOT</version>
+        <version>9.3.6-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
@@ -20,30 +20,20 @@
           <groupId>org.apache.felix</groupId>
           <artifactId>maven-bundle-plugin</artifactId>
           <extensions>true</extensions>
-          <executions>
-            <execution>
-              <id>generate-manifest</id>
-              <goals>
-                <goal>manifest</goal>
-              </goals>
-              <configuration>
-                <instructions>
-                  <Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)"</Require-Capability>
-                  <Provide-Capability>osgi.serviceloader; osgi.serviceloader=org.eclipse.jetty.websocket.servlet.WebSocketServletFactory</Provide-Capability>
-                  <_nouses>true</_nouses>
-                </instructions>
-              </configuration>
-            </execution>
-          </executions>
+          <configuration>
+            <instructions>
+              <Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)"</Require-Capability>
+              <Provide-Capability>osgi.serviceloader; osgi.serviceloader=org.eclipse.jetty.websocket.servlet.WebSocketServletFactory</Provide-Capability>
+            </instructions>
+          </configuration>
         </plugin>
             <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-jar-plugin</artifactId>
               <executions>
                 <execution>
-                  <id>artifact-jars</id>
+                  <id>test-jar</id>
                   <goals>
-                    <goal>jar</goal>
                     <goal>test-jar</goal>
                   </goals>
                 </execution>
diff --git a/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/HandshakeRFC6455.java b/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/HandshakeRFC6455.java
index 234587e..38aae1b 100644
--- a/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/HandshakeRFC6455.java
+++ b/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/HandshakeRFC6455.java
@@ -19,6 +19,7 @@
 package org.eclipse.jetty.websocket.server;
 
 import java.io.IOException;
+
 import javax.servlet.http.HttpServletResponse;
 
 import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
diff --git a/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketHandshake.java b/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketHandshake.java
index 4628c8b..b5b849f 100644
--- a/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketHandshake.java
+++ b/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketHandshake.java
@@ -28,8 +28,9 @@
     /**
      * Formulate a WebSocket upgrade handshake response.
      * 
-     * @param request
-     * @param response
+     * @param request the request
+     * @param response the response
+     * @throws IOException if unable to handshake
      */
     public void doHandshakeResponse(ServletUpgradeRequest request, ServletUpgradeResponse response) throws IOException;
 }
diff --git a/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketServerConnection.java b/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketServerConnection.java
index 25731f5..880c9a4 100644
--- a/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketServerConnection.java
+++ b/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketServerConnection.java
@@ -19,14 +19,11 @@
 package org.eclipse.jetty.websocket.server;
 
 import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
 import java.util.concurrent.Executor;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.eclipse.jetty.io.ByteBufferPool;
 import org.eclipse.jetty.io.Connection;
 import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.util.thread.Scheduler;
 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
 import org.eclipse.jetty.websocket.api.extensions.IncomingFrames;
@@ -34,8 +31,6 @@
 
 public class WebSocketServerConnection extends AbstractWebSocketConnection implements Connection.UpgradeTo
 {
-    private final AtomicBoolean opened = new AtomicBoolean(false);
-
     public WebSocketServerConnection(EndPoint endp, Executor executor, Scheduler scheduler, WebSocketPolicy policy, ByteBufferPool bufferPool)
     {
         super(endp,executor,scheduler,policy,bufferPool);
@@ -56,23 +51,6 @@
     {
         return getEndPoint().getRemoteAddress();
     }
-
-    @Override
-    public void onUpgradeTo(ByteBuffer prefilled)
-    {
-        prefill(prefilled);
-    }
-
-    @Override
-    public void onOpen()
-    {
-        boolean beenOpened = opened.getAndSet(true);
-        if (!beenOpened)
-        {
-            getSession().open();
-        }
-        super.onOpen();
-    }
     
     @Override
     public void setNextIncomingFrames(IncomingFrames incoming)
diff --git a/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketServerFactory.java b/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketServerFactory.java
index da3be60..73419f6 100644
--- a/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketServerFactory.java
+++ b/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketServerFactory.java
@@ -22,15 +22,16 @@
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.Executor;
 
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -38,15 +39,19 @@
 import org.eclipse.jetty.io.ByteBufferPool;
 import org.eclipse.jetty.io.EndPoint;
 import org.eclipse.jetty.io.MappedByteBufferPool;
+import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.HttpConnection;
+import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.util.DecoratedObjectFactory;
 import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.component.ContainerLifeCycle;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
 import org.eclipse.jetty.util.thread.ScheduledExecutorScheduler;
 import org.eclipse.jetty.util.thread.Scheduler;
 import org.eclipse.jetty.websocket.api.InvalidWebSocketException;
-import org.eclipse.jetty.websocket.api.StatusCode;
 import org.eclipse.jetty.websocket.api.WebSocketException;
 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
 import org.eclipse.jetty.websocket.api.extensions.ExtensionFactory;
@@ -60,6 +65,8 @@
 import org.eclipse.jetty.websocket.common.events.EventDriverFactory;
 import org.eclipse.jetty.websocket.common.extensions.ExtensionStack;
 import org.eclipse.jetty.websocket.common.extensions.WebSocketExtensionFactory;
+import org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection;
+import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
 import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest;
 import org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse;
 import org.eclipse.jetty.websocket.servlet.WebSocketCreator;
@@ -68,7 +75,7 @@
 /**
  * Factory to create WebSocket connections
  */
-public class WebSocketServerFactory extends ContainerLifeCycle implements WebSocketCreator, WebSocketServletFactory, SessionListener
+public class WebSocketServerFactory extends ContainerLifeCycle implements WebSocketCreator, WebSocketContainerScope, WebSocketServletFactory, SessionListener
 {
     private static final Logger LOG = Log.getLogger(WebSocketServerFactory.class);
 
@@ -83,10 +90,11 @@
     private final EventDriverFactory eventDriverFactory;
     private final ByteBufferPool bufferPool;
     private final WebSocketExtensionFactory extensionFactory;
+    private Executor executor;
     private List<SessionFactory> sessionFactories;
-    private Set<WebSocketSession> openSessions = new CopyOnWriteArraySet<>();
     private WebSocketCreator creator;
     private List<Class<?>> registeredSocketClasses;
+    private DecoratedObjectFactory objectFactory;
 
     public WebSocketServerFactory()
     {
@@ -117,12 +125,7 @@
         this.defaultPolicy = policy;
         this.eventDriverFactory = new EventDriverFactory(defaultPolicy);
         this.bufferPool = bufferPool;
-        this.extensionFactory = new WebSocketExtensionFactory(defaultPolicy, this.bufferPool);
-        
-        // Bug #431459 - unregistering compression extensions till they are more stable
-        this.extensionFactory.unregister("deflate-frame");
-        this.extensionFactory.unregister("permessage-deflate");
-        this.extensionFactory.unregister("x-webkit-deflate-frame");
+        this.extensionFactory = new WebSocketExtensionFactory(this);
         
         this.sessionFactories = new ArrayList<>();
         this.sessionFactories.add(new WebSocketSessionFactory(this));
@@ -160,6 +163,8 @@
         try
         {
             Thread.currentThread().setContextClassLoader(contextClassloader);
+            
+            // Create Servlet Specific Upgrade Request/Response objects
             ServletUpgradeRequest sockreq = new ServletUpgradeRequest(request);
             ServletUpgradeResponse sockresp = new ServletUpgradeResponse(response);
 
@@ -178,6 +183,9 @@
                 return false;
             }
 
+            // Allow Decorators to do their thing
+            websocketPojo = getObjectFactory().decorate(websocketPojo);
+            
             // Get the original HTTPConnection
             HttpConnection connection = (HttpConnection)request.getAttribute("org.eclipse.jetty.server.HttpConnection");
             
@@ -194,7 +202,7 @@
             Thread.currentThread().setContextClassLoader(old);
         }
     }
-
+    
     public void addSessionFactory(SessionFactory sessionFactory)
     {
         if (sessionFactories.contains(sessionFactory))
@@ -217,27 +225,6 @@
         }
     }
 
-    protected void shutdownAllConnections()
-    {
-        for (WebSocketSession session : openSessions)
-        {
-            if (session.getConnection() != null)
-            {
-                try
-                {
-                    session.getConnection().close(
-                            StatusCode.SHUTDOWN,
-                            "Shutdown");
-                }
-                catch (Throwable t)
-                {
-                    LOG.debug("During Shutdown All Connections",t);
-                }
-            }
-        }
-        openSessions.clear();
-    }
-
     @Override
     public WebSocketServletFactory createFactory(WebSocketPolicy policy)
     {
@@ -288,19 +275,29 @@
         Class<?> firstClass = registeredSocketClasses.get(0);
         try
         {
-            return firstClass.newInstance();
+            return objectFactory.createInstance(firstClass);
         }
         catch (InstantiationException | IllegalAccessException e)
         {
             throw new WebSocketException("Unable to create instance of " + firstClass, e);
         }
     }
+    
+    @Override
+    protected void doStart() throws Exception
+    {
+        if(this.objectFactory == null)
+        {
+            this.objectFactory = new DecoratedObjectFactory();
+        }
+        
+        super.doStart();
+    }
 
     @Override
-    protected void doStop() throws Exception
+    public ByteBufferPool getBufferPool()
     {
-        shutdownAllConnections();
-        super.doStop();
+        return this.bufferPool;
     }
 
     @Override
@@ -308,6 +305,17 @@
     {
         return this.creator;
     }
+    
+    @Override
+    public Executor getExecutor()
+    {
+        return this.executor;
+    }
+
+    public DecoratedObjectFactory getObjectFactory()
+    {
+        return objectFactory;
+    }
 
     public EventDriverFactory getEventDriverFactory()
     {
@@ -319,10 +327,10 @@
     {
         return extensionFactory;
     }
-
-    public Set<WebSocketSession> getOpenSessions()
+    
+    public Collection<WebSocketSession> getOpenSessions()
     {
-        return Collections.unmodifiableSet(this.openSessions);
+        return getBeans(WebSocketSession.class);
     }
 
     @Override
@@ -330,11 +338,60 @@
     {
         return defaultPolicy;
     }
-
+    
     @Override
-    public void init() throws Exception
+    public SslContextFactory getSslContextFactory()
     {
-        start(); // start lifecycle
+        /* Not relevant for a Server, as this is defined in the
+         * Connector configuration 
+         */
+        return null;
+    }
+
+    public void init(ServletContextHandler context) throws ServletException
+    {
+        this.objectFactory = (DecoratedObjectFactory)context.getServletContext().getAttribute(DecoratedObjectFactory.ATTR);
+        if (this.objectFactory == null)
+        {
+            this.objectFactory = new DecoratedObjectFactory();
+        }
+        
+        this.executor = context.getServer().getThreadPool();
+    }
+    
+    @Override
+    public void init(ServletContext context) throws ServletException
+    {
+        // Setup ObjectFactory
+        this.objectFactory = (DecoratedObjectFactory)context.getAttribute(DecoratedObjectFactory.ATTR);
+        if (this.objectFactory == null)
+        {
+            this.objectFactory = new DecoratedObjectFactory();
+        }
+        
+        // Validate Environment
+        ContextHandler handler = ContextHandler.getContextHandler(context);
+
+        if (handler == null)
+        {
+            throw new ServletException("Not running on Jetty, WebSocket support unavailable");
+        }
+
+        this.executor = handler.getServer().getThreadPool();
+        
+        try
+        {
+            // start lifecycle
+            start();
+        }
+        catch (ServletException e)
+        {
+            throw e;
+        }
+        catch (Exception e)
+        {
+            throw new ServletException(e);
+        }
     }
 
     @Override
@@ -396,13 +453,13 @@
     @Override
     public void onSessionClosed(WebSocketSession session)
     {
-        this.openSessions.remove(session);
+        removeBean(session);
     }
 
     @Override
     public void onSessionOpened(WebSocketSession session)
     {
-        this.openSessions.add(session);
+        addManaged(session);
     }
 
     protected String[] parseProtocols(String protocol)
@@ -513,11 +570,12 @@
 
         // Get original HTTP connection
         EndPoint endp = http.getEndPoint();
-        Executor executor = http.getConnector().getExecutor();
-        ByteBufferPool bufferPool = http.getConnector().getByteBufferPool();
-        
+        Connector connector = http.getConnector();
+        Executor executor = connector.getExecutor();
+        ByteBufferPool bufferPool = connector.getByteBufferPool();
+
         // Setup websocket connection
-        WebSocketServerConnection wsConnection = new WebSocketServerConnection(endp, executor, scheduler, driver.getPolicy(), bufferPool);
+        AbstractWebSocketConnection wsConnection = new WebSocketServerConnection(endp, executor, scheduler, driver.getPolicy(), bufferPool);
 
         extensionStack.setPolicy(driver.getPolicy());
         extensionStack.configure(wsConnection.getParser());
@@ -536,7 +594,7 @@
         // set true negotiated extension list back to response 
         response.setExtensions(extensionStack.getNegotiatedExtensions());
         session.setUpgradeResponse(response);
-        wsConnection.setSession(session);
+        wsConnection.addListener(session);
 
         // Setup Incoming Routing
         wsConnection.setNextIncomingFrames(extensionStack);
@@ -547,21 +605,12 @@
         extensionStack.setNextOutgoing(wsConnection);
 
         // Start Components
-        try
+        session.addManaged(extensionStack);
+        this.addManaged(session);
+        
+        if (session.isFailed())
         {
-            session.start();
-        }
-        catch (Exception e)
-        {
-            throw new IOException("Unable to start Session", e);
-        }
-        try
-        {
-            extensionStack.start();
-        }
-        catch (Exception e)
-        {
-            throw new IOException("Unable to start Extension Stack", e);
+            throw new IOException("Session failed to start");
         }
 
         // Tell jetty about the new upgraded connection
diff --git a/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketUpgradeFilter.java b/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketUpgradeFilter.java
index ff3a34e..9b9b113 100644
--- a/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketUpgradeFilter.java
+++ b/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketUpgradeFilter.java
@@ -20,6 +20,7 @@
 
 import java.io.IOException;
 import java.util.EnumSet;
+
 import javax.servlet.DispatcherType;
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
@@ -256,6 +257,8 @@
 
         try
         {
+            ServletContext ctx = config.getServletContext();
+            factory.init(ctx);
             WebSocketPolicy policy = factory.getPolicy();
 
             String max = config.getInitParameter("maxIdleTime");
@@ -289,8 +292,8 @@
                 key = WebSocketUpgradeFilter.class.getName();
             }
             
-            setToAttribute(config.getServletContext(), key);
-
+            setToAttribute(ctx, key);
+            
             factory.start();
         }
         catch (Exception x)
diff --git a/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/pathmap/PathMappings.java b/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/pathmap/PathMappings.java
index 53ccfae..c8c256d 100644
--- a/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/pathmap/PathMappings.java
+++ b/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/pathmap/PathMappings.java
@@ -37,7 +37,7 @@
  * <p>
  * Sorted into search order upon entry into the Set
  * 
- * @param <E>
+ * @param <E> the type of mapping endpoint
  */
 @ManagedObject("Path Mappings")
 public class PathMappings<E> implements Iterable<MappedResource<E>>, Dumpable
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/AnnotatedMaxMessageSizeTest.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/AnnotatedMaxMessageSizeTest.java
index 33fbfea..37b698e 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/AnnotatedMaxMessageSizeTest.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/AnnotatedMaxMessageSizeTest.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.websocket.server;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.is;
 
 import java.io.IOException;
 import java.net.URI;
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ChromeTest.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ChromeTest.java
index b90f44c..f81b2bc 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ChromeTest.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ChromeTest.java
@@ -18,7 +18,8 @@
 
 package org.eclipse.jetty.websocket.server;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
 
 import java.util.concurrent.TimeUnit;
 
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/DecoratorsLegacyTest.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/DecoratorsLegacyTest.java
new file mode 100644
index 0000000..e26ede2
--- /dev/null
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/DecoratorsLegacyTest.java
@@ -0,0 +1,179 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.server;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.Assert.assertThat;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.ServletContext;
+
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.toolchain.test.EventQueue;
+import org.eclipse.jetty.util.DecoratedObjectFactory;
+import org.eclipse.jetty.util.Decorator;
+import org.eclipse.jetty.websocket.api.WebSocketAdapter;
+import org.eclipse.jetty.websocket.common.WebSocketFrame;
+import org.eclipse.jetty.websocket.common.frames.TextFrame;
+import org.eclipse.jetty.websocket.common.test.BlockheadClient;
+import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest;
+import org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse;
+import org.eclipse.jetty.websocket.servlet.WebSocketCreator;
+import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
+import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class DecoratorsLegacyTest
+{
+    private static class DecoratorsSocket extends WebSocketAdapter
+    {
+        private final DecoratedObjectFactory objFactory;
+        
+        public DecoratorsSocket(DecoratedObjectFactory objFactory)
+        {
+            this.objFactory = objFactory;
+        }
+        
+        @Override
+        public void onWebSocketText(String message)
+        {
+            StringWriter str = new StringWriter();
+            PrintWriter out = new PrintWriter(str);
+            
+            if (objFactory != null)
+            {
+                out.printf("Object is a DecoratedObjectFactory%n");
+                List<Decorator> decorators = objFactory.getDecorators();
+                out.printf("Decorators.size = [%d]%n",decorators.size());
+                for (Decorator decorator : decorators)
+                {
+                    out.printf(" decorator[] = %s%n",decorator.getClass().getName());
+                }
+            }
+            else
+            {
+                out.printf("DecoratedObjectFactory is NULL%n");
+            }
+
+            getRemote().sendStringByFuture(str.toString());
+        }
+    }
+
+    private static class DecoratorsCreator implements WebSocketCreator
+    {
+        @Override
+        public Object createWebSocket(ServletUpgradeRequest req, ServletUpgradeResponse resp)
+        {
+            ServletContext servletContext = req.getHttpServletRequest().getServletContext();
+            DecoratedObjectFactory objFactory = (DecoratedObjectFactory)servletContext.getAttribute(DecoratedObjectFactory.ATTR);
+            return new DecoratorsSocket(objFactory);
+        }
+    }
+
+    public static class DecoratorsRequestServlet extends WebSocketServlet
+    {
+        private static final long serialVersionUID = 1L;
+        private final WebSocketCreator creator;
+
+        public DecoratorsRequestServlet(WebSocketCreator creator)
+        {
+            this.creator = creator;
+        }
+
+        @Override
+        public void configure(WebSocketServletFactory factory)
+        {
+            factory.setCreator(this.creator);
+        }
+    }
+    
+    private static class DummyLegacyDecorator implements org.eclipse.jetty.servlet.ServletContextHandler.Decorator
+    {
+        @Override
+        public <T> T decorate(T o)
+        {
+            return o;
+        }
+
+        @Override
+        public void destroy(Object o)
+        {
+        }
+    }
+
+    private static SimpleServletServer server;
+    private static DecoratorsCreator decoratorsCreator;
+
+    @BeforeClass
+    public static void startServer() throws Exception
+    {
+        decoratorsCreator = new DecoratorsCreator();
+        server = new SimpleServletServer(new DecoratorsRequestServlet(decoratorsCreator))
+        {
+            @SuppressWarnings("deprecation")
+            @Override
+            protected void configureServletContextHandler(ServletContextHandler context)
+            {
+                // Add decorator in the legacy way
+                context.addDecorator(new DummyLegacyDecorator());
+            }
+        };
+        server.start();
+    }
+
+    @AfterClass
+    public static void stopServer()
+    {
+        server.stop();
+    }
+
+    @Test
+    public void testAccessRequestCookies() throws Exception
+    {
+        BlockheadClient client = new BlockheadClient(server.getServerUri());
+        client.setTimeout(1,TimeUnit.SECONDS);
+
+        try
+        {
+            client.connect();
+            client.sendStandardRequest();
+            client.expectUpgradeResponse();
+            
+            client.write(new TextFrame().setPayload("info"));
+
+            EventQueue<WebSocketFrame> frames = client.readFrames(1,1,TimeUnit.SECONDS);
+            WebSocketFrame resp = frames.poll();
+            String textMsg = resp.getPayloadAsUTF8();
+            
+            assertThat("DecoratedObjectFactory", textMsg, containsString("Object is a DecoratedObjectFactory"));
+            assertThat("decorators.size", textMsg, containsString("Decorators.size = [1]"));
+            assertThat("decorator type", textMsg, containsString("decorator[] = " + DummyLegacyDecorator.class.getName()));
+        }
+        finally
+        {
+            client.close();
+        }
+    }
+}
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/DecoratorsTest.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/DecoratorsTest.java
new file mode 100644
index 0000000..baa5114
--- /dev/null
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/DecoratorsTest.java
@@ -0,0 +1,178 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.server;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.Assert.assertThat;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.ServletContext;
+
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.toolchain.test.EventQueue;
+import org.eclipse.jetty.util.DecoratedObjectFactory;
+import org.eclipse.jetty.util.Decorator;
+import org.eclipse.jetty.websocket.api.WebSocketAdapter;
+import org.eclipse.jetty.websocket.common.WebSocketFrame;
+import org.eclipse.jetty.websocket.common.frames.TextFrame;
+import org.eclipse.jetty.websocket.common.test.BlockheadClient;
+import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest;
+import org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse;
+import org.eclipse.jetty.websocket.servlet.WebSocketCreator;
+import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
+import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class DecoratorsTest
+{
+    private static class DecoratorsSocket extends WebSocketAdapter
+    {
+        private final DecoratedObjectFactory objFactory;
+        
+        public DecoratorsSocket(DecoratedObjectFactory objFactory)
+        {
+            this.objFactory = objFactory;
+        }
+        
+        @Override
+        public void onWebSocketText(String message)
+        {
+            StringWriter str = new StringWriter();
+            PrintWriter out = new PrintWriter(str);
+            
+            if (objFactory != null)
+            {
+                out.printf("Object is a DecoratedObjectFactory%n");
+                List<Decorator> decorators = objFactory.getDecorators();
+                out.printf("Decorators.size = [%d]%n",decorators.size());
+                for (Decorator decorator : decorators)
+                {
+                    out.printf(" decorator[] = %s%n",decorator.getClass().getName());
+                }
+            }
+            else
+            {
+                out.printf("DecoratedObjectFactory is NULL%n");
+            }
+
+            getRemote().sendStringByFuture(str.toString());
+        }
+    }
+
+    private static class DecoratorsCreator implements WebSocketCreator
+    {
+        @Override
+        public Object createWebSocket(ServletUpgradeRequest req, ServletUpgradeResponse resp)
+        {
+            ServletContext servletContext = req.getHttpServletRequest().getServletContext();
+            DecoratedObjectFactory objFactory = (DecoratedObjectFactory)servletContext.getAttribute(DecoratedObjectFactory.ATTR);
+            return new DecoratorsSocket(objFactory);
+        }
+    }
+
+    public static class DecoratorsRequestServlet extends WebSocketServlet
+    {
+        private static final long serialVersionUID = 1L;
+        private final WebSocketCreator creator;
+
+        public DecoratorsRequestServlet(WebSocketCreator creator)
+        {
+            this.creator = creator;
+        }
+
+        @Override
+        public void configure(WebSocketServletFactory factory)
+        {
+            factory.setCreator(this.creator);
+        }
+    }
+    
+    private static class DummyUtilDecorator implements org.eclipse.jetty.util.Decorator
+    {
+        @Override
+        public <T> T decorate(T o)
+        {
+            return o;
+        }
+
+        @Override
+        public void destroy(Object o)
+        {
+        }
+    }
+
+    private static SimpleServletServer server;
+    private static DecoratorsCreator decoratorsCreator;
+
+    @BeforeClass
+    public static void startServer() throws Exception
+    {
+        decoratorsCreator = new DecoratorsCreator();
+        server = new SimpleServletServer(new DecoratorsRequestServlet(decoratorsCreator))
+        {
+            @Override
+            protected void configureServletContextHandler(ServletContextHandler context)
+            {
+                // Add decorator in the new util way
+                context.getObjectFactory().addDecorator(new DummyUtilDecorator());
+            }
+        };
+        server.start();
+    }
+
+    @AfterClass
+    public static void stopServer()
+    {
+        server.stop();
+    }
+
+    @Test
+    public void testAccessRequestCookies() throws Exception
+    {
+        BlockheadClient client = new BlockheadClient(server.getServerUri());
+        client.setTimeout(1,TimeUnit.SECONDS);
+
+        try
+        {
+            client.connect();
+            client.sendStandardRequest();
+            client.expectUpgradeResponse();
+            
+            client.write(new TextFrame().setPayload("info"));
+
+            EventQueue<WebSocketFrame> frames = client.readFrames(1,1,TimeUnit.SECONDS);
+            WebSocketFrame resp = frames.poll();
+            String textMsg = resp.getPayloadAsUTF8();
+            
+            assertThat("DecoratedObjectFactory", textMsg, containsString("Object is a DecoratedObjectFactory"));
+            assertThat("decorators.size", textMsg, containsString("Decorators.size = [1]"));
+            assertThat("decorator type", textMsg, containsString("decorator[] = " + DummyUtilDecorator.class.getName()));
+        }
+        finally
+        {
+            client.close();
+        }
+    }
+}
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/FirefoxTest.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/FirefoxTest.java
index afaa245..26f882d 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/FirefoxTest.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/FirefoxTest.java
@@ -26,6 +26,7 @@
 import org.eclipse.jetty.websocket.common.WebSocketFrame;
 import org.eclipse.jetty.websocket.common.frames.TextFrame;
 import org.eclipse.jetty.websocket.common.test.BlockheadClient;
+import org.eclipse.jetty.websocket.common.test.IBlockheadClient;
 import org.eclipse.jetty.websocket.server.examples.MyEchoServlet;
 import org.junit.AfterClass;
 import org.junit.Assert;
@@ -52,7 +53,7 @@
     @Test
     public void testConnectionKeepAlive() throws Exception
     {
-        try (BlockheadClient client = new BlockheadClient(server.getServerUri()))
+        try (IBlockheadClient client = new BlockheadClient(server.getServerUri()))
         {
             // Odd Connection Header value seen in Firefox
             client.setConnectionValue("keep-alive, Upgrade");
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/FragmentExtensionTest.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/FragmentExtensionTest.java
index 11dd490..8fac752 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/FragmentExtensionTest.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/FragmentExtensionTest.java
@@ -18,7 +18,8 @@
 
 package org.eclipse.jetty.websocket.server;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
 
 import java.util.concurrent.TimeUnit;
 
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/IdentityExtensionTest.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/IdentityExtensionTest.java
index 187b5a6..faefbf2 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/IdentityExtensionTest.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/IdentityExtensionTest.java
@@ -18,7 +18,8 @@
 
 package org.eclipse.jetty.websocket.server;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
 
 import java.util.concurrent.TimeUnit;
 
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/IdleTimeoutTest.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/IdleTimeoutTest.java
index ad999d0..4049cf9 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/IdleTimeoutTest.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/IdleTimeoutTest.java
@@ -18,7 +18,8 @@
 
 package org.eclipse.jetty.websocket.server;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
 
 import java.util.concurrent.TimeUnit;
 
@@ -67,6 +68,7 @@
 
     /**
      * Test IdleTimeout on server.
+     * @throws Exception on test failure
      */
     @Test
     public void testIdleTimeout() throws Exception
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ManyConnectionsCleanupTest.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ManyConnectionsCleanupTest.java
new file mode 100644
index 0000000..2950c73
--- /dev/null
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ManyConnectionsCleanupTest.java
@@ -0,0 +1,369 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.websocket.server;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.eclipse.jetty.toolchain.test.EventQueue;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.log.StacklessLogging;
+import org.eclipse.jetty.util.log.StdErrLog;
+import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.api.StatusCode;
+import org.eclipse.jetty.websocket.api.WebSocketAdapter;
+import org.eclipse.jetty.websocket.common.CloseInfo;
+import org.eclipse.jetty.websocket.common.OpCode;
+import org.eclipse.jetty.websocket.common.WebSocketFrame;
+import org.eclipse.jetty.websocket.common.WebSocketSession;
+import org.eclipse.jetty.websocket.common.frames.TextFrame;
+import org.eclipse.jetty.websocket.common.test.BlockheadClient;
+import org.eclipse.jetty.websocket.common.test.IBlockheadClient;
+import org.eclipse.jetty.websocket.server.helper.RFCSocket;
+import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest;
+import org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse;
+import org.eclipse.jetty.websocket.servlet.WebSocketCreator;
+import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
+import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * Tests various close scenarios that should result in Open Session cleanup
+ */
+@Ignore
+public class ManyConnectionsCleanupTest
+{
+    static class AbstractCloseSocket extends WebSocketAdapter
+    {
+        public CountDownLatch closeLatch = new CountDownLatch(1);
+        public String closeReason = null;
+        public int closeStatusCode = -1;
+        public List<Throwable> errors = new ArrayList<>();
+
+        @Override
+        public void onWebSocketClose(int statusCode, String reason)
+        {
+            LOG.debug("onWebSocketClose({}, {})",statusCode,reason);
+            this.closeStatusCode = statusCode;
+            this.closeReason = reason;
+            closeLatch.countDown();
+        }
+
+        @Override
+        public void onWebSocketError(Throwable cause)
+        {
+            errors.add(cause);
+        }
+    }
+
+    @SuppressWarnings("serial")
+    public static class CloseServlet extends WebSocketServlet implements WebSocketCreator
+    {
+        private WebSocketServerFactory serverFactory;
+        private AtomicInteger calls = new AtomicInteger(0);
+
+        @Override
+        public void configure(WebSocketServletFactory factory)
+        {
+            factory.setCreator(this);
+            if (factory instanceof WebSocketServerFactory)
+            {
+                this.serverFactory = (WebSocketServerFactory)factory;
+            }
+        }
+
+        @Override
+        public Object createWebSocket(ServletUpgradeRequest req, ServletUpgradeResponse resp)
+        {
+            if (req.hasSubProtocol("fastclose"))
+            {
+                closeSocket = new FastCloseSocket(calls);
+                return closeSocket;
+            }
+
+            if (req.hasSubProtocol("fastfail"))
+            {
+                closeSocket = new FastFailSocket(calls);
+                return closeSocket;
+            }
+
+            if (req.hasSubProtocol("container"))
+            {
+                closeSocket = new ContainerSocket(serverFactory,calls);
+                return closeSocket;
+            }
+            return new RFCSocket();
+        }
+    }
+
+    /**
+     * On Message, return container information
+     */
+    public static class ContainerSocket extends AbstractCloseSocket
+    {
+        private static final Logger LOG = Log.getLogger(ManyConnectionsCleanupTest.ContainerSocket.class);
+        private final WebSocketServerFactory container;
+        private final AtomicInteger calls;
+        private Session session;
+
+        public ContainerSocket(WebSocketServerFactory container, AtomicInteger calls)
+        {
+            this.container = container;
+            this.calls = calls;
+        }
+
+        @Override
+        public void onWebSocketText(String message)
+        {
+            LOG.debug("onWebSocketText({})",message);
+            calls.incrementAndGet();
+            if (message.equalsIgnoreCase("openSessions"))
+            {
+                Collection<WebSocketSession> sessions = container.getOpenSessions();
+
+                StringBuilder ret = new StringBuilder();
+                ret.append("openSessions.size=").append(sessions.size()).append('\n');
+                int idx = 0;
+                for (WebSocketSession sess : sessions)
+                {
+                    ret.append('[').append(idx++).append("] ").append(sess.toString()).append('\n');
+                }
+                session.getRemote().sendStringByFuture(ret.toString());
+                session.close(StatusCode.NORMAL,"ContainerSocket");
+            } else if(message.equalsIgnoreCase("calls"))
+            {
+                session.getRemote().sendStringByFuture(String.format("calls=%,d",calls.get()));
+            }
+        }
+
+        @Override
+        public void onWebSocketConnect(Session sess)
+        {
+            LOG.debug("onWebSocketConnect({})",sess);
+            this.session = sess;
+        }
+    }
+
+    /**
+     * On Connect, close socket
+     */
+    public static class FastCloseSocket extends AbstractCloseSocket
+    {
+        private static final Logger LOG = Log.getLogger(ManyConnectionsCleanupTest.FastCloseSocket.class);
+        private final AtomicInteger calls;
+
+        public FastCloseSocket(AtomicInteger calls)
+        {
+            this.calls = calls;
+        }
+
+        @Override
+        public void onWebSocketConnect(Session sess)
+        {
+            LOG.debug("onWebSocketConnect({})",sess);
+            calls.incrementAndGet();
+            sess.close(StatusCode.NORMAL,"FastCloseServer");
+        }
+    }
+
+    /**
+     * On Connect, throw unhandled exception
+     */
+    public static class FastFailSocket extends AbstractCloseSocket
+    {
+        private static final Logger LOG = Log.getLogger(ManyConnectionsCleanupTest.FastFailSocket.class);
+        private final AtomicInteger calls;
+
+        public FastFailSocket(AtomicInteger calls)
+        {
+            this.calls = calls;
+        }
+
+        @Override
+        public void onWebSocketConnect(Session sess)
+        {
+            LOG.debug("onWebSocketConnect({})",sess);
+            calls.incrementAndGet();
+            // Test failure due to unhandled exception
+            // this should trigger a fast-fail closure during open/connect
+            throw new RuntimeException("Intentional FastFail");
+        }
+    }
+
+    private static final Logger LOG = Log.getLogger(ManyConnectionsCleanupTest.class);
+
+    private static SimpleServletServer server;
+    private static AbstractCloseSocket closeSocket;
+
+    @BeforeClass
+    public static void startServer() throws Exception
+    {
+        server = new SimpleServletServer(new CloseServlet());
+        server.start();
+    }
+
+    @AfterClass
+    public static void stopServer()
+    {
+        server.stop();
+    }
+
+    /**
+     * Test session open session cleanup (bug #474936)
+     * 
+     * @throws Exception
+     *             on test failure
+     */
+    @Test
+    public void testOpenSessionCleanup() throws Exception
+    {
+        int iterationCount = 100;
+        
+        StdErrLog.getLogger(FastFailSocket.class).setLevel(StdErrLog.LEVEL_OFF);
+        
+        StdErrLog sessLog = StdErrLog.getLogger(WebSocketSession.class);
+        int oldLevel = sessLog.getLevel();
+        sessLog.setLevel(StdErrLog.LEVEL_OFF);
+        
+        for (int requests = 0; requests < iterationCount; requests++)
+        {
+            fastFail();
+            fastClose();
+            dropConnection();
+        }
+        
+        sessLog.setLevel(oldLevel);
+
+        try (IBlockheadClient client = new BlockheadClient(server.getServerUri()))
+        {
+            client.setProtocols("container");
+            client.setTimeout(1,TimeUnit.SECONDS);
+            client.connect();
+            client.sendStandardRequest();
+            client.expectUpgradeResponse();
+            
+            client.write(new TextFrame().setPayload("calls"));
+            client.write(new TextFrame().setPayload("openSessions"));
+
+            EventQueue<WebSocketFrame> frames = client.readFrames(3,6,TimeUnit.SECONDS);
+            WebSocketFrame frame;
+            String resp;
+            
+            frame = frames.poll();
+            assertThat("frames[0].opcode",frame.getOpCode(),is(OpCode.TEXT));
+            resp = frame.getPayloadAsUTF8();
+            assertThat("Should only have 1 open session",resp,containsString("calls=" + ((iterationCount * 2) + 1)));
+
+            frame = frames.poll();
+            assertThat("frames[1].opcode",frame.getOpCode(),is(OpCode.TEXT));
+            resp = frame.getPayloadAsUTF8();
+            assertThat("Should only have 1 open session",resp,containsString("openSessions.size=1\n"));
+
+            frame = frames.poll();
+            assertThat("frames[2].opcode",frame.getOpCode(),is(OpCode.CLOSE));
+            CloseInfo close = new CloseInfo(frame);
+            assertThat("Close Status Code",close.getStatusCode(),is(StatusCode.NORMAL));
+            client.write(close.asFrame()); // respond with close
+
+            // ensure server socket got close event
+            assertThat("Open Sessions Latch",closeSocket.closeLatch.await(1,TimeUnit.SECONDS),is(true));
+            assertThat("Open Sessions.statusCode",closeSocket.closeStatusCode,is(StatusCode.NORMAL));
+            assertThat("Open Sessions.errors",closeSocket.errors.size(),is(0));
+        }
+    }
+
+    private void fastClose() throws Exception
+    {
+        try (IBlockheadClient client = new BlockheadClient(server.getServerUri()))
+        {
+            client.setProtocols("fastclose");
+            client.setTimeout(1,TimeUnit.SECONDS);
+            try (StacklessLogging scope = new StacklessLogging(WebSocketSession.class))
+            {
+                client.connect();
+                client.sendStandardRequest();
+                client.expectUpgradeResponse();
+                
+                client.readFrames(1,1,TimeUnit.SECONDS);
+
+                CloseInfo close = new CloseInfo(StatusCode.NORMAL,"Normal");
+                assertThat("Close Status Code",close.getStatusCode(),is(StatusCode.NORMAL));
+
+                // Notify server of close handshake
+                client.write(close.asFrame()); // respond with close
+
+                // ensure server socket got close event
+                assertThat("Fast Close Latch",closeSocket.closeLatch.await(1,TimeUnit.SECONDS),is(true));
+                assertThat("Fast Close.statusCode",closeSocket.closeStatusCode,is(StatusCode.NORMAL));
+            }
+        }
+    }
+
+    private void fastFail() throws Exception
+    {
+        try (IBlockheadClient client = new BlockheadClient(server.getServerUri()))
+        {
+            client.setProtocols("fastfail");
+            client.setTimeout(1,TimeUnit.SECONDS);
+            try (StacklessLogging scope = new StacklessLogging(WebSocketSession.class))
+            {
+                client.connect();
+                client.sendStandardRequest();
+                client.expectUpgradeResponse();
+                
+                // client.readFrames(1,2,TimeUnit.SECONDS);
+
+                CloseInfo close = new CloseInfo(StatusCode.NORMAL,"Normal");
+                client.write(close.asFrame()); // respond with close
+
+                // ensure server socket got close event
+                assertThat("Fast Fail Latch",closeSocket.closeLatch.await(1,TimeUnit.SECONDS),is(true));
+                assertThat("Fast Fail.statusCode",closeSocket.closeStatusCode,is(StatusCode.SERVER_ERROR));
+                assertThat("Fast Fail.errors",closeSocket.errors.size(),is(1));
+            }
+        }
+    }
+    
+    private void dropConnection() throws Exception
+    {
+        try (IBlockheadClient client = new BlockheadClient(server.getServerUri()))
+        {
+            client.setProtocols("container");
+            client.setTimeout(1,TimeUnit.SECONDS);
+            try (StacklessLogging scope = new StacklessLogging(WebSocketSession.class))
+            {
+                client.connect();
+                client.sendStandardRequest();
+                client.expectUpgradeResponse();
+                client.disconnect();
+            }
+        }
+    }
+}
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/PerMessageDeflateExtensionTest.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/PerMessageDeflateExtensionTest.java
index 492a5e1..5242339 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/PerMessageDeflateExtensionTest.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/PerMessageDeflateExtensionTest.java
@@ -18,7 +18,8 @@
 
 package org.eclipse.jetty.websocket.server;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
 
 import java.util.concurrent.TimeUnit;
 
@@ -53,6 +54,7 @@
 
     /**
      * Default configuration for permessage-deflate
+     * @throws Exception on test failure
      */
     @Test
     public void testPerMessageDeflateDefault() throws Exception
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/RequestHeadersTest.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/RequestHeadersTest.java
index cafaaac..760a5dc 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/RequestHeadersTest.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/RequestHeadersTest.java
@@ -18,7 +18,9 @@
 
 package org.eclipse.jetty.websocket.server;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.anyOf;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
 
 import java.net.HttpCookie;
 import java.util.List;
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/SimpleServletServer.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/SimpleServletServer.java
index cf921ce..c4dc38d 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/SimpleServletServer.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/SimpleServletServer.java
@@ -22,6 +22,7 @@
 
 import javax.servlet.http.HttpServlet;
 
+import org.eclipse.jetty.http.HttpVersion;
 import org.eclipse.jetty.server.HttpConfiguration;
 import org.eclipse.jetty.server.HttpConnectionFactory;
 import org.eclipse.jetty.server.SecureRequestCustomizer;
@@ -100,7 +101,7 @@
             https_config.addCustomizer(new SecureRequestCustomizer());
 
             // SSL Connector
-            connector = new ServerConnector(server,new SslConnectionFactory(sslContextFactory,"http/1.1"),new HttpConnectionFactory(https_config));
+            connector = new ServerConnector(server,new SslConnectionFactory(sslContextFactory,HttpVersion.HTTP_1_1.asString()),new HttpConnectionFactory(https_config));
             connector.setPort(0);
         }
         else
@@ -113,6 +114,7 @@
 
         ServletContextHandler context = new ServletContextHandler();
         context.setContextPath("/");
+        configureServletContextHandler(context);
         server.setHandler(context);
 
         // Serve capture servlet
@@ -137,6 +139,10 @@
         }
     }
 
+    protected void configureServletContextHandler(ServletContextHandler context)
+    {
+    }
+
     public void stop()
     {
         try
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/TooFastClientTest.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/TooFastClientTest.java
index 930f92c..5b22d9d 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/TooFastClientTest.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/TooFastClientTest.java
@@ -18,12 +18,15 @@
 
 package org.eclipse.jetty.websocket.server;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.is;
 
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
 import java.util.concurrent.TimeUnit;
 
+import org.eclipse.jetty.io.LeakTrackingByteBufferPool;
+import org.eclipse.jetty.io.MappedByteBufferPool;
 import org.eclipse.jetty.toolchain.test.EventQueue;
 import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
@@ -36,8 +39,8 @@
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
+import org.junit.Ignore;
 
 /**
  * Test simulating a client that talks too quickly.
@@ -45,7 +48,6 @@
  * There is a class of client that will send the GET+Upgrade Request along with a few websocket frames in a single
  * network packet. This test attempts to perform this behavior as close as possible.
  */
-@Ignore
 public class TooFastClientTest
 {
     private static SimpleServletServer server;
@@ -64,7 +66,8 @@
     }
 
     @Test
-    public void testUpgradeWithWebkitDeflateExtension() throws Exception
+    @Ignore("RELEASE")
+    public void testUpgradeWithSmallFrames() throws Exception
     {
         BlockheadClient client = new BlockheadClient(server.getServerUri());
         try
@@ -83,11 +86,20 @@
             // Add text frames
             Generator generator = new Generator(WebSocketPolicy.newClientPolicy(),
                     new LeakTrackingBufferPoolRule("Generator"));
+            
             String msg1 = "Echo 1";
             String msg2 = "This is also an echooooo!";
             
-            generator.generateWholeFrame(new TextFrame().setPayload(msg1),initialPacket);
-            generator.generateWholeFrame(new TextFrame().setPayload(msg2),initialPacket);
+            TextFrame frame1 = new TextFrame().setPayload(msg1);
+            TextFrame frame2 = new TextFrame().setPayload(msg2);
+            
+            // Need to set frame mask (as these are client frames)
+            byte mask[] = new byte[] { 0x11, 0x22, 0x33, 0x44 };
+            frame1.setMask(mask);
+            frame2.setMask(mask);
+
+            generator.generateWholeFrame(frame1,initialPacket);
+            generator.generateWholeFrame(frame2,initialPacket);
 
             // Write packet to network
             BufferUtil.flipToFlush(initialPacket,0);
@@ -108,4 +120,64 @@
             client.close();
         }
     }
+    
+    /**
+     * Test where were a client sends a HTTP Upgrade to websocket AND enough websocket frame(s)
+     * to completely overfill the {@link org.eclipse.jetty.io.AbstractConnection#getInputBufferSize()}
+     * to test a situation where the WebSocket connection opens with prefill that exceeds 
+     * the normal input buffer sizes.
+     * @throws Exception on test failure
+     */
+    @Test
+    @Ignore("RELEASE")
+    public void testUpgradeWithLargeFrame() throws Exception
+    {
+        BlockheadClient client = new BlockheadClient(server.getServerUri());
+        try
+        {
+            client.connect();
+
+            // Create ByteBuffer representing the initial opening network packet from the client
+            ByteBuffer initialPacket = ByteBuffer.allocate(100 * 1024);
+            BufferUtil.clearToFill(initialPacket);
+
+            // Add upgrade request to packet
+            StringBuilder upgradeRequest = client.generateUpgradeRequest();
+            ByteBuffer upgradeBuffer = BufferUtil.toBuffer(upgradeRequest.toString(),StandardCharsets.UTF_8);
+            initialPacket.put(upgradeBuffer);
+
+            // Add text frames
+            Generator generator = new Generator(WebSocketPolicy.newClientPolicy(),
+                    new LeakTrackingByteBufferPool(new MappedByteBufferPool.Tagged()));
+
+            byte bigMsgBytes[] = new byte[64*1024];
+            Arrays.fill(bigMsgBytes,(byte)'x');
+            String bigMsg = new String(bigMsgBytes, StandardCharsets.UTF_8);
+            
+            // Need to set frame mask (as these are client frames)
+            byte mask[] = new byte[] { 0x11, 0x22, 0x33, 0x44 };
+            TextFrame frame = new TextFrame().setPayload(bigMsg);
+            frame.setMask(mask);
+            generator.generateWholeFrame(frame,initialPacket);
+
+            // Write packet to network
+            BufferUtil.flipToFlush(initialPacket,0);
+            client.writeRaw(initialPacket);
+
+            // Expect upgrade
+            client.expectUpgradeResponse();
+
+            // Read frames (hopefully text frames)
+            EventQueue<WebSocketFrame> frames = client.readFrames(1,1,TimeUnit.SECONDS);
+
+            WebSocketFrame tf = frames.poll();
+            Assert.assertThat("Text Frame/msg1",tf.getPayloadAsUTF8(),is(bigMsg));
+        }
+        finally
+        {
+            client.close();
+        }
+    }
+    
+    
 }
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketCloseTest.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketCloseTest.java
index 940829d..c4507d4 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketCloseTest.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketCloseTest.java
@@ -22,8 +22,8 @@
 import static org.junit.Assert.*;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
-import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -41,6 +41,7 @@
 import org.eclipse.jetty.websocket.common.events.AbstractEventDriver;
 import org.eclipse.jetty.websocket.common.frames.TextFrame;
 import org.eclipse.jetty.websocket.common.test.BlockheadClient;
+import org.eclipse.jetty.websocket.common.test.IBlockheadClient;
 import org.eclipse.jetty.websocket.server.helper.RFCSocket;
 import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest;
 import org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse;
@@ -138,7 +139,7 @@
             LOG.debug("onWebSocketText({})",message);
             if (message.equalsIgnoreCase("openSessions"))
             {
-                Set<WebSocketSession> sessions = container.getOpenSessions();
+                Collection<WebSocketSession> sessions = container.getOpenSessions();
 
                 StringBuilder ret = new StringBuilder();
                 ret.append("openSessions.size=").append(sessions.size()).append('\n');
@@ -219,7 +220,7 @@
     @Test
     public void testFastClose() throws Exception
     {
-        try (BlockheadClient client = new BlockheadClient(server.getServerUri()))
+        try (IBlockheadClient client = new BlockheadClient(server.getServerUri()))
         {
             client.setProtocols("fastclose");
             client.setTimeout(1,TimeUnit.SECONDS);
@@ -252,7 +253,7 @@
     @Test
     public void testFastFail() throws Exception
     {
-        try (BlockheadClient client = new BlockheadClient(server.getServerUri()))
+        try (IBlockheadClient client = new BlockheadClient(server.getServerUri()))
         {
             client.setProtocols("fastfail");
             client.setTimeout(1,TimeUnit.SECONDS);
@@ -291,7 +292,7 @@
         fastClose();
         dropConnection();
 
-        try (BlockheadClient client = new BlockheadClient(server.getServerUri()))
+        try (IBlockheadClient client = new BlockheadClient(server.getServerUri()))
         {
             client.setProtocols("container");
             client.setTimeout(1,TimeUnit.SECONDS);
@@ -325,7 +326,7 @@
 
     private void fastClose() throws Exception
     {
-        try (BlockheadClient client = new BlockheadClient(server.getServerUri()))
+        try (IBlockheadClient client = new BlockheadClient(server.getServerUri()))
         {
             client.setProtocols("fastclose");
             client.setTimeout(1,TimeUnit.SECONDS);
@@ -352,7 +353,7 @@
 
     private void fastFail() throws Exception
     {
-        try (BlockheadClient client = new BlockheadClient(server.getServerUri()))
+        try (IBlockheadClient client = new BlockheadClient(server.getServerUri()))
         {
             client.setProtocols("fastfail");
             client.setTimeout(1,TimeUnit.SECONDS);
@@ -377,7 +378,7 @@
     
     private void dropConnection() throws Exception
     {
-        try (BlockheadClient client = new BlockheadClient(server.getServerUri()))
+        try (IBlockheadClient client = new BlockheadClient(server.getServerUri()))
         {
             client.setProtocols("container");
             client.setTimeout(1,TimeUnit.SECONDS);
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketInvalidVersionTest.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketInvalidVersionTest.java
index 6d924e5..4a1908f 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketInvalidVersionTest.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketInvalidVersionTest.java
@@ -18,7 +18,8 @@
 
 package org.eclipse.jetty.websocket.server;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
 
 import org.eclipse.jetty.websocket.common.test.BlockheadClient;
 import org.eclipse.jetty.websocket.common.test.HttpResponse;
@@ -47,6 +48,7 @@
 
     /**
      * Test the requirement of responding with an http 400 when using a Sec-WebSocket-Version that is unsupported.
+     * @throws Exception on test failure
      */
     @Test
     public void testRequestVersion29() throws Exception
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketOverSSLTest.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketOverSSLTest.java
index b762125..4dcd36f 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketOverSSLTest.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketOverSSLTest.java
@@ -18,6 +18,8 @@
 
 package org.eclipse.jetty.websocket.server;
 
+import static org.hamcrest.Matchers.is;
+
 import java.net.URI;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
@@ -37,8 +39,6 @@
 import org.junit.Rule;
 import org.junit.Test;
 
-import static org.hamcrest.Matchers.is;
-
 public class WebSocketOverSSLTest
 {
     @Rule
@@ -65,6 +65,7 @@
 
     /**
      * Test the requirement of issuing socket and receiving echo response
+     * @throws Exception on test failure
      */
     @Test
     public void testEcho() throws Exception
@@ -106,6 +107,7 @@
 
     /**
      * Test that server session reports as secure
+     * @throws Exception on test failure
      */
     @Test
     public void testServerSessionIsSecure() throws Exception
@@ -147,6 +149,7 @@
 
     /**
      * Test that server session.upgradeRequest.requestURI reports correctly
+     * @throws Exception on test failure
      */
     @Test
     public void testServerSessionRequestURI() throws Exception
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketServerSessionTest.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketServerSessionTest.java
index 8ee2505..2b98b54 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketServerSessionTest.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketServerSessionTest.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.websocket.server;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.is;
 
 import java.net.URI;
 import java.util.concurrent.TimeUnit;
@@ -28,6 +28,7 @@
 import org.eclipse.jetty.websocket.common.WebSocketFrame;
 import org.eclipse.jetty.websocket.common.frames.TextFrame;
 import org.eclipse.jetty.websocket.common.test.BlockheadClient;
+import org.eclipse.jetty.websocket.common.test.IBlockheadClient;
 import org.eclipse.jetty.websocket.server.helper.SessionServlet;
 import org.junit.AfterClass;
 import org.junit.Assert;
@@ -36,7 +37,7 @@
 import org.junit.runner.RunWith;
 
 /**
- * Testing various aspects of the server side support for WebSocket {@link Session}
+ * Testing various aspects of the server side support for WebSocket {@link org.eclipse.jetty.websocket.api.Session}
  */
 @RunWith(AdvancedRunner.class)
 public class WebSocketServerSessionTest
@@ -60,7 +61,7 @@
     public void testDisconnect() throws Exception
     {
         URI uri = server.getServerUri().resolve("/test/disconnect");
-        try (BlockheadClient client = new BlockheadClient(uri))
+        try (IBlockheadClient client = new BlockheadClient(uri))
         {
             client.connect();
             client.sendStandardRequest();
@@ -76,7 +77,7 @@
     public void testUpgradeRequestResponse() throws Exception
     {
         URI uri = server.getServerUri().resolve("/test?snack=cashews&amount=handful&brand=off");
-        try (BlockheadClient client = new BlockheadClient(uri))
+        try (IBlockheadClient client = new BlockheadClient(uri))
         {
             client.connect();
             client.sendStandardRequest();
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketServletRFCTest.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketServletRFCTest.java
index 75c2b31..845c03e 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketServletRFCTest.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/WebSocketServletRFCTest.java
@@ -18,7 +18,7 @@
 
 package org.eclipse.jetty.websocket.server;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.is;
 
 import java.nio.ByteBuffer;
 import java.util.Arrays;
@@ -45,6 +45,7 @@
 import org.eclipse.jetty.websocket.common.test.UnitGenerator;
 import org.eclipse.jetty.websocket.common.util.Hex;
 import org.eclipse.jetty.websocket.server.helper.RFCServlet;
+import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.BeforeClass;
@@ -81,6 +82,7 @@
 
     /**
      * Test that aggregation of binary frames into a single message occurs
+     * @throws Exception on test failure
      */
     @Test
     public void testBinaryAggregate() throws Exception
@@ -166,6 +168,7 @@
 
     /**
      * Test the requirement of issuing socket and receiving echo response
+     * @throws Exception on test failure
      */
     @Test
     public void testEcho() throws Exception
@@ -195,6 +198,7 @@
     /**
      * Test the requirement of responding with server terminated close code 1011 when there is an unhandled (internal server error) being produced by the
      * WebSocket POJO.
+     * @throws Exception on test failure
      */
     @Test
     public void testInternalError() throws Exception
@@ -233,6 +237,7 @@
      * Test http://tools.ietf.org/html/rfc6455#section-4.1 where server side upgrade handling is supposed to be case insensitive.
      * <p>
      * This test will simulate a client requesting upgrade with all lowercase headers.
+     * @throws Exception on test failure
      */
     @Test
     public void testLowercaseUpgrade() throws Exception
@@ -312,6 +317,7 @@
      * Test http://tools.ietf.org/html/rfc6455#section-4.1 where server side upgrade handling is supposed to be case insensitive.
      * <p>
      * This test will simulate a client requesting upgrade with all uppercase headers.
+     * @throws Exception on test failure
      */
     @Test
     public void testUppercaseUpgrade() throws Exception
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/AbstractABCase.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/AbstractABCase.java
index 7d3f5b4..a7655ce 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/AbstractABCase.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/AbstractABCase.java
@@ -24,6 +24,7 @@
 
 import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.util.StringUtil;
+import org.eclipse.jetty.util.log.StacklessLogging;
 import org.eclipse.jetty.util.log.StdErrLog;
 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
 import org.eclipse.jetty.websocket.common.Generator;
@@ -175,6 +176,8 @@
     public TestName testname = new TestName();
 
     /**
+     * @param clazz the class to enable
+     * @param enabled true to enable the stack traces (or not)
      * @deprecated use {@link StacklessLogging} in a try-with-resources block instead
      */
     @Deprecated
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase1.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase1.java
index 659b3fb..afeb214 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase1.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase1.java
@@ -36,6 +36,7 @@
 {
     /**
      * Echo 0 byte TEXT message
+     * @throws Exception on test failure
      */
     @Test
     public void testCase1_1_1() throws Exception
@@ -59,6 +60,7 @@
 
     /**
      * Echo 125 byte TEXT message (uses small 7-bit payload length)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase1_1_2() throws Exception
@@ -86,6 +88,7 @@
 
     /**
      * Echo 126 byte TEXT message (uses medium 2 byte payload length)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase1_1_3() throws Exception
@@ -113,6 +116,7 @@
 
     /**
      * Echo 127 byte TEXT message (uses medium 2 byte payload length)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase1_1_4() throws Exception
@@ -140,6 +144,7 @@
 
     /**
      * Echo 128 byte TEXT message (uses medium 2 byte payload length)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase1_1_5() throws Exception
@@ -167,6 +172,7 @@
 
     /**
      * Echo 65535 byte TEXT message (uses medium 2 byte payload length)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase1_1_6() throws Exception
@@ -194,6 +200,7 @@
 
     /**
      * Echo 65536 byte TEXT message (uses large 8 byte payload length)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase1_1_7() throws Exception
@@ -225,6 +232,7 @@
      * Only send 1 TEXT frame from client, but in small segments (flushed after each).
      * <p>
      * This is done to test the parsing together of the frame on the server side.
+     * @throws Exception on test failure
      */
     @Test
     public void testCase1_1_8() throws Exception
@@ -254,6 +262,7 @@
 
     /**
      * Echo 0 byte BINARY message
+     * @throws Exception on test failure
      */
     @Test
     public void testCase1_2_1() throws Exception
@@ -277,6 +286,7 @@
 
     /**
      * Echo 125 byte BINARY message (uses small 7-bit payload length)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase1_2_2() throws Exception
@@ -304,6 +314,7 @@
 
     /**
      * Echo 126 byte BINARY message (uses medium 2 byte payload length)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase1_2_3() throws Exception
@@ -331,6 +342,7 @@
 
     /**
      * Echo 127 byte BINARY message (uses medium 2 byte payload length)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase1_2_4() throws Exception
@@ -358,6 +370,7 @@
 
     /**
      * Echo 128 byte BINARY message (uses medium 2 byte payload length)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase1_2_5() throws Exception
@@ -385,6 +398,7 @@
 
     /**
      * Echo 65535 byte BINARY message (uses medium 2 byte payload length)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase1_2_6() throws Exception
@@ -412,6 +426,7 @@
 
     /**
      * Echo 65536 byte BINARY message (uses large 8 byte payload length)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase1_2_7() throws Exception
@@ -443,6 +458,7 @@
      * Only send 1 BINARY frame from client, but in small segments (flushed after each).
      * <p>
      * This is done to test the parsing together of the frame on the server side.
+     * @throws Exception on test failure
      */
     @Test
     public void testCase1_2_8() throws Exception
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase2.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase2.java
index 65ba463..06efd05 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase2.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase2.java
@@ -42,6 +42,7 @@
 {
     /**
      * Ping without payload
+     * @throws Exception on test failure
      */
     @Test
     public void testCase2_1() throws Exception
@@ -61,6 +62,7 @@
 
     /**
      * 10 pings
+     * @throws Exception on test failure
      */
     @Test
     public void testCase2_10() throws Exception
@@ -95,6 +97,7 @@
 
     /**
      * 10 pings, sent slowly
+     * @throws Exception on test failure
      */
     @Test
     public void testCase2_11() throws Exception
@@ -130,6 +133,7 @@
 
     /**
      * Ping with small text payload
+     * @throws Exception on test failure
      */
     @Test
     public void testCase2_2() throws Exception
@@ -155,6 +159,7 @@
 
     /**
      * Ping with small binary (non-utf8) payload
+     * @throws Exception on test failure
      */
     @Test
     public void testCase2_3() throws Exception
@@ -180,6 +185,7 @@
 
     /**
      * Ping with 125 byte binary payload
+     * @throws Exception on test failure
      */
     @Test
     public void testCase2_4() throws Exception
@@ -206,6 +212,7 @@
 
     /**
      * Ping with 126 byte binary payload
+     * @throws Exception on test failure
      */
     @Test
     public void testCase2_5() throws Exception
@@ -236,6 +243,7 @@
 
     /**
      * Ping with 125 byte binary payload (slow send)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase2_6() throws Exception
@@ -263,6 +271,7 @@
 
     /**
      * Unsolicited pong frame without payload
+     * @throws Exception on test failure
      */
     @Test
     public void testCase2_7() throws Exception
@@ -285,6 +294,7 @@
 
     /**
      * Unsolicited pong frame with basic payload
+     * @throws Exception on test failure
      */
     @Test
     public void testCase2_8() throws Exception
@@ -307,6 +317,7 @@
 
     /**
      * Unsolicited pong frame, then ping with basic payload
+     * @throws Exception on test failure
      */
     @Test
     public void testCase2_9() throws Exception
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase3.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase3.java
index 2eaae4f..daaf3a0 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase3.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase3.java
@@ -43,6 +43,7 @@
 {
     /**
      * Send small text frame, with RSV1 == true, with no extensions defined.
+     * @throws Exception on test failure
      */
     @Test
     public void testCase3_1() throws Exception
@@ -62,6 +63,7 @@
 
     /**
      * Send small text frame, send again with RSV2 == true, then ping, with no extensions defined.
+     * @throws Exception on test failure
      */
     @Test
     public void testCase3_2() throws Exception
@@ -86,6 +88,7 @@
 
     /**
      * Send small text frame, send again with (RSV1 & RSV2), then ping, with no extensions defined.
+     * @throws Exception on test failure
      */
     @Test
     public void testCase3_3() throws Exception
@@ -110,6 +113,7 @@
 
     /**
      * Send small text frame, send again with (RSV3), then ping, with no extensions defined.
+     * @throws Exception on test failure
      */
     @Test
     public void testCase3_4() throws Exception
@@ -135,6 +139,7 @@
 
     /**
      * Send binary frame with (RSV3 & RSV1), with no extensions defined.
+     * @throws Exception on test failure
      */
     @Test
     public void testCase3_5() throws Exception
@@ -159,6 +164,7 @@
 
     /**
      * Send ping frame with (RSV3 & RSV2), with no extensions defined.
+     * @throws Exception on test failure
      */
     @Test
     public void testCase3_6() throws Exception
@@ -183,6 +189,7 @@
 
     /**
      * Send close frame with (RSV3 & RSV2 & RSV1), with no extensions defined.
+     * @throws Exception on test failure
      */
     @Test
     public void testCase3_7() throws Exception
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase4.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase4.java
index 46e244f..9eeb347 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase4.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase4.java
@@ -43,6 +43,7 @@
 {
     /**
      * Send opcode 3 (reserved)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase4_1_1() throws Exception
@@ -64,6 +65,7 @@
 
     /**
      * Send opcode 4 (reserved), with payload
+     * @throws Exception on test failure
      */
     @Test
     public void testCase4_1_2() throws Exception
@@ -88,6 +90,7 @@
 
     /**
      * Send small text, then frame with opcode 5 (reserved), then ping
+     * @throws Exception on test failure
      */
     @Test
     public void testCase4_1_3() throws Exception
@@ -112,6 +115,7 @@
 
     /**
      * Send small text, then frame with opcode 6 (reserved) w/payload, then ping
+     * @throws Exception on test failure
      */
     @Test
     public void testCase4_1_4() throws Exception
@@ -138,6 +142,7 @@
 
     /**
      * Send small text, then frame with opcode 7 (reserved) w/payload, then ping
+     * @throws Exception on test failure
      */
     @Test
     public void testCase4_1_5() throws Exception
@@ -164,6 +169,7 @@
 
     /**
      * Send opcode 11 (reserved)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase4_2_1() throws Exception
@@ -185,6 +191,7 @@
 
     /**
      * Send opcode 12 (reserved)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase4_2_2() throws Exception
@@ -208,6 +215,7 @@
 
     /**
      * Send small text, then frame with opcode 13 (reserved), then ping
+     * @throws Exception on test failure
      */
     @Test
     public void testCase4_2_3() throws Exception
@@ -232,6 +240,7 @@
 
     /**
      * Send small text, then frame with opcode 14 (reserved), then ping
+     * @throws Exception on test failure
      */
     @Test
     public void testCase4_2_4() throws Exception
@@ -258,6 +267,7 @@
 
     /**
      * Send small text, then frame with opcode 15 (reserved), then ping
+     * @throws Exception on test failure
      */
     @Test
     public void testCase4_2_5() throws Exception
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase5.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase5.java
index b4c058f..73f1c68 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase5.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase5.java
@@ -45,6 +45,7 @@
 {
     /**
      * Send ping fragmented in 2 packets
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_1() throws Exception
@@ -68,6 +69,7 @@
 
     /**
      * Send continuation+fin, then text+fin (framewise)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_10() throws Exception
@@ -91,6 +93,7 @@
 
     /**
      * Send continuation+fin, then text+fin (slowly)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_11() throws Exception
@@ -115,6 +118,7 @@
 
     /**
      * Send continuation+!fin, then text+fin
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_12() throws Exception
@@ -138,6 +142,7 @@
 
     /**
      * Send continuation+!fin, then text+fin (framewise)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_13() throws Exception
@@ -161,6 +166,7 @@
 
     /**
      * Send continuation+!fin, then text+fin (slowly)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_14() throws Exception
@@ -185,6 +191,7 @@
 
     /**
      * Send text fragmented properly in 2 frames, then continuation!fin, then text unfragmented.
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_15() throws Exception
@@ -211,6 +218,7 @@
 
     /**
      * (continuation!fin, text!fin, continuation+fin) * 2
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_16() throws Exception
@@ -238,6 +246,7 @@
 
     /**
      * (continuation+fin, text!fin, continuation+fin) * 2
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_17() throws Exception
@@ -265,6 +274,7 @@
 
     /**
      * text message fragmented in 2 frames, both frames as opcode=TEXT
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_18() throws Exception
@@ -288,6 +298,7 @@
 
     /**
      * send text message fragmented in 5 frames, with 2 pings and wait between.
+     * @throws Exception on test failure
      */
     @Test
     @Slow
@@ -335,6 +346,7 @@
 
     /**
      * Send pong fragmented in 2 packets
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_2() throws Exception
@@ -358,6 +370,7 @@
 
     /**
      * send text message fragmented in 5 frames, with 2 pings and wait between. (framewise)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_20() throws Exception
@@ -399,6 +412,7 @@
 
     /**
      * send text message fragmented in 5 frames, with 2 pings and wait between. (framewise)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_20_slow() throws Exception
@@ -441,6 +455,7 @@
 
     /**
      * Send text fragmented in 2 packets
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_3() throws Exception
@@ -465,6 +480,7 @@
 
     /**
      * Send text fragmented in 2 packets (framewise)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_4() throws Exception
@@ -489,6 +505,7 @@
 
     /**
      * Send text fragmented in 2 packets (slowly)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_5() throws Exception
@@ -514,6 +531,7 @@
 
     /**
      * Send text fragmented in 2 packets, with ping between them
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_6() throws Exception
@@ -540,6 +558,7 @@
 
     /**
      * Send text fragmented in 2 packets, with ping between them (framewise)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_7() throws Exception
@@ -566,6 +585,7 @@
 
     /**
      * Send text fragmented in 2 packets, with ping between them (slowly)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_8() throws Exception
@@ -593,6 +613,7 @@
 
     /**
      * Send continuation+fin, then text+fin
+     * @throws Exception on test failure
      */
     @Test
     public void testCase5_9() throws Exception
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase6.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase6.java
index 5fb6aa0..d39bfa7 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase6.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase6.java
@@ -49,6 +49,8 @@
 {
     /**
      * Split a message byte array into a series of fragments (frames + continuations) of 1 byte message contents each.
+     * @param frames the frames
+     * @param msg the message
      */
     protected void fragmentText(List<WebSocketFrame> frames, byte msg[])
     {
@@ -78,6 +80,7 @@
 
     /**
      * text message, 1 frame, 0 length
+     * @throws Exception on test failure
      */
     @Test
     public void testCase6_1_1() throws Exception
@@ -101,6 +104,7 @@
 
     /**
      * text message, 0 length, 3 fragments
+     * @throws Exception on test failure
      */
     @Test
     public void testCase6_1_2() throws Exception
@@ -126,6 +130,7 @@
 
     /**
      * text message, small length, 3 fragments (only middle frame has payload)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase6_1_3() throws Exception
@@ -151,6 +156,7 @@
 
     /**
      * valid utf8 text message, 2 fragments (on UTF8 code point boundary)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase6_2_2() throws Exception
@@ -185,6 +191,7 @@
 
     /**
      * valid utf8 text message, many fragments (1 byte each)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase6_2_3() throws Exception
@@ -211,6 +218,7 @@
 
     /**
      * valid utf8 text message, many fragments (1 byte each)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase6_2_4() throws Exception
@@ -236,6 +244,7 @@
 
     /**
      * invalid utf8 text message, many fragments (1 byte each)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase6_3_2() throws Exception
@@ -264,6 +273,7 @@
      * fragment #1 and fragment #3 are both valid in themselves.
      * <p>
      * fragment #2 contains the invalid utf8 code point.
+     * @throws Exception on test failure
      */
     @Test
     @Slow
@@ -299,6 +309,7 @@
      * fragment #2 finishes the UTF8 code point but it is invalid
      * <p>
      * fragment #3 contains the remainder of the message.
+     * @throws Exception on test failure
      */
     @Test
     @Slow
@@ -326,6 +337,7 @@
 
     /**
      * invalid text message, 1 frame/fragment (slowly, and split within code points)
+     * @throws Exception on test failure
      */
     @Test
     @Slow
@@ -378,6 +390,7 @@
 
     /**
      * invalid text message, 1 frame/fragment (slowly, and split within code points)
+     * @throws Exception on test failure
      */
     @Test
     @Slow
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase7.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase7.java
index b485e02..7ba020e 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase7.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase7.java
@@ -52,6 +52,7 @@
 
     /**
      * Basic message then close frame, normal behavior
+     * @throws Exception on test failure
      */
     @Test
     public void testCase7_1_1() throws Exception
@@ -75,6 +76,7 @@
 
     /**
      * Close frame, then another close frame (send frame ignored)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase7_1_2() throws Exception
@@ -98,6 +100,7 @@
 
     /**
      * Close frame, then ping frame (no pong received)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase7_1_3() throws Exception
@@ -121,6 +124,7 @@
 
     /**
      * Close frame, then ping frame (no pong received)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase7_1_4() throws Exception
@@ -144,6 +148,7 @@
 
     /**
      * Text fin=false, close, then continuation fin=true
+     * @throws Exception on test failure
      */
     @Test
     public void testCase7_1_5() throws Exception
@@ -168,6 +173,7 @@
 
     /**
      * 256k msg, then close, then ping
+     * @throws Exception on test failure
      */
     @Test
     public void testCase7_1_6() throws Exception
@@ -197,6 +203,7 @@
 
     /**
      * close with no payload (payload length 0)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase7_3_1() throws Exception
@@ -219,6 +226,7 @@
 
     /**
      * close with invalid payload (payload length 1)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase7_3_2() throws Exception
@@ -244,6 +252,7 @@
 
     /**
      * close with valid payload (payload length 2)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase7_3_3() throws Exception
@@ -266,6 +275,7 @@
 
     /**
      * close with valid payload (with reason)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase7_3_4() throws Exception
@@ -288,6 +298,7 @@
 
     /**
      * close with valid payload (with 123 byte reason)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase7_3_5() throws Exception
@@ -314,6 +325,7 @@
 
     /**
      * close with invalid UTF8 in payload
+     * @throws Exception on test failure
      */
     @Test
     public void testCase7_5_1() throws Exception
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase7_BadStatusCodes.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase7_BadStatusCodes.java
index b3b6b20..2a9a84c 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase7_BadStatusCodes.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase7_BadStatusCodes.java
@@ -83,6 +83,7 @@
 
     /**
      * just the close code, no reason
+     * @throws Exception on test failure
      */
     @Test
     public void testBadStatusCode() throws Exception
@@ -110,6 +111,7 @@
 
     /**
      * the bad close code, with reason
+     * @throws Exception on test failure
      */
     @Test
     public void testBadStatusCodeWithReason() throws Exception
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase7_GoodStatusCodes.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase7_GoodStatusCodes.java
index d8939c0..e535483 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase7_GoodStatusCodes.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase7_GoodStatusCodes.java
@@ -78,6 +78,7 @@
 
     /**
      * just the close code, no reason
+     * @throws Exception on test failure
      */
     @Test
     public void testStatusCode() throws Exception
@@ -105,6 +106,7 @@
 
     /**
      * the good close code, with reason
+     * @throws Exception on test failure
      */
     @Test
     public void testStatusCodeWithReason() throws Exception
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase9.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase9.java
index ebe6a8c..ee83897 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase9.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/TestABCase9.java
@@ -131,6 +131,7 @@
 
     /**
      * Echo 64KB text message (1 frame)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase9_1_1() throws Exception
@@ -158,6 +159,7 @@
 
     /**
      * Echo 256KB text message (1 frame)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase9_1_2() throws Exception
@@ -185,6 +187,7 @@
 
     /**
      * Echo 1MB text message (1 frame)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase9_1_3() throws Exception
@@ -212,6 +215,7 @@
 
     /**
      * Echo 4MB text message (1 frame)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase9_1_4() throws Exception
@@ -239,6 +243,7 @@
 
     /**
      * Echo 8MB text message (1 frame)
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -267,6 +272,7 @@
 
     /**
      * Echo 16MB text message (1 frame)
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -295,6 +301,7 @@
 
     /**
      * Echo 64KB binary message (1 frame)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase9_2_1() throws Exception
@@ -321,6 +328,7 @@
 
     /**
      * Echo 256KB binary message (1 frame)
+     * @throws Exception on test failure
      */
     @Test
     public void testCase9_2_2() throws Exception
@@ -348,6 +356,7 @@
 
     /**
      * Echo 1MB binary message (1 frame)
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -376,6 +385,7 @@
 
     /**
      * Echo 4MB binary message (1 frame)
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -404,6 +414,7 @@
 
     /**
      * Echo 8MB binary message (1 frame)
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -432,6 +443,7 @@
 
     /**
      * Echo 16MB binary message (1 frame)
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -460,6 +472,7 @@
 
     /**
      * Send 4MB text message in multiple frames.
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -470,6 +483,7 @@
 
     /**
      * Send 4MB text message in multiple frames.
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -480,6 +494,7 @@
 
     /**
      * Send 4MB text message in multiple frames.
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -490,6 +505,7 @@
 
     /**
      * Send 4MB text message in multiple frames.
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -500,6 +516,7 @@
 
     /**
      * Send 4MB text message in multiple frames.
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -510,6 +527,7 @@
 
     /**
      * Send 4MB text message in multiple frames.
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -520,6 +538,7 @@
 
     /**
      * Send 4MB text message in multiple frames.
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -530,6 +549,7 @@
 
     /**
      * Send 4MB text message in multiple frames.
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -540,6 +560,7 @@
 
     /**
      * Send 4MB text message in multiple frames.
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -550,6 +571,7 @@
 
     /**
      * Send 4MB binary message in multiple frames.
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -560,6 +582,7 @@
 
     /**
      * Send 4MB binary message in multiple frames.
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -570,6 +593,7 @@
 
     /**
      * Send 4MB binary message in multiple frames.
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -580,6 +604,7 @@
 
     /**
      * Send 4MB binary message in multiple frames.
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -590,6 +615,7 @@
 
     /**
      * Send 4MB binary message in multiple frames.
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -600,6 +626,7 @@
 
     /**
      * Send 4MB binary message in multiple frames.
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -610,6 +637,7 @@
 
     /**
      * Send 4MB binary message in multiple frames.
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -620,6 +648,7 @@
 
     /**
      * Send 4MB binary message in multiple frames.
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -630,6 +659,7 @@
 
     /**
      * Send 4MB binary message in multiple frames.
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -640,6 +670,7 @@
 
     /**
      * Send 1MB text message in 1 frame, but slowly
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -650,6 +681,7 @@
 
     /**
      * Send 1MB text message in 1 frame, but slowly
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -660,6 +692,7 @@
 
     /**
      * Send 1MB text message in 1 frame, but slowly
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -670,6 +703,7 @@
 
     /**
      * Send 1MB text message in 1 frame, but slowly
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -680,6 +714,7 @@
 
     /**
      * Send 1MB text message in 1 frame, but slowly
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -690,6 +725,7 @@
 
     /**
      * Send 1MB text message in 1 frame, but slowly
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -700,6 +736,7 @@
 
     /**
      * Send 1MB binary message in 1 frame, but slowly
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -710,6 +747,7 @@
 
     /**
      * Send 1MB binary message in 1 frame, but slowly
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -720,6 +758,7 @@
 
     /**
      * Send 1MB binary message in 1 frame, but slowly
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -730,6 +769,7 @@
 
     /**
      * Send 1MB binary message in 1 frame, but slowly
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -740,6 +780,7 @@
 
     /**
      * Send 1MB binary message in 1 frame, but slowly
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
@@ -750,6 +791,7 @@
 
     /**
      * Send 1MB binary message in 1 frame, but slowly
+     * @throws Exception on test failure
      */
     @Test
     @Stress("High I/O use")
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/browser/BrowserDebugTool.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/browser/BrowserDebugTool.java
index 178e565..8fc13ae 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/browser/BrowserDebugTool.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/browser/BrowserDebugTool.java
@@ -27,8 +27,7 @@
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
-import org.eclipse.jetty.websocket.common.extensions.FrameDebugExtension;
-import org.eclipse.jetty.websocket.common.extensions.compress.PerMessageDeflateExtension;
+import org.eclipse.jetty.websocket.common.extensions.FrameCaptureExtension;
 import org.eclipse.jetty.websocket.server.WebSocketHandler;
 import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest;
 import org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse;
@@ -93,7 +92,7 @@
         // manually negotiate extensions
         List<ExtensionConfig> negotiated = new ArrayList<>();
         // adding frame debug
-        negotiated.add(new ExtensionConfig("@frame-debug; output-dir=target"));
+        negotiated.add(new ExtensionConfig("@frame-capture; output-dir=target"));
         for (ExtensionConfig config : req.getExtensions())
         {
             if (config.getName().equals("permessage-deflate"))
@@ -134,7 +133,7 @@
                 LOG.debug("Configuring WebSocketServerFactory ...");
 
                 // Registering Frame Debug
-                factory.getExtensionFactory().register("@frame-debug",FrameDebugExtension.class);
+                factory.getExtensionFactory().register("@frame-capture",FrameCaptureExtension.class);
 
                 // Setup the desired Socket to use for all incoming upgrade requests
                 factory.setCreator(BrowserDebugTool.this);
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/helper/SafariD00.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/helper/SafariD00.java
index a097ead..8000849 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/helper/SafariD00.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/helper/SafariD00.java
@@ -18,13 +18,15 @@
 
 package org.eclipse.jetty.websocket.server.helper;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
 
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
 import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.net.SocketAddress;
@@ -54,7 +56,7 @@
      * Open the Socket to the destination endpoint and
      *
      * @return the open java Socket.
-     * @throws IOException
+     * @throws IOException on test failure
      */
     public Socket connect() throws IOException
     {
@@ -75,7 +77,7 @@
     /**
      * Issue an Http websocket (Draft-0) upgrade request using the Safari particulars.
      *
-     * @throws UnsupportedEncodingException
+     * @throws IOException on test failure
      */
     public void issueHandshake() throws IOException
     {
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/misbehaving/MisbehavingClassTest.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/misbehaving/MisbehavingClassTest.java
index ddeeda9..3654ec2 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/misbehaving/MisbehavingClassTest.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/misbehaving/MisbehavingClassTest.java
@@ -31,6 +31,7 @@
 import org.eclipse.jetty.websocket.common.WebSocketFrame;
 import org.eclipse.jetty.websocket.common.events.AbstractEventDriver;
 import org.eclipse.jetty.websocket.common.test.BlockheadClient;
+import org.eclipse.jetty.websocket.common.test.IBlockheadClient;
 import org.eclipse.jetty.websocket.server.SimpleServletServer;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -62,7 +63,7 @@
     @Test
     public void testListenerRuntimeOnConnect() throws Exception
     {
-        try (BlockheadClient client = new BlockheadClient(server.getServerUri()))
+        try (IBlockheadClient client = new BlockheadClient(server.getServerUri()))
         {
             client.setProtocols("listener-runtime-connect");
             client.setTimeout(1,TimeUnit.SECONDS);
@@ -98,7 +99,7 @@
     @Test
     public void testAnnotatedRuntimeOnConnect() throws Exception
     {
-        try (BlockheadClient client = new BlockheadClient(server.getServerUri()))
+        try (IBlockheadClient client = new BlockheadClient(server.getServerUri()))
         {
             client.setProtocols("annotated-runtime-connect");
             client.setTimeout(1,TimeUnit.SECONDS);
diff --git a/jetty-websocket/websocket-server/src/test/resources/jetty-logging.properties b/jetty-websocket/websocket-server/src/test/resources/jetty-logging.properties
index 9165916..924d000 100644
--- a/jetty-websocket/websocket-server/src/test/resources/jetty-logging.properties
+++ b/jetty-websocket/websocket-server/src/test/resources/jetty-logging.properties
@@ -12,6 +12,11 @@
 # org.eclipse.jetty.websocket.server.blockhead.LEVEL=DEBUG
 # org.eclipse.jetty.websocket.server.helper.LEVEL=DEBUG
 
+# org.eclipse.jetty.websocket.client.io.ConnectPromise.LEVEL=DEBUG
+# org.eclipse.jetty.websocket.common.WebSocketSession_OPEN.LEVEL=DEBUG
+# org.eclipse.jetty.websocket.common.io.IOState.LEVEL=DEBUG
+# org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection_OPEN.LEVEL=DEBUG
+
 ### Show state changes on BrowserDebugTool
 # -- LEAVE THIS AT DEBUG LEVEL --
 org.eclipse.jetty.websocket.server.browser.LEVEL=DEBUG
diff --git a/jetty-websocket/websocket-servlet/pom.xml b/jetty-websocket/websocket-servlet/pom.xml
index ef2a8b2..81aa650 100644
--- a/jetty-websocket/websocket-servlet/pom.xml
+++ b/jetty-websocket/websocket-servlet/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <groupId>org.eclipse.jetty.websocket</groupId>
         <artifactId>websocket-parent</artifactId>
-        <version>9.2.14-SNAPSHOT</version>
+        <version>9.3.6-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
@@ -15,23 +15,6 @@
     </properties>
     <build>
       <plugins>
-           <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>artifact-jar</id>
-                        <goals>
-                            <goal>jar</goal>
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration>
-                    <archive>
-                        <manifestFile>target/classes/META-INF/MANIFEST.MF</manifestFile>
-                    </archive>
-                </configuration>
-            </plugin>
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
@@ -40,7 +23,6 @@
                     <instructions>
                         <Bundle-Description>Websocket Servlet Interface</Bundle-Description>
                         <Bundle-Classpath />
-                        <_nouses>true</_nouses>
                         <DynamicImport-Package>org.eclipse.jetty.websocket.server.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}",org.eclipse.jetty.websocket.server.pathmap.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}"</DynamicImport-Package>
                         <Require-Capability>osgi.serviceloader; filter:="(osgi.serviceloader=org.eclipse.jetty.websocket.servlet.WebSocketServletFactory)";cardinality:=multiple, osgi.extender; filter:="(osgi.extender=osgi.serviceloader.processor)"</Require-Capability>
                     </instructions>
diff --git a/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/ServletUpgradeRequest.java b/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/ServletUpgradeRequest.java
index 2f38e67..01c82c2 100644
--- a/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/ServletUpgradeRequest.java
+++ b/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/ServletUpgradeRequest.java
@@ -31,6 +31,7 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
@@ -107,7 +108,7 @@
 
     /**
      * Return the underlying HttpServletRequest that existed at Upgrade time.
-     * <p/>
+     * <p>
      * Note: many features of the HttpServletRequest are invalid when upgraded,
      * especially ones that deal with body content, streams, readers, and responses.
      *
@@ -150,7 +151,7 @@
 
     /**
      * Return a {@link InetSocketAddress} for the local socket.
-     * <p/>
+     * <p>
      * Warning: this can cause a DNS lookup
      *
      * @return the local socket address
@@ -181,6 +182,7 @@
     }
 
     /**
+     * @return the principal
      * @deprecated use {@link #getUserPrincipal()} instead
      */
     @Deprecated
@@ -229,7 +231,7 @@
 
     /**
      * Return a {@link InetSocketAddress} for the remote socket.
-     * <p/>
+     * <p>
      * Warning: this can cause a DNS lookup
      *
      * @return the remote socket address
@@ -251,7 +253,7 @@
 
     /**
      * Return the HttpSession if it exists.
-     * <p/>
+     * <p>
      * Note: this is equivalent to {@link HttpServletRequest#getSession(boolean)}
      * and will not create a new HttpSession.
      */
diff --git a/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/ServletUpgradeResponse.java b/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/ServletUpgradeResponse.java
index 6b027d5..a028284 100644
--- a/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/ServletUpgradeResponse.java
+++ b/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/ServletUpgradeResponse.java
@@ -21,6 +21,7 @@
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
+
 import javax.servlet.http.HttpServletResponse;
 
 import org.eclipse.jetty.websocket.api.UpgradeResponse;
diff --git a/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketCreator.java b/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketCreator.java
index 3a94c98..73e5d4d 100644
--- a/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketCreator.java
+++ b/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketCreator.java
@@ -24,7 +24,7 @@
  * Should you desire filtering of the WebSocket object creation due to criteria such as origin or sub-protocol, then you will be required to implement a custom
  * WebSocketCreator implementation.
  * <p>
- * This has been moved from the WebSocketServlet to a standalone class managed by the WebSocketServerFactory due to need of WebSocket {@link Extension}s that
+ * This has been moved from the WebSocketServlet to a standalone class managed by the WebSocketServerFactory due to need of WebSocket {@link org.eclipse.jetty.websocket.api.extensions.Extension}s that
  * require the ability to create new websockets (such as the mux extension)
  */
 public interface WebSocketCreator
diff --git a/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketServlet.java b/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketServlet.java
index 2e6fe28..bbd86d6 100644
--- a/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketServlet.java
+++ b/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketServlet.java
@@ -20,6 +20,7 @@
 
 import java.io.IOException;
 
+import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
@@ -27,6 +28,7 @@
 
 import org.eclipse.jetty.websocket.api.WebSocketBehavior;
 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
+import org.eclipse.jetty.websocket.api.annotations.WebSocket;
 
 /**
  * Abstract Servlet used to bridge the Servlet API to the WebSocket API.
@@ -128,10 +130,12 @@
             factory = WebSocketServletFactory.Loader.create(policy);
 
             configure(factory);
-
-            factory.init();
             
-            getServletContext().setAttribute(WebSocketServletFactory.class.getName(),factory);
+            ServletContext ctx = getServletContext();
+
+            factory.init(ctx);
+            
+            ctx.setAttribute(WebSocketServletFactory.class.getName(),factory);
         }
         catch (Exception x)
         {
diff --git a/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketServletFactory.java b/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketServletFactory.java
index a898a21..16ed3e7 100644
--- a/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketServletFactory.java
+++ b/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketServletFactory.java
@@ -22,10 +22,12 @@
 import java.util.Iterator;
 import java.util.ServiceLoader;
 
+import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.eclipse.jetty.websocket.api.WebSocketPolicy;
+import org.eclipse.jetty.websocket.api.annotations.WebSocket;
 import org.eclipse.jetty.websocket.api.extensions.ExtensionFactory;
 
 /**
@@ -39,10 +41,10 @@
 
         public static WebSocketServletFactory create(WebSocketPolicy policy) throws ClassNotFoundException, InstantiationException, IllegalAccessException
         {
-            return load(policy).createFactory(policy);
+            return load().createFactory(policy);
         }
 
-        public static WebSocketServletFactory load(WebSocketPolicy policy) throws ClassNotFoundException, InstantiationException, IllegalAccessException
+        public static WebSocketServletFactory load() throws ClassNotFoundException, InstantiationException, IllegalAccessException
         {
             if (INSTANCE != null)
             {
@@ -64,7 +66,7 @@
                         .loadClass("org.eclipse.jetty.websocket.server.WebSocketServerFactory");
                 baseFactory = wssf.newInstance();
             }
-
+            
             INSTANCE = baseFactory;
             return INSTANCE;
         }
@@ -91,7 +93,7 @@
      */
     public WebSocketPolicy getPolicy();
 
-    public void init() throws Exception;
+    public void init(ServletContext servletContext) throws Exception;
 
     public boolean isUpgradeRequest(HttpServletRequest request, HttpServletResponse response);
 
diff --git a/jetty-xml/pom.xml b/jetty-xml/pom.xml
index e52033c..062a8e0 100644
--- a/jetty-xml/pom.xml
+++ b/jetty-xml/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-xml</artifactId>
@@ -15,30 +15,6 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <!--
-        Required for OSGI
-        -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
         <configuration>
diff --git a/jetty-xml/src/main/java/org/eclipse/jetty/xml/XmlAppendable.java b/jetty-xml/src/main/java/org/eclipse/jetty/xml/XmlAppendable.java
index e6fc84c..ee41340 100644
--- a/jetty-xml/src/main/java/org/eclipse/jetty/xml/XmlAppendable.java
+++ b/jetty-xml/src/main/java/org/eclipse/jetty/xml/XmlAppendable.java
@@ -52,7 +52,7 @@
     
     public XmlAppendable(Appendable out, int indent) throws IOException
     {
-        this(out,indent,"UTF-8");
+        this(out,indent,"utf-8");
     }
     
     public XmlAppendable(Appendable out, int indent, String encoding) throws IOException
diff --git a/jetty-xml/src/main/java/org/eclipse/jetty/xml/XmlConfiguration.java b/jetty-xml/src/main/java/org/eclipse/jetty/xml/XmlConfiguration.java
index 0accc69..fb396ac 100644
--- a/jetty-xml/src/main/java/org/eclipse/jetty/xml/XmlConfiguration.java
+++ b/jetty-xml/src/main/java/org/eclipse/jetty/xml/XmlConfiguration.java
@@ -35,7 +35,6 @@
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
@@ -51,12 +50,12 @@
 import org.eclipse.jetty.util.ArrayQueue;
 import org.eclipse.jetty.util.LazyList;
 import org.eclipse.jetty.util.Loader;
+import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.TypeUtil;
 import org.eclipse.jetty.util.component.LifeCycle;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.eclipse.jetty.util.resource.Resource;
-import org.eclipse.jetty.xml.XmlParser.Node;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
@@ -80,16 +79,12 @@
 public class XmlConfiguration
 {
     private static final Logger LOG = Log.getLogger(XmlConfiguration.class);
-
     private static final Class<?>[] __primitives =
             {Boolean.TYPE, Character.TYPE, Byte.TYPE, Short.TYPE, Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE, Void.TYPE};
-
     private static final Class<?>[] __boxedPrimitives =
             {Boolean.class, Character.class, Byte.class, Short.class, Integer.class, Long.class, Float.class, Double.class, Void.class};
-
     private static final Class<?>[] __supportedCollections =
-            {ArrayList.class, ArrayQueue.class, HashSet.class, Queue.class, List.class, Set.class, Collection.class,};
-
+            {ArrayList.class, ArrayQueue.class, HashSet.class, Queue.class, List.class, Set.class, Collection.class};
     private static final Iterable<ConfigurationProcessorFactory> __factoryLoader = ServiceLoader.load(ConfigurationProcessorFactory.class);
     private static final XmlParser __parser = initParser();
     private static XmlParser initParser()
@@ -98,6 +93,7 @@
         URL config60 = Loader.getResource(XmlConfiguration.class, "org/eclipse/jetty/xml/configure_6_0.dtd");
         URL config76 = Loader.getResource(XmlConfiguration.class,"org/eclipse/jetty/xml/configure_7_6.dtd");
         URL config90 = Loader.getResource(XmlConfiguration.class,"org/eclipse/jetty/xml/configure_9_0.dtd");
+        URL config93 = Loader.getResource(XmlConfiguration.class,"org/eclipse/jetty/xml/configure_9_3.dtd");
         parser.redirectEntity("configure.dtd",config90);
         parser.redirectEntity("configure_1_0.dtd",config60);
         parser.redirectEntity("configure_1_1.dtd",config60);
@@ -106,13 +102,14 @@
         parser.redirectEntity("configure_6_0.dtd",config60);
         parser.redirectEntity("configure_7_6.dtd",config76);
         parser.redirectEntity("configure_9_0.dtd",config90);
+        parser.redirectEntity("configure_9_3.dtd",config93);
 
-        parser.redirectEntity("http://jetty.mortbay.org/configure.dtd",config90);
-        parser.redirectEntity("http://jetty.eclipse.org/configure.dtd",config90);
-        parser.redirectEntity("http://www.eclipse.org/jetty/configure.dtd",config90);
+        parser.redirectEntity("http://jetty.mortbay.org/configure.dtd",config93);
+        parser.redirectEntity("http://jetty.eclipse.org/configure.dtd",config93);
+        parser.redirectEntity("http://www.eclipse.org/jetty/configure.dtd",config93);
 
-        parser.redirectEntity("-//Mort Bay Consulting//DTD Configure//EN",config90);
-        parser.redirectEntity("-//Jetty//Configure//EN",config90);
+        parser.redirectEntity("-//Mort Bay Consulting//DTD Configure//EN",config93);
+        parser.redirectEntity("-//Jetty//Configure//EN",config93);
 
         return parser;
     }
@@ -150,7 +147,7 @@
      */
     public XmlConfiguration(String configuration) throws SAXException, IOException
     {
-        configuration = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE Configure PUBLIC \"-//Jetty//Configure//EN\" \"http://eclipse.org/jetty/configure.dtd\">"
+        configuration = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE Configure PUBLIC \"-//Jetty//Configure//EN\" \"http://eclipse.org/jetty/configure.dtd\">"
                 + configuration;
         InputSource source = new InputSource(new StringReader(configuration));
         synchronized (__parser)
@@ -272,9 +269,11 @@
     public void initializeDefaults(Object object)
     {
     }
+    
 
     private static class JettyXmlConfiguration implements ConfigurationProcessor
     {
+        
         private String _url;
         XmlParser.Node _root;
         XmlConfiguration _configuration;
@@ -295,6 +294,9 @@
                 String loaders = (oClass.getClassLoader()==obj.getClass().getClassLoader())?"":"Object Class and type Class are from different loaders.";
                 throw new IllegalArgumentException("Object of class '"+obj.getClass().getCanonicalName()+"' is not of type '" + oClass.getCanonicalName()+"'. "+loaders+" in "+_url);
             }
+            String id=_root.getAttribute("id");
+            if (id!=null)
+                _configuration.getIdMap().put(id,obj);
             configure(obj,_root,0);
             return obj;
         }
@@ -346,11 +348,13 @@
                 }
                 catch (NoSuchMethodException x)
                 {
-                    throw new IllegalStateException("No suitable constructor on " + oClass, x);
+                    throw new IllegalStateException(String.format("No constructor %s(%s,%s) in %s",oClass,arguments,namedArgMap,_url));
                 }
             }
+            if (id!=null)
+                _configuration.getIdMap().put(id,obj);
+                
             _configuration.initializeDefaults(obj);
-
             configure(obj, _root, index);
             return obj;
         }
@@ -375,10 +379,6 @@
          */
         public void configure(Object obj, XmlParser.Node cfg, int i) throws Exception
         {
-            String id = cfg.getAttribute("id");
-            if (id != null)
-                _configuration.getIdMap().put(id,obj);
-
             // Object already constructed so skip any arguments
             for (; i < cfg.size(); i++)
             {
@@ -425,12 +425,21 @@
                         case "Array":
                             newArray(obj, node);
                             break;
+                        case "Map":
+                            newMap(obj,node);
+                            break;
                         case "Ref":
                             refObj(obj, node);
                             break;
                         case "Property":
                             propertyObj(node);
                             break;
+                        case "SystemProperty":
+                            systemPropertyObj(node);
+                            break;
+                        case "Env":
+                            envObj(node);
+                            break;
                         default:
                             throw new IllegalStateException("Unknown tag: " + tag + " in " + _url);
                     }
@@ -630,7 +639,7 @@
             Map<Object, Object> map = (Map<Object, Object>)obj;
 
             String name = node.getAttribute("name");
-            Object value = value(obj,node);
+            Object value = value(obj, node);
             map.put(name,value);
             if (LOG.isDebugEnabled())
                 LOG.debug("XML " + obj + ".put(" + name + "," + value + ")");
@@ -659,6 +668,8 @@
                 // try calling a getXxx method.
                 Method method = oClass.getMethod("get" + name.substring(0,1).toUpperCase(Locale.ENGLISH) + name.substring(1),(java.lang.Class[])null);
                 obj = method.invoke(obj,(java.lang.Object[])null);
+                if (id!=null)
+                    _configuration.getIdMap().put(id,obj);
                 configure(obj,node,0);
             }
             catch (NoSuchMethodException nsme)
@@ -674,8 +685,6 @@
                     throw nsme;
                 }
             }
-            if (id != null)
-                _configuration.getIdMap().put(id,obj);
             return obj;
         }
 
@@ -688,50 +697,37 @@
          */
         private Object call(Object obj, XmlParser.Node node) throws Exception
         {
-            String id = node.getAttribute("id");
-            Class<?> oClass = nodeClass(node);
-            if (oClass != null)
-                obj = null;
-            else if (obj != null)
-                oClass = obj.getClass();
-            if (oClass == null)
-                throw new IllegalArgumentException(node.toString());
+            AttrOrElementNode aoeNode=new AttrOrElementNode(obj,node,"Id","Name","Class","Arg");
+            String id = aoeNode.getString("Id");
+            String name = aoeNode.getString("Name");
+            String clazz = aoeNode.getString("Class");
+            List<Object> args = aoeNode.getList("Arg");
             
-            int size = 0;
-            int argIndex = node.size();
-            for (int i = 0; i < node.size(); i++)
+            
+            Class<?> oClass;
+            if (clazz!=null)
             {
-                Object o = node.get(i);
-                if (o instanceof String)
-                    continue;
-                if (!((XmlParser.Node)o).getTag().equals("Arg"))
-                {
-                    argIndex = i;
-                    break;
-                }
-                size++;
+                // static call
+                oClass=Loader.loadClass(XmlConfiguration.class,clazz);
+                obj=null;
             }
-
-            Object[] arg = new Object[size];
-            for (int i = 0, j = 0; j < size; i++)
+            else if (obj!=null)
             {
-                Object o = node.get(i);
-                if (o instanceof String)
-                    continue;
-                arg[j++] = value(obj,(XmlParser.Node)o);
+                oClass = obj.getClass();
             }
-
-            String method = node.getAttribute("name");
+            else
+                throw new IllegalArgumentException(node.toString());
+           
             if (LOG.isDebugEnabled())
-                LOG.debug("XML call " + method);
+                LOG.debug("XML call " + name);
 
             try
             {
-                Object n= TypeUtil.call(oClass,method,obj,arg);
+                Object nobj= TypeUtil.call(oClass,name,obj,args.toArray(new Object[args.size()]));
                 if (id != null)
-                    _configuration.getIdMap().put(id,n);
-                configure(n,node,argIndex);
-                return n;
+                    _configuration.getIdMap().put(id,nobj);
+                configure(nobj,node,aoeNode.getNext());
+                return nobj;
             }
             catch (NoSuchMethodException e)
             {
@@ -751,59 +747,44 @@
          */
         private Object newObj(Object obj, XmlParser.Node node) throws Exception
         {
-            Class<?> oClass = nodeClass(node);
-            int argIndex = node.size();
-            
-            Map<String, Object> namedArgMap = new HashMap<>();
-            List<Object> arguments = new LinkedList<>();
-            XmlParser.Node child;
-
-            // Find the <Arg> elements
-            for (int i = 0; i < node.size(); i++)
-            {
-                Object o = node.get(i);
-                if (o instanceof String)
-                {
-                    // Skip raw String nodes
-                    continue;
-                }
-                
-                child = (XmlParser.Node)o;
-                if(child.getTag().equals("Arg"))
-                {
-                    String namedAttribute = child.getAttribute("name");
-                    Object value=value(obj,child);
-                    if (namedAttribute != null)
-                    {
-                        // named arguments
-                        namedArgMap.put(namedAttribute,value);
-                    }
-                    // raw arguments
-                    arguments.add(value);
-                } else {
-                    // The first non <Arg> child is the start of 
-                    // elements that configure the class, such as
-                    // <Set> and <Call> nodes
-                    argIndex = i;
-                    break;
-                }
-            }
+            AttrOrElementNode aoeNode=new AttrOrElementNode(obj,node,"Id","Class","Arg");
+            String id = aoeNode.getString("Id");
+            String clazz = aoeNode.getString("Class");
+            List<XmlParser.Node> argNodes = aoeNode.getNodes("Arg");
 
             if (LOG.isDebugEnabled())
-                LOG.debug("XML new " + oClass);
+                LOG.debug("XML new " + clazz);
+            
+            Class<?> oClass = Loader.loadClass(XmlConfiguration.class,clazz);
+            
+            // Find the <Arg> elements
+            Map<String, Object> namedArgMap = new HashMap<>();
+            List<Object> arguments = new LinkedList<>();
+            for (XmlParser.Node child : argNodes)
+            {
+                String namedAttribute = child.getAttribute("name");
+                Object value=value(obj,child);
+                if (namedAttribute != null)
+                {
+                    // named arguments
+                    namedArgMap.put(namedAttribute,value);
+                }
+                // raw arguments
+                arguments.add(value);
+            }
 
-            Object n;
+            Object nobj;
             try
             {
                 if (namedArgMap.size() > 0)
                 {
                    LOG.debug("using named mapping");
-                   n = TypeUtil.construct(oClass, arguments.toArray(), namedArgMap);
+                   nobj = TypeUtil.construct(oClass, arguments.toArray(), namedArgMap);
                 }
                 else
                 {
                     LOG.debug("using normal mapping");
-                    n = TypeUtil.construct(oClass, arguments.toArray());
+                    nobj = TypeUtil.construct(oClass, arguments.toArray());
                 }
             }
             catch (NoSuchMethodException e)
@@ -811,9 +792,12 @@
                 throw new IllegalStateException("No suitable constructor: " + node + " on " + obj);
             }
 
-            _configuration.initializeDefaults(n);
-            configure(n,node,argIndex);
-            return n;
+            if (id != null)
+                _configuration.getIdMap().put(id, nobj);
+            
+            _configuration.initializeDefaults(nobj);
+            configure(nobj,node,aoeNode.getNext());
+            return nobj;
         }
 
         /*
@@ -838,10 +822,13 @@
          */
         private Object newArray(Object obj, XmlParser.Node node) throws Exception
         {
+            AttrOrElementNode aoeNode=new AttrOrElementNode(obj,node,"Id","Type","Item");
+            String id = aoeNode.getString("Id");
+            String type = aoeNode.getString("Type");
+            List<XmlParser.Node> items = aoeNode.getNodes("Item");
+            
             // Get the type
             Class<?> aClass = java.lang.Object.class;
-            String type = node.getAttribute("type");
-            final String id = node.getAttribute("id");
             if (type != null)
             {
                 aClass = TypeUtil.fromName(type);
@@ -864,12 +851,11 @@
                     }
                 }
             }
-
+            
             Object al = null;
 
-            for (Object nodeObject : node)
+            for (XmlParser.Node item : items)
             {
-                XmlParser.Node item = (Node)nodeObject;
                 String nid = item.getAttribute("id");
                 Object v = value(obj,item);
                 al = LazyList.add(al,(v == null && aClass.isPrimitive())?0:v);
@@ -888,17 +874,16 @@
          */
         private Object newMap(Object obj, XmlParser.Node node) throws Exception
         {
-            String id = node.getAttribute("id");
+            AttrOrElementNode aoeNode=new AttrOrElementNode(node,"Id","Entry");
+            String id = aoeNode.getString("Id");
+            List<XmlParser.Node> entries = aoeNode.getNodes("Entry");
 
             Map<Object, Object> map = new HashMap<>();
             if (id != null)
-                _configuration.getIdMap().put(id,map);
+                _configuration.getIdMap().put(id, map);
 
-            for (Object o : node)
+            for (XmlParser.Node entry : entries)
             {
-                if (o instanceof String)
-                    continue;
-                XmlParser.Node entry = (XmlParser.Node)o;
                 if (!entry.getTag().equals("Entry"))
                     throw new IllegalStateException("Not an Entry");
 
@@ -945,20 +930,143 @@
          */
         private Object propertyObj(XmlParser.Node node) throws Exception
         {
-            String id = node.getAttribute("id");
-            String name = node.getAttribute("name");
-            String defaultValue = node.getAttribute("default");
-            Object prop;
-            Map<String,String> property_map=_configuration.getProperties();
-            if (property_map != null && property_map.containsKey(name))
-                prop = property_map.get(name);
-            else
-                prop = defaultValue;
+            AttrOrElementNode aoeNode=new AttrOrElementNode(node,"Id","Name","Deprecated","Default");
+            String id = aoeNode.getString("Id");
+            String name = aoeNode.getString("Name",true);
+            List<Object> deprecated = aoeNode.getList("Deprecated");
+            String dftValue = aoeNode.getString("Default");
+
+            // Look for a value
+            Map<String,String> properties = _configuration.getProperties();
+            String value = properties.get(name);
+            
+            // Look for a deprecated name value
+
+            String alternate=null;
+            if (!deprecated.isEmpty())
+            {
+                for (Object d : deprecated)
+                { 
+                    String v = properties.get(StringUtil.valueOf(d));
+                    if (v!=null)
+                    {
+                        if (value==null)
+                            LOG.warn("Property '{}' is deprecated, use '{}' instead", d, name);
+                        else
+                            LOG.warn("Property '{}' is deprecated, value from '{}' used", d, name);
+                    }
+                    if (alternate==null)
+                        alternate=v;;
+                }
+            }
+
+            // use alternate from deprecated
+            if (value==null)
+                value=alternate;
+            
+            // use default value
+            if (value==null)
+                value=dftValue;
+
+            // Set value if ID set
             if (id != null)
-                _configuration.getIdMap().put(id,prop);
-            if (prop != null)
-                configure(prop,node,0);
-            return prop;
+                _configuration.getIdMap().put(id, value);
+            return value;
+        }
+
+        /*
+         * Get a SystemProperty.
+         *
+         * @param node
+         * @return
+         * @exception Exception
+         */
+        private Object systemPropertyObj(XmlParser.Node node) throws Exception
+        {
+            AttrOrElementNode aoeNode=new AttrOrElementNode(node,"Id","Name","Deprecated","Default");
+            String id = aoeNode.getString("Id");
+            String name = aoeNode.getString("Name",true);
+            List<Object> deprecated = aoeNode.getList("Deprecated");
+            String dftValue = aoeNode.getString("Default");
+
+            // Look for a value
+            String value = System.getProperty(name);
+            
+            // Look for a deprecated name value
+            String alternate=null;
+            if (!deprecated.isEmpty())
+            {
+                for (Object d : deprecated)
+                { 
+                    String v = System.getProperty(StringUtil.valueOf(d));
+                    if (v!=null)
+                    {
+                        if (value==null)
+                            LOG.warn("SystemProperty '{}' is deprecated, use '{}' instead", d, name);
+                        else
+                            LOG.warn("SystemProperty '{}' is deprecated, value from '{}' used", d, name);
+                    }
+                    if (alternate==null)
+                        alternate=v;;
+                }
+            }
+
+            // use alternate from deprecated
+            if (value==null)
+                value=alternate;
+            
+            // use default value
+            if (value==null)
+                value=dftValue;
+
+            // Set value if ID set
+            if (id != null)
+                _configuration.getIdMap().put(id, value);
+
+            return value;
+        }
+        
+        /*
+         * Get a Environment Property.
+         *
+         * @param node
+         * @return
+         * @exception Exception
+         */
+        private Object envObj(XmlParser.Node node) throws Exception
+        {
+            AttrOrElementNode aoeNode=new AttrOrElementNode(node,"Id","Name","Deprecated","Default");
+            String id = aoeNode.getString("Id");
+            String name = aoeNode.getString("Name",true);
+            List<Object> deprecated = aoeNode.getList("Deprecated");
+            String dftValue = aoeNode.getString("Default");
+
+            // Look for a value
+            String value = System.getenv(name);
+            
+            // Look for a deprecated name value
+            if (value==null && !deprecated.isEmpty())
+            {
+                for (Object d : deprecated)
+                {
+                    value = System.getenv(StringUtil.valueOf(d));
+                    if (value!=null)
+                    {
+                        LOG.warn("Property '{}' is deprecated, use '{}' instead", d, name);
+                        break;
+                    }
+                }
+            }
+            
+            // use default value
+            if (value==null)
+                value=dftValue;
+
+            // Set value if ID set
+            if (id != null)
+                _configuration.getIdMap().put(id, value);
+
+            return value;
         }
 
         /*
@@ -1132,22 +1240,175 @@
             if ("Property".equals(tag))
                 return propertyObj(node);
             if ("SystemProperty".equals(tag))
-            {
-                String name = node.getAttribute("name");
-                String defaultValue = node.getAttribute("default");
-                return System.getProperty(name,defaultValue);
-            }
+                return systemPropertyObj(node);
             if ("Env".equals(tag))
-            {
-                String name = node.getAttribute("name");
-                String defaultValue = node.getAttribute("default");
-                String value=System.getenv(name);
-                return value==null?defaultValue:value;
-            }
+                return envObj(node);
 
             LOG.warn("Unknown value tag: " + node,new Throwable());
             return null;
         }
+        
+
+        private class AttrOrElementNode
+        {
+            final Object _obj;
+            final XmlParser.Node _node;
+            final Set<String> _elements = new HashSet<>();
+            final int _next;
+
+            AttrOrElementNode(XmlParser.Node node,String... elements )
+            {
+                this(null,node,elements);
+            }
+            
+            AttrOrElementNode(Object obj, XmlParser.Node node,String... elements )
+            {
+                _obj=obj;
+                _node=node;
+                for (String e:elements)
+                    _elements.add(e);
+                
+                int next=0;
+                for (Object o: _node)
+                {
+                    if (o instanceof String)
+                    {
+                        if (((String)o).trim().length()==0)
+                        {
+                            next++;
+                            continue;
+                        }
+                        break;
+                    }
+                    
+                    if (!(o instanceof XmlParser.Node))
+                        break;
+                    
+                    XmlParser.Node n = (XmlParser.Node)o;
+                    if (!_elements.contains(n.getTag()))
+                        break;
+                    
+                    next++;
+                }
+                _next=next;
+            }
+
+            public int getNext()
+            {
+                return _next;
+            }
+
+            public String getString(String elementName) throws Exception
+            {
+                return StringUtil.valueOf(get(elementName,false));
+            }
+            
+            public String getString(String elementName, boolean manditory) throws Exception
+            {
+                return StringUtil.valueOf(get(elementName,manditory));
+            }
+            
+            public Object get(String elementName, boolean manditory) throws Exception
+            {
+                String attrName=StringUtil.asciiToLowerCase(elementName);
+                String attr = _node.getAttribute(attrName);
+                Object value=attr;
+                
+                for (int i=0;i<_next;i++)
+                {
+                    Object o = _node.get(i);
+                    if (!(o instanceof XmlParser.Node))
+                        continue;
+                    XmlParser.Node n = (XmlParser.Node)o;
+                    if (elementName.equals(n.getTag()))
+                    {
+                        if (attr!=null)
+                            throw new IllegalStateException("Cannot have attr '"+attrName+"' and element '"+elementName+"'");
+
+                        value=value(_obj,n);
+                        break;
+                    }
+                }
+                
+                if (manditory && value==null)
+                    throw new IllegalStateException("Must have attr '"+attrName+"' or element '"+elementName+"'");
+                
+                return value;
+            }
+
+            public List<Object> getList(String elementName) throws Exception
+            {
+                return getList(elementName,false);
+            }
+            
+            public List<Object> getList(String elementName, boolean manditory) throws Exception
+            {
+                String attrName=StringUtil.asciiToLowerCase(elementName);
+                final List<Object> values=new ArrayList<>();
+                
+                String attr = _node.getAttribute(attrName);
+                if (attr!=null)
+                    values.addAll(StringUtil.csvSplit(null,attr,0,attr.length()));
+
+
+                for (int i=0;i<_next;i++)
+                {
+                    Object o = _node.get(i);
+                    if (!(o instanceof XmlParser.Node))
+                        continue;
+                    XmlParser.Node n = (XmlParser.Node)o;
+                    
+                    if (elementName.equals(n.getTag()))
+                    {
+                        if (attr!=null)
+                            throw new IllegalStateException("Cannot have attr '"+attrName+"' and element '"+elementName+"'");
+
+                        values.add(value(_obj,n));
+                    }
+                }
+                
+                if (manditory && values.isEmpty())
+                    throw new IllegalStateException("Must have attr '"+attrName+"' or element '"+elementName+"'");
+
+                return values;
+            }
+            
+            public List<XmlParser.Node> getNodes(String elementName) throws Exception
+            {
+                String attrName=StringUtil.asciiToLowerCase(elementName);
+                final List<XmlParser.Node> values=new ArrayList<>();
+                
+                String attr = _node.getAttribute(attrName);
+                if (attr!=null)
+                {
+                    for (String a : StringUtil.csvSplit(null,attr,0,attr.length()))
+                    {
+                        // create a fake node
+                        XmlParser.Node n = new XmlParser.Node(null,elementName,null);
+                        n.add(a);
+                        values.add(n);
+                    }
+                }
+
+                for (int i=0;i<_next;i++)
+                {
+                    Object o = _node.get(i);
+                    if (!(o instanceof XmlParser.Node))
+                        continue;
+                    XmlParser.Node n = (XmlParser.Node)o;
+                    
+                    if (elementName.equals(n.getTag()))
+                    {
+                        if (attr!=null)
+                            throw new IllegalStateException("Cannot have attr '"+attrName+"' and element '"+elementName+"'");
+
+                        values.add(n);
+                    }
+                }
+
+                return values;
+            }
+        }
     }
 
     /**
@@ -1177,7 +1438,6 @@
             {
                 try
                 {
-
                     Properties properties = null;
 
                     // Look for properties from start.jar
@@ -1199,14 +1459,9 @@
                     // If no start.config properties, use clean slate
                     if (properties == null)
                     {
-                        properties = new Properties();
                         // Add System Properties
-                        Enumeration<?> ensysprop = System.getProperties().propertyNames();
-                        while (ensysprop.hasMoreElements())
-                        {
-                            String name = (String)ensysprop.nextElement();
-                            properties.put(name,System.getProperty(name));
-                        }
+                        properties = new Properties();
+                        properties.putAll(System.getProperties());
                     }
 
                     // For all arguments, load properties
@@ -1228,7 +1483,7 @@
                     {
                         if (!args[i].toLowerCase(Locale.ENGLISH).endsWith(".properties") && (args[i].indexOf('=')<0))
                         {
-                            XmlConfiguration configuration = new XmlConfiguration(Resource.newResource(args[i]).getURL());
+                            XmlConfiguration configuration = new XmlConfiguration(Resource.newResource(args[i]).getURI().toURL());
                             if (last != null)
                                 configuration.getIdMap().putAll(last.getIdMap());
                             if (properties.size() > 0)
diff --git a/jetty-xml/src/main/java/org/eclipse/jetty/xml/XmlParser.java b/jetty-xml/src/main/java/org/eclipse/jetty/xml/XmlParser.java
index 9d9c007..9aa4275 100644
--- a/jetty-xml/src/main/java/org/eclipse/jetty/xml/XmlParser.java
+++ b/jetty-xml/src/main/java/org/eclipse/jetty/xml/XmlParser.java
@@ -50,11 +50,9 @@
 /**
  * XML Parser wrapper. This class wraps any standard JAXP1.1 parser with convieniant error and
  * entity handlers and a mini dom-like document tree.
- * <P>
+ * <p>
  * By default, the parser is created as a validating parser only if xerces is present. This can be
  * configured by setting the "org.eclipse.jetty.xml.XmlParser.Validating" system property.
- *
- *
  */
 public class XmlParser
 {
@@ -82,9 +80,6 @@
     }
 
     /* ------------------------------------------------------------ */
-    /**
-     * Constructor.
-     */
     public XmlParser(boolean validating)
     {
         setValidating(validating);
@@ -139,10 +134,6 @@
     }
     
     /* ------------------------------------------------------------ */
-    /**
-     * @param name
-     * @param entity
-     */
     public synchronized void redirectEntity(String name, URL entity)
     {
         if (entity != null)
@@ -218,6 +209,10 @@
     /* ------------------------------------------------------------ */
     /**
      * Parse String URL.
+     * @param url the url to the xml to parse
+     * @return the root node of the xml
+     * @throws IOException if unable to load the xml
+     * @throws SAXException if unable to parse the xml
      */
     public synchronized Node parse(String url) throws IOException, SAXException
     {
@@ -229,6 +224,10 @@
     /* ------------------------------------------------------------ */
     /**
      * Parse File.
+     * @param file the file to the xml to parse 
+     * @return the root node of the xml
+     * @throws IOException if unable to load the xml
+     * @throws SAXException if unable to parse the xml
      */
     public synchronized Node parse(File file) throws IOException, SAXException
     {
@@ -240,6 +239,10 @@
     /* ------------------------------------------------------------ */
     /**
      * Parse InputStream.
+     * @param in the input stream of the xml to parse
+     * @return the root node of the xml
+     * @throws IOException if unable to load the xml
+     * @throws SAXException if unable to parse the xml
      */
     public synchronized Node parse(InputStream in) throws IOException, SAXException
     {
@@ -557,6 +560,7 @@
         /* ------------------------------------------------------------ */
         /**
          * Get an array of element attributes.
+         * @return the attributes
          */
         public Attribute[] getAttributes()
         {
@@ -566,7 +570,8 @@
         /* ------------------------------------------------------------ */
         /**
          * Get an element attribute.
-         *
+         * 
+         * @param name the name of the attribute 
          * @return attribute or null.
          */
         public String getAttribute(String name)
@@ -577,7 +582,9 @@
         /* ------------------------------------------------------------ */
         /**
          * Get an element attribute.
-         *
+         * 
+         * @param name the name of the element 
+         * @param dft the default value
          * @return attribute or null.
          */
         public String getAttribute(String name, String dft)
@@ -618,7 +625,7 @@
         /**
          * Get the first child node with the tag.
          *
-         * @param tag
+         * @param tag the name of the tag
          * @return Node or null.
          */
         public Node get(String tag)
@@ -702,6 +709,7 @@
          * Convert to a string.
          *
          * @param tag If false, only _content is shown.
+         * @return the string value
          */
         public synchronized String toString(boolean tag)
         {
@@ -715,6 +723,8 @@
          * Convert to a string.
          *
          * @param tag If false, only _content is shown.
+         * @param trim true to trim the content
+         * @return the trimmed content
          */
         public synchronized String toString(boolean tag, boolean trim)
         {
diff --git a/jetty-xml/src/main/resources/org/eclipse/jetty/xml/configure_9_0.dtd b/jetty-xml/src/main/resources/org/eclipse/jetty/xml/configure_9_0.dtd
index 542bc8c..7d6045b 100644
--- a/jetty-xml/src/main/resources/org/eclipse/jetty/xml/configure_9_0.dtd
+++ b/jetty-xml/src/main/resources/org/eclipse/jetty/xml/configure_9_0.dtd
@@ -274,15 +274,6 @@
 This element allows arbitrary properties to be retrieved by name.
 The name attribute specifies the property name and the optional
 default argument provides a default value.
-
-A Property element can contain a sequence of elements such as Set, Put, Call, etc.
-which act on the retrieved object:
-
- <Property name="Server">
-   <Call id="jdbcIdMgr" name="getAttribute">
-     <Arg>jdbcIdMgr</Arg>
-   </Call>
- </Property>
 -->
 <!ELEMENT Property (%CONFIG;)* >
 <!ATTLIST Property %NAMEATTR; %DEFAULTATTR; %IDATTR; >
diff --git a/jetty-xml/src/main/resources/org/eclipse/jetty/xml/configure_9_3.dtd b/jetty-xml/src/main/resources/org/eclipse/jetty/xml/configure_9_3.dtd
new file mode 100644
index 0000000..b4f7c1d
--- /dev/null
+++ b/jetty-xml/src/main/resources/org/eclipse/jetty/xml/configure_9_3.dtd
@@ -0,0 +1,323 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<!--
+This is the document type descriptor for the
+org.eclipse.jetty.xml.XmlConfiguration class.  It allows a java object to be
+configured by with a sequence of Set, Put and Call elements.  These tags are
+mapped to methods on the object to be configured as follows:
+
+  <Set  name="Test">value</Set>              ==  obj.setTest("value");
+  <Put  name="Test">value</Put>              ==  obj.put("Test","value");
+  <Call name="test"><Arg>value</Arg></Call>  ==  obj.test("value");
+
+Values themselves may be configured objects that are created with the
+<New> tag or returned from a <Call> tag.
+
+Values are matched to arguments on a best effort approach, but types
+my be specified if a match is not achieved.
+-->
+
+<!ENTITY % CONFIG "Set|Get|Put|Call|New|Ref|Array|Map|Property">
+<!ENTITY % VALUE "#PCDATA|Get|Call|New|Ref|Array|Map|SystemProperty|Env|Property">
+
+<!ENTITY % TYPEATTR "type CDATA #IMPLIED " > <!-- String|Character|Short|Byte|Integer|Long|Boolean|Float|Double|char|short|byte|int|long|boolean|float|double|URL|InetAddress|InetAddrPort| #classname -->
+<!ENTITY % IMPLIEDCLASSATTR "class CDATA #IMPLIED" >
+<!ENTITY % CLASSATTR "class CDATA #REQUIRED" >
+<!ENTITY % NAMEATTR "name CDATA #REQUIRED" >
+<!ENTITY % IMPLIEDNAMEATTR "name CDATA #IMPLIED" >
+<!ENTITY % DEPRECATEDATTR "deprecated CDATA #IMPLIED" >
+<!ENTITY % DEFAULTATTR "default CDATA #IMPLIED" >
+<!ENTITY % IDATTR "id ID #IMPLIED" >
+<!ENTITY % ARGATTR "arg CDATA #IMPLIED" >
+<!ENTITY % ITEMATTR "item CDATA #IMPLIED" >
+<!ENTITY % REFATTR "refid CDATA #IMPLIED" >
+<!ENTITY % REQUIREDIDATTR "id ID #REQUIRED" >
+
+
+<!--
+Configure Element.
+This is the root element that specifies the class of object that
+can be configured:
+
+    <Configure class="com.acme.MyClass"> ... </Configure>
+-->
+<!ELEMENT Configure (Arg*,(%CONFIG;)*) >
+<!ATTLIST Configure %IMPLIEDCLASSATTR; %IDATTR; >
+
+
+<!--
+Set Element.
+This element maps to a call to a setter method or field on the current object.
+The name and optional type attributes are used to select the setter
+method. If the name given is xxx, then a setXxx method is used, or
+the xxx field is used of setXxx cannot be found.
+A Set element can contain value text and/or the value objects returned
+by other elements such as Call, New, SystemProperty, etc.
+If no value type is specified, then white
+space is trimmed out of the value. If it contains multiple value
+elements they are added as strings before being converted to any
+specified type.
+
+A Set with a class attribute is treated as a static set method invocation.
+-->
+<!ELEMENT Set (%VALUE;)* >
+<!ATTLIST Set %NAMEATTR; %TYPEATTR; %IMPLIEDCLASSATTR; >
+
+
+<!--
+Get Element.
+This element maps to a call to a getter method or field on the current object.
+The name attribute is used to select the get method.
+If the name given is xxx, then a getXxx method is used, or
+the xxx field is used if getXxx cannot be found.
+A Get element can contain other elements such as Set, Put, Call, etc.
+which act on the object returned by the get call.
+
+A Get with a class attribute is treated as a static get method or field.
+-->
+<!ELEMENT Get (%CONFIG;)* >
+<!ATTLIST Get %NAMEATTR; %IMPLIEDCLASSATTR; %IDATTR; >
+
+
+<!--
+Put Element.
+This element maps to a call to a put method on the current object,
+which must implement the Map interface. The name attribute is used
+as the put key and the optional type attribute can force the type
+of the value.
+
+A Put element can contain value text and/or value elements such as Call,
+New, SystemProperty, etc. If no value type is specified, then white
+space is trimmed out of the value. If it contains multiple value
+elements they are added as strings before being converted to any
+specified type.
+-->
+<!ELEMENT Put (%VALUE;)* >
+<!ATTLIST Put %NAMEATTR; %TYPEATTR; >
+
+
+<!--
+Id Element.
+This element is the equivalent of the id attribute.
+-->
+<!ELEMENT Id (%VALUE;)* >
+
+
+<!--
+Name element.
+This element is the equivalent of the name attribute.
+-->
+<!ELEMENT Name (%VALUE;)* >
+
+
+<!--
+Deprecated element.
+This element is the equivalent of the deprecated attribute.
+-->
+<!ELEMENT Deprecated (%VALUE;)* >
+
+
+<!--
+Default element.
+This element is the equivalent of the default attribute.
+-->
+<!ELEMENT Default (%VALUE;)* >
+
+
+<!--
+Class element.
+This element is the equivalent of the class attribute.
+-->
+<!ELEMENT Class (%VALUE;)* >
+
+
+<!--
+Type element.
+This element is the equivalent of the type attribute.
+-->
+<!ELEMENT Type (%VALUE;)* >
+
+
+<!--
+Call Element.
+This element maps to an arbitrary call to a method on the current object,
+The name attribute and Arg elements are used to select the method.
+
+A Call element can contain a sequence of Arg elements followed by
+a sequence of other elements such as Set, Put, Call, etc. which act on any object
+returned by the original call:
+
+ <Call id="o2" name="test">
+   <Arg>value1</Arg>
+   <Set name="Test">Value2</Set>
+ </Call>
+
+This is equivalent to:
+
+ Object o2 = o1.test("value1");
+ o2.setTest("value2");
+
+A Call with a class attribute is treated as a static call.
+-->
+<!ELEMENT Call (Id?,Name?,Class?,Arg*,(%CONFIG;)*) >
+<!ATTLIST Call %ARGATTR; %IMPLIEDNAMEATTR; %IMPLIEDCLASSATTR; %IDATTR; >
+
+
+<!--
+Arg Element.
+This element defines a positional or optional named argument for the
+Call and New elements. The optional type attribute can force the type
+of the value.
+
+An Arg element can contain value text and/or value elements such as Call,
+New, SystemProperty, etc. If no value type is specified, then white
+space is trimmed out of the value. If it contains multiple value
+elements they are added as strings before being converted to any
+specified type.
+-->
+<!ELEMENT Arg (%VALUE;)* >
+<!ATTLIST Arg %TYPEATTR; %IMPLIEDNAMEATTR; >
+
+
+<!--
+New Element.
+This element allows the creation of a new object as part of a
+value for elements such as Set, Put, Arg, etc. The class attribute
+determines the type of the new object and the contained Arg elements
+are used to select the constructor for the new object.
+
+A New element can contain a sequence of Arg elements followed by
+a sequence of elements such as Set, Put, Call, etc. elements
+which act on the new object:
+
+ <New id="o" class="com.acme.MyClass">
+   <Arg>value1</Arg>
+   <Set name="test">Value2</Set>
+ </New>
+
+This is equivalent to:
+
+ Object o = new com.acme.MyClass("value1");
+ o.setTest("Value2");
+-->
+<!ELEMENT New (Id?,Name?,Class?,Arg*,(%CONFIG;)*) >
+<!ATTLIST New %IDATTR; %IMPLIEDCLASSATTR; %ARGATTR; >
+
+
+<!--
+Ref Element.
+This element allows a previously created object to be referenced by id.  The
+attribute refid is used to specify the id of another object (the attribute id can
+also be used, but it's use is deprecated).
+A Ref element can contain a sequence of elements such as Set, Put, Call, etc.
+which act on the referenced object.
+
+ <Ref refid="myobject">
+   <Set name="Test">Value2</Set>
+ </New>
+-->
+<!ELEMENT Ref (%CONFIG;)* >
+<!ATTLIST Ref %IDATTR; %REFATTR;>
+
+
+<!--
+Array Element.
+This element allows the creation of a new array as part of a
+value of elements such as Set, Put, Arg, etc. The type attribute determines
+the type of the new array and the contained Item elements
+are used for each element of the array:
+
+ <Array type="java.lang.String">
+   <Item>value0</Item>
+   <Item><New class="java.lang.String"><Arg>value1</Arg></New></Item>
+ </Array>
+
+This is equivalent to:
+ String[] a = new String[] { "value0", new String("value1") };
+-->
+<!ELEMENT Array (Id?,Type?,Item*) >
+<!ATTLIST Array %IDATTR;%TYPEATTR;%ITEMATTR; >
+
+
+<!--
+Map Element.
+This element allows the creation of a new map as part of a
+value of elements such as Set, Put, Arg, etc. The type attribute determines
+the type of the new array and the contained Item elements
+are used for each element of the array:
+
+ <Map>
+   <Entry>
+     <Item>keyName</Item>
+     <Item><New class="java.lang.String"><Arg>value1</Arg></New></Item>
+   </Entry>
+ </Map>
+
+This is equivalent to:
+ Map m = new HashMap();
+ m.put("keyName", new String("value1"));
+-->
+<!ELEMENT Map (Id?,Entry*) >
+<!ATTLIST Map %IDATTR; >
+<!ELEMENT Entry (Item,Item) >
+
+
+<!--
+Item Element.
+This element defines an entry for the Array or Map Entry elements.
+The optional type attribute can force the type of the value.
+
+An Item element can contain value text and/or the value object of
+elements such as Call, New, SystemProperty, etc. If no value type
+is specified, then white space is trimmed out of the value.
+If it contains multiple value elements they are added as strings
+before being converted to any specified type.
+-->
+<!ELEMENT Item (%VALUE;)* >
+<!ATTLIST Item %TYPEATTR; %IDATTR; >
+
+
+<!--
+System Property Element.
+This element allows JVM System properties to be retrieved as
+part of the value of elements such as Set, Put, Arg, etc.
+The name attribute specifies the property name and the optional
+default argument provides a default value.
+
+ <SystemProperty name="Test" default="value" />
+
+This is equivalent to:
+
+ System.getProperty("Test","value");
+-->
+<!ELEMENT SystemProperty (Id?,Name?,Deprecated*,Default?) >
+<!ATTLIST SystemProperty %IMPLIEDNAMEATTR; %DEFAULTATTR; %DEPRECATEDATTR; %IDATTR; >
+
+
+<!--
+Environment variable Element.
+This element allows OS Environment variables to be retrieved as
+part of the value of elements such as Set, Put, Arg, etc.
+The name attribute specifies the env variable name and the optional
+default argument provides a default value.
+
+ <Env name="Test" default="value" />
+
+This is equivalent to:
+
+ String v=System.getEnv("Test");
+ if (v==null) v="value";
+
+-->
+<!ELEMENT Env (Id?,Name?,Deprecated*,Default?) >
+<!ATTLIST Env %IMPLIEDNAMEATTR; %DEFAULTATTR; %DEPRECATEDATTR; %IDATTR; >
+
+
+<!--
+Property Element.
+This element allows arbitrary properties to be retrieved by name.
+The name attribute specifies the property name and the optional
+default argument provides a default value.
+-->
+<!ELEMENT Property (Id?,Name?,Deprecated*,Default?) >
+<!ATTLIST Property %IMPLIEDNAMEATTR; %DEFAULTATTR; %DEPRECATEDATTR; %IDATTR; >
diff --git a/jetty-xml/src/test/java/org/eclipse/jetty/xml/XmlAppendableTest.java b/jetty-xml/src/test/java/org/eclipse/jetty/xml/XmlAppendableTest.java
index f424ecf..e68e2d4 100644
--- a/jetty-xml/src/test/java/org/eclipse/jetty/xml/XmlAppendableTest.java
+++ b/jetty-xml/src/test/java/org/eclipse/jetty/xml/XmlAppendableTest.java
@@ -49,7 +49,7 @@
         out.closeTag();
 
         String expected = "" +
-                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                 "<test>\n" +
                 "  <tag/>\n" +
                 "  <tag name=\"attr value\" noval=\"\" quotes=\"&apos;&quot;\"/>\n" +
diff --git a/jetty-xml/src/test/java/org/eclipse/jetty/xml/XmlConfigurationTest.java b/jetty-xml/src/test/java/org/eclipse/jetty/xml/XmlConfigurationTest.java
index cc7e387..abb17b2 100644
--- a/jetty-xml/src/test/java/org/eclipse/jetty/xml/XmlConfigurationTest.java
+++ b/jetty-xml/src/test/java/org/eclipse/jetty/xml/XmlConfigurationTest.java
@@ -18,6 +18,18 @@
 
 package org.eclipse.jetty.xml;
 
+import java.io.ByteArrayInputStream;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.CoreMatchers.nullValue;
@@ -25,20 +37,9 @@
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
-import java.io.ByteArrayInputStream;
-import java.net.URL;
-import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
-
 public class XmlConfigurationTest
 {
-    protected String _configure="org/eclipse/jetty/xml/configure.xml";
+    protected String[] _configure=new String [] {"org/eclipse/jetty/xml/configureWithAttr.xml","org/eclipse/jetty/xml/configureWithElements.xml"};
 
     private static final String STRING_ARRAY_XML = "<Array type=\"String\"><Item type=\"String\">String1</Item><Item type=\"String\">String2</Item></Array>";
     private static final String INT_ARRAY_XML = "<Array type=\"int\"><Item type=\"int\">1</Item><Item type=\"int\">2</Item></Array>";
@@ -54,161 +55,169 @@
     @Test
     public void testPassedObject() throws Exception
     {
-        TestConfiguration.VALUE=77;
-        Map<String,String> properties = new HashMap<>();
-        properties.put("whatever", "xxx");
+        for (String configure : _configure)
+        {
+            Map<String,String> properties = new HashMap<>();
+            properties.put("whatever", "xxx");
+            TestConfiguration.VALUE=77;
+            URL url = XmlConfigurationTest.class.getClassLoader().getResource(configure);
+            XmlConfiguration configuration = new XmlConfiguration(url);
+            TestConfiguration tc = new TestConfiguration("tc");
+            configuration.getProperties().putAll(properties);
+            configuration.configure(tc);
 
-        URL url = XmlConfigurationTest.class.getClassLoader().getResource(_configure);
-        XmlConfiguration configuration = new XmlConfiguration(url);
-        TestConfiguration tc = new TestConfiguration("tc");
-        configuration.getProperties().putAll(properties);
-        configuration.configure(tc);
+            assertEquals("Set String","SetValue",tc.testObject);
+            assertEquals("Set Type",2,tc.testInt);
 
-        assertEquals("Set String","SetValue",tc.testObject);
-        assertEquals("Set Type",2,tc.testInt);
+            assertEquals(18080, tc.propValue);
 
-        assertEquals(18080, tc.propValue);
+            assertEquals("Put","PutValue",tc.get("Test"));
+            assertEquals("Put dft","2",tc.get("TestDft"));
+            assertEquals("Put type",2,tc.get("TestInt"));
 
-        assertEquals("Put","PutValue",tc.get("Test"));
-        assertEquals("Put dft","2",tc.get("TestDft"));
-        assertEquals("Put type",2,tc.get("TestInt"));
+            assertEquals("Trim","PutValue",tc.get("Trim"));
+            assertEquals("Null",null,tc.get("Null"));
+            assertEquals("NullTrim",null,tc.get("NullTrim"));
 
-        assertEquals("Trim","PutValue",tc.get("Trim"));
-        assertEquals("Null",null,tc.get("Null"));
-        assertEquals("NullTrim",null,tc.get("NullTrim"));
+            assertEquals("ObjectTrim",1.2345,tc.get("ObjectTrim"));
+            assertEquals("Objects","-1String",tc.get("Objects"));
+            assertEquals( "ObjectsTrim", "-1String",tc.get("ObjectsTrim"));
+            assertEquals( "String", "\n    PutValue\n  ",tc.get("String"));
+            assertEquals( "NullString", "",tc.get("NullString"));
+            assertEquals( "WhiteSpace", "\n  ",tc.get("WhiteSpace"));
+            assertEquals( "ObjectString", "\n    1.2345\n  ",tc.get("ObjectString"));
+            assertEquals( "ObjectsString", "-1String",tc.get("ObjectsString"));
+            assertEquals( "ObjectsWhiteString", "-1\n  String",tc.get("ObjectsWhiteString"));
 
-        assertEquals("ObjectTrim",1.2345,tc.get("ObjectTrim"));
-        assertEquals("Objects","-1String",tc.get("Objects"));
-        assertEquals( "ObjectsTrim", "-1String",tc.get("ObjectsTrim"));
-        assertEquals( "String", "\n    PutValue\n  ",tc.get("String"));
-        assertEquals( "NullString", "",tc.get("NullString"));
-        assertEquals( "WhiteSpace", "\n  ",tc.get("WhiteSpace"));
-        assertEquals( "ObjectString", "\n    1.2345\n  ",tc.get("ObjectString"));
-        assertEquals( "ObjectsString", "-1String",tc.get("ObjectsString"));
-        assertEquals( "ObjectsWhiteString", "-1\n  String",tc.get("ObjectsWhiteString"));
+            assertEquals( "SystemProperty", System.getProperty("user.dir")+"/stuff",tc.get("SystemProperty"));
+            assertEquals( "Env", System.getenv("HOME"),tc.get("Env"));
 
-        assertEquals( "SystemProperty", System.getProperty("user.dir")+"/stuff",tc.get("SystemProperty"));
-        assertEquals( "Env", System.getenv("HOME"),tc.get("Env"));
-
-        assertEquals( "Property", "xxx", tc.get("Property"));
+            assertEquals( "Property", "xxx", tc.get("Property"));
 
 
-        assertEquals( "Called", "Yes",tc.get("Called"));
+            assertEquals( "Called", "Yes",tc.get("Called"));
 
-        assertTrue(TestConfiguration.called);
+            assertTrue(TestConfiguration.called);
 
-        assertEquals("oa[0]","Blah",tc.oa[0]);
-        assertEquals("oa[1]","1.2.3.4:5678",tc.oa[1]);
-        assertEquals("oa[2]",1.2345,tc.oa[2]);
-        assertEquals("oa[3]",null,tc.oa[3]);
+            assertEquals("oa[0]","Blah",tc.oa[0]);
+            assertEquals("oa[1]","1.2.3.4:5678",tc.oa[1]);
+            assertEquals("oa[2]",1.2345,tc.oa[2]);
+            assertEquals("oa[3]",null,tc.oa[3]);
 
-        assertEquals("ia[0]",1,tc.ia[0]);
-        assertEquals("ia[1]",2,tc.ia[1]);
-        assertEquals("ia[2]",3,tc.ia[2]);
-        assertEquals("ia[3]",0,tc.ia[3]);
+            assertEquals("ia[0]",1,tc.ia[0]);
+            assertEquals("ia[1]",2,tc.ia[1]);
+            assertEquals("ia[2]",3,tc.ia[2]);
+            assertEquals("ia[3]",0,tc.ia[3]);
 
-        TestConfiguration tc2=tc.nested;
-        assertTrue(tc2!=null);
-        assertEquals( "Called(bool)",true,tc2.get("Arg"));
+            TestConfiguration tc2=tc.nested;
+            assertTrue(tc2!=null);
+            assertEquals( "Called(bool)",true,tc2.get("Arg"));
 
-        assertEquals("nested config",null,tc.get("Arg"));
-        assertEquals("nested config",true,tc2.get("Arg"));
+            assertEquals("nested config",null,tc.get("Arg"));
+            assertEquals("nested config",true,tc2.get("Arg"));
 
-        assertEquals("nested config","Call1",tc2.testObject);
-        assertEquals("nested config",4,tc2.testInt);
-        assertEquals( "nested call", "http://www.eclipse.com/",tc2.url.toString());
+            assertEquals("nested config","Call1",tc2.testObject);
+            assertEquals("nested config",4,tc2.testInt);
+            assertEquals( "nested call", "http://www.eclipse.com/",tc2.url.toString());
 
-        assertEquals("static to field",tc.testField1,77);
-        assertEquals("field to field",tc.testField2,2);
-        assertEquals("literal to static",TestConfiguration.VALUE,42);
+            assertEquals("static to field",tc.testField1,77);
+            assertEquals("field to field",tc.testField2,2);
+            assertEquals("literal to static",TestConfiguration.VALUE,42);
+            
+            assertEquals("value0",((Map<String,String>)configuration.getIdMap().get("map")).get("key0"));
+            assertEquals("value1",((Map<String,String>)configuration.getIdMap().get("map")).get("key1"));
+        }
     }
 
     @Test
     public void testNewObject() throws Exception
     {
-        TestConfiguration.VALUE=71;
-        Map<String,String> properties = new HashMap<>();
-        properties.put("whatever", "xxx");
-
-        URL url = XmlConfigurationTest.class.getClassLoader().getResource(_configure);
-        final AtomicInteger count = new AtomicInteger(0);
-        XmlConfiguration configuration = new XmlConfiguration(url)
+        for (String configure : _configure)
         {
-            @Override
-            public void initializeDefaults(Object object)
+            TestConfiguration.VALUE=71;
+            Map<String,String> properties = new HashMap<>();
+            properties.put("whatever", "xxx");
+            
+            URL url = XmlConfigurationTest.class.getClassLoader().getResource(configure);
+            final AtomicInteger count = new AtomicInteger(0);
+            XmlConfiguration configuration = new XmlConfiguration(url)
             {
-                if (object instanceof TestConfiguration)
+                @Override
+                public void initializeDefaults(Object object)
                 {
-                    count.incrementAndGet();
-                    ((TestConfiguration)object).setNested(null);
-                    ((TestConfiguration)object).setTestString("NEW DEFAULT");
+                    if (object instanceof TestConfiguration)
+                    {
+                        count.incrementAndGet();
+                        ((TestConfiguration)object).setNested(null);
+                        ((TestConfiguration)object).setTestString("NEW DEFAULT");
+                    }
                 }
-            }
-        };
-        configuration.getProperties().putAll(properties);
-        TestConfiguration tc = (TestConfiguration)configuration.configure();
+            };
+            configuration.getProperties().putAll(properties);
+            TestConfiguration tc = (TestConfiguration)configuration.configure();
 
-        assertEquals(3,count.get());
-        
-        assertEquals("NEW DEFAULT",tc.getTestString());
-        assertEquals("nested",tc.getNested().getTestString());
-        assertEquals("NEW DEFAULT",tc.getNested().getNested().getTestString());
-        
-        assertEquals("Set String","SetValue",tc.testObject);
-        assertEquals("Set Type",2,tc.testInt);
+            assertEquals(3,count.get());
 
-        assertEquals(18080, tc.propValue);
+            assertEquals("NEW DEFAULT",tc.getTestString());
+            assertEquals("nested",tc.getNested().getTestString());
+            assertEquals("NEW DEFAULT",tc.getNested().getNested().getTestString());
 
-        assertEquals("Put","PutValue",tc.get("Test"));
-        assertEquals("Put dft","2",tc.get("TestDft"));
-        assertEquals("Put type",2,tc.get("TestInt"));
+            assertEquals("Set String","SetValue",tc.testObject);
+            assertEquals("Set Type",2,tc.testInt);
 
-        assertEquals("Trim","PutValue",tc.get("Trim"));
-        assertEquals("Null",null,tc.get("Null"));
-        assertEquals("NullTrim",null,tc.get("NullTrim"));
+            assertEquals(18080, tc.propValue);
 
-        assertEquals("ObjectTrim",1.2345,tc.get("ObjectTrim"));
-        assertEquals("Objects","-1String",tc.get("Objects"));
-        assertEquals( "ObjectsTrim", "-1String",tc.get("ObjectsTrim"));
-        assertEquals( "String", "\n    PutValue\n  ",tc.get("String"));
-        assertEquals( "NullString", "",tc.get("NullString"));
-        assertEquals( "WhiteSpace", "\n  ",tc.get("WhiteSpace"));
-        assertEquals( "ObjectString", "\n    1.2345\n  ",tc.get("ObjectString"));
-        assertEquals( "ObjectsString", "-1String",tc.get("ObjectsString"));
-        assertEquals( "ObjectsWhiteString", "-1\n  String",tc.get("ObjectsWhiteString"));
+            assertEquals("Put","PutValue",tc.get("Test"));
+            assertEquals("Put dft","2",tc.get("TestDft"));
+            assertEquals("Put type",2,tc.get("TestInt"));
 
-        assertEquals( "SystemProperty", System.getProperty("user.dir")+"/stuff",tc.get("SystemProperty"));
-        assertEquals( "Property", "xxx", tc.get("Property"));
+            assertEquals("Trim","PutValue",tc.get("Trim"));
+            assertEquals("Null",null,tc.get("Null"));
+            assertEquals("NullTrim",null,tc.get("NullTrim"));
+
+            assertEquals("ObjectTrim",1.2345,tc.get("ObjectTrim"));
+            assertEquals("Objects","-1String",tc.get("Objects"));
+            assertEquals( "ObjectsTrim", "-1String",tc.get("ObjectsTrim"));
+            assertEquals( "String", "\n    PutValue\n  ",tc.get("String"));
+            assertEquals( "NullString", "",tc.get("NullString"));
+            assertEquals( "WhiteSpace", "\n  ",tc.get("WhiteSpace"));
+            assertEquals( "ObjectString", "\n    1.2345\n  ",tc.get("ObjectString"));
+            assertEquals( "ObjectsString", "-1String",tc.get("ObjectsString"));
+            assertEquals( "ObjectsWhiteString", "-1\n  String",tc.get("ObjectsWhiteString"));
+
+            assertEquals( "SystemProperty", System.getProperty("user.dir")+"/stuff",tc.get("SystemProperty"));
+            assertEquals( "Property", "xxx", tc.get("Property"));
 
 
-        assertEquals( "Called", "Yes",tc.get("Called"));
+            assertEquals( "Called", "Yes",tc.get("Called"));
 
-        assertTrue(TestConfiguration.called);
+            assertTrue(TestConfiguration.called);
 
-        assertEquals("oa[0]","Blah",tc.oa[0]);
-        assertEquals("oa[1]","1.2.3.4:5678",tc.oa[1]);
-        assertEquals("oa[2]",1.2345,tc.oa[2]);
-        assertEquals("oa[3]",null,tc.oa[3]);
+            assertEquals("oa[0]","Blah",tc.oa[0]);
+            assertEquals("oa[1]","1.2.3.4:5678",tc.oa[1]);
+            assertEquals("oa[2]",1.2345,tc.oa[2]);
+            assertEquals("oa[3]",null,tc.oa[3]);
 
-        assertEquals("ia[0]",1,tc.ia[0]);
-        assertEquals("ia[1]",2,tc.ia[1]);
-        assertEquals("ia[2]",3,tc.ia[2]);
-        assertEquals("ia[3]",0,tc.ia[3]);
+            assertEquals("ia[0]",1,tc.ia[0]);
+            assertEquals("ia[1]",2,tc.ia[1]);
+            assertEquals("ia[2]",3,tc.ia[2]);
+            assertEquals("ia[3]",0,tc.ia[3]);
 
-        TestConfiguration tc2=tc.nested;
-        assertTrue(tc2!=null);
-        assertEquals( "Called(bool)",true,tc2.get("Arg"));
+            TestConfiguration tc2=tc.nested;
+            assertTrue(tc2!=null);
+            assertEquals( "Called(bool)",true,tc2.get("Arg"));
 
-        assertEquals("nested config",null,tc.get("Arg"));
-        assertEquals("nested config",true,tc2.get("Arg"));
+            assertEquals("nested config",null,tc.get("Arg"));
+            assertEquals("nested config",true,tc2.get("Arg"));
 
-        assertEquals("nested config","Call1",tc2.testObject);
-        assertEquals("nested config",4,tc2.testInt);
-        assertEquals( "nested call", "http://www.eclipse.com/",tc2.url.toString());
+            assertEquals("nested config","Call1",tc2.testObject);
+            assertEquals("nested config",4,tc2.testInt);
+            assertEquals( "nested call", "http://www.eclipse.com/",tc2.url.toString());
 
-        assertEquals("static to field",71,tc.testField1);
-        assertEquals("field to field",2,tc.testField2);
-        assertEquals("literal to static",42,TestConfiguration.VALUE);
+            assertEquals("static to field",71,tc.testField1);
+            assertEquals("field to field",2,tc.testField2);
+            assertEquals("literal to static",42,TestConfiguration.VALUE);
+        }
     }
 
 
@@ -219,8 +228,8 @@
             new XmlConfiguration("<Configure class=\"org.eclipse.jetty.xml.TestConfiguration\"><Set name=\"Test\">SetValue</Set><Set name=\"Test\" type=\"int\">2</Set></Configure>");
         TestConfiguration tc = new TestConfiguration();
         configuration.configure(tc);
-        assertEquals("Set String 3","SetValue",tc.testObject);
-        assertEquals("Set Type 3",2,tc.testInt);
+        assertEquals("Set String 3", "SetValue", tc.testObject);
+        assertEquals("Set Type 3", 2, tc.testInt);
     }
 
     @Test
@@ -233,7 +242,7 @@
         assertThat("tc.getList() returns null as it's not configured yet",tc.getList(),is(nullValue()));
         xmlConfiguration.configure(tc);
         assertThat("tc.getList() returns not null",tc.getList(),not(nullValue()));
-        assertThat("tc.getList() has two entries as specified in the xml",tc.getList().size(),is(2));
+        assertThat("tc.getList() has two entries as specified in the xml", tc.getList().size(), is(2));
     }
 
     @Test
@@ -248,7 +257,7 @@
         assertThat("tc.getList() returns null as it's not configured yet",tc.getList(),is(nullValue()));
         xmlConfiguration.configure(tc);
         assertThat("tc.getList() returns not null",tc.getList(),not(nullValue()));
-        assertThat("tc.getList() has two entries as specified in the xml",tc.getList().size(),is(2));
+        assertThat("tc.getList() has two entries as specified in the xml", tc.getList().size(), is(2));
     }
 
     @Test(expected = IllegalArgumentException.class)
@@ -270,7 +279,7 @@
         assertThat("tc.getList() returns null as it's not configured yet",tc.getSet(),is(nullValue()));
         xmlConfiguration.configure(tc);
         assertThat("tc.getList() returns not null",tc.getSet(),not(nullValue()));
-        assertThat("tc.getList() has two entries as specified in the xml",tc.getSet().size(),is(2));
+        assertThat("tc.getList() has two entries as specified in the xml", tc.getSet().size(), is(2));
     }
 
     @Test(expected = IllegalArgumentException.class)
@@ -290,7 +299,7 @@
         TestConfiguration tc = new TestConfiguration();
         assertThat("tc.getList() returns null as it's not configured yet",tc.getList(),is(nullValue()));
         xmlConfiguration.configure(tc);
-        assertThat("tc.getList() has two entries as specified in the xml",tc.getList().size(),is(2));
+        assertThat("tc.getList() has two entries as specified in the xml", tc.getList().size(), is(2));
     }
 
     @Test
@@ -301,7 +310,7 @@
         TestConfiguration tc = new TestConfiguration();
         assertThat("tc.getList() returns null as it's not configured yet",tc.getList(),is(nullValue()));
         xmlConfiguration.configure(tc);
-        assertThat("tc.getList() has two entries as specified in the xml",tc.getList().size(),is(2));
+        assertThat("tc.getList() has two entries as specified in the xml", tc.getList().size(), is(2));
     }
 
     @Test(expected=NoSuchMethodException.class)
@@ -310,7 +319,7 @@
         XmlConfiguration xmlConfiguration = new XmlConfiguration("<Configure class=\"org.eclipse.jetty.xml.TestConfiguration\"><Set name=\"LinkedList\">"
                 + INT_ARRAY_XML + "</Set></Configure>");
         TestConfiguration tc = new TestConfiguration();
-        assertThat("tc.getSet() returns null as it's not configured yet",tc.getList(),is(nullValue()));
+        assertThat("tc.getSet() returns null as it's not configured yet", tc.getList(), is(nullValue()));
         xmlConfiguration.configure(tc);
     }
 
@@ -320,9 +329,9 @@
         XmlConfiguration xmlConfiguration = new XmlConfiguration("<Configure class=\"org.eclipse.jetty.xml.TestConfiguration\"><Set name=\"ArrayList\">"
                 + INT_ARRAY_XML + "</Set></Configure>");
         TestConfiguration tc = new TestConfiguration();
-        assertThat("tc.getSet() returns null as it's not configured yet",tc.getList(),is(nullValue()));
+        assertThat("tc.getSet() returns null as it's not configured yet", tc.getList(), is(nullValue()));
         xmlConfiguration.configure(tc);
-        assertThat("tc.getSet() has two entries as specified in the xml",tc.getList().size(),is(2));
+        assertThat("tc.getSet() has two entries as specified in the xml", tc.getList().size(), is(2));
     }
 
     @Test
@@ -331,9 +340,9 @@
         XmlConfiguration xmlConfiguration = new XmlConfiguration("<Configure class=\"org.eclipse.jetty.xml.TestConfiguration\"><Set name=\"Set\">"
                 + STRING_ARRAY_XML + "</Set></Configure>");
         TestConfiguration tc = new TestConfiguration();
-        assertThat("tc.getSet() returns null as it's not configured yet",tc.getSet(),is(nullValue()));
+        assertThat("tc.getSet() returns null as it's not configured yet", tc.getSet(), is(nullValue()));
         xmlConfiguration.configure(tc);
-        assertThat("tc.getSet() has two entries as specified in the xml",tc.getSet().size(),is(2));
+        assertThat("tc.getSet() has two entries as specified in the xml", tc.getSet().size(), is(2));
     }
 
     @Test
@@ -342,9 +351,9 @@
         XmlConfiguration xmlConfiguration = new XmlConfiguration("<Configure class=\"org.eclipse.jetty.xml.TestConfiguration\"><Set name=\"Set\">"
                 + INT_ARRAY_XML + "</Set></Configure>");
         TestConfiguration tc = new TestConfiguration();
-        assertThat("tc.getSet() returns null as it's not configured yet",tc.getSet(),is(nullValue()));
+        assertThat("tc.getSet() returns null as it's not configured yet", tc.getSet(), is(nullValue()));
         xmlConfiguration.configure(tc);
-        assertThat("tc.getSet() has two entries as specified in the xml",tc.getSet().size(),is(2));
+        assertThat("tc.getSet() has two entries as specified in the xml", tc.getSet().size(), is(2));
     }
 
     @Test
@@ -590,7 +599,7 @@
         Assert.assertEquals("third parameter not wired correctly","arg3", atc.getThird());
         Assert.assertEquals("nested first parameter not wired correctly","arg1", atc.getNested().getFirst());
         Assert.assertEquals("nested second parameter not wired correctly","arg2", atc.getNested().getSecond());
-        Assert.assertEquals("nested third parameter not wired correctly","arg3", atc.getNested().getThird());
+        Assert.assertEquals("nested third parameter not wired correctly", "arg3", atc.getNested().getThird());
     }
 
     @Test
@@ -618,7 +627,7 @@
         Assert.assertEquals("third parameter not wired correctly","arg3", atc.getThird());
         Assert.assertEquals("nested first parameter not wired correctly","arg1", atc.getNested().getFirst());
         Assert.assertEquals("nested second parameter not wired correctly","arg2", atc.getNested().getSecond());
-        Assert.assertEquals("nested third parameter not wired correctly","arg3", atc.getNested().getThird());
+        Assert.assertEquals("nested third parameter not wired correctly", "arg3", atc.getNested().getThird());
     }
 
     @Test
@@ -645,7 +654,7 @@
         Assert.assertEquals("third parameter not wired correctly","arg3", atc.getThird());
         Assert.assertEquals("nested first parameter not wired correctly","arg1", atc.getNested().getFirst());
         Assert.assertEquals("nested second parameter not wired correctly","arg2", atc.getNested().getSecond());
-        Assert.assertEquals("nested third parameter not wired correctly","arg3", atc.getNested().getThird());
+        Assert.assertEquals("nested third parameter not wired correctly", "arg3", atc.getNested().getThird());
     }
 
     public static class NativeHolder
@@ -779,4 +788,117 @@
             
         }
     }
+
+    @Test
+    public void testWithMultiplePropertyNamesWithNoPropertyThenDefaultIsChosen() throws Exception
+    {
+        // No properties
+        String defolt = "baz";
+        XmlConfiguration xmlConfiguration = new XmlConfiguration("" +
+                "<Configure class=\"org.eclipse.jetty.xml.DefaultTestConfiguration\">" +
+                "  <Set name=\"first\"><Property name=\"wibble\" deprecated=\"foo,bar\" default=\"" + defolt + "\"/></Set>  " +
+                "</Configure>");
+        DefaultTestConfiguration config = (DefaultTestConfiguration)xmlConfiguration.configure();
+        assertEquals(defolt, config.getFirst());
+    }
+
+    @Test
+    public void testWithMultiplePropertyNamesWithFirstPropertyThenFirstIsChosen() throws Exception
+    {
+        String name = "foo";
+        String value = "foo";
+        XmlConfiguration xmlConfiguration = new XmlConfiguration("" +
+                "<Configure class=\"org.eclipse.jetty.xml.DefaultTestConfiguration\">" +
+                "  <Set name=\"first\"><Property name=\"" + name + "\" deprecated=\"other,bar\" default=\"baz\"/></Set>  " +
+                "</Configure>");
+        xmlConfiguration.getProperties().put(name, value);
+        DefaultTestConfiguration config = (DefaultTestConfiguration)xmlConfiguration.configure();
+        assertEquals(value, config.getFirst());
+    }
+
+    @Test
+    public void testWithMultiplePropertyNamesWithSecondPropertyThenSecondIsChosen() throws Exception
+    {
+        String name = "bar";
+        String value = "bar";
+        XmlConfiguration xmlConfiguration = new XmlConfiguration("" +
+                "<Configure class=\"org.eclipse.jetty.xml.DefaultTestConfiguration\">" +
+                "  <Set name=\"first\"><Property name=\"foo\" deprecated=\"" + name + "\" default=\"baz\"/></Set>  " +
+                "</Configure>");
+        xmlConfiguration.getProperties().put(name, value);
+        DefaultTestConfiguration config = (DefaultTestConfiguration)xmlConfiguration.configure();
+        assertEquals(value, config.getFirst());
+    }
+
+    @Test
+    public void testWithMultiplePropertyNamesWithDeprecatedThenThirdIsChosen() throws Exception
+    {
+        String name = "bar";
+        String value = "bar";
+        XmlConfiguration xmlConfiguration = new XmlConfiguration("" +
+                "<Configure class=\"org.eclipse.jetty.xml.DefaultTestConfiguration\">" +
+                "  <Set name=\"first\"><Property name=\"foo\" deprecated=\"other," + name + "\" default=\"baz\"/></Set>  " +
+                "</Configure>");
+        xmlConfiguration.getProperties().put(name, value);
+        DefaultTestConfiguration config = (DefaultTestConfiguration)xmlConfiguration.configure();
+        assertEquals(value, config.getFirst());
+    }
+
+    @Test
+    public void testWithMultiplePropertyNameElementsWithDeprecatedThenThirdIsChosen() throws Exception
+    {
+        String name = "bar";
+        String value = "bar";
+        XmlConfiguration xmlConfiguration = new XmlConfiguration("" +
+                "<Configure class=\"org.eclipse.jetty.xml.DefaultTestConfiguration\">" +
+                "  <Set name=\"first\">" +
+                "  <Property>  " +
+                "    <Name>foo</Name>" +
+                "    <Deprecated>foo</Deprecated>" +
+                "    <Deprecated>"+name+"</Deprecated>" +
+                "    <Default>baz</Default>" +
+                "  </Property>  " +
+                "  </Set>  " +
+                "</Configure>");
+        xmlConfiguration.getProperties().put(name, value);
+        DefaultTestConfiguration config = (DefaultTestConfiguration)xmlConfiguration.configure();
+        assertEquals(value, config.getFirst());
+    }
+
+    @Test
+    public void testPropertyNotFoundWithPropertyInDefaultValue() throws Exception
+    {
+        String name = "bar";
+        String value = "bar";
+        String defaultValue = "_<Property name=\"bar\"/>_<Property name=\"bar\"/>_";
+        String expectedValue = "_" + value + "_" + value + "_";
+        XmlConfiguration xmlConfiguration = new XmlConfiguration("" +
+                "<Configure class=\"org.eclipse.jetty.xml.DefaultTestConfiguration\">" +
+                "  <Set name=\"first\">" +
+                "    <Property>" +
+                "      <Name>not_found</Name>" +
+                "      <Default>" + defaultValue + "</Default>" +
+                "    </Property>" +
+                "  </Set>  " +
+                "</Configure>");
+        xmlConfiguration.getProperties().put(name, value);
+        DefaultTestConfiguration config = (DefaultTestConfiguration)xmlConfiguration.configure();
+        assertEquals(expectedValue, config.getFirst());
+    }
+
+    @Test
+    public void testPropertyNotFoundWithPropertyInDefaultValueNotFoundWithDefault() throws Exception
+    {
+        String value = "bar";
+        XmlConfiguration xmlConfiguration = new XmlConfiguration("" +
+                "<Configure class=\"org.eclipse.jetty.xml.DefaultTestConfiguration\">" +
+                "  <Set name=\"first\">" +
+                "    <Property name=\"not_found\">" +
+                "      <Default><Property name=\"also_not_found\" default=\"" + value + "\"/></Default>" +
+                "    </Property>" +
+                "  </Set>  " +
+                "</Configure>");
+        DefaultTestConfiguration config = (DefaultTestConfiguration)xmlConfiguration.configure();
+        assertEquals(value, config.getFirst());
+    }
 }
diff --git a/jetty-xml/src/test/java/org/eclipse/jetty/xml/XmlParserTest.java b/jetty-xml/src/test/java/org/eclipse/jetty/xml/XmlParserTest.java
index 0f1e11c..31e15c1 100644
--- a/jetty-xml/src/test/java/org/eclipse/jetty/xml/XmlParserTest.java
+++ b/jetty-xml/src/test/java/org/eclipse/jetty/xml/XmlParserTest.java
@@ -31,24 +31,12 @@
     {
         XmlParser parser = new XmlParser();
 
-        URL configURL = XmlConfiguration.class.getClassLoader().getResource("org/eclipse/jetty/xml/configure_6_0.dtd");
+        URL configURL = XmlConfiguration.class.getClassLoader().getResource("org/eclipse/jetty/xml/configure_9_3.dtd");
         parser.redirectEntity("configure.dtd", configURL);
-        parser.redirectEntity("configure_1_3.dtd", configURL);
         parser.redirectEntity("http://jetty.eclipse.org/configure.dtd", configURL);
         parser.redirectEntity("-//Mort Bay Consulting//DTD Configure//EN", configURL);
-        parser.redirectEntity("http://jetty.eclipse.org/configure_1_3.dtd", configURL);
-        parser.redirectEntity("-//Mort Bay Consulting//DTD Configure 1.3//EN", configURL);
-        parser.redirectEntity("configure_1_2.dtd", configURL);
-        parser.redirectEntity("http://jetty.eclipse.org/configure_1_2.dtd", configURL);
-        parser.redirectEntity("-//Mort Bay Consulting//DTD Configure 1.2//EN", configURL);
-        parser.redirectEntity("configure_1_1.dtd", configURL);
-        parser.redirectEntity("http://jetty.eclipse.org/configure_1_1.dtd", configURL);
-        parser.redirectEntity("-//Mort Bay Consulting//DTD Configure 1.1//EN", configURL);
-        parser.redirectEntity("configure_1_0.dtd", configURL);
-        parser.redirectEntity("http://jetty.eclipse.org/configure_1_0.dtd", configURL);
-        parser.redirectEntity("-//Mort Bay Consulting//DTD Configure 1.0//EN", configURL);
 
-        URL url = XmlParserTest.class.getClassLoader().getResource("org/eclipse/jetty/xml/configure.xml");
+        URL url = XmlParserTest.class.getClassLoader().getResource("org/eclipse/jetty/xml/configureWithAttr.xml");
         XmlParser.Node testDoc = parser.parse(url.toString());
         String testDocStr = testDoc.toString().trim();
 
diff --git a/jetty-xml/src/test/resources/org/eclipse/jetty/xml/configure.xml b/jetty-xml/src/test/resources/org/eclipse/jetty/xml/configure.xml
deleted file mode 100644
index 46c8571..0000000
--- a/jetty-xml/src/test/resources/org/eclipse/jetty/xml/configure.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
-<Configure class="org.eclipse.jetty.xml.TestConfiguration">
-  <Arg name="name">name</Arg>
-
-  <Set name="Test">SetValue</Set>
-  <Set name="Test" type="int"><Property name="does.not.exist" default="2"/></Set>
-  
-  <Set name="PropertyTest"><Property name="anIntegerNoActualPropDefined" default="18080"/></Set>
-
-  <Put name="Test">PutValue</Put>
-  <Put name="TestDft">2</Put>
-  <Put name="TestInt" type="int">2</Put>
-
-  <Put name="Trim">
-    PutValue
-  </Put>
-
-  <Put name="Null"></Put>
-
-  <Put name="NullTrim">
-  </Put>
-
-  <Put name="Object"><New class="java.lang.Double">
-      <Arg>1.2345</Arg>
-  </New></Put>
- 
-  <Put name="ObjectTrim">
-    <New class="java.lang.Double">
-      <Arg>1.2345</Arg>
-    </New>
-  </Put>
-
-  <Put name="Objects"><New class="java.lang.Integer">
-      <Arg>-1</Arg>
-  </New><New class="java.lang.String">
-      <Arg>String</Arg>
-  </New></Put>
-
-
-  <Put name="ObjectsTrim">
-    <New class="java.lang.Integer">
-      <Arg>-1</Arg>
-  </New><New class="java.lang.String">
-      <Arg>String</Arg>
-  </New></Put>
-
-
-  <Put name="String" type="String">
-    PutValue
-  </Put>
-
-  <Put name="NullString" type="String"></Put>
-
-  <Put name="WhiteSpace" type="String">
-  </Put>
-
-  <Put name="ObjectString" type="String">
-    <New class="java.lang.Double">
-      <Arg>1.2345</Arg>
-    </New>
-  </Put>
-
-  <Put name="ObjectsString" type="String"><New class="java.lang.Integer">
-      <Arg>-1</Arg>
-  </New><New class="java.lang.String">
-      <Arg>String</Arg>
-  </New></Put>
-
-
-  <Put name="ObjectsWhiteString">
-    <New class="java.lang.Integer">
-      <Arg>-1</Arg>
-  </New>
-  <New class="java.lang.String">
-      <Arg>String</Arg>
-  </New></Put>
-
-  <Put name="SystemProperty" ><SystemProperty name="user.dir"/>/stuff</Put>
-  <Put name="Property"><Property name="whatever" default="xxx"/></Put>
-  <Put name="SomethingElse"><SystemProperty name="floople" default="xxx"/></Put>
-  <Put name="Boolean" type="Boolean">True</Put>
-  <Put name="Float" type="Float">2.3</Put>
-  <Put name="Env"><Env name="HOME"/></Put>
-
-  <Set name="nested">
-    <New class="org.eclipse.jetty.xml.TestConfiguration">
-      <Set name="testString">nested</Set>
-      <Set name="nested">
-        <New class="org.eclipse.jetty.xml.TestConfiguration">
-        </New>
-      </Set>
-    </New>
-  </Set>
-
-  <Call name="call">
-  </Call>
-
-  <Call name="call">
-    <Arg type="boolean">false</Arg>
-  </Call>
-
-  <Call name="call">
-    <Arg type="boolean">true</Arg>
-    <Put name="nested">put</Put>
-    <Set name="Test">Call1</Set>
-    <Set name="Test" type="int">4</Set>
-    <Call name="call">
-      <Arg type="URL">http://www.eclipse.com/</Arg>
-      <Arg type="boolean">false</Arg>
-    </Call>
-  </Call>
-
-  <Get name="String">
-     <Call name="toString"/>
-  </Get>
-
-  <Call name="callStatic" class="org.eclipse.jetty.xml.TestConfiguration"/>
-
-  <Call name="call">
-    <Arg><Array type="java.lang.Object">
-      <Item>Blah</Item>
-      <Item type="String">1.2.3.4:5678</Item>
-      <Item><New class="java.lang.Double"><Arg>1.2345</Arg></New></Item>
-      <Item></Item>
-    </Array></Arg>
-  </Call>
-
-  <Call name="call">
-    <Arg><Array type="int">
-      <Item type="int">1</Item>
-      <Item type="int">2</Item>
-      <Item type="int">3</Item>
-      <Item></Item>
-    </Array></Arg>
-  </Call>
-
-  <Set name="testField1"><Get class="org.eclipse.jetty.xml.TestConfiguration" name="VALUE"/></Set>
-  <Set name="testField2"><Get name="testInt"/></Set>
-  <Set name="VALUE" type="int">42</Set>
-
-</Configure>
-
-
diff --git a/jetty-xml/src/test/resources/org/eclipse/jetty/xml/configureWithAttr.xml b/jetty-xml/src/test/resources/org/eclipse/jetty/xml/configureWithAttr.xml
new file mode 100644
index 0000000..8377987
--- /dev/null
+++ b/jetty-xml/src/test/resources/org/eclipse/jetty/xml/configureWithAttr.xml
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<Configure class="org.eclipse.jetty.xml.TestConfiguration">
+  <Arg name="name">name</Arg>
+
+  <Set name="Test">SetValue</Set>
+  <Set name="Test" type="int"><Property name="does.not.exist" default="2"/></Set>
+  
+  <Set name="PropertyTest"><Property name="anIntegerNoActualPropDefined" default="18080"/></Set>
+
+  <Put name="Test">PutValue</Put>
+  <Put name="TestDft">2</Put>
+  <Put name="TestInt" type="int">2</Put>
+
+  <Put name="Trim">
+    PutValue
+  </Put>
+
+  <Put name="Null"></Put>
+
+  <Put name="NullTrim">
+  </Put>
+
+  <Put name="Object"><New class="java.lang.Double" arg="1.2345"/></Put>
+ 
+  <Put name="ObjectTrim">
+    <New class="java.lang.Double" arg="1.2345"/>
+  </Put>
+
+  <Put name="Objects"><New class="java.lang.Integer" arg="-1"/><New class="java.lang.String" arg="String"/></Put>
+
+  <Put name="ObjectsTrim">
+    <New class="java.lang.Integer" arg="-1">
+  </New><New class="java.lang.String" arg="String">
+  </New></Put>
+
+  <Put name="String" type="String">
+    PutValue
+  </Put>
+
+  <Put name="NullString" type="String"></Put>
+
+  <Put name="WhiteSpace" type="String">
+  </Put>
+
+  <Put name="ObjectString" type="String">
+    <New class="java.lang.Double">
+      <Arg>1.2345</Arg>
+    </New>
+  </Put>
+
+  <Put name="ObjectsString" type="String"><New class="java.lang.Integer" arg="-1"/><New class="java.lang.String" arg="String"/></Put>
+
+  <Put name="ObjectsWhiteString">
+    <New class="java.lang.Integer" arg="-1">
+  </New>
+  <New class="java.lang.String" arg="String">
+  </New></Put>
+
+  <Put name="SystemProperty" ><SystemProperty name="user.dir"/>/stuff</Put>
+  <Put name="Property"><Property name="whatever" default="xxx"/></Put>
+  <Put name="SomethingElse"><SystemProperty name="floople" default="xxx"/></Put>
+  <Put name="Boolean" type="Boolean">True</Put>
+  <Put name="Float" type="Float">2.3</Put>
+  <Put name="Env"><Env name="HOME"/></Put>
+
+  <Set name="nested">
+    <New class="org.eclipse.jetty.xml.TestConfiguration">
+      <Set name="testString">nested</Set>
+      <Set name="nested">
+        <New class="org.eclipse.jetty.xml.TestConfiguration">
+        </New>
+      </Set>
+    </New>
+  </Set>
+
+  <Call name="call">
+  </Call>
+
+  <Call name="call">
+    <Arg type="boolean">false</Arg>
+  </Call>
+
+  <Call name="call">
+    <Arg type="boolean">true</Arg>
+    <Put name="nested">put</Put>
+    <Set name="Test">Call1</Set>
+    <Set name="Test" type="int">4</Set>
+    <Call name="call">
+      <Arg type="URL">http://www.eclipse.com/</Arg>
+      <Arg type="boolean">false</Arg>
+    </Call>
+  </Call>
+
+  <Get name="String">
+     <Call name="toString"/>
+  </Get>
+
+  <Call name="callStatic" class="org.eclipse.jetty.xml.TestConfiguration"/>
+
+  <Call name="call">
+    <Arg><Array type="java.lang.Object">
+      <Item>Blah</Item>
+      <Item type="String">1.2.3.4:5678</Item>
+      <Item><New class="java.lang.Double"><Arg>1.2345</Arg></New></Item>
+      <Item></Item>
+    </Array></Arg>
+  </Call>
+
+  <Call name="call">
+    <Arg><Array type="int">
+      <Item type="int">1</Item>
+      <Item type="int">2</Item>
+      <Item type="int">3</Item>
+      <Item></Item>
+    </Array></Arg>
+  </Call>
+
+  <Set name="testField1"><Get class="org.eclipse.jetty.xml.TestConfiguration" name="VALUE"/></Set>
+  <Set name="testField2"><Get name="testInt"/></Set>
+  <Set name="VALUE" type="int">42</Set>
+
+  <Map id="map">
+    <Entry>
+      <Item id="key0">key0</Item>
+      <Item id="value0">value0</Item>
+    </Entry>
+    <Entry>
+      <Item id="key1">key1</Item>
+      <Item id="value1">value1</Item>
+    </Entry>
+  </Map>
+
+</Configure>
+
+
diff --git a/jetty-xml/src/test/resources/org/eclipse/jetty/xml/configureWithElements.xml b/jetty-xml/src/test/resources/org/eclipse/jetty/xml/configureWithElements.xml
new file mode 100644
index 0000000..e4fa88d
--- /dev/null
+++ b/jetty-xml/src/test/resources/org/eclipse/jetty/xml/configureWithElements.xml
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
+
+<Configure class="org.eclipse.jetty.xml.TestConfiguration">
+  <Arg name="name">name</Arg>
+
+  <Set name="Test">SetValue</Set>
+  <Set name="Test" type="int"><Property><Name>does.not.exist</Name><Default>2</Default></Property></Set>
+  
+  <Set name="PropertyTest"><Property><Name>anIntegerNoActualPropDefined</Name><Default>18080</Default></Property></Set>
+
+  <Put name="Test">PutValue</Put>
+  <Put name="TestDft">2</Put>
+  <Put name="TestInt" type="int">2</Put>
+
+  <Put name="Trim">
+    PutValue
+  </Put>
+
+  <Put name="Null"></Put>
+
+  <Put name="NullTrim">
+  </Put>
+
+  <Put name="Object"><New class="java.lang.Double">
+      <Arg>1.2345</Arg>
+  </New></Put>
+ 
+  <Put name="ObjectTrim">
+    <New class="java.lang.Double">
+      <Arg>1.2345</Arg>
+    </New>
+  </Put>
+
+  <Put name="Objects"><New class="java.lang.Integer">
+      <Arg>-1</Arg>
+  </New><New class="java.lang.String">
+      <Arg>String</Arg>
+  </New></Put>
+
+
+  <Put name="ObjectsTrim">
+    <New class="java.lang.Integer">
+      <Arg>-1</Arg>
+  </New><New class="java.lang.String">
+      <Arg>String</Arg>
+  </New></Put>
+
+
+  <Put name="String" type="String">
+    PutValue
+  </Put>
+
+  <Put name="NullString" type="String"></Put>
+
+  <Put name="WhiteSpace" type="String">
+  </Put>
+
+  <Put name="ObjectString" type="String">
+    <New class="java.lang.Double">
+      <Arg>1.2345</Arg>
+    </New>
+  </Put>
+
+  <Put name="ObjectsString" type="String"><New class="java.lang.Integer">
+      <Arg>-1</Arg>
+  </New><New>
+      <Class>java.lang.String</Class>
+      <Arg>String</Arg>
+  </New></Put>
+
+
+  <Put name="ObjectsWhiteString">
+    <New>
+      <Class>java.lang.Integer</Class>
+      <Arg>-1</Arg>
+  </New>
+  <New>
+      <Class>java.lang.String</Class>
+      <Arg>String</Arg>
+  </New></Put>
+
+  <Put name="SystemProperty" ><SystemProperty><Name>user.dir</Name></SystemProperty>/stuff</Put>
+  <Put name="Property"><Property><Name>whatever</Name><Default>xxx</Default></Property></Put>
+  <Put name="SomethingElse"><SystemProperty name="floople" default="xxx"/></Put>
+  <Put name="Boolean" type="Boolean">True</Put>
+  <Put name="Float" type="Float">2.3</Put>
+  <Put name="Env"><Env name="HOME"/></Put>
+
+  <Set name="nested">
+    <New>
+      <Class>org.eclipse.jetty.xml.TestConfiguration</Class>
+      <Set name="testString">nested</Set>
+      <Set name="nested">
+        <New class="org.eclipse.jetty.xml.TestConfiguration">
+        </New>
+      </Set>
+    </New>
+  </Set>
+
+  <Call name="call">
+  </Call>
+
+  <Call name="call">
+    <Arg type="boolean">false</Arg>
+  </Call>
+
+  <Call name="call">
+    <Arg type="boolean">true</Arg>
+    <Put name="nested">put</Put>
+    <Set name="Test">Call1</Set>
+    <Set name="Test" type="int">4</Set>
+    <Call>
+      <Name>call</Name>
+      <Arg type="URL">http://www.eclipse.com/</Arg>
+      <Arg type="boolean">false</Arg>
+    </Call>
+  </Call>
+
+  <Get name="String">
+     <Call name="toString"/>
+  </Get>
+
+  <Call>
+    <Name>callStatic</Name>
+    <Class>org.eclipse.jetty.xml.TestConfiguration</Class>
+  </Call>
+
+  <Call>
+    <Name>call</Name>
+    <Arg><Array type="java.lang.Object">
+      <Item>Blah</Item>
+      <Item type="String">1.2.3.4:5678</Item>
+      <Item><New class="java.lang.Double"><Arg>1.2345</Arg></New></Item>
+      <Item></Item>
+    </Array></Arg>
+  </Call>
+
+  <Call>
+    <Name>call</Name>
+    <Arg><Array>
+      <Id>array</Id>
+      <Type>int</Type>
+      <Item type="int">1</Item>
+      <Item type="int">2</Item>
+      <Item type="int">3</Item>
+      <Item></Item>
+    </Array></Arg>
+  </Call>
+
+  <Set name="testField1"><Get class="org.eclipse.jetty.xml.TestConfiguration" name="VALUE"/></Set>
+  <Set name="testField2"><Get name="testInt"/></Set>
+  <Set name="VALUE" type="int">42</Set>
+  
+  <Map>
+    <Id>map</Id>
+    <Entry>
+      <Item id="key0">key0</Item>
+      <Item id="value0">value0</Item>
+    </Entry>
+    <Entry>
+      <Item id="key1">key1</Item>
+      <Item id="value1">value1</Item>
+    </Entry>
+  </Map>
+
+</Configure>
+
+
diff --git a/jetty-xml/src/test/resources/org/eclipse/jetty/xml/mortbay.xml b/jetty-xml/src/test/resources/org/eclipse/jetty/xml/mortbay.xml
index e1c1808..c8e20ce 100644
--- a/jetty-xml/src/test/resources/org/eclipse/jetty/xml/mortbay.xml
+++ b/jetty-xml/src/test/resources/org/eclipse/jetty/xml/mortbay.xml
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure_9_3.dtd">
 <Configure class="java.lang.Object">
 </Configure>
diff --git a/pom.xml b/pom.xml
index f2e2c6e..4a21a57 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,23 +3,22 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-parent</artifactId>
-    <version>23</version>
+    <version>25</version>
   </parent>
   <artifactId>jetty-project</artifactId>
-  <version>9.2.14-SNAPSHOT</version>
+  <version>9.3.6-SNAPSHOT</version>
   <name>Jetty :: Project</name>
   <url>http://www.eclipse.org/jetty</url>
   <packaging>pom</packaging>
   <properties>
     <jetty.url>http://www.eclipse.org/jetty</jetty.url>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <build-support-version>1.1</build-support-version>
+    <build-support-version>1.4</build-support-version>
     <slf4j-version>1.6.6</slf4j-version>
     <jetty-test-policy-version>1.2</jetty-test-policy-version>
-    <npn.api.version>1.1.1.v20141010</npn.api.version>
     <alpn.api.version>1.1.2.v20150522</alpn.api.version>
+    <jsp.version>8.0.27</jsp.version>
     <!-- default values are unsupported, but required to be defined for reactor sanity reasons -->
-    <npn.version>undefined</npn.version>
     <alpn.version>undefined</alpn.version>
   </properties>
   <scm>
@@ -33,9 +32,12 @@
     <plugins>
       <plugin>
         <artifactId>maven-compiler-plugin</artifactId>
+        <version>3.3</version>
         <configuration>
-          <source>1.7</source>
-          <target>1.7</target>
+          <source>1.8</source>
+          <target>1.8</target>
+          <testSource>1.8</testSource>
+          <testTarget>1.8</testTarget>
           <verbose>false</verbose>
         </configuration>
       </plugin>
@@ -135,8 +137,8 @@
                   <message>[ERROR] OLD MAVEN [${maven.version}] in use, Jetty ${project.version} requires Maven 3.0.0 or newer</message>
                 </requireMavenVersion>
                 <requireJavaVersion>
-                  <version>[1.7.0-40,)</version>
-                  <message>[ERROR] OLD JDK [${java.version}] in use. Jetty ${project.version} requires JDK 1.7.0_40 or newer</message>
+                  <version>[1.8.0,)</version>
+                  <message>[ERROR] OLD JDK [${java.version}] in use. Jetty ${project.version} requires JDK 1.8.0 or newer</message>
                 </requireJavaVersion>
                 <versionTxtRule implementation="org.eclipse.jetty.toolchain.enforcer.rules.VersionTxtRule" />
                 <versionOsgiRule implementation="org.eclipse.jetty.toolchain.enforcer.rules.RequireOsgiCompatibleVersionRule" />
@@ -187,7 +189,7 @@
           </execution>
         </executions>
         <configuration>
-          <targetJdk>1.7</targetJdk>
+          <targetJdk>1.8</targetJdk>
           <rulesets>
             <ruleset>jetty/pmd_logging_ruleset.xml</ruleset>
           </rulesets>
@@ -224,6 +226,8 @@
             <exclude>jetty-policy/src/main/java/org/eclipse/jetty/policy/loader/DefaultPolicyLoader.java</exclude>
             <exclude>jetty-policy/src/main/java/org/eclipse/jetty/policy/loader/PolicyFileScanner.java</exclude>
             <exclude>jetty-ant/**</exclude>
+            <exclude>jetty-infinispan/**</exclude>
+            <exclude>tests/test-sessions/test-infinispan-sessions/**</exclude>
           </excludes>
         </configuration>
         <executions>
@@ -236,6 +240,28 @@
           </execution>
         </executions>
       </plugin>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>process-classes</phase>
+            <goals>
+              <goal>manifest</goal>
+            </goals>
+           </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+         <archive>
+            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+         </archive>
+        </configuration>
+     </plugin>
+
     </plugins>
     <pluginManagement>
       <plugins>
@@ -268,7 +294,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-surefire-plugin</artifactId>
-          <version>2.17</version>
+          <version>2.18.1</version>
           <configuration>
             <argLine>-showversion -Xmx1g -Xms1g -XX:+PrintGCDetails</argLine>
             <failIfNoTests>false</failIfNoTests>
@@ -292,15 +318,20 @@
           <artifactId>maven-bundle-plugin</artifactId>
           <extensions>true</extensions>
           <configuration>
+            <supportedProjectTypes>
+              <supportedProjectType>jar</supportedProjectType>
+              <supportedProjectType>maven-plugin</supportedProjectType>
+            </supportedProjectTypes>
             <instructions>
               <Bundle-SymbolicName>${bundle-symbolic-name}</Bundle-SymbolicName>
-              <Bundle-RequiredExecutionEnvironment>JavaSE-1.7</Bundle-RequiredExecutionEnvironment>
+              <Bundle-Description>Jetty module for ${project.name}</Bundle-Description>
+              <Bundle-RequiredExecutionEnvironment>JavaSE-1.8</Bundle-RequiredExecutionEnvironment>
               <Bundle-DocURL>${jetty.url}</Bundle-DocURL>
               <Bundle-Vendor>Eclipse Jetty Project</Bundle-Vendor>
               <Bundle-Classpath>.</Bundle-Classpath>
               <Export-Package>${bundle-symbolic-name}.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"</Export-Package>
-              <Bundle-Copyright>Copyright (c) 2008-2014 Mort Bay Consulting Pty. Ltd.</Bundle-Copyright>
-              <_versionpolicy>[$(version;==;$(@)),$(version;+;$(@)))</_versionpolicy>
+              <Bundle-Copyright>Copyright (c) 2008-2015 Mort Bay Consulting Pty. Ltd.</Bundle-Copyright>
+              <Import-Package>javax.servlet*;version="[2.6.0,3.2)",javax.transaction*;version="[1.1,1.3)",org.eclipse.jetty*;version="[$(version;===;${parsedVersion.osgiVersion}),$(version;==+;${parsedVersion.osgiVersion}))",*</Import-Package>
             </instructions>
           </configuration>
         </plugin>
@@ -342,10 +373,10 @@
             <detectJavaApiLink>true</detectJavaApiLink>
             <excludePackageNames>com.acme.*;org.slf4j.*;org.mortbay.*</excludePackageNames>
             <links>
-              <link>http://docs.oracle.com/javase/7/docs/api/</link>
+              <link>http://docs.oracle.com/javase/8/docs/api/</link>
               <link>http://docs.oracle.com/javaee/7/api/</link>
+              <link>http://junit.org/javadoc/latest/</link>
               <link>http://download.eclipse.org/jetty/stable-9/apidocs/</link>
-              <link>http://junit.sourceforge.net/javadoc/</link>
             </links>
             <tags>
               <tag>
@@ -353,6 +384,56 @@
                 <placement>X</placement>
                 <head />
               </tag>
+              <tag>
+                <name>phase</name>
+                <placement>t</placement>
+                <head>Phase:</head>
+              </tag>
+              <tag>
+                <name>goal</name>
+                <placement>t</placement>
+                <head>Goal:</head>
+              </tag>
+              <tag>
+                <name>description</name>
+                <placement>a</placement>
+                <head>Description:</head>
+              </tag>
+              <tag>
+                <name>parameter</name>
+                <placement>f</placement>
+                <head>Parameter:</head>
+              </tag>
+              <tag>
+                <name>required</name>
+                <placement>f</placement>
+                <head>Required:</head>
+              </tag>
+              <tag>
+                <name>readonly</name>
+                <placement>f</placement>
+                <head>Read-Only:</head>
+              </tag>
+              <tag>
+                <name>execute</name>
+                <placement>X</placement>
+                <head />
+              </tag>
+              <tag>
+                <name>requiresDependencyResolution</name>
+                <placement>X</placement>
+                <head />
+              </tag>
+              <tag>
+                <name>requiresProject</name>
+                <placement>X</placement>
+                <head />
+              </tag>
+              <tag>
+                <name>threadSafe</name>
+                <placement>X</placement>
+                <head />
+              </tag>
             </tags>
             <header>
               <![CDATA[
@@ -373,7 +454,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-pmd-plugin</artifactId>
-          <version>2.7.1</version>
+          <version>3.4</version>
         </plugin>
       </plugins>
     </pluginManagement>
@@ -414,34 +495,23 @@
       </plugin>
     </plugins>
   </reporting>
-  <repositories>
-    <repository>
-      <snapshots>
-        <enabled>true</enabled>
-      </snapshots>
-      <id>sonatype-snapshots</id>
-      <name>Sonatype Jetty Snapshots</name>
-      <url>https://oss.sonatype.org/content/groups/jetty</url>
-    </repository>
-  </repositories>
   <modules>
     <module>jetty-ant</module>
     <module>jetty-util</module>
     <module>jetty-jmx</module>
     <module>jetty-io</module>
     <module>jetty-http</module>
+    <module>jetty-http2</module>
     <module>jetty-continuation</module>
     <module>jetty-server</module>
     <module>jetty-xml</module>
     <module>jetty-security</module>
     <module>jetty-servlet</module>
     <module>jetty-webapp</module>
-    <module>jetty-spdy</module>
     <module>jetty-fcgi</module>
     <module>jetty-websocket</module>
     <module>jetty-servlets</module>
     <module>jetty-util-ajax</module>
-    <module>jetty-jsp</module>
     <module>apache-jsp</module>
     <module>apache-jstl</module>
     <module>jetty-maven-plugin</module>
@@ -459,6 +529,8 @@
     <module>jetty-jaspi</module>
     <module>jetty-rewrite</module>
     <module>jetty-nosql</module>
+    <module>jetty-infinispan</module>
+    <module>jetty-gcloud</module>
     <module>tests</module>
     <module>examples</module>
     <module>jetty-quickstart</module>
@@ -516,106 +588,29 @@
       </dependency>
 
       <dependency>
-        <groupId>javax.servlet.jsp</groupId>
-        <artifactId>javax.servlet.jsp-api</artifactId>
-        <version>2.3.1</version>
-      </dependency>
-
-      <dependency>
-        <groupId>org.glassfish.web</groupId>
-        <artifactId>javax.servlet.jsp</artifactId>
-        <version>2.3.2</version>
-      </dependency>
-
-      <dependency>
-        <groupId>org.eclipse.jetty.toolchain</groupId>
-        <artifactId>jetty-jsp-jdt</artifactId>
-        <version>2.3.3</version>
-      </dependency>
-
-
-      <dependency>
-        <groupId>javax.el</groupId>
-        <artifactId>javax.el-api</artifactId>
-        <version>3.0.0</version>
-      </dependency>
-
-      <dependency>
-        <groupId>org.glassfish</groupId>
-        <artifactId>javax.el</artifactId>
-        <version>3.0.0</version>
-      </dependency>
-
-      <dependency>
         <groupId>org.mortbay.jasper</groupId>
         <artifactId>apache-jsp</artifactId>
-        <version>8.0.9.M3</version>
+        <version>${jsp.version}</version>
       </dependency>
 
       <dependency>
-        <groupId>org.eclipse.jetty.orbit</groupId>
-        <artifactId>org.eclipse.jdt.core</artifactId>
-       <version>3.8.2.v20130121</version>
-       <exclusions>
-          <exclusion>
-            <groupId>org.eclipse.jetty.orbit</groupId>
-            <artifactId>javax.servlet</artifactId>
-         </exclusion>
-        </exclusions>
+        <groupId>org.eclipse.jdt.core.compiler</groupId>
+        <artifactId>ecj</artifactId>
+       <version>4.4.2</version>
       </dependency>
 
     <!-- JSTL Impl -->
     <dependency>
-       <groupId>org.glassfish.web</groupId>
-       <artifactId>javax.servlet.jsp.jstl</artifactId>
-       <version>1.2.2</version>
-      <exclusions>
-        <exclusion>
-          <groupId>javax.servlet.jsp.jstl</groupId>
-          <artifactId>jstl-api</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>javax.servlet</groupId>
-          <artifactId>servlet-api</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>javax.servlet.jsp</groupId>
-          <artifactId>jsp-api</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>javax.el</groupId>
-          <artifactId>el-api</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-
-    <dependency>
       <groupId>org.apache.taglibs</groupId>
       <artifactId>taglibs-standard-impl</artifactId>
-      <version>1.2.1</version>
+      <version>1.2.5</version>
     </dependency>
 
      <!-- JSTL API -->
       <dependency>
-        <groupId>org.eclipse.jetty.orbit</groupId>
-        <artifactId>javax.servlet.jsp.jstl</artifactId>
-        <version>1.2.0.v201105211821</version>
-        <exclusions>
-          <exclusion>
-            <groupId>org.eclipse.jetty.orbit</groupId>
-            <artifactId>javax.servlet</artifactId>
-          </exclusion>
-          <exclusion>
-            <groupId>org.eclipse.jetty.orbit</groupId>
-            <artifactId>javax.servlet.jsp</artifactId>
-          </exclusion>
-        </exclusions>
-      </dependency>
-
-      <dependency>
         <groupId>org.apache.taglibs</groupId>
         <artifactId>taglibs-standard-spec</artifactId>
-        <version>1.2.1</version>
+        <version>1.2.5</version>
       </dependency>
 
 
@@ -649,7 +644,7 @@
       <dependency>
         <groupId>org.eclipse.jetty.toolchain</groupId>
         <artifactId>jetty-test-helper</artifactId>
-        <version>3.0</version>
+        <version>3.1</version>
       </dependency>
       <dependency>
         <groupId>org.eclipse.jetty.toolchain</groupId>
@@ -710,10 +705,50 @@
    -->
   <profiles>
     <profile>
+      <id>config</id>
+      <activation>
+        <file>
+          <exists>src/main/config</exists>
+        </file>
+      </activation>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-assembly-plugin</artifactId>
+            <executions>
+              <execution>
+                <phase>package</phase>
+                <goals>
+                  <goal>single</goal>
+                </goals>
+                <configuration>
+                  <descriptorRefs>
+                    <descriptorRef>config</descriptorRef>
+                  </descriptorRefs>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
       <id>eclipse-release</id>
       <modules>
         <module>aggregates/jetty-all</module>
       </modules>
+      <build>
+        <plugins>
+          <plugin>
+            <artifactId>maven-compiler-plugin</artifactId>
+            <configuration>
+              <source>1.8</source>
+              <target>1.8</target>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
     </profile>
     <profile>
       <id>ci</id>
@@ -785,40 +820,17 @@
           <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-javadoc-plugin</artifactId>
-            <configuration>
-              <excludePackageNames>com.acme</excludePackageNames>
-              <links>
-                <link>http://docs.oracle.com/javase/7/docs/api/</link>
-                <link>http://docs.oracle.com/javaee/6/api</link>
-                <link>http://junit.sourceforge.net/javadoc/</link>
-              </links>
-              <tags>
-                <tag>
-                  <name>org.apache.xbean.XBean</name>
-                  <placement>X</placement>
-                  <head />
-                </tag>
-              </tags>
-              <header>
-                <![CDATA[
-                    <script type="text/javascript">
-                      var _gaq = _gaq || [];
-                      _gaq.push(['_setAccount', 'UA-1149868-7']);
-                      _gaq.push(['_trackPageview']);
-                      (function() {
-                        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
-                        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
-                        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
-                      })();
-                   </script>
-                ]]>
-              </header>
-            </configuration>
           </plugin>
         </plugins>
       </build>
     </profile>
     <profile>
+      <id>compact3</id>
+      <modules>
+        <module>aggregates/jetty-all-compact3</module>
+      </modules>
+    </profile>
+    <profile>
       <id>api-change</id>
       <build>
         <plugins>
@@ -844,175 +856,6 @@
       </build>
     </profile>
     <profile>
-      <id>7u40</id>
-      <activation>
-        <property>
-          <name>java.version</name>
-          <value>1.7.0_40</value>
-        </property>
-      </activation>
-      <properties>
-        <npn.version>1.1.6.v20130911</npn.version>
-        <alpn.version>7.1.0.v20141016</alpn.version>
-      </properties>
-    </profile>
-    <profile>
-      <id>7u45</id>
-      <activation>
-        <property>
-          <name>java.version</name>
-          <value>1.7.0_45</value>
-        </property>
-      </activation>
-      <properties>
-        <npn.version>1.1.6.v20130911</npn.version>
-        <alpn.version>7.1.0.v20141016</alpn.version>
-      </properties>
-    </profile>
-    <profile>
-      <id>7u51</id>
-      <activation>
-        <property>
-          <name>java.version</name>
-          <value>1.7.0_51</value>
-        </property>
-      </activation>
-      <properties>
-        <npn.version>1.1.6.v20130911</npn.version>
-        <alpn.version>7.1.0.v20141016</alpn.version>
-      </properties>
-    </profile>
-    <profile>
-      <id>7u55</id>
-      <activation>
-        <property>
-          <name>java.version</name>
-          <value>1.7.0_55</value>
-        </property>
-      </activation>
-      <properties>
-        <npn.version>1.1.8.v20141013</npn.version>
-        <alpn.version>7.1.0.v20141016</alpn.version>
-      </properties>
-    </profile>
-    <profile>
-      <id>7u60</id>
-      <activation>
-        <property>
-          <name>java.version</name>
-          <value>1.7.0_60</value>
-        </property>
-      </activation>
-      <properties>
-        <npn.version>1.1.8.v20141013</npn.version>
-        <alpn.version>7.1.0.v20141016</alpn.version>
-      </properties>
-    </profile>
-    <profile>
-      <id>7u65</id>
-      <activation>
-        <property>
-          <name>java.version</name>
-          <value>1.7.0_65</value>
-        </property>
-      </activation>
-      <properties>
-        <npn.version>1.1.8.v20141013</npn.version>
-        <alpn.version>7.1.0.v20141016</alpn.version>
-      </properties>
-    </profile>
-    <profile>
-      <id>7u67</id>
-      <activation>
-        <property>
-          <name>java.version</name>
-          <value>1.7.0_67</value>
-        </property>
-      </activation>
-      <properties>
-        <npn.version>1.1.8.v20141013</npn.version>
-        <alpn.version>7.1.0.v20141016</alpn.version>
-      </properties>
-    </profile>
-    <profile>
-      <id>7u71</id>
-      <activation>
-        <property>
-          <name>java.version</name>
-          <value>1.7.0_71</value>
-        </property>
-      </activation>
-      <properties>
-        <npn.version>1.1.9.v20141016</npn.version>
-        <alpn.version>7.1.2.v20141202</alpn.version>
-      </properties>
-    </profile>
-    <profile>
-      <id>7u72</id>
-      <activation>
-        <property>
-          <name>java.version</name>
-          <value>1.7.0_72</value>
-        </property>
-      </activation>
-      <properties>
-        <npn.version>1.1.9.v20141016</npn.version>
-        <alpn.version>7.1.2.v20141202</alpn.version>
-      </properties>
-    </profile>
-    <profile>
-      <id>7u75</id>
-      <activation>
-        <property>
-          <name>java.version</name>
-          <value>1.7.0_75</value>
-        </property>
-      </activation>
-      <properties>
-        <npn.version>1.1.10.v20150130</npn.version>
-        <alpn.version>7.1.3.v20150130</alpn.version>
-      </properties>
-    </profile>
-    <profile>
-      <id>7u76</id>
-      <activation>
-        <property>
-          <name>java.version</name>
-          <value>1.7.0_76</value>
-        </property>
-      </activation>
-      <properties>
-        <npn.version>1.1.10.v20150130</npn.version>
-        <alpn.version>7.1.3.v20150130</alpn.version>
-      </properties>
-    </profile>
-    <profile>
-      <id>7u79</id>
-      <activation>
-        <property>
-          <name>java.version</name>
-          <value>1.7.0_79</value>
-        </property>
-      </activation>
-      <properties>
-        <npn.version>1.1.10.v20150130</npn.version>
-        <alpn.version>7.1.3.v20150130</alpn.version>
-      </properties>
-    </profile>
-    <profile>
-      <id>7u80</id>
-      <activation>
-        <property>
-          <name>java.version</name>
-          <value>1.7.0_80</value>
-        </property>
-      </activation>
-      <properties>
-        <npn.version>1.1.11.v20150415</npn.version>
-        <alpn.version>7.1.3.v20150130</alpn.version>
-      </properties>
-    </profile>
-    <profile>
       <id>8u00</id>
       <activation>
         <property>
@@ -1132,5 +975,18 @@
         <alpn.version>8.1.5.v20150921</alpn.version>
       </properties>
     </profile>
+
+    <profile>
+      <id>8u66</id>
+      <activation>
+        <property>
+          <name>java.version</name>
+          <value>1.8.0_66</value>
+        </property>
+      </activation>
+      <properties>
+        <alpn.version>8.1.5.v20150921</alpn.version>
+      </properties>
+    </profile>
   </profiles>
 </project>
diff --git a/tests/pom.xml b/tests/pom.xml
index 85139fa..2c918c4 100644
--- a/tests/pom.xml
+++ b/tests/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <groupId>org.eclipse.jetty.tests</groupId>
@@ -32,6 +32,13 @@
   <build>
     <plugins>
       <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-javadoc-plugin</artifactId>
+        <configuration>
+          <additionalparam>-Xdoclint:none</additionalparam>
+        </configuration>
+      </plugin>
+      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
         <configuration>
@@ -49,5 +56,6 @@
     <module>test-integration</module>
     <module>test-quickstart</module>
     <module>test-jmx</module>
+    <module>test-http-client-transport</module>
   </modules>
 </project>
diff --git a/tests/test-cdi/cdi-client/pom.xml b/tests/test-cdi/cdi-client/pom.xml
deleted file mode 100644
index 3419c3b..0000000
--- a/tests/test-cdi/cdi-client/pom.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-// ========================================================================
-// Copyright (c) Webtide LLC
-// 
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
- -->
-<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>
-    <groupId>org.eclipse.jetty.tests</groupId>
-    <artifactId>test-cdi-parent</artifactId>
-    <version>9.2.4-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>cdi-client</artifactId>
-  <packaging>jar</packaging>
-  <name>Jetty Tests :: CDI :: Clients</name>
-  <url>http://www.eclipse.org/jetty</url>
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <bundle-symbolic-name>${project.groupId}.cdi.clients</bundle-symbolic-name>
-  </properties>
-  <dependencies>
-  </dependencies>
-</project>
diff --git a/tests/test-cdi/cdi-webapp-it/pom.xml b/tests/test-cdi/cdi-webapp-it/pom.xml
deleted file mode 100644
index ac3baf2..0000000
--- a/tests/test-cdi/cdi-webapp-it/pom.xml
+++ /dev/null
@@ -1,215 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-// ========================================================================
-// Copyright (c) Webtide LLC
-// 
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
- -->
-<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>
-    <groupId>org.eclipse.jetty.tests</groupId>
-    <artifactId>test-cdi-parent</artifactId>
-    <version>9.2.4-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>cdi-webapp-it</artifactId>
-  <packaging>jar</packaging>
-  <name>Jetty Tests :: CDI :: WebApp Integration Tests</name>
-  <url>http://www.eclipse.org/jetty</url>
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-    <bundle-symbolic-name>${project.groupId}.cdi.webapp.it</bundle-symbolic-name>
-    <scripts-dir>${project.basedir}/src/test/scripts</scripts-dir>
-    <test-base-dir>${project.build.directory}/test-base</test-base-dir>
-    <test-home-dir>${project.build.directory}/test-home</test-home-dir>
-  </properties>
-  <dependencies>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-distribution</artifactId>
-      <version>${project.version}</version>
-      <type>zip</type>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty.tests</groupId>
-      <artifactId>cdi-webapp</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty.toolchain</groupId>
-      <artifactId>jetty-test-helper</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>copy-apps-for-testing</id>
-            <phase>process-test-resources</phase>
-            <goals>
-              <goal>copy-dependencies</goal>
-            </goals>
-            <configuration>
-              <includeArtifactIds>cdi-webapp</includeArtifactIds>
-              <includeScope>runtime</includeScope>
-              <includeTypes>war</includeTypes>
-              <overwriteSnapshots>true</overwriteSnapshots>
-              <overwriteReleases>true</overwriteReleases>
-              <stripVersion>true</stripVersion>
-              <outputDirectory>${test-base-dir}/webapps</outputDirectory>
-            </configuration>
-          </execution>
-          <execution>
-            <id>unpack-jetty-distro</id>
-            <phase>process-test-resources</phase>
-            <goals>
-              <goal>unpack-dependencies</goal>
-            </goals>
-            <configuration>
-              <includeArtifactIds>jetty-distribution</includeArtifactIds>
-              <includeScope>runtime</includeScope>
-              <includeTypes>zip</includeTypes>
-              <outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>
-              <outputDirectory>${test-home-dir}</outputDirectory>
-              <overWriteSnapshots>true</overWriteSnapshots>
-              <overWriteIfNewer>true</overWriteIfNewer>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.17</version>
-        <executions>
-          <execution>
-            <goals>
-              <goal>integration-test</goal>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-antrun-plugin</artifactId>
-        <version>1.7</version>
-        <executions>
-          <execution>
-            <id>start-jetty</id>
-            <phase>pre-integration-test</phase>
-            <goals>
-              <goal>run</goal>
-            </goals>
-            <configuration>
-              <target>
-                <property name="jetty.home" location="${test-home-dir}/jetty-distribution-${project.version}"/>
-                <property name="jetty.base" location="${test-base-dir}"/>
-                <echo>Integration Test : Setup Jetty</echo>
-                <exec executable="${run.command}"
-                      dir="${scripts-dir}"
-                      spawn="false">
-                  <arg value="${run.command.xtra}"/>
-                  <arg value="${setup.script}"/>
-                  <arg file="${java.home}"/>
-                  <arg file="${jetty.home}"/>
-                  <arg file="${jetty.base}"/>
-                </exec>
-
-                <echo>Integration Test : Starting Jetty ...</echo>
-                <exec executable="${run.command}"
-                      dir="${scripts-dir}"
-                      spawn="true">
-                  <arg value="${run.command.xtra}"/>
-                  <arg value="${start.script}"/>
-                  <arg file="${java.home}"/>
-                  <arg file="${jetty.home}"/>
-                  <arg file="${jetty.base}"/>
-                </exec>
-                <waitfor maxwait="5" maxwaitunit="second"
-                  checkevery="100" checkeveryunit="millisecond">
-                  <http url="http://localhost:58080/cdi-webapp/"/>
-                </waitfor>
-                <echo>Integration Test : Jetty is now available</echo>
-              </target>
-            </configuration>
-          </execution>
-          <execution>
-            <id>stop-jetty</id>
-            <phase>post-integration-test</phase>
-            <goals>
-              <goal>run</goal>
-            </goals>
-            <configuration>
-              <target>
-                <property name="jetty.home" location="${test-home-dir}/jetty-distribution-${project.version}"/>
-                <property name="jetty.base" location="${test-base-dir}"/>
-                <echo>Integration Test : Stop Jetty</echo>
-                <exec executable="${run.command}"
-                      dir="${scripts-dir}"
-                      spawn="false">
-                  <arg value="${run.command.xtra}"/>
-                  <arg value="${stop.script}"/>
-                  <arg file="${java.home}"/>
-                  <arg file="${jetty.home}"/>
-                  <arg file="${jetty.base}"/>
-                </exec>
-              </target>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-  <profiles>
-    <profile>
-      <id>it-windows</id>
-      <activation>
-        <os>
-          <family>Windows</family>
-        </os>
-      </activation>
-      <properties>
-        <run.command>cmd</run.command>
-        <run.command.xtra>/c</run.command.xtra>
-        <start.script>start-jetty.bat</start.script>
-        <stop.script>stop-jetty.bat</stop.script>
-      </properties>
-    </profile>
-    <profile>
-      <id>it-unix</id>
-      <activation>
-        <os>
-          <family>unix</family>
-        </os>
-      </activation>
-      <properties>
-        <run.command>sh</run.command>
-        <run.command.xtra>--</run.command.xtra>
-        <setup.script>setup-jetty.sh</setup.script>
-        <start.script>start-jetty.sh</start.script>
-        <stop.script>stop-jetty.sh</stop.script>
-      </properties>
-    </profile>
-  </profiles>
-</project>
diff --git a/tests/test-cdi/cdi-webapp-it/src/test/java/org/eclipse/jetty/tests/HelloIT.java b/tests/test-cdi/cdi-webapp-it/src/test/java/org/eclipse/jetty/tests/HelloIT.java
deleted file mode 100644
index dc1cd7c..0000000
--- a/tests/test-cdi/cdi-webapp-it/src/test/java/org/eclipse/jetty/tests/HelloIT.java
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.tests;
-
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
-
-import java.net.URI;
-
-import org.eclipse.jetty.toolchain.test.SimpleRequest;
-import org.junit.Test;
-
-/**
- * Basic tests for a simple @WebServlet with no CDI
- */
-public class HelloIT
-{
-    @Test
-    public void testBasic() throws Exception
-    {
-        URI serverURI = new URI("http://localhost:58080/cdi-webapp/");
-        SimpleRequest req = new SimpleRequest(serverURI);
-        assertThat(req.getString("hello"),is("Hello World"));
-    }
-}
diff --git a/tests/test-cdi/cdi-webapp-it/src/test/java/org/eclipse/jetty/tests/ServerInfoIT.java b/tests/test-cdi/cdi-webapp-it/src/test/java/org/eclipse/jetty/tests/ServerInfoIT.java
deleted file mode 100644
index 939ba80..0000000
--- a/tests/test-cdi/cdi-webapp-it/src/test/java/org/eclipse/jetty/tests/ServerInfoIT.java
+++ /dev/null
@@ -1,37 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.tests;
-
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
-
-import java.net.URI;
-
-import org.eclipse.jetty.toolchain.test.SimpleRequest;
-import org.junit.Test;
-
-public class ServerInfoIT
-{
-    @Test
-    public void testGET() throws Exception {
-        URI serverURI = new URI("http://localhost:58080/cdi-webapp/");
-        SimpleRequest req = new SimpleRequest(serverURI);
-        assertThat(req.getString("serverinfo"),is("Hello World"));
-    }
-}
diff --git a/tests/test-cdi/cdi-webapp-it/src/test/scripts/setup-jetty.sh b/tests/test-cdi/cdi-webapp-it/src/test/scripts/setup-jetty.sh
deleted file mode 100755
index c1c2ad6..0000000
--- a/tests/test-cdi/cdi-webapp-it/src/test/scripts/setup-jetty.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env bash
-
-JAVA_HOME=$1
-JETTY_HOME=$2
-JETTY_BASE=$3
-
-echo \${java.home}  : $JAVA_HOME
-echo \${jetty.home} : $JETTY_HOME
-echo \${jetty.base} : $JETTY_BASE
-
-cd "$JETTY_BASE"
-
-"$JAVA_HOME/bin/java" -jar "$JETTY_HOME/start.jar" \
-    --approve-all-licenses \
-    --add-to-start=deploy,http,annotations,cdi,logging
-
-"$JAVA_HOME/bin/java" -jar "$JETTY_HOME/start.jar" \
-    --version
-
diff --git a/tests/test-cdi/cdi-webapp-it/src/test/scripts/start-jetty.sh b/tests/test-cdi/cdi-webapp-it/src/test/scripts/start-jetty.sh
deleted file mode 100755
index 1d0f9eb..0000000
--- a/tests/test-cdi/cdi-webapp-it/src/test/scripts/start-jetty.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/env bash
-
-JAVA_HOME=$1
-JETTY_HOME=$2
-JETTY_BASE=$3
-
-echo \${java.home}  : $JAVA_HOME
-echo \${jetty.home} : $JETTY_HOME
-echo \${jetty.base} : $JETTY_BASE
-
-cd "$JETTY_BASE"
-
-"$JAVA_HOME/bin/java" -jar "$JETTY_HOME/start.jar" \
-    jetty.port=58080 \
-    STOP.PORT=58181 STOP.KEY=it
-
-
diff --git a/tests/test-cdi/cdi-webapp/pom.xml b/tests/test-cdi/cdi-webapp/pom.xml
deleted file mode 100644
index 117fe10..0000000
--- a/tests/test-cdi/cdi-webapp/pom.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  // ========================================================================
-  // Copyright (c) Webtide LLC
-  //
-  // All rights reserved. This program and the accompanying materials
-  // are made available under the terms of the Eclipse Public License v1.0
-  // and Apache License v2.0 which accompanies this distribution.
-  //
-  // The Eclipse Public License is available at
-  // http://www.eclipse.org/legal/epl-v10.html
-  //
-  // The Apache License v2.0 is available at
-  // http://www.apache.org/licenses/LICENSE-2.0.txt
-  //
-  // You may elect to redistribute this code under either of these licenses.
-  // ========================================================================
--->
-<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>
-    <groupId>org.eclipse.jetty.tests</groupId>
-    <artifactId>test-cdi-parent</artifactId>
-    <version>9.2.4-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>cdi-webapp</artifactId>
-  <packaging>war</packaging>
-  <name>Jetty Tests :: CDI :: WebApp</name>
-  <url>http://www.eclipse.org/jetty</url>
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <bundle-symbolic-name>${project.groupId}.cdi.webapp</bundle-symbolic-name>
-  </properties>
-  <dependencies>
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>javax.servlet-api</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>javax.enterprise</groupId>
-      <artifactId>cdi-api</artifactId>
-      <version>1.1</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>javax.websocket</groupId>
-      <artifactId>javax.websocket-api</artifactId>
-      <scope>provided</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <finalName>cdi-webapp</finalName>
-  </build>
-</project>
diff --git a/tests/test-cdi/pom.xml b/tests/test-cdi/pom.xml
deleted file mode 100644
index 307d8e1..0000000
--- a/tests/test-cdi/pom.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-// ========================================================================
-// Copyright (c) Webtide LLC
-// 
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-//
-// The Eclipse Public License is available at 
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// The Apache License v2.0 is available at
-// http://www.apache.org/licenses/LICENSE-2.0.txt
-//
-// You may elect to redistribute this code under either of these licenses. 
-// ========================================================================
- -->
-<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>
-    <groupId>org.eclipse.jetty.tests</groupId>
-    <artifactId>tests-parent</artifactId>
-    <version>9.2.4-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>test-cdi-parent</artifactId>
-  <packaging>pom</packaging>
-  <name>Jetty Tests :: CDI Parent</name>
-  <url>http://www.eclipse.org/jetty</url>
-  <modules>
-    <module>cdi-webapp</module>
-    <module>cdi-webapp-it</module>
-    <module>cdi-client</module>
-  </modules>
-</project>
diff --git a/tests/test-continuation/pom.xml b/tests/test-continuation/pom.xml
index 072c8fb..44611be 100644
--- a/tests/test-continuation/pom.xml
+++ b/tests/test-continuation/pom.xml
@@ -20,7 +20,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>tests-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
@@ -28,6 +28,9 @@
   <packaging>jar</packaging>
   <name>Test :: Continuation</name>
   <description>Asynchronous API</description>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.continuation</bundle-symbolic-name>
+  </properties>
   <build>
     <plugins>
       <plugin>
diff --git a/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationBase.java b/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationBase.java
deleted file mode 100644
index ec1856e..0000000
--- a/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationBase.java
+++ /dev/null
@@ -1,509 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.continuation;
-
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.not;
-import static org.hamcrest.Matchers.startsWith;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.Socket;
-import java.nio.charset.StandardCharsets;
-import java.util.Timer;
-import java.util.TimerTask;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-
-public abstract class ContinuationBase
-{
-    protected SuspendServlet _servlet=new SuspendServlet();
-    protected int _port;
-
-    protected void doNormal(String type) throws Exception
-    {
-        String response=process(null,null);
-        assertContains(type,response);
-        assertContains("NORMAL",response);
-        assertNotContains("history: onTimeout",response);
-        assertNotContains("history: onComplete",response);
-    }
-
-    protected void doSleep() throws Exception
-    {
-        String response=process("sleep=200",null);
-        assertContains("SLEPT",response);
-        assertNotContains("history: onTimeout",response);
-        assertNotContains("history: onComplete",response);
-    }
-
-    protected void doSuspend() throws Exception
-    {
-        String response=process("suspend=200",null);
-        assertContains("TIMEOUT",response);
-        assertContains("history: onTimeout",response);
-        assertContains("history: onComplete",response);
-    }
-
-    protected void doSuspendWaitResume() throws Exception
-    {
-        String response=process("suspend=200&resume=10",null);
-        assertContains("RESUMED",response);
-        assertNotContains("history: onTimeout",response);
-        assertContains("history: onComplete",response);
-    }
-
-    protected void doSuspendResume() throws Exception
-    {
-        String response=process("suspend=200&resume=0",null);
-        assertContains("RESUMED",response);
-        assertNotContains("history: onTimeout",response);
-        assertContains("history: onComplete",response);
-    }
-
-    protected void doSuspendWaitComplete() throws Exception
-    {
-        String response=process("suspend=200&complete=50",null);
-        assertContains("COMPLETED",response);
-        assertContains("history: initial",response);
-        assertNotContains("history: onTimeout",response);
-        assertContains("history: onComplete",response);
-        assertNotContains("history: !initial",response);
-    }
-
-    protected void doSuspendComplete() throws Exception
-    {
-        String response=process("suspend=200&complete=0",null);
-        assertContains("COMPLETED",response);
-        assertContains("history: initial",response);
-        assertNotContains("history: onTimeout",response);
-        assertContains("history: onComplete",response);
-        assertNotContains("history: !initial",response);
-    }
-
-    protected void doSuspendWaitResumeSuspendWaitResume() throws Exception
-    {
-        String response=process("suspend=1000&resume=10&suspend2=1000&resume2=10",null);
-        assertEquals(2,count(response,"history: suspend"));
-        assertEquals(2,count(response,"history: resume"));
-        assertEquals(0,count(response,"history: onTimeout"));
-        assertEquals(1,count(response,"history: onComplete"));
-        assertContains("RESUMED",response);
-    }
-
-    protected void doSuspendWaitResumeSuspendComplete() throws Exception
-    {
-        String response=process("suspend=1000&resume=10&suspend2=1000&complete2=10",null);
-        assertEquals(2,count(response,"history: suspend"));
-        assertEquals(1,count(response,"history: resume"));
-        assertEquals(0,count(response,"history: onTimeout"));
-        assertEquals(1,count(response,"history: onComplete"));
-        assertContains("COMPLETED",response);
-    }
-
-    protected void doSuspendWaitResumeSuspend() throws Exception
-    {
-        String response=process("suspend=1000&resume=10&suspend2=10",null);
-        assertEquals(2,count(response,"history: suspend"));
-        assertEquals(1,count(response,"history: resume"));
-        assertEquals(1,count(response,"history: onTimeout"));
-        assertEquals(1,count(response,"history: onComplete"));
-        assertContains("TIMEOUT",response);
-    }
-
-    protected void doSuspendTimeoutSuspendResume() throws Exception
-    {
-        String response=process("suspend=10&suspend2=1000&resume2=10",null);
-        assertEquals(2,count(response,"history: suspend"));
-        assertEquals(1,count(response,"history: resume"));
-        assertEquals(1,count(response,"history: onTimeout"));
-        assertEquals(1,count(response,"history: onComplete"));
-        assertContains("RESUMED",response);
-    }
-
-    protected void doSuspendTimeoutSuspendComplete() throws Exception
-    {
-        String response=process("suspend=10&suspend2=1000&complete2=10",null);
-        assertEquals(2,count(response,"history: suspend"));
-        assertEquals(0,count(response,"history: resume"));
-        assertEquals(1,count(response,"history: onTimeout"));
-        assertEquals(1,count(response,"history: onComplete"));
-        assertContains("COMPLETED",response);
-    }
-
-    protected void doSuspendTimeoutSuspend() throws Exception
-    {
-        String response=process("suspend=10&suspend2=10",null);
-        assertEquals(2,count(response,"history: suspend"));
-        assertEquals(0,count(response,"history: resume"));
-        assertEquals(2,count(response,"history: onTimeout"));
-        assertEquals(1,count(response,"history: onComplete"));
-        assertContains("TIMEOUT",response);
-    }
-
-    protected void doSuspendThrowResume() throws Exception
-    {
-        String response=process("suspend=200&resume=10&undispatch=true",null);
-        assertContains("RESUMED",response);
-        assertNotContains("history: onTimeout",response);
-        assertContains("history: onComplete",response);
-    }
-
-    protected void doSuspendResumeThrow() throws Exception
-    {
-        String response=process("suspend=200&resume=0&undispatch=true",null);
-        assertContains("RESUMED",response);
-        assertNotContains("history: onTimeout",response);
-        assertContains("history: onComplete",response);
-    }
-
-    protected void doSuspendThrowComplete() throws Exception
-    {
-        String response=process("suspend=200&complete=10&undispatch=true",null);
-        assertContains("COMPLETED",response);
-        assertNotContains("history: onTimeout",response);
-        assertContains("history: onComplete",response);
-    }
-
-    protected void doSuspendCompleteThrow() throws Exception
-    {
-        String response=process("suspend=200&complete=0&undispatch=true",null);
-        assertContains("COMPLETED",response);
-        assertNotContains("history: onTimeout",response);
-        assertContains("history: onComplete",response);
-    }
-
-
-    private int count(String responses,String substring)
-    {
-        int count=0;
-        int i=responses.indexOf(substring);
-        while (i>=0)
-        {
-            count++;
-            i=responses.indexOf(substring,i+substring.length());
-        }
-
-        return count;
-    }
-
-    protected void assertContains(String content,String response)
-    {
-        assertThat(response,startsWith("HTTP/1.1 200 OK"));
-        assertThat(response,containsString(content));
-    }
-
-    protected void assertNotContains(String content,String response)
-    {
-        assertThat(response,startsWith("HTTP/1.1 200 OK"));
-        assertThat(response,not(containsString(content)));
-    }
-
-    public synchronized String process(String query,String content) throws Exception
-    {
-        String request = "GET /";
-
-        if (query!=null)
-            request+="?"+query;
-        request+=" HTTP/1.1\r\n"+
-        "Host: localhost\r\n"+
-        "Connection: close\r\n";
-        if (content==null)
-            request+="\r\n";
-        else
-        {
-            request+="Content-Length: "+content.length()+"\r\n";
-            request+="\r\n" + content;
-        }
-
-        int port=_port;
-        String response=null;
-        try (Socket socket = new Socket("localhost",port);)
-        {
-            socket.setSoTimeout(10000);
-            socket.getOutputStream().write(request.getBytes(StandardCharsets.UTF_8));
-            socket.getOutputStream().flush();
-
-            response = toString(socket.getInputStream());
-        }
-        catch(Exception e)
-        {
-            System.err.println("failed on port "+port);
-            e.printStackTrace();
-            throw e;
-        }
-        return response;
-    }
-
-
-    protected abstract String toString(InputStream in) throws IOException;
-
-
-    private static class SuspendServlet extends HttpServlet
-    {
-        private Timer _timer=new Timer();
-
-        public SuspendServlet()
-        {}
-
-        /* ------------------------------------------------------------ */
-        @Override
-        protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
-        {
-            final Continuation continuation = ContinuationSupport.getContinuation(request);
-
-            response.addHeader("history",continuation.getClass().toString());
-
-            int read_before=0;
-            long sleep_for=-1;
-            long suspend_for=-1;
-            long suspend2_for=-1;
-            long resume_after=-1;
-            long resume2_after=-1;
-            long complete_after=-1;
-            long complete2_after=-1;
-            boolean undispatch=false;
-
-            if (request.getParameter("read")!=null)
-                read_before=Integer.parseInt(request.getParameter("read"));
-            if (request.getParameter("sleep")!=null)
-                sleep_for=Integer.parseInt(request.getParameter("sleep"));
-            if (request.getParameter("suspend")!=null)
-                suspend_for=Integer.parseInt(request.getParameter("suspend"));
-            if (request.getParameter("suspend2")!=null)
-                suspend2_for=Integer.parseInt(request.getParameter("suspend2"));
-            if (request.getParameter("resume")!=null)
-                resume_after=Integer.parseInt(request.getParameter("resume"));
-            if (request.getParameter("resume2")!=null)
-                resume2_after=Integer.parseInt(request.getParameter("resume2"));
-            if (request.getParameter("complete")!=null)
-                complete_after=Integer.parseInt(request.getParameter("complete"));
-            if (request.getParameter("complete2")!=null)
-                complete2_after=Integer.parseInt(request.getParameter("complete2"));
-            if (request.getParameter("undispatch")!=null)
-                undispatch=Boolean.parseBoolean(request.getParameter("undispatch"));
-
-            if (continuation.isInitial())
-            {
-                response.addHeader("history","initial");
-                if (read_before>0)
-                {
-                    byte[] buf=new byte[read_before];
-                    request.getInputStream().read(buf);
-                }
-                else if (read_before<0)
-                {
-                    InputStream in = request.getInputStream();
-                    int b=in.read();
-                    while(b!=-1)
-                        b=in.read();
-                }
-
-                if (suspend_for>=0)
-                {
-                    if (suspend_for>0)
-                        continuation.setTimeout(suspend_for);
-                    continuation.addContinuationListener(__listener);
-                    response.addHeader("history","suspend");
-                    continuation.suspend(response);
-
-                    if (complete_after>0)
-                    {
-                        TimerTask complete = new TimerTask()
-                        {
-                            @Override
-                            public void run()
-                            {
-                                try
-                                {
-                                    response.setStatus(200);
-                                    response.getOutputStream().println("COMPLETED\n");
-                                    continuation.complete();
-                                }
-                                catch(Exception e)
-                                {
-                                    e.printStackTrace();
-                                }
-                            }
-                        };
-                        synchronized (_timer)
-                        {
-                            _timer.schedule(complete,complete_after);
-                        }
-                    }
-                    else if (complete_after==0)
-                    {
-                        response.setStatus(200);
-                        response.getOutputStream().println("COMPLETED\n");
-                        continuation.complete();
-                    }
-                    else if (resume_after>0)
-                    {
-                        TimerTask resume = new TimerTask()
-                        {
-                            @Override
-                            public void run()
-                            {
-                                ((HttpServletResponse)continuation.getServletResponse()).addHeader("history","resume");
-                                continuation.resume();
-                            }
-                        };
-                        synchronized (_timer)
-                        {
-                            _timer.schedule(resume,resume_after);
-                        }
-                    }
-                    else if (resume_after==0)
-                    {
-                        ((HttpServletResponse)continuation.getServletResponse()).addHeader("history","resume");
-                        continuation.resume();
-                    }
-
-                    if (undispatch)
-                        continuation.undispatch();
-                }
-                else if (sleep_for>=0)
-                {
-                    try
-                    {
-                        Thread.sleep(sleep_for);
-                    }
-                    catch (InterruptedException e)
-                    {
-                        e.printStackTrace();
-                    }
-                    response.setStatus(200);
-                    response.getOutputStream().println("SLEPT\n");
-                }
-                else
-                {
-                    response.setStatus(200);
-                    response.getOutputStream().println("NORMAL\n");
-                }
-            }
-            else
-            {
-                response.addHeader("history","!initial");
-                if (suspend2_for>=0 && request.getAttribute("2nd")==null)
-                {
-                    request.setAttribute("2nd","cycle");
-
-                    if (suspend2_for>0)
-                        continuation.setTimeout(suspend2_for);
-                    // continuation.addContinuationListener(__listener);
-                    response.addHeader("history","suspend");
-                    continuation.suspend(response);
-
-                    if (complete2_after>0)
-                    {
-                        TimerTask complete = new TimerTask()
-                        {
-                            @Override
-                            public void run()
-                            {
-                                try
-                                {
-                                    response.setStatus(200);
-                                    response.getOutputStream().println("COMPLETED\n");
-                                    continuation.complete();
-                                }
-                                catch(Exception e)
-                                {
-                                    e.printStackTrace();
-                                }
-                            }
-                        };
-                        synchronized (_timer)
-                        {
-                            _timer.schedule(complete,complete2_after);
-                        }
-                    }
-                    else if (complete2_after==0)
-                    {
-                        response.setStatus(200);
-                        response.getOutputStream().println("COMPLETED\n");
-                        continuation.complete();
-                    }
-                    else if (resume2_after>0)
-                    {
-                        TimerTask resume = new TimerTask()
-                        {
-                            @Override
-                            public void run()
-                            {
-                                response.addHeader("history","resume");
-                                continuation.resume();
-                            }
-                        };
-                        synchronized (_timer)
-                        {
-                            _timer.schedule(resume,resume2_after);
-                        }
-                    }
-                    else if (resume2_after==0)
-                    {
-                        response.addHeader("history","resume");
-                        continuation.resume();
-                    }
-                    if (undispatch)
-                        continuation.undispatch();
-                    return;
-                }
-                else if (continuation.isExpired())
-                {
-                    response.setStatus(200);
-                    response.getOutputStream().println("TIMEOUT\n");
-                }
-                else if (continuation.isResumed())
-                {
-                    response.setStatus(200);
-                    response.getOutputStream().println("RESUMED\n");
-                }
-                else
-                {
-                    response.setStatus(200);
-                    response.getOutputStream().println("unknown???\n");
-                }
-            }
-        }
-    }
-
-
-    private static ContinuationListener __listener = new ContinuationListener()
-    {
-        @Override
-        public void onComplete(Continuation continuation)
-        {
-            ((HttpServletResponse)continuation.getServletResponse()).addHeader("history","onComplete");
-        }
-
-        @Override
-        public void onTimeout(Continuation continuation)
-        {
-            ((HttpServletResponse)continuation.getServletResponse()).addHeader("history","onTimeout");
-        }
-
-    };
-}
diff --git a/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationTest.java b/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationTest.java
deleted file mode 100644
index fabff90..0000000
--- a/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationTest.java
+++ /dev/null
@@ -1,203 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.continuation;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.RequestLog;
-import org.eclipse.jetty.server.Response;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.server.handler.RequestLogHandler;
-import org.eclipse.jetty.servlet.FilterHolder;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.util.IO;
-import org.eclipse.jetty.util.component.AbstractLifeCycle;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-
-public class ContinuationTest extends ContinuationBase
-{
-    protected Server _server = new Server();
-    protected ServletHandler _servletHandler;
-    protected ServerConnector _connector;
-    FilterHolder _filter;
-    protected List<String> _log = new ArrayList<String>();
-
-    @Before
-    public void setUp() throws Exception
-    {
-        _connector = new ServerConnector(_server);
-        _server.setConnectors(new Connector[]{ _connector });
-
-        _log.clear();
-        RequestLogHandler requestLogHandler = new RequestLogHandler();
-        requestLogHandler.setRequestLog(new Log());
-        _server.setHandler(requestLogHandler);
-        
-        ServletContextHandler servletContext = new ServletContextHandler(ServletContextHandler.NO_SECURITY|ServletContextHandler.NO_SESSIONS);
-        requestLogHandler.setHandler(servletContext);
-        
-        _servletHandler=servletContext.getServletHandler();
-        ServletHolder holder=new ServletHolder(_servlet);
-        holder.setAsyncSupported(true);
-        _servletHandler.addServletWithMapping(holder,"/");
-        
-        _server.start();
-        _port=_connector.getLocalPort();
-    }
-
-    @After
-    public void tearDown() throws Exception
-    {
-        Assert.assertEquals(1,_log.size());
-        Assert.assertTrue(_log.get(0).startsWith("200 "));
-        Assert.assertTrue(_log.get(0).endsWith(" /"));
-        _server.stop();
-    }
-    
-    @Test
-    public void testContinuation() throws Exception
-    {
-        doNormal("Servlet3Continuation");
-    }
-
-    @Test
-    public void testSleep() throws Exception
-    {
-        doSleep();
-    }
-
-    @Test
-    public void testSuspend() throws Exception
-    {
-        doSuspend();
-    }
-
-    @Test
-    public void testSuspendWaitResume() throws Exception
-    {
-        doSuspendWaitResume();
-    }
-
-    @Test
-    public void testSuspendResume() throws Exception
-    {
-        doSuspendResume();
-    }
-
-    @Test
-    public void testSuspendWaitComplete() throws Exception
-    {
-        doSuspendWaitComplete();
-    }
-
-    @Test
-    public void testSuspendComplete() throws Exception
-    {
-        doSuspendComplete();
-    }
-
-    @Test
-    public void testSuspendWaitResumeSuspendWaitResume() throws Exception
-    {
-        doSuspendWaitResumeSuspendWaitResume();
-    }
-
-    @Test
-    public void testSuspendWaitResumeSuspendComplete() throws Exception
-    {
-        doSuspendWaitResumeSuspendComplete();
-    }
-
-    @Test
-    public void testSuspendWaitResumeSuspend() throws Exception
-    {
-        doSuspendWaitResumeSuspend();
-    }
-
-    @Test
-    public void testSuspendTimeoutSuspendResume() throws Exception
-    {
-        doSuspendTimeoutSuspendResume();
-    }
-
-    @Test
-    public void testSuspendTimeoutSuspendComplete() throws Exception
-    {
-        doSuspendTimeoutSuspendComplete();
-    }
-
-    @Test
-    public void testSuspendTimeoutSuspend() throws Exception
-    {
-        doSuspendTimeoutSuspend();
-    }
-
-    @Test
-    public void testSuspendThrowResume() throws Exception
-    {
-        doSuspendThrowResume();
-    }
-
-    @Test
-    public void testSuspendResumeThrow() throws Exception
-    {
-        doSuspendResumeThrow();
-    }
-
-    @Test
-    public void testSuspendThrowComplete() throws Exception
-    {
-        doSuspendThrowComplete();
-    }
-
-    @Test
-    public void testSuspendCompleteThrow() throws Exception
-    {
-        doSuspendCompleteThrow();
-    }
-    
-    @Override
-    protected String toString(InputStream in) throws IOException
-    {
-        return IO.toString(in);
-    }
-    
-    class Log extends AbstractLifeCycle implements RequestLog
-    {
-        @Override
-        public void log(Request request, Response response)
-        {
-            _log.add(response.getStatus()+" "+response.getContentCount()+" "+request.getRequestURI());
-        }
-        
-    }
-}
diff --git a/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationsTest.java b/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationsTest.java
new file mode 100644
index 0000000..77070ad
--- /dev/null
+++ b/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationsTest.java
@@ -0,0 +1,655 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.continuation;
+
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.Socket;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.RequestLog;
+import org.eclipse.jetty.server.Response;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.handler.RequestLogHandler;
+import org.eclipse.jetty.servlet.FilterHolder;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.component.AbstractLifeCycle;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class ContinuationsTest
+{
+    @SuppressWarnings("serial")
+    public static class SneakyList extends ArrayList<String> {
+        @Override
+        public boolean add(String e)
+        {
+            System.err.printf("add(%s)%n",e);
+            return super.add(e);
+        }
+    };
+    
+    @Parameters(name="{0}")
+    public static List<Object[]> data()
+    {
+        List<Object[]> setup = new ArrayList<>();
+        
+        // Servlet3 / AsyncContext Setup
+        {
+            String description = "Servlet 3 Setup";
+            Class<? extends Continuation> expectedImplClass = Servlet3Continuation.class;
+            List<String> log = new ArrayList<>();
+            RequestLogHandler servlet3Setup = new RequestLogHandler();
+            servlet3Setup.setRequestLog(new Log(log));
+        
+            ServletContextHandler servletContext = new ServletContextHandler();
+            servlet3Setup.setHandler(servletContext);
+        
+            ServletHandler servletHandler=servletContext.getServletHandler();
+            List<String> history = new SneakyList();
+            Listener listener = new Listener(history);
+            ServletHolder holder=new ServletHolder(new SuspendServlet(history, listener));
+            holder.setAsyncSupported(true);
+            servletHandler.addServletWithMapping(holder, "/");
+            setup.add(new Object[]{description,servlet3Setup,history,listener,expectedImplClass,log});
+        }
+        
+        // Faux Continuations Setup
+        {
+            String description = "Faux Setup";
+            Class<? extends Continuation> expectedImplClass = FauxContinuation.class;
+            
+            // no log for this setup
+            List<String> log = null;
+            
+            ServletContextHandler fauxSetup = new ServletContextHandler();
+            ServletHandler servletHandler=fauxSetup.getServletHandler();
+            List<String> history = new SneakyList();
+            Listener listener = new Listener(history);
+            ServletHolder holder=new ServletHolder(new SuspendServlet(history, listener));
+            servletHandler.addServletWithMapping(holder,"/");
+    
+            FilterHolder filter= servletHandler.addFilterWithMapping(ContinuationFilter.class,"/*",null);
+            filter.setInitParameter("debug","true");
+            filter.setInitParameter("faux","true");
+            setup.add(new Object[]{description,fauxSetup,history,listener,expectedImplClass,log});
+        }
+        
+        return setup;
+    }
+    
+    @Parameter(0)
+    public String setupDescription;
+    
+    @Parameter(1)
+    public Handler setupHandler;
+    
+    @Parameter(2)
+    public List<String> history;
+    
+    @Parameter(3)
+    public Listener listener;
+    
+    @Parameter(4)
+    public Class<? extends Continuation> expectedImplClass;
+    
+    @Parameter(5)
+    public List<String> log;
+
+    @Test
+    public void testNormal() throws Exception
+    {
+        String response = process(null, null);
+        assertThat(response, startsWith("HTTP/1.1 200 OK"));
+        assertThat(response, containsString("NORMAL"));
+        assertThat(history, hasItem(expectedImplClass.getName()));
+        assertThat(history, not(hasItem("onTimeout")));
+        assertThat(history, not(hasItem("onComplete")));
+    }
+
+    @Test
+    public void testSleep() throws Exception
+    {
+        String response = process("sleep=200", null);
+        assertThat(response, startsWith("HTTP/1.1 200 OK"));
+        assertThat(response, containsString("SLEPT"));
+        assertThat(history, not(hasItem("onTimeout")));
+        assertThat(history, not(hasItem("onComplete")));
+    }
+
+    @Test
+    public void testSuspend() throws Exception
+    {
+        String response = process("suspend=200", null);
+        assertThat(response, startsWith("HTTP/1.1 200 OK"));
+        assertThat(response, containsString("TIMEOUT"));
+        assertThat(history, hasItem("onTimeout"));
+        assertThat(history, hasItem("onComplete"));
+    }
+
+    @Test
+    public void testSuspendWaitResume() throws Exception
+    {
+        String response = process("suspend=200&resume=10", null);
+        assertThat(response, startsWith("HTTP/1.1 200 OK"));
+        assertThat(response, containsString("RESUMED"));
+        assertThat(history, not(hasItem("onTimeout")));
+        assertThat(history, hasItem("onComplete"));
+    }
+
+    @Test
+    public void testSuspendResume() throws Exception
+    {
+        String response = process("suspend=200&resume=0", null);
+        assertThat(response, startsWith("HTTP/1.1 200 OK"));
+        assertThat(response, containsString("RESUMED"));
+        assertThat(history, not(hasItem("onTimeout")));
+        assertThat(history, hasItem("onComplete"));
+    }
+
+    @Test
+    public void testSuspendWaitComplete() throws Exception
+    {
+        String response = process("suspend=200&complete=50", null);
+        assertThat(response, startsWith("HTTP/1.1 200 OK"));
+        assertThat(response, containsString("COMPLETED"));
+        assertThat(history, hasItem("initial"));
+        assertThat(history, not(hasItem("!initial")));
+        assertThat(history, not(hasItem("onTimeout")));
+        assertThat(history, hasItem("onComplete"));
+    }
+
+    @Test
+    public void testSuspendComplete() throws Exception
+    {
+        String response = process("suspend=200&complete=0", null);
+        assertThat(response, startsWith("HTTP/1.1 200 OK"));
+        assertThat(response, containsString("COMPLETED"));
+        assertThat(history, hasItem("initial"));
+        assertThat(history, not(hasItem("!initial")));
+        assertThat(history, not(hasItem("onTimeout")));
+        assertThat(history, hasItem("onComplete"));
+    }
+
+    @Test
+    public void testSuspendWaitResumeSuspendWaitResume() throws Exception
+    {
+        String response = process("suspend=1000&resume=10&suspend2=1000&resume2=10", null);
+        assertThat(response, startsWith("HTTP/1.1 200 OK"));
+        assertThat(response, containsString("RESUMED"));
+        assertEquals(2, count(history, "suspend"));
+        assertEquals(2, count(history, "resume"));
+        assertEquals(0, count(history, "onTimeout"));
+        assertEquals(1, count(history, "onComplete"));
+    }
+
+    @Test
+    public void testSuspendWaitResumeSuspendComplete() throws Exception
+    {
+        String response = process("suspend=1000&resume=10&suspend2=1000&complete2=10", null);
+        assertThat(response, startsWith("HTTP/1.1 200 OK"));
+        assertThat(response, containsString("COMPLETED"));
+        assertEquals(2, count(history, "suspend"));
+        assertEquals(1, count(history, "resume"));
+        assertEquals(0, count(history, "onTimeout"));
+        assertEquals(1, count(history, "onComplete"));
+    }
+
+    @Test
+    public void testSuspendWaitResumeSuspend() throws Exception
+    {
+        String response = process("suspend=1000&resume=10&suspend2=10", null);
+        assertThat(response, startsWith("HTTP/1.1 200 OK"));
+        assertThat(response, containsString("TIMEOUT"));
+        assertEquals(2, count(history, "suspend"));
+        assertEquals(1, count(history, "resume"));
+        assertEquals(1, count(history, "onTimeout"));
+        assertEquals(1, count(history, "onComplete"));
+    }
+
+    @Test
+    public void testSuspendTimeoutSuspendResume() throws Exception
+    {
+        String response = process("suspend=10&suspend2=1000&resume2=10", null);
+        assertThat(response, startsWith("HTTP/1.1 200 OK"));
+        assertThat(response, containsString("RESUMED"));
+        assertEquals(2, count(history, "suspend"));
+        assertEquals(1, count(history, "resume"));
+        assertEquals(1, count(history, "onTimeout"));
+        assertEquals(1, count(history, "onComplete"));
+    }
+
+    @Test
+    public void testSuspendTimeoutSuspendComplete() throws Exception
+    {
+        String response = process("suspend=10&suspend2=1000&complete2=10", null);
+        assertThat(response, startsWith("HTTP/1.1 200 OK"));
+        assertThat(response, containsString("COMPLETED"));
+        assertEquals(2, count(history, "suspend"));
+        assertEquals(0, count(history, "resume"));
+        assertEquals(1, count(history, "onTimeout"));
+        assertEquals(1, count(history, "onComplete"));
+    }
+
+    @Test
+    public void testSuspendTimeoutSuspend() throws Exception
+    {
+        String response = process("suspend=10&suspend2=10", null);
+        assertThat(response, startsWith("HTTP/1.1 200 OK"));
+        assertThat(response, containsString("TIMEOUT"));
+        assertEquals(2, count(history, "suspend"));
+        assertEquals(0, count(history, "resume"));
+        assertEquals(2, count(history, "onTimeout"));
+        assertEquals(1, count(history, "onComplete"));
+    }
+
+    @Test
+    public void testSuspendThrowResume() throws Exception
+    {
+        String response = process("suspend=200&resume=10&undispatch=true", null);
+        assertThat(response, startsWith("HTTP/1.1 200 OK"));
+        assertThat(response, containsString("RESUMED"));
+        assertThat(history, not(hasItem("onTimeout")));
+        assertThat(history, hasItem("onComplete"));
+    }
+
+    @Test
+    public void testSuspendResumeThrow() throws Exception
+    {
+        String response = process("suspend=200&resume=0&undispatch=true", null);
+        assertThat(response, startsWith("HTTP/1.1 200 OK"));
+        assertThat(response, containsString("RESUMED"));
+        assertThat(history, not(hasItem("onTimeout")));
+        assertThat(history, hasItem("onComplete"));
+    }
+
+    @Test
+    public void testSuspendThrowComplete() throws Exception
+    {
+        String response = process("suspend=200&complete=10&undispatch=true", null);
+        assertThat(response, startsWith("HTTP/1.1 200 OK"));
+        assertThat(response, containsString("COMPLETED"));
+        assertThat(history, not(hasItem("onTimeout")));
+        assertThat(history, hasItem("onComplete"));
+    }
+
+    @Test
+    public void testSuspendCompleteThrow() throws Exception
+    {
+        String response = process("suspend=200&complete=0&undispatch=true", null);
+        assertThat(response, startsWith("HTTP/1.1 200 OK"));
+        assertThat(response, containsString("COMPLETED"));
+        assertThat(history, not(hasItem("onTimeout")));
+        assertThat(history, hasItem("onComplete"));
+    }
+
+    private long count(List<String> history, String value)
+    {
+        return history.stream()
+                .filter(value::equals)
+                .count();
+    }
+
+    private String process(String query, String content) throws Exception
+    {
+        Server server = new Server();
+        
+        try {
+            ServerConnector connector = new ServerConnector(server);
+            server.addConnector(connector);
+            if(log != null) {
+                log.clear();
+            }
+            history.clear();
+            server.setHandler(this.setupHandler);
+        
+            server.start();
+            int port=connector.getLocalPort();
+            
+            StringBuilder request = new StringBuilder("GET /");
+    
+            if (query != null)
+                request.append("?").append(query);
+    
+            request.append(" HTTP/1.1\r\n")
+                    .append("Host: localhost\r\n")
+                    .append("Connection: close\r\n");
+    
+            if (content == null)
+            {
+                request.append("\r\n");
+            }
+            else
+            {
+                request.append("Content-Length: ").append(content.length()).append("\r\n");
+                request.append("\r\n").append(content);
+            }
+    
+            try (Socket socket = new Socket("localhost", port))
+            {
+                socket.setSoTimeout(10000);
+                socket.getOutputStream().write(request.toString().getBytes(StandardCharsets.UTF_8));
+                socket.getOutputStream().flush();
+                return toString(socket.getInputStream());
+            }
+        } finally {
+            server.stop();
+            
+            if (log != null)
+            {
+                assertThat("Log.size", log.size(),is(1));
+                String entry = log.get(0);
+                assertThat("Log entry", entry, startsWith("200 "));
+                assertThat("Log entry", entry, endsWith(" /"));
+            }
+        }
+    }
+
+    protected String toString(InputStream in) throws IOException
+    {
+        return IO.toString(in);
+    }
+
+    @SuppressWarnings("serial")
+    private static class SuspendServlet extends HttpServlet
+    {
+        private final Timer _timer = new Timer();
+        private final List<String> history;
+        private final ContinuationListener listener;
+
+        public SuspendServlet(List<String> history, ContinuationListener listener)
+        {
+            this.history = history;
+            this.listener = listener;
+        }
+
+        @Override
+        protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
+        {
+            final Continuation continuation = ContinuationSupport.getContinuation(request);
+
+            history.add(continuation.getClass().getName());
+
+            int read_before = 0;
+            long sleep_for = -1;
+            long suspend_for = -1;
+            long suspend2_for = -1;
+            long resume_after = -1;
+            long resume2_after = -1;
+            long complete_after = -1;
+            long complete2_after = -1;
+            boolean undispatch = false;
+
+            if (request.getParameter("read") != null)
+                read_before = Integer.parseInt(request.getParameter("read"));
+            if (request.getParameter("sleep") != null)
+                sleep_for = Integer.parseInt(request.getParameter("sleep"));
+            if (request.getParameter("suspend") != null)
+                suspend_for = Integer.parseInt(request.getParameter("suspend"));
+            if (request.getParameter("suspend2") != null)
+                suspend2_for = Integer.parseInt(request.getParameter("suspend2"));
+            if (request.getParameter("resume") != null)
+                resume_after = Integer.parseInt(request.getParameter("resume"));
+            if (request.getParameter("resume2") != null)
+                resume2_after = Integer.parseInt(request.getParameter("resume2"));
+            if (request.getParameter("complete") != null)
+                complete_after = Integer.parseInt(request.getParameter("complete"));
+            if (request.getParameter("complete2") != null)
+                complete2_after = Integer.parseInt(request.getParameter("complete2"));
+            if (request.getParameter("undispatch") != null)
+                undispatch = Boolean.parseBoolean(request.getParameter("undispatch"));
+
+            if (continuation.isInitial())
+            {
+                history.add("initial");
+                if (read_before > 0)
+                {
+                    byte[] buf = new byte[read_before];
+                    request.getInputStream().read(buf);
+                }
+                else if (read_before < 0)
+                {
+                    InputStream in = request.getInputStream();
+                    int b = in.read();
+                    while (b != -1)
+                        b = in.read();
+                }
+
+                if (suspend_for >= 0)
+                {
+                    if (suspend_for > 0)
+                        continuation.setTimeout(suspend_for);
+                    continuation.addContinuationListener(listener);
+                    history.add("suspend");
+                    continuation.suspend(response);
+
+                    if (complete_after > 0)
+                    {
+                        TimerTask complete = new TimerTask()
+                        {
+                            @Override
+                            public void run()
+                            {
+                                try
+                                {
+                                    response.setStatus(200);
+                                    response.getOutputStream().println("COMPLETED");
+                                    continuation.complete();
+                                }
+                                catch (Exception e)
+                                {
+                                    e.printStackTrace();
+                                }
+                            }
+                        };
+                        _timer.schedule(complete, complete_after);
+                    }
+                    else if (complete_after == 0)
+                    {
+                        response.setStatus(200);
+                        response.getOutputStream().println("COMPLETED");
+                        continuation.complete();
+                    }
+                    else if (resume_after > 0)
+                    {
+                        TimerTask resume = new TimerTask()
+                        {
+                            @Override
+                            public void run()
+                            {
+                                history.add("resume");
+                                continuation.resume();
+                            }
+                        };
+                        _timer.schedule(resume, resume_after);
+                    }
+                    else if (resume_after == 0)
+                    {
+                        history.add("resume");
+                        continuation.resume();
+                    }
+
+                    if (undispatch)
+                    {
+                        continuation.undispatch();
+                    }
+                }
+                else if (sleep_for >= 0)
+                {
+                    try
+                    {
+                        Thread.sleep(sleep_for);
+                    }
+                    catch (InterruptedException e)
+                    {
+                        e.printStackTrace();
+                    }
+                    response.setStatus(200);
+                    response.getOutputStream().println("SLEPT");
+                }
+                else
+                {
+                    response.setStatus(200);
+                    response.getOutputStream().println("NORMAL");
+                }
+            }
+            else
+            {
+                history.add("!initial");
+                if (suspend2_for >= 0 && request.getAttribute("2nd") == null)
+                {
+                    request.setAttribute("2nd", "cycle");
+
+                    if (suspend2_for > 0)
+                        continuation.setTimeout(suspend2_for);
+
+                    history.add("suspend");
+                    continuation.suspend(response);
+
+                    if (complete2_after > 0)
+                    {
+                        TimerTask complete = new TimerTask()
+                        {
+                            @Override
+                            public void run()
+                            {
+                                try
+                                {
+                                    response.setStatus(200);
+                                    response.getOutputStream().println("COMPLETED");
+                                    continuation.complete();
+                                }
+                                catch (Exception e)
+                                {
+                                    e.printStackTrace();
+                                }
+                            }
+                        };
+                        _timer.schedule(complete, complete2_after);
+                    }
+                    else if (complete2_after == 0)
+                    {
+                        response.setStatus(200);
+                        response.getOutputStream().println("COMPLETED");
+                        continuation.complete();
+                    }
+                    else if (resume2_after > 0)
+                    {
+                        TimerTask resume = new TimerTask()
+                        {
+                            @Override
+                            public void run()
+                            {
+                                history.add("resume");
+                                continuation.resume();
+                            }
+                        };
+                        _timer.schedule(resume, resume2_after);
+                    }
+                    else if (resume2_after == 0)
+                    {
+                        history.add("resume");
+                        continuation.resume();
+                    }
+
+                    if (undispatch)
+                    {
+                        continuation.undispatch();
+                    }
+                }
+                else if (continuation.isExpired())
+                {
+                    response.setStatus(200);
+                    response.getOutputStream().println("TIMEOUT");
+                }
+                else if (continuation.isResumed())
+                {
+                    response.setStatus(200);
+                    response.getOutputStream().println("RESUMED");
+                }
+                else
+                {
+                    response.setStatus(200);
+                    response.getOutputStream().println("UNKNOWN");
+                }
+            }
+        }
+    }
+
+    private static class Listener implements ContinuationListener
+    {
+        private final List<String> history;
+
+        public Listener(List<String> history)
+        {
+            this.history = history;
+        }
+
+        @Override
+        public void onComplete(Continuation continuation)
+        {
+            history.add("onComplete");
+        }
+
+        @Override
+        public void onTimeout(Continuation continuation)
+        {
+            history.add("onTimeout");
+        }
+    }
+    
+    public static class Log extends AbstractLifeCycle implements RequestLog
+    {
+        private final List<String> log;
+        
+        public Log(List<String> log) {
+            this.log = log;
+        }
+        
+        @Override
+        public void log(Request request, Response response)
+        {
+            int status = response.getCommittedMetaData().getStatus();
+            long written = response.getHttpChannel().getBytesWritten();
+            log.add(status+" "+written+" "+request.getRequestURI());
+        }
+    }
+}
diff --git a/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/FauxContinuationTest.java b/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/FauxContinuationTest.java
deleted file mode 100644
index 10242e6..0000000
--- a/tests/test-continuation/src/test/java/org/eclipse/jetty/continuation/FauxContinuationTest.java
+++ /dev/null
@@ -1,156 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.continuation;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.servlet.FilterHolder;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.util.IO;
-
-
-public class FauxContinuationTest extends ContinuationBase
-{
-    protected Server _server = new Server();
-    protected ServletHandler _servletHandler;
-    protected ServerConnector _connector;
-    FilterHolder _filter;
-
-    protected void setUp() throws Exception
-    {
-        _connector = new ServerConnector(_server);
-        _server.setConnectors(new Connector[]{ _connector });
-        ServletContextHandler servletContext = new ServletContextHandler(ServletContextHandler.NO_SECURITY|ServletContextHandler.NO_SESSIONS);
-        _server.setHandler(servletContext);
-        _servletHandler=servletContext.getServletHandler();
-        ServletHolder holder=new ServletHolder(_servlet);
-        _servletHandler.addServletWithMapping(holder,"/");
-        
-        _filter=_servletHandler.addFilterWithMapping(ContinuationFilter.class,"/*",null);
-        _filter.setInitParameter("debug","true");
-        _filter.setInitParameter("faux","true");
-        _server.start();
-        _port=_connector.getLocalPort();
-        
-    }
-
-    protected void tearDown() throws Exception
-    {
-        _server.stop();
-    }
-
-    public void testContinuation() throws Exception
-    {
-        doNormal("FauxContinuation");
-    }
-    
-    public void testSleep() throws Exception
-    {
-        doSleep();
-    }
-
-    public void testSuspend() throws Exception
-    {
-        doSuspend();
-    }
-
-    public void testSuspendWaitResume() throws Exception
-    {
-        doSuspendWaitResume();
-    }
-
-    public void testSuspendResume() throws Exception
-    {
-        doSuspendResume();
-    }
-
-    public void testSuspendWaitComplete() throws Exception
-    {
-        doSuspendWaitComplete();
-    }
-
-    public void testSuspendComplete() throws Exception
-    {
-        doSuspendComplete();
-    }
-
-    public void testSuspendWaitResumeSuspendWaitResume() throws Exception
-    {
-        doSuspendWaitResumeSuspendWaitResume();
-    }
-    
-    public void testSuspendWaitResumeSuspendComplete() throws Exception
-    {
-        doSuspendWaitResumeSuspendComplete();
-    }
-
-    public void testSuspendWaitResumeSuspend() throws Exception
-    {
-        doSuspendWaitResumeSuspend();
-    }
-
-    public void testSuspendTimeoutSuspendResume() throws Exception
-    {
-        doSuspendTimeoutSuspendResume();
-    }
-
-    public void testSuspendTimeoutSuspendComplete() throws Exception
-    {
-        doSuspendTimeoutSuspendComplete();
-    }
-
-    public void testSuspendTimeoutSuspend() throws Exception
-    {
-        doSuspendTimeoutSuspend();
-    }
-
-    public void testSuspendThrowResume() throws Exception
-    {
-        doSuspendThrowResume();
-    }
-
-    public void testSuspendResumeThrow() throws Exception
-    {
-        doSuspendResumeThrow();
-    }
-
-    public void testSuspendThrowComplete() throws Exception
-    {
-        doSuspendThrowComplete();
-    }
-
-    public void testSuspendCompleteThrow() throws Exception
-    {
-        doSuspendCompleteThrow();
-    }
-    
-    
-    
-    protected String toString(InputStream in) throws IOException
-    {
-        return IO.toString(in);
-    }
-    
-}
diff --git a/tests/test-continuation/src/test/resources/jetty-logging.properties b/tests/test-continuation/src/test/resources/jetty-logging.properties
new file mode 100644
index 0000000..d1e0e0c
--- /dev/null
+++ b/tests/test-continuation/src/test/resources/jetty-logging.properties
@@ -0,0 +1,3 @@
+org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
+org.eclipse.jetty.LEVEL=WARN
+# org.eclipse.jetty.server.LEVEL=DEBUG
diff --git a/tests/test-http-client-transport/pom.xml b/tests/test-http-client-transport/pom.xml
new file mode 100644
index 0000000..2b0e61b
--- /dev/null
+++ b/tests/test-http-client-transport/pom.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+        <groupId>org.eclipse.jetty.tests</groupId>
+        <artifactId>tests-parent</artifactId>
+        <version>9.3.6-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>test-http-client-transport</artifactId>
+    <packaging>jar</packaging>
+    <name>Test :: HTTP Client Transports</name>
+
+    <properties>
+        <bundle-symbolic-name>${project.groupId}.client.http</bundle-symbolic-name>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>copy</goal>
+                        </goals>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>org.mortbay.jetty.alpn</groupId>
+                                    <artifactId>alpn-boot</artifactId>
+                                    <version>${alpn.version}</version>
+                                    <type>jar</type>
+                                    <overWrite>false</overWrite>
+                                    <outputDirectory>${project.build.directory}/alpn</outputDirectory>
+                                </artifactItem>
+                            </artifactItems>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <argLine>-Xbootclasspath/p:${project.build.directory}/alpn/alpn-boot-${alpn.version}.jar</argLine>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <configuration>
+                    <!-- DO NOT DEPLOY (or Release) -->
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-server</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-client</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty.http2</groupId>
+            <artifactId>http2-server</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-alpn-server</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty.http2</groupId>
+            <artifactId>http2-http-client-transport</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty.fcgi</groupId>
+            <artifactId>fcgi-server</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty.toolchain</groupId>
+            <artifactId>jetty-test-helper</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/AbstractTest.java b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/AbstractTest.java
new file mode 100644
index 0000000..bebe9bb
--- /dev/null
+++ b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/AbstractTest.java
@@ -0,0 +1,213 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http.client;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.HttpClientTransport;
+import org.eclipse.jetty.client.http.HttpClientTransportOverHTTP;
+import org.eclipse.jetty.fcgi.client.http.HttpClientTransportOverFCGI;
+import org.eclipse.jetty.fcgi.server.ServerFCGIConnectionFactory;
+import org.eclipse.jetty.http2.HTTP2Cipher;
+import org.eclipse.jetty.http2.client.HTTP2Client;
+import org.eclipse.jetty.http2.client.http.HttpClientTransportOverHTTP2;
+import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory;
+import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
+import org.eclipse.jetty.server.ConnectionFactory;
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.SecureRequestCustomizer;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.SslConnectionFactory;
+import org.eclipse.jetty.toolchain.test.TestTracker;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.junit.After;
+import org.junit.Rule;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public abstract class AbstractTest
+{
+    @Parameterized.Parameters(name = "transport: {0}")
+    public static Object[] parameters() throws Exception
+    {
+        return Transport.values();
+    }
+
+    @Rule
+    public final TestTracker tracker = new TestTracker();
+
+    protected final Transport transport;
+    protected SslContextFactory sslContextFactory;
+    protected Server server;
+    protected ServerConnector connector;
+    protected HttpClient client;
+
+    public AbstractTest(Transport transport)
+    {
+        this.transport = transport;
+    }
+
+    public void start(Handler handler) throws Exception
+    {
+        sslContextFactory = new SslContextFactory();
+        sslContextFactory.setKeyStorePath("src/test/resources/keystore.jks");
+        sslContextFactory.setKeyStorePassword("storepwd");
+        sslContextFactory.setTrustStorePath("src/test/resources/truststore.jks");
+        sslContextFactory.setTrustStorePassword("storepwd");
+        sslContextFactory.setUseCipherSuitesOrder(true);
+        sslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR);
+        startServer(handler);
+        startClient();
+    }
+
+    private void startServer(Handler handler) throws Exception
+    {
+        QueuedThreadPool serverThreads = new QueuedThreadPool();
+        serverThreads.setName("server");
+        server = new Server(serverThreads);
+        connector = new ServerConnector(server, provideServerConnectionFactory(transport));
+        server.addConnector(connector);
+        server.setHandler(handler);
+        server.start();
+    }
+
+    private void startClient() throws Exception
+    {
+        QueuedThreadPool clientThreads = new QueuedThreadPool();
+        clientThreads.setName("client");
+        client = new HttpClient(provideClientTransport(transport), sslContextFactory);
+        client.setExecutor(clientThreads);
+        client.start();
+    }
+
+    private ConnectionFactory[] provideServerConnectionFactory(Transport transport)
+    {
+        List<ConnectionFactory> result = new ArrayList<>();
+        switch (transport)
+        {
+            case HTTP:
+            {
+                result.add(new HttpConnectionFactory(new HttpConfiguration()));
+                break;
+            }
+            case HTTPS:
+            {
+                HttpConfiguration configuration = new HttpConfiguration();
+                configuration.addCustomizer(new SecureRequestCustomizer());
+                HttpConnectionFactory http = new HttpConnectionFactory(configuration);
+                SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory, http.getProtocol());
+                result.add(ssl);
+                result.add(http);
+                break;
+            }
+            case H2C:
+            {
+                result.add(new HTTP2CServerConnectionFactory(new HttpConfiguration()));
+                break;
+            }
+            case H2:
+            {
+                HttpConfiguration configuration = new HttpConfiguration();
+                configuration.addCustomizer(new SecureRequestCustomizer());
+                HTTP2ServerConnectionFactory h2 = new HTTP2ServerConnectionFactory(configuration);
+                ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory("h2");
+                SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory, alpn.getProtocol());
+                result.add(ssl);
+                result.add(alpn);
+                result.add(h2);
+                break;
+            }
+            case FCGI:
+            {
+                result.add(new ServerFCGIConnectionFactory(new HttpConfiguration()));
+                break;
+            }
+            default:
+            {
+                throw new IllegalArgumentException();
+            }
+        }
+        return result.toArray(new ConnectionFactory[result.size()]);
+    }
+
+    private HttpClientTransport provideClientTransport(Transport transport)
+    {
+        switch (transport)
+        {
+            case HTTP:
+            case HTTPS:
+            {
+                return new HttpClientTransportOverHTTP(1);
+            }
+            case H2C:
+            case H2:
+            {
+                HTTP2Client http2Client = new HTTP2Client();
+                http2Client.setSelectors(1);
+                return new HttpClientTransportOverHTTP2(http2Client);
+            }
+            case FCGI:
+            {
+                return new HttpClientTransportOverFCGI(1, false, "");
+            }
+            default:
+            {
+                throw new IllegalArgumentException();
+            }
+        }
+    }
+
+    protected String newURI()
+    {
+        switch (transport)
+        {
+            case HTTP:
+            case H2C:
+            case FCGI:
+                return "http://localhost:" + connector.getLocalPort();
+            case HTTPS:
+            case H2:
+                return "https://localhost:" + connector.getLocalPort();
+            default:
+                throw new IllegalArgumentException();
+        }
+    }
+
+    @After
+    public void stop() throws Exception
+    {
+        if (client != null)
+            client.stop();
+        if (server != null)
+            server.stop();
+    }
+
+    protected enum Transport
+    {
+        HTTP, HTTPS, H2C, H2, FCGI
+    }
+}
diff --git a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/AsyncRequestContentTest.java b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/AsyncRequestContentTest.java
new file mode 100644
index 0000000..052c902
--- /dev/null
+++ b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/AsyncRequestContentTest.java
@@ -0,0 +1,191 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http.client;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.client.util.DeferredContentProvider;
+import org.eclipse.jetty.client.util.InputStreamContentProvider;
+import org.eclipse.jetty.client.util.OutputStreamContentProvider;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class AsyncRequestContentTest extends AbstractTest
+{
+    public AsyncRequestContentTest(Transport transport)
+    {
+        super(transport);
+    }
+
+    @Test
+    public void testEmptyDeferredContent() throws Exception
+    {
+        start(new ConsumeInputHandler());
+
+        DeferredContentProvider contentProvider = new DeferredContentProvider();
+        CountDownLatch latch = new CountDownLatch(1);
+        client.POST(newURI())
+                .content(contentProvider)
+                .send(result ->
+                {
+                    if (result.isSucceeded() &&
+                            result.getResponse().getStatus() == HttpStatus.OK_200)
+                        latch.countDown();
+                });
+        contentProvider.close();
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testDeferredContent() throws Exception
+    {
+        start(new ConsumeInputHandler());
+
+        DeferredContentProvider contentProvider = new DeferredContentProvider();
+        CountDownLatch latch = new CountDownLatch(1);
+        client.POST(newURI())
+                .content(contentProvider)
+                .send(result ->
+                {
+                    if (result.isSucceeded() &&
+                            result.getResponse().getStatus() == HttpStatus.OK_200)
+                        latch.countDown();
+                });
+        contentProvider.offer(ByteBuffer.wrap(new byte[1]));
+        contentProvider.close();
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testEmptyInputStream() throws Exception
+    {
+        start(new ConsumeInputHandler());
+
+        InputStreamContentProvider contentProvider =
+                new InputStreamContentProvider(new ByteArrayInputStream(new byte[0]));
+        CountDownLatch latch = new CountDownLatch(1);
+        client.POST(newURI())
+                .content(contentProvider)
+                .send(result ->
+                {
+                    if (result.isSucceeded() &&
+                            result.getResponse().getStatus() == HttpStatus.OK_200)
+                        latch.countDown();
+                });
+        contentProvider.close();
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testInputStream() throws Exception
+    {
+        start(new ConsumeInputHandler());
+
+        InputStreamContentProvider contentProvider =
+                new InputStreamContentProvider(new ByteArrayInputStream(new byte[1]));
+        CountDownLatch latch = new CountDownLatch(1);
+        client.POST(newURI())
+                .content(contentProvider)
+                .send(result ->
+                {
+                    if (result.isSucceeded() &&
+                            result.getResponse().getStatus() == HttpStatus.OK_200)
+                        latch.countDown();
+                });
+        contentProvider.close();
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testEmptyOutputStream() throws Exception
+    {
+        start(new ConsumeInputHandler());
+
+        OutputStreamContentProvider contentProvider = new OutputStreamContentProvider();
+        CountDownLatch latch = new CountDownLatch(1);
+        client.POST(newURI())
+                .content(contentProvider)
+                .send(result ->
+                {
+                    if (result.isSucceeded() &&
+                            result.getResponse().getStatus() == HttpStatus.OK_200)
+                        latch.countDown();
+                });
+        contentProvider.close();
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void testOutputStream() throws Exception
+    {
+        start(new ConsumeInputHandler());
+
+        OutputStreamContentProvider contentProvider = new OutputStreamContentProvider();
+        CountDownLatch latch = new CountDownLatch(1);
+        client.POST(newURI())
+                .content(contentProvider)
+                .send(result ->
+                {
+                    if (result.isSucceeded() &&
+                            result.getResponse().getStatus() == HttpStatus.OK_200)
+                        latch.countDown();
+                });
+        OutputStream output = contentProvider.getOutputStream();
+        output.write(new byte[1]);
+        output.flush();
+        contentProvider.close();
+
+        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
+    }
+
+    private static class ConsumeInputHandler extends AbstractHandler
+    {
+        @Override
+        public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+        {
+            baseRequest.setHandled(true);
+            ServletInputStream input = request.getInputStream();
+            while (true)
+            {
+                int read = input.read();
+                if (read < 0)
+                    break;
+            }
+            response.setStatus(HttpStatus.OK_200);
+        }
+    }
+}
diff --git a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientConnectTimeoutTest.java b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientConnectTimeoutTest.java
new file mode 100644
index 0000000..bd018c2
--- /dev/null
+++ b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientConnectTimeoutTest.java
@@ -0,0 +1,170 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http.client;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.net.SocketTimeoutException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.eclipse.jetty.client.api.Request;
+import org.eclipse.jetty.client.api.Response;
+import org.eclipse.jetty.client.api.Result;
+import org.junit.Assert;
+import org.junit.Assume;
+import org.junit.Ignore;
+import org.junit.Test;
+
+// TODO: these tests seems to fail spuriously, figure out why.
+@Ignore
+public class HttpClientConnectTimeoutTest extends AbstractTest
+{
+    public HttpClientConnectTimeoutTest(Transport transport)
+    {
+        super(transport);
+    }
+
+    @Test
+    public void testConnectTimeout() throws Exception
+    {
+        final String host = "10.255.255.1";
+        final int port = 80;
+        int connectTimeout = 1000;
+        assumeConnectTimeout(host, port, connectTimeout);
+
+        start(null);
+        client.stop();
+        client.setConnectTimeout(connectTimeout);
+        client.start();
+
+        final CountDownLatch latch = new CountDownLatch(1);
+        Request request = client.newRequest(host, port);
+        request.send(new Response.CompleteListener()
+        {
+            @Override
+            public void onComplete(Result result)
+            {
+                if (result.isFailed())
+                    latch.countDown();
+            }
+        });
+
+        Assert.assertTrue(latch.await(2 * connectTimeout, TimeUnit.MILLISECONDS));
+        Assert.assertNotNull(request.getAbortCause());
+    }
+
+    @Test
+    public void testConnectTimeoutIsCancelledByShorterRequestTimeout() throws Exception
+    {
+        String host = "10.255.255.1";
+        int port = 80;
+        int connectTimeout = 2000;
+        assumeConnectTimeout(host, port, connectTimeout);
+
+        start(null);
+        client.stop();
+        client.setConnectTimeout(connectTimeout);
+        client.start();
+
+        final AtomicInteger completes = new AtomicInteger();
+        final CountDownLatch latch = new CountDownLatch(2);
+        Request request = client.newRequest(host, port);
+        request.timeout(connectTimeout / 2, TimeUnit.MILLISECONDS)
+                .send(new Response.CompleteListener()
+                {
+                    @Override
+                    public void onComplete(Result result)
+                    {
+                        completes.incrementAndGet();
+                        latch.countDown();
+                    }
+                });
+
+        Assert.assertFalse(latch.await(2 * connectTimeout, TimeUnit.MILLISECONDS));
+        Assert.assertEquals(1, completes.get());
+        Assert.assertNotNull(request.getAbortCause());
+    }
+
+    @Test
+    public void retryAfterConnectTimeout() throws Exception
+    {
+        final String host = "10.255.255.1";
+        final int port = 80;
+        int connectTimeout = 1000;
+        assumeConnectTimeout(host, port, connectTimeout);
+
+        start(null);
+        client.stop();
+        client.setConnectTimeout(connectTimeout);
+        client.start();
+
+        final CountDownLatch latch = new CountDownLatch(1);
+        Request request = client.newRequest(host, port);
+        request.send(new Response.CompleteListener()
+        {
+            @Override
+            public void onComplete(Result result)
+            {
+                if (result.isFailed())
+                {
+                    // Retry
+                    client.newRequest(host, port).send(new Response.CompleteListener()
+                    {
+                        @Override
+                        public void onComplete(Result result)
+                        {
+                            if (result.isFailed())
+                                latch.countDown();
+                        }
+                    });
+                }
+            }
+        });
+
+        Assert.assertTrue(latch.await(3 * connectTimeout, TimeUnit.MILLISECONDS));
+        Assert.assertNotNull(request.getAbortCause());
+    }
+
+    private void assumeConnectTimeout(String host, int port, int connectTimeout) throws IOException
+    {
+        try (Socket socket = new Socket())
+        {
+            // Try to connect to a private address in the 10.x.y.z range.
+            // These addresses are usually not routed, so an attempt to
+            // connect to them will hang the connection attempt, which is
+            // what we want to simulate in this test.
+            socket.connect(new InetSocketAddress(host, port), connectTimeout);
+            // Abort the test if we can connect.
+            Assume.assumeTrue(false);
+        }
+        catch (SocketTimeoutException x)
+        {
+            // Expected timeout during connect, continue the test.
+            Assume.assumeTrue(true);
+        }
+        catch (Throwable x)
+        {
+            // Abort if any other exception happens.
+            Assume.assumeTrue(false);
+        }
+    }
+}
diff --git a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientIdleTimeoutTest.java b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientIdleTimeoutTest.java
new file mode 100644
index 0000000..e168a0f
--- /dev/null
+++ b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientIdleTimeoutTest.java
@@ -0,0 +1,96 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http.client;
+
+import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class HttpClientIdleTimeoutTest extends AbstractTest
+{
+    private long idleTimeout = 1000;
+
+    public HttpClientIdleTimeoutTest(Transport transport)
+    {
+        super(transport);
+    }
+
+    @Test
+    public void testClientIdleTimeout() throws Exception
+    {
+        start(new AbstractHandler()
+        {
+            @Override
+            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+            {
+                baseRequest.setHandled(true);
+                AsyncContext asyncContext = request.startAsync();
+                asyncContext.setTimeout(0);
+            }
+        });
+        client.stop();
+        client.setIdleTimeout(idleTimeout);
+        client.start();
+
+        final CountDownLatch latch = new CountDownLatch(1);
+        client.newRequest(newURI()).send(result ->
+        {
+            if (result.isFailed())
+                latch.countDown();
+        });
+
+        Assert.assertTrue(latch.await(2 * idleTimeout, TimeUnit.MILLISECONDS));
+    }
+
+    @Test
+    public void testRequestIdleTimeout() throws Exception
+    {
+        start(new AbstractHandler()
+        {
+            @Override
+            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+            {
+                baseRequest.setHandled(true);
+                AsyncContext asyncContext = request.startAsync();
+                asyncContext.setTimeout(0);
+            }
+        });
+
+        final CountDownLatch latch = new CountDownLatch(1);
+        client.newRequest(newURI())
+                .idleTimeout(idleTimeout, TimeUnit.MILLISECONDS)
+                .send(result ->
+                {
+                    if (result.isFailed())
+                        latch.countDown();
+                });
+
+        Assert.assertTrue(latch.await(2 * idleTimeout, TimeUnit.MILLISECONDS));
+    }
+}
diff --git a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientTest.java b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientTest.java
new file mode 100644
index 0000000..5a17404
--- /dev/null
+++ b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientTest.java
@@ -0,0 +1,253 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.http.client;
+
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.IntStream;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.client.util.BytesContentProvider;
+import org.eclipse.jetty.client.util.FutureResponseListener;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class HttpClientTest extends AbstractTest
+{
+    public HttpClientTest(Transport transport)
+    {
+        super(transport);
+    }
+
+    @Test
+    public void testRequestWithoutResponseContent() throws Exception
+    {
+        final int status = HttpStatus.NO_CONTENT_204;
+        start(new AbstractHandler()
+        {
+            @Override
+            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+            {
+                baseRequest.setHandled(true);
+                response.setStatus(status);
+            }
+        });
+
+        ContentResponse response = client.newRequest(newURI())
+                .timeout(5, TimeUnit.SECONDS)
+                .send();
+
+        Assert.assertEquals(status, response.getStatus());
+        Assert.assertEquals(0, response.getContent().length);
+    }
+
+    @Test
+    public void testRequestWithSmallResponseContent() throws Exception
+    {
+        testRequestWithResponseContent(1024);
+    }
+
+    @Test
+    public void testRequestWithLargeResponseContent() throws Exception
+    {
+        testRequestWithResponseContent(1024 * 1024);
+    }
+
+    private void testRequestWithResponseContent(int length) throws Exception
+    {
+        final byte[] bytes = new byte[length];
+        new Random().nextBytes(bytes);
+        start(new AbstractHandler()
+        {
+            @Override
+            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+            {
+                baseRequest.setHandled(true);
+                response.setContentLength(length);
+                response.getOutputStream().write(bytes);
+            }
+        });
+
+        org.eclipse.jetty.client.api.Request request = client.newRequest(newURI());
+        FutureResponseListener listener = new FutureResponseListener(request, length);
+        request.timeout(10, TimeUnit.SECONDS).send(listener);
+        ContentResponse response = listener.get();
+
+        Assert.assertEquals(200, response.getStatus());
+        Assert.assertArrayEquals(bytes, response.getContent());
+    }
+
+    @Test
+    public void testRequestWithSmallResponseContentChunked() throws Exception
+    {
+        testRequestWithResponseContentChunked(512);
+    }
+
+    @Test
+    public void testRequestWithLargeResponseContentChunked() throws Exception
+    {
+        testRequestWithResponseContentChunked(512 * 512);
+    }
+
+    private void testRequestWithResponseContentChunked(int length) throws Exception
+    {
+        final byte[] chunk1 = new byte[length];
+        final byte[] chunk2 = new byte[length];
+        Random random = new Random();
+        random.nextBytes(chunk1);
+        random.nextBytes(chunk2);
+        byte[] bytes = new byte[chunk1.length + chunk2.length];
+        System.arraycopy(chunk1, 0, bytes, 0, chunk1.length);
+        System.arraycopy(chunk2, 0, bytes, chunk1.length, chunk2.length);
+        start(new AbstractHandler()
+        {
+            @Override
+            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+            {
+                baseRequest.setHandled(true);
+                ServletOutputStream output = response.getOutputStream();
+                output.write(chunk1);
+                output.flush();
+                output.write(chunk2);
+            }
+        });
+
+        org.eclipse.jetty.client.api.Request request = client.newRequest(newURI());
+        FutureResponseListener listener = new FutureResponseListener(request, 2 * length);
+        request.timeout(10, TimeUnit.SECONDS).send(listener);
+        ContentResponse response = listener.get();
+
+        Assert.assertEquals(200, response.getStatus());
+        Assert.assertArrayEquals(bytes, response.getContent());
+    }
+
+    @Test
+    public void testUploadZeroLengthWithoutResponseContent() throws Exception
+    {
+        testUploadWithoutResponseContent(0);
+    }
+
+    @Test
+    public void testUploadSmallWithoutResponseContent() throws Exception
+    {
+        testUploadWithoutResponseContent(1024);
+    }
+
+    @Test
+    public void testUploadLargeWithoutResponseContent() throws Exception
+    {
+        testUploadWithoutResponseContent(1024 * 1024);
+    }
+
+    private void testUploadWithoutResponseContent(int length) throws Exception
+    {
+        final byte[] bytes = new byte[length];
+        new Random().nextBytes(bytes);
+        start(new AbstractHandler()
+        {
+            @Override
+            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+            {
+                baseRequest.setHandled(true);
+                ServletInputStream input = request.getInputStream();
+                for (int i = 0; i < bytes.length; ++i)
+                    Assert.assertEquals(bytes[i] & 0xFF, input.read());
+                Assert.assertEquals(-1, input.read());
+            }
+        });
+
+        ContentResponse response = client.newRequest(newURI())
+                .method(HttpMethod.POST)
+                .content(new BytesContentProvider(bytes))
+                .timeout(15, TimeUnit.SECONDS)
+                .send();
+
+        Assert.assertEquals(200, response.getStatus());
+        Assert.assertEquals(0, response.getContent().length);
+    }
+
+    @Test
+    public void testClientManyWritesSlowServer() throws Exception
+    {
+        start(new AbstractHandler()
+        {
+            @Override
+            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+            {
+                baseRequest.setHandled(true);
+
+                long sleep = 1024;
+                long total = 0;
+                ServletInputStream input = request.getInputStream();
+                byte[] buffer = new byte[1024];
+                while (true)
+                {
+                    int read = input.read(buffer);
+                    if (read < 0)
+                        break;
+                    total += read;
+                    if (total >= sleep)
+                    {
+                        sleep(250);
+                        sleep += 256;
+                    }
+                }
+
+                response.getOutputStream().print(total);
+            }
+        });
+
+        int chunks = 256;
+        int chunkSize = 16;
+        byte[][] bytes = IntStream.range(0, chunks).mapToObj(x -> new byte[chunkSize]).toArray(byte[][]::new);
+        BytesContentProvider contentProvider = new BytesContentProvider("application/octet-stream", bytes);
+        ContentResponse response = client.newRequest(newURI())
+                .method(HttpMethod.POST)
+                .content(contentProvider)
+                .timeout(15, TimeUnit.SECONDS)
+                .send();
+
+        Assert.assertEquals(HttpStatus.OK_200, response.getStatus());
+        Assert.assertEquals(chunks * chunkSize, Integer.parseInt(response.getContentAsString()));
+    }
+
+    private void sleep(long time) throws IOException
+    {
+        try
+        {
+            Thread.sleep(time);
+        }
+        catch (InterruptedException x)
+        {
+            throw new InterruptedIOException();
+        }
+    }
+}
diff --git a/tests/test-http-client-transport/src/test/resources/jetty-logging.properties b/tests/test-http-client-transport/src/test/resources/jetty-logging.properties
new file mode 100644
index 0000000..607ee96
--- /dev/null
+++ b/tests/test-http-client-transport/src/test/resources/jetty-logging.properties
@@ -0,0 +1,6 @@
+org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
+#org.eclipse.jetty.LEVEL=DEBUG
+#org.eclipse.jetty.client.LEVEL=DEBUG
+#org.eclipse.jetty.http2.LEVEL=DEBUG
+org.eclipse.jetty.http2.hpack.LEVEL=INFO
+#org.eclipse.jetty.http2.client.LEVEL=DEBUG
diff --git a/jetty-spdy/spdy-http-client-transport/src/test/resources/keystore.jks b/tests/test-http-client-transport/src/test/resources/keystore.jks
similarity index 100%
rename from jetty-spdy/spdy-http-client-transport/src/test/resources/keystore.jks
rename to tests/test-http-client-transport/src/test/resources/keystore.jks
Binary files differ
diff --git a/jetty-spdy/spdy-http-client-transport/src/test/resources/truststore.jks b/tests/test-http-client-transport/src/test/resources/truststore.jks
similarity index 100%
rename from jetty-spdy/spdy-http-client-transport/src/test/resources/truststore.jks
rename to tests/test-http-client-transport/src/test/resources/truststore.jks
Binary files differ
diff --git a/tests/test-integration/pom.xml b/tests/test-integration/pom.xml
index b6908ff..f8e8312 100644
--- a/tests/test-integration/pom.xml
+++ b/tests/test-integration/pom.xml
@@ -20,7 +20,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>tests-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>test-integration</artifactId>
@@ -31,6 +31,8 @@
     <test-wars-dir>${project.build.directory}/test-wars</test-wars-dir>
     <test-libs-dir>${project.build.directory}/test-libs</test-libs-dir>
     <test-dist-dir>${project.build.directory}/test-dist</test-dist-dir>
+    <bundle-symbolic-name>${project.groupId}.integrations</bundle-symbolic-name>
+
   </properties>
   <build>
     <plugins>
@@ -117,13 +119,20 @@
       <type>pom</type>
     </dependency>
     <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-http</artifactId>
+      <version>${project.version}</version>
+      <classifier>tests</classifier>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>org.eclipse.jetty.toolchain</groupId>
       <artifactId>jetty-test-helper</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-jsp</artifactId>
+      <artifactId>apache-jsp</artifactId>
       <version>${project.version}</version>
     </dependency>
     <dependency>
@@ -133,5 +142,17 @@
       <type>war</type>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.alpn</groupId>
+      <artifactId>alpn-api</artifactId>
+      <version>${alpn.api.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-alpn-server</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 </project>
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/DefaultHandlerTest.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/DefaultHandlerTest.java
index 50e7048..fef0b31 100644
--- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/DefaultHandlerTest.java
+++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/DefaultHandlerTest.java
@@ -18,7 +18,8 @@
 
 package org.eclipse.jetty.test;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
@@ -26,7 +27,6 @@
 import java.net.Socket;
 import java.net.URL;
 import java.net.URLConnection;
-import java.util.List;
 
 import org.eclipse.jetty.http.HttpScheme;
 import org.eclipse.jetty.http.HttpStatus;
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/HttpInputIntegrationTest.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/HttpInputIntegrationTest.java
new file mode 100644
index 0000000..a6b1d10
--- /dev/null
+++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/HttpInputIntegrationTest.java
@@ -0,0 +1,718 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.test;
+
+import static org.hamcrest.Matchers.startsWith;
+import static org.junit.Assert.assertThat;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.Inet4Address;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.net.ssl.SSLSocket;
+import javax.servlet.AsyncContext;
+import javax.servlet.ReadListener;
+import javax.servlet.ServletException;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.HttpChannelState;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.LocalConnector;
+import org.eclipse.jetty.server.LocalConnector.LocalEndPoint;
+import org.eclipse.jetty.server.NetworkConnector;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.SecureRequestCustomizer;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.SslConnectionFactory;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.hamcrest.Matchers;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class HttpInputIntegrationTest
+{
+    
+    enum Mode { BLOCKING, ASYNC_DISPATCHED, ASYNC_OTHER_DISPATCHED, ASYNC_OTHER_WAIT }
+    public final static String EOF = "__EOF__";
+    public final static String DELAY = "__DELAY__";
+    public final static String ABORT = "__ABORT__";
+    
+    private static Server __server;
+    private static HttpConfiguration __config;
+    private static HttpConfiguration __sslConfig;
+    private static SslContextFactory __sslContextFactory;
+    
+    @BeforeClass
+    public static void beforeClass() throws Exception
+    {
+        __config = new HttpConfiguration();
+        
+        __server = new Server();
+        LocalConnector local=new LocalConnector(__server,new HttpConnectionFactory(__config));
+        local.setIdleTimeout(4000);
+        __server.addConnector(local);
+        
+        ServerConnector http = new ServerConnector(__server,new HttpConnectionFactory(__config),new HTTP2CServerConnectionFactory(__config));
+        http.setIdleTimeout(4000);
+        __server.addConnector(http);
+        
+
+        // SSL Context Factory for HTTPS and HTTP/2
+        String jetty_distro = System.getProperty("jetty.distro","../../jetty-distribution/target/distribution");
+        __sslContextFactory = new SslContextFactory();
+        __sslContextFactory.setKeyStorePath(jetty_distro + "/../../../jetty-server/src/test/config/etc/keystore");
+        __sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
+        __sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
+
+        // HTTPS Configuration
+        __sslConfig = new HttpConfiguration(__config);
+        __sslConfig.addCustomizer(new SecureRequestCustomizer());
+
+        // HTTP/1 Connection Factory
+        HttpConnectionFactory h1=new HttpConnectionFactory(__sslConfig);
+        /* TODO
+        // HTTP/2 Connection Factory
+        HTTP2ServerConnectionFactory h2 = new HTTP2ServerConnectionFactory(__sslConfig);
+        
+        NegotiatingServerConnectionFactory.checkProtocolNegotiationAvailable();
+        ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory();
+        alpn.setDefaultProtocol(h1.getProtocol());
+        */
+        
+        // SSL Connection Factory
+        SslConnectionFactory ssl = new SslConnectionFactory(__sslContextFactory,h1.getProtocol() /*TODO alpn.getProtocol()*/);
+        
+        // HTTP/2 Connector
+        ServerConnector http2 = new ServerConnector(__server,ssl,/*TODO alpn,h2,*/ h1);
+        http2.setIdleTimeout(4000);
+        __server.addConnector(http2);
+        
+        
+        ServletContextHandler context = new ServletContextHandler(__server,"/ctx");
+        ServletHolder holder = new ServletHolder(new TestServlet());
+        holder.setAsyncSupported(true);
+        context.addServlet(holder,"/*");
+        
+        
+        
+        __server.start();
+    }
+    
+    @AfterClass
+    public static void afterClass() throws Exception
+    {
+        __server.stop();
+    }
+    
+    interface TestClient
+    {        
+        /* ------------------------------------------------------------ */
+        /**
+         * @param uri The URI to test, typically /ctx/test?mode=THE_MODE
+         * @param delayMs the delay in MS to use.
+         * @param delayInFrame If null, send the request with no delays, if FALSE then send with delays between frames, if TRUE send with delays within frames
+         * @param contentLength The content length header to send.
+         * @param content The content to send, with each string to be converted to a chunk or a frame 
+         * @return The response received in HTTP/1 format
+         * @throws Exception
+         */
+        String send(String uri,int delayMs, Boolean delayInFrame, int contentLength, List<String> content) throws Exception; 
+    }
+
+    @Parameterized.Parameters
+    public static Collection<Object[]> data()
+    {
+        List<Object[]> tests = new ArrayList<>();
+        
+
+        // TODO other client types!
+        // test with the following clients/protocols:
+        //   + Local
+        //   + HTTP/1
+        //   + SSL + HTTP/1
+        //   + HTTP/2
+        //   + SSL + HTTP/2
+        //   + FASTCGI
+        for (Class<? extends TestClient> client : new Class[]{LocalClient.class,H1Client.class,H1SClient.class})
+        {
+
+            // test async actions that are run:
+            //   + By a thread in a container callback
+            //   + By another thread while a container callback is active
+            //   + By another thread while no container callback is active
+            for (Mode mode: Mode.values())
+            {
+
+                // test servlet dispatch with:
+                //   + Delayed dispatch on
+                //   + Delayed dispatch off
+                for (Boolean dispatch : new Boolean[]{false,true})
+                {
+                    // test send with 
+                    //   + No delays between frames
+                    //   + Delays between frames
+                    //   + Delays within frames!
+                    for (Boolean delayWithinFrame : new Boolean[]{null,false,true})
+                    {
+                        // test content 
+                        // + unknown length + EOF
+                        // + unknown length + content + EOF
+                        // + unknown length + content + content + EOF
+                        
+                        // + known length + EOF
+                        // + known length + content + EOF
+                        // + known length + content + content + EOF
+                        
+                        tests.add(new Object[]{tests.size(),client,mode,dispatch,delayWithinFrame,200,0,-1,new String[]{}});
+                        tests.add(new Object[]{tests.size(),client,mode,dispatch,delayWithinFrame,200,8,-1,new String[]{"content0"}});
+                        tests.add(new Object[]{tests.size(),client,mode,dispatch,delayWithinFrame,200,16,-1,new String[]{"content0","CONTENT1"}});
+                        
+                        tests.add(new Object[]{tests.size(),client,mode,dispatch,delayWithinFrame,200,0,0,new String[]{}});
+                        tests.add(new Object[]{tests.size(),client,mode,dispatch,delayWithinFrame,200,8,8,new String[]{"content0"}});
+                        tests.add(new Object[]{tests.size(),client,mode,dispatch,delayWithinFrame,200,16,16,new String[]{"content0","CONTENT1"}});
+                        
+                    }
+                }
+            }
+        }
+        return tests;
+    }
+    
+
+    final int _id;
+    final Class<? extends TestClient> _client;
+    final Mode _mode;
+    final Boolean _delay;
+    final int _status;
+    final int _read;
+    final int _length;
+    final List<String> _send;
+    
+    public HttpInputIntegrationTest(int id,Class<? extends TestClient> client, Mode mode,boolean dispatch,Boolean delay,int status,int read,int length,String... send)
+    {
+        _id=id;
+        _client=client;
+        _mode=mode;
+        __config.setDelayDispatchUntilContent(dispatch);
+        _delay=delay;
+        _status=status;
+        _read=read;
+        _length=length;
+        _send = Arrays.asList(send);
+    }
+    
+    
+    private static void runmode(Mode mode,final Request request, final Runnable test)
+    {
+        switch(mode)
+        {
+            case ASYNC_DISPATCHED:
+            {
+                test.run();
+                break;
+            }   
+            case ASYNC_OTHER_DISPATCHED:
+            {
+                final CountDownLatch latch = new CountDownLatch(1);
+                new Thread()
+                {
+                    @Override
+                    public void run()
+                    {
+                        try
+                        {
+                            test.run();
+                        }
+                        finally
+                        {
+                            latch.countDown();
+                        }
+                    }
+                }.start();
+                // prevent caller returning until other thread complete
+                try
+                {
+                    if (!latch.await(5,TimeUnit.SECONDS))
+                        Assert.fail();
+                }
+                catch(Exception e)
+                {
+                    Assert.fail();
+                }
+                break;
+            }   
+            case ASYNC_OTHER_WAIT:
+            {
+                final CountDownLatch latch = new CountDownLatch(1);
+                final HttpChannelState.State S=request.getHttpChannelState().getState();
+                new Thread()
+                {
+                    @Override
+                    public void run()
+                    {
+                        try
+                        {
+                            if (!latch.await(5,TimeUnit.SECONDS))
+                                Assert.fail();
+                            
+                            // Spin until state change
+                            HttpChannelState.State s=request.getHttpChannelState().getState();
+                            while(request.getHttpChannelState().getState()==S )
+                            {
+                                Thread.yield();
+                                s=request.getHttpChannelState().getState();
+                            }
+                            test.run();
+                        }
+                        catch (Exception e)
+                        {
+                            e.printStackTrace();
+                        }
+                    }
+                }.start();
+                // ensure other thread running before trying to return
+                latch.countDown();
+                break;
+            }
+                
+            default:
+                throw new IllegalStateException();
+        }
+        
+    }
+    
+    @Test
+    public void testOne() throws Exception
+    {
+        System.err.printf("[%d] TEST   c=%s, m=%s, delayDispatch=%b delayInFrame=%s content-length:%d expect=%d read=%d content:%s%n",_id,_client.getSimpleName(),_mode,__config.isDelayDispatchUntilContent(),_delay,_length,_status,_read,_send);
+
+        TestClient client=_client.newInstance();
+        String response = client.send("/ctx/test?mode="+_mode,50,_delay,_length,_send);
+        
+        int sum=0;
+        for (String s:_send)
+            for (char c : s.toCharArray())
+                sum+=c;
+        
+        assertThat(response,startsWith("HTTP"));
+        assertThat(response,Matchers.containsString(" "+_status+" "));
+        assertThat(response,Matchers.containsString("read="+_read));
+        assertThat(response,Matchers.containsString("sum="+sum));
+    }
+    
+    @Test
+    public void testStress() throws Exception
+    {
+        System.err.printf("[%d] STRESS c=%s, m=%s, delayDispatch=%b delayInFrame=%s content-length:%d expect=%d read=%d content:%s%n",_id,_client.getSimpleName(),_mode,__config.isDelayDispatchUntilContent(),_delay,_length,_status,_read,_send);
+
+        int sum=0;
+        for (String s:_send)
+            for (char c : s.toCharArray())
+                sum+=c;
+        final int summation=sum;
+        
+        
+        final int threads=10;
+        final int loops=10;
+        
+        final AtomicInteger count = new AtomicInteger(0);
+        Thread[] t = new Thread[threads];
+        
+        Runnable run = new Runnable()
+        {
+            @Override 
+            public void run()
+            {
+                try
+                {
+                    TestClient client=_client.newInstance();
+                    for (int j=0;j<loops;j++)
+                    {
+                        String response = client.send("/ctx/test?mode="+_mode,10,_delay,_length,_send);
+                        assertThat(response,startsWith("HTTP"));
+                        assertThat(response,Matchers.containsString(" "+_status+" "));
+                        assertThat(response,Matchers.containsString("read="+_read));
+                        assertThat(response,Matchers.containsString("sum="+summation));
+                        count.incrementAndGet();
+                    }
+                }
+                catch(Exception e)
+                {
+                    e.printStackTrace();
+                }
+            }
+        };
+        
+        for (int i=0;i<threads;i++)
+        {
+            t[i]=new Thread(run);
+            t[i].start();
+        }
+        for (int i=0;i<threads;i++)
+            t[i].join();
+        
+        assertThat(count.get(),Matchers.is(threads*loops));
+    }
+    
+    
+    public static class TestServlet extends HttpServlet
+    {
+        String expected ="content0CONTENT1";
+        
+        @Override
+        protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException
+        {
+            final Mode mode = Mode.valueOf(req.getParameter("mode"));
+            resp.setContentType("text/plain");
+                        
+            if (mode==Mode.BLOCKING)
+            {
+                try
+                {
+                    String content = IO.toString(req.getInputStream());
+                    resp.setStatus(200);
+                    resp.setContentType("text/plain");
+                    resp.getWriter().println("read="+content.length());
+                    int sum = 0;
+                    for (char c:content.toCharArray())
+                        sum+=c;
+                    resp.getWriter().println("sum="+sum);
+                }
+                catch(Exception e)
+                {
+                    e.printStackTrace();
+                    resp.setStatus(500);
+                    resp.getWriter().println("read="+e);
+                    resp.getWriter().println("sum=-1");
+                }
+            }
+            else
+            {
+                // we are asynchronous
+                final AsyncContext context = req.startAsync();
+                context.setTimeout(10000);
+                final ServletInputStream in = req.getInputStream();
+                final Request request = Request.getBaseRequest(req);
+                final AtomicInteger read = new AtomicInteger(0);
+                final AtomicInteger sum = new AtomicInteger(0);
+
+                runmode(mode,request,new Runnable()
+                {
+                    @Override
+                    public void run()
+                    {
+                        in.setReadListener(new ReadListener()
+                        {
+                            @Override
+                            public void onError(Throwable t)
+                            {
+                                t.printStackTrace();
+                                try
+                                {
+                                    resp.sendError(500);
+                                }
+                                catch (IOException e)
+                                {
+                                    e.printStackTrace();
+                                    throw new RuntimeException(e);
+                                }
+                                context.complete();
+                            }
+
+                            @Override
+                            public void onDataAvailable() throws IOException
+                            {
+                                runmode(mode,request,new Runnable()
+                                {
+                                    @Override
+                                    public void run()
+                                    {
+                                        while(in.isReady() && !in.isFinished())
+                                        {
+                                            try
+                                            {
+                                                int b = in.read();
+                                                if (b<0)
+                                                    return;
+                                                sum.addAndGet(b);
+                                                int i=read.getAndIncrement();
+                                                if (b!=expected.charAt(i))
+                                                {
+                                                    System.err.printf("XXX '%c'!='%c' at %d%n",expected.charAt(i),(char)b,i);
+                                                    System.err.println("    "+request.getHttpChannel());
+                                                    System.err.println("    "+request.getHttpChannel().getHttpTransport());
+                                                }
+                                                
+                                            }
+                                            catch (IOException e)
+                                            {
+                                                onError(e);
+                                            }
+                                        }
+                                    }
+                                });
+                            }
+
+                            @Override
+                            public void onAllDataRead() throws IOException
+                            {
+                                resp.setStatus(200);
+                                resp.setContentType("text/plain");
+                                resp.getWriter().println("read="+read.get());
+                                resp.getWriter().println("sum="+sum.get());
+                                context.complete();
+                            }
+                        });
+                    }
+                });
+            }
+        }
+    }
+    
+
+    public static class LocalClient implements TestClient
+    {
+        StringBuilder flushed = new StringBuilder();
+        @Override
+        public String send(String uri,int delayMs, Boolean delayInFrame,int contentLength, List<String> content) throws Exception
+        {
+            LocalConnector connector = __server.getBean(LocalConnector.class);
+
+            StringBuilder buffer = new StringBuilder();
+            buffer.append("GET ").append(uri).append(" HTTP/1.1\r\n");
+            buffer.append("Host: localhost\r\n");
+            buffer.append("Connection: close\r\n");
+
+            LocalEndPoint local = connector.executeRequest("");
+            
+            flush(local,buffer,delayMs,delayInFrame,true);
+
+            boolean chunked=contentLength<0;
+            if (chunked)
+                buffer.append("Transfer-Encoding: chunked\r\n");
+            else
+                buffer.append("Content-Length: ").append(contentLength).append("\r\n");
+
+            if (contentLength>0)
+                buffer.append("Content-Type: text/plain\r\n");
+            buffer.append("\r\n");
+
+            flush(local,buffer,delayMs,delayInFrame,false);
+
+            for (String c : content)
+            {
+                if (chunked)
+                {
+                    buffer.append(Integer.toHexString(c.length())).append("\r\n");
+                    flush(local,buffer,delayMs,delayInFrame,true);
+                }
+
+                buffer.append(c.substring(0,1));
+                flush(local,buffer,delayMs,delayInFrame,true);
+                buffer.append(c.substring(1));
+                if (chunked)
+                    buffer.append("\r\n"); 
+                flush(local,buffer,delayMs,delayInFrame,false);
+            }
+
+            if (chunked)
+            {
+                buffer.append("0");
+                flush(local,buffer,delayMs,delayInFrame,true);
+                buffer.append("\r\n\r\n");
+            }
+
+            flush(local,buffer);
+            local.waitUntilClosed();
+            return local.takeOutputString();
+        }
+          
+
+        private void flush(LocalEndPoint local, StringBuilder buffer,int delayMs, Boolean delayInFrame, boolean inFrame) throws Exception
+        {
+            // Flush now if we should delay
+            if (delayInFrame!=null && delayInFrame.equals(inFrame))
+            {
+                flush(local,buffer);
+                Thread.sleep(delayMs);
+            }
+        }
+        
+        private void flush(final LocalEndPoint local, StringBuilder buffer) throws Exception
+        {
+            final String flush=buffer.toString();
+            buffer.setLength(0);
+            flushed.append(flush);
+            local.addInputAndExecute(BufferUtil.toBuffer(flush));
+        }
+
+    }
+
+    public static class H1Client implements TestClient
+    {
+        NetworkConnector _connector;
+
+        public H1Client()
+        {
+            for (Connector c:__server.getConnectors())
+            {
+                if (c instanceof NetworkConnector && c.getDefaultConnectionFactory().getProtocol().equals(HttpVersion.HTTP_1_1.asString()))
+                {
+                    _connector=(NetworkConnector)c;
+                    break;
+                }
+            }
+        }
+
+        @Override
+        public String send(String uri, int delayMs, Boolean delayInFrame,int contentLength, List<String> content) throws Exception
+        {
+            int port=_connector.getLocalPort();
+            
+            try (Socket client = newSocket("localhost", port))
+            {
+                client.setSoTimeout(5000);
+                client.setTcpNoDelay(true);
+                client.setSoLinger(true,1);
+                OutputStream out = client.getOutputStream();
+
+                StringBuilder buffer = new StringBuilder();
+                buffer.append("GET ").append(uri).append(" HTTP/1.1\r\n");
+                buffer.append("Host: localhost:").append(port).append("\r\n");
+                buffer.append("Connection: close\r\n");
+
+                flush(out,buffer,delayMs,delayInFrame,true);
+
+                boolean chunked=contentLength<0;
+                if (chunked)
+                    buffer.append("Transfer-Encoding: chunked\r\n");
+                else
+                    buffer.append("Content-Length: ").append(contentLength).append("\r\n");
+                    
+                if (contentLength>0)
+                    buffer.append("Content-Type: text/plain\r\n");
+                buffer.append("\r\n");
+
+                flush(out,buffer,delayMs,delayInFrame,false);
+                
+                for (String c : content)
+                {
+                    if (chunked)
+                    {
+                        buffer.append(Integer.toHexString(c.length())).append("\r\n");
+                       flush(out,buffer,delayMs,delayInFrame,true);
+                    }
+                    
+                    buffer.append(c.substring(0,1));
+                    flush(out,buffer,delayMs,delayInFrame,true);
+                    buffer.append(c.substring(1));
+                    flush(out,buffer,delayMs,delayInFrame,false);
+                    if (chunked)
+                        buffer.append("\r\n"); 
+                }
+
+                if (chunked)
+                {
+                    buffer.append("0");
+                    flush(out,buffer,delayMs,delayInFrame,true);
+                    buffer.append("\r\n\r\n");
+                }
+                
+                flush(out,buffer);
+                
+                return IO.toString(client.getInputStream());
+            }
+            
+        }
+
+        private void flush(OutputStream out, StringBuilder buffer, int delayMs, Boolean delayInFrame, boolean inFrame) throws Exception
+        {
+            // Flush now if we should delay
+            if (delayInFrame!=null && delayInFrame.equals(inFrame))
+            {
+                flush(out,buffer);
+                Thread.sleep(delayMs);
+            }
+        }
+        
+        private void flush(OutputStream out, StringBuilder buffer) throws Exception
+        {
+            String flush=buffer.toString();
+            buffer.setLength(0);
+            out.write(flush.getBytes(StandardCharsets.ISO_8859_1));
+            out.flush();
+        }
+
+        public Socket newSocket(String host, int port) throws IOException
+        {
+            return new Socket(host, port);
+        }
+    }
+    
+    public static class H1SClient extends H1Client
+    {
+        public H1SClient()
+        {
+            for (Connector c:__server.getConnectors())
+            {
+                if (c instanceof NetworkConnector && c.getDefaultConnectionFactory().getProtocol().equals("SSL"))
+                {
+                    _connector=(NetworkConnector)c;
+                    break;
+                }
+            }
+        }
+
+        public Socket newSocket(String host, int port) throws IOException
+        {
+            SSLSocket socket = __sslContextFactory.newSslSocket();
+            socket.connect(new InetSocketAddress(Inet4Address.getByName(host),port));
+            return socket;
+        }
+    }
+
+    
+}
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/FakeJspServlet.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/FakeJspServlet.java
index 051437f..67fdcf0 100644
--- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/FakeJspServlet.java
+++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/FakeJspServlet.java
@@ -20,7 +20,6 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.net.URISyntaxException;
 import java.net.URL;
 
 import javax.servlet.ServletException;
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/JspAndDefaultWithAliasesTest.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/JspAndDefaultWithAliasesTest.java
index be58d21..8c5ce6e 100644
--- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/JspAndDefaultWithAliasesTest.java
+++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/JspAndDefaultWithAliasesTest.java
@@ -18,7 +18,9 @@
 
 package org.eclipse.jetty.test.jsp;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
 
 import java.io.File;
 import java.io.IOException;
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/JspAndDefaultWithoutAliasesTest.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/JspAndDefaultWithoutAliasesTest.java
index a838ad5..9493941 100644
--- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/JspAndDefaultWithoutAliasesTest.java
+++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/jsp/JspAndDefaultWithoutAliasesTest.java
@@ -18,7 +18,9 @@
 
 package org.eclipse.jetty.test.jsp;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
 
 import java.io.File;
 import java.io.IOException;
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/rfcs/RFC2616BaseTest.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/rfcs/RFC2616BaseTest.java
index be1f30b..af309d7 100644
--- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/rfcs/RFC2616BaseTest.java
+++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/rfcs/RFC2616BaseTest.java
@@ -18,15 +18,14 @@
 
 package org.eclipse.jetty.test.rfcs;
 
+import static org.hamcrest.Matchers.*;
 import static org.junit.Assert.*;
-import static org.junit.matchers.JUnitMatchers.*;
 
 import java.io.File;
 import java.io.IOException;
 import java.net.Socket;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
-import java.util.Collections;
 import java.util.Date;
 import java.util.Enumeration;
 import java.util.List;
@@ -42,7 +41,6 @@
 import org.eclipse.jetty.toolchain.test.FS;
 import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
 import org.eclipse.jetty.toolchain.test.StringAssert;
-import org.eclipse.jetty.util.MultiPartInputStreamParser;
 import org.hamcrest.Matchers;
 import org.junit.AfterClass;
 import org.junit.Assert;
@@ -146,7 +144,7 @@
 
         // Test formatting
         fields.putDateField("Date",expected.getTime().getTime());
-        Assert.assertEquals("3.3.1 RFC 822 preferred","Sun, 06 Nov 1994 08:49:37 GMT",fields.getStringField("Date"));
+        Assert.assertEquals("3.3.1 RFC 822 preferred","Sun, 06 Nov 1994 08:49:37 GMT",fields.get("Date"));
     }
 
     /**
@@ -1159,12 +1157,12 @@
         req4.append("\n");
 
         HttpTester.Response response = http.request(req4);
-
+        
         String specId = "10.3 Redirection HTTP/1.1 w/content";
-        assertEquals(specId,HttpStatus.FOUND_302, response.getStatus());
-        assertEquals(specId,server.getScheme() + "://localhost/tests/R2.txt", response.get("Location"));
-        assertEquals(specId,"close", response.get("Connection"));
-        assertTrue(specId,response.get("Content-Length") == null);
+        assertThat(specId + " [status]",response.getStatus(),is(HttpStatus.FOUND_302));
+        assertThat(specId + " [location]",response.get("Location"),is(server.getScheme() + "://localhost/tests/R2.txt"));
+        assertThat(specId + " [connection]",response.get("Connection"),is("close"));
+        assertThat(specId + " [content-length]",response.get("Content-Length"), nullValue());
     }
 
     /**
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/JettyDistro.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/JettyDistro.java
index 56e2884..474254d 100644
--- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/JettyDistro.java
+++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/JettyDistro.java
@@ -525,7 +525,7 @@
         // Do a dry run first to get the exact command line for Jetty process
         commands.add("-jar");
         commands.add("start.jar");
-        commands.add("jetty.port=0");
+        commands.add("jetty.http.port=0");
         if (_debug)
         {
             commands.add("-D.DEBUG=true");
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/TestableJettyServer.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/TestableJettyServer.java
index 43876e8..495f0cd 100644
--- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/TestableJettyServer.java
+++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/TestableJettyServer.java
@@ -178,7 +178,6 @@
 
         // Find the active server port.
         this._serverPort = ((NetworkConnector)_server.getConnectors()[0]).getLocalPort();
-        System.err.println("Server Port="+_serverPort);
         Assert.assertTrue("Server Port is between 1 and 65535. Actually <" + _serverPort + ">",(1 <= this._serverPort) && (this._serverPort <= 65535));
     }
 
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpResponseTesterTest.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpResponseTesterTest.java
index 2c39ec8..001b832 100644
--- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpResponseTesterTest.java
+++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpResponseTesterTest.java
@@ -18,6 +18,10 @@
 
 package org.eclipse.jetty.test.support.rawhttp;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.junit.Assert.assertThat;
+
 import java.io.IOException;
 import java.util.List;
 
@@ -27,10 +31,6 @@
 import org.junit.Assert;
 import org.junit.Test;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.junit.Assert.assertThat;
-
 public class HttpResponseTesterTest
 {
     @Test
@@ -104,21 +104,21 @@
         Assert.assertEquals("Responses.size",3,responses.size());
 
         HttpTester.Response resp1 = responses.get(0);
-        System.err.println(resp1.toString());
+        // System.err.println(resp1.toString());
         Assert.assertEquals(HttpStatus.OK_200, resp1.getStatus());
         Assert.assertEquals("text/plain", resp1.get("Content-Type"));
         Assert.assertTrue(resp1.getContent().contains("ABCDEFGHIJKLMNOPQRSTTUVWXYZ\n"));
         assertThat(resp1.get("Connection"),is(not("close")));
 
         HttpTester.Response resp2 = responses.get(1);
-        System.err.println(resp2.toString());
+        // System.err.println(resp2.toString());
         Assert.assertEquals(HttpStatus.OK_200, resp2.getStatus());
         Assert.assertEquals("text/plain", resp2.get("Content-Type"));
         Assert.assertTrue(resp2.getContent().contains("Host=Default\nResource=R1\n"));
         assertThat(resp2.get("Connection"),is(not("close")));
 
         HttpTester.Response resp3 = responses.get(2);
-        System.err.println(resp3.toString());
+        // System.err.println(resp3.toString());
         Assert.assertEquals(HttpStatus.OK_200, resp3.getStatus());
         Assert.assertEquals("text/plain", resp3.get("Content-Type"));
         Assert.assertTrue(resp3.getContent().contains("Host=Default\nResource=R2\n"));
diff --git a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpsSocketImpl.java b/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpsSocketImpl.java
index bf68c1f..5cb80bc 100644
--- a/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpsSocketImpl.java
+++ b/tests/test-integration/src/test/java/org/eclipse/jetty/test/support/rawhttp/HttpsSocketImpl.java
@@ -29,8 +29,6 @@
 import javax.net.ssl.SSLSession;
 import javax.net.ssl.SSLSocket;
 import javax.net.ssl.SSLSocketFactory;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
 
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
diff --git a/tests/test-integration/src/test/resources/DefaultHandler.xml b/tests/test-integration/src/test/resources/DefaultHandler.xml
index 644e7f9..a050408 100644
--- a/tests/test-integration/src/test/resources/DefaultHandler.xml
+++ b/tests/test-integration/src/test/resources/DefaultHandler.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Configure the Jetty Server                                      -->
diff --git a/tests/test-integration/src/test/resources/NIOHttp.xml b/tests/test-integration/src/test/resources/NIOHttp.xml
index c766d10..d58befb 100644
--- a/tests/test-integration/src/test/resources/NIOHttp.xml
+++ b/tests/test-integration/src/test/resources/NIOHttp.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
 
@@ -20,9 +20,8 @@
             </Item>
           </Array>
         </Arg>
-        <Set name="host"><Property name="jetty.host" /></Set>
-        <Set name="port">0</Set>
-        <Set name="idleTimeout"><Property name="http.timeout" default="30000"/></Set>
+        <Set name="host"><Property name="jetty.http.host" /></Set>
+        <Set name="idleTimeout"><Property name="jetty.http.idleTimeout" default="30000"/></Set>
       </New>
     </Arg>
   </Call>
diff --git a/tests/test-integration/src/test/resources/NIOHttps.xml b/tests/test-integration/src/test/resources/NIOHttps.xml
index 5e90fdb..5146752 100644
--- a/tests/test-integration/src/test/resources/NIOHttps.xml
+++ b/tests/test-integration/src/test/resources/NIOHttps.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
 
@@ -25,8 +25,7 @@
               </Item>
             </Array>
           </Arg>
-          <Set name="host"><Property name="jetty.host" /></Set>
-          <Set name="port">0</Set>
+          <Set name="host"><Property name="jetty.http.host" /></Set>
           <Set name="idleTimeout">30000</Set>
         </New>
     </Arg>
diff --git a/tests/test-integration/src/test/resources/RFC2616Base.xml b/tests/test-integration/src/test/resources/RFC2616Base.xml
index 2c300d1..a35088f 100644
--- a/tests/test-integration/src/test/resources/RFC2616Base.xml
+++ b/tests/test-integration/src/test/resources/RFC2616Base.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Configure the Jetty Server                                      -->
diff --git a/tests/test-integration/src/test/resources/RFC2616_Filters.xml b/tests/test-integration/src/test/resources/RFC2616_Filters.xml
index a798bfd..73dbb38 100644
--- a/tests/test-integration/src/test/resources/RFC2616_Filters.xml
+++ b/tests/test-integration/src/test/resources/RFC2616_Filters.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
 
diff --git a/tests/test-integration/src/test/resources/RFC2616_Redirects.xml b/tests/test-integration/src/test/resources/RFC2616_Redirects.xml
index a3cc7a3..a777ad1 100644
--- a/tests/test-integration/src/test/resources/RFC2616_Redirects.xml
+++ b/tests/test-integration/src/test/resources/RFC2616_Redirects.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
     <!-- =========================================================== -->
diff --git a/tests/test-integration/src/test/resources/ssl.xml b/tests/test-integration/src/test/resources/ssl.xml
index 84de070..eecff79 100644
--- a/tests/test-integration/src/test/resources/ssl.xml
+++ b/tests/test-integration/src/test/resources/ssl.xml
@@ -1,9 +1,9 @@
 <Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
-  <Set name="KeyStorePath"><Property name="jetty.home" default="." />/<Property name="jetty.keystore" default="keystore"/></Set>
-  <Set name="KeyStorePassword"><Property name="jetty.keystore.password" default="OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"/></Set>
-  <Set name="KeyManagerPassword"><Property name="jetty.keymanager.password" default="OBF:1u2u1wml1z7s1z7a1wnl1u2g"/></Set>
-  <Set name="TrustStorePath"><Property name="jetty.home" default="." />/<Property name="jetty.truststore" default="keystore"/></Set>
-  <Set name="TrustStorePassword"><Property name="jetty.truststore.password" default="OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"/></Set>
+  <Set name="KeyStorePath"><Property name="jetty.home" default="." />/<Property name="jetty.sslContext.keyStorePath" default="keystore"/></Set>
+  <Set name="KeyStorePassword"><Property name="jetty.sslContext.keyStorePassword" default="OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"/></Set>
+  <Set name="KeyManagerPassword"><Property name="jetty.sslContext.keyManagerPassword" default="OBF:1u2u1wml1z7s1z7a1wnl1u2g"/></Set>
+  <Set name="TrustStorePath"><Property name="jetty.home" default="." />/<Property name="jetty.sslContext.trustStorePath" default="keystore"/></Set>
+  <Set name="TrustStorePassword"><Property name="jetty.sslContext.trustStorePassword" default="OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"/></Set>
   <Set name="EndpointIdentificationAlgorithm"></Set>
   <Set name="ExcludeCipherSuites">
     <Array type="String">
diff --git a/tests/test-integration/src/test/resources/webapp-contexts/RFC2616/rfc2616-webapp.xml b/tests/test-integration/src/test/resources/webapp-contexts/RFC2616/rfc2616-webapp.xml
index 74d2fe9..36e624f 100644
--- a/tests/test-integration/src/test/resources/webapp-contexts/RFC2616/rfc2616-webapp.xml
+++ b/tests/test-integration/src/test/resources/webapp-contexts/RFC2616/rfc2616-webapp.xml
@@ -1,8 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 <Configure class="org.eclipse.jetty.webapp.WebAppContext">
-	<Set name="contextPath">/rfc2616-webapp</Set>
-	<Set name="war">
-		<Property name="test.webapps" default="." />/test-webapp-rfc2616.war
-	</Set>
+  <Set name="contextPath">/rfc2616-webapp</Set>
+  <Set name="war"><Property name="test.webapps" default="." />/test-webapp-rfc2616.war</Set>
+  <Set name="gzipHandler">
+    <New class="org.eclipse.jetty.server.handler.gzip.GzipHandler">
+      <Set name="minGzipSize">1024</Set>
+    </New>
+  </Set>
 </Configure>
diff --git a/tests/test-integration/src/test/resources/webdefault.xml b/tests/test-integration/src/test/resources/webdefault.xml
index d87a7e2..d54d76f 100644
--- a/tests/test-integration/src/test/resources/webdefault.xml
+++ b/tests/test-integration/src/test/resources/webdefault.xml
@@ -1,113 +1,142 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
-<!-- ===================================================================== -->
-<!-- This file contains the default descriptor for web applications.       -->
-<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-<!-- The intent of this descriptor is to include jetty specific or common  -->
-<!-- configuration for all webapps.   If a context has a webdefault.xml    -->
-<!-- descriptor, it is applied before the contexts own web.xml file        -->
-<!--                                                                       -->
-<!-- A context may be assigned a default descriptor by:                    -->
-<!--  + Calling WebApplicationContext.setDefaultsDescriptor                -->
-<!--  + Passed an arg to addWebApplications                                -->
-<!--                                                                       -->
-<!-- This file is used both as the resource within the jetty.jar (which is -->
-<!-- used as the default if no explicit defaults descriptor is set) and it -->
-<!-- is copied to the etc directory of the Jetty distro and explicitly     -->
-<!-- by the jetty.xml file.                                                -->
-<!--                                                                       -->
-<!-- ===================================================================== -->
 <web-app 
-   xmlns="http://java.sun.com/xml/ns/javaee" 
+   xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
-   metadata-complete="true"
-   version="2.5"> 
+   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+   metadata-complete="false"
+   version="3.1"> 
+
+  <!-- ===================================================================== -->
+  <!-- This file contains the default descriptor for web applications.       -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+  <!-- The intent of this descriptor is to include jetty specific or common  -->
+  <!-- configuration for all webapps.   If a context has a webdefault.xml    -->
+  <!-- descriptor, it is applied before the context's own web.xml file       -->
+  <!--                                                                       -->
+  <!-- A context may be assigned a default descriptor by calling             -->
+  <!-- WebAppContext.setDefaultsDescriptor(String).                          -->
+  <!--                                                                       -->
+  <!-- This file is present in the jetty-webapp.jar, and is used as the      -->
+  <!-- defaults descriptor if no other is explicitly set on a context.       -->
+  <!--                                                                       -->
+  <!-- A copy of this file is also placed into the $JETTY_HOME/etc dir of    -->
+  <!-- the  distribution, and is referenced by some of the other xml files,  -->
+  <!-- eg the jetty-deploy.xml file.                                         -->
+  <!-- ===================================================================== -->
 
   <description>
     Default web.xml file.  
     This file is applied to a Web application before it's own WEB_INF/web.xml file
   </description>
 
+  <!-- ==================================================================== -->
+  <!-- Removes static references to beans from javax.el.BeanELResolver to   -->
+  <!-- ensure webapp classloader can be released on undeploy                -->
+  <!-- ==================================================================== -->
+  <listener>
+   <listener-class>org.eclipse.jetty.servlet.listener.ELContextCleaner</listener-class>
+  </listener>
+  
+  <!-- ==================================================================== -->
+  <!-- Removes static cache of Methods from java.beans.Introspector to      -->
+  <!-- ensure webapp classloader can be released on undeploy                -->
+  <!-- ==================================================================== -->  
+  <listener>
+   <listener-class>org.eclipse.jetty.servlet.listener.IntrospectorCleaner</listener-class>
+  </listener>
+  
 
   <!-- ==================================================================== -->
   <!-- Context params to control Session Cookies                            -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <!-- UNCOMMENT TO ACTIVATE
-  <context-param>
-    <param-name>org.eclipse.jetty.servlet.SessionDomain</param-name>
-    <param-value>127.0.0.1</param-value>
-  </context-param>
-
-  <context-param>
-    <param-name>org.eclipse.jetty.servlet.SessionPath</param-name>
-    <param-value>/</param-value>
-  </context-param>
-
-  <context-param>
-    <param-name>org.eclipse.jetty.servlet.MaxAge</param-name>
-    <param-value>-1</param-value>
-  </context-param>
+  <!--
+    UNCOMMENT TO ACTIVATE 
+    <context-param> 
+      <param-name>org.eclipse.jetty.servlet.SessionDomain</param-name> 
+      <param-value>127.0.0.1</param-value> 
+    </context-param> 
+    <context-param>
+      <param-name>org.eclipse.jetty.servlet.SessionPath</param-name>
+      <param-value>/</param-value>
+    </context-param>
+    <context-param>
+      <param-name>org.eclipse.jetty.servlet.MaxAge</param-name>
+      <param-value>-1</param-value>
+    </context-param>
   -->
 
-
   <!-- ==================================================================== -->
   <!-- The default servlet.                                                 -->
   <!-- This servlet, normally mapped to /, provides the handling for static -->
   <!-- content, OPTIONS and TRACE methods for the context.                  -->
   <!-- The following initParameters are supported:                          -->
-  <!--                                                                      -->
-  <!--   acceptRanges     If true, range requests and responses are         -->
-  <!--                    supported                                         -->
-  <!--                                                                      -->
-  <!--   dirAllowed       If true, directory listings are returned if no    -->
-  <!--                    welcome file is found. Else 403 Forbidden.        -->
-  <!--                                                                      -->
-  <!--   welcomeServlets  If true, attempt to dispatch to welcome files     -->
-  <!--                    that are servlets, if no matching static          -->
-  <!--                    resources can be found.                           -->
-  <!--                                                                      -->
-  <!--   redirectWelcome  If true, redirect welcome file requests           -->
-  <!--                    else use request dispatcher forwards              -->
-  <!--                                                                      -->
-  <!--   gzip             If set to true, then static content will be served--> 
-  <!--                    as gzip content encoded if a matching resource is -->
-  <!--                    found ending with ".gz"                           -->
-  <!--                                                                      -->
-  <!--   resoureBase      Can be set to replace the context resource base   -->
-  <!--                                                                      -->
-  <!--   relativeResourceBase                                               -->
-  <!--                    Set with a pathname relative to the base of the   -->
-  <!--                    servlet context root. Useful for only serving     -->
-  <!--                    static content from only specific subdirectories. -->
-  <!--                                                                      -->
-  <!--   useFileMappedBuffer                                                -->
-  <!--                    If set to true (the default), a  memory mapped    -->
-  <!--                    file buffer will be used to serve static content  -->
-  <!--                    when using an NIO connector. Setting this value   -->
-  <!--                    to false means that a direct buffer will be used  -->
-  <!--                    instead. If you are having trouble with Windows   -->
-  <!--                    file locking, set this to false.                  -->
-  <!--                                                                      -->
-  <!--  cacheControl      If set, all static content will have this value   -->
-  <!--                    set as the cache-control header.                  -->
-  <!--                                                                      -->
-  <!--  maxCacheSize      Maximum size of the static resource cache         -->
-  <!--                                                                      -->
-  <!--  maxCachedFileSize Maximum size of any single file in the cache      -->
-  <!--                                                                      -->
-  <!--  maxCachedFiles    Maximum number of files in the cache              -->
-  <!--                                                                      -->
-  <!--  cacheType         "nio", "bio" or "both" to determine the type(s)   -->
-  <!--                    of resource cache. A bio cached buffer may be used-->
-  <!--                    by nio but is not as efficient as a nio buffer.   -->
-  <!--                    An nio cached buffer may not be used by bio.      -->
-  <!--                                                                      -->
-  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+  <!--  
+ *  acceptRanges      If true, range requests and responses are
+ *                    supported
+ *
+ *  dirAllowed        If true, directory listings are returned if no
+ *                    welcome file is found. Else 403 Forbidden.
+ *
+ *  welcomeServlets   If true, attempt to dispatch to welcome files
+ *                    that are servlets, but only after no matching static
+ *                    resources could be found. If false, then a welcome
+ *                    file must exist on disk. If "exact", then exact
+ *                    servlet matches are supported without an existing file.
+ *                    Default is true.
+ *
+ *                    This must be false if you want directory listings,
+ *                    but have index.jsp in your welcome file list.
+ *
+ *  redirectWelcome   If true, welcome files are redirected rather than
+ *                    forwarded to.
+ *
+ *  gzip              If set to true, then static content will be served as
+ *                    gzip content encoded if a matching resource is
+ *                    found ending with ".gz"
+ *
+ *  resourceBase      Set to replace the context resource base
+ *
+ *  resourceCache     If set, this is a context attribute name, which the servlet
+ *                    will use to look for a shared ResourceCache instance.
+ *
+ *  relativeResourceBase
+ *                    Set with a pathname relative to the base of the
+ *                    servlet context root. Useful for only serving static content out
+ *                    of only specific subdirectories.
+ *
+ *  pathInfoOnly      If true, only the path info will be applied to the resourceBase
+ *
+ *  stylesheet        Set with the location of an optional stylesheet that will be used
+ *                    to decorate the directory listing html.
+ *
+ *  aliases           If True, aliases of resources are allowed (eg. symbolic
+ *                    links and caps variations). May bypass security constraints.
+ *                    
+ *  etags             If True, weak etags will be generated and handled.
+ *
+ *  maxCacheSize      The maximum total size of the cache or 0 for no cache.
+ *  maxCachedFileSize The maximum size of a file to cache
+ *  maxCachedFiles    The maximum number of files to cache
+ *
+ *  useFileMappedBuffer
+ *                    If set to true, it will use mapped file buffers to serve static content
+ *                    when using an NIO connector. Setting this value to false means that
+ *                    a direct buffer will be used instead of a mapped file buffer.
+ *                    This file sets the value to true.
+ *
+ *  cacheControl      If set, all static content will have this value set as the cache-control
+ *                    header.
+ *
+ -->
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <servlet>
     <servlet-name>default</servlet-name>
     <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
     <init-param>
+      <param-name>aliases</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
       <param-name>acceptRanges</param-name>
       <param-value>true</param-value>
     </init-param>
@@ -117,8 +146,8 @@
     </init-param>
     <init-param>
       <param-name>welcomeServlets</param-name>
- 	    <param-value>false</param-value>
- 	  </init-param>
+      <param-value>false</param-value>
+    </init-param>
     <init-param>
       <param-name>redirectWelcome</param-name>
       <param-value>false</param-value>
@@ -129,24 +158,30 @@
     </init-param>
     <init-param>
       <param-name>maxCachedFileSize</param-name>
-      <param-value>10000000</param-value>
+      <param-value>200000000</param-value>
     </init-param>
     <init-param>
       <param-name>maxCachedFiles</param-name>
-      <param-value>1000</param-value>
-    </init-param>
-    <init-param>
-      <param-name>cacheType</param-name>
-      <param-value>both</param-value>
+      <param-value>2048</param-value>
     </init-param>
     <init-param>
       <param-name>gzip</param-name>
-      <param-value>true</param-value>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
+      <param-name>etags</param-name>
+      <param-value>false</param-value>
     </init-param>
     <init-param>
       <param-name>useFileMappedBuffer</param-name>
       <param-value>true</param-value>
-    </init-param>  
+    </init-param>
+    <!--
+    <init-param>
+      <param-name>resourceCache</param-name>
+      <param-value>resourceCache</param-value>
+    </init-param>
+    -->
     <!--
     <init-param>
       <param-name>cacheControl</param-name>
@@ -154,20 +189,23 @@
     </init-param>
     -->
     <load-on-startup>0</load-on-startup>
-  </servlet> 
+  </servlet>
 
-  <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
-  
+  <servlet-mapping>
+    <servlet-name>default</servlet-name>
+    <url-pattern>/</url-pattern>
+  </servlet-mapping>
+
 
   <!-- ==================================================================== -->
   <!-- JSP Servlet                                                          -->
-  <!-- This is the jasper JSP servlet from the jakarta project              -->
+  <!-- This is the jasper JSP servlet.                                      -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <!-- The JSP page compiler and execution servlet, which is the mechanism  -->
-  <!-- used by Glassfish to support JSP pages.  Traditionally, this servlet -->
-  <!-- is mapped to URL patterh "*.jsp".  This servlet supports the         -->
-  <!-- following initialization parameters (default values are in square    -->
-  <!-- brackets):                                                           -->
+  <!-- used by the jsp container to support JSP pages.  Traditionally,      -->
+  <!-- this servlet is mapped to URL pattern "*.jsp".  This servlet         -->
+  <!-- supports the following initialization parameters (default values     -->
+  <!-- are in square brackets):                                             -->
   <!--                                                                      -->
   <!--   checkInterval       If development is false and reloading is true, -->
   <!--                       background compiles are enabled. checkInterval -->
@@ -175,7 +213,7 @@
   <!--                       if a JSP page needs to be recompiled. [300]    -->
   <!--                                                                      -->
   <!--   compiler            Which compiler Ant should use to compile JSP   -->
-  <!--                       pages.  See the Ant documenation for more      -->
+  <!--                       pages.  See the Ant documentation for more     -->
   <!--                       information. [javac]                           -->
   <!--                                                                      -->
   <!--   classdebuginfo      Should the class file be compiled with         -->
@@ -236,28 +274,29 @@
   <!--   xpoweredBy          Determines whether X-Powered-By response       -->
   <!--                       header is added by generated servlet  [false]  -->
   <!--                                                                      -->
-  <!-- If you wish to use Jikes to compile JSP pages:                       -->
-  <!--   Set the init parameter "compiler" to "jikes".  Define              -->
-  <!--   the property "-Dbuild.compiler.emacs=true" when starting Jetty     -->
-  <!--   to cause Jikes to emit error messages in a format compatible with  -->
-  <!--   Jasper.                                                            -->
-  <!--   If you get an error reporting that jikes can't use UTF-8 encoding, -->
-  <!--   try setting the init parameter "javaEncoding" to "ISO-8859-1".     -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <servlet id="jsp">
     <servlet-name>jsp</servlet-name>
-    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
+    <servlet-class>org.eclipse.jetty.jsp.JettyJspServlet</servlet-class>
     <init-param>
-        <param-name>logVerbosityLevel</param-name>
-        <param-value>DEBUG</param-value>
+      <param-name>logVerbosityLevel</param-name>
+      <param-value>DEBUG</param-value>
     </init-param>
     <init-param>
-        <param-name>fork</param-name>
-        <param-value>false</param-value>
+      <param-name>fork</param-name>
+      <param-value>false</param-value>
     </init-param>
     <init-param>
-        <param-name>xpoweredBy</param-name>
-        <param-value>false</param-value>
+      <param-name>xpoweredBy</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
+      <param-name>compilerTargetVM</param-name>
+      <param-value>1.7</param-value>
+    </init-param>
+    <init-param>
+      <param-name>compilerSourceVM</param-name>
+      <param-value>1.7</param-value>
     </init-param>
     <!--  
     <init-param>
@@ -268,62 +307,22 @@
     <load-on-startup>0</load-on-startup>
   </servlet>
 
-  <servlet-mapping> 
-    <servlet-name>jsp</servlet-name> 
-    <url-pattern>*.jsp</url-pattern> 
+  <servlet-mapping>
+    <servlet-name>jsp</servlet-name>
+    <url-pattern>*.jsp</url-pattern>
     <url-pattern>*.jspf</url-pattern>
     <url-pattern>*.jspx</url-pattern>
     <url-pattern>*.xsp</url-pattern>
-    <url-pattern>*.JSP</url-pattern> 
+    <url-pattern>*.JSP</url-pattern>
     <url-pattern>*.JSPF</url-pattern>
     <url-pattern>*.JSPX</url-pattern>
     <url-pattern>*.XSP</url-pattern>
   </servlet-mapping>
-  
+
+
   <!-- ==================================================================== -->
-  <!-- Dynamic Servlet Invoker.                                             -->
-  <!-- This servlet invokes anonymous servlets that have not been defined   -->
-  <!-- in the web.xml or by other means. The first element of the pathInfo  -->
-  <!-- of a request passed to the envoker is treated as a servlet name for  -->
-  <!-- an existing servlet, or as a class name of a new servlet.            -->
-  <!-- This servlet is normally mapped to /servlet/*                        -->
-  <!-- This servlet support the following initParams:                       -->
-  <!--                                                                      -->
-  <!--  nonContextServlets       If false, the invoker can only load        -->
-  <!--                           servlets from the contexts classloader.    -->
-  <!--                           This is false by default and setting this  -->
-  <!--                           to true may have security implications.    -->
-  <!--                                                                      -->
-  <!--  verbose                  If true, log dynamic loads                 -->
-  <!--                                                                      -->
-  <!--  *                        All other parameters are copied to the     -->
-  <!--                           each dynamic servlet as init parameters    -->
+  <!-- Default session configuration                                        -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <!-- Uncomment for dynamic invocation
-  <servlet>
-    <servlet-name>invoker</servlet-name>
-    <servlet-class>org.eclipse.jetty.servlet.Invoker</servlet-class>
-    <init-param>
-      <param-name>verbose</param-name>
-      <param-value>false</param-value>
-    </init-param>
-    <init-param>
-      <param-name>nonContextServlets</param-name>
-      <param-value>false</param-value>
-    </init-param>
-    <init-param>
-      <param-name>dynamicParam</param-name>
-      <param-value>anyValue</param-value>
-    </init-param>
-    <load-on-startup>0</load-on-startup>
-  </servlet>
-
-  <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping>
-  -->
-
-
-
-  <!-- ==================================================================== -->
   <session-config>
     <session-timeout>30</session-timeout>
   </session-config>
@@ -331,7 +330,7 @@
   <!-- ==================================================================== -->
   <!-- Default MIME mappings                                                -->
   <!-- The default MIME mappings are provided by the mime.properties        -->
-  <!-- resource in the org.eclipse.jetty.server.jar file.  Additional or modified  -->
+  <!-- resource in the jetty-http.jar file.  Additional or modified         -->
   <!-- mappings may be specified here                                       -->
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <!-- UNCOMMENT TO ACTIVATE
@@ -342,6 +341,8 @@
   -->
 
   <!-- ==================================================================== -->
+  <!-- Default welcome files                                                -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <welcome-file-list>
     <welcome-file>index.html</welcome-file>
     <welcome-file>index.htm</welcome-file>
@@ -349,48 +350,170 @@
   </welcome-file-list>
 
   <!-- ==================================================================== -->
+  <!-- Default locale encodings                                             -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <locale-encoding-mapping-list>
-    <locale-encoding-mapping><locale>ar</locale><encoding>ISO-8859-6</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>be</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>bg</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ca</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>cs</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>da</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>de</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>el</locale><encoding>ISO-8859-7</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>en</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>es</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>et</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>fi</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>fr</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>hr</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>hu</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>is</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>it</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>iw</locale><encoding>ISO-8859-8</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ja</locale><encoding>Shift_JIS</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ko</locale><encoding>EUC-KR</encoding></locale-encoding-mapping>     
-    <locale-encoding-mapping><locale>lt</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>lv</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>mk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>nl</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>no</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>pl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>pt</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ro</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>ru</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sh</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sk</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sq</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sr</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>sv</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>tr</locale><encoding>ISO-8859-9</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>uk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>zh</locale><encoding>GB2312</encoding></locale-encoding-mapping>
-    <locale-encoding-mapping><locale>zh_TW</locale><encoding>Big5</encoding></locale-encoding-mapping>   
+    <locale-encoding-mapping>
+      <locale>ar</locale>
+      <encoding>ISO-8859-6</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>be</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>bg</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>ca</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>cs</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>da</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>de</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>el</locale>
+      <encoding>ISO-8859-7</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>en</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>es</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>et</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>fi</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>fr</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>hr</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>hu</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>is</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>it</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>iw</locale>
+      <encoding>ISO-8859-8</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>ja</locale>
+      <encoding>Shift_JIS</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>ko</locale>
+      <encoding>EUC-KR</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>lt</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>lv</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>mk</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>nl</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>no</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>pl</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>pt</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>ro</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>ru</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>sh</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>sk</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>sl</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>sq</locale>
+      <encoding>ISO-8859-2</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>sr</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>sv</locale>
+      <encoding>ISO-8859-1</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>tr</locale>
+      <encoding>ISO-8859-9</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>uk</locale>
+      <encoding>ISO-8859-5</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>zh</locale>
+      <encoding>GB2312</encoding>
+    </locale-encoding-mapping>
+    <locale-encoding-mapping>
+      <locale>zh_TW</locale>
+      <encoding>Big5</encoding>
+    </locale-encoding-mapping>
   </locale-encoding-mapping-list>
-  
+
+  <!-- ==================================================================== -->
+  <!-- Disable TRACE method with security constraint                        -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
   <security-constraint>
     <web-resource-collection>
       <web-resource-name>Disable TRACE</web-resource-name>
@@ -399,6 +522,13 @@
     </web-resource-collection>
     <auth-constraint/>
   </security-constraint>
-  
+  <security-constraint>
+    <web-resource-collection>
+      <web-resource-name>Enable everything but TRACE</web-resource-name>
+      <url-pattern>/</url-pattern>
+      <http-method-omission>TRACE</http-method-omission>
+    </web-resource-collection>
+  </security-constraint>
+
 </web-app>
 
diff --git a/tests/test-jmx/jmx-webapp-it/pom.xml b/tests/test-jmx/jmx-webapp-it/pom.xml
index 0d85932..4befbb0 100644
--- a/tests/test-jmx/jmx-webapp-it/pom.xml
+++ b/tests/test-jmx/jmx-webapp-it/pom.xml
@@ -20,7 +20,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-jmx-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jmx-webapp-it</artifactId>
diff --git a/tests/test-jmx/jmx-webapp-it/src/test/java/org/eclipse/jetty/test/jmx/JmxIT.java b/tests/test-jmx/jmx-webapp-it/src/test/java/org/eclipse/jetty/test/jmx/JmxIT.java
index aae9618..d4c15d4 100644
--- a/tests/test-jmx/jmx-webapp-it/src/test/java/org/eclipse/jetty/test/jmx/JmxIT.java
+++ b/tests/test-jmx/jmx-webapp-it/src/test/java/org/eclipse/jetty/test/jmx/JmxIT.java
@@ -18,17 +18,16 @@
 
 package org.eclipse.jetty.test.jmx;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.startsWith;
+import static org.junit.Assert.assertThat;
 
 import java.io.IOException;
 
-import javax.management.AttributeNotFoundException;
-import javax.management.InstanceNotFoundException;
-import javax.management.MBeanException;
 import javax.management.MBeanServerConnection;
 import javax.management.ObjectName;
-import javax.management.ReflectionException;
 import javax.management.remote.JMXConnector;
 import javax.management.remote.JMXConnectorFactory;
 import javax.management.remote.JMXServiceURL;
@@ -81,7 +80,7 @@
         ObjectName serverName = new ObjectName("org.eclipse.jetty.server:type=server,id=0");
         String version = getStringAttribute(serverName,"version");
         System.err.println("Running version: " + version);
-        assertThat("Version",version,startsWith("9.2."));
+        assertThat("Version",version,startsWith("9.3."));
     }
 
     @Test
diff --git a/tests/test-jmx/jmx-webapp-it/src/test/java/org/eclipse/jetty/test/jmx/PingIT.java b/tests/test-jmx/jmx-webapp-it/src/test/java/org/eclipse/jetty/test/jmx/PingIT.java
index f852502..0757b3b 100644
--- a/tests/test-jmx/jmx-webapp-it/src/test/java/org/eclipse/jetty/test/jmx/PingIT.java
+++ b/tests/test-jmx/jmx-webapp-it/src/test/java/org/eclipse/jetty/test/jmx/PingIT.java
@@ -18,8 +18,8 @@
 
 package org.eclipse.jetty.test.jmx;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.startsWith;
+import static org.junit.Assert.assertThat;
 
 import java.net.URI;
 
diff --git a/tests/test-jmx/jmx-webapp-it/src/test/scripts/start-jetty.sh b/tests/test-jmx/jmx-webapp-it/src/test/scripts/start-jetty.sh
index 1d0f9eb..ea7843b 100755
--- a/tests/test-jmx/jmx-webapp-it/src/test/scripts/start-jetty.sh
+++ b/tests/test-jmx/jmx-webapp-it/src/test/scripts/start-jetty.sh
@@ -11,7 +11,7 @@
 cd "$JETTY_BASE"
 
 "$JAVA_HOME/bin/java" -jar "$JETTY_HOME/start.jar" \
-    jetty.port=58080 \
+    jetty.http.port=58080 \
     STOP.PORT=58181 STOP.KEY=it
 
 
diff --git a/tests/test-jmx/jmx-webapp/pom.xml b/tests/test-jmx/jmx-webapp/pom.xml
index ac1e667..26f97f5 100644
--- a/tests/test-jmx/jmx-webapp/pom.xml
+++ b/tests/test-jmx/jmx-webapp/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-jmx-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <artifactId>jmx-webapp</artifactId>
   <packaging>war</packaging>
diff --git a/tests/test-jmx/pom.xml b/tests/test-jmx/pom.xml
index ee79a71..519033d 100644
--- a/tests/test-jmx/pom.xml
+++ b/tests/test-jmx/pom.xml
@@ -20,7 +20,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>tests-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>test-jmx-parent</artifactId>
diff --git a/tests/test-loginservice/pom.xml b/tests/test-loginservice/pom.xml
index 811af3d..509534b 100644
--- a/tests/test-loginservice/pom.xml
+++ b/tests/test-loginservice/pom.xml
@@ -21,11 +21,14 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>tests-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <artifactId>test-loginservice</artifactId>
   <name>Jetty Tests :: Login Service</name>
   <url>http://www.eclipse.org/jetty</url>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.loginservice</bundle-symbolic-name>
+  </properties>
  <dependencies>
 	<dependency>
 		<groupId>org.eclipse.jetty</groupId>
diff --git a/tests/test-loginservice/src/test/java/org/eclipse/jetty/DataSourceLoginServiceTest.java b/tests/test-loginservice/src/test/java/org/eclipse/jetty/DataSourceLoginServiceTest.java
index 185fb8c..b8311a5 100644
--- a/tests/test-loginservice/src/test/java/org/eclipse/jetty/DataSourceLoginServiceTest.java
+++ b/tests/test-loginservice/src/test/java/org/eclipse/jetty/DataSourceLoginServiceTest.java
@@ -19,8 +19,10 @@
 
 package org.eclipse.jetty;
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
 
 import java.io.File;
 import java.io.FileOutputStream;
diff --git a/tests/test-loginservice/src/test/java/org/eclipse/jetty/JdbcLoginServiceTest.java b/tests/test-loginservice/src/test/java/org/eclipse/jetty/JdbcLoginServiceTest.java
index 288a922..5b4affd 100644
--- a/tests/test-loginservice/src/test/java/org/eclipse/jetty/JdbcLoginServiceTest.java
+++ b/tests/test-loginservice/src/test/java/org/eclipse/jetty/JdbcLoginServiceTest.java
@@ -20,8 +20,10 @@
 
 
 
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 import java.io.FileInputStream;
diff --git a/tests/test-quickstart/pom.xml b/tests/test-quickstart/pom.xml
index d2c95f4..3ae48bd 100644
--- a/tests/test-quickstart/pom.xml
+++ b/tests/test-quickstart/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>tests-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
@@ -11,6 +11,9 @@
   <name>Test :: Jetty Quick Start</name>
   <description>Jetty Quick Start Test</description>
   <url>http://www.eclipse.org/jetty</url>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.tests.quickstart</bundle-symbolic-name>
+  </properties>
   <dependencies>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
diff --git a/tests/test-quickstart/src/test/java/org/eclipse/jetty/quickstart/PreconfigureJNDIWar.java b/tests/test-quickstart/src/test/java/org/eclipse/jetty/quickstart/PreconfigureJNDIWar.java
index d43e803..7652f31 100644
--- a/tests/test-quickstart/src/test/java/org/eclipse/jetty/quickstart/PreconfigureJNDIWar.java
+++ b/tests/test-quickstart/src/test/java/org/eclipse/jetty/quickstart/PreconfigureJNDIWar.java
@@ -19,7 +19,6 @@
 package org.eclipse.jetty.quickstart;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.util.concurrent.TimeUnit;
 
 import org.eclipse.jetty.server.Server;
diff --git a/tests/test-quickstart/src/test/java/org/eclipse/jetty/quickstart/PreconfigureSpecWar.java b/tests/test-quickstart/src/test/java/org/eclipse/jetty/quickstart/PreconfigureSpecWar.java
index 59fa4fb..7f37f6c 100644
--- a/tests/test-quickstart/src/test/java/org/eclipse/jetty/quickstart/PreconfigureSpecWar.java
+++ b/tests/test-quickstart/src/test/java/org/eclipse/jetty/quickstart/PreconfigureSpecWar.java
@@ -19,7 +19,6 @@
 package org.eclipse.jetty.quickstart;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.util.concurrent.TimeUnit;
 
 import org.eclipse.jetty.server.Server;
diff --git a/tests/test-quickstart/src/test/java/org/eclipse/jetty/quickstart/PreconfigureStandardTestWar.java b/tests/test-quickstart/src/test/java/org/eclipse/jetty/quickstart/PreconfigureStandardTestWar.java
index 2a9dd19..653c581 100644
--- a/tests/test-quickstart/src/test/java/org/eclipse/jetty/quickstart/PreconfigureStandardTestWar.java
+++ b/tests/test-quickstart/src/test/java/org/eclipse/jetty/quickstart/PreconfigureStandardTestWar.java
@@ -19,7 +19,6 @@
 package org.eclipse.jetty.quickstart;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.util.concurrent.TimeUnit;
 
 import org.eclipse.jetty.server.Server;
diff --git a/tests/test-quickstart/src/test/resources/test-jndi.xml b/tests/test-quickstart/src/test/resources/test-jndi.xml
index 14c0934..5f4ab4f 100644
--- a/tests/test-quickstart/src/test/resources/test-jndi.xml
+++ b/tests/test-quickstart/src/test/resources/test-jndi.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Configure the test-jndi webapp                                  -->
diff --git a/tests/test-quickstart/src/test/resources/test-spec.xml b/tests/test-quickstart/src/test/resources/test-spec.xml
index 99fc577..a136d28 100644
--- a/tests/test-quickstart/src/test/resources/test-spec.xml
+++ b/tests/test-quickstart/src/test/resources/test-spec.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id='wac' class="org.eclipse.jetty.webapp.WebAppContext">
 
diff --git a/tests/test-quickstart/src/test/resources/test.xml b/tests/test-quickstart/src/test/resources/test.xml
index 41eba0c..8515656 100644
--- a/tests/test-quickstart/src/test/resources/test.xml
+++ b/tests/test-quickstart/src/test/resources/test.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"  encoding="ISO-8859-1"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- ==================================================================
 Configure and deploy the test web application in $(jetty.home)/webapps/test
diff --git a/tests/test-sessions/pom.xml b/tests/test-sessions/pom.xml
index 7d2f728..0029154 100644
--- a/tests/test-sessions/pom.xml
+++ b/tests/test-sessions/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>tests-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <artifactId>test-sessions-parent</artifactId>
   <name>Jetty Tests :: Sessions :: Parent</name>
@@ -33,7 +33,8 @@
     <module>test-sessions-common</module>
     <module>test-hash-sessions</module>
     <module>test-jdbc-sessions</module>
-    <!-- Requires mongodb server running -->
     <module>test-mongodb-sessions</module>
+    <module>test-infinispan-sessions</module>
+    <module>test-gcloud-sessions</module>
   </modules>
 </project>
diff --git a/tests/test-sessions/test-gcloud-sessions/pom.xml b/tests/test-sessions/test-gcloud-sessions/pom.xml
new file mode 100644
index 0000000..6d14ea6
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/pom.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+// ========================================================================
+// Copyright (c) Webtide LLC
+// 
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at 
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.apache.org/licenses/LICENSE-2.0.txt
+//
+// You may elect to redistribute this code under either of these licenses. 
+// ========================================================================
+ -->
+<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.eclipse.jetty.tests</groupId>
+    <artifactId>test-sessions-parent</artifactId>
+    <version>9.3.6-SNAPSHOT</version>
+  </parent>
+  <artifactId>test-gcloud-sessions</artifactId>
+  <name>Jetty Tests :: Sessions :: GCloud</name>
+  <url>http://www.eclipse.org/jetty</url>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.sessions.gcloud</bundle-symbolic-name>
+  </properties>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-deploy-plugin</artifactId>
+        <configuration>
+          <!-- DO NOT DEPLOY (or Release) -->
+          <skip>true</skip>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <skipTests>true</skipTests>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  <dependencies>
+       <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-server</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-webapp</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-client</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty.tests</groupId>
+            <artifactId>test-sessions-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty.gcloud</groupId>
+            <artifactId>gcloud-session-manager</artifactId>
+            <version>${project.version}</version>
+         </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.toolchain</groupId>
+      <artifactId>jetty-test-helper</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+  <profiles>
+      <profile>
+        <id>gcloud</id>
+        <activation>
+          <property>
+            <name>gcloud.enabled</name>
+            <value>true</value>
+          </property>
+        </activation>
+        <build>
+          <plugins>
+            <plugin>
+              <groupId>org.apache.maven.plugins</groupId>
+              <artifactId>maven-surefire-plugin</artifactId>
+              <configuration>
+                <skipTests>false</skipTests>
+                <systemPropertyVariables>
+                  <DATASTORE_DATASET>jetty9-work</DATASTORE_DATASET>
+                  <DATASTORE_HOST>http://localhost:8088</DATASTORE_HOST>
+                </systemPropertyVariables>
+              </configuration>
+            </plugin>
+          </plugins>
+        </build>
+      </profile>
+  </profiles>
+
+</project>
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ClientCrossContextSessionTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ClientCrossContextSessionTest.java
new file mode 100644
index 0000000..4c46308
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ClientCrossContextSessionTest.java
@@ -0,0 +1,66 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import org.eclipse.jetty.server.session.AbstractClientCrossContextSessionTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * ClientCrossContextSessionTest
+ *
+ *
+ */
+public class ClientCrossContextSessionTest extends AbstractClientCrossContextSessionTest
+{
+    static GCloudSessionTestSupport _testSupport;
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        _testSupport = new GCloudSessionTestSupport();
+        _testSupport.setUp();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        _testSupport.tearDown();
+    }
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractClientCrossContextSessionTest#createServer(int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        return new GCloudTestServer(port, _testSupport.getConfiguration());
+    }
+
+    @Test
+    @Override
+    public void testCrossContextDispatch() throws Exception
+    {
+        super.testCrossContextDispatch();
+    }
+
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ForwardedSessionTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ForwardedSessionTest.java
new file mode 100644
index 0000000..c4b0635
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ForwardedSessionTest.java
@@ -0,0 +1,58 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import org.eclipse.jetty.server.session.AbstractForwardedSessionTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * ForwardedSessionTest
+ *
+ *
+ */
+public class ForwardedSessionTest extends AbstractForwardedSessionTest
+{
+    static GCloudSessionTestSupport _testSupport;
+
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        _testSupport = new GCloudSessionTestSupport();
+        _testSupport.setUp();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        _testSupport.tearDown();
+    }
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractForwardedSessionTest#createServer(int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+       return new GCloudTestServer(port, _testSupport.getConfiguration());
+    }
+
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/GCloudSessionTestSupport.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/GCloudSessionTestSupport.java
new file mode 100644
index 0000000..f30996b
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/GCloudSessionTestSupport.java
@@ -0,0 +1,357 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.resource.JarResource;
+import org.eclipse.jetty.util.resource.Resource;
+
+import com.google.api.client.util.Strings;
+import com.google.gcloud.datastore.Datastore;
+import com.google.gcloud.datastore.DatastoreFactory;
+import com.google.gcloud.datastore.Entity;
+import com.google.gcloud.datastore.GqlQuery;
+import com.google.gcloud.datastore.Key;
+import com.google.gcloud.datastore.ProjectionEntity;
+import com.google.gcloud.datastore.Query;
+import com.google.gcloud.datastore.Query.ResultType;
+import com.google.gcloud.datastore.QueryResults;
+import com.google.gcloud.datastore.StructuredQuery;
+import com.google.gcloud.datastore.StructuredQuery.Projection;
+
+/**
+ * GCloudSessionTestSupport
+ *
+ *
+ */
+public class GCloudSessionTestSupport
+{
+    
+    private static class ProcessOutputReader implements Runnable
+    {
+        private InputStream _is;
+        private String _startupSentinel;
+        private BufferedReader _reader;
+
+        public ProcessOutputReader (InputStream is, String startupSentinel)
+        throws Exception
+        {
+            _is = is;
+            _startupSentinel = startupSentinel;
+            _reader = new BufferedReader(new InputStreamReader(_is));
+            if (!Strings.isNullOrEmpty(_startupSentinel))
+            {
+                String line;
+                while ((line = _reader.readLine()) != (null) && !line.contains(_startupSentinel))
+                {
+                    //System.err.println(line);
+                }
+            }
+        }
+
+
+        public void run()
+        {
+            String line;
+            try
+            {
+                while ((line = _reader.readLine()) != (null))
+                {
+                }
+            }
+            catch (IOException ignore)
+            {
+                /* ignore */
+            }
+            finally
+            {
+                IO.close(_reader);
+            }
+        }
+    }
+    
+
+    public static String DEFAULT_PROJECTID = "jetty9-work";
+    public static String DEFAULT_PORT = "8088";
+    public static String DEFAULT_HOST = "http://localhost:"+DEFAULT_PORT;
+    public static String DEFAULT_GCD_ZIP = "gcd-v1beta2-rev1-2.1.2b.zip";
+    public static String DEFAULT_GCD_UNPACKED = "gcd-v1beta2-rev1-2.1.2b";
+    public static String DEFAULT_DOWNLOAD_URL = "http://storage.googleapis.com/gcd/tools/";
+    
+ 
+    String _projectId;
+    String _testServerUrl;
+    String _testPort;
+    File _datastoreDir;
+    File _gcdInstallDir;
+    File _gcdUnpackedDir;
+    Datastore _ds;
+    
+    public GCloudSessionTestSupport (File gcdInstallDir)
+    {
+        _gcdInstallDir = gcdInstallDir;
+        if (_gcdInstallDir == null)
+            _gcdInstallDir = new File (System.getProperty("java.io.tmpdir"));
+        
+        _projectId = System.getProperty("DATASTORE_DATASET", System.getenv("DATASTORE_DATASET"));
+        if (_projectId == null)
+        {
+            _projectId = DEFAULT_PROJECTID;
+            System.setProperty("DATASTORE_DATASET", _projectId);
+        }
+        _testServerUrl = System.getProperty("DATASTORE_HOST", System.getenv("DATASTORE_HOST"));
+        if (_testServerUrl == null)
+        {
+            _testServerUrl = DEFAULT_HOST;
+            _testPort = DEFAULT_PORT;
+            System.setProperty("DATASTORE_HOST", _testServerUrl);
+        }
+        else
+        {
+            int i = _testServerUrl.lastIndexOf(':');
+            _testPort = _testServerUrl.substring(i+1);
+        }
+    }
+    
+    public GCloudSessionTestSupport ()
+    {
+        this(null);
+    }
+
+    public GCloudConfiguration getConfiguration ()
+    {
+        return new GCloudConfiguration();
+    }
+    
+    
+    public void setUp()
+    throws Exception
+    {
+       downloadGCD();
+       createDatastore();
+       startDatastore();
+    }
+    
+    
+    public void downloadGCD()
+    throws Exception
+    {
+        File zipFile = new File (_gcdInstallDir, DEFAULT_GCD_ZIP);       
+        _gcdUnpackedDir = new File (_gcdInstallDir, DEFAULT_GCD_UNPACKED);
+        File gcdSh = new File (_gcdUnpackedDir, "gcd.sh");
+        if (gcdSh.exists())
+            return;
+        
+        
+        if (_gcdInstallDir.exists() && !zipFile.exists())
+        {
+           //download it
+            ReadableByteChannel rbc = Channels.newChannel(new URL(DEFAULT_DOWNLOAD_URL+DEFAULT_GCD_ZIP).openStream());
+            try (FileOutputStream fos = new FileOutputStream(zipFile)) 
+            {
+              fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+            }
+        }
+        
+        if (zipFile.exists())
+        {
+            //unpack it
+            Resource zipResource = JarResource.newJarResource(Resource.newResource(zipFile));
+            zipResource.copyTo(_gcdInstallDir);
+        }
+        
+        System.err.println("GCD downloaded and unpacked");
+    }
+    
+    
+    
+    public void createDatastore ()
+    throws Exception
+    {
+    
+        _datastoreDir = Files.createTempDirectory("gcloud-sessions").toFile();
+        _datastoreDir.deleteOnExit();
+        
+        ProcessBuilder processBuilder = new ProcessBuilder();
+        processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT);
+        processBuilder.directory(_datastoreDir);
+        if (System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("windows")) 
+        {
+          processBuilder.command("cmd", "/C", new File(_gcdUnpackedDir, "gcd.cmd").getAbsolutePath(), "create", "-p", _projectId, _projectId);
+          processBuilder.redirectOutput(new File("NULL:"));
+        } 
+        else 
+        {
+          processBuilder.redirectOutput(new File("/tmp/run.out"));
+          processBuilder.command("bash", new File(_gcdUnpackedDir, "gcd.sh").getAbsolutePath(), "create", "-p",_projectId, _projectId);
+        }
+
+        Process temp = processBuilder.start();
+        System.err.println("Create outcome: "+temp.waitFor());
+    }
+    
+    
+    public void startDatastore()
+    throws Exception
+    {
+        //start the datastore for the test
+        ProcessBuilder processBuilder = new ProcessBuilder();
+        processBuilder.directory(_datastoreDir);
+        processBuilder.redirectErrorStream(true);
+        if (System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("windows")) 
+        {
+          processBuilder.command("cmd", "/C", new File(_gcdUnpackedDir, "gcd.cmd").getAbsolutePath(), "start", "--testing", "--allow_remote_shutdown","--port="+_testPort, _projectId);
+        } 
+        else 
+        {
+          processBuilder.command("bash", new File(_gcdUnpackedDir, "gcd.sh").getAbsolutePath(), "start", "--testing", "--allow_remote_shutdown", "--port="+_testPort, _projectId);
+        }
+        
+        System.err.println("Starting datastore");
+        Process temp = processBuilder.start();
+        ProcessOutputReader reader = new ProcessOutputReader(temp.getInputStream(), "Dev App Server is now running");
+        Thread readerThread = new Thread(reader, "GCD reader");
+        readerThread.setDaemon(true);
+        readerThread.start();
+    }
+    
+    public void stopDatastore()
+    throws Exception
+    {
+        //Send request to terminate test datastore
+        URL url = new URL("http", "localhost", Integer.parseInt(_testPort.trim()), "/_ah/admin/quit");
+        HttpURLConnection con = (HttpURLConnection) url.openConnection();
+        con.setRequestMethod("POST");
+        con.setDoOutput(true);
+        con.setDoInput(true);
+        OutputStream out = con.getOutputStream();
+        out.write("".getBytes());
+        out.flush();
+        InputStream in = con.getInputStream();
+        while (in.read() != -1)
+        {
+            // consume input
+          
+        }
+
+        System.err.println("Stop issued");
+    }
+ 
+    
+    public void clearDatastore()
+    {
+        org.eclipse.jetty.util.IO.delete(_datastoreDir);
+    }
+    
+    public void tearDown()
+    throws Exception
+    {
+        stopDatastore();
+        clearDatastore();
+    }
+    
+    public void ensureDatastore()
+    throws Exception
+    {
+        if (_ds == null)
+            _ds = DatastoreFactory.instance().get(getConfiguration().getDatastoreOptions());
+    }
+    public void listSessions () throws Exception
+    {
+        ensureDatastore();
+        GqlQuery.Builder builder = Query.gqlQueryBuilder(ResultType.ENTITY, "select * from "+GCloudSessionManager.KIND);
+       
+        Query<Entity> query = builder.build();
+    
+        QueryResults<Entity> results = _ds.run(query);
+        assertNotNull(results);
+        System.err.println("SESSIONS::::::::");
+        while (results.hasNext())
+        {
+            
+            Entity e = results.next();
+            System.err.println(e.getString("clusterId")+" expires at "+e.getLong("expiry"));
+        }
+        System.err.println("END OF SESSIONS::::::::");
+    }
+    
+    public void assertSessions(int count) throws Exception
+    {
+        ensureDatastore();
+        StructuredQuery<ProjectionEntity> keyOnlyProjectionQuery = Query.projectionEntityQueryBuilder()
+                .kind(GCloudSessionManager.KIND)
+                .projection(Projection.property("__key__"))
+                .limit(100)
+                .build();  
+        QueryResults<ProjectionEntity> results =   _ds.run(keyOnlyProjectionQuery);
+        assertNotNull(results);
+        int actual = 0;
+        while (results.hasNext())
+        { 
+            results.next();
+            ++actual;
+        }       
+        assertEquals(count, actual);
+    }
+    
+    public void deleteSessions () throws Exception
+    {
+       ensureDatastore();
+        StructuredQuery<ProjectionEntity> keyOnlyProjectionQuery = Query.projectionEntityQueryBuilder()
+                .kind(GCloudSessionManager.KIND)
+                .projection(Projection.property("__key__"))
+                .limit(100)
+                .build();  
+        QueryResults<ProjectionEntity> results =   _ds.run(keyOnlyProjectionQuery);
+        if (results != null)
+        {
+            List<Key> keys = new ArrayList<Key>();
+            
+            while (results.hasNext())
+            { 
+                ProjectionEntity pe = results.next();
+                keys.add(pe.key());
+            }
+            
+            _ds.delete(keys.toArray(new Key[keys.size()]));
+        }
+        
+        assertSessions(0);
+    }
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/GCloudTestServer.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/GCloudTestServer.java
new file mode 100644
index 0000000..11f2125
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/GCloudTestServer.java
@@ -0,0 +1,97 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import org.eclipse.jetty.server.SessionIdManager;
+import org.eclipse.jetty.server.SessionManager;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.eclipse.jetty.server.session.SessionHandler;
+
+import com.google.gcloud.datastore.Datastore;
+import com.google.gcloud.datastore.DatastoreFactory;
+
+/**
+ * GCloudTestServer
+ *
+ *
+ */
+public class GCloudTestServer extends AbstractTestServer
+{
+    static int __workers=0;
+    public static int STALE_INTERVAL_SEC = 1;
+
+ 
+
+    /**
+     * @param port
+     * @param maxInactivePeriod
+     * @param scavengePeriod
+     * @param sessionIdMgrConfig
+     */
+    public GCloudTestServer(int port, int maxInactivePeriod, int scavengePeriod, GCloudConfiguration config)
+    {
+        super(port, maxInactivePeriod, scavengePeriod, config);
+    }
+
+    /**
+     * @param port
+     * @param configuration
+     */
+    public GCloudTestServer(int port, GCloudConfiguration configuration)
+    {
+        super(port, 30,10, configuration);
+    }
+
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractTestServer#newSessionIdManager(java.lang.Object)
+     */
+    @Override
+    public SessionIdManager newSessionIdManager(Object config)
+    {
+        GCloudSessionIdManager idManager = new GCloudSessionIdManager(getServer());
+        idManager.setWorkerName("w"+(__workers++));
+        idManager.setConfig((GCloudConfiguration)config);
+        return idManager;
+    }
+
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractTestServer#newSessionManager()
+     */
+    @Override
+    public SessionManager newSessionManager()
+    {
+        GCloudSessionManager sessionManager = new GCloudSessionManager();
+        sessionManager.setSessionIdManager((GCloudSessionIdManager)_sessionIdManager);
+        sessionManager.setStaleIntervalSec(STALE_INTERVAL_SEC);
+        sessionManager.setScavengeIntervalSec(_scavengePeriod);
+        return sessionManager;
+        
+    }
+
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractTestServer#newSessionHandler(org.eclipse.jetty.server.SessionManager)
+     */
+    @Override
+    public SessionHandler newSessionHandler(SessionManager sessionManager)
+    {
+        return new SessionHandler(sessionManager);
+    }
+
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ImmortalSessionTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ImmortalSessionTest.java
new file mode 100644
index 0000000..54e983e
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ImmortalSessionTest.java
@@ -0,0 +1,69 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import org.eclipse.jetty.server.session.AbstractImmortalSessionTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * ImmortalSessionTest
+ *
+ *
+ */
+public class ImmortalSessionTest extends AbstractImmortalSessionTest
+{
+    static GCloudSessionTestSupport _testSupport;
+
+    /**
+     * @throws Exception
+     */
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        _testSupport = new GCloudSessionTestSupport();
+        _testSupport.setUp();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        _testSupport.tearDown();
+    }
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractImmortalSessionTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int maxInactiveMs, int scavengeMs)
+    {
+       return new GCloudTestServer(port, port, scavengeMs, _testSupport.getConfiguration());
+    }
+
+    @Test
+    @Override
+    public void testImmortalSession() throws Exception
+    {
+        super.testImmortalSession();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/InvalidationSessionTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/InvalidationSessionTest.java
new file mode 100644
index 0000000..81be68c
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/InvalidationSessionTest.java
@@ -0,0 +1,78 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import org.eclipse.jetty.server.session.AbstractInvalidationSessionTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * InvalidationSessionTest
+ *
+ *
+ */
+public class InvalidationSessionTest extends AbstractInvalidationSessionTest
+{
+    static GCloudSessionTestSupport _testSupport;
+
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        _testSupport = new GCloudSessionTestSupport();
+        _testSupport.setUp();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        _testSupport.tearDown();
+    }
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractInvalidationSessionTest#createServer(int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        return new GCloudTestServer(port, _testSupport.getConfiguration());
+    }
+
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractInvalidationSessionTest#pause()
+     */
+    @Override
+    public void pause()
+    {
+        //This test moves around a session between 2 nodes. After it is invalidated on the 1st node,
+        //it will still be in the memory of the 2nd node. We need to wait until after the stale time
+        //has expired on node2 for it to reload the session and discover it has been deleted.
+        try
+        {
+            Thread.currentThread().sleep((2*GCloudTestServer.STALE_INTERVAL_SEC)*1000);
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        
+    }
+
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/LastAccessTimeTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/LastAccessTimeTest.java
new file mode 100644
index 0000000..299278a
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/LastAccessTimeTest.java
@@ -0,0 +1,66 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import org.eclipse.jetty.server.session.AbstractLastAccessTimeTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * LastAccessTimeTest
+ *
+ *
+ */
+public class LastAccessTimeTest extends AbstractLastAccessTimeTest
+{
+    static GCloudSessionTestSupport _testSupport;
+
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        _testSupport = new GCloudSessionTestSupport();
+        _testSupport.setUp();
+    }
+
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        _testSupport.tearDown();
+    }
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractLastAccessTimeTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+        return  new GCloudTestServer(port, max, scavenge, _testSupport.getConfiguration());
+    }
+
+    @Test
+    @Override
+    public void testLastAccessTime() throws Exception
+    {
+        super.testLastAccessTime();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/LocalSessionScavengingTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/LocalSessionScavengingTest.java
new file mode 100644
index 0000000..bcdfa0a
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/LocalSessionScavengingTest.java
@@ -0,0 +1,67 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import org.eclipse.jetty.server.session.AbstractLocalSessionScavengingTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * LocalSessionScavengingTest
+ *
+ *
+ */
+public class LocalSessionScavengingTest extends AbstractLocalSessionScavengingTest
+{
+  static GCloudSessionTestSupport _testSupport;
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        _testSupport = new GCloudSessionTestSupport();
+        _testSupport.setUp();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        _testSupport.tearDown();
+    }
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractLocalSessionScavengingTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+        return  new GCloudTestServer(port, max, scavenge, _testSupport.getConfiguration());
+    }
+
+    @Test
+    @Override
+    public void testLocalSessionsScavenging() throws Exception
+    {
+        super.testLocalSessionsScavenging();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/NewSessionTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/NewSessionTest.java
new file mode 100644
index 0000000..68db7ff
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/NewSessionTest.java
@@ -0,0 +1,70 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import java.io.File;
+
+import org.eclipse.jetty.server.session.AbstractNewSessionTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * NewSessionTest
+ *
+ *
+ */
+public class NewSessionTest extends AbstractNewSessionTest
+{
+    GCloudSessionTestSupport _testSupport;
+    
+    @Before
+    public void setup () throws Exception
+    {
+        _testSupport = new GCloudSessionTestSupport();
+        _testSupport.setUp();
+    }
+    
+    @After
+    public void teardown () throws Exception
+    {
+        _testSupport.tearDown();
+    }
+    
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractNewSessionTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+       return new GCloudTestServer(port, max, scavenge, _testSupport.getConfiguration());
+    }
+
+    @Test
+    public void testNewSession() throws Exception
+    {
+        super.testNewSession();
+    }
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/OrphanedSessionTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/OrphanedSessionTest.java
new file mode 100644
index 0000000..bb3f51b
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/OrphanedSessionTest.java
@@ -0,0 +1,71 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import org.eclipse.jetty.server.session.AbstractOrphanedSessionTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * OrphanedSessionTest
+ *
+ *
+ */
+public class OrphanedSessionTest extends AbstractOrphanedSessionTest
+{
+    static GCloudSessionTestSupport _testSupport;
+
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        _testSupport = new GCloudSessionTestSupport();
+        _testSupport.setUp();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        _testSupport.tearDown();
+    }
+    
+
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractOrphanedSessionTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+        return  new GCloudTestServer(port, max, scavenge, _testSupport.getConfiguration());
+    }
+
+    @Test
+    @Override
+    public void testOrphanedSession() throws Exception
+    {
+        super.testOrphanedSession();
+        _testSupport.assertSessions(0);
+    }
+    
+    
+    
+
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ReentrantRequestSessionTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ReentrantRequestSessionTest.java
new file mode 100644
index 0000000..9cfa9f6
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ReentrantRequestSessionTest.java
@@ -0,0 +1,68 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import org.eclipse.jetty.server.session.AbstractReentrantRequestSessionTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * ReentrantRequestSessionTest
+ *
+ *
+ */
+public class ReentrantRequestSessionTest extends AbstractReentrantRequestSessionTest
+{
+    static GCloudSessionTestSupport _testSupport;
+
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        _testSupport = new GCloudSessionTestSupport();
+        _testSupport.setUp();
+    }
+
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        _testSupport.tearDown();
+    }
+
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractReentrantRequestSessionTest#createServer(int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        return  new GCloudTestServer(port, _testSupport.getConfiguration());
+    }
+
+    @Test
+    @Override
+    public void testReentrantRequestSession() throws Exception
+    {
+        super.testReentrantRequestSession();
+    }
+    
+    
+
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/RemoveSessionTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/RemoveSessionTest.java
new file mode 100644
index 0000000..ca45cb9
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/RemoveSessionTest.java
@@ -0,0 +1,71 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import org.eclipse.jetty.server.session.AbstractRemoveSessionTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * RemoveSessionTest
+ *
+ *
+ */
+public class RemoveSessionTest extends AbstractRemoveSessionTest
+{
+   static GCloudSessionTestSupport _testSupport;
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        _testSupport = new GCloudSessionTestSupport();
+        _testSupport.setUp();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        _testSupport.tearDown();
+    }
+    
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractRemoveSessionTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    { 
+        return new GCloudTestServer(port, max, scavenge, _testSupport.getConfiguration());
+    }
+
+    @Test
+    @Override
+    public void testRemoveSession() throws Exception
+    {
+        super.testRemoveSession();
+    }
+    
+    
+
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/SameNodeLoadTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/SameNodeLoadTest.java
new file mode 100644
index 0000000..70ac90b
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/SameNodeLoadTest.java
@@ -0,0 +1,67 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import org.eclipse.jetty.server.session.AbstractSameNodeLoadTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * SameNodeLoadTest
+ *
+ *
+ */
+public class SameNodeLoadTest extends AbstractSameNodeLoadTest
+{
+  static GCloudSessionTestSupport _testSupport;
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        _testSupport = new GCloudSessionTestSupport();
+        _testSupport.setUp();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        _testSupport.tearDown();
+    }
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractSameNodeLoadTest#createServer(int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        return  new GCloudTestServer(port, _testSupport.getConfiguration());
+    }
+
+    @Test
+    @Override
+    public void testLoad() throws Exception
+    {
+        super.testLoad();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ServerCrossContextSessionTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ServerCrossContextSessionTest.java
new file mode 100644
index 0000000..7f8d73e
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ServerCrossContextSessionTest.java
@@ -0,0 +1,67 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import org.eclipse.jetty.server.session.AbstractServerCrossContextSessionTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * ServerCrossContextSessionTest
+ *
+ *
+ */
+public class ServerCrossContextSessionTest extends AbstractServerCrossContextSessionTest
+{
+
+    static GCloudSessionTestSupport _testSupport;
+
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        _testSupport = new GCloudSessionTestSupport();
+        _testSupport.setUp();
+    }
+
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        _testSupport.tearDown();
+    }
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractServerCrossContextSessionTest#createServer(int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        return  new GCloudTestServer(port, _testSupport.getConfiguration()); 
+    }
+
+    @Test
+    @Override
+    public void testCrossContextDispatch() throws Exception
+    {
+        super.testCrossContextDispatch();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/SessionExpiryTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/SessionExpiryTest.java
new file mode 100644
index 0000000..ec2a9e0
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/SessionExpiryTest.java
@@ -0,0 +1,98 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import org.eclipse.jetty.server.session.AbstractSessionExpiryTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * SessionExpiryTest
+ *
+ *
+ */
+public class SessionExpiryTest extends AbstractSessionExpiryTest
+{
+
+    static GCloudSessionTestSupport _testSupport;
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        _testSupport = new GCloudSessionTestSupport();
+        _testSupport.setUp();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        _testSupport.tearDown();
+    }
+    
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractSessionExpiryTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+        return  new GCloudTestServer(port, max, scavenge, _testSupport.getConfiguration());
+    }
+
+    @Test
+    @Override
+    public void testSessionNotExpired() throws Exception
+    {
+        super.testSessionNotExpired();
+        _testSupport.deleteSessions();
+    }
+
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractSessionExpiryTest#testSessionExpiry()
+     */
+    @Test
+    @Override
+    public void testSessionExpiry() throws Exception
+    {
+        super.testSessionExpiry();
+        _testSupport.assertSessions(0);
+    }
+
+    @Override
+    public void verifySessionCreated(TestHttpSessionListener listener, String sessionId)
+    {
+        super.verifySessionCreated(listener, sessionId);
+        try{ _testSupport.listSessions(); _testSupport.assertSessions(1);}catch(Exception e) {e.printStackTrace();} 
+    }
+
+    @Override
+    public void verifySessionDestroyed(TestHttpSessionListener listener, String sessionId)
+    {
+        super.verifySessionDestroyed(listener, sessionId);
+        try{ _testSupport.listSessions(); _testSupport.assertSessions(0);}catch(Exception e) {e.printStackTrace();}
+    }
+
+    
+    
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/SessionInvalidateAndCreateTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/SessionInvalidateAndCreateTest.java
new file mode 100644
index 0000000..8222ed4
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/SessionInvalidateAndCreateTest.java
@@ -0,0 +1,69 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import org.eclipse.jetty.server.session.AbstractSessionInvalidateAndCreateTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * SessionInvalidateAndCreateTest
+ *
+ *
+ */
+public class SessionInvalidateAndCreateTest extends AbstractSessionInvalidateAndCreateTest
+{
+
+    static GCloudSessionTestSupport _testSupport;
+
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        _testSupport = new GCloudSessionTestSupport();
+        _testSupport.setUp();
+    }
+
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        _testSupport.tearDown();
+    }
+
+
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractSessionInvalidateAndCreateTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+        return  new GCloudTestServer(port, max, scavenge, _testSupport.getConfiguration());
+    }
+
+    @Test
+    @Override
+    public void testSessionScavenge() throws Exception
+    {
+        super.testSessionScavenge();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/SessionMigrationTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/SessionMigrationTest.java
new file mode 100644
index 0000000..7d8bc65
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/SessionMigrationTest.java
@@ -0,0 +1,68 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import org.eclipse.jetty.server.session.AbstractSessionMigrationTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * SessionMigrationTest
+ *
+ *
+ */
+public class SessionMigrationTest extends AbstractSessionMigrationTest
+{
+    static GCloudSessionTestSupport _testSupport;
+
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        _testSupport = new GCloudSessionTestSupport();
+        _testSupport.setUp();
+    }
+
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        _testSupport.tearDown();
+    }
+
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractSessionMigrationTest#createServer(int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        return  new GCloudTestServer(port, _testSupport.getConfiguration());
+    }
+
+    
+    @Test
+    @Override
+    public void testSessionMigration() throws Exception
+    {
+        super.testSessionMigration();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/SessionRenewTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/SessionRenewTest.java
new file mode 100644
index 0000000..01d9a4b
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/SessionRenewTest.java
@@ -0,0 +1,67 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import org.eclipse.jetty.server.session.AbstractSessionRenewTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * SessionRenewTest
+ *
+ *
+ */
+public class SessionRenewTest extends AbstractSessionRenewTest
+{
+    static GCloudSessionTestSupport _testSupport;
+
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        _testSupport = new GCloudSessionTestSupport();
+        _testSupport.setUp();
+    }
+
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        _testSupport.tearDown();
+    }
+
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractSessionRenewTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+        return  new GCloudTestServer(port,max, scavenge, _testSupport.getConfiguration());
+    }
+
+    @Test
+    @Override
+    public void testSessionRenewal() throws Exception
+    {
+        super.testSessionRenewal();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/SessionValueSavingTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/SessionValueSavingTest.java
new file mode 100644
index 0000000..9bbee07
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/SessionValueSavingTest.java
@@ -0,0 +1,68 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import org.eclipse.jetty.server.session.AbstractSessionValueSavingTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * SessionValueSavingTest
+ *
+ *
+ */
+public class SessionValueSavingTest extends AbstractSessionValueSavingTest
+{
+
+    static GCloudSessionTestSupport _testSupport;
+
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        _testSupport = new GCloudSessionTestSupport();
+        _testSupport.setUp();
+    }
+
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        _testSupport.tearDown();
+    }
+
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractSessionValueSavingTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+        return  new GCloudTestServer(port, max, scavenge, _testSupport.getConfiguration());
+    }
+
+    @Test
+    @Override
+    public void testSessionValueSaving() throws Exception
+    {
+        super.testSessionValueSaving();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/StopSessionManagerPreserveSessionTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/StopSessionManagerPreserveSessionTest.java
new file mode 100644
index 0000000..0b811d9
--- /dev/null
+++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/StopSessionManagerPreserveSessionTest.java
@@ -0,0 +1,95 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.gcloud.session;
+
+import static org.junit.Assert.fail;
+import org.eclipse.jetty.server.session.AbstractStopSessionManagerPreserveSessionTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * StopSessionManagerPreserveSessionTest
+ *
+ *
+ */
+public class StopSessionManagerPreserveSessionTest extends AbstractStopSessionManagerPreserveSessionTest
+{
+    static GCloudSessionTestSupport _testSupport;
+
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        _testSupport = new GCloudSessionTestSupport();
+        _testSupport.setUp();
+    }
+
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        _testSupport.tearDown();
+    }
+
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractStopSessionManagerPreserveSessionTest#checkSessionPersisted(boolean)
+     */
+    @Override
+    public void checkSessionPersisted(boolean expected)
+    {
+        try
+        {
+            _testSupport.assertSessions(1);
+        }
+        catch (Exception e)
+        {
+            fail(e.getMessage());
+        }
+
+    }
+
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractStopSessionManagerPreserveSessionTest#createServer(int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        return  new GCloudTestServer(port, _testSupport.getConfiguration());
+    }
+
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractStopSessionManagerPreserveSessionTest#configureSessionManagement(org.eclipse.jetty.servlet.ServletContextHandler)
+     */
+    @Override
+    public void configureSessionManagement(ServletContextHandler context)
+    {
+        
+    }
+
+    @Test
+    @Override
+    public void testStopSessionManagerPreserveSession() throws Exception
+    {
+        super.testStopSessionManagerPreserveSession();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-hash-sessions/pom.xml b/tests/test-sessions/test-hash-sessions/pom.xml
index eb4d6ca..aa65587 100644
--- a/tests/test-sessions/test-hash-sessions/pom.xml
+++ b/tests/test-sessions/test-hash-sessions/pom.xml
@@ -21,11 +21,14 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-sessions-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <artifactId>test-hash-sessions</artifactId>
   <name>Jetty Tests :: Sessions :: Hash</name>
   <url>http://www.eclipse.org/jetty</url>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.sessions.hash</bundle-symbolic-name>
+  </properties>
   <build>
     <plugins>
       <plugin>
diff --git a/tests/test-sessions/test-hash-sessions/src/test/java/org/eclipse/jetty/server/session/ForwardedSessionTest.java b/tests/test-sessions/test-hash-sessions/src/test/java/org/eclipse/jetty/server/session/ForwardedSessionTest.java
new file mode 100644
index 0000000..48bcf5a
--- /dev/null
+++ b/tests/test-sessions/test-hash-sessions/src/test/java/org/eclipse/jetty/server/session/ForwardedSessionTest.java
@@ -0,0 +1,91 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session;
+
+import java.io.File;
+
+import org.eclipse.jetty.server.SessionManager;
+import org.eclipse.jetty.util.IO;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * ForwardedSessionTest
+ *
+ *
+ */
+public class ForwardedSessionTest extends AbstractForwardedSessionTest
+{ 
+   File tmpDir;
+    
+    @Before
+    public void before() throws Exception
+    {
+        tmpDir = File.createTempFile("hash-session-forward-test", null);
+        tmpDir.delete();
+        tmpDir.mkdirs();
+        tmpDir.deleteOnExit();
+    }
+    
+    @After 
+    public void after()
+    {
+        IO.delete(tmpDir);
+    }
+    
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        return new HashTestServer(port)
+        {
+
+            @Override
+            public SessionManager newSessionManager()
+            {
+                HashSessionManager sessionManager = (HashSessionManager)super.newSessionManager();
+                sessionManager.setSavePeriod(2);
+                
+                try
+                {
+                    sessionManager.setStoreDirectory(tmpDir);
+                }
+                catch (Exception e)
+                {
+                    throw new IllegalStateException(e);
+                }
+                return sessionManager;
+            }
+
+        };
+    }
+
+    
+    
+    @Test
+    public void testSessionCreateInForward() throws Exception
+    {
+        super.testSessionCreateInForward();
+    }
+
+  
+
+
+}
diff --git a/tests/test-sessions/test-hash-sessions/src/test/java/org/eclipse/jetty/server/session/HashTestServer.java b/tests/test-sessions/test-hash-sessions/src/test/java/org/eclipse/jetty/server/session/HashTestServer.java
index d4d6b28..3393d8e 100644
--- a/tests/test-sessions/test-hash-sessions/src/test/java/org/eclipse/jetty/server/session/HashTestServer.java
+++ b/tests/test-sessions/test-hash-sessions/src/test/java/org/eclipse/jetty/server/session/HashTestServer.java
@@ -38,7 +38,7 @@
     }
 
 
-    public SessionIdManager newSessionIdManager(String config)
+    public SessionIdManager newSessionIdManager(Object config)
     {
         return new HashSessionIdManager();
     }
diff --git a/tests/test-sessions/test-hash-sessions/src/test/java/org/eclipse/jetty/server/session/IdleSessionTest.java b/tests/test-sessions/test-hash-sessions/src/test/java/org/eclipse/jetty/server/session/IdleSessionTest.java
index f34db58..30ff2d1 100644
--- a/tests/test-sessions/test-hash-sessions/src/test/java/org/eclipse/jetty/server/session/IdleSessionTest.java
+++ b/tests/test-sessions/test-hash-sessions/src/test/java/org/eclipse/jetty/server/session/IdleSessionTest.java
@@ -133,7 +133,7 @@
             //make a request to set up a session on the server
             ContentResponse response = client.GET(url + "?action=init");
             assertEquals(HttpServletResponse.SC_OK,response.getStatus());
-            String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+            String sessionCookie = response.getHeaders().get("Set-Cookie");
             assertTrue(sessionCookie != null);
             // Mangle the cookie, replacing Path with $Path, etc.
             sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
diff --git a/tests/test-sessions/test-hash-sessions/src/test/java/org/eclipse/jetty/server/session/LightLoadTest.java b/tests/test-sessions/test-hash-sessions/src/test/java/org/eclipse/jetty/server/session/LightLoadTest.java
deleted file mode 100644
index acff356..0000000
--- a/tests/test-sessions/test-hash-sessions/src/test/java/org/eclipse/jetty/server/session/LightLoadTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.server.session;
-
-import org.junit.Test;
-
-/**
- * LightLoadTest
- */
-public class LightLoadTest extends AbstractLightLoadTest
-{
-
-    public AbstractTestServer createServer(int port)
-    {
-        return new HashTestServer(port);
-    }
-
-    @Test
-    public void testLightLoad() throws Exception
-    {
-        super.testLightLoad();
-    }
-
-}
diff --git a/tests/test-sessions/test-hash-sessions/src/test/java/org/eclipse/jetty/server/session/ScatterGunLoadTest.java b/tests/test-sessions/test-hash-sessions/src/test/java/org/eclipse/jetty/server/session/ScatterGunLoadTest.java
new file mode 100644
index 0000000..90e428c
--- /dev/null
+++ b/tests/test-sessions/test-hash-sessions/src/test/java/org/eclipse/jetty/server/session/ScatterGunLoadTest.java
@@ -0,0 +1,40 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.session;
+
+import org.junit.Test;
+
+/**
+ * ScatterGunLoadTest
+ */
+public class ScatterGunLoadTest extends AbstractScatterGunLoadTest
+{
+
+    public AbstractTestServer createServer(int port)
+    {
+        return new HashTestServer(port);
+    }
+
+    @Test
+    public void testLightLoad() throws Exception
+    {
+        super.testLightLoad();
+    }
+
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/pom.xml b/tests/test-sessions/test-infinispan-sessions/pom.xml
new file mode 100644
index 0000000..6a30bdc
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/pom.xml
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+// ========================================================================
+// Copyright (c) Webtide LLC
+//
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.apache.org/licenses/LICENSE-2.0.txt
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+ -->
+<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.eclipse.jetty.tests</groupId>
+    <artifactId>test-sessions-parent</artifactId>
+    <version>9.3.6-SNAPSHOT</version>
+  </parent>
+  <artifactId>test-infinispan-sessions</artifactId>
+  <name>Jetty Tests :: Sessions :: Infinispan</name>
+  <url>http://www.eclipse.org/jetty</url>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.sessions.infinispan</bundle-symbolic-name>
+  </properties>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-deploy-plugin</artifactId>
+        <configuration>
+          <!-- DO NOT DEPLOY (or Release) -->
+          <skip>true</skip>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <includes>
+              <include>org/eclipse/jetty/server/session/*.java</include>
+          </includes>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>unpack</id>
+            <phase>generate-test-resources</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.eclipse.jetty.toolchain</groupId>
+                  <artifactId>jetty-test-policy</artifactId>
+                  <version>${jetty-test-policy-version}</version>
+                  <type>jar</type>
+                  <overWrite>true</overWrite>
+                  <includes>**/*.keystore,**/*.pem</includes>
+                  <outputDirectory>${jetty.test.policy.loc}</outputDirectory>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+  <dependencies>
+       <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-server</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-webapp</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-client</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty.tests</groupId>
+            <artifactId>test-sessions-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-infinispan</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+          <groupId>org.eclipse.jetty</groupId>
+          <artifactId>jetty-jmx</artifactId>
+          <version>${project.version}</version>
+          <optional>true</optional>
+        </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.toolchain</groupId>
+      <artifactId>jetty-test-helper</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.infinispan</groupId>
+      <artifactId>infinispan-client-hotrod</artifactId>
+      <version>7.1.1.Final</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+  <profiles>
+  <!-- to test hotrod, configure a cache called "remote-session-test" -->
+      <profile>
+        <id>remote</id>
+        <activation>
+          <property>
+            <name>hotrod.enabled</name>
+            <value>true</value>
+          </property>
+        </activation>
+        <build>
+          <plugins>
+            <plugin>
+              <groupId>org.apache.maven.plugins</groupId>
+              <artifactId>maven-surefire-plugin</artifactId>
+              <configuration>
+                <includes>
+                  <include>**/*.java</include>
+                </includes>
+              </configuration>
+            </plugin>
+          </plugins>
+        </build>
+      </profile>
+  </profiles>
+</project>
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/ClientCrossContextSessionTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/ClientCrossContextSessionTest.java
new file mode 100644
index 0000000..22beec6
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/ClientCrossContextSessionTest.java
@@ -0,0 +1,60 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ClientCrossContextSessionTest extends AbstractClientCrossContextSessionTest
+{
+
+    public static InfinispanTestSupport __testSupport;
+
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new InfinispanTestSupport();
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+       __testSupport.teardown();
+    }
+    
+    
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        InfinispanTestSessionServer server = new InfinispanTestSessionServer(port, __testSupport.getCache());
+        return server;
+    }
+    
+    @Test
+    public void testCrossContextDispatch() throws Exception
+    {
+        super.testCrossContextDispatch();
+    }
+    
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/ForwardedSessionTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/ForwardedSessionTest.java
new file mode 100644
index 0000000..651b2d6
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/ForwardedSessionTest.java
@@ -0,0 +1,66 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * ForwardedSessionTest
+ *
+ *
+ */
+public class ForwardedSessionTest extends AbstractForwardedSessionTest
+{
+
+    public static InfinispanTestSupport __testSupport;
+
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new InfinispanTestSupport();
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+       __testSupport.teardown();
+    }
+    
+    
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        InfinispanTestSessionServer server = new InfinispanTestSessionServer(port, __testSupport.getCache());
+        return server;
+    }
+
+    @Test
+    public void testSessionCreateInForward() throws Exception
+    {
+        super.testSessionCreateInForward();
+    }
+   
+
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/ImmortalSessionTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/ImmortalSessionTest.java
new file mode 100644
index 0000000..f021a70
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/ImmortalSessionTest.java
@@ -0,0 +1,71 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session;
+
+import org.infinispan.Cache;
+import org.infinispan.configuration.cache.ConfigurationBuilder;
+import org.infinispan.manager.DefaultCacheManager;
+import org.infinispan.manager.EmbeddedCacheManager;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * ImmortalSessionTest
+ *
+ *
+ */
+public class ImmortalSessionTest extends AbstractImmortalSessionTest
+{
+
+
+    public static InfinispanTestSupport __testSupport;
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new InfinispanTestSupport();
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+       __testSupport.teardown();
+    }
+    
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractImmortalSessionTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int maxInactiveMs, int scavengeMs)
+    {
+        return new InfinispanTestSessionServer(port, maxInactiveMs, scavengeMs, __testSupport.getCache());
+    }
+
+    @Override
+    public void testImmortalSession() throws Exception
+    {
+        super.testImmortalSession();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/InfinispanTestSessionServer.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/InfinispanTestSessionServer.java
new file mode 100644
index 0000000..c6b2122
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/InfinispanTestSessionServer.java
@@ -0,0 +1,117 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session;
+
+import org.eclipse.jetty.server.SessionIdManager;
+import org.eclipse.jetty.server.SessionManager;
+import org.eclipse.jetty.session.infinispan.InfinispanSessionIdManager;
+import org.eclipse.jetty.session.infinispan.InfinispanSessionManager;
+import org.infinispan.Cache;
+import org.infinispan.commons.api.BasicCache;
+import org.infinispan.commons.util.CloseableIteratorSet;
+
+public class InfinispanTestSessionServer extends AbstractTestServer
+{
+    static int __workers=0;
+    
+
+
+    
+    
+    public InfinispanTestSessionServer(int port, BasicCache config)
+    {
+        this(port, 30, 10, config);
+    }
+    
+  
+    
+    public InfinispanTestSessionServer(int port, int maxInactivePeriod, int scavengePeriod, BasicCache config)
+    {
+        super(port, maxInactivePeriod, scavengePeriod, config);
+    }
+    
+    
+
+    @Override
+    public SessionIdManager newSessionIdManager(Object config)
+    {
+        InfinispanSessionIdManager idManager = new InfinispanSessionIdManager(getServer());
+        idManager.setWorkerName("w"+(__workers++));
+        idManager.setCache((BasicCache)config);
+        return idManager;
+    }
+
+    @Override
+    public SessionManager newSessionManager()
+    {
+        InfinispanSessionManager sessionManager = new InfinispanSessionManager();
+        sessionManager.setSessionIdManager((InfinispanSessionIdManager)_sessionIdManager);
+        sessionManager.setCache(((InfinispanSessionIdManager)_sessionIdManager).getCache());
+        sessionManager.setStaleIntervalSec(1);
+        sessionManager.setScavengeInterval(_scavengePeriod);
+        
+        return sessionManager;
+    }
+
+    @Override
+    public SessionHandler newSessionHandler(SessionManager sessionManager)
+    {
+        return new SessionHandler(sessionManager);
+    }
+
+    public boolean exists (String id)
+    {
+        BasicCache cache = ((InfinispanSessionIdManager)_sessionIdManager).getCache();
+        if (cache != null)
+        {
+            return cache.containsKey(id);      
+        }
+        
+        return false;
+    }
+    
+    public Object get (String id)
+    {
+        BasicCache cache = ((InfinispanSessionIdManager)_sessionIdManager).getCache();
+        if (cache != null)
+        {
+            return cache.get(id);      
+        }
+        
+        return null;
+    }
+
+    public void dumpCache ()
+    {
+        BasicCache cache = ((InfinispanSessionIdManager)_sessionIdManager).getCache();
+        if (cache != null)
+        {
+            System.err.println(cache.getName()+" contains "+cache.size()+" entries");         
+        }
+    }
+
+    public void clearCache ()
+    { 
+        BasicCache cache = ((InfinispanSessionIdManager)_sessionIdManager).getCache();
+        if (cache != null)
+            cache.clear();
+    }
+
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/InfinispanTestSupport.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/InfinispanTestSupport.java
new file mode 100644
index 0000000..a3b61bd
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/InfinispanTestSupport.java
@@ -0,0 +1,114 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session;
+
+import java.io.File;
+
+import org.eclipse.jetty.util.IO;
+import org.infinispan.Cache;
+import org.infinispan.configuration.cache.Configuration;
+import org.infinispan.configuration.cache.ConfigurationBuilder;
+import org.infinispan.configuration.global.GlobalConfigurationBuilder;
+import org.infinispan.manager.DefaultCacheManager;
+import org.infinispan.manager.EmbeddedCacheManager;
+
+/**
+ * InfinispanTestSupport
+ *
+ *
+ */
+public class InfinispanTestSupport
+{
+    public static final String DEFAULT_CACHE_NAME =  "session_test_cache";
+    public  Cache _cache;
+ 
+    public ConfigurationBuilder _builder;
+    private  File _tmpdir;
+    private boolean _useFileStore;
+    private String _name;
+    public static  EmbeddedCacheManager _manager;
+    
+    static
+    {
+        try
+        {
+            _manager = new DefaultCacheManager(new GlobalConfigurationBuilder().globalJmxStatistics().allowDuplicateDomains(true).build());
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+    
+    public InfinispanTestSupport ()
+    {
+        this (null);
+    }
+    
+    public InfinispanTestSupport(String cacheName)
+    {     
+        if (cacheName == null)
+            cacheName = DEFAULT_CACHE_NAME+System.currentTimeMillis();
+        
+        _name = cacheName;
+        _builder = new ConfigurationBuilder();
+    }
+    
+    public void setUseFileStore (boolean useFileStore)
+    {
+        _useFileStore = useFileStore;
+    }
+  
+    public Cache getCache ()
+    {
+        return _cache;
+    }
+    
+    public void setup () throws Exception
+    {
+       if (_useFileStore)
+       {      
+        _tmpdir = File.createTempFile("infini", "span");
+        _tmpdir.delete();
+        _tmpdir.mkdir();
+        System.err.println("Temp file: "+_tmpdir);
+        Configuration config = _builder.persistence().addSingleFileStore().location(_tmpdir.getAbsolutePath()).storeAsBinary().build();
+        _manager.defineConfiguration(_name, config);
+       }
+       else
+       {
+           _manager.defineConfiguration(_name, _builder.build());
+       }
+       _cache = _manager.getCache(_name);
+    }
+
+
+    public void teardown () throws Exception
+    {
+        _manager.removeCache(_name);
+        if (_useFileStore)
+        {
+            if (_tmpdir != null)
+            {
+                IO.delete(_tmpdir);
+            }
+        }
+    }
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/InvalidationSessionTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/InvalidationSessionTest.java
new file mode 100644
index 0000000..10afc28
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/InvalidationSessionTest.java
@@ -0,0 +1,91 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * InvalidationSessionTest
+ *
+ *
+ */
+public class InvalidationSessionTest extends AbstractInvalidationSessionTest
+{
+
+    public static InfinispanTestSupport __testSupport;
+    public static long __staleSec = 3L;
+   
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+      __testSupport = new InfinispanTestSupport();
+      __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+       __testSupport.teardown();
+    }
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractInvalidationSessionTest#createServer(int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        return new InfinispanTestSessionServer(port, __testSupport.getCache());
+    }
+
+    
+    
+    
+    @Override
+    public void testInvalidation() throws Exception
+    {
+        super.testInvalidation();
+    }
+
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractInvalidationSessionTest#pause()
+     */
+    @Override
+    public void pause()
+    {
+        //This test moves a session from node 1 to node 2, then invalidates the session back on node1. This
+        //should never happen with a decent load balancer.
+        //The infinispan session manager on node 2 will hold the session in local memory for a specific (configurable)
+        //amount of time. We've set the stale session time to 3 sec, so we need to pause for at least this long before making
+        //another request to node2
+        
+        //that the node will re-load the session from the database and discover that it has gone.
+        try
+        {
+            Thread.sleep(2 * __staleSec * 1000);
+        }
+        catch (InterruptedException e)
+        {
+        }
+    }
+
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/LastAccessTimeTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/LastAccessTimeTest.java
new file mode 100644
index 0000000..25c0ad2
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/LastAccessTimeTest.java
@@ -0,0 +1,65 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.session;
+
+import java.io.File;
+
+import org.eclipse.jetty.util.IO;
+import org.infinispan.Cache;
+import org.infinispan.configuration.cache.Configuration;
+import org.infinispan.configuration.cache.ConfigurationBuilder;
+import org.infinispan.manager.DefaultCacheManager;
+import org.infinispan.manager.EmbeddedCacheManager;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+public class LastAccessTimeTest extends AbstractLastAccessTimeTest
+{ 
+   public static InfinispanTestSupport __testSupport;
+   
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+       __testSupport = new InfinispanTestSupport();
+       __testSupport.setUseFileStore(true);
+       __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+       __testSupport.teardown();
+    }
+    
+
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+        return new InfinispanTestSessionServer(port, max, scavenge, __testSupport.getCache());
+    }
+
+    @Override
+    public void testLastAccessTime() throws Exception
+    {
+        super.testLastAccessTime();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/LocalSessionScavengingTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/LocalSessionScavengingTest.java
new file mode 100644
index 0000000..58e17de6
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/LocalSessionScavengingTest.java
@@ -0,0 +1,59 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * LocalSessionScavengingTest
+ *
+ *
+ */
+public class LocalSessionScavengingTest extends AbstractLocalSessionScavengingTest
+{
+
+    public static InfinispanTestSupport __testSupport;
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new InfinispanTestSupport();
+        __testSupport.setUseFileStore(true);
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+       __testSupport.teardown();
+    }
+    
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractLocalSessionScavengingTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+        return new InfinispanTestSessionServer(port, max, scavenge, __testSupport.getCache());
+    }
+
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/NewSessionTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/NewSessionTest.java
new file mode 100644
index 0000000..afdfe66
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/NewSessionTest.java
@@ -0,0 +1,66 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * NewSessionTest
+ *
+ *
+ */
+public class NewSessionTest extends AbstractNewSessionTest
+{
+
+   public static InfinispanTestSupport __testSupport;
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new InfinispanTestSupport();
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        __testSupport.teardown();
+    }
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractNewSessionTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+        return new InfinispanTestSessionServer(port, max, scavenge, __testSupport.getCache());
+    }
+
+  
+    @Override
+    public void testNewSession() throws Exception
+    {
+        super.testNewSession();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/ReentrantRequestSessionTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/ReentrantRequestSessionTest.java
new file mode 100644
index 0000000..3edd429
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/ReentrantRequestSessionTest.java
@@ -0,0 +1,64 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * ReentrantRequestSessionTest
+ *
+ *
+ */
+public class ReentrantRequestSessionTest extends AbstractReentrantRequestSessionTest
+{
+    public static InfinispanTestSupport __testSupport;
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new InfinispanTestSupport();
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        __testSupport.teardown();
+    }
+    
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractReentrantRequestSessionTest#createServer(int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+       return new InfinispanTestSessionServer(port, __testSupport.getCache());
+    }
+
+    @Override
+    public void testReentrantRequestSession() throws Exception
+    {
+        super.testReentrantRequestSession();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/RemoveSessionTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/RemoveSessionTest.java
new file mode 100644
index 0000000..ebb534c
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/RemoveSessionTest.java
@@ -0,0 +1,58 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.session;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class RemoveSessionTest extends AbstractRemoveSessionTest
+{
+
+    public static InfinispanTestSupport __testSupport;
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new InfinispanTestSupport();
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        __testSupport.teardown();
+    }
+    
+
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+       InfinispanTestSessionServer s = new InfinispanTestSessionServer(port, max, scavenge, __testSupport.getCache());
+       return s;
+    }
+
+    @Test
+    public void testRemoveSession() throws Exception
+    {
+        super.testRemoveSession();
+    }
+   
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/SameNodeLoadTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/SameNodeLoadTest.java
new file mode 100644
index 0000000..44a9c17
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/SameNodeLoadTest.java
@@ -0,0 +1,66 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * SameNodeLoadTest
+ *
+ *
+ */
+public class SameNodeLoadTest extends AbstractSameNodeLoadTest
+{
+
+    public static InfinispanTestSupport __testSupport;
+
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new InfinispanTestSupport();
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+       __testSupport.teardown();
+    }
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractSameNodeLoadTest#createServer(int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        InfinispanTestSessionServer server = new InfinispanTestSessionServer(port, __testSupport.getCache());
+        return server;
+    }
+
+    @Override
+    public void testLoad() throws Exception
+    {
+        super.testLoad();
+    }
+
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/SessionExpiryTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/SessionExpiryTest.java
new file mode 100644
index 0000000..56f6fe5
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/SessionExpiryTest.java
@@ -0,0 +1,70 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class SessionExpiryTest extends AbstractSessionExpiryTest
+{
+
+    public static InfinispanTestSupport __testSupport;
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new InfinispanTestSupport();
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        __testSupport.teardown();
+    }
+    
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+       InfinispanTestSessionServer server =  new InfinispanTestSessionServer(port, max, scavenge, __testSupport.getCache());
+       return server;
+    }
+
+    @Test
+    @Override
+    public void testSessionNotExpired() throws Exception
+    {
+        super.testSessionNotExpired();
+    }
+
+    @Test
+    @Override
+    public void testSessionExpiry() throws Exception
+    {
+       super.testSessionExpiry();
+    }
+    
+    @Override
+    public void verifySessionDestroyed (TestHttpSessionListener listener, String sessionId)
+    {
+        //noop - sessions that expired when the InfinispanSessionManager was not running are not reloaded and do not have their listeners called on them.
+    }
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/SessionInvalidateAndCreateTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/SessionInvalidateAndCreateTest.java
new file mode 100644
index 0000000..766d964
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/SessionInvalidateAndCreateTest.java
@@ -0,0 +1,66 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * SessionInvalidateAndCreateTest
+ *
+ *
+ */
+public class SessionInvalidateAndCreateTest extends AbstractSessionInvalidateAndCreateTest
+{
+    public static InfinispanTestSupport __testSupport;
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new InfinispanTestSupport();
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        __testSupport.teardown();
+    }
+    
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractSessionInvalidateAndCreateTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+        return new InfinispanTestSessionServer(port, max, scavenge, __testSupport.getCache());
+    }
+
+    @Override
+    public void testSessionScavenge() throws Exception
+    {
+        super.testSessionScavenge();
+    }
+
+    
+    
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/SessionMigrationTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/SessionMigrationTest.java
new file mode 100644
index 0000000..b327c4c
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/SessionMigrationTest.java
@@ -0,0 +1,64 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * SessionMigrationTest
+ *
+ *
+ */
+public class SessionMigrationTest extends AbstractSessionMigrationTest
+{
+
+    public static InfinispanTestSupport __testSupport;
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new InfinispanTestSupport();
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        __testSupport.teardown();
+    }
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractSessionMigrationTest#createServer(int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        return new InfinispanTestSessionServer(port, __testSupport.getCache());
+    }
+
+    @Override
+    public void testSessionMigration() throws Exception
+    {
+        super.testSessionMigration();
+    }
+
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/SessionRenewTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/SessionRenewTest.java
new file mode 100644
index 0000000..36de280
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/SessionRenewTest.java
@@ -0,0 +1,67 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * SessionRenewTest
+ *
+ *
+ */
+public class SessionRenewTest extends AbstractSessionRenewTest
+{
+
+    public static InfinispanTestSupport __testSupport;
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new InfinispanTestSupport();
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        __testSupport.teardown();
+    }
+    
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractSessionRenewTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+        return new InfinispanTestSessionServer(port, max, scavenge, __testSupport.getCache());
+    }
+
+    @Test
+    public void testSessionRenewal() throws Exception
+    {
+        super.testSessionRenewal();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteClientCrossContextSessionTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteClientCrossContextSessionTest.java
new file mode 100644
index 0000000..c7fe124
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteClientCrossContextSessionTest.java
@@ -0,0 +1,69 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session.remote;
+
+
+import org.eclipse.jetty.server.session.AbstractClientCrossContextSessionTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.eclipse.jetty.server.session.InfinispanTestSessionServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * RemoteClientCrossContextSessionTest
+ *
+ *
+ */
+public class RemoteClientCrossContextSessionTest extends AbstractClientCrossContextSessionTest
+{
+  public static RemoteInfinispanTestSupport __testSupport;
+
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new RemoteInfinispanTestSupport("remote-session-test");
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+       __testSupport.teardown();
+    }
+    
+    
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        InfinispanTestSessionServer server = new InfinispanTestSessionServer(port, __testSupport.getCache());
+        return server;
+    }
+    
+    @Test
+    public void testCrossContextDispatch() throws Exception
+    {
+        super.testCrossContextDispatch();
+    }
+
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteForwardedSessionTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteForwardedSessionTest.java
new file mode 100644
index 0000000..4b976df
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteForwardedSessionTest.java
@@ -0,0 +1,68 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session.remote;
+
+import org.eclipse.jetty.server.session.AbstractForwardedSessionTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.eclipse.jetty.server.session.InfinispanTestSessionServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * RemoteForwardedSessionTest
+ *
+ *
+ */
+public class RemoteForwardedSessionTest extends AbstractForwardedSessionTest
+{
+
+    public static RemoteInfinispanTestSupport __testSupport;
+
+
+
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new RemoteInfinispanTestSupport("remote-session-test");
+        __testSupport.setup();
+    }
+
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        __testSupport.teardown();
+    }
+
+
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        InfinispanTestSessionServer server = new InfinispanTestSessionServer(port, __testSupport.getCache());
+        return server;
+    }
+
+    @Test
+    public void testSessionCreateInForward() throws Exception
+    {
+        super.testSessionCreateInForward();
+    }
+
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteImmortalSessionTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteImmortalSessionTest.java
new file mode 100644
index 0000000..3654fe0
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteImmortalSessionTest.java
@@ -0,0 +1,74 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session.remote;
+
+import org.eclipse.jetty.server.session.AbstractImmortalSessionTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.eclipse.jetty.server.session.InfinispanTestSessionServer;
+import org.infinispan.Cache;
+import org.infinispan.configuration.cache.ConfigurationBuilder;
+import org.infinispan.manager.DefaultCacheManager;
+import org.infinispan.manager.EmbeddedCacheManager;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * ImmortalSessionTest
+ *
+ *
+ */
+public class RemoteImmortalSessionTest extends AbstractImmortalSessionTest
+{
+
+
+    public static RemoteInfinispanTestSupport __testSupport;
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new RemoteInfinispanTestSupport("remote-session-test");
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+       __testSupport.teardown();
+    }
+    
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractImmortalSessionTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int maxInactiveMs, int scavengeMs)
+    {
+        return new InfinispanTestSessionServer(port, maxInactiveMs, scavengeMs, __testSupport.getCache());
+    }
+
+    @Override
+    public void testImmortalSession() throws Exception
+    {
+        super.testImmortalSession();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteInfinispanTestSupport.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteInfinispanTestSupport.java
new file mode 100644
index 0000000..a936e20
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteInfinispanTestSupport.java
@@ -0,0 +1,88 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session.remote;
+
+import java.io.File;
+
+import org.eclipse.jetty.util.IO;
+import org.infinispan.Cache;
+import org.infinispan.client.hotrod.RemoteCache;
+import org.infinispan.client.hotrod.RemoteCacheManager;
+import org.infinispan.configuration.cache.Configuration;
+import org.infinispan.configuration.cache.ConfigurationBuilder;
+import org.infinispan.configuration.global.GlobalConfigurationBuilder;
+import org.infinispan.manager.DefaultCacheManager;
+import org.infinispan.manager.EmbeddedCacheManager;
+
+/**
+ * RemoteInfinispanTestSupport
+ *
+ *
+ */
+public class RemoteInfinispanTestSupport
+{
+    public static final String DEFAULT_CACHE_NAME =  "session_test_cache";
+    public  RemoteCache _cache;
+    private String _name;
+    public static  RemoteCacheManager _manager;
+    
+    static
+    {
+        try
+        {
+            _manager = new RemoteCacheManager();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+    
+    public RemoteInfinispanTestSupport ()
+    {
+        this (null);
+    }
+    
+    public RemoteInfinispanTestSupport(String cacheName)
+    {     
+        if (cacheName == null)
+            cacheName = DEFAULT_CACHE_NAME+System.currentTimeMillis();
+        
+        _name = cacheName;
+    }
+    
+ 
+  
+    public RemoteCache getCache ()
+    {
+        return _cache;
+    }
+    
+    public void setup () throws Exception
+    {
+       _cache = _manager.getCache(_name);
+    }
+
+
+    public void teardown () throws Exception
+    {
+        
+    }
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteInvalidationSessionTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteInvalidationSessionTest.java
new file mode 100644
index 0000000..95841c6
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteInvalidationSessionTest.java
@@ -0,0 +1,93 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session.remote;
+
+import org.eclipse.jetty.server.session.AbstractInvalidationSessionTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.eclipse.jetty.server.session.InfinispanTestSessionServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * InvalidationSessionTest
+ *
+ *
+ */
+public class RemoteInvalidationSessionTest extends AbstractInvalidationSessionTest
+{
+
+    public static RemoteInfinispanTestSupport __testSupport;
+    public static long __staleSec = 3L;
+   
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+      __testSupport = new RemoteInfinispanTestSupport("remote-session-test");
+      __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+       __testSupport.teardown();
+    }
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractInvalidationSessionTest#createServer(int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        return new InfinispanTestSessionServer(port, __testSupport.getCache());
+    }
+
+    
+    
+    
+    @Override
+    public void testInvalidation() throws Exception
+    {
+        super.testInvalidation();
+    }
+
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractInvalidationSessionTest#pause()
+     */
+    @Override
+    public void pause()
+    {
+        //This test moves a session from node 1 to node 2, then invalidates the session back on node1. This
+        //should never happen with a decent load balancer.
+        //The infinispan session manager on node 2 will hold the session in local memory for a specific (configurable)
+        //amount of time. We've set the stale session time to 3 sec, so we need to pause for at least this long before making
+        //another request to node2 so 
+        //that the node will re-load the session from the database and discover that it has gone.
+        try
+        {
+            Thread.sleep(2 * __staleSec * 1000);
+        }
+        catch (InterruptedException e)
+        {
+        }
+    }
+
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteLastAccessTimeTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteLastAccessTimeTest.java
new file mode 100644
index 0000000..e4e82fa
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteLastAccessTimeTest.java
@@ -0,0 +1,67 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.session.remote;
+
+import java.io.File;
+
+import org.eclipse.jetty.server.session.AbstractLastAccessTimeTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.eclipse.jetty.server.session.InfinispanTestSessionServer;
+import org.eclipse.jetty.util.IO;
+import org.infinispan.Cache;
+import org.infinispan.configuration.cache.Configuration;
+import org.infinispan.configuration.cache.ConfigurationBuilder;
+import org.infinispan.manager.DefaultCacheManager;
+import org.infinispan.manager.EmbeddedCacheManager;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+public class RemoteLastAccessTimeTest extends AbstractLastAccessTimeTest
+{ 
+   public static RemoteInfinispanTestSupport __testSupport;
+   
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+       __testSupport = new RemoteInfinispanTestSupport("remote-session-test");
+       __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+       __testSupport.teardown();
+    }
+    
+
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+        return new InfinispanTestSessionServer(port, max, scavenge, __testSupport.getCache());
+    }
+
+    @Override
+    public void testLastAccessTime() throws Exception
+    {
+        super.testLastAccessTime();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteLocalSessionScavengingTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteLocalSessionScavengingTest.java
new file mode 100644
index 0000000..1881ab7
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteLocalSessionScavengingTest.java
@@ -0,0 +1,61 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session.remote;
+
+import org.eclipse.jetty.server.session.AbstractLocalSessionScavengingTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.eclipse.jetty.server.session.InfinispanTestSessionServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * LocalSessionScavengingTest
+ *
+ *
+ */
+public class RemoteLocalSessionScavengingTest extends AbstractLocalSessionScavengingTest
+{
+
+    public static RemoteInfinispanTestSupport __testSupport;
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new RemoteInfinispanTestSupport("remote-session-test");
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+       __testSupport.teardown();
+    }
+    
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractLocalSessionScavengingTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+        return new InfinispanTestSessionServer(port, max, scavenge, __testSupport.getCache());
+    }
+
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteNewSessionTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteNewSessionTest.java
new file mode 100644
index 0000000..d46d64b
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteNewSessionTest.java
@@ -0,0 +1,69 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session.remote;
+
+import org.eclipse.jetty.server.session.AbstractNewSessionTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.eclipse.jetty.server.session.InfinispanTestSessionServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * NewSessionTest
+ *
+ *
+ */
+public class RemoteNewSessionTest extends AbstractNewSessionTest
+{
+
+   public static RemoteInfinispanTestSupport __testSupport;
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new RemoteInfinispanTestSupport("remote-session-test");
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        __testSupport.teardown();
+    }
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractNewSessionTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+        return new InfinispanTestSessionServer(port, max, scavenge, __testSupport.getCache());
+    }
+
+  
+    @Override
+    public void testNewSession() throws Exception
+    {
+        super.testNewSession();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteReentrantRequestSessionTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteReentrantRequestSessionTest.java
new file mode 100644
index 0000000..fedb5b9
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteReentrantRequestSessionTest.java
@@ -0,0 +1,67 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session.remote;
+
+import org.eclipse.jetty.server.session.AbstractReentrantRequestSessionTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.eclipse.jetty.server.session.InfinispanTestSessionServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * ReentrantRequestSessionTest
+ *
+ *
+ */
+public class RemoteReentrantRequestSessionTest extends AbstractReentrantRequestSessionTest
+{
+    public static RemoteInfinispanTestSupport __testSupport;
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new RemoteInfinispanTestSupport("remote-session-test");
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        __testSupport.teardown();
+    }
+    
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractReentrantRequestSessionTest#createServer(int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+       return new InfinispanTestSessionServer(port, __testSupport.getCache());
+    }
+
+    @Override
+    public void testReentrantRequestSession() throws Exception
+    {
+        super.testReentrantRequestSession();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteRemoveSessionTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteRemoveSessionTest.java
new file mode 100644
index 0000000..26ce9ce
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteRemoveSessionTest.java
@@ -0,0 +1,61 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.session.remote;
+
+import org.eclipse.jetty.server.session.AbstractRemoveSessionTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.eclipse.jetty.server.session.InfinispanTestSessionServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class RemoteRemoveSessionTest extends AbstractRemoveSessionTest
+{
+
+    public static RemoteInfinispanTestSupport __testSupport;
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new RemoteInfinispanTestSupport("remote-session-test");
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        __testSupport.teardown();
+    }
+    
+
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+       InfinispanTestSessionServer s = new InfinispanTestSessionServer(port, max, scavenge, __testSupport.getCache());
+       return s;
+    }
+
+    @Test
+    public void testRemoveSession() throws Exception
+    {
+        super.testRemoveSession();
+    }
+   
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteSameNodeLoadTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteSameNodeLoadTest.java
new file mode 100644
index 0000000..ea98f0f
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteSameNodeLoadTest.java
@@ -0,0 +1,69 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session.remote;
+
+import org.eclipse.jetty.server.session.AbstractSameNodeLoadTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.eclipse.jetty.server.session.InfinispanTestSessionServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * SameNodeLoadTest
+ *
+ *
+ */
+public class RemoteSameNodeLoadTest extends AbstractSameNodeLoadTest
+{
+
+    public static RemoteInfinispanTestSupport __testSupport;
+
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new RemoteInfinispanTestSupport("remote-session-test");
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+       __testSupport.teardown();
+    }
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractSameNodeLoadTest#createServer(int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        InfinispanTestSessionServer server = new InfinispanTestSessionServer(port, __testSupport.getCache());
+        return server;
+    }
+
+    @Override
+    public void testLoad() throws Exception
+    {
+        super.testLoad();
+    }
+
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteSessionExpiryTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteSessionExpiryTest.java
new file mode 100644
index 0000000..b328a90
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteSessionExpiryTest.java
@@ -0,0 +1,73 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session.remote;
+
+import org.eclipse.jetty.server.session.AbstractSessionExpiryTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.eclipse.jetty.server.session.InfinispanTestSessionServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class RemoteSessionExpiryTest extends AbstractSessionExpiryTest
+{
+
+    public static RemoteInfinispanTestSupport __testSupport;
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new RemoteInfinispanTestSupport("remote-session-test");
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        __testSupport.teardown();
+    }
+    
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+       InfinispanTestSessionServer server =  new InfinispanTestSessionServer(port, max, scavenge, __testSupport.getCache());
+       return server;
+    }
+
+    @Test
+    @Override
+    public void testSessionNotExpired() throws Exception
+    {
+        super.testSessionNotExpired();
+    }
+
+    @Test
+    @Override
+    public void testSessionExpiry() throws Exception
+    {
+       super.testSessionExpiry();
+    }
+    
+    @Override
+    public void verifySessionDestroyed (TestHttpSessionListener listener, String sessionId)
+    {
+        //noop - sessions that expired when the InfinispanSessionManager was not running are not reloaded and do not have their listeners called on them.
+    }
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteSessionInvalidateAndCreateTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteSessionInvalidateAndCreateTest.java
new file mode 100644
index 0000000..581354e
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteSessionInvalidateAndCreateTest.java
@@ -0,0 +1,69 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session.remote;
+
+import org.eclipse.jetty.server.session.AbstractSessionInvalidateAndCreateTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.eclipse.jetty.server.session.InfinispanTestSessionServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * SessionInvalidateAndCreateTest
+ *
+ *
+ */
+public class RemoteSessionInvalidateAndCreateTest extends AbstractSessionInvalidateAndCreateTest
+{
+    public static RemoteInfinispanTestSupport __testSupport;
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new RemoteInfinispanTestSupport("remote-session-test");
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        __testSupport.teardown();
+    }
+    
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractSessionInvalidateAndCreateTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+        return new InfinispanTestSessionServer(port, max, scavenge, __testSupport.getCache());
+    }
+
+    @Override
+    public void testSessionScavenge() throws Exception
+    {
+        super.testSessionScavenge();
+    }
+
+    
+    
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteSessionMigrationTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteSessionMigrationTest.java
new file mode 100644
index 0000000..ded67c5
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteSessionMigrationTest.java
@@ -0,0 +1,68 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session.remote;
+
+import org.eclipse.jetty.server.session.AbstractSessionMigrationTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.eclipse.jetty.server.session.InfinispanTestSessionServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * RemoteSessionMigrationTest
+ *
+ *
+ */
+public class RemoteSessionMigrationTest extends AbstractSessionMigrationTest
+{
+
+    public static RemoteInfinispanTestSupport __testSupport;
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new RemoteInfinispanTestSupport("remote-session-test");
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        __testSupport.teardown();
+    }
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractSessionMigrationTest#createServer(int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        return new InfinispanTestSessionServer(port, __testSupport.getCache());
+    }
+
+    @Override
+    public void testSessionMigration() throws Exception
+    {
+        super.testSessionMigration();
+    }
+   
+
+}
diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteSessionRenewTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteSessionRenewTest.java
new file mode 100644
index 0000000..f39fcb2
--- /dev/null
+++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteSessionRenewTest.java
@@ -0,0 +1,70 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session.remote;
+
+import org.eclipse.jetty.server.session.AbstractSessionRenewTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.eclipse.jetty.server.session.InfinispanTestSessionServer;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * SessionRenewTest
+ *
+ *
+ */
+public class RemoteSessionRenewTest extends AbstractSessionRenewTest
+{
+
+    public static RemoteInfinispanTestSupport __testSupport;
+    
+    
+    @BeforeClass
+    public static void setup () throws Exception
+    {
+        __testSupport = new RemoteInfinispanTestSupport("remote-session-test");
+        __testSupport.setup();
+    }
+    
+    @AfterClass
+    public static void teardown () throws Exception
+    {
+        __testSupport.teardown();
+    }
+    
+    
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractSessionRenewTest#createServer(int, int, int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port, int max, int scavenge)
+    {
+        return new InfinispanTestSessionServer(port, max, scavenge, __testSupport.getCache());
+    }
+
+    @Test
+    public void testSessionRenewal() throws Exception
+    {
+        super.testSessionRenewal();
+    }
+
+    
+}
diff --git a/tests/test-sessions/test-jdbc-sessions/pom.xml b/tests/test-sessions/test-jdbc-sessions/pom.xml
index e57fef9..fde0207 100644
--- a/tests/test-sessions/test-jdbc-sessions/pom.xml
+++ b/tests/test-sessions/test-jdbc-sessions/pom.xml
@@ -21,11 +21,14 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-sessions-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <artifactId>test-jdbc-sessions</artifactId>
   <name>Jetty Tests :: Sessions :: JDBC</name>
   <url>http://www.eclipse.org/jetty</url>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.sessions.jdbc</bundle-symbolic-name>
+  </properties>
   <build>
     <plugins>
       <plugin>
diff --git a/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/DirtyAttributeTest.java b/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/DirtyAttributeTest.java
index 61e1bf3..5d2379a 100644
--- a/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/DirtyAttributeTest.java
+++ b/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/DirtyAttributeTest.java
@@ -77,7 +77,7 @@
                 ContentResponse response = client.GET("http://localhost:" + port + "/mod/test?action=create");
                 
                 assertEquals(HttpServletResponse.SC_OK,response.getStatus());
-                String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+                String sessionCookie = response.getHeaders().get("Set-Cookie");
                 assertTrue(sessionCookie != null);
                 // Mangle the cookie, replacing Path with $Path, etc.
                 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
diff --git a/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/ForwardedSessionTest.java b/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/ForwardedSessionTest.java
new file mode 100644
index 0000000..7d2f42b
--- /dev/null
+++ b/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/ForwardedSessionTest.java
@@ -0,0 +1,50 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.server.session;
+
+import org.junit.Test;
+
+/**
+ * ForwardedSessionTest
+ *
+ *
+ */
+public class ForwardedSessionTest extends AbstractForwardedSessionTest
+{
+
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractForwardedSessionTest#createServer(int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        return new JdbcTestServer(port);
+    }
+
+    @Test
+    public void testSessionCreateInForward() throws Exception
+    {
+        super.testSessionCreateInForward();
+    }
+    
+    
+    
+
+}
diff --git a/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/JdbcTestServer.java b/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/JdbcTestServer.java
index ad0a692..5b55861 100644
--- a/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/JdbcTestServer.java
+++ b/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/JdbcTestServer.java
@@ -76,14 +76,14 @@
      * @see org.eclipse.jetty.server.session.AbstractTestServer#newSessionIdManager(String)
      */
     @Override
-    public  SessionIdManager newSessionIdManager(String config)
+    public  SessionIdManager newSessionIdManager(Object config)
     {
         synchronized(JdbcTestServer.class)
         {
             JDBCSessionIdManager idManager = new JDBCSessionIdManager(_server);
             idManager.setScavengeInterval(_scavengePeriod);
             idManager.setWorkerName("w"+(__workers++));
-            idManager.setDriverInfo(DRIVER_CLASS, (config==null?DEFAULT_CONNECTION_URL:config));
+            idManager.setDriverInfo(DRIVER_CLASS, (config==null?DEFAULT_CONNECTION_URL:(String)config));
             JDBCSessionIdManager.SessionIdTableSchema idTableSchema = new JDBCSessionIdManager.SessionIdTableSchema();
             idTableSchema.setTableName("mysessionids");
             idTableSchema.setIdColumn("myid");
diff --git a/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/MaxInactiveMigrationTest.java b/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/MaxInactiveMigrationTest.java
index 6aa2bd3..6256945 100644
--- a/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/MaxInactiveMigrationTest.java
+++ b/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/MaxInactiveMigrationTest.java
@@ -103,7 +103,7 @@
         ContentResponse response = request.send();
         assertEquals(HttpServletResponse.SC_OK, response.getStatus());
 
-        sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+        sessionCookie = response.getHeaders().get("Set-Cookie");
         assertTrue( sessionCookie != null );
         // Mangle the cookie, replacing Path with $Path, etc.
         sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
diff --git a/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/ModifyMaxInactiveIntervalTest.java b/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/ModifyMaxInactiveIntervalTest.java
index fd11d1a..a39b655 100644
--- a/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/ModifyMaxInactiveIntervalTest.java
+++ b/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/ModifyMaxInactiveIntervalTest.java
@@ -70,7 +70,7 @@
                 ContentResponse response = client.GET("http://localhost:" + port + "/mod/test?action=create");
                 
                 assertEquals(HttpServletResponse.SC_OK,response.getStatus());
-                String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+                String sessionCookie = response.getHeaders().get("Set-Cookie");
                 assertTrue(sessionCookie != null);
                 // Mangle the cookie, replacing Path with $Path, etc.
                 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
diff --git a/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/ReloadedSessionMissingClassTest.java b/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/ReloadedSessionMissingClassTest.java
index a502720..4dbec1c 100644
--- a/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/ReloadedSessionMissingClassTest.java
+++ b/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/ReloadedSessionMissingClassTest.java
@@ -104,7 +104,7 @@
                 ContentResponse response = client.GET("http://localhost:" + port1 + contextPath +"/bar?action=set");
                 
                 assertEquals( HttpServletResponse.SC_OK, response.getStatus());
-                String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+                String sessionCookie = response.getHeaders().get("Set-Cookie");
                 assertTrue(sessionCookie != null);
                 String sessionId = (String)webApp.getServletContext().getAttribute("foo");
                 assertNotNull(sessionId);
diff --git a/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/SaveIntervalTest.java b/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/SaveIntervalTest.java
index 2b7b62e..3b02825 100644
--- a/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/SaveIntervalTest.java
+++ b/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/SaveIntervalTest.java
@@ -35,8 +35,8 @@
 import org.eclipse.jetty.client.api.Request;
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.servlet.ServletHolder;
-import org.junit.Test;
 import org.junit.Ignore;
+import org.junit.Test;
 
 /**
  *  SaveIntervalTest
@@ -77,7 +77,7 @@
                 // Perform a request to create a session              
                 ContentResponse response = client.GET("http://localhost:" + port + "/mod/test?action=create");
                 assertEquals(HttpServletResponse.SC_OK,response.getStatus());
-                String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+                String sessionCookie = response.getHeaders().get("Set-Cookie");
                 assertTrue(sessionCookie != null);
                 // Mangle the cookie, replacing Path with $Path, etc.
                 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
diff --git a/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/SessionExpiryTest.java b/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/SessionExpiryTest.java
index 0452d94..5177b93 100644
--- a/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/SessionExpiryTest.java
+++ b/tests/test-sessions/test-jdbc-sessions/src/test/java/org/eclipse/jetty/server/session/SessionExpiryTest.java
@@ -18,23 +18,9 @@
 
 package org.eclipse.jetty.server.session;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
 import java.sql.DriverManager;
 import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
 
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSessionEvent;
-import javax.servlet.http.HttpSessionListener;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.ContentResponse;
-import org.eclipse.jetty.client.api.Request;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
 import org.junit.After;
 import org.junit.Test;
 
@@ -47,22 +33,6 @@
 public class SessionExpiryTest extends AbstractSessionExpiryTest
 {
 
-    public class TestHttpSessionListener implements HttpSessionListener
-    {
-        public List<String> createdSessions = new ArrayList<String>();
-        public List<String> destroyedSessions = new ArrayList<String>();
-        
-        public void sessionDestroyed(HttpSessionEvent se)
-        {
-            destroyedSessions.add(se.getSession().getId());
-        }
-        
-        public void sessionCreated(HttpSessionEvent se)
-        {
-            createdSessions.add(se.getSession().getId());
-        }
-    };
-    
     /** 
      * @see org.eclipse.jetty.server.session.AbstractSessionExpiryTest#createServer(int, int, int)
      */
@@ -75,70 +45,9 @@
     @Test
     public void testSessionExpiry() throws Exception
     {
-     
-        
-        String contextPath = "";
-        String servletMapping = "/server";
-        int inactivePeriod = 2;
-        int scavengePeriod = 1;
-        AbstractTestServer server1 = createServer(0, inactivePeriod, scavengePeriod);
-        TestServlet servlet = new TestServlet();
-        ServletHolder holder = new ServletHolder(servlet);
-        ServletContextHandler context = server1.addContext(contextPath);
-        context.addServlet(holder, servletMapping);
-        TestHttpSessionListener listener = new TestHttpSessionListener();
-        
-        context.getSessionHandler().addEventListener(listener);
-        
-        server1.start();
-        int port1 = server1.getPort();
-
-        try
-        {
-            HttpClient client = new HttpClient();
-            client.start();
-            String url = "http://localhost:" + port1 + contextPath + servletMapping;
-
-            //make a request to set up a session on the server
-            ContentResponse response1 = client.GET(url + "?action=init");
-            assertEquals(HttpServletResponse.SC_OK,response1.getStatus());
-            String sessionCookie = response1.getHeaders().getStringField("Set-Cookie");
-            assertTrue(sessionCookie != null);
-            // Mangle the cookie, replacing Path with $Path, etc.
-            sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
-            
-            String sessionId = extractSessionId(sessionCookie);     
-            
-            assertTrue(listener.createdSessions.contains(sessionId));
-            //now stop the server
-            server1.stop();
-
-            //and wait until the expiry time has passed
-            pause(inactivePeriod);
-
-            //restart the server
-            server1.start();
-            
-            port1 = server1.getPort();
-            url = "http://localhost:" + port1 + contextPath + servletMapping;
-
-            //make another request, the session should have expired
-            Request request = client.newRequest(url + "?action=test");
-            request.getHeaders().add("Cookie", sessionCookie);
-            ContentResponse response2 = request.send();
-            assertEquals(HttpServletResponse.SC_OK,response2.getStatus());
-            
-            //and wait until the expiry time has passed
-            pause(inactivePeriod);
-            
-            assertTrue(listener.destroyedSessions.contains(sessionId));
-        }
-        finally
-        {
-            server1.stop();
-        }     
+        super.testSessionExpiry();
     }
-  
+    
     
     
     
@@ -149,24 +58,7 @@
         super.testSessionNotExpired();
     }
 
-    
-    
-    public String extractSessionId (String sessionCookie)
-    {
-        if (sessionCookie == null)
-            return null;
-        sessionCookie = sessionCookie.trim();
-        int i = sessionCookie.indexOf(';');
-        if (i >= 0)
-            sessionCookie = sessionCookie.substring(0,i);
-        if (sessionCookie.startsWith("JSESSIONID"))
-            sessionCookie = sessionCookie.substring("JSESSIONID=".length());
-        i = sessionCookie.indexOf('.');
-        if (i >=0)
-            sessionCookie = sessionCookie.substring(0,i);
-        return sessionCookie;
-    }
-
+  
     
     
     @After
diff --git a/tests/test-sessions/test-mongodb-sessions/pom.xml b/tests/test-sessions/test-mongodb-sessions/pom.xml
index 968e979..91af582 100644
--- a/tests/test-sessions/test-mongodb-sessions/pom.xml
+++ b/tests/test-sessions/test-mongodb-sessions/pom.xml
@@ -21,11 +21,14 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-sessions-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <artifactId>test-mongodb-sessions</artifactId>
   <name>Jetty Tests :: Sessions :: Mongo</name>
   <url>http://www.eclipse.org/jetty</url>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.sessions.mongo</bundle-symbolic-name>
+  </properties>
   <build>
     <plugins>
       <plugin>
diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/AttributeNameTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/AttributeNameTest.java
index 03e1629..5ed5020 100644
--- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/AttributeNameTest.java
+++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/AttributeNameTest.java
@@ -33,6 +33,7 @@
 import org.eclipse.jetty.client.HttpClient;
 import org.eclipse.jetty.client.api.ContentResponse;
 import org.eclipse.jetty.client.api.Request;
+import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.nosql.NoSqlSession;
 import org.eclipse.jetty.server.session.AbstractTestServer;
 import org.junit.Test;
@@ -94,7 +95,8 @@
                 assertEquals("a.b.c",sessionTestResponse[0]);
  
 
-                String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+                String sessionCookie = response.getHeaders().get(HttpHeader.SET_COOKIE);
+                      
                 assertTrue(sessionCookie != null);
                 //Mangle the cookie, replacing Path with $Path, etc.
                 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=","$1\\$Path=");
diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ClientCrossContextSessionTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ClientCrossContextSessionTest.java
index 37de8c0..5879806 100644
--- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ClientCrossContextSessionTest.java
+++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ClientCrossContextSessionTest.java
@@ -20,7 +20,6 @@
 
 import org.eclipse.jetty.server.session.AbstractClientCrossContextSessionTest;
 import org.eclipse.jetty.server.session.AbstractTestServer;
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class ClientCrossContextSessionTest extends AbstractClientCrossContextSessionTest
diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ForwardedSessionTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ForwardedSessionTest.java
new file mode 100644
index 0000000..6cd4c59
--- /dev/null
+++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ForwardedSessionTest.java
@@ -0,0 +1,48 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+
+package org.eclipse.jetty.nosql.mongodb;
+
+import org.eclipse.jetty.server.session.AbstractForwardedSessionTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.Test;
+
+/**
+ * ForwardedSessionTest
+ *
+ *
+ */
+public class ForwardedSessionTest extends AbstractForwardedSessionTest
+{
+
+    /** 
+     * @see org.eclipse.jetty.server.session.AbstractForwardedSessionTest#createServer(int)
+     */
+    @Override
+    public AbstractTestServer createServer(int port)
+    {
+        return new MongoTestServer(port);
+    }
+    
+    @Test
+    public void testSessionCreateInForward() throws Exception
+    {
+        super.testSessionCreateInForward();
+    }
+}
diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/LightLoadTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/LightLoadTest.java
deleted file mode 100644
index 9d241e0..0000000
--- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/LightLoadTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.nosql.mongodb;
-
-import org.eclipse.jetty.server.session.AbstractLightLoadTest;
-import org.eclipse.jetty.server.session.AbstractTestServer;
-import org.junit.Ignore;
-import org.junit.Test;
-
-/**
- * LightLoadTest
- */
-public class LightLoadTest extends AbstractLightLoadTest
-{
-
-    public AbstractTestServer createServer(int port)
-    {
-        return new MongoTestServer(port);
-    }
-
-    @Test
-    public void testLightLoad() throws Exception
-    {
-        super.testLightLoad();
-    }
-
-}
diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/LocalSessionScavengingTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/LocalSessionScavengingTest.java
index 152a19b..6e38725 100644
--- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/LocalSessionScavengingTest.java
+++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/LocalSessionScavengingTest.java
@@ -27,7 +27,9 @@
     @Override
     public AbstractTestServer createServer(int port, int max, int scavenge)
     {
-       return new MongoTestServer(port,max,scavenge);
+       MongoTestServer mserver=new MongoTestServer(port,max,scavenge);
+       ((MongoSessionIdManager)mserver.getServer().getSessionIdManager()).setScavengeBlockSize(0);
+       return mserver;
     }
 
     @Override
diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/MongoTestServer.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/MongoTestServer.java
index dcc5bb6..e3c78c2 100644
--- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/MongoTestServer.java
+++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/MongoTestServer.java
@@ -18,15 +18,19 @@
 
 package org.eclipse.jetty.nosql.mongodb;
 
-import java.util.concurrent.TimeUnit;
+import java.net.UnknownHostException;
 
-import org.eclipse.jetty.nosql.mongodb.MongoSessionIdManager;
-import org.eclipse.jetty.nosql.mongodb.MongoSessionManager;
+import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.SessionIdManager;
 import org.eclipse.jetty.server.SessionManager;
 import org.eclipse.jetty.server.session.AbstractTestServer;
 import org.eclipse.jetty.server.session.SessionHandler;
 
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBCursor;
+import com.mongodb.DBObject;
+import com.mongodb.MongoException;
+
 
 /**
  * @version $Revision$ $Date$
@@ -36,6 +40,28 @@
     static int __workers=0;
     private boolean _saveAllAttributes = false; // false save dirty, true save all
     
+    
+    public static class TestMongoSessionIdManager extends MongoSessionIdManager 
+    {
+
+        public TestMongoSessionIdManager(Server server) throws UnknownHostException, MongoException
+        {
+            super(server);
+        }
+        
+        
+        public void deleteAll ()
+        {
+            
+            DBCursor checkSessions = _sessions.find();
+
+            for (DBObject session : checkSessions)
+            {
+                _sessions.remove(session);
+            }
+        }
+    }
+    
     public MongoTestServer(int port)
     {
         super(port, 30, 10);
@@ -54,12 +80,12 @@
         _saveAllAttributes = saveAllAttributes;
     }
 
-    public SessionIdManager newSessionIdManager(String config)
+    public SessionIdManager newSessionIdManager(Object config)
     {
         try
         {
             System.err.println("MongoTestServer:SessionIdManager scavenge: delay:"+ _scavengePeriod + " period:"+_scavengePeriod);
-            MongoSessionIdManager idManager = new MongoSessionIdManager(_server);
+            MongoSessionIdManager idManager = new TestMongoSessionIdManager(_server);
             idManager.setWorkerName("w"+(__workers++));
             idManager.setScavengePeriod(_scavengePeriod);                  
 
diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/NewSessionTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/NewSessionTest.java
index 191d726..2e6f6a6 100644
--- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/NewSessionTest.java
+++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/NewSessionTest.java
@@ -20,7 +20,6 @@
 
 import org.eclipse.jetty.server.session.AbstractNewSessionTest;
 import org.eclipse.jetty.server.session.AbstractTestServer;
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/OrphanedSessionTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/OrphanedSessionTest.java
index 350df9f..7299cbd 100644
--- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/OrphanedSessionTest.java
+++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/OrphanedSessionTest.java
@@ -20,7 +20,6 @@
 
 import org.eclipse.jetty.server.session.AbstractOrphanedSessionTest;
 import org.eclipse.jetty.server.session.AbstractTestServer;
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/PurgeInvalidSessionTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/PurgeInvalidSessionTest.java
index 2332ea4..fc080fc 100644
--- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/PurgeInvalidSessionTest.java
+++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/PurgeInvalidSessionTest.java
@@ -19,8 +19,8 @@
 package org.eclipse.jetty.nosql.mongodb;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
 import java.net.UnknownHostException;
@@ -73,7 +73,7 @@
         MongoTestServer server = createServer(0, 1, 0);
         ServletContextHandler context = server.addContext(contextPath);
         context.addServlet(TestServlet.class, servletMapping);
-        
+
         MongoSessionManager sessionManager = (MongoSessionManager)context.getSessionHandler().getSessionManager();
         MongoSessionIdManager idManager = (MongoSessionIdManager)server.getServer().getSessionIdManager();
         idManager.setPurge(true);
@@ -94,7 +94,7 @@
                 //Create a session
                 ContentResponse response = client.GET("http://localhost:" + port + contextPath + servletMapping + "?action=create");
                 assertEquals(HttpServletResponse.SC_OK,response.getStatus());
-                String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+                String sessionCookie = response.getHeaders().get("Set-Cookie");
                 assertTrue(sessionCookie != null);
                 // Mangle the cookie, replacing Path with $Path, etc.
                 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
@@ -124,8 +124,83 @@
         }
 
     }
-    
-    
+
+
+    @Test
+    public void testPurgeInvalidSessionsWithLimit() throws Exception
+    {
+        String contextPath = "";
+        String servletMapping = "/server";
+        long purgeInvalidAge = 1000; //1 sec
+        int purgeLimit = 5; // only purge 5 sessions for each purge run
+
+        //ensure scavenging is turned off so the purger gets a chance to find the session
+        MongoTestServer server = createServer(0, 1, 0);
+        ServletContextHandler context = server.addContext(contextPath);
+        context.addServlet(TestServlet.class, servletMapping);
+
+        // disable purging so we can call it manually below
+        MongoSessionManager sessionManager = (MongoSessionManager)context.getSessionHandler().getSessionManager();
+        MongoSessionIdManager idManager = (MongoSessionIdManager)server.getServer().getSessionIdManager();
+        idManager.setPurge(false);
+        idManager.setPurgeLimit(purgeLimit);
+        idManager.setPurgeInvalidAge(purgeInvalidAge);
+        // don't purge valid sessions
+        idManager.setPurgeValidAge(0);
+
+
+        server.start();
+        int port=server.getPort();
+        try
+        {
+            // cleanup any previous sessions that are invalid so that we are starting fresh
+            idManager.purgeFully();
+            long sessionCountAtTestStart = sessionManager.getSessionStoreCount();
+
+            HttpClient client = new HttpClient();
+            client.start();
+            try
+            {
+                // create double the purge limit of sessions, and make them all invalid
+                for (int i = 0; i < purgeLimit * 2; i++)
+                {
+                    ContentResponse response = client.GET("http://localhost:" + port + contextPath + servletMapping + "?action=create");
+                    assertEquals(HttpServletResponse.SC_OK, response.getStatus());
+                    String sessionCookie = response.getHeaders().get("Set-Cookie");
+                    assertTrue(sessionCookie != null);
+                    // Mangle the cookie, replacing Path with $Path, etc.
+                    sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
+
+
+                    Request request = client.newRequest("http://localhost:" + port + contextPath + servletMapping + "?action=invalidate");
+                    request.header("Cookie", sessionCookie);
+                    response = request.send();
+                    assertEquals(HttpServletResponse.SC_OK, response.getStatus());
+                }
+
+                // sleep for our invalid age period so that the purge below does something
+                Thread.sleep(purgeInvalidAge * 2);
+
+                // validate that we have the right number of sessions before we purge
+                assertEquals("Expected to find right number of sessions before purge", sessionCountAtTestStart + (purgeLimit * 2), sessionManager.getSessionStoreCount());
+
+                // run our purge we should still have items in the DB
+                idManager.purge();
+                assertEquals("Expected to find sessions remaining in db after purge run with limit set",
+                        sessionCountAtTestStart + purgeLimit, sessionManager.getSessionStoreCount());
+            }
+            finally
+            {
+                client.stop();
+            }
+        }
+        finally
+        {
+            server.stop();
+        }
+    }
+
+
     public static class TestServlet extends HttpServlet
     {
         DBCollection _sessions;
@@ -163,6 +238,8 @@
                 dbSession = _sessions.findOne(new BasicDBObject("id", id));       
                 assertNotNull(dbSession);
                 assertTrue(dbSession.containsField(MongoSessionManager.__INVALIDATED));
+                assertTrue(dbSession.containsField(MongoSessionManager.__VALID));
+                assertTrue(dbSession.get(MongoSessionManager.__VALID).equals(false));
             }
             else if ("test".equals(action))
             {
diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/PurgeValidSessionTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/PurgeValidSessionTest.java
index 9f1198a..b8b4700 100644
--- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/PurgeValidSessionTest.java
+++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/PurgeValidSessionTest.java
@@ -19,8 +19,8 @@
 package org.eclipse.jetty.nosql.mongodb;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
 import java.net.UnknownHostException;
@@ -31,10 +31,10 @@
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
-
 import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.Request;
 import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.client.api.Request;
+import org.eclipse.jetty.nosql.mongodb.MongoTestServer.TestMongoSessionIdManager;
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.junit.Test;
 
@@ -97,7 +97,7 @@
                 //Create a session
                 ContentResponse response = client.GET("http://localhost:" + port + contextPath + servletMapping + "?action=create");
                 assertEquals(HttpServletResponse.SC_OK,response.getStatus());
-                String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+                String sessionCookie = response.getHeaders().get("Set-Cookie");
                 assertTrue(sessionCookie != null);
                 // Mangle the cookie, replacing Path with $Path, etc.
                 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
@@ -124,6 +124,75 @@
     }
 
 
+    @Test
+    public void testPurgeValidSessionWithPurgeLimitSet() throws Exception
+    {
+        String contextPath = "";
+        String servletMapping = "/server";
+        long purgeDelay = 1000; //1 sec
+        long purgeValidAge = 1000; // 1 sec
+        int purgeLimit = 5; // only purge 5 items in each purge run
+
+        //ensure scavenging is turned off so the purger gets a chance to find the session
+        MongoTestServer server = createServer(0, 1, 0);
+        ServletContextHandler context = server.addContext(contextPath);
+        context.addServlet(TestServlet.class, servletMapping);
+
+        MongoSessionManager sessionManager = (MongoSessionManager)context.getSessionHandler().getSessionManager();
+        MongoSessionIdManager idManager = (MongoSessionIdManager)server.getServer().getSessionIdManager();
+        // disable purging we will run it manually below
+        idManager.setPurge(false);
+        idManager.setPurgeLimit(purgeLimit);
+        idManager.setPurgeDelay(purgeDelay);
+        idManager.setPurgeValidAge(purgeValidAge); //purge valid sessions older than
+
+        server.start();
+        int port=server.getPort();
+
+        try
+        {
+            // start with no sessions
+            ((TestMongoSessionIdManager)idManager).deleteAll();
+
+            HttpClient client = new HttpClient();
+            client.start();
+            try
+            {
+                // create double our purgeLmit number of sessions
+                for (int i = 0; i < purgeLimit * 2; i++)
+                {
+                    ContentResponse response = client.GET("http://localhost:" + port + contextPath + servletMapping + "?action=create");
+                    assertEquals(HttpServletResponse.SC_OK, response.getStatus());
+                    String sessionCookie = response.getHeaders().get("Set-Cookie");
+                    assertTrue(sessionCookie != null);
+                    // don't remember our cookies from call to call
+                    client.getCookieStore().removeAll();
+                }
+
+                // delay long enough for purgeValidAge to apply
+                Thread.sleep(2* purgeValidAge);
+
+                // validate that we have the right number of sessions before we purge
+                assertEquals("Expected to find right number of sessions before purge", purgeLimit * 2, sessionManager.getSessionStoreCount());
+
+                // run our purge
+                idManager.purge();
+
+                assertEquals("Expected to find sessions remaining in db after purge run with limit set",
+                        purgeLimit, sessionManager.getSessionStoreCount());
+            }
+            finally
+            {
+                client.stop();
+            }
+        }
+        finally
+        {
+            server.stop();
+        }
+
+    }
+
     public static class TestServlet extends HttpServlet
     {
         DBCollection _sessions;
diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ReentrantRequestSessionTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ReentrantRequestSessionTest.java
index 061401d..1666c3f 100644
--- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ReentrantRequestSessionTest.java
+++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ReentrantRequestSessionTest.java
@@ -20,7 +20,6 @@
 
 import org.eclipse.jetty.server.session.AbstractReentrantRequestSessionTest;
 import org.eclipse.jetty.server.session.AbstractTestServer;
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/RemoveSessionTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/RemoveSessionTest.java
index 95423b9..13ac126 100644
--- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/RemoveSessionTest.java
+++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/RemoveSessionTest.java
@@ -20,7 +20,6 @@
 
 import org.eclipse.jetty.server.session.AbstractRemoveSessionTest;
 import org.eclipse.jetty.server.session.AbstractTestServer;
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class RemoveSessionTest extends AbstractRemoveSessionTest
diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ScatterGunLoadTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ScatterGunLoadTest.java
new file mode 100644
index 0000000..0e5af91
--- /dev/null
+++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ScatterGunLoadTest.java
@@ -0,0 +1,42 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.nosql.mongodb;
+
+import org.eclipse.jetty.server.session.AbstractScatterGunLoadTest;
+import org.eclipse.jetty.server.session.AbstractTestServer;
+import org.junit.Test;
+
+/**
+ * ScatterGunLoadTest
+ */
+public class ScatterGunLoadTest extends AbstractScatterGunLoadTest
+{
+
+    public AbstractTestServer createServer(int port)
+    {
+        return new MongoTestServer(port);
+    }
+
+    @Test
+    public void testLightLoad() throws Exception
+    {
+        super.testLightLoad();
+    }
+
+}
diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ServerCrossContextSessionTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ServerCrossContextSessionTest.java
index 56b92be..7504e07 100644
--- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ServerCrossContextSessionTest.java
+++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ServerCrossContextSessionTest.java
@@ -20,7 +20,6 @@
 
 import org.eclipse.jetty.server.session.AbstractServerCrossContextSessionTest;
 import org.eclipse.jetty.server.session.AbstractTestServer;
-import org.junit.Ignore;
 import org.junit.Test;
 
 
diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/SessionInvalidateAndCreateTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/SessionInvalidateAndCreateTest.java
index 973f6aa..b40f4e5 100644
--- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/SessionInvalidateAndCreateTest.java
+++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/SessionInvalidateAndCreateTest.java
@@ -20,7 +20,6 @@
 
 import org.eclipse.jetty.server.session.AbstractSessionInvalidateAndCreateTest;
 import org.eclipse.jetty.server.session.AbstractTestServer;
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class SessionInvalidateAndCreateTest extends AbstractSessionInvalidateAndCreateTest
diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/SessionSavingValueTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/SessionSavingValueTest.java
index 0889d9e..87804ee 100644
--- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/SessionSavingValueTest.java
+++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/SessionSavingValueTest.java
@@ -26,7 +26,6 @@
 import java.io.Serializable;
 import java.lang.management.ManagementFactory;
 import java.net.MalformedURLException;
-import java.util.concurrent.Future;
 
 import javax.management.remote.JMXServiceURL;
 import javax.servlet.ServletException;
@@ -117,7 +116,7 @@
 
                 sessionTestValue = sessionTestResponse;
 
-                String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+                String sessionCookie = response.getHeaders().get("Set-Cookie");
                 assertTrue(sessionCookie != null);
                 // Mangle the cookie, replacing Path with $Path, etc.
                 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=","$1\\$Path=");
@@ -144,7 +143,7 @@
 
                     sessionTestValue = sessionTestResponse;
 
-                    String setCookie = response2.getHeaders().getStringField("Set-Cookie");
+                    String setCookie = response2.getHeaders().get("Set-Cookie");
                     if (setCookie != null)
                         sessionCookie = setCookie.replaceFirst("(\\W)(P|p)ath=","$1\\$Path=");
 
diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/StopSessionManagerDeleteSessionTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/StopSessionManagerDeleteSessionTest.java
index 89f5277..9bd383d 100644
--- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/StopSessionManagerDeleteSessionTest.java
+++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/StopSessionManagerDeleteSessionTest.java
@@ -86,7 +86,7 @@
                 //Create a session
                 ContentResponse response = client.GET("http://localhost:" + port + contextPath + servletMapping + "?action=create");
                 assertEquals(HttpServletResponse.SC_OK,response.getStatus());
-                String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+                String sessionCookie = response.getHeaders().get("Set-Cookie");
                 assertTrue(sessionCookie != null);
                 // Mangle the cookie, replacing Path with $Path, etc.
                 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
diff --git a/tests/test-sessions/test-sessions-common/pom.xml b/tests/test-sessions/test-sessions-common/pom.xml
index cca05af..74293de 100644
--- a/tests/test-sessions/test-sessions-common/pom.xml
+++ b/tests/test-sessions/test-sessions-common/pom.xml
@@ -21,11 +21,14 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-sessions-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <artifactId>test-sessions-common</artifactId>
   <name>Jetty Tests :: Sessions :: Common</name>
   <url>http://www.eclipse.org/jetty</url>
+    <properties>
+    <bundle-symbolic-name>${project.groupId}.sessions.common</bundle-symbolic-name>
+  </properties>
   <build>
   </build>
   <dependencies>
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractClientCrossContextSessionTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractClientCrossContextSessionTest.java
index 6f44b92..61c85ef 100644
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractClientCrossContextSessionTest.java
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractClientCrossContextSessionTest.java
@@ -74,7 +74,7 @@
                 ContentResponse response = client.GET("http://localhost:" + port + contextA + servletMapping);
 
                 assertEquals(HttpServletResponse.SC_OK,response.getStatus());
-                String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+                String sessionCookie = response.getHeaders().get("Set-Cookie");
                 assertTrue(sessionCookie != null);
                 // Mangle the cookie, replacing Path with $Path, etc.
                 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractForwardedSessionTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractForwardedSessionTest.java
new file mode 100644
index 0000000..e5e6c6b
--- /dev/null
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractForwardedSessionTest.java
@@ -0,0 +1,183 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.session;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.client.api.Request;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.junit.Test;
+
+
+/**
+ * AbstractForwardedSessionTest
+ *
+ * Test that creating a session inside a forward on the same context works, and that
+ * attributes set after the forward returns are preserved.
+ * 
+ * This test requires that the sessions will be persisted, as the server is stopped and
+ * then restarted in order to check that all the attributes were saved.
+ */
+public abstract class AbstractForwardedSessionTest
+{
+   
+
+    public abstract AbstractTestServer createServer(int port);
+    
+    
+    @Test
+    public void testSessionCreateInForward() throws Exception
+    {
+        AbstractTestServer testServer = createServer(0);
+        ServletContextHandler testServletContextHandler = testServer.addContext("/context");
+        testServletContextHandler.addServlet(Servlet1.class, "/one");
+        testServletContextHandler.addServlet(Servlet2.class, "/two");
+        testServletContextHandler.addServlet(Servlet3.class, "/three");
+        testServletContextHandler.addServlet(Servlet4.class, "/four");
+       
+      
+
+        try
+        {
+            testServer.start();
+            int serverPort=testServer.getPort();
+            HttpClient client = new HttpClient();
+            client.start();
+            try
+            {
+                //make a request to the first servlet, which will forward it to other servlets
+                ContentResponse response = client.GET("http://localhost:" + serverPort + "/context/one");
+                assertEquals(HttpServletResponse.SC_OK, response.getStatus());
+                String sessionCookie = response.getHeaders().get("Set-Cookie");
+                assertTrue(sessionCookie != null);
+                // Mangle the cookie, replacing Path with $Path, etc.
+                sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
+
+                //test that the session was created, and that it contains the attributes from servlet3 and servlet1
+                
+                //stop the server, to make sure any session persistence has happened
+                testServer.stop();
+                            
+                //restart
+                testServer.start();
+                serverPort = testServer.getPort();
+       
+                //Make a fresh request
+                Request request = client.newRequest("http://localhost:" + serverPort + "/context/four");
+                request.header("Cookie", sessionCookie);
+                response = request.send();
+                assertEquals(HttpServletResponse.SC_OK, response.getStatus());
+                
+            }
+            finally
+            {
+                client.stop();
+            }
+        }
+        finally
+        {
+            testServer.stop();
+        }
+        
+    }
+    
+
+    public static class Servlet1 extends HttpServlet
+    {
+        @Override
+        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+        {
+            //Don't create a session, just forward to another session in the same context
+            assertNull(request.getSession(false));
+            
+            //The session will be created by the other servlet, so will exist as this dispatch returns
+            RequestDispatcher dispatcher = request.getServletContext().getRequestDispatcher("/two");
+            dispatcher.forward(request, response);
+   
+            HttpSession sess = request.getSession(false);
+            assertNotNull(sess);
+            sess.setAttribute("servlet1", "servlet1");
+        }
+    }
+
+    public static class Servlet2 extends HttpServlet
+    {
+        @Override
+        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+        {
+            //forward to yet another servlet to do the creation
+            assertNull(request.getSession(false));
+
+            RequestDispatcher dispatcher = request.getServletContext().getRequestDispatcher("/three");
+            dispatcher.forward(request, response);
+            
+            //the session should exist after the forward
+            HttpSession sess = request.getSession(false);
+            assertNotNull(sess);
+        }
+    }
+
+
+
+    public static class Servlet3 extends HttpServlet
+    {
+        @Override
+        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+        {    
+            //No session yet
+            assertNull(request.getSession(false));
+            
+            //Create it
+            HttpSession session = request.getSession();
+            assertNotNull(session);
+            
+            //Set an attribute on it
+            session.setAttribute("servlet3", "servlet3");
+        }
+    }
+    
+    
+    public static class Servlet4 extends HttpServlet
+    {
+        @Override
+        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+        {    
+            //Check that the session contains attributes set during and after the session forward
+            HttpSession session = request.getSession();
+            assertNotNull(session);
+            assertNotNull(session.getAttribute("servlet1"));
+            assertNotNull(session.getAttribute("servlet3"));
+        }
+    }
+    
+}
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractImmortalSessionTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractImmortalSessionTest.java
index 6d29c63..3d1c970 100644
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractImmortalSessionTest.java
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractImmortalSessionTest.java
@@ -64,7 +64,7 @@
                 int value = 42;
                 ContentResponse response = client.GET("http://localhost:" + port + contextPath + servletMapping + "?action=set&value=" + value);
                 assertEquals(HttpServletResponse.SC_OK,response.getStatus());
-                String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+                String sessionCookie = response.getHeaders().get("Set-Cookie");
                 assertTrue(sessionCookie != null);
                 // Mangle the cookie, replacing Path with $Path, etc.
                 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractInvalidationSessionTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractInvalidationSessionTest.java
index 5ef2d85..8d2d660 100644
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractInvalidationSessionTest.java
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractInvalidationSessionTest.java
@@ -79,23 +79,26 @@
                     ContentResponse response1 = client.GET(urls[0] + "?action=init");
 
                     assertEquals(HttpServletResponse.SC_OK,response1.getStatus());
-                    String sessionCookie = response1.getHeaders().getStringField("Set-Cookie");
+                    String sessionCookie = response1.getHeaders().get("Set-Cookie");
                     assertTrue(sessionCookie != null);
                     // Mangle the cookie, replacing Path with $Path, etc.
                     sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
-
+                    
+                    
                     // Be sure the session is also present in node2
 
                     Request request2 = client.newRequest(urls[1] + "?action=increment");
                     request2.header("Cookie", sessionCookie);
                     ContentResponse response2 = request2.send();
                     assertEquals(HttpServletResponse.SC_OK,response2.getStatus());
+ 
 
                     // Invalidate on node1
                     Request request1 = client.newRequest(urls[0] + "?action=invalidate");
                     request1.header("Cookie", sessionCookie);
                     response1 = request1.send();
                     assertEquals(HttpServletResponse.SC_OK, response1.getStatus());
+           
 
                     pause();
 
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractLastAccessTimeTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractLastAccessTimeTest.java
index 589b3bb..787eb73 100644
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractLastAccessTimeTest.java
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractLastAccessTimeTest.java
@@ -87,7 +87,7 @@
                     ContentResponse response1 = client.GET("http://localhost:" + port1 + contextPath + servletMapping + "?action=init");
                     assertEquals(HttpServletResponse.SC_OK, response1.getStatus());
                     assertEquals("test", response1.getContentAsString());
-                    String sessionCookie = response1.getHeaders().getStringField("Set-Cookie");
+                    String sessionCookie = response1.getHeaders().get("Set-Cookie");
                     assertTrue( sessionCookie != null );
                     // Mangle the cookie, replacing Path with $Path, etc.
                     sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
@@ -106,7 +106,7 @@
                         assertEquals(HttpServletResponse.SC_OK , response2.getStatus());
                         assertEquals("test", response2.getContentAsString());
 
-                        String setCookie = response2.getHeaders().getStringField("Set-Cookie");
+                        String setCookie = response2.getHeaders().get("Set-Cookie");
                         if (setCookie!=null)
                             sessionCookie = setCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
 
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractLightLoadTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractLightLoadTest.java
deleted file mode 100644
index 7de41eb..0000000
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractLightLoadTest.java
+++ /dev/null
@@ -1,234 +0,0 @@
-//
-//  ========================================================================
-//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
-//  ------------------------------------------------------------------------
-//  All rights reserved. This program and the accompanying materials
-//  are made available under the terms of the Eclipse Public License v1.0
-//  and Apache License v2.0 which accompanies this distribution.
-//
-//      The Eclipse Public License is available at
-//      http://www.eclipse.org/legal/epl-v10.html
-//
-//      The Apache License v2.0 is available at
-//      http://www.opensource.org/licenses/apache2.0.php
-//
-//  You may elect to redistribute this code under either of these licenses.
-//  ========================================================================
-//
-
-package org.eclipse.jetty.server.session;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Random;
-import java.util.concurrent.CyclicBarrier;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.ContentResponse;
-import org.eclipse.jetty.client.api.Request;
-import org.junit.Test;
-
-
-/**
- * AbstractLightLoadTest
- */
-public abstract class AbstractLightLoadTest
-{
-    protected boolean _stress = Boolean.getBoolean( "STRESS" );
-
-    public abstract AbstractTestServer createServer(int port);
-
-    @Test
-    public void testLightLoad()
-        throws Exception
-    {
-        if ( _stress )
-        {
-            String contextPath = "";
-            String servletMapping = "/server";
-            AbstractTestServer server1 = createServer( 0 );
-            server1.addContext( contextPath ).addServlet( TestServlet.class, servletMapping );
-
-            try
-            {
-                server1.start();
-                int port1 = server1.getPort();
-                AbstractTestServer server2 = createServer( 0 );
-                server2.addContext( contextPath ).addServlet( TestServlet.class, servletMapping );
-
-                try
-                {
-                    server2.start();
-                    int port2=server2.getPort();
-                    HttpClient client = new HttpClient();
-                    client.start();
-                    try
-                    {
-                        String[] urls = new String[2];
-                        urls[0] = "http://localhost:" + port1 + contextPath + servletMapping;
-                        urls[1] = "http://localhost:" + port2 + contextPath + servletMapping;
-
-                        ContentResponse response1 = client.GET(urls[0] + "?action=init");
-                        assertEquals(HttpServletResponse.SC_OK,response1.getStatus());
-                        String sessionCookie = response1.getHeaders().getStringField( "Set-Cookie" );
-                        assertTrue(sessionCookie != null);
-                        // Mangle the cookie, replacing Path with $Path, etc.
-                        sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
-
-                        ExecutorService executor = Executors.newCachedThreadPool();
-                        int clientsCount = 50;
-                        CyclicBarrier barrier = new CyclicBarrier( clientsCount + 1 );
-                        int requestsCount = 100;
-                        Worker[] workers = new Worker[clientsCount];
-                        for ( int i = 0; i < clientsCount; ++i )
-                        {
-                            workers[i] = new Worker( barrier, requestsCount, sessionCookie, urls );
-                            workers[i].start();
-                            executor.execute( workers[i] );
-                        }
-                        // Wait for all workers to be ready
-                        barrier.await();
-                        long start = System.nanoTime();
-
-                        // Wait for all workers to be done
-                        barrier.await();
-                        long end = System.nanoTime();
-                        long elapsed = TimeUnit.NANOSECONDS.toMillis( end - start );
-                        System.out.println( "elapsed ms: " + elapsed );
-
-                        for ( Worker worker : workers )
-                            worker.stop();
-                        executor.shutdownNow();
-
-                        // Perform one request to get the result
-                        Request request = client.newRequest( urls[0] + "?action=result" );
-                        request.header("Cookie", sessionCookie);
-                        ContentResponse response2 = request.send();
-                        assertEquals(HttpServletResponse.SC_OK,response2.getStatus());
-                        String response = response2.getContentAsString();
-                        System.out.println( "get = " + response );
-                        assertEquals(response.trim(), String.valueOf( clientsCount * requestsCount ) );
-                    }
-                    finally
-                    {
-                        client.stop();
-                    }
-                }
-                finally
-                {
-                    server2.stop();
-                }
-            }
-            finally
-            {
-                server1.stop();
-            }
-        }
-    }
-
-    public static class Worker
-        implements Runnable
-    {
-        private final HttpClient client;
-
-        private final CyclicBarrier barrier;
-
-        private final int requestsCount;
-
-        private final String sessionCookie;
-
-        private final String[] urls;
-
-
-        public Worker( CyclicBarrier barrier, int requestsCount, String sessionCookie, String[] urls )
-        {
-            this.client = new HttpClient();
-            this.barrier = barrier;
-            this.requestsCount = requestsCount;
-            this.sessionCookie = sessionCookie;
-            this.urls = urls;
-        }
-
-        public void start()
-            throws Exception
-        {
-            client.start();
-        }
-
-        public void stop()
-            throws Exception
-        {
-            client.stop();
-        }
-
-        public void run()
-        {
-            try
-            {
-                // Wait for all workers to be ready
-                barrier.await();
-
-                Random random = new Random( System.nanoTime() );
-
-                for ( int i = 0; i < requestsCount; ++i )
-                {
-                    int urlIndex = random.nextInt( urls.length );
-                    Request request = client.newRequest(urls[urlIndex] + "?action=increment");
-                    request.header("Cookie", sessionCookie);
-                    ContentResponse response = request.send();
-                    assertEquals(HttpServletResponse.SC_OK,response.getStatus());
-                }
-
-                // Wait for all workers to be done
-                barrier.await();
-            }
-            catch ( Exception x )
-            {
-                throw new RuntimeException( x );
-            }
-        }
-    }
-
-    public static class TestServlet
-        extends HttpServlet
-    {
-        @Override
-        protected void doGet( HttpServletRequest request, HttpServletResponse response )
-            throws ServletException, IOException
-        {
-            String action = request.getParameter( "action" );
-            if ( "init".equals( action ) )
-            {
-                HttpSession session = request.getSession( true );
-                session.setAttribute( "value", 0 );
-            }
-            else if ( "increment".equals( action ) )
-            {
-                // Without synchronization, because it is taken care by Jetty/Terracotta
-                HttpSession session = request.getSession( false );
-                int value = (Integer) session.getAttribute( "value" );
-                session.setAttribute( "value", value + 1 );
-            }
-            else if ( "result".equals( action ) )
-            {
-                HttpSession session = request.getSession( false );
-                int value = (Integer) session.getAttribute( "value" );
-                PrintWriter writer = response.getWriter();
-                writer.println( value );
-                writer.flush();
-            }
-        }
-    }
-}
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractLocalSessionScavengingTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractLocalSessionScavengingTest.java
index b90d3e3..09a5adf 100644
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractLocalSessionScavengingTest.java
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractLocalSessionScavengingTest.java
@@ -86,7 +86,7 @@
                     // Create the session on node1
                     ContentResponse response1 = client.GET(urls[0] + "?action=init");
                     assertEquals(HttpServletResponse.SC_OK,response1.getStatus());
-                    String sessionCookie = response1.getHeaders().getStringField("Set-Cookie");
+                    String sessionCookie = response1.getHeaders().get("Set-Cookie");
                     assertTrue(sessionCookie != null);
                     // Mangle the cookie, replacing Path with $Path, etc.
                     sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractNewSessionTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractNewSessionTest.java
index 0314ccf..61111ef 100644
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractNewSessionTest.java
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractNewSessionTest.java
@@ -74,7 +74,7 @@
             {
                 ContentResponse response = client.GET("http://localhost:" + port + contextPath + servletMapping + "?action=create");
                 assertEquals(HttpServletResponse.SC_OK,response.getStatus());
-                String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+                String sessionCookie = response.getHeaders().get("Set-Cookie");
                 assertTrue(sessionCookie != null);
                 // Mangle the cookie, replacing Path with $Path, etc.
                 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractOrphanedSessionTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractOrphanedSessionTest.java
index f9de03a..b543710 100644
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractOrphanedSessionTest.java
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractOrphanedSessionTest.java
@@ -46,6 +46,7 @@
     /**
      * If nodeA creates a session, and just afterwards crashes, it is the only node that knows about the session.
      * We want to test that the session data is gone after scavenging.
+     * @throws Exception on test failure
      */
     @Test
     public void testOrphanedSession() throws Exception
@@ -74,7 +75,7 @@
                     // Connect to server1 to create a session and get its session cookie
                     ContentResponse response1 = client.GET("http://localhost:" + port1 + contextPath + servletMapping + "?action=init");
                     assertEquals(HttpServletResponse.SC_OK,response1.getStatus());
-                    String sessionCookie = response1.getHeaders().getStringField("Set-Cookie");
+                    String sessionCookie = response1.getHeaders().get("Set-Cookie");
                     assertTrue(sessionCookie != null);
                     // Mangle the cookie, replacing Path with $Path, etc.
                     sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractProxySerializationTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractProxySerializationTest.java
index d916d3c..f2dba2d 100644
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractProxySerializationTest.java
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractProxySerializationTest.java
@@ -101,7 +101,7 @@
             {
                 ContentResponse response = client.GET("http://localhost:" + port + contextPath + servletMapping + "?action=create");
                 assertEquals(HttpServletResponse.SC_OK,response.getStatus());
-                String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+                String sessionCookie = response.getHeaders().get("Set-Cookie");
                 assertTrue(sessionCookie != null);
                 // Mangle the cookie, replacing Path with $Path, etc.
                 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractRemoveSessionTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractRemoveSessionTest.java
index 3cee415..c344d72 100644
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractRemoveSessionTest.java
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractRemoveSessionTest.java
@@ -66,7 +66,7 @@
             {
                 ContentResponse response = client.GET("http://localhost:" + port + contextPath + servletMapping + "?action=create");
                 assertEquals(HttpServletResponse.SC_OK,response.getStatus());
-                String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+                String sessionCookie = response.getHeaders().get("Set-Cookie");
                 assertTrue(sessionCookie != null);
                 // Mangle the cookie, replacing Path with $Path, etc.
                 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
@@ -82,8 +82,7 @@
                 assertTrue(testListener.isDestroyed());
 
 
-                // The session is not there anymore, but we present an old cookie
-                // The server creates a new session, we must ensure we released all locks
+                // The session is not there anymore, even if we present an old cookie
                 request = client.newRequest("http://localhost:" + port + contextPath + servletMapping + "?action=check");
                 request.header("Cookie", sessionCookie);
                 response = request.send();
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSameNodeLoadTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSameNodeLoadTest.java
new file mode 100644
index 0000000..999858f
--- /dev/null
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSameNodeLoadTest.java
@@ -0,0 +1,231 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.session;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Random;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.client.api.Request;
+import org.junit.Test;
+
+
+/**
+ * AbstractSameNodeLoadTest
+ * 
+ * This test performs multiple concurrent requests for the same session on the same node.
+ * 
+ */
+public abstract class AbstractSameNodeLoadTest
+{
+    protected boolean _stress = Boolean.getBoolean( "STRESS" );
+
+    public abstract AbstractTestServer createServer(int port);
+
+    @Test
+    public void testLoad() throws Exception
+    {
+        if ( _stress )
+        {
+            String contextPath = "";
+            String servletMapping = "/server";
+            AbstractTestServer server1 = createServer( 0 );
+            server1.addContext( contextPath ).addServlet( TestServlet.class, servletMapping );
+
+            try
+            {
+                server1.start();
+                int port1 = server1.getPort();
+
+                HttpClient client = new HttpClient();
+                client.start();
+                try
+                {
+                    String url = "http://localhost:" + port1 + contextPath + servletMapping;
+
+
+                    //create session via first server
+                    ContentResponse response1 = client.GET(url + "?action=init");
+                    assertEquals(HttpServletResponse.SC_OK,response1.getStatus());
+                    String sessionCookie = response1.getHeaders().getStringField( "Set-Cookie" );
+                    assertTrue(sessionCookie != null);
+                    // Mangle the cookie, replacing Path with $Path, etc.
+                    sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
+
+                    //simulate 10 clients making 100 requests each
+                    ExecutorService executor = Executors.newCachedThreadPool();
+                    int clientsCount = 10;
+                    CyclicBarrier barrier = new CyclicBarrier( clientsCount + 1 );
+                    int requestsCount = 100;
+                    Worker[] workers = new Worker[clientsCount];
+                    for ( int i = 0; i < clientsCount; ++i )
+                    {
+                        workers[i] = new Worker(barrier, client, requestsCount, sessionCookie, url);
+                        executor.execute( workers[i] );
+                    }
+                    // Wait for all workers to be ready
+                    barrier.await();
+                    long start = System.nanoTime();
+
+                    // Wait for all workers to be done
+                    barrier.await();
+                    long end = System.nanoTime();
+                    long elapsed = TimeUnit.NANOSECONDS.toMillis( end - start );
+                    System.out.println( "elapsed ms: " + elapsed );
+
+                    executor.shutdownNow();
+
+                    // Perform one request to get the result
+                    Request request = client.newRequest( url + "?action=result" );
+                    request.header("Cookie", sessionCookie);
+                    ContentResponse response2 = request.send();
+                    assertEquals(HttpServletResponse.SC_OK,response2.getStatus());
+                    String response = response2.getContentAsString();
+                    System.out.println( "get = " + response );
+                    assertEquals(response.trim(), String.valueOf( clientsCount * requestsCount ) );
+                }
+                finally
+                {
+                    client.stop();
+                }
+            }
+            finally
+            {
+                server1.stop();
+            }
+        }
+    }
+
+    public static class Worker implements Runnable
+    {
+        public static int COUNT = 0;
+        
+        private final HttpClient client;
+
+        private final CyclicBarrier barrier;
+
+        private final int requestsCount;
+
+        private final String sessionCookie;
+
+        private final String url;
+        
+        private final String name;
+
+
+        public Worker(CyclicBarrier barrier, HttpClient client, int requestsCount, String sessionCookie, String url)
+        {
+            this.client = client;
+            this.barrier = barrier;
+            this.requestsCount = requestsCount;
+            this.sessionCookie = sessionCookie;
+            this.url = url;
+            this.name = ""+(COUNT++);
+        }
+
+
+        public void run()
+        {
+            try
+            {
+                // Wait for all workers to be ready
+                barrier.await();
+
+                Random random = new Random( System.nanoTime() );
+
+                for ( int i = 0; i < requestsCount; ++i )
+                {
+                    int pauseMsec = random.nextInt(1000);
+
+                    //wait a random number of milliseconds between requests up to 1 second
+                    if (pauseMsec > 0)
+                    {
+                        Thread.currentThread().sleep(pauseMsec);
+                    }
+                    Request request = client.newRequest(url + "?action=increment");
+                    request.header("Cookie", sessionCookie);
+                    ContentResponse response = request.send();
+                    assertEquals(HttpServletResponse.SC_OK,response.getStatus());
+                }
+
+                // Wait for all workers to be done
+                barrier.await();
+            }
+            catch ( Exception x )
+            {
+                throw new RuntimeException( x );
+            }
+        }
+    }
+
+    public static class TestServlet
+        extends HttpServlet
+    {
+        @Override
+        protected void doGet( HttpServletRequest request, HttpServletResponse response )
+            throws ServletException, IOException
+        {
+            String action = request.getParameter( "action" );
+            if ( "init".equals( action ) )
+            {
+                HttpSession session = request.getSession( true );
+                session.setAttribute( "value", 0 );
+            }
+            else if ( "increment".equals( action ) )
+            {
+                HttpSession session = request.getSession( false );
+                assertNotNull(session);
+                synchronized(session)
+                {
+                    int value = (Integer) session.getAttribute( "value" );
+                    session.setAttribute( "value", value + 1 );
+                }
+            }
+            else if ( "result".equals( action ) )
+            {
+                HttpSession session = request.getSession( false );
+                assertNotNull(session);
+                Integer value = null;
+                synchronized (session)
+                {
+                    value = (Integer) session.getAttribute( "value" );
+                }
+                PrintWriter writer = response.getWriter();
+                writer.println( value );
+                writer.flush();
+            }
+        }
+    }
+}
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractScatterGunLoadTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractScatterGunLoadTest.java
new file mode 100644
index 0000000..7839e11
--- /dev/null
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractScatterGunLoadTest.java
@@ -0,0 +1,242 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      http://www.opensource.org/licenses/apache2.0.php
+//
+//  You may elect to redistribute this code under either of these licenses.
+//  ========================================================================
+//
+
+package org.eclipse.jetty.server.session;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Random;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.api.ContentResponse;
+import org.eclipse.jetty.client.api.Request;
+import org.junit.Test;
+
+
+/**
+ * AbstractScatterGunLoadTest
+ * 
+ * This is an unrealistic test. It takes a scatter-gun approach to smearing a
+ * single session across 2 different nodes at once. 
+ * 
+ * In the real world, we must have a load balancer that uses sticky sessions
+ * to keep the session pinned to a particular node.
+ */
+public abstract class AbstractScatterGunLoadTest
+{
+    protected boolean _stress = Boolean.getBoolean( "STRESS" );
+
+    public abstract AbstractTestServer createServer(int port);
+
+    @Test
+    public void testLightLoad()
+        throws Exception
+    {
+        if ( _stress )
+        {
+            String contextPath = "";
+            String servletMapping = "/server";
+            AbstractTestServer server1 = createServer( 0 );
+            server1.addContext( contextPath ).addServlet( TestServlet.class, servletMapping );
+
+            try
+            {
+                server1.start();
+                int port1 = server1.getPort();
+                AbstractTestServer server2 = createServer( 0 );
+                server2.addContext( contextPath ).addServlet( TestServlet.class, servletMapping );
+
+                try
+                {
+                    server2.start();
+                    int port2=server2.getPort();
+                    HttpClient client = new HttpClient();
+                    client.start();
+                    try
+                    {
+                        String[] urls = new String[2];
+                        urls[0] = "http://localhost:" + port1 + contextPath + servletMapping;
+                        urls[1] = "http://localhost:" + port2 + contextPath + servletMapping;
+
+                        //create session via first server
+                        ContentResponse response1 = client.GET(urls[0] + "?action=init");
+                        assertEquals(HttpServletResponse.SC_OK,response1.getStatus());
+                        String sessionCookie = response1.getHeaders().get( "Set-Cookie" );
+                        assertTrue(sessionCookie != null);
+                        // Mangle the cookie, replacing Path with $Path, etc.
+                        sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
+
+                        //simulate 50 clients making 100 requests each
+                        ExecutorService executor = Executors.newCachedThreadPool();
+                        int clientsCount = 50;
+                        CyclicBarrier barrier = new CyclicBarrier( clientsCount + 1 );
+                        int requestsCount = 100;
+                        Worker[] workers = new Worker[clientsCount];
+                        for ( int i = 0; i < clientsCount; ++i )
+                        {
+                            workers[i] = new Worker( barrier, requestsCount, sessionCookie, urls );
+                            workers[i].start();
+                            executor.execute( workers[i] );
+                        }
+                        // Wait for all workers to be ready
+                        barrier.await();
+                        long start = System.nanoTime();
+
+                        // Wait for all workers to be done
+                        barrier.await();
+                        long end = System.nanoTime();
+                        long elapsed = TimeUnit.NANOSECONDS.toMillis( end - start );
+                        System.out.println( "elapsed ms: " + elapsed );
+
+                        for ( Worker worker : workers )
+                            worker.stop();
+                        executor.shutdownNow();
+
+                        // Perform one request to get the result
+                        Request request = client.newRequest( urls[0] + "?action=result" );
+                        request.header("Cookie", sessionCookie);
+                        ContentResponse response2 = request.send();
+                        assertEquals(HttpServletResponse.SC_OK,response2.getStatus());
+                        String response = response2.getContentAsString();
+                        System.out.println( "get = " + response );
+                        assertEquals(response.trim(), String.valueOf( clientsCount * requestsCount ) );
+                    }
+                    finally
+                    {
+                        client.stop();
+                    }
+                }
+                finally
+                {
+                    server2.stop();
+                }
+            }
+            finally
+            {
+                server1.stop();
+            }
+        }
+    }
+
+    public static class Worker
+        implements Runnable
+    {
+        private final HttpClient client;
+
+        private final CyclicBarrier barrier;
+
+        private final int requestsCount;
+
+        private final String sessionCookie;
+
+        private final String[] urls;
+
+
+        public Worker( CyclicBarrier barrier, int requestsCount, String sessionCookie, String[] urls )
+        {
+            this.client = new HttpClient();
+            this.barrier = barrier;
+            this.requestsCount = requestsCount;
+            this.sessionCookie = sessionCookie;
+            this.urls = urls;
+        }
+
+        public void start()
+            throws Exception
+        {
+            client.start();
+        }
+
+        public void stop()
+            throws Exception
+        {
+            client.stop();
+        }
+
+        public void run()
+        {
+            try
+            {
+                // Wait for all workers to be ready
+                barrier.await();
+
+                Random random = new Random( System.nanoTime() );
+
+                for ( int i = 0; i < requestsCount; ++i )
+                {
+                    int urlIndex = random.nextInt( urls.length );
+                    Request request = client.newRequest(urls[urlIndex] + "?action=increment");
+                    request.header("Cookie", sessionCookie);
+                    ContentResponse response = request.send();
+                    assertEquals(HttpServletResponse.SC_OK,response.getStatus());
+                }
+
+                // Wait for all workers to be done
+                barrier.await();
+            }
+            catch ( Exception x )
+            {
+                throw new RuntimeException( x );
+            }
+        }
+    }
+
+    public static class TestServlet
+        extends HttpServlet
+    {
+        @Override
+        protected void doGet( HttpServletRequest request, HttpServletResponse response )
+            throws ServletException, IOException
+        {
+            String action = request.getParameter( "action" );
+            if ( "init".equals( action ) )
+            {
+                HttpSession session = request.getSession( true );
+                session.setAttribute( "value", 0 );
+            }
+            else if ( "increment".equals( action ) )
+            {
+                // Without synchronization
+                HttpSession session = request.getSession( false );
+                int value = (Integer) session.getAttribute( "value" );
+                session.setAttribute( "value", value + 1 );
+            }
+            else if ( "result".equals( action ) )
+            {
+                HttpSession session = request.getSession( false );
+                int value = (Integer) session.getAttribute( "value" );
+                PrintWriter writer = response.getWriter();
+                writer.println( value );
+                writer.flush();
+            }
+        }
+    }
+}
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionCookieTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionCookieTest.java
index 9557df1..b79a0a3 100644
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionCookieTest.java
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionCookieTest.java
@@ -39,7 +39,7 @@
 import org.junit.Test;
 
 /**
- * AbstractNewSessionTest
+ * AbstractSessionCookieTest
  */
 public abstract class AbstractSessionCookieTest
 {
@@ -81,7 +81,7 @@
                 ContentResponse response = client.GET("http://localhost:" + port + contextPath + servletMapping + "?action=create");
                 assertEquals(HttpServletResponse.SC_OK,response.getStatus());
 
-                String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+                String sessionCookie = response.getHeaders().get("Set-Cookie");
                 assertTrue(sessionCookie != null);
                 // Mangle the cookie, replacing Path with $Path, etc.
                 //sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionExpiryTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionExpiryTest.java
index 4e3b53c..5c11f8b 100644
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionExpiryTest.java
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionExpiryTest.java
@@ -22,16 +22,21 @@
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
+import javax.servlet.http.HttpSessionEvent;
+import javax.servlet.http.HttpSessionListener;
 
 import org.eclipse.jetty.client.HttpClient;
 import org.eclipse.jetty.client.api.ContentResponse;
 import org.eclipse.jetty.client.api.Request;
+import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.servlet.ServletHolder;
 import org.junit.Test;
 
@@ -50,6 +55,23 @@
             e.printStackTrace();
         }
     }
+    
+    public class TestHttpSessionListener implements HttpSessionListener
+    {
+        public List<String> createdSessions = new ArrayList<String>();
+        public List<String> destroyedSessions = new ArrayList<String>();
+        
+        public void sessionDestroyed(HttpSessionEvent se)
+        {
+            destroyedSessions.add(se.getSession().getId());
+        }
+        
+        public void sessionCreated(HttpSessionEvent se)
+        {
+            createdSessions.add(se.getSession().getId());
+        }
+    };
+    
 
     @Test
     public void testSessionNotExpired() throws Exception
@@ -75,7 +97,7 @@
             //make a request to set up a session on the server
             ContentResponse response = client.GET(url + "?action=init");
             assertEquals(HttpServletResponse.SC_OK,response.getStatus());
-            String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+            String sessionCookie = response.getHeaders().get("Set-Cookie");
             assertTrue(sessionCookie != null);
             // Mangle the cookie, replacing Path with $Path, etc.
             sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
@@ -101,18 +123,26 @@
             server1.stop();
         }
     }
+    
 
     @Test
     public void testSessionExpiry() throws Exception
     {
+     
+        
         String contextPath = "";
         String servletMapping = "/server";
         int inactivePeriod = 2;
-        int scavengePeriod = 10;
+        int scavengePeriod = 1;
         AbstractTestServer server1 = createServer(0, inactivePeriod, scavengePeriod);
         TestServlet servlet = new TestServlet();
         ServletHolder holder = new ServletHolder(servlet);
-        server1.addContext(contextPath).addServlet(holder, servletMapping);
+        ServletContextHandler context = server1.addContext(contextPath);
+        context.addServlet(holder, servletMapping);
+        TestHttpSessionListener listener = new TestHttpSessionListener();
+        
+        context.getSessionHandler().addEventListener(listener);
+        
         server1.start();
         int port1 = server1.getPort();
 
@@ -125,11 +155,15 @@
             //make a request to set up a session on the server
             ContentResponse response1 = client.GET(url + "?action=init");
             assertEquals(HttpServletResponse.SC_OK,response1.getStatus());
-            String sessionCookie = response1.getHeaders().getStringField("Set-Cookie");
+            String sessionCookie = response1.getHeaders().get("Set-Cookie");
             assertTrue(sessionCookie != null);
             // Mangle the cookie, replacing Path with $Path, etc.
             sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
-
+            
+            String sessionId = AbstractTestServer.extractSessionId(sessionCookie);     
+            
+            verifySessionCreated(listener,sessionId);
+            
             //now stop the server
             server1.stop();
 
@@ -138,6 +172,7 @@
 
             //restart the server
             server1.start();
+            
             port1 = server1.getPort();
             url = "http://localhost:" + port1 + contextPath + servletMapping;
 
@@ -146,12 +181,27 @@
             request.getHeaders().add("Cookie", sessionCookie);
             ContentResponse response2 = request.send();
             assertEquals(HttpServletResponse.SC_OK,response2.getStatus());
+            
+            //and wait until the expiry time has passed
+            pause(inactivePeriod);
+            
+            verifySessionDestroyed (listener, sessionId);
         }
         finally
         {
             server1.stop();
-        }
+        }     
     }
+    public void verifySessionCreated (TestHttpSessionListener listener, String sessionId)
+    {
+        assertTrue(listener.createdSessions.contains(sessionId));
+    }
+    public void verifySessionDestroyed (TestHttpSessionListener listener, String sessionId)
+    {
+        assertTrue (listener.destroyedSessions.contains(sessionId));
+    }
+
+
 
     public static class TestServlet extends HttpServlet
     {
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionInvalidateAndCreateTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionInvalidateAndCreateTest.java
index b2eef37..40df64f 100644
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionInvalidateAndCreateTest.java
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionInvalidateAndCreateTest.java
@@ -42,7 +42,6 @@
 import org.eclipse.jetty.client.api.Request;
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.servlet.ServletHolder;
-import org.junit.Assert;
 import org.junit.Test;
 
 /**
@@ -119,7 +118,7 @@
                 // Create the session
                 ContentResponse response1 = client.GET(url + "?action=init");
                 assertEquals(HttpServletResponse.SC_OK,response1.getStatus());
-                String sessionCookie = response1.getHeaders().getStringField("Set-Cookie");
+                String sessionCookie = response1.getHeaders().get("Set-Cookie");
                 assertTrue(sessionCookie != null);
                 // Mangle the cookie, replacing Path with $Path, etc.
                 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionMigrationTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionMigrationTest.java
index 0fcbfa6..08f8c8f 100644
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionMigrationTest.java
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionMigrationTest.java
@@ -72,7 +72,7 @@
                     Request request1 = client.POST("http://localhost:" + port1 + contextPath + servletMapping + "?action=set&value=" + value);
                     ContentResponse response1 = request1.send();
                     assertEquals(HttpServletResponse.SC_OK,response1.getStatus());
-                    String sessionCookie = response1.getHeaders().getStringField("Set-Cookie");
+                    String sessionCookie = response1.getHeaders().get("Set-Cookie");
                     assertTrue(sessionCookie != null);
                     // Mangle the cookie, replacing Path with $Path, etc.
                     sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionRenewTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionRenewTest.java
index 8cf300b..15e5f1d 100644
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionRenewTest.java
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionRenewTest.java
@@ -70,7 +70,7 @@
             ContentResponse response = client.GET("http://localhost:" + port + contextPath + servletMapping + "?action=create");
             assertEquals(HttpServletResponse.SC_OK,response.getStatus());
 
-            String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+            String sessionCookie = response.getHeaders().get("Set-Cookie");
             assertTrue(sessionCookie != null);
             assertFalse(testListener.isCalled());
 
@@ -79,7 +79,7 @@
             request.header("Cookie", sessionCookie);
             ContentResponse renewResponse = request.send();
             assertEquals(HttpServletResponse.SC_OK,renewResponse.getStatus());
-            String renewSessionCookie = renewResponse.getHeaders().getStringField("Set-Cookie");
+            String renewSessionCookie = renewResponse.getHeaders().get("Set-Cookie");
             assertNotNull(renewSessionCookie);
             assertNotSame(sessionCookie, renewSessionCookie);
             assertTrue(testListener.isCalled());
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionValueSavingTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionValueSavingTest.java
index 92b1891..8b0851b 100644
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionValueSavingTest.java
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractSessionValueSavingTest.java
@@ -37,7 +37,7 @@
 
 
 /**
- * AbstractLastAccessTimeTest
+ * AbstractSessionValueSavingTest
  */
 public abstract class AbstractSessionValueSavingTest
 {
@@ -72,7 +72,7 @@
 
                     sessionTestValue = Long.parseLong(response1.getContentAsString());
 
-                    String sessionCookie = response1.getHeaders().getStringField("Set-Cookie");
+                    String sessionCookie = response1.getHeaders().get("Set-Cookie");
                     assertTrue( sessionCookie != null );
                     // Mangle the cookie, replacing Path with $Path, etc.
                     sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
@@ -95,7 +95,7 @@
                         assertTrue(sessionTestValue < Long.parseLong(response2.getContentAsString()));
                         sessionTestValue = Long.parseLong(response2.getContentAsString());
 
-                        String setCookie = response1.getHeaders().getStringField("Set-Cookie");
+                        String setCookie = response1.getHeaders().get("Set-Cookie");
                         if (setCookie!=null)
                             sessionCookie = setCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
 
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractStopSessionManagerPreserveSessionTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractStopSessionManagerPreserveSessionTest.java
index de4c44d..a7f5c87 100644
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractStopSessionManagerPreserveSessionTest.java
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractStopSessionManagerPreserveSessionTest.java
@@ -19,7 +19,6 @@
 package org.eclipse.jetty.server.session;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
@@ -36,6 +35,11 @@
 import org.eclipse.jetty.servlet.ServletHolder;
 import org.junit.Test;
 
+/**
+ * AbstractStopSessionManagerPreserveSessionTest
+ *
+ *
+ */
 public abstract class AbstractStopSessionManagerPreserveSessionTest
 {
     public String _id;
@@ -74,7 +78,7 @@
                 //Create a session
                 ContentResponse response = client.GET("http://localhost:" + port + contextPath + servletMapping + "?action=create");
                 assertEquals(HttpServletResponse.SC_OK,response.getStatus());
-                String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+                String sessionCookie = response.getHeaders().get("Set-Cookie");
                 assertTrue(sessionCookie != null);
                 // Mangle the cookie, replacing Path with $Path, etc.
                 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractTestServer.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractTestServer.java
index 329d6b8..789f6b2 100644
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractTestServer.java
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractTestServer.java
@@ -34,17 +34,38 @@
  */
 public abstract class AbstractTestServer
 {
+    public static int DEFAULT_MAX_INACTIVE = 30;
+    public static int DEFAULT_SCAVENGE = 10;
+    
     protected final Server _server;
     protected final int _maxInactivePeriod;
     protected final int _scavengePeriod;
     protected final ContextHandlerCollection _contexts;
     protected SessionIdManager _sessionIdManager;
 
+  
+    
+    public static String extractSessionId (String sessionCookie)
+    {
+        if (sessionCookie == null)
+            return null;
+        sessionCookie = sessionCookie.trim();
+        int i = sessionCookie.indexOf(';');
+        if (i >= 0)
+            sessionCookie = sessionCookie.substring(0,i);
+        if (sessionCookie.startsWith("JSESSIONID"))
+            sessionCookie = sessionCookie.substring("JSESSIONID=".length());
+        i = sessionCookie.indexOf('.');
+        if (i >=0)
+            sessionCookie = sessionCookie.substring(0,i);
+        return sessionCookie;
+    }
+
     
     
     public AbstractTestServer(int port)
     {
-        this(port, 30, 10);
+        this(port, DEFAULT_MAX_INACTIVE, DEFAULT_SCAVENGE);
     }
 
     public AbstractTestServer(int port, int maxInactivePeriod, int scavengePeriod)
@@ -52,7 +73,7 @@
         this (port, maxInactivePeriod, scavengePeriod, null);
     }
     
-    public AbstractTestServer(int port, int maxInactivePeriod, int scavengePeriod, String sessionIdMgrConfig)
+    public AbstractTestServer(int port, int maxInactivePeriod, int scavengePeriod, Object sessionIdMgrConfig)
     {
         _server = new Server(port);
         _maxInactivePeriod = maxInactivePeriod;
@@ -64,7 +85,7 @@
     
     
 
-    public abstract SessionIdManager newSessionIdManager(String config);
+    public abstract SessionIdManager newSessionIdManager(Object config);
     public abstract SessionManager newSessionManager();
     public abstract SessionHandler newSessionHandler(SessionManager sessionManager);
 
diff --git a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractWebAppObjectInSessionTest.java b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractWebAppObjectInSessionTest.java
index bc67781..fd9484f 100644
--- a/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractWebAppObjectInSessionTest.java
+++ b/tests/test-sessions/test-sessions-common/src/main/java/org/eclipse/jetty/server/session/AbstractWebAppObjectInSessionTest.java
@@ -120,7 +120,7 @@
 
                     ContentResponse response = request.send();
                     assertEquals( HttpServletResponse.SC_OK, response.getStatus());
-                    String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
+                    String sessionCookie = response.getHeaders().get("Set-Cookie");
                     assertTrue(sessionCookie != null);
                     // Mangle the cookie, replacing Path with $Path, etc.
                     sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
diff --git a/tests/test-webapps/pom.xml b/tests/test-webapps/pom.xml
index f27ff42..e5fb628 100644
--- a/tests/test-webapps/pom.xml
+++ b/tests/test-webapps/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>tests-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <artifactId>test-webapps-parent</artifactId>
diff --git a/tests/test-webapps/test-dispatch-webapp/pom.xml b/tests/test-webapps/test-dispatch-webapp/pom.xml
index 4a1f2b6..5afe024 100644
--- a/tests/test-webapps/test-dispatch-webapp/pom.xml
+++ b/tests/test-webapps/test-dispatch-webapp/pom.xml
@@ -4,11 +4,14 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-webapps-parent</artifactId>
-    <version>9.2.2-SNAPSHOT</version>
+    <version>9.3.0-SNAPSHOT</version>
   </parent>
   <name>Jetty Tests :: Webapps :: Dispatch Webapp</name>
   <artifactId>test-dispatch-webapp</artifactId>
   <packaging>war</packaging>
+   <properties>
+    <bundle-symbolic-name>${project.groupId}.dispatch</bundle-symbolic-name>
+  </properties>
   <build>
     <plugins>
       <plugin>
diff --git a/tests/test-webapps/test-jaas-webapp/pom.xml b/tests/test-webapps/test-jaas-webapp/pom.xml
index 8094340..27e56bd 100644
--- a/tests/test-webapps/test-jaas-webapp/pom.xml
+++ b/tests/test-webapps/test-jaas-webapp/pom.xml
@@ -4,11 +4,14 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-webapps-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <artifactId>test-jaas-webapp</artifactId>
   <name>Jetty Tests :: WebApp :: JAAS</name>
   <packaging>war</packaging>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.jaas</bundle-symbolic-name>
+  </properties>
   <build>
     <plugins>
       <plugin>
diff --git a/tests/test-webapps/test-jaas-webapp/src/main/config/demo-base/webapps/test-jaas.xml b/tests/test-webapps/test-jaas-webapp/src/main/config/demo-base/webapps/test-jaas.xml
index f3b0a18..c56276b 100644
--- a/tests/test-webapps/test-jaas-webapp/src/main/config/demo-base/webapps/test-jaas.xml
+++ b/tests/test-webapps/test-jaas-webapp/src/main/config/demo-base/webapps/test-jaas.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Configure the test-jndi webapp                                  -->
diff --git a/tests/test-webapps/test-jaas-webapp/src/main/webapp/WEB-INF/jetty-web.xml b/tests/test-webapps/test-jaas-webapp/src/main/webapp/WEB-INF/jetty-web.xml
index e7830c6..ecd5e30 100644
--- a/tests/test-webapps/test-jaas-webapp/src/main/webapp/WEB-INF/jetty-web.xml
+++ b/tests/test-webapps/test-jaas-webapp/src/main/webapp/WEB-INF/jetty-web.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure class="org.eclipse.jetty.webapp.WebAppContext">
   <Get class="org.eclipse.jetty.util.log.Log" name="rootLogger">
diff --git a/tests/test-webapps/test-jaas-webapp/src/main/webapp/auth.html b/tests/test-webapps/test-jaas-webapp/src/main/webapp/auth.html
index 249f958..ab12241 100644
--- a/tests/test-webapps/test-jaas-webapp/src/main/webapp/auth.html
+++ b/tests/test-webapps/test-jaas-webapp/src/main/webapp/auth.html
@@ -1,7 +1,7 @@
 <HTML>
   <HEAD>
     <META http-equiv="Pragma" content="no-cache">
-    <META http-equiv="Cache-Control" content="no-cache,no-store">
+    <META http-equiv="Cache-Control" content="no-cache,no-store,must-revalidate">
     <link rel="stylesheet" type="text/css" href="stylesheet.css"/>
   </HEAD>
 
diff --git a/tests/test-webapps/test-jetty-webapp/pom.xml b/tests/test-webapps/test-jetty-webapp/pom.xml
index 5921f34..ee9cf1e 100644
--- a/tests/test-webapps/test-jetty-webapp/pom.xml
+++ b/tests/test-webapps/test-jetty-webapp/pom.xml
@@ -20,7 +20,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-webapps-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
@@ -29,6 +29,9 @@
   <name>Test :: Jetty Test Webapp</name>
   <url>http://www.eclipse.org/jetty</url>
   <packaging>war</packaging>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.tests.webapp</bundle-symbolic-name>
+  </properties>
   <build>
     <plugins>
       <plugin>
@@ -70,15 +73,6 @@
           </execution>
         </executions>
       </plugin>
-      <!-- also make this webapp an osgi bundle -->
-      <plugin>
-        <artifactId>maven-war-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
       <plugin>
         <groupId>org.apache.felix</groupId>
         <artifactId>maven-bundle-plugin</artifactId>
@@ -87,32 +81,29 @@
           <supportedProjectTypes>
             <supportedProjectType>war</supportedProjectType>
           </supportedProjectTypes>
+          <instructions>
+            <Import-Package>javax.servlet.jsp.*;version="[2.2.0,3.0)",org.eclipse.jetty.*;version="[$(version;===;${parsedVersion.osgiVersion}),$(version;==+;${parsedVersion.osgiVersion}))",*</Import-Package>
+            <Export-Package>!com.acme*</Export-Package>
+            <!-- the test webapp is configured via a jetty xml file
+            in order to add the security handler. -->
+            <Web-ContextPath>/</Web-ContextPath>
+            <!-- in fact the '.' must not be there
+            but Felix-BND has a bug:
+            http://www.mail-archive.com/users@felix.apache.org/msg04730.html
+            https://issues.apache.org/jira/browse/FELIX-1571
+            -->
+            <Bundle-ClassPath>.,WEB-INF/classes</Bundle-ClassPath>
+          </instructions>
         </configuration>
-        <executions>
-          <execution>
-            <id>bundle-manifest</id>
-            <phase>process-classes</phase>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-                <Bundle-SymbolicName>org.eclipse.jetty.test-jetty-webapp</Bundle-SymbolicName>
-                <Import-Package>javax.servlet.jsp.*;version="[2.2.0, 3.0)",javax.servlet.*;version="[2.6,3.2)",org.eclipse.jetty.*;version="9.1",*</Import-Package>
-                <Export-Package>!com.acme*</Export-Package>
-                <!-- the test webapp is configured via a jetty xml file
-                in order to add the security handler. -->
-                <Web-ContextPath>/</Web-ContextPath>
-                <!-- in fact the '.' must not be there
-                but Felix-BND has a bug:
-                http://www.mail-archive.com/users@felix.apache.org/msg04730.html
-                https://issues.apache.org/jira/browse/FELIX-1571
-                -->
-                <Bundle-ClassPath>.,WEB-INF/classes</Bundle-ClassPath>
-              </instructions>
-            </configuration>
-           </execution>
-        </executions>
+      </plugin>
+      <!-- also make this webapp an osgi bundle -->
+      <plugin>
+        <artifactId>maven-war-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+          </archive>
+        </configuration>
       </plugin>
       <plugin>
         <groupId>org.eclipse.jetty</groupId>
@@ -199,6 +190,13 @@
       <scope>test</scope>
     </dependency>
     <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-servlet</artifactId>
+      <version>${project.version}</version>
+      <classifier>tests</classifier>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>org.eclipse.jetty.toolchain</groupId>
       <artifactId>jetty-test-helper</artifactId>
       <scope>test</scope>
@@ -216,12 +214,6 @@
       <scope>provided</scope>
     </dependency>
     <dependency>
-      <groupId>org.eclipse.jetty.spdy</groupId>
-      <artifactId>spdy-http-server</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>jstl</artifactId>
       <version>1.2</version>
@@ -249,10 +241,14 @@
               <goals>
                 <goal>jspc</goal>
               </goals>
+             <!-- example configuration
               <configuration>
-                 <includes>**/*.foo</includes>
-                 <excludes>**/*.fff</excludes>
+                <includes>**/*.foo</includes>
+                <excludes>**/*.fff</excludes>
+                <sourceVersion>1.8</sourceVersion>
+                <targetVersion>1.8</targetVersion>
               </configuration>
+              -->
             </execution>
           </executions>
         </plugin>
diff --git a/tests/test-webapps/test-jetty-webapp/src/main/assembly/embedded-jetty-web-for-webbundle.xml b/tests/test-webapps/test-jetty-webapp/src/main/assembly/embedded-jetty-web-for-webbundle.xml
index 5d223e3..9b4e892 100644
--- a/tests/test-webapps/test-jetty-webapp/src/main/assembly/embedded-jetty-web-for-webbundle.xml
+++ b/tests/test-webapps/test-jetty-webapp/src/main/assembly/embedded-jetty-web-for-webbundle.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- ==================================================================
 Configure and deploy the test web application in $(jetty.home)/webapps/test
diff --git a/tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/etc/demo-rewrite-rules.xml b/tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/etc/demo-rewrite-rules.xml
index 35a8f87..df2c608 100644
--- a/tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/etc/demo-rewrite-rules.xml
+++ b/tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/etc/demo-rewrite-rules.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Configure the demos                                             -->
diff --git a/tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/etc/test-realm.xml b/tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/etc/test-realm.xml
index d5c776b..f1b342b 100644
--- a/tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/etc/test-realm.xml
+++ b/tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/etc/test-realm.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 <Configure id="Server" class="org.eclipse.jetty.server.Server">
     <!-- =========================================================== -->
     <!-- Configure Authentication Login Service                      -->
@@ -12,7 +12,7 @@
       <Arg>
         <New class="org.eclipse.jetty.security.HashLoginService">
           <Set name="name">Test Realm</Set>
-          <Set name="config"><Property name="demo.realm" default="etc/realm.properties"/></Set>
+          <Set name="config"><Property name="jetty.demo.realm" default="etc/realm.properties"/></Set>
           <Set name="refreshInterval">0</Set>
         </New>
       </Arg>
diff --git a/tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/start.ini b/tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/start.ini
index 9a840f4..5921b61 100644
--- a/tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/start.ini
+++ b/tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/start.ini
@@ -6,7 +6,7 @@
 
 # Enable security via jaas, and configure it
 --module=jaas
-jaas.login.conf=etc/login.conf
+jetty.jaas.login.conf=etc/login.conf
 
 # Enable rewrite examples
 --module=rewrite
@@ -19,5 +19,5 @@
 
 # Create and configure the test realm
 etc/test-realm.xml
-demo.realm=etc/realm.properties
+jetty.demo.realm=etc/realm.properties
 
diff --git a/tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/webapps/test.xml b/tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/webapps/test.xml
index 43047f9..cae730e 100644
--- a/tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/webapps/test.xml
+++ b/tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/webapps/test.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- ==================================================================
 Configure and deploy the test web application in $(jetty.home)/webapps/test
@@ -11,7 +11,7 @@
 detected.
 ===================================================================== -->
 
-<Configure class="org.eclipse.jetty.webapp.WebAppContext">
+<Configure id="testWebapp" class="org.eclipse.jetty.webapp.WebAppContext">
 
   <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
   <!-- Required minimal context configuration :                        -->
@@ -35,6 +35,19 @@
     <Arg type="Boolean">true</Arg>
   </Call>
   
+  <Set name="gzipHandler">
+    <New class="org.eclipse.jetty.server.handler.gzip.GzipHandler">
+      <Set name="minGzipSize">2048</Set>      
+    </New>
+  </Set>
+  
+  <!-- Set Caching Classloader that improves performance on resource searching webapps -->
+  <Set name="classLoader">
+    <New class="org.eclipse.jetty.webapp.CachingWebAppClassLoader">
+      <Arg><Ref refid="testWebapp"/></Arg>
+    </New>
+  </Set>
+
   <!-- Enable symlinks 
   <Call name="addAliasCheck">
     <Arg><New class="org.eclipse.jetty.server.handler.AllowSymLinkAliasChecker"/></Arg>
diff --git a/tests/test-webapps/test-jetty-webapp/src/main/java/com/acme/SessionDump.java b/tests/test-webapps/test-jetty-webapp/src/main/java/com/acme/SessionDump.java
index 7ed7413..0e484b7 100644
--- a/tests/test-webapps/test-jetty-webapp/src/main/java/com/acme/SessionDump.java
+++ b/tests/test-webapps/test-jetty-webapp/src/main/java/com/acme/SessionDump.java
@@ -36,6 +36,23 @@
 @SuppressWarnings("serial")
 public class SessionDump extends HttpServlet
 {
+    /** 
+      * Simple object attribute to test serialization
+      */
+    public class ObjectAttributeValue implements java.io.Serializable
+    {
+        long l;
+        
+        public ObjectAttributeValue(long l)
+        {
+            this.l = l;
+        }
+
+        public long getValue()
+        {
+            return l;
+        }
+    }
 
     int redirectCount=0;
     /* ------------------------------------------------------------ */
@@ -64,6 +81,7 @@
             {
                 session = request.getSession(true);
                 session.setAttribute("test","value");
+                session.setAttribute("obj", new ObjectAttributeValue(System.currentTimeMillis()));
             }
             else if (session!=null)
             {
diff --git a/tests/test-webapps/test-jetty-webapp/src/main/webapp/WEB-INF/jetty-web.xml b/tests/test-webapps/test-jetty-webapp/src/main/webapp/WEB-INF/jetty-web.xml
index 19fb028..c04f74c 100644
--- a/tests/test-webapps/test-jetty-webapp/src/main/webapp/WEB-INF/jetty-web.xml
+++ b/tests/test-webapps/test-jetty-webapp/src/main/webapp/WEB-INF/jetty-web.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!--
 This is the jetty specific web application configuration file.  When starting
diff --git a/tests/test-webapps/test-jetty-webapp/src/main/webapp/WEB-INF/web.xml b/tests/test-webapps/test-jetty-webapp/src/main/webapp/WEB-INF/web.xml
index a2b3763..bf3f330 100644
--- a/tests/test-webapps/test-jetty-webapp/src/main/webapp/WEB-INF/web.xml
+++ b/tests/test-webapps/test-jetty-webapp/src/main/webapp/WEB-INF/web.xml
@@ -10,7 +10,7 @@
   
   <context-param>
     <param-name>org.eclipse.jetty.server.context.ManagedAttributes</param-name>
-    <param-value>QoSFilter,TransparentProxy.ThreadPool,TransparentProxy.HttpClient</param-value>
+    <param-value>PushFilter,QoSFilter,TransparentProxy.ThreadPool,TransparentProxy.HttpClient</param-value>
   </context-param>
   
   <!-- Declare TestListener, which declares TestFilter -->
@@ -18,6 +18,15 @@
     <listener-class>com.acme.TestListener</listener-class>
   </listener>
 
+  <filter>
+    <filter-name>PushFilter</filter-name>
+    <filter-class>org.eclipse.jetty.servlets.PushCacheFilter</filter-class>
+    <async-supported>true</async-supported>
+  </filter>  
+  <filter-mapping>
+    <filter-name>PushFilter</filter-name>
+    <url-pattern>/*</url-pattern>
+  </filter-mapping>
 
   <filter>
     <filter-name>QoSFilter</filter-name>
@@ -52,46 +61,6 @@
     <url-pattern>/dump/*</url-pattern>
   </filter-mapping>
   
-
-  <filter>
-    <filter-name>GzipFilter</filter-name>
-    <filter-class>org.eclipse.jetty.servlets.AsyncGzipFilter</filter-class>
-    <async-supported>true</async-supported>
-    <init-param>
-      <param-name>bufferSize</param-name>
-      <param-value>8192</param-value>
-    </init-param>
-    <init-param>
-      <param-name>mimeTypes</param-name>
-      <param-value>text/plain,application/xml,text/html</param-value>
-    </init-param>
-    <init-param>
-      <param-name>minGzipSize</param-name>
-      <param-value>2048</param-value>
-    </init-param>
-    <init-param>
-      <param-name>userAgent</param-name>
-      <param-value>(?:Mozilla[^\(]*\(compatible;\s*+([^;]*);.*)|(?:.*?([^\s]+/[^\s]+).*)</param-value>
-    </init-param>
-    <init-param>
-      <param-name>cacheSize</param-name>
-      <param-value>1024</param-value>
-    </init-param>
-    <init-param>
-      <param-name>excludedAgents</param-name>
-      <param-value>MSIE 6.0</param-value>
-    </init-param>
-    <init-param>
-      <param-name>uncheckedPrintWriter</param-name>
-      <param-value>true</param-value>
-    </init-param>
-  </filter>
-  <filter-mapping>
-    <filter-name>GzipFilter</filter-name>
-    <url-pattern>/dump/gzip/*</url-pattern>
-    <url-pattern>*.txt</url-pattern>
-  </filter-mapping>
-  
   <servlet>
     <servlet-name>Login</servlet-name>
     <servlet-class>com.acme.LoginServlet</servlet-class>
diff --git a/tests/test-webapps/test-jetty-webapp/src/test/java/org/eclipse/jetty/TestServer.java b/tests/test-webapps/test-jetty-webapp/src/test/java/org/eclipse/jetty/TestServer.java
index 495dfb4..a1d0f6b 100644
--- a/tests/test-webapps/test-jetty-webapp/src/test/java/org/eclipse/jetty/TestServer.java
+++ b/tests/test-webapps/test-jetty-webapp/src/test/java/org/eclipse/jetty/TestServer.java
@@ -93,43 +93,7 @@
         httpConnector.setIdleTimeout(30000);
         server.addConnector(httpConnector);
 
-        /*
-        // SSL configurations
-        SslContextFactory sslContextFactory = new SslContextFactory();
-        sslContextFactory.setKeyStorePath(jetty_root + "/jetty-server/src/main/config/etc/keystore");
-        sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
-        sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
-        sslContextFactory.setTrustStorePath(jetty_root + "/jetty-server/src/main/config/etc/keystore");
-        sslContextFactory.setTrustStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
-        sslContextFactory.setExcludeCipherSuites(
-                "SSL_RSA_WITH_DES_CBC_SHA",
-                "SSL_DHE_RSA_WITH_DES_CBC_SHA",
-                "SSL_DHE_DSS_WITH_DES_CBC_SHA",
-                "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
-                "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
-                "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
-                "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA");
-        
-        
-        // Spdy Connector
-        SPDYServerConnectionFactory.checkNPNAvailable();
-        PushStrategy push = new ReferrerPushStrategy();
-        HTTPSPDYServerConnectionFactory spdy2 = new HTTPSPDYServerConnectionFactory(2,config,push);
-        spdy2.setInputBufferSize(8192);
-        spdy2.setInitialWindowSize(32768);
-        HTTPSPDYServerConnectionFactory spdy3 = new HTTPSPDYServerConnectionFactory(3,config,push);
-        spdy2.setInputBufferSize(8192);
-        NPNServerConnectionFactory npn = new NPNServerConnectionFactory(spdy3.getProtocol(),spdy2.getProtocol(),http.getProtocol());
-        npn.setDefaultProtocol(http.getProtocol());
-        npn.setInputBufferSize(1024); 
-        SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory,npn.getProtocol()); 
-        ServerConnector spdyConnector = new ServerConnector(server,ssl,npn,spdy3,spdy2,http);
-        spdyConnector.setPort(8443);
-        spdyConnector.setIdleTimeout(15000);
-        server.addConnector(spdyConnector);
-        
-        */
-        
+
         // Handlers
         HandlerCollection handlers = new HandlerCollection();
         ContextHandlerCollection contexts = new ContextHandlerCollection();
@@ -158,6 +122,7 @@
         server.setStopAtShutdown(true);
 
         WebAppContext webapp = new WebAppContext();
+        webapp.setContextPath("/test");
         webapp.setParentLoaderPriority(true);
         webapp.setResourceBase("./src/main/webapp");
         webapp.setAttribute("testAttribute","testValue");
diff --git a/tests/test-webapps/test-jndi-webapp/pom.xml b/tests/test-webapps/test-jndi-webapp/pom.xml
index e085f3a..5a3e66a 100644
--- a/tests/test-webapps/test-jndi-webapp/pom.xml
+++ b/tests/test-webapps/test-jndi-webapp/pom.xml
@@ -4,11 +4,14 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-webapps-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <artifactId>test-jndi-webapp</artifactId>
   <name>Jetty Tests :: WebApp :: JNDI</name>
   <packaging>war</packaging>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.jndi</bundle-symbolic-name>
+  </properties>
   <build>
     <plugins>
       <plugin>
diff --git a/tests/test-webapps/test-jndi-webapp/src/main/templates/jetty-test-jndi-header.xml b/tests/test-webapps/test-jndi-webapp/src/main/templates/jetty-test-jndi-header.xml
index 4f4ded0..484551a 100644
--- a/tests/test-webapps/test-jndi-webapp/src/main/templates/jetty-test-jndi-header.xml
+++ b/tests/test-webapps/test-jndi-webapp/src/main/templates/jetty-test-jndi-header.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Configure the test-jndi webapp                                  -->
diff --git a/tests/test-webapps/test-jndi-webapp/src/main/templates/plugin-context-header.xml b/tests/test-webapps/test-jndi-webapp/src/main/templates/plugin-context-header.xml
index 3e877a5..bd97eb1 100644
--- a/tests/test-webapps/test-jndi-webapp/src/main/templates/plugin-context-header.xml
+++ b/tests/test-webapps/test-jndi-webapp/src/main/templates/plugin-context-header.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <!-- =============================================================== -->
 <!-- Configure the test-jndi webapp                                  -->
diff --git a/tests/test-webapps/test-jndi-webapp/src/main/webapp/WEB-INF/jetty-env.xml b/tests/test-webapps/test-jndi-webapp/src/main/webapp/WEB-INF/jetty-env.xml
index b7fa49f..7899c45 100644
--- a/tests/test-webapps/test-jndi-webapp/src/main/webapp/WEB-INF/jetty-env.xml
+++ b/tests/test-webapps/test-jndi-webapp/src/main/webapp/WEB-INF/jetty-env.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id='wac' class="org.eclipse.jetty.webapp.WebAppContext">
 
diff --git a/tests/test-webapps/test-jndi-webapp/src/main/webapp/WEB-INF/jetty-web.xml b/tests/test-webapps/test-jndi-webapp/src/main/webapp/WEB-INF/jetty-web.xml
index fd4831e..203f811 100644
--- a/tests/test-webapps/test-jndi-webapp/src/main/webapp/WEB-INF/jetty-web.xml
+++ b/tests/test-webapps/test-jndi-webapp/src/main/webapp/WEB-INF/jetty-web.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure class="org.eclipse.jetty.webapp.WebAppContext">
   <Get class="org.eclipse.jetty.util.log.Log" name="rootLogger">
diff --git a/tests/test-webapps/test-mock-resources/pom.xml b/tests/test-webapps/test-mock-resources/pom.xml
index 37d6669..de60b61 100644
--- a/tests/test-webapps/test-mock-resources/pom.xml
+++ b/tests/test-webapps/test-mock-resources/pom.xml
@@ -3,11 +3,14 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-webapps-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <name>Jetty Tests :: WebApp :: Mock Resources</name>
   <artifactId>test-mock-resources</artifactId>
   <packaging>jar</packaging>
+  <properties>
+   <bundle-symbolic-name>${project.groupId}.mocks</bundle-symbolic-name>
+  </properties>
   <build>
     <plugins>
       <plugin>
@@ -22,7 +25,6 @@
         <extensions>true</extensions>
         <executions>
           <execution>
-            <id>generate-manifest</id>
             <goals>
               <goal>manifest</goal>
             </goals>
@@ -44,23 +46,6 @@
           </execution>
         </executions>
       </plugin>
-     <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>artifact-jar</id>
-            <goals>
-              <goal>jar</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <archive>
-            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-          </archive>
-        </configuration>
-      </plugin>
     </plugins>
   </build>
   <dependencies>
@@ -73,12 +58,6 @@
       <groupId>javax.servlet</groupId>
       <artifactId>javax.servlet-api</artifactId>
     </dependency>
-<!--
-    <dependency>
-      <groupId>javax.mail</groupId>
-      <artifactId>javax.mail-api</artifactId>
-    </dependency>
--->
     <dependency>
       <groupId>org.eclipse.jetty.orbit</groupId>
       <artifactId>javax.mail.glassfish</artifactId>
diff --git a/tests/test-webapps/test-mock-resources/src/main/java/com/acme/MockTransport.java b/tests/test-webapps/test-mock-resources/src/main/java/com/acme/MockTransport.java
index 9848c1a..d3d273b 100644
--- a/tests/test-webapps/test-mock-resources/src/main/java/com/acme/MockTransport.java
+++ b/tests/test-webapps/test-mock-resources/src/main/java/com/acme/MockTransport.java
@@ -28,12 +28,9 @@
 
 /**
  * MockTransport
- *
- *
  */
 public class MockTransport extends Transport
 {
-
     /**
      * @param session
      * @param urlname
diff --git a/tests/test-webapps/test-proxy-webapp/pom.xml b/tests/test-webapps/test-proxy-webapp/pom.xml
index a7da943..1eaea0f 100644
--- a/tests/test-webapps/test-proxy-webapp/pom.xml
+++ b/tests/test-webapps/test-proxy-webapp/pom.xml
@@ -20,7 +20,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-webapps-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
@@ -28,6 +28,9 @@
   <artifactId>test-proxy-webapp</artifactId>
   <name>Test :: Jetty Proxy Webapp</name>
   <packaging>war</packaging>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.proxy</bundle-symbolic-name>
+  </properties>
   <build>
     <plugins>
       <plugin>
@@ -83,18 +86,30 @@
       <scope>provided</scope>
     </dependency>
     <dependency>
+      <groupId>org.eclipse.jetty.http2</groupId>
+      <artifactId>http2-server</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-alpn-server</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-annotations</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>javax.servlet.jsp</groupId>
       <artifactId>jsp-api</artifactId>
       <version>2.1</version>
       <scope>provided</scope>
     </dependency>
     <dependency>
-      <groupId>org.eclipse.jetty.spdy</groupId>
-      <artifactId>spdy-http-server</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>jstl</artifactId>
       <version>1.2</version>
diff --git a/tests/test-webapps/test-proxy-webapp/src/main/webapp/WEB-INF/jetty-web.xml b/tests/test-webapps/test-proxy-webapp/src/main/webapp/WEB-INF/jetty-web.xml
index 030fd19..e2cb8ec 100644
--- a/tests/test-webapps/test-proxy-webapp/src/main/webapp/WEB-INF/jetty-web.xml
+++ b/tests/test-webapps/test-proxy-webapp/src/main/webapp/WEB-INF/jetty-web.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure class="org.eclipse.jetty.webapp.WebAppContext">
   <Set name="contextPath">/proxy</Set>
diff --git a/tests/test-webapps/test-proxy-webapp/src/test/java/org/eclipse/jetty/TestTransparentProxyServer.java b/tests/test-webapps/test-proxy-webapp/src/test/java/org/eclipse/jetty/TestTransparentProxyServer.java
index 0f3d0e7..6bdbfbd 100644
--- a/tests/test-webapps/test-proxy-webapp/src/test/java/org/eclipse/jetty/TestTransparentProxyServer.java
+++ b/tests/test-webapps/test-proxy-webapp/src/test/java/org/eclipse/jetty/TestTransparentProxyServer.java
@@ -20,11 +20,15 @@
 
 import java.lang.management.ManagementFactory;
 
+import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
+import org.eclipse.jetty.http2.HTTP2Cipher;
+import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
 import org.eclipse.jetty.jmx.MBeanContainer;
 import org.eclipse.jetty.server.ForwardedRequestCustomizer;
 import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.HttpConfiguration;
 import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.NegotiatingServerConnectionFactory;
 import org.eclipse.jetty.server.SecureRequestCustomizer;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
@@ -32,11 +36,6 @@
 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
 import org.eclipse.jetty.server.handler.DefaultHandler;
 import org.eclipse.jetty.server.handler.HandlerCollection;
-import org.eclipse.jetty.spdy.server.NPNServerConnectionFactory;
-import org.eclipse.jetty.spdy.server.SPDYServerConnectionFactory;
-import org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnectionFactory;
-import org.eclipse.jetty.spdy.server.http.PushStrategy;
-import org.eclipse.jetty.spdy.server.http.ReferrerPushStrategy;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.StdErrLog;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
@@ -71,7 +70,6 @@
         HttpConfiguration config = new HttpConfiguration();
         config.setSecurePort(8443);
         config.addCustomizer(new ForwardedRequestCustomizer());
-        config.addCustomizer(new SecureRequestCustomizer());
         config.setSendDateHeader(true);
         config.setSendServerVersion(true);
         
@@ -99,24 +97,28 @@
                 "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
                 "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
                 "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA");
+        sslContextFactory.setCipherComparator(new HTTP2Cipher.CipherComparator());
         
+
+        // HTTPS Configuration
+        HttpConfiguration https_config = new HttpConfiguration(config);
+        https_config.addCustomizer(new SecureRequestCustomizer());
         
-        // Spdy Connector
-        SPDYServerConnectionFactory.checkProtocolNegotiationAvailable();
-        PushStrategy push = new ReferrerPushStrategy();
-        HTTPSPDYServerConnectionFactory spdy2 = new HTTPSPDYServerConnectionFactory(2,config,push);
-        spdy2.setInputBufferSize(8192);
-        spdy2.setInitialWindowSize(32768);
-        HTTPSPDYServerConnectionFactory spdy3 = new HTTPSPDYServerConnectionFactory(3,config,push);
-        spdy2.setInputBufferSize(8192);
-        NPNServerConnectionFactory npn = new NPNServerConnectionFactory(spdy3.getProtocol(),spdy2.getProtocol(),http.getProtocol());
-        npn.setDefaultProtocol(http.getProtocol());
-        npn.setInputBufferSize(1024); 
-        SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory,npn.getProtocol()); 
-        ServerConnector spdyConnector = new ServerConnector(server,ssl,npn,spdy3,spdy2,http);
-        spdyConnector.setPort(8443);
-        spdyConnector.setIdleTimeout(15000);
-        server.addConnector(spdyConnector);
+        // HTTP2 factory
+        HTTP2ServerConnectionFactory h2 = new HTTP2ServerConnectionFactory(https_config);
+        NegotiatingServerConnectionFactory.checkProtocolNegotiationAvailable();
+        ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory();
+        alpn.setDefaultProtocol(h2.getProtocol());
+        
+        // SSL Factory
+        SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory,alpn.getProtocol());
+        
+        // HTTP2 Connector
+        ServerConnector http2Connector = 
+            new ServerConnector(server,ssl,alpn,h2,new HttpConnectionFactory(https_config));
+        http2Connector.setPort(8443);
+        http2Connector.setIdleTimeout(15000);
+        server.addConnector(http2Connector);
         
         // Handlers
         HandlerCollection handlers = new HandlerCollection();
diff --git a/tests/test-webapps/test-servlet-spec/pom.xml b/tests/test-webapps/test-servlet-spec/pom.xml
index 9b0b712..e099643 100644
--- a/tests/test-webapps/test-servlet-spec/pom.xml
+++ b/tests/test-webapps/test-servlet-spec/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-webapps-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <artifactId>test-servlet-spec-parent</artifactId>
   <name>Jetty Tests :: Spec Test WebApp :: Parent</name>
diff --git a/tests/test-webapps/test-servlet-spec/test-container-initializer/pom.xml b/tests/test-webapps/test-servlet-spec/test-container-initializer/pom.xml
index 662ea83..0f0f60d 100644
--- a/tests/test-webapps/test-servlet-spec/test-container-initializer/pom.xml
+++ b/tests/test-webapps/test-servlet-spec/test-container-initializer/pom.xml
@@ -3,11 +3,14 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-servlet-spec-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <artifactId>test-container-initializer</artifactId>
   <packaging>jar</packaging>
   <name>Jetty Tests :: WebApp :: Servlet Spec :: ServletContainerInitializer Test Jar</name>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.sci</bundle-symbolic-name>
+  </properties>
   <build>
     <plugins>
        <plugin>
@@ -37,15 +40,6 @@
           <groupId>org.apache.felix</groupId>
           <artifactId>maven-bundle-plugin</artifactId>
           <extensions>true</extensions>
-          <executions>
-              <execution>
-                  <id>bundle-manifest</id>
-                  <phase>process-classes</phase>
-                  <goals>
-                      <goal>manifest</goal>
-                  </goals>
-              </execution>
-          </executions>
           <configuration>
               <instructions>
                   <Bundle-SymbolicName>org.eclipse.jetty.tests.test-servlet-container-initializer;singleton:=true</Bundle-SymbolicName>
diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/pom.xml b/tests/test-webapps/test-servlet-spec/test-spec-webapp/pom.xml
index c137eff..fbd171d 100644
--- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/pom.xml
+++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/pom.xml
@@ -4,11 +4,14 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-servlet-spec-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <name>Jetty Tests :: Webapps :: Spec Webapp</name>
   <artifactId>test-spec-webapp</artifactId>
   <packaging>war</packaging>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.spec</bundle-symbolic-name>
+  </properties>
   <build>
     <plugins>
       <plugin>
@@ -68,37 +71,26 @@
           <supportedProjectTypes>
             <supportedProjectType>war</supportedProjectType>
           </supportedProjectTypes>
+          <instructions>
+            <Bundle-SymbolicName>org.eclipse.jetty.tests.test-spec-webapp</Bundle-SymbolicName>
+            <Bundle-Description>Test Webapp for Servlet 3.1 Features</Bundle-Description>
+            <Import-Package>
+              javax.servlet.jsp.*;version="[2.2.0, 3.0)",
+              javax.transaction*;version="[1.1,1.3)",
+              javax.servlet*;version="[2.6,3.2)",
+              org.eclipse.jetty*;version="[$(version;===;${parsedVersion.osgiVersion}),$(version;==+;${parsedVersion.osgiVersion}))",
+              org.eclipse.jetty.webapp;version="[$(version;===;${parsedVersion.osgiVersion}),$(version;==+;${parsedVersion.osgiVersion}))";resolution:="optional",
+              org.eclipse.jetty.plus.jndi;version="[$(version;===;${parsedVersion.osgiVersion}),$(version;==+;${parsedVersion.osgiVersion}))";resolution:="optional",
+              com.acme;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}",
+              *
+            </Import-Package>
+            <_nouses/>
+            <Export-Package>com.acme.test;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}";-noimport:=true</Export-Package>
+            <Web-ContextPath>/</Web-ContextPath>
+            <Bundle-ClassPath>.,WEB-INF/classes,WEB-INF/lib</Bundle-ClassPath>
+            <Jetty-ContextFilePath>/META-INF/plugin-context.xml</Jetty-ContextFilePath>
+          </instructions>
         </configuration>
-        <executions>
-          <execution>
-            <id>bundle-manifest</id>
-            <phase>process-classes</phase>
-            <goals>
-              <goal>manifest</goal>
-            </goals>
-            <configuration>
-              <instructions>
-                <Bundle-SymbolicName>org.eclipse.jetty.tests.test-spec-webapp</Bundle-SymbolicName>
-                <Bundle-Description>Test Webapp for Servlet 3.1 Features</Bundle-Description>
-                <Import-Package>
-                  javax.servlet.jsp.*;version="[2.2.0, 3.0)",
-                  javax.transaction.*;version="[1.1, 2.0)", 
-                  javax.servlet.*;version="3.0",
-                  javax.sql,
-                  org.eclipse.jetty.webapp;version="9.2",org.eclipse.jetty.plus.jndi;version="9.2",
-                  org.eclipse.jetty.security;version="9.2",
-                  com.acme;version="9.2",
-                  *
-                </Import-Package>
-                <Export-Package>com.acme.test;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"</Export-Package>
-                <Web-ContextPath>/</Web-ContextPath>
-                <Bundle-ClassPath>.,WEB-INF/classes,WEB-INF/lib</Bundle-ClassPath>
-                <Jetty-ContextFilePath>./META-INF/plugin-context.xml</Jetty-ContextFilePath>
-                <_nouses>true</_nouses>
-              </instructions>
-            </configuration>
-           </execution>
-        </executions>
       </plugin>
 
 
diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/TestListener.java b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/TestListener.java
index 47bbc0a..e98f284 100644
--- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/TestListener.java
+++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/java/com/acme/test/TestListener.java
@@ -19,7 +19,6 @@
 package com.acme.test;
 import java.util.EventListener;
 
-import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
 import javax.servlet.ServletContextAttributeEvent;
 import javax.servlet.ServletContextAttributeListener;
@@ -112,8 +111,6 @@
 
     public void contextInitialized(ServletContextEvent sce)
     {
-        System.err.println("Calling TestListener.contextInitialized");
-        
         sce.getServletContext().setAttribute("com.acme.AnnotationTest.sclInjectTest", Boolean.valueOf(maxAmount != null));
         
         //Can't add a ServletContextListener from a ServletContextListener even if it is declared in web.xml
diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/templates/annotations-context-header.xml b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/templates/annotations-context-header.xml
index 50b5981..ff2f6a1 100644
--- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/templates/annotations-context-header.xml
+++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/templates/annotations-context-header.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 
 <!-- =============================================================== -->
diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/templates/plugin-context-header.xml b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/templates/plugin-context-header.xml
index 450edda..36ff548 100644
--- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/templates/plugin-context-header.xml
+++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/templates/plugin-context-header.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 
 <!-- =============================================================== -->
diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/webapp/WEB-INF/jetty-env.xml b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/webapp/WEB-INF/jetty-env.xml
index c15926b..909ac83 100644
--- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/webapp/WEB-INF/jetty-env.xml
+++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/webapp/WEB-INF/jetty-env.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id='wac' class="org.eclipse.jetty.webapp.WebAppContext">
 
diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/webapp/WEB-INF/jetty-web.xml b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/webapp/WEB-INF/jetty-web.xml
index 62b92f9..e360f5c 100644
--- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/webapp/WEB-INF/jetty-web.xml
+++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/webapp/WEB-INF/jetty-web.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure class="org.eclipse.jetty.webapp.WebAppContext">
   <Get class="org.eclipse.jetty.util.log.Log" name="rootLogger">
diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/webapp/index.html b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/webapp/index.html
index d3ec487..2db5dd5 100644
--- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/webapp/index.html
+++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/webapp/index.html
@@ -29,13 +29,21 @@
   <button type="submit">Test</button>
 </form>
 
-<h3>DeclaresRoles</h3>
+<h3>Test Static Content from Fragment </h3>
+<p>Click the link to test accessing static content from a fragment's META-INF/resources</p>
+<a href="fragmentA/index.html">Static resource from a fragment </a>
+
+<h3>Test Servlet from Fragment </h3>
+<p>Click the link to test accessing a servlet added from a fragment's web-fragment.xml</p>
+<a href="fragment">Servlet added by web-fragment.xml</a>
+
+<h3>Test DeclaresRoles</h3>
 <p>Login as user <code>admin</code> with password <code>admin</code> when prompted after clicking the button below to test @DeclareRoles annotation</p>
 <form action="role" method="post">
   <button type="submit">Test Role Annotations</button>
 </form>
 
-<h3>ServletSecurity</h3>
+<h3>Test Servlet Security</h3>
 <p>Login as user <code>admin</code> with password <code>admin</code> when prompted after clicking the button below to test @ServletSecurity annotation</p>
 <form action="sec/foo" method="post">
   <button type="submit">Test ServletSecurity Annotation</button>
diff --git a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/test/jetty-plugin-env.xml b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/test/jetty-plugin-env.xml
index 7741843..23c4b5b 100644
--- a/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/test/jetty-plugin-env.xml
+++ b/tests/test-webapps/test-servlet-spec/test-spec-webapp/src/test/jetty-plugin-env.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
 <Configure id='wac' class="org.eclipse.jetty.webapp.WebAppContext">
 
diff --git a/tests/test-webapps/test-servlet-spec/test-web-fragment/pom.xml b/tests/test-webapps/test-servlet-spec/test-web-fragment/pom.xml
index 2e10835..8e566f8 100644
--- a/tests/test-webapps/test-servlet-spec/test-web-fragment/pom.xml
+++ b/tests/test-webapps/test-servlet-spec/test-web-fragment/pom.xml
@@ -3,12 +3,15 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-servlet-spec-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <name>Jetty Tests :: WebApp :: Servlet Spec :: Fragment Jar</name>
   <groupId>org.eclipse.jetty.tests</groupId>
   <artifactId>test-web-fragment</artifactId>
   <packaging>jar</packaging>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.fragment</bundle-symbolic-name>
+  </properties>
   <build>
     <plugins>
       <plugin>
@@ -17,46 +20,6 @@
           <verbose>false</verbose>
         </configuration>
       </plugin>
-       <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-            <execution>
-                <id>artifact-jar</id>
-                <goals>
-                    <goal>jar</goal>
-                </goals>
-            </execution>
-        </executions>
-        <configuration>
-            <archive>
-                <manifestFile>target/classes/META-INF/MANIFEST.MF</manifestFile>
-            </archive>
-        </configuration>
-      </plugin>
-      <plugin>
-          <groupId>org.apache.felix</groupId>
-          <artifactId>maven-bundle-plugin</artifactId>
-          <extensions>true</extensions>
-          <executions>
-              <execution>
-                  <id>bundle-manifest</id>
-                  <phase>process-classes</phase>
-                  <goals>
-                      <goal>manifest</goal>
-                  </goals>
-              </execution>
-          </executions>
-          <configuration>
-              <instructions>
-                  <Bundle-SymbolicName>org.eclipse.jetty.tests.test-web-fragment;singleton:=true</Bundle-SymbolicName>
-                  <Bundle-Description>A bundle containing web fragment for testing</Bundle-Description>
-                  <Export-Package>com.acme.fragment;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"</Export-Package>
-                  <_nouses>true</_nouses>
-              </instructions>
-          </configuration>
-      </plugin>
-
     </plugins>
   </build>
   <dependencies>
@@ -64,5 +27,12 @@
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
       </dependency>
+
+<!--
+    <dependency>
+      <groupId>org.eclipse.jetty.orbit</groupId>
+      <artifactId>javax.servlet</artifactId>
+    </dependency>
+-->
   </dependencies>
 </project>
diff --git a/tests/test-webapps/test-webapp-rfc2616/pom.xml b/tests/test-webapps/test-webapp-rfc2616/pom.xml
index e04db7d..4b143ec 100644
--- a/tests/test-webapps/test-webapp-rfc2616/pom.xml
+++ b/tests/test-webapps/test-webapp-rfc2616/pom.xml
@@ -21,12 +21,15 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-webapps-parent</artifactId>
-    <version>9.2.14-SNAPSHOT</version>
+    <version>9.3.6-SNAPSHOT</version>
   </parent>
   <artifactId>test-webapp-rfc2616</artifactId>
   <name>Jetty Tests :: WebApp :: RFC2616</name>
   <url>http://www.eclipse.org/jetty</url>
   <packaging>war</packaging>
+  <properties>
+    <bundle-symbolic-name>${project.groupId}.rfc2616</bundle-symbolic-name>
+  </properties>
   <build>
     <plugins>
       <plugin>
diff --git a/tests/test-webapps/test-webapp-rfc2616/src/main/webapp/WEB-INF/web.xml b/tests/test-webapps/test-webapp-rfc2616/src/main/webapp/WEB-INF/web.xml
index 1ea878d..0685977 100644
--- a/tests/test-webapps/test-webapp-rfc2616/src/main/webapp/WEB-INF/web.xml
+++ b/tests/test-webapps/test-webapp-rfc2616/src/main/webapp/WEB-INF/web.xml
@@ -1,25 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
   <display-name>rfc2616-webapp</display-name>
+
+  <context-param>
+    <param-name>org.eclipse.jetty.handler.GzipHandler.minGzipSize</param-name>
+    <param-value>1024</param-value>
+  </context-param>
+  <context-param>
+    <param-name>org.eclipse.jetty.handler.GzipHandler.includePaths</param-name>
+    <param-value>/*</param-value>
+  </context-param>
+  
   <welcome-file-list>
     <welcome-file>index.html</welcome-file>
   </welcome-file-list>
-  <filter>
-    <filter-name>GZIPFilter</filter-name>
-    <filter-class>org.eclipse.jetty.servlets.GzipFilter</filter-class>
-    <init-param>
-      <param-name>minGzipSize</param-name>
-      <param-value>1024</param-value>
-    </init-param>
-    <init-param>
-      <param-name>bufferSize</param-name>
-      <param-value>16384</param-value>
-    </init-param>
-  </filter>
-  <filter-mapping>
-    <filter-name>GZIPFilter</filter-name>
-    <url-pattern>/*</url-pattern>
-  </filter-mapping>
+  
   <servlet>
     <servlet-name>HttpMethodsServlet</servlet-name>
     <servlet-class>org.eclipse.jetty.tests.webapp.HttpMethodsServlet</servlet-class>
@@ -28,4 +23,4 @@
     <servlet-name>HttpMethodsServlet</servlet-name>
     <url-pattern>/httpmethods</url-pattern>
   </servlet-mapping>
-</web-app>
\ No newline at end of file
+</web-app>
